|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Apr 2005
Città: Prov. di Torino
Messaggi: 164
|
[C] Nuovo problema con CodeBlocks
Devo scrivere un programma che inserendo due serie di 6 numeri relativi a date, riconosca quale è la più recente delle due. Solo che già facendo una mini prova preliminare di
“ #include <stdio.h> main() { int gg1, gg2, mm1, mm2, aa1, aa2; printf("Inserire prima data: "); scanf("%d,%d,%d", gg1, mm1, aa1); printf("Inserire seconda data: "); scanf("%d,%d%d", gg2, mm2, aa2); } “ facendolo eseguire, inserisco la prima data GG MM AA, dopo che faccio invio per inserire la seconda data, mi viene fuori una finestra di windows che mi dice che il programma ha smesso di funzionare e che verrà chiuso (praticamente, mi dice anche altro ma non mi risolve la cosa). C’è qualche problema in particolare che non fa eseguire correttamente il programma? Anche perché oggi l’ho ripreso, non ricordandomi di questa cosa, e dovrei anche vedere cosa mi fa facendolo seguire da “ if(gg1>gg2 && mm1>mm2 && aa1>aa2) printf("La prima data inserita è la più la recente\n"); else printf("La seconda data inserita è la più recente\n"); “
__________________
IMPOSSIBLE IS NOTHING |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2007
Messaggi: 1237
|
Non è un problema di codeblocks, ma di studio
![]() Così funziona Codice:
#include <stdio.h> main() { int gg1, gg2, mm1, mm2, aa1, aa2; printf("Inserire prima data: "); scanf("%d,%d,%d", &gg1, &mm1, &aa1); //La riga che segue serve per togliere l'invio dal buffer while (getchar() != '\n'); printf("Inserire seconda data: "); scanf("%d,%d,%d", &gg2, &mm2, &aa2); } |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
P.S.: serve davvero quel ciclo while?
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2007
Messaggi: 1237
|
-Giusta osservazione nel post precedente.
-Perchè a te funziona anche senza (while...)? |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Sì, da me funziona anche senza quel while, in effetti non mi sembra il caso in cui c'è bisogno di un controllo dello svuotamento del buffer (mi spiego: scanf() salta i whitespace, tra cui anche '\n', quindi la seconda scanf() se ne frega del newline).
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2007
Messaggi: 1237
|
Io con Code::Blocks lo devo usare sempre, non so come spiegarmelo..
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Magari hai un C runtime un po' diverso: sei su Windows? Io lo sto provando da Linux e funziona senza problemi di alcun tipo, anche se mi sembrerebbe strano un comportamento differente su Windows. Magari domani o qualche altro giorno lo provo con Visual C++ e vedo se cambia qualcosa.
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jan 2007
Messaggi: 1237
|
No sono su linux, Code::Blocks 8.02, gnu gcc compiler di default.
![]() |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Anche io su Linux e con GNU gcc, compila e viene eseguito senza problemi, anche senza il while si comporta nel modo corretto.
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Apr 2005
Città: Prov. di Torino
Messaggi: 164
|
Grazie per le risposte.
Allora io adesso ho provato aggiungendo la stringa del while suggerita da royaleagle, e così devo dire che non mi fa più nessun problema di crash del programmino. Non ho ben capito che cosa intendi DanieleC88 per “…fagli imparare da subito che main() deve restituire un int, e che quindi alla fine vorrà un return con un valore numerico intero.”. Non so, solo per renderlo noto io lavoro su ambiente Windows Vista Ultimate SP1 con CodeBlocks 8.02 e gnu gcc compiler di default (almeno, io ho scaricato il tutto e non ho cambiato niente di eccezionale, solo il carattere dei font e basta). Comunque dato che funge il programmino e posso andare avanti con lo studio di esso, adesso il problema che ho è nel fatto di fargli analizzare i valori che gli inserisco in modo corretto. Io dopo ho inserito “ if(aa1>aa2 && mm1>mm2 && gg1>gg2) printf("Prima data inserita più recente\n"); else printf("Seconda data inserita più recente\n"); “ in modo tale che analizzasse prima l’anno, poi il mese e poi il giorno e mi desse poi una risposta in base a questi parametri, ma naturalmente non fa quello che avrei in testa che mi faccia, ma con qualsiasi data che io inserisca, mi da sempre che la seconda è la più recente. Ho provato anche ad invertire i valore che deve analizzare if, partendo dal giorno-mese-anno, ma capita la stessa cosa. In questo caso di sicuro mi manca lo studio, ma non saprei proprio che altra alternativa ci sarebbe per svolgere questo esercizio.
__________________
IMPOSSIBLE IS NOTHING |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jan 2007
Messaggi: 1237
|
1. Sai com'è la sintassi della definizione e della dichiarazione di una funzione? Sai che c'è un tipo del valore di ritorno, per il Main tale tipo è int, quindi per uscire dal programma devi fare un
Codice:
return 0; 2. Il programma che hai scritto funziona se inserisci qualcosa del tipo 25/12/1987 e 20/9/1980, cioè con gg1>gg2 && mm1>mm2 && aa1>aa2. Capirai da solo che non è l'unica condizione affinchè una data sia maggiore di un'altra. Se vuoi confrontare 22 con 100, ti conviene iniziare dalla cifra più significativa: 1>0 quindi sai subito che 100 è maggiore di 22. Tornando al tuo caso, prima confronti l'anno: se sono uguali procedi a controllare anche il mese (e successivamente il giorno, se serve), altrimenti sei già arrivato alla conclusione. |
![]() |
![]() |
![]() |
#13 |
Member
Iscritto dal: Apr 2005
Città: Prov. di Torino
Messaggi: 164
|
Del ritorno della funzione del main non lo mai utilizzata, cioè non ciò mai fatto caso che alla fine ce la dovrei mettere. Adesso gliel'ho messa.
Per il controllo successivo delle date, io adesso come adesso ho il programma strutturato in questa maniera " #include <stdio.h> int main () { int gg1, gg2, mm1, mm2, aa1, aa2; printf("Inserire prima data: "); scanf("%d,%d,%d", &gg1, &mm1, &aa1); while (getchar() != '\n'); printf("Inserire seconda data: "); scanf("%d,%d%d", &gg2, &mm2, &aa2); if(aa1>=aa2 && mm1>=mm2 && gg1>gg2) printf("La prima data inserita è la più la recente\n"); else printf("La seconda data inserita è la più recente\n"); return 0; } " partendo appunto a controllare prima l'anno, il mese e il giorno se è maggiore o uguale; però la cosa non funge. Ma è giusto che continui a seguire la strada della sola stringa di if con questi tipi di controllo, o in essa ce qualcosa di sbagliato, o devo farlo ancora in un altro modo?
__________________
IMPOSSIBLE IS NOTHING |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jan 2007
Messaggi: 1237
|
Codice:
if (aa1 > aa2) {//la data più recente è 1} else if (aa1 < aa2) {//la data più recente è 2} else{ //corrisponde al caso aa1 == aa2 if (mm1 > mm2){//la data più recente è 1} else if (mm1 < mm2) {//la data più recente è 2} else{ //corrisponde al caso mm1 == mm2 if(gg1 > gg2){//la data più recente è 1} else if (gg1 < gg2) {//la data più recente è 2} else {//le date sono uguali} } } |
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Apr 2005
Città: Prov. di Torino
Messaggi: 164
|
Forse sono molto handicappato io (senza offesa per nessuno), ma io ho provato a mettere ciò che mi hai scritto per il programma, aggiungendo dei printf per dirmi delle cose ma non mi funge; mi dice sempre che il secondo anno inserito è il più recente, anche se io inserisco valori per cui mi deve dire il contrario.....
Adesso io ho il programma così: #include <stdio.h> int main () { int gg1, gg2, mm1, mm2, aa1, aa2; printf("Inserire prima data: "); scanf("%d,%d,%d", &gg1, &mm1, &aa1); while (getchar() != '\n'); printf("Inserire seconda data: "); scanf("%d,%d%d", &gg2, &mm2, &aa2); if (aa1 > aa2) {//la data più recente è 1 printf("L'anno più recente è il primo\n"); } else if (aa1 < aa2) {//la data più recente è 2 printf("L'anno più recente è il secondo\n"); } else{ //corrisponde al caso aa1 == aa2 if (mm1 > mm2){//la data più recente è 1 printf("Il mese più recente è il primo\n"); } else if (mm1 < mm2) {//la data più recente è 2 printf("Il mese più recente è il secondo\n"); } else{ //corrisponde al caso mm1 == mm2 if(gg1 > gg2){//la data più recente è 1 printf("Il giorno più recente è il primo\n"); } else if (gg1 < gg2) {//la data più recente è 2 printf("Il giorno più recente è il secondo\n"); } else {//le date sono uguali} printf("Le date sono uguali\n"); } } } }
__________________
IMPOSSIBLE IS NOTHING |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Nel primo scanf() manca una virgola, mi sa che è quella che ti sballa tutto. Per il resto, manca il return 0 prima della fine del main().
ciao ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Ah: tanto per allenamento, creati una funzione che confronti le due date e ti dica quale viene prima, poi usa quella dal main() per sapere cosa stampare.
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#18 | |
Member
Iscritto dal: Apr 2005
Città: Prov. di Torino
Messaggi: 164
|
Quote:
Io ho provato ad aggiustare la virgola e ad aggiungere il return 0 alla fine, ma mi fa sempre la stessa cosa..... Adesso ce l'ho così: #include <stdio.h> int main () { int gg1, gg2, mm1, mm2, aa1, aa2; printf("Inserire prima data: "); scanf("%d,%d,%d", &gg1, &mm1, &aa1); while (getchar() != '\n'); printf("Inserire seconda data: "); scanf("%d,%d,%d", &gg2, &mm2, &aa2); if (aa1 > aa2) {//la data più recente è 1 printf("L'anno più recente è il primo\n"); } else if (aa1 < aa2) {//la data più recente è 2 printf("L'anno più recente è il secondo\n"); } else{ //corrisponde al caso aa1 == aa2 if (mm1 > mm2){//la data più recente è 1 printf("Il mese più recente è il primo\n"); } else if (mm1 < mm2) {//la data più recente è 2 printf("Il mese più recente è il secondo\n"); } else{ //corrisponde al caso mm1 == mm2 if(gg1 > gg2){//la data più recente è 1 printf("Il giorno più recente è il primo\n"); } else if (gg1 < gg2) {//la data più recente è 2 printf("Il giorno più recente è il secondo\n"); } else {//le date sono uguali} printf("Le date sono uguali\n"); } } } return 0; }
__________________
IMPOSSIBLE IS NOTHING |
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Jan 2007
Messaggi: 1237
|
Credo tu debba trattare separatamente le acquisizioni di giorno, mese ed anno.. Quindi 6 scanf in totale
![]() |
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
No, perché mai? Ho provato lo stesso codice che ha postato Cadetto Entusiasta nel precedente post, cambiando solo la virgola e il return (e le indentazioni nei controlli sulle date, ma non influiscono), e funziona bene, pare.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:00.