Dubbi su un programma in C

pippo931
salve a tutti, ho iniziato da poco a leggermi un manuale sul linguaggio C (C corso completo di programmazione dei fratelli Deitel) e mi sono venuti alcuni dubbi riguardo al seguente programma per la divisione di interi.

#include

main()

{
int intero1, intero2, quoziente, resto;

printf("Inserisci il dividendo\n");
scanf("%d", &intero1);
printf("Inserisci il divisore\n");
scanf("%d", &intero2);
quoziente = intero1 / intero2;
resto = intero1 % intero2;
printf("Il quoziente è %d", quoziente);
printf(" e il resto è %d\n", resto);
return 0;

}

Intanto, il libro di solito usa int main() , ma io ho visto che funziona anche con main() e basta, qual è la differenza tra le due espressioni?
Poi, se si tenta una divisione per 0 il programma segnala ovviamente un errore, e quindi io stavo provando a far dire al programma, nel caso che si assegni il valore 0 al divisore, che la divisione fosse impossibile (o indeterminata quando anche il dividendo è 0, ma questo per il momento l'ho tralasciato) e allora ho provato inserendo:

if(intero2==0){
printf("divisione impossibile");}

ma non funziona, come si può fare?

grazie
ma non funziona

Risposte
pippo931
ah, ok, ignorate il secondo dubbio, ci sono riuscito inserendo

if(intero2==0){
printf("divisione impossibile");
return 0;
}

e quindi sono giunto a questo:

#include

main()

{
int intero1, intero2, quoziente, resto;

printf("Inserisci il dividendo\n");
scanf("%d", &intero1);
printf("Inserisci il divisore\n");
scanf("%d", &intero2);

if(intero1==0, intero2==0){
printf("divisione indeterminata\n");
return 0;
}
if(intero2==0){
printf("divisione impossibile\n");
return 0;
}
quoziente = intero1 / intero2;
resto = intero1 % intero2;
printf("Il quoziente è %d", quoziente);
printf(" e il resto è %d\n", resto);
return 0;

}

ma la divisione risulta indeterminata anche se solo il divisore è 0, in pratica mi pare di aver capito che la condizione if(intero1==0, intero2==0) venga soddisfatta anche solo se una delle due uguaglianze è vera. Come faccio a scrivere una condizione che si soddisfi quando le due uguaglianze sono vere contemporaneamente?

pippo931
grazie Sergio per i chiarimenti, prenderò senz'altro il libro da te consigliato in biblioteca e ne approfitto per chiederti una cosa: un semplice programma per la moltiplicazione va in tilt con numeri alti, ti riporto ciò che scrive il terminale:


-laptop:~ ./moltiplicazione

Programma in C per la moltiplicazione di due numeri interi.

Inserisci il primo fattore
999999999999999999999999
Inserisci il secondo fattore
99999999999999999999999999
Il prodotto dei due numeri è 1

-laptop:~ ./moltiplicazione

Programma in C per la moltiplicazione di due numeri interi.

Inserisci il primo fattore
987654321
Inserisci il secondo fattore
987654321
Il prodotto dei due numeri è -238269855


E' possibile che il programma abbia limiti così (relativamente) bassi?

Sk_Anonymous
Sì, è possibile :-D
Prova a usare il tipo variabile long int, ma per numeri così grandi mi sa che non funziona lo stesso.

Incognita X
...

Andrea691
"Sergio":
Onestamente non ricordo se la standardizzazione aveva reso i tipi omogenei tra le diverse implementazioni.


Jamais... anzi, al contrario: lo standard familiarmente noto come C'99 tiene conto anche di numerosi casi legati alle piattaforme esotiche (es. il controverso void main, che ha realmente senso solo laddove non esista in realtà un sistema "chiamante") e riconferma la stretta dipendenza dei tipi dalla piattaforma e dal compilatore, assicurando solo alcune blande relazioni d'ordine generali, come in $"short int"\ <=\ "int"\ <=\ "long int"$ et similia.

Come ama ripetere il mio boss, non dimentichiamo che "là fuori", oltre alle poche centinaia di milioni di PC dei quali tutti sembrano preoccuparsi, ci sono circa cinquanta miliardi di piattaforme embedded a 8 o 16 bit di data word, costruite attorno ad architetture Harvard pure, con bus fisicamente separati per dati ed istruzioni, ciascuno dei quali di ampiezza e perfino endianess potenzialmente diversa dall'altro bus - "dettagli" che contano parecchio quando si memorizzano costanti in program memory, ad esempio. L'idea è che se per PC e Mac, con qualche sforzo e molta acribia filologica, si possono enumerare al più una dozzina di compilatori C funzionanti, esistono invece centinaia di cross-compilers di eccellente livello, tuttora basati su estensioni arbitrarie del vecchio standard C'89: non sorprende che lo standard più recente ne tenga debitamente conto. I produttori di cross tools non paiono invece ricambiare cotanta attenzione, ma questo è un fenomeno soprattutto culturale: espressione del conservativismo prudenziale che impera nell'universo embedded.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.