|
|||||||
|
|
|
![]() |
|
|
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 15: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 18: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 23: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 23: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: 06:52.




















