Piccolo programma in c
Buonasera,
sono alle prime armi nell'apprendimento del c e tra i primi esercizi proposti c'era il seguente:
Calcolare il modulo di un vettore nello spazio (inserire i valori da tastiera).
Io ho scritto il seguente codice...Solo che quando eseguo il programma inserendo i dati i risultati che escono sono sballati!
Ad esempio risulta che un vettore di componenti 0,0,0 ha modulo 1.7832.... Dov'è che sbaglio?
int main(void)
{
int x;
int y;
int z;
double a;
printf("\n****Questo programma calcola in modulo di un vettore nello spazio****\n");
printf("Inserisci il valore della componente x!\n");
scanf("%d", &x);
printf("Inserisci il valore della componente y!\n");
scanf("%d", &y);
printf("Inserisci il valore della componente z!\n");
scanf("%d", &z);
a=sqrt((x^2+y^2+z^2));
getchar();
printf("Il modulo del tuo vettore: %lf", a);
getchar();
}
sono alle prime armi nell'apprendimento del c e tra i primi esercizi proposti c'era il seguente:
Calcolare il modulo di un vettore nello spazio (inserire i valori da tastiera).
Io ho scritto il seguente codice...Solo che quando eseguo il programma inserendo i dati i risultati che escono sono sballati!
Ad esempio risulta che un vettore di componenti 0,0,0 ha modulo 1.7832.... Dov'è che sbaglio?
int main(void)
{
int x;
int y;
int z;
double a;
printf("\n****Questo programma calcola in modulo di un vettore nello spazio****\n");
printf("Inserisci il valore della componente x!\n");
scanf("%d", &x);
printf("Inserisci il valore della componente y!\n");
scanf("%d", &y);
printf("Inserisci il valore della componente z!\n");
scanf("%d", &z);
a=sqrt((x^2+y^2+z^2));
getchar();
printf("Il modulo del tuo vettore: %lf", a);
getchar();
}
Risposte
Il problema c'è quando scrivi
Non puoi scrivere
La sintassi corretta è
Correggi la riga incriminata con questa:
a= sqrt((x^2+y^2+z^2));
Non puoi scrivere
x^2
La sintassi corretta è
pow(x,2)oppure, più comodo nel tuo caso,
x*x
Correggi la riga incriminata con questa:
a= sqrt(x*x+y*y+z*z);
Grazie mille!
E' forse utile sapere anche che cosa il tuo codice avesse effettivamente calcolato. Come ti ha già spiegato Gi8, l'operatore ^ non rappresenta l'elevamento a potenza. Siccome però il codice compila senza errori.. deve per forza significare qualcosa.
Vediamo quindi a che serve.
Quando scrivi x ^ y in C, stai chiedendo di calcolarti l'or esclusivo (lo XOR) di ogni bit di x con il corrispondente bit di y. In altre parole il risultato sarà un intero dello stesso tipo di x e y il cui i-esimo bit è uno se solo uno tra gli i-esimi bit di x e y è uguale a uno e l'altro è uguale a zero. Vediamo alcuni esempi (i numeri con la b finale sono scritti in binario):
0 ^ 2 = 00b ^ 10b = 10b = 2
1 ^ 1 = 1b ^ 1b = 0
2 ^ 3 = 10b ^ 11b = 01b = 1
7 ^ 13 = 0111b ^ 1101b = 1010b = 10
Spero che il significato sia ora chiaro. C'è però un altro problema. Se infatti calcoli lo xor dei tre zeri che avevi e dei due e sommi i tre risultati uguali non ottieni quello che hai ottenuto nel tuo codice. La ragione è che l'operatore ^ ha una precedenza molto più bassa della somma.. per cui quello che hai in effetti calcolato nel tuo codice era
sqrt( 0 ^ 2 + 0 ^ 2 + 0 ^ 2) = sqrt( 0 ^ 2 ^ 2 ^ 2) = sqrt( 2 ) = 1.414214
che è in effetti il risultato che è uscito compilando e testando il tuo codice sul mio sistema. Questo dovrebbe anche essere il risultato atteso rispettando le regole del C. Mi viene quindi spontaneo chiederti le seguenti cose:
1. Sei certo/a che il risultato di 1.7832 fosse con 0, 0, 0 come input?
2. Che compilatore stai usando?
Mi sembra comunque strana la scelta di usare degli interi per rappresentare i coefficienti di un vettore. Credo che float o double siano scelte più normali.

Quando scrivi x ^ y in C, stai chiedendo di calcolarti l'or esclusivo (lo XOR) di ogni bit di x con il corrispondente bit di y. In altre parole il risultato sarà un intero dello stesso tipo di x e y il cui i-esimo bit è uno se solo uno tra gli i-esimi bit di x e y è uguale a uno e l'altro è uguale a zero. Vediamo alcuni esempi (i numeri con la b finale sono scritti in binario):
0 ^ 2 = 00b ^ 10b = 10b = 2
1 ^ 1 = 1b ^ 1b = 0
2 ^ 3 = 10b ^ 11b = 01b = 1
7 ^ 13 = 0111b ^ 1101b = 1010b = 10
Spero che il significato sia ora chiaro. C'è però un altro problema. Se infatti calcoli lo xor dei tre zeri che avevi e dei due e sommi i tre risultati uguali non ottieni quello che hai ottenuto nel tuo codice. La ragione è che l'operatore ^ ha una precedenza molto più bassa della somma.. per cui quello che hai in effetti calcolato nel tuo codice era
sqrt( 0 ^ 2 + 0 ^ 2 + 0 ^ 2) = sqrt( 0 ^ 2 ^ 2 ^ 2) = sqrt( 2 ) = 1.414214
che è in effetti il risultato che è uscito compilando e testando il tuo codice sul mio sistema. Questo dovrebbe anche essere il risultato atteso rispettando le regole del C. Mi viene quindi spontaneo chiederti le seguenti cose:
1. Sei certo/a che il risultato di 1.7832 fosse con 0, 0, 0 come input?
2. Che compilatore stai usando?
Mi sembra comunque strana la scelta di usare degli interi per rappresentare i coefficienti di un vettore. Credo che float o double siano scelte più normali.

Uso il Dev-C++ 4.9.9.2
Ora rileggo più attentamente la tua risposta, trovo l'argomento interessante e nuovo per me!
Non ho capito il procedimento che usi nel fare 0^2 e seguenti...Cioè
0 decimale = 0 binario
2 decimale = 10 binario
e fin qui ci siamo ma poi poni 0^10= 10 = 2 nel sistema decimale... Perchè?
La pazienza è la virtù dei forti
0 decimale = 0 binario
2 decimale = 10 binario
e fin qui ci siamo ma poi poni 0^10= 10 = 2 nel sistema decimale... Perchè?
La pazienza è la virtù dei forti

Perché per ogni bit da lo XOR tra i due valori. La tabella della verità di un XOR è 1 se sono diversi e 0 se sono uguali.
L'operatore xor ^ in pratica seleziona i bit dei due operandi che sono diversi tra di loro e scarta quelli uguali. Qual'è quindi ad esempio il risultato di 1100110011 ^ 0100011101 ?