Frammenti in C
Ciao a tutti.
Chi mi aiuta con questi esercizi?
1)Cosa stampa a video il seguete frammento di codice in C?
int a=0, b=1;
printf("%d", (++a*b++)*b);
A me viene che il programma stampa a il velore 2.
2)Cosa stampa a video il seguete frammento di codice in C?
int x=0, a=1,b=2;
for(x=a/b; x<4; x++)
printf("%d\n", x*a/b);
A me viene che stampa a video la successione (0.5+1)*0.5 poi (1.5+1)*0.5 fino ad un valore cmq. minore di 4. Giusto?
Chi mi aiuta con questi esercizi?
1)Cosa stampa a video il seguete frammento di codice in C?
int a=0, b=1;
printf("%d", (++a*b++)*b);
A me viene che il programma stampa a il velore 2.
2)Cosa stampa a video il seguete frammento di codice in C?
int x=0, a=1,b=2;
for(x=a/b; x<4; x++)
printf("%d\n", x*a/b);
A me viene che stampa a video la successione (0.5+1)*0.5 poi (1.5+1)*0.5 fino ad un valore cmq. minore di 4. Giusto?
Risposte
"Pivot":
int a=0, b=1;
printf("%d", (++a*b++)*b);
Praticamente l'esercizio vuol farti scoprire la differenza tra ++a e b++.
"Pivot":
int x=0, a=1,b=2;
for(x=a/b; x<4; x++)
printf("%d\n", x*a/b);
A me viene che stampa a video la successione (0.5+1)*0.5 poi (1.5+1)*0.5 fino ad un valore cmq. minore di 4. Giusto?
Ti stampa $a/b$ (cioé $1/2$) per il contatore, che va da $1/2$ a $4$.
Sei agli inizi del C? Prova a giocare con la printf e a fare printf("%f", x*a/b);
Buon C
"Pivot":
Ciao a tutti.
Chi mi aiuta con questi esercizi?
...
2)Cosa stampa a video il seguete frammento di codice in C?
int x=0, a=1,b=2;
for(x=a/b; x<4; x++)
printf("%d\n", x*a/b);
A me viene che stampa a video la successione (0.5+1)*0.5 poi (1.5+1)*0.5 fino ad un valore cmq. minore di 4. Giusto?
Secondo me, tenendo conto che x è intero e varrà $0, 1, 2, 3$, viene stampato:
$0$
$0$
$1$
$1$
"Pivot":
1)Cosa stampa a video il seguete frammento di codice in C?
int a=0, b=1;
printf("%d", (++a*b++)*b);
2)Cosa stampa a video il seguete frammento di codice in C?
int x=0, a=1,b=2;
for(x=a/b; x<4; x++)
printf("%d\n", x*a/b);
A me viene che stampa a video la successione (0.5+1)*0.5 poi (1.5+1)*0.5 fino ad un valore cmq. minore di 4. Giusto?
il primo stampa 2. hai fatto bene, hai considerato bene ++b e b++ che sono diversi
per il secondo devi considerare che il C tronca i numeri , ovvero per il C int f=3, g=2 ; f/g= 1 (è uguale a uno perchè tronca sempre!!!)
quindi il ciclo è
for(x=0; x<4; x++) // ho messo lo zero perchè se fa 1/2=0.5 e il C tronca a 0
printf("%d\n", x*a/b);
una volta dentro al ciclo hai:
0*1/2=0
1*1/2=0.5 per il C è 0
2*1/2=1
3*1/2=1,5 per il C è 1
spero di esserti stato di aiuto.
Grazie 1000 sei stato molto chiaro. Solo una cosa...in questo caso il C tronca il valore dopo la virgola perchè è inizializzato ad un intero....
"Pivot":Si.
Solo una cosa...in questo caso il C tronca il valore dopo la virgola perchè è inizializzato ad un intero....
Ma non perchè è inizializzato ad un intero.
Perchè la variabile è dichiarata come intero.
"Cheguevilla":Si.
[quote="Pivot"]Solo una cosa...in questo caso il C tronca il valore dopo la virgola perchè è inizializzato ad un intero....
Ma non perchè è inizializzato ad un intero.
Perchè la variabile è dichiarata come intero.[/quote]
Quindi se voglio stampare a video un numero a virgola mobile dichiaro float invece che int.
Quindi se voglio stampare a video un numero a virgola mobile dichiaro float invece che int.
Certo.
"Pivot":
Grazie 1000 sei stato molto chiaro. Solo una cosa...in questo caso il C tronca il valore dopo la virgola perchè è inizializzato ad un intero....
se fai:
float c;
int a=3, b=2;
c=a/b;
printf("%f", c);
a video dovrebbe comparire: 1.500000
il C effettua la conversione fra tipi diversi automaticamente.
"Pivot":
Quindi se voglio stampare a video un numero a virgola mobile dichiaro float invece che int.
No

"df":
float c;
int a=3, b=2;
c=a/b;
printf("%f", c);
a video dovrebbe comparire: 1.500000
il C effettua la conversione fra tipi diversi automaticamente.
Attenzione che viene stampato come numero float solo per il %f e non perché sia un float.
"Gummitch":
[quote="Pivot"]Quindi se voglio stampare a video un numero a virgola mobile dichiaro float invece che int.
No

Il caso del C++ è molto diverso... infatti cout non è una funzione ma lo stream, la funzione è l'operatore << e ne esiste una versione per ogni tipo (e ovviamente puoi mandarlo in overload per fare in modo che gestisca anche una classe da te definita). Il compilatore chiama quindi la versione di << appropriata per il tipo di variabile e se non la trova credo ti dia errore.
Nel caso del C printf è definito come
int printf(const char * restrict format, ...);(P.S: restrict c'é solo dallo standard C99 e il suo significato non ha importanza ora)
dove i 3 punti di sospensione informano il compilatore che la funzione accetta un numero qualsiasi di variabili aggiuntive (di qualsiasi tipo).
La funzione printf legge il valore dell'array. Sostituisce quindi i caratteri multipli (come per esempio \n, \b, \t) con il carattere corrispondente. Quando trova il carattere '%' seguito da eventuali modificatori e da un conversion specifier cerca di convertire la prima cosa che trova tra le variabili che gli sono state "mandate" in stringa partendo dal presupposto che questa variabile sia del tipo definito dal conversion specifier o che possa essere convertita in quel tipo tramite un semplice cast. Sostituisce quindi a %X il valore di ritorno della conversione (anche se la conversione ha avuto problemi). Alla fine manda il tutto allo stream stdout.
La funzione printf non sa quale sia il tipo della variabile che gli è stata mandata e quindi si deve fidare dei conversion specifier.
Il tipo di ritorno è int perché ti ritorna il numero di caratteri della stringa che è stata inviata allo stream.
"Gummitch":
Attenzione che viene stampato come numero float solo per il %f e non perché sia un float.
hai ragione.
non amo molto le regole di conversione automatica del C.
"df":
[quote="Gummitch"]
Attenzione che viene stampato come numero float solo per il %f e non perché sia un float.
hai ragione.
non amo molto le regole di conversione automatica del C.[/quote]
Conversione automatica!? Qui non c'è nulla di automatico... Anzi si può parlare di una mancanza di automatismo: manca il riconoscimento automatico del tipo della variabile.
"Gummitch":
[quote="df"]float c;
int a=3, b=2;
c=a/b;
printf("%f", c);
a video dovrebbe comparire: 1.500000
il C effettua la conversione fra tipi diversi automaticamente.
Attenzione che viene stampato come numero float solo per il %f e non perché sia un float.[/quote]
--------------------------------------------------------------------------------------------------------------------------
Non uso il "C" da parecchio, ma mi pare che occorra "forzare" la conversione con il "casting" del risultato, cioè:
---------
int a=3,b=2;
float c;
c = (float)a/b;
printf("%d : %d = %f",a,b,c);
----------
Non ho più il compilatore, quindi non so se dico una sciocchezza.
"IvanTerr":
[quote="Gummitch"][quote="df"]float c;
int a=3, b=2;
c=a/b;
printf("%f", c);
a video dovrebbe comparire: 1.500000
il C effettua la conversione fra tipi diversi automaticamente.
Attenzione che viene stampato come numero float solo per il %f e non perché sia un float.[/quote]
---------
Non uso il "C" da parecchio, ma mi pare che occorra "forzare" la conversione con il "casting" del risultato, cioè:
---------
int a=3,b=2;
float c;
c = (float)a/b;
printf("%d : %d = %f",a,b,c);
----------
Non ho più il compilatore, quindi non so se dico una sciocchezza.[/quote]C fa diversi cast automatici. Per esempio non è detto che con a e b interi il quoziente a/b sia un float, come dici tu.
Avevo visual studio ma recentemente il mio hard disk è andato via, e sul nuovo non l'ho più (quindi non posso controllare). Credo di ricordare che il gcc rendesse un int il quoziente di due int.
frammenti di c
#include
int main(void) {
int a[10] = {1,2,3,4,5};
printf("a[4] = %d", *(a+4));
}
#include
int main(void) {
int a[10] = {1,2,3,4,5};
printf("a[4] = %d", *(a+4));
}
frammenti di codice c
cosa stampa a video
#include
main (){
int a=4, b=0;
do {
b+=1;
} while (a==b);
printf("%d%d",a,b);
}
cosa stampa a video
#include
main (){
int a=4, b=0;
do {
b+=1;
} while (a==b);
printf("%d%d",a,b);
}
Non dovrebbe stampare "4 1 4 2 4 3 4 4"?