PDA

View Full Version : [C] Programmino semplice, risultati errati


Manugal
20-04-2005, 19:24
Ciao a tutti. Vi posto il codice del programmino che ho fatto che serve per calcolare la somma dei primi n numeri dispari e dei primi n numeri pari (con n definito da me a runtime):

#include <stdio.h>

int main(){

int n,cnt,i=1,j=2,odd_sum=0,even_sum=0;

scanf("%d",&n);

cnt=0;
while(cnt<n){
odd_sum+=i;
even_sum+=j;
++cnt;
i+=2;
j+=2;
}

printf("Odd_sum: %d\n",odd_sum);
printf("Even_sum: %d\n",even_sum);
}

A me come sintassi e logica sembra tutto corretto. Però se lo vado ad eseguire e provo a fare la somma dei primi 10 numeri, mi viene fuori per i dispari 100 e per i pari 110. Ma come è possibile? :(

Compilo sotto Fedora Core 3. Un altro problema a proposito di questa distribuzione, praticamente ogni volta che includo la libreria math.h e chiamo qualche funzione, ad esempio come sqrt(), mi dice che praticamente non è definita da nessuna parte. Eppure il file math.h è presente tra le librerie C. Forse è definita in un altro modo?

Grazie.

Fenomeno85
20-04-2005, 19:39
è giusto almeno non ho guardato il codice ma la somma dei primi 10 numeri dispari è 100

~§~ Sempre E Solo Lei ~§~

Manugal
20-04-2005, 19:45
Hai perfettamente ragione sono rinco... io che ci vuoi fare :muro: :muro: :muro:

E per quanto riguarda quel fatto su Linux ne sai qualcosa?

Fenomeno85
20-04-2005, 19:47
#include <stdio.h>

int main (void){
int i=0, rispari=0, risdispari=0, j, val;
scanf ("%d",&val);
for (j=0,i=0;j<val;i=i+2,j++){
risdispari = risdispari + i + 1;
rispari = rispari + i;
}
printf ("\npari %d\t", rispari);
printf ("\ndiapari %d\t", risdispari);
}


~§~ Sempre E Solo Lei ~§~

Fenomeno85
20-04-2005, 19:50
presumo che usi gcc ma dovrebbe funzionare tranquillamente.


#include <stdio.h>
#include <math.h>

int main (void){
int i = sqrt (16);
printf ("%d", i);
}


quindi una cosa così banale non ti funziona?

~§~ Sempre E Solo Lei ~§~

Manugal
20-04-2005, 19:55
No no funziona sono io che ho fatto male i calcoli! :muro:

Per quanto riguarda quel fatto le librerie matematiche ne sai qualcosa?

Fenomeno85
20-04-2005, 19:59
mmm strano prova a reinstallare gcc

~§~ Sempre E Solo Lei ~§~

Manugal
20-04-2005, 20:41
Grazie mille. Potresti darmi una mano solamente per quest'altro programmino per favore?

Devo praticamente controllare l'impiego appropriato delle parentesi graffe in uno scritto C. Devo controllare se il numero delle parentesi destre è maggiore di quelle sinistre allora devo porre in quel punto del file di output due punti interrogativi. Alla fine del while devo controllare se le parentesi sinistre sono minori di quelle destre. Se così fosse devo stampare un messaggio d'errore con il numero delle parentesi mancanti, però non devo stampare il numero vero e proprio ma una serie di }}}} tante quante ne mancano. Ed è qui che ho il maggior problema. Ti posto come l'ho fatto io, ma mi da un'output strano.

#include <stdio.h>
#include <stdlib.h>

int main(){

int left_cnt=0,right_cnt=0;
char c;

while((c=getchar())!=EOF){
if(c=='{') left_cnt++;
else right_cnt++;
if(right_cnt>left_cnt)
putchar('?');
putchar('?');
}

if(right_cnt==left_cnt)
printf("Tutto OK!");
else printf("ERRORE: Parentesi chiuse mancanti: /*che ci metto qui????*/

Grazie ancora.

NA01
20-04-2005, 22:26
per le librerie matematiche devi dirgli di prendere le librerie

gcc mio_file.c -lm

dove -l è l'opzione, m sta per math ;)

ciao

Manugal
20-04-2005, 22:58
Ah ecco!!! Ora mi ricordo. Grazie. Avevo letto infatti da qualche parte una cosa del genere. Grazie. Senti sai come posso risolvere il mio ultimo problema?

Matro
20-04-2005, 23:20
Ci metti un ciclo che va dal numero di parentesi chiuse (che è più piccolo) a quello di parentesi aperte (più grande), e stampi un "}" :)

Ziosilvio
21-04-2005, 12:03
ogni volta che includo la libreria math.h e chiamo qualche funzione, ad esempio come sqrt(), mi dice che praticamente non è definita da nessuna parte. Eppure il file math.h è presente tra le librerie C. Forse è definita in un altro modo?
La libreria libm.a, le cui funzioni sono dichiarate in math.h, non viene linkata automaticamente da gcc.
Quindi, quando compili col classico "gcc program.c", ti dà errore.
Devi essere tu a dire a gcc di linkare la libreria con l'opzione "-lm" (meno, elle, emme: scusa, ma in alcuni charset la lettera "l" minuscola, la lettera "I" maiuscola e la cifra "1" sono presso ché uguali...)

Ziosilvio
21-04-2005, 12:07
#include <stdio.h>
#include <stdlib.h>

int main(){

int left_cnt=0,right_cnt=0;
char c;

while((c=getchar())!=EOF){
if(c=='{') left_cnt++;
else right_cnt++;
if(right_cnt>left_cnt)
putchar('?');
putchar('?');
}

if(right_cnt==left_cnt)
printf("Tutto OK!");
else printf("ERRORE: Parentesi chiuse mancanti: /*che ci metto qui????*/
Ti basta un contatore solo.
Tanto, in ogni caso i cicli sono diversi a seconda che ci siano più graffe aperte o più graffe chiuse.
E riguardo a questi cicli: usa putchar, non printf.

Manugal
21-04-2005, 14:11
Grazie mille a tutti :D