Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα και χρόνια πολλά!

 

Μας έχουν βάλει μια άσκηση για τις διακοπές για να κάνουμε εξάσκηση στην C. 

Η άσκηση είναι να διαβάσουμε μια χρονολογία και έναν μήνα και να εμφανίζουμε στον χρήστη πόσες ημέρες έχει ο μήνας αυτός (με δίσεκτα ή όχι έτη), με κατάλληλα μηνύματα σφάλματος όπου χρειάζεται (π.χ. αρνητικός μήνας/αρνητική χρονολογία, μήνας>12)

 

 

Παρακάτω είναι ο κώδικας που έχω γράψει.

 

 

/*Programma pou emfanizei tis imeres enos mina opoioudipote etous*/
 
#include <stdio.h>
main ()
{
int minas=0, etos=0, imeres=0;
printf ("\n**** EURESI IMERWN TOU MINA OPOIOUDIPOTE ETOUS ****");
printf ("\n---------------------------------------------------");
printf ("\nParakalw dwste etos   p.x. 1978:  ");
scanf ("%d", &etos);
while (etos<=0)
{
printf ("\nO xronos pou valate einai lathos, parakalw ksanadoste     : ");
scanf ("%d", &etos);
}
printf ("\nParakalw dwste mina  p.x. 10:     ");
scanf ("%d", &minas);
while (minas<=0 && minas>=13)
{
printf ("\nO minas pou valate einai o %d kai einai lathos, parakalw ksanadwste      : ", minas);
scanf ("%d", &minas);
}
if (minas==4 || minas==6 || minas==9 || minas==11)
{
imeres=30;
printf ("\nApantisi: \n\n O %d os minas tou etous %d eixe/exei %d imeres. \n\nTelos Programmatos", minas, etos, imeres);
}
else if (minas==1 || minas==3 || minas==5 || minas==7 || minas==8 || minas==10 || minas==12)
{
imeres=31;
printf ("\nApantisi:  \n\n O %d os minas tou etous %d eixe/exei %d imeres. \n\nTelos Programmatos", minas, etos, imeres);
}
else
{
if (etos%4==0 && etos%100!=0 && etos%400==0)
{
imeres=29;
printf ("\nApantisi: \n\nO %d os minas tou etous %d (einai disekto etos) eixe/exei %d imeres.\n\nTelos Programmatos", minas, etos, imeres);
}
else 
{
imeres=28;
printf ("\nApantisi: \n\nO %d os minas tou etous %d (den einai disekto etos) eixe/exei %d imeres. \n\nTelos Programmatos", minas, etos, imeres);
}
}
 
}

 

 

 

 

 

Στην χρονολογία δεν μου εμφανίζει πρόβλημα και τρέχει κανονικά το Loop σε περίπτωση λάθους. 

Στον μήνα όμως, βγάζει πρόβλημα. Αν βάλω π.χ. αρνητικό μήνα, δεν λειτουργεί το Loop και μου εμφανίζει απάντηση.

 

 

Kάποιος που να μπορεί να βοηθήσει?

Thanks in advance

Δημοσ.

^

Βασικά δηλαδή είναι ακριβώς το αντίθετο από αυτό που έπρεπε να γράψεις.

 

By the way, είναι λάθος και η συνθήκη για τα δίσεκτα.

 

Επίσης καθαρά σα θέμα προτίμησης αντί να έχεις έτσι το if/else θα μπορούσες να το γράψεις πολύ πιο κατανοητά IMO ως

switch(minas) {
    case 1: // ιαν
    case 3: // μαρ
    case 5: // μαϊ
    case 7: // κλπ
    case 8:
    case 10:
    case 12:
        printf("31");
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        printf("30");
        break;
    case 2:
        // μπλα μπλα υπολογίζεις δίσεκτο κλπ
        break;
    default:
        // λάθος μήνας που πας καραμήτρο
}

Είναι νομίζω πολύ πιο άμεσα κατανοητή η λογική του πώς προκύπτει ο αριθμός των μηνών γιατί ο κώδικας ακολουθεί πιστά αυτό που σου μαθαίνουν στο σχολείο. Ενώ η άλλη εκδοχή με τα else if κλπ ναι μεν καταλήγει στο ίδιο αποτέλεσμα αλλά αν θες να την "καταλάβεις" σαν αναγνώστης έχεις περισσότερη δουλειά να κάνεις.

Δημοσ.

Βαλε και ενα int στη main.

 

btw εγω θα σου ελεγα να την λυσεις με αλλο τροπο. Αυτο, με χρηση api

Πάνε δώσε άσκηση με χρήση non standard API και άμα δεν σου βάλει μηδέν χέσε με :)
Δημοσ.

Αν κάνατε Arrays θα μπορούσες κάπως έτσι να το κάνεις:

#include <stdio.h>

int main(){
	int year,month,days[] = {31,29,31,30,31,30,31,31,30,31,30,31};
	
	scanf("%i",&year);
	scanf("%i",&month);
	
	days[1] -= ((year%4)==0)?0:1;
	
	printf("%i/%i/%i",year,month,days[month]);
	
	return 0;
}

Τα καταλληλα μηνύματα λάθους/σφάλματος μπορείς να τα βάλεις και εσύ.

Δημοσ.

Βαλε και ενα int στη main. 

 

btw εγω θα σου ελεγα να την λυσεις με αλλο τροπο. Αυτο, με χρηση api

Δεν είμαστε τόσο προχωρημένοι

 

Κι ένα return στη main, εκτός κι αν γράφεις C99.

Noted ;)

 

Αν κάνατε Arrays θα μπορούσες κάπως έτσι να το κάνεις:

#include <stdio.h>

int main(){
	int year,month,days[] = {31,29,31,30,31,30,31,31,30,31,30,31};
	
	scanf("%i",&year);
	scanf("%i",&month);
	
	days[1] -= ((year%4)==0)?0:1;
	
	printf("%i/%i/%i",year,month,days[month]);
	
	return 0;
}

Τα καταλληλα μηνύματα λάθους/σφάλματος μπορείς να τα βάλεις και εσύ.

Δεν είμαστε τόσο προχωρημένοι

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...