Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-03-2007, 11:43   #1
nicod83
Member
 
L'Avatar di nicod83
 
Iscritto dal: Jun 2005
Messaggi: 123
esercizio C

ciao ragazzi!
ho un problema con il seguente esercizio
qualcuno può darmi una mano? grazie!

TESTO
Si inizializzi la variabie intera 'a' in modo che il ciclo while esegua un
numero
finito di iterazioni e venga prodotta la stampa a video della stringa "X11"
(doppi apici esclusi).
Si commenti la soluzione. Alternativamente si sarebbe potuto stampare con
lo
stessa metodo la stringa "X-11"?

int main()
{
int a=...;
char* p=&a;
while(*p)
{
printf("%c",*p);
p++;
}
printf("\nFatto!");
}
nicod83 è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 12:15   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da nicod83 Guarda i messaggi
TESTO
Si inizializzi la variabie intera 'a' in modo che il ciclo while esegua un
numero
finito di iterazioni e venga prodotta la stampa a video della stringa "X11"
(doppi apici esclusi).
Si commenti la soluzione. Alternativamente si sarebbe potuto stampare con
lo
stessa metodo la stringa "X-11"?
Uhm ... non è affatto chiaro! (almeno per me).
La stringa "X11" deve essere stampata in virtù di che cosa?? Cioè in che modo deve essere prodotta??

Quote:
Originariamente inviato da nicod83 Guarda i messaggi
int main()
{
int a=...;
char* p=&a;
while(*p)
{
printf("%c",*p);
p++;
}
printf("\nFatto!");
}
Questo codice non ha molto senso. Poi comunque quando fai p++ incrementi il puntatore 'p', che quindi va a puntare non più ad 'a' ma a ... qualcos'altro dopo.
E tra l'altro 'p' è un puntatore a char mentre tu assegni a 'p' l'indirizzo di un int ...
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 13:14   #3
nicod83
Member
 
L'Avatar di nicod83
 
Iscritto dal: Jun 2005
Messaggi: 123
è un esempio di esercizio d'esame...

lo so.. è quello il problema... p??
qualcuno ha qualche idea?
nicod83 è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 13:33   #4
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da nicod83 Guarda i messaggi
è un esempio di esercizio d'esame...

lo so.. è quello il problema... p??
qualcuno ha qualche idea?
Oltre al codice che se è un esempio credo di poter affermare che è un pessimo esempio, la domanda rimane la stessa, ovvero, la stringa in che modo dev'essere prodotta?

Mi spiego:

Hai una serie di stringhe e devi scegliere "X11";
Devi scorrere tutti i caratteri dell'alfabeto sino a raggiungere prima 'X', poi '1' e poi '1' (oppure '11') e metterli insieme per formare la stringa;
Devi estrapolarla da una stringa già esistente (ed eventualmente aggiungerci il carattere '-' in modo da farla diventare 'X-11').

etc..

Cioè, se ti hanno posto questo problema, te lo hanno posto in un modo tutt'altro che chiaro
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 13:34   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da nicod83 Guarda i messaggi
qualcuno ha qualche idea?
Ripeto: dovresti spiegare meglio in che modo deve essere prodotta in output la stringa.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 13:45   #6
nicod83
Member
 
L'Avatar di nicod83
 
Iscritto dal: Jun 2005
Messaggi: 123
questo esercizio era sul file di esercizio proposti per l'esame...

non ci sono altre istruzioni..
bisogna inizializzare la variabile "a" e produrre in output 3 caratteri formando "X11"
nicod83 è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 14:01   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da nicod83 Guarda i messaggi
questo esercizio era sul file di esercizio proposti per l'esame...

non ci sono altre istruzioni..
bisogna inizializzare la variabile "a" e produrre in output 3 caratteri formando "X11"
Sì ma ... 'a' di che tipo deve essere?? char? int? E devi basarti solo su questa variabile per il test del while e per mandare in output i caratteri??
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 14:09   #8
repne scasb
Bannato
 
Iscritto dal: Feb 2003
Messaggi: 947
Come gia' fatto notare l'esercizio e' tutt'altro che chiaro e merita una risposta "sciocca":

Codice:
#include <stdio.h>

void main(void)

{
	int a=10;

	while (a--);

	printf("X11");
}
repne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 14:28   #9
mfonz85
Member
 
L'Avatar di mfonz85
 
Iscritto dal: Sep 2005
Città: Bus PCI 1, periferica 0, funzione 0 (Torino)
Messaggi: 213
Boh! Esercizio stranissimo

Codice:
int main()
{
   int a=88;
   char* p= &a;
   while(*p) {
      printf("%c",*p);
      if( *p == 49 ) { printf("%c",*p); *p = 0; }
      if( *p == 88 ) *p = 49;
   }
   printf("\nFatto!");
   system("pause");
}
Ho inizializzato a ad 88, ma dentro il while ho dovuto fare 2 if

P.S ah, e il gcc ovviamente da buon compilatore mi dice
Warning: inizialization from incompatible pointer type @line char* p= &a;
Non si possono fare giochetti del genere con puntatori a int e char, questo funziona solo per coincidenza...perchè lavoriamo su interi sempre minori di 255 (quindi rappresentabili su carattere ASCII)
__________________
Ho concluso affari con: Ippo 2001, Klintf, albert78, Piripikkio, starsky, oldfield e IL0V€INT€R. da EVITARE zarovat

Ultima modifica di mfonz85 : 16-03-2007 alle 14:30.
mfonz85 è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 14:39   #10
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Sorgente meno "banale"???
Questo:
Codice:
#include <stdio.h>

int main (void)
{
    int a = 88;

    while (a) {
        printf ("%c", (char) a);
        a = a == 88 ? 49 : a == 49 ? 305 : 0;
    }

    printf ("\n");
    return 0;
}
Però mi sembra quasi più roba da IOCCC che un esercizio!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 14:40   #11
pierosa
Member
 
Iscritto dal: Jan 2007
Messaggi: 189
Codice:
int main()
{
    int a= 3223896;
    char* p=&a;
    while(*p)
    {
        printf("%c",*p);
        p++;
    }
    printf("\nFatto!");
}
prova così

EDIT: ho corretto prima stampava W11 ora stampa X11 come avevi chiesto

Ultima modifica di pierosa : 16-03-2007 alle 15:05.
pierosa è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 15:32   #12
mfonz85
Member
 
L'Avatar di mfonz85
 
Iscritto dal: Sep 2005
Città: Bus PCI 1, periferica 0, funzione 0 (Torino)
Messaggi: 213
Quote:
Originariamente inviato da pierosa Guarda i messaggi
Codice:
int main()
{
    int a= 3223896;
    char* p=&a;
    while(*p)
    {
        printf("%c",*p);
        p++;
    }
    printf("\nFatto!");
}
Ok, spiegaci
Hai sfruttato gli overflow??

Quote:
Originariamente inviato da andbin Guarda i messaggi
Codice:
   a = a == 88 ? 49 : a == 49 ? 305 : 0;
Cos'è sta roba??
__________________
Ho concluso affari con: Ippo 2001, Klintf, albert78, Piripikkio, starsky, oldfield e IL0V€INT€R. da EVITARE zarovat
mfonz85 è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 16:07   #13
pierosa
Member
 
Iscritto dal: Jan 2007
Messaggi: 189
Quote:
Originariamente inviato da mfonz85 Guarda i messaggi
Ok, spiegaci
Hai sfruttato gli overflow??
in c un char è composto da un byte dunque 8 bit.
il codice ascii di X è 88 che in binario è 1011000 (01011000 aggiungiamo uno 0 all'inizio per ottenere 8 bit)
il codice ascii di 1 è 49 che in binario è 110001 (00110001 come sopra)
un intero a 32 bit può dunque contenere 4 caratteri, che sono necessari per contenere la string "X11\0", il carattere \0 è necessario per delimitare la fine della stringa.
ora dobbiamo trovare un intero che sia rappresentato in memoria nello stesso modo della stringa "X11\0", siccome i byte degli interi in memoria vengono invertiti l'intero che stiamo cercando è questo
00000000 00110001 00110001 01011000 (in binario, ho separato i byte con uno spazio)
3223896 (in decimale)
assegnando l'indirizzo di questo numero ad un puntatore a carattere (p nel nostro esercizio) questo conterrà l'indirizzo del primo byte di a che rappresenta la W. Per l'aritmetica dei puntatori in c, p++ passa al prossimo byte (perchè p è dichiarato come puntatore a char, se fosse stato dichiarato come puntatore ad int non avrebbe funzionato).
pierosa è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 16:09   #14
mfonz85
Member
 
L'Avatar di mfonz85
 
Iscritto dal: Sep 2005
Città: Bus PCI 1, periferica 0, funzione 0 (Torino)
Messaggi: 213
Quote:
Originariamente inviato da pierosa Guarda i messaggi
in c un char è composto da un byte dunque 8 bit.
il codice ascii di X è 88 che in binario è 1011000 (01011000 aggiungiamo uno 0 all'inizio per ottenere 8 bit)
il codice ascii di 1 è 49 che in binario è 110001 (00110001 come sopra)
un intero a 32 bit può dunque contenere 4 caratteri, che sono necessari per contenere la string "X11\0", il carattere \0 è necessario per delimitare la fine della stringa.
ora dobbiamo trovare un intero che sia rappresentato in memoria nello stesso modo della stringa "X11\0", siccome i byte degli interi in memoria vengono invertiti l'intero che stiamo cercando è questo
00000000 00110001 00110001 01011000 (in binario, ho separato i byte con uno spazio)
3223896 (in decimale)
assegnando l'indirizzo di questo numero ad un puntatore a carattere (p nel nostro esercizio) questo conterrà l'indirizzo del primo byte di a che rappresenta la W. Per l'aritmetica dei puntatori in c, p++ passa al prossimo byte (perchè p è dichiarato come puntatore a char, se fosse stato dichiarato come puntatore ad int non avrebbe funzionato).
grande, che pensata
__________________
Ho concluso affari con: Ippo 2001, Klintf, albert78, Piripikkio, starsky, oldfield e IL0V€INT€R. da EVITARE zarovat
mfonz85 è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 16:10   #15
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da mfonz85 Guarda i messaggi
Ok, spiegaci

Cos'è sta roba??
E' l'utilizzo degli operatori ternari in C.

per esempio:

Codice:


if( a > b)
{
   c = a;
}
else
{
   c = b;
}

//si può anche scrivere:

c = (a > b) ? a : b;
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 16:10   #16
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da mfonz85 Guarda i messaggi
Ok, spiegaci
Hai sfruttato gli overflow??
overflow?? No no.
pierosa ha sfruttato il fatto che il numero decimale 3223896 in esadecimale è 313158h e siccome sulle architetture Intel che sono "little-endian" i byte sono memorizzati dal meno significativo al più significativo, in memoria il valore intero è memorizzato come:

58h 31h 31h 00h
dove i 3 valori sono appunto i codici ASCII dei caratteri X 1 1
Con 'p' punta ai singoli byte che compongono l'intero. L'ultimo è appunto nullo quindi fa da terminatore

Quote:
Originariamente inviato da mfonz85 Guarda i messaggi
Cos'è sta roba??
Io invece ho usato una strada diversa. ?: è un operatore ternario. La mia espressione è equivalente a:
Codice:
if (a == 89)
    a = 49;
else if (a == 49)
    a = 305;
else
    a = 0;
Anche qui uso i codici ASCII dei caratteri ma dal momento che si devono stampare due '1', devo differenziarli. 305 in hex è 131h, castato a (char) vale solo 31h ma così il valore intero è diverso dall'altro (49).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 16:25   #17
pierosa
Member
 
Iscritto dal: Jan 2007
Messaggi: 189
Quote:
Originariamente inviato da andbin Guarda i messaggi
overflow?? No no.
pierosa ha sfruttato il fatto che il numero decimale 3223896 in esadecimale è 313158h e siccome sulle architetture Intel che sono "little-endian" i byte sono memorizzati dal meno significativo al più significativo
infatti la mia soluzione funziona con questo tipo di architettura, non è detto che in altre funzioni.
L'esercizio come è stato proposto è ambiguo perchè non specifica appunto l'architettura che si sta considerando.
anche la seconda domanda non è del tutto corretta, infatti se si sta lavorando su un sistema in cui gli int sono a 32 bit, la stringa "X-11" non può essere contenuta in un int, ma se stiamo lavorando su un sistema con int a 64 bit (credo che esistano) allora un intero può contenere stringhe di 7 caratteri più il terminatore.
pierosa è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 18:23   #18
nicod83
Member
 
L'Avatar di nicod83
 
Iscritto dal: Jun 2005
Messaggi: 123
grazie!!

grazie 1000 pierosa!!!

..chiaramente non era un esercizio banale!!
nicod83 è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 20:34   #19
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da nicod83 Guarda i messaggi
grazie 1000 pierosa!!!
E a me grazie ... no? Che ho fatto tutto con 1 sola variabile???

Scherzo ... non c'è problema.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 16-03-2007, 21:14   #20
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da andbin Guarda i messaggi
Uhm ... non è affatto chiaro! (almeno per me).
La stringa "X11" deve essere stampata in virtù di che cosa?? Cioè in che modo deve essere prodotta??

Questo codice non ha molto senso. Poi comunque quando fai p++ incrementi il puntatore 'p', che quindi va a puntare non più ad 'a' ma a ... qualcos'altro dopo.
E tra l'altro 'p' è un puntatore a char mentre tu assegni a 'p' l'indirizzo di un int ...
esattamente è proprio questo il punto: l'esercizio (assolutamente schifoso a mio parere ) vuole che tu definisca un valore di a percui quella printf finisce per stampare "X11". e probabilmente il testo è stato riportato in maniera errata perché non è possibile stampare anche gli apici (un int è da 4 bytes, quindi ci puoi stampare al massimo 4 caratteri di cui uno deve essere il terminatore nullo per uscire dal while, quindi 3; ecco perché la risposta all'ultima domanda è no).


EDIT - ehm, scusate, avevo letto solo i primi due post...

comunque vorrei farvi notare che è assolutamente errato definirlo un esercizio di C, in quanto il valore di a è diverso a seconda che la macchina sia big-endian o little-endian

Ultima modifica di 71104 : 16-03-2007 alle 21:16.
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Tutti gli sconti Apple su Amazon: tornan...
Altro che entry-level: due smartwatch Am...
Roscosmos ha posticipato (ancora) il lan...
Isar Aerospace si prepara al secondo lan...
Tory Bruno è entrato in Blue Orig...
Fujifilm lancia la cartuccia per archivi...
Dreame H15 Mix: la soluzione 7-in-1 per ...
AirPods Pro 3 in forte sconto su Amazon:...
36 offerte Amazon, molte appena partite:...
2 caricatori multipli eccezionali: da 28...
OLED e 360 Hz a un prezzo senza preceden...
Roborock Q10 S5+ a un prezzo molto conve...
Upgrade PC a prezzo ridotto: le migliori...
Sono i 6 smartphone migliori su Amazon: ...
Google Pixel 9a a 361€, mai così ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:37.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v