|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2005
Città: Roma
Messaggi: 596
|
[C] Problemino
Ciao raga..ho fatto un programmino stupidissimo (abbiamo appena iniziato all'uni..) e vorrei ke windows nn mi chiudesse subito la finestra del dos una volta eseguito il programma..allora cercando su internet ho trovato la funzione system("PAUSE")..ma vorrei chiedervi alcune cose a riguardo..si dice ke x farla funzionare bisogna includere la libreria <stdlib.h> ma a me funziona lo stesso senza (e premetto ke l unica ke ho incluso è <stdio.h>) inoltre dopo la funzione va messo return 0..cosa vuol dire ke la funzione restuisce 0??
grazieee PS:di sicuro avrò altre domande in futuro..qnd posterò direttamente qua.. ![]() |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
![]() Il valore ritornato dal main() può essere utile al processo "padre" per determinare l'esito del programma. Ora ... non c'è una regola precisa su cosa restituire. Sui sistemi Linux/Unix dove si usano molto le shell e dove spesso si ha bisogno di conoscere l'esito di un programma, la convenzione è che uno status=0 significa successo e altri valori significano fallimento o comunque una qualche altra segnalazione.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Dec 2005
Città: Roma
Messaggi: 596
|
Quote:
|
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
int main (void) oppure int main (int argc, char *argv[]) Il valore restituito, come ho già detto, è lo "status" del programma (e non c'entra nulla con una system() ). Passiamo a system(). Il suo prototipo in stdlib.h è un qualcosa del tipo int system(const char*). Ora ... il valore di ritorno di system non lo usi e comunque system ritorna un int (la regola è che se una funzione non è dichiarata precedentemente, viene implicitamente presa come una funzione che ritorna un int e senza fare assunzioni sui parametri). Quindi anche senza prototipo e finché passi un puntatore a char a system, va tutto bene. In ogni caso la fase di linking è ok, perché il linker comunque linka con la libreria standard. Il prototipo serve appunto per far sì che il compilatore possa controllare/convertire gli argomenti passati. Se non includi stdlib.h e fai: system (123456); Il compilatore non fa obiezioni (al massimo potrebbe dire che system non è definita) ... ma se lo esegui ... molto probabilmente va in crash!! Se invece includi stdlib.h ti segnalerà un chiaro warning del fatto che hai passato un argomento non corretto.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Mar 2007
Città: 127.0.0.1
Messaggi: 23
|
Molto probabilmente il programma funziona anche senza includere la stdio.h.
Questo è opera del compilatore che usi, che include automaticamente le librerie principali come la stdio e la stdlib. Gcc fa questo. Altrimenti può essere come ha detto andbin. Daniel
__________________
Se hai un sogno, non metterlo mai al secondo posto nella lista delle cose da fare. Ultima modifica di skerdz : 29-03-2007 alle 14:47. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2005
Città: Roma
Messaggi: 596
|
Ciao ragà..vorrei chiedervi una cosa sullo switch-case..allora ho fatto un programma in cui scelgo tre possibile vie da percorrere..ok fin qui tutto bene..xo una volta scelta una delle tre opzioni svolgo quella specifica opzione e il programma finisce..se volessi ke tornasse di nuovo a chiedere quali opzione scegliere?Ho pensato ad un ciclo for x far ripetere il programma finkè nn sia io ad chiedergli di uscire..ebbene ecco il listato ma nn va cm vorrei io..dv è l'errore?
#include <stdio.h> char scelta; main() { printf("\t\t\t\tCALCOLI GEOMETRICI\n"); for( ; ; ){ printf("\na)Trasposta di una matrice.\nb)Somma di due matrici.\n"); printf("c)Prodotto di due matrici.\ne)Exit.\n"); printf("\nScegli tra le opzioni: "); scelta = getchar(); switch(scelta) { case 'a': printf("Hai scelto a\n"); break; case 'b': printf("Hai scelto b\n"); break; case 'c': printf("Hai scelto c\n"); break; case 'e': exit(0); default: printf("Selezione errata!\n"); break; } } } |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Altre quisquilie: getchar() ritorna un int, non un char, quindi scelta dichiaralo come int. Inoltre includi <stdlib.h>
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Dec 2005
Città: Roma
Messaggi: 596
|
Quote:
qst il prog cn scanf: #include <stdio.h> #include <stdlib.h> char scelta; main() { printf("\t\t\t\tCALCOLI GEOMETRICI\n"); for( ; ; ){ printf("\na)Trasposta di una matrice.\nb)Somma di due matrici.\n"); printf("c)Prodotto di due matrici.\ne)Exit.\n"); printf("\nScegli tra le opzioni: "); scanf("%c", &scelta); switch(scelta) { case 'a': printf("Hai scelto a\n"); break; case 'b': printf("Hai scelto b\n"); break; case 'c': printf("Hai scelto c\n"); break; case 'e': exit(0); default: printf("Selezione errata!\n"); break; } } } Ultima modifica di InferNOS : 07-04-2007 alle 17:51. |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
messo dopo l'input, in modo da "buttare" via tutto il rimanente fino al \n. Per la exit().
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#10 |
Junior Member
Iscritto dal: Mar 2007
Città: 127.0.0.1
Messaggi: 23
|
Puoi risolvere benissimo pulendo il buffer prima di chiamare la getchar
Codice:
#include <stdio.h> int main() { char scelta; printf("CALCOLI GEOMETRICI\n"); for ( ; ; ) { printf("\n" "a)Trasposta di una matrice.\n" "b)Somma di due matrici.\n" "c)Prodotto di due matrici.\n" "e)Exit.\n"); printf("\nScegli tra le opzioni: "); fflush(stdin); // pulisce il buffer sulla stdin scelta = getchar(); switch(scelta) { case 'a': printf("Hai scelto a \n"); break; case 'b': printf("Hai scelto b \n"); break; case 'c': printf("Hai scelto c \n"); break; case 'e': return 0; break; default: printf("Selezione errata! \n"); break; } } // fine for } // fine main()
__________________
Se hai un sogno, non metterlo mai al secondo posto nella lista delle cose da fare. Ultima modifica di skerdz : 07-04-2007 alle 22:11. Motivo: Avevo aggiunto una stdlib.h che non serviva |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Oppure puoi fare tutto usando un ciclo do-while che qualsiasi prof. di "Fondamenti di informatica/programmazione" o "Informatica 1" gradisce maggiormente.
![]() Codice:
#include <stdio.h> #include <stdlib.h> int main() { int select ; printf("CALCOLI GEOMETRICI\n") ; do { printf( "\n" "a) Trasposta di una matrice.\n" "b) Somma di due matrici.\n" "c) Prodotto di due matrici.\n" "e) Esci.\n" ) ; select = getchar() ; /* Pulizia buffer di ingresso */ while(getchar() != '\n') ; switch(select) { case 'a': printf("Hai scelto a!\n") ; break ; case 'b': printf("Hai scelto b!\n") ; break ; case 'c': printf("Hai scelto c!\n") ; break ; case 'e': break ; default: printf("Errore!"); break ; } } while(select != 'e') ; return(0) ; } Ultima modifica di sirus : 07-04-2007 alle 22:47. |
![]() |
![]() |
![]() |
#12 | |
Junior Member
Iscritto dal: Mar 2007
Città: 127.0.0.1
Messaggi: 23
|
Quote:
![]() ![]()
__________________
Se hai un sogno, non metterlo mai al secondo posto nella lista delle cose da fare. |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
fflush() è fatta per stream di output. Il comportamento non è predefinito, a livello di standard, per stream di input (sebbene su certi compilatori, es. VC++, pulisca correttamente il buffer di input).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Dec 2005
Città: Roma
Messaggi: 596
|
Ciao raga..grazie x le risp..qst giorni nn c sono stato..
allora avrei una domanda x sirus..mi spiega meglio un pò cosa hai fatto?? ![]() Allora innanzitutto xkè nn usare un semplice while?dopodikè nel do-while mi sarei aspettato un do all'inizio del blocco e un while alla fine mentre qui ce ne sono due(???)..cm mai? ![]() |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
do { printf( "\n" "a) Trasposta di una matrice.\n" ...... } } while(select != 'e') ; All'interno di quel ciclo c'è un while, che non centra nulla con il do-while principale: Codice:
while(getchar() != '\n') ;
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Dec 2005
Città: Roma
Messaggi: 596
|
OK grazie andbin...era quel punto e virgola ke non riuscivo a capire..ora mi è molto + chiaro tutto il codice..un ultima cosa..nel while(esp) si verifica l 'espressione dopodichè se risulta vera si esegue l'istruzione..qui ke l'istruzione non c'è cosa fa esattamente il programma??Ossia a parole ke gli dice di fare al prog?
Es.. while(n!=0){ printf("Ciao") } qui nel caso ke n è diverso da 0 il prog stampera ciao senno si blocca ma qui while(getchar() != '\n') ; cosa viene chiesto di fare?finchè l'utente nn spinge invio ke succede? scusa se vi sto rompendo ma vorrei capire x benino sti cavolo di costrutti! ![]() |
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
select = getchar() ; while(getchar() != '\n') ; La while con getchar semplicemente cicla finché la getchar restituisce \n, quindi appunto legge tutti i caratteri rimasti nel buffer. Il corpo del while non deve fare nulla (da qui il ';' come istruzione nulla).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: May 2005
Città: Bari
Messaggi: 349
|
allora penso che il problema a livello concettuale sia il seguente (l'ho avuto anche io qualche mesetto fa):
Codice:
select = getchar() ; /* Pulizia buffer di ingresso */ while(getchar() != '\n') ; in pratica quando viene eseguita la getchar() [dovrebbe essere come una scanf("%c", &select);], ammettendo che tu voglia scegliere il carattere 'a', dovrai per forza di cose, sulla tastiera, pigiare prima la 'a' e dopo invio ('\n')...così facendo in memoria rimane il carattere '\n' e quindi entri nel case:default dello switch spero di essere stato chiaro.... ![]() Vito
__________________
Si può vincere una guerra in due...o forse anche da solo. Si può estrarre il cuore anche al più nero assassino, ma è più difficile cambiare un'idea! |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Dec 2005
Città: Roma
Messaggi: 596
|
Chiarissimo ragazzi!! C'è un xò (ke rompi coglioni ke sono è?
![]() |
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Immagina che non ci sia questo ciclo, se la prima volta premi 'abc' e invio, la prima selezione è ok ('a'), i successivi 2 cicli la selezione è ancora ok ma NON si ferma per l'input, e per l'ultimo carattere restituito cioè \n, andrebbe nel caso default. Non è certo un buon comportamento!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:46.