ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδηµαϊκό έτος 2003-2004 ΑΣΚΗΣΗ #5 Προτεινόµενη λύση Θέµα 1 /* Προγραµµατιστής : Ηµεροµηνία συγγραφής : Λειτουργία Προγράµµατος : Πρόγραµµα για την αποθήκευση και ανάκτηση βαθµολογιών φοιτητών */ /*Ορισµός της βιβλιοθήκης συναρτήσεων εισόδου-εξόδου*/ #include <stdio.h> #define SIZE 10 φοιτητών στον πίνακα #define FIRST_AM 20040 // Ορισµός του µέγιστου αριθµού // Ορισµός του πρώτου ΑΜ struct Student // Ορισµός του Struct "Student" int AM; char Onoma[15]; char Eponimo[40]; int Vathm_The; int Vathm_Erg; int Vathm_Dia; students[size]; // Ορισµός του πίνακα students // ήλωση των συναρτήσεων που θα οριστούν αργότερα στο πρόγραµµα int insertstudent(); void insertgrades(); int displaygrades(); void sortbygrade(int vath,int sorted[]); void printreports(); // ήλωση µεταβλητών int LastUsedAM=FIRST_AM; int NumberOfStudents=0; int main(void) char ch; do // Εµφάνιση των αρχικών επιλογών printf(" MAIN MENU\n"); printf("====================\n"); printf("1.eisagwgh FOITHTH.\n"); printf("2.eisagwgh BATHMWN.\n"); printf("3.emfanish BATHMWN.\n");
printf("4.ektypwseis.\n"); printf("0.exodos.\n"); ch=getch(); // Είσοδος επιλογής από τον χρήστη // Εκτέλεση της κατάλληλης συνάρτησης ανάλογα µε την επιλογή του χρήστη switch(ch) case '0': // Έξοδος από το πρόγραµµα case '1': // Εισαγωγή φοιτητή insertstudent(); case '2': // Εισαγωγή βαθµών insertgrades(); case '3': // Εµφάνιση βαθµών displaygrades(); case '4': // Εκτυπώσεις (στην οθόνη) printreports(); default: // Αν έχει εισαχθεί κάποια πλήκτρο που δεν αντιστοιχεί PALI.\n"); ; // στις παραπάνω επιλογές printf("lathps EPILOGI! PROSPATHISTE while(ch!='0'); // Αν το ch είναι µηδέν, τότε τελειώνει το πρόγραµµα return 0; int insertstudent() //Έλεγχος για το αν είναι γεµάτος ο πίνακας if (NumberOfStudents>=SIZE) printf("o PINAKAS EINAI GEMATOS!\n\n"); // Έξοδος από την συνάρτηση, και επιστρέφει την τιµή 1 return 1; printf("=====================\n"); printf("eisagvgh NEOU FOITHTH\n"); printf("=====================\n"); printf("onama : "); scanf("%s",students[numberofstudents].onoma); printf("eponimo : "); scanf("%s",students[numberofstudents].eponimo); students[numberofstudents].am=lastusedam;
NumberOfStudents++; LastUsedAM++; printf("h EISAGWGH EGINE EPITYXWS!\n\n"); // Έξοδος από την συνάρτηση, και επιστρέφει την τιµή 0 return 0; void insertgrades() int am=0; int ch; 10 /* Η µεταβλητή TempVathmos, είναι βοηθητική µεταβλητή, που θα χρησιµοποιηθεί για τον έλεγχο αν ο βαθµός που εισάγει ο χρήστης είναι θετικός και µικρότερος του πριν τον αποθηκεύσει στον πίνακα.*/ int TempVathmos; do printf("eisagvgh BATHMWN\n"); printf("1.bathmos THEORIAS\n"); printf("2.bathmos ERGASTHRIOY\n"); printf("3.bathmos DIAGVNISMATOS\n"); printf("0.epistrofh\n"); ch=getch(); // Είσοδος επιλογής από τον χρήστη switch(ch) case '0': case '1': printf("dose AM FOITHTH :"); scanf("%d",&am); am-=first_am; Α.Μ. TETOIO AM!\n"); // Έλεγχος για το αν υπάρχει το if (!(am>=0 && am<numberofstudents)) printf("den YPARXEI FOITHTHS ME printf("bathmos THEWRIAS: "); scanf("%d",&tempvathmos); βαθµός εντός των επιτρεπτών ορίων // Έλεγχος για το αν είναι ο if (TempVathmos<0)
printf ("O VATHMOS DEN MPOREI NA EINAI MIKROTEROS APO TO 0 KAI GI'AFTO DEN THA else if (TempVathmos>10) printf ("O VATHMOS DEN MPOREI NA EINAI MEGALYSTEROS APO TO 10 KAI GI'AFTO DEN THA else students[am].vathm_the=tempvathmos; case '2': printf("dose AM FOITHTH :"); scanf("%d",&am); am-=first_am; TETOIO AM!\n"); if (!(am>=0 && am<numberofstudents)) printf("den YPARXEI FOITHTHS ME printf("bathmos ERGASTHRIOY: "); scanf("%d",&tempvathmos); if (TempVathmos<0) printf ("O VATHMOS DEN MPOREI NA EINAI MIKROTEROS APO TO 0 KAI GI'AFTO DEN THA else if (TempVathmos>10) printf ("O VATHMOS DEN MPOREI NA EINAI MEGALYSTEROS APO TO 10 KAI GI'AFTO DEN THA else students[am].vathm_erg=tempvathmos; case '3': printf("dose AM FOITHTH :"); scanf("%d",&am); am-=first_am; TETOIO AM!\n"); if (!(am>=0 && am<numberofstudents)) printf("den YPARXEI FOITHTHS ME printf("bathmos DIAGVNISMATOS: "); scanf("%d",&tempvathmos); if (TempVathmos<0) printf ("O VATHMOS DEN MPOREI NA EINAI MIKROTEROS APO TO 0 KAI GI'AFTO DEN THA else if (TempVathmos>10)
printf ("O VATHMOS DEN MPOREI NA EINAI MEGALYSTEROS APO TO 10 KAI GI'AFTO DEN THA else students[am].vathm_dia=tempvathmos; default: PALI.\n"); ; while (ch!='0'); int displaygrades() βαθµών int am=0; printf("lathps EPILOGI! PROSPATHISTE // Συνάρτηση για την εµφάνιση των printf("emfanish BATHMWN\n"); printf("dose AM FOITHTH :"); scanf("%d",&am); am-=first_am; if (!(am>=0 && am<numberofstudents)) printf("den YPARXEI FOITHTHS ME TETOIO AM!\n"); return 1; printf("am :%d\n",students[am].am); printf("onoma :%s\n",students[am].onoma); printf("eponimo :%s\n",students[am].eponimo); printf("bathmos THEWRIAS :%2d\n",students[am].Vathm_The); printf("bathmos ERGASTHRIOY :%2d\n",students[am].Vathm_Erg); printf("bathmos DIAGVNISMATOS:%2d\n",students[am].Vathm_Dia); printf("=========================\n"); printf("telikos BATHMOS :%4.1f\n",(students[am].Vathm_Dia+ students[am].vathm_erg+ students[am].vathm_the)/3.0f); return 0; void sortbygrade(int vath,int sorted[]) ταξινόµηση int min_vath=1000; int i,j,t; // Συνάρτηση για την sorted[i]=i;
if (vath==1) min_vath=students[sorted[i]].vathm_the; if (students[sorted[j]].vathm_the<min_vath) min_vath=students[sorted[j]].vathm_the; for (j=i+1;j<numberofstudents;j++) t=sorted[i]; sorted[i]=sorted[j]; sorted[j]=t; else if (vath==2) min_vath=students[sorted[i]].vathm_erg; for (j=i+1;j<numberofstudents;j++) if (students[sorted[j]].vathm_erg<min_vath) min_vath=students[sorted[j]].vathm_erg; t=sorted[i]; sorted[i]=sorted[j]; sorted[j]=t; else min_vath=students[sorted[i]].vathm_dia; for (j=i+1;j<numberofstudents;j++) if (students[sorted[j]].vathm_dia<min_vath) min_vath=students[sorted[j]].vathm_dia; t=sorted[i]; sorted[i]=sorted[j]; sorted[j]=t;
void printreports() int sortorder[size]; int ch; int i; do printf("ekthpwseis\n"); printf("1.kata AM\n"); printf("2.kata BATHMO THEWRIAS\n"); printf("3.kata BATHMO ERGAS\n"); printf("4.kata BATHMO DIAG\n"); printf("0.epistrofh\n"); ch=getch(); PALI.\n"); switch(ch) case '0': continue; case '1': sortorder[i]=i; case '2': sortbygrade(1,sortorder); case '3': sortbygrade(2,sortorder); case '4': sortbygrade(3,sortorder); default: printf("lathps EPILOGI! PROSPATHISTE ; continue; printf("%-5s ","AM"); printf("%-10s ","ONOMA"); printf("%-20s ","EPONIMO"); printf("%-9s ","VATHM_THE"); printf("%-9s ","VATHM_ERG"); printf("%-9s\n","vathm_dia");
printf("%-5d ",students[sortorder[i]].am); printf("%-10s ",students[sortorder[i]].onoma); printf("%-20s ",students[sortorder[i]].eponimo); printf("%-9d ",students[sortorder[i]].vathm_the); printf("%-9d ",students[sortorder[i]].vathm_erg); printf("%-9d ",students[sortorder[i]].vathm_dia); while (ch!='0'); Παρατήρηση: Το παραπάνω πρόγραµµα µεταγλωττίστηκε µε την χρήση του προγράµµατος GCC το οποίο βρίσκεται στο συνοδευτικό CD του βιβλίου του µαθήµατος. Στην περίπτωση που θελήσει κάποιος να το µεταγλωττίσει µε το CYGWIN, πρέπει να αντικαταστήσει το getch µε το getchar αν του βγάλει λάθος στην µεταγλώττιση.
Στην συνέχεια παρατίθονται µερικά στιγµιαιότυπα (screenshots) από την εκτέλεση του προγράµµατος