View Full Version : [C] Nuovo problema con CodeBlocks
Cadetto Entusiasta
11-11-2008, 13:25
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");
“
royaleagle
11-11-2008, 13:38
Non è un problema di codeblocks, ma di studio :rolleyes: .
Così funziona
#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);
}
DanieleC88
11-11-2008, 19:02
Non è un problema di codeblocks, ma di studio :rolleyes: .
Così funziona
#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);
}
Magari, dal momento che a lui serve più studio, fagli imparare da subito che main() deve restituire un int, e che quindi alla fine vorrà un return con un valore numerico intero. ;)
DanieleC88
11-11-2008, 19:09
P.S.: serve davvero quel ciclo while?
royaleagle
11-11-2008, 19:41
-Giusta osservazione nel post precedente.
-Perchè a te funziona anche senza (while...)?
DanieleC88
11-11-2008, 20:43
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). ;)
royaleagle
11-11-2008, 21:00
Io con Code::Blocks lo devo usare sempre, non so come spiegarmelo..
DanieleC88
11-11-2008, 21:11
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. ;)
royaleagle
11-11-2008, 21:40
No sono su linux, Code::Blocks 8.02, gnu gcc compiler di default. :confused:
DanieleC88
12-11-2008, 01:56
Anche io su Linux e con GNU gcc, compila e viene eseguito senza problemi, anche senza il while si comporta nel modo corretto. :wtf:
Cadetto Entusiasta
12-11-2008, 11:07
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.
royaleagle
12-11-2008, 13:46
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 return 0; ad esempio.
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.
Cadetto Entusiasta
13-11-2008, 08:52
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?
royaleagle
13-11-2008, 09:23
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}
}
}
Cadetto Entusiasta
17-11-2008, 16:08
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");
}
}
}
}
DanieleC88
17-11-2008, 17:55
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 ;)
DanieleC88
17-11-2008, 18:02
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. ;)
Cadetto Entusiasta
17-11-2008, 22:35
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 ;)
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;
}
royaleagle
17-11-2008, 22:46
Credo tu debba trattare separatamente le acquisizioni di giorno, mese ed anno.. Quindi 6 scanf in totale ;)
DanieleC88
17-11-2008, 22:57
Credo tu debba trattare separatamente le acquisizioni di giorno, mese ed anno.. Quindi 6 scanf in totale ;)
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.
Cadetto Entusiasta
19-11-2008, 23:48
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.
No ma veramente ti funziona?? perchè a me no?? ma hai inserito il testo dell'ultimo programma che ho postato cn le correzioni delle virgole e il return finale?? a me proprio fa sempre la stessa cosa..... :(
DanieleC88
20-11-2008, 00:09
No ma veramente ti funziona?? perchè a me no?? ma hai inserito il testo dell'ultimo programma che ho postato cn le correzioni delle virgole e il return finale?? a me proprio fa sempre la stessa cosa..... :(
Sì, mi funziona. Ti faccio vedere il codice com'è, al momento sono su Windows e l'ho compilato da Visual C++ 2008:
#include <stdio.h>
int 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);
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;
}
Se noti, è cambiata solo la virgola, il return finale e la formattazione (ho lasciato riformattare a Visual C++ come meglio preferiva). Ho provato a compilarlo e lanciarlo, e non ho ottenuto errori; ho inserito:
due date, dove la più recente era la prima due date, dove la più recente era la seconda due date uguali
e mi ha risposto correttamente in tutti e tre i casi.
Certo, l'ora è tarda e quindi il mio cervello mi segue ancora meno del solito, ma mi sentirei di escludere un problema di logica a questo punto. Se ti va, allega l'eseguibile zippato qui sul forum (sia un PE di Windows che un ELF di Linux mi vanno benissimo), così provo di persona. :)
ciao ;)
P.S.: se ti va puoi anche provare ad isolare quel pezzo di codice in una funzione separata che accetti le due date come argomenti e risponda "-1" se la prima data è la più recente, "1" se la seconda data è la più recente, "0" se le due date sono uguali (be', insomma, basta che siano tre valori diversi, sceglili pure a piacere). A quel punto il main() dovrebbe solo chiamare la funzione ed esaminare il valore di ritorno tramite uno switch, aumentando anche la leggibilità del codice. Se non funziona nemmeno in quel caso... chiama l'esorcista. :p
Cadetto Entusiasta
20-11-2008, 15:21
Ciao...io ho provato a mettere il codice che hai postato te, ma ciò che mi viene fuori facendolo girare su codeblock è questo:
http://img403.imageshack.us/img403/3773/immaginelo9.th.jpg (http://img403.imageshack.us/my.php?image=immaginelo9.jpg)http://img403.imageshack.us/images/thpix.gif (http://g.imageshack.us/thpix.php)
Non penso venga la stessa cosa anke a te.....
Io ho Visual Studio 2008 ma non lo so usare, ho provato, ma non so come incominciare....
non ti fa fare il secondo input praticamente.. anche io ste cose le odio perchè capita che su win funza e linux no o viceversa o salcazzo per quale motivo :D
DanieleC88
20-11-2008, 17:52
Ciao...io ho provato a mettere il codice che hai postato te, ma ciò che mi viene fuori facendolo girare su codeblock è questo:
http://img403.imageshack.us/img403/3773/immaginelo9.th.jpg (http://img403.imageshack.us/my.php?image=immaginelo9.jpg)http://img403.imageshack.us/images/thpix.gif (http://g.imageshack.us/thpix.php)
Non penso venga la stessa cosa anke a te.....
Io ho Visual Studio 2008 ma non lo so usare, ho provato, ma non so come incominciare....
Eh aspetta però, se l'input si aspetta le virgole devi inserire anche le virgole, altrimenti la scanf() salterà dei pezzi di stringa (in quel modo la interpreta come se venissero messe in input tre date, dove la prima ha il giorno uguale a 12, la seconda a 21, la terza a 88, e mesi ed anni resterebbero inizializzati, conservando il valore casuale che c'era in memoria prima delle scanf()). :)
Cadetto Entusiasta
21-11-2008, 12:18
ma sai che hai veramente ragione....io ho sempre messo le date come nell'immagine che ho postato, invece adesso che ci metto la virgola, va tutto perfettamente a posto......
Veramente, grazie mille!!!!
DanieleC88
21-11-2008, 12:24
:)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.