TEI Λάρισας / ΣΤΕΦ Τμ. Τεχνολογίας Πληροφορικής & Τηλεπικοινωνιών Α Εξεταστική Περίοδος, 25 Ιουνίου 2009 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ Ηλίας. Κ. Σάββας Α 1) Να δημιουργήσετε ένα header file με όνομα pinakesα.h το οποίο με χρήση δύο συναρτήσεων να υπολογίζει την θέση του μεγαλύτερου και μικρότερου στοιχείου αντίστοιχα μονοδιάστατων πινάκων. Τέλος, να γράψετε ένα πολύ απλό πρόγραμμα που να δείχνει την χρήση αυτού του header file (3 μονάδες). int megisto(int *, int); int elaxisto(int *, int); int megisto(int *A, int N) int thesi=0, i; for (i=0; i<n; i++) if (A[i] > A[thesi]) thesi=i; return thesi; int elaxisto(int *A, int N) int thesi=0, i; for (i=0; i<n; i++) if (A[i] < A[thesi]) thesi=i; 1
return thesi; #include <stdio.h> #include "pinakesa.h" int X[5] = 4, 1, -4, 6, 2; int tm, te, i; tm = megisto(x, 5); te = elaxisto(x, 5); printf("\nmegisto = %d", X[tm]); printf("\nelaxisto = %d", X[te]); 2) Σε ένα binary file με όνομα <meteob.dat> είναι αποθηκευμένες οι μέγιστη και ελάχιστη θερμοκρασία καθώς και η μέγιστη και ελάχιστη υγρασία κάποιου τόπου για κάποιο έτος. Να γράψετε ένα πρόγραμμα που να μεταφέρει σε ένα πίνακα το αρχείο και στην συνέχεια να το επιστρέφει σε ένα αρχείο κειμένου με όνομα <meteot.dat> στο οποίο σε κάθε γραμμή του να εμφανίζονται τα δεδομένα του binary με επιπλέον τις μέσες τιμές της θερμοκρασίας και υγρασίας (4 μονάδες). #include <stdio.h> #include <stdlib.h> 2
struct Meteo float mt; float et; float my; float ey; ; FILE *b, *t; struct Meteo *m; float mesit, mesiy; int meg, plithos, i; b = fopen("meteob.dat", "rb"); if (!b) printf("\nden vrethike to arxeio..."); return -1; fseek(b,0,seek_end); meg = ftell(b); plithos = meg / sizeof(struct Meteo); m = malloc(meg); if (!m) printf("\npoly megalo arxeio..."); return -2; /* Metafora se pinaka */ for (i=0; i<plithos; i++) fread(&m[i], sizeof(struct Meteo), 1, b); fclose(b); /* Metafora se text file */ 3
t = fopen("meteot.dat", "w"); for (i=0; i<plithos; i++) mesit = (m[i].mt+m[i].et)/2; mesiy = (m[i].my+m[i].ey)/2; fprintf(t, "\n%.2f %.2f %.2f %.2f %.2f %.2f ", m[i].mt, m[i].et, mesit, m[i].my, m[i].ey, mesiy); fclose(t); 3) Έστω ότι θέλουμε να υποκαταστήσουμε το παιχνίδι <πέτρα=0, ψαλίδι=1, χαρτί=2). Να γράψετε ένα πρόγραμμα το οποίο να παίζει κάποιος παίκτης (ο χρήστης) εναντίον του υπολογιστή αυτό το παιχνίδι. Ο χρήστης να δίνει την επιλογή του και στην συνέχεια το πρόγραμμα να παράγει τυχαία την δική του επιλογή. Στην συνέχεια το πρόγραμμα να ελέγχει για τον νικητή (η πέτρα νικάει το ψαλίδι, το ψαλίδι το χαρτί και το χαρτί την πέτρα). Τέλος, το πρόγραμμα να επαναλαμβάνει αυτή τη διαδικασία μέχρι κάποιος από τους δύο παίκτες φτάσει πρώτος τις Ν νίκες (έστω Ν=10) (3 μονάδες). #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 10 int p=0, s=1, x=2; int h=0, m=0; int paixtis, ypologistis; 4
int i; srand(time(null)); while (h<n && m<n) printf("\ndwse ektimisi (petra=0, psalidi=1, xarti=2):"); scanf("%d", &paixtis); ypologistis = rand()%3; printf("\nypologistis = %d", ypologistis); if (paixtis == 0) if (ypologistis == 1) h++; else if (ypologistis == 2) m++; if (paixtis == 1) if (ypologistis == 2) h++; else if (ypologistis == 0) m++; if (paixtis == 2) if (ypologistis == 0) h++; else if (ypologistis == 1) m++; printf("\n\napotelesma, Esy:%d, Ypologistis:%d", h, m); if (h==n) 5
printf("\n\n\nnikises..."); else printf("\n\n\nnikisa!!!"); TEI Λάρισας / ΣΤΕΦ Τμ. Τεχνολογίας Πληροφορικής & Τηλεπικοινωνιών Α Εξεταστική Περίοδος, 25 Ιουνίου 2009 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ Ηλίας. Κ. Σάββας B 1) Να δημιουργήσετε ένα header file με όνομα pinakesβ.h το οποίο με χρήση συνάρτησης να αναζητά εάν υπάρχει κάποιο στοιχείο σε μονοδιάστατο πίνακα και να επιστρέφει την θέση του εάν το βρίσκει, αλλιώς -1. Τέλος, να γράψετε ένα πολύ απλό πρόγραμμα που να δείχνει την χρήση αυτού του header file (3 μονάδες). int anazitisi(int *, int, int); int anazitisi(int *A, int N, int x) int thesi = -1, i=0; while (i < N && thesi == -1) if (A[i] == x) thesi = i; i++; 6
return thesi; #include <stdio.h> #include "pinakesb.h" int X[5] = 4, 1, -4, 6, 2, t; int a = 2; t = anazitisi(x, 5, a); if (t == -1) printf("\n\nto %d den vrethike", a); else printf("\n\nto %d vrethike stin thesi %d", a, t); 2) Έστω ότι υπάρχει ένα αρχείο κειμένου με όνομα <trigonat.dat> το οποίο σε κάθε γραμμή του περιέχει τα μήκη των 3 πλευρών τριγώνων. Το μέγεθος του αρχείου (επομένως και το πλήθος των τριγώνων) είναι γνωστό, έστω Ν=100. Να γράψετε ένα πρόγραμμα το οποίο: α) να μεταφέρει το αρχείο σε ένα πίνακα δομών, όπου στα 3 πρώτα μέλη να μεταφέρονται τα μήκη των πλευρών και στο τέταρτο πεδίο να υπολογίζεται η περίμετρός τους (το άθροισμα αυτών των πλευρών), και β) να επιστρέφει ολόκληρο τον πίνακα σε ένα binary file με όνομα <trigonab.dat> (4 μονάδες). 7
#include <stdio.h> #include <stdlib.h> #define N 100 struct Trigono_Per float a; float b; float c; float per; ; FILE *b, *t; struct Trigona_Per tr[n]; float pa, pb, pc; int i; t = fopen("trigonat.dat", "r"); if (!t) printf("\nden vrethike to arxeio..."); return -1; for (i=0, i<n; i++) fscanf(t,"%f%f%f", &pa, &pb, &pc); tr[i].a=pa; tr[i].b=pb; tr[i].c=pc; tr[i].per=pa+pb+pc; fclose(t); b = fopen("trigonab.dat", "wb"); for (i=0; i<n; i++) 8
fwrite(&tr[i], sizeof(struct(trigono_per), 1, b); fclose(b); 3) Να γράψετε ένα πρόγραμμα το οποίο να «γεμίζει» ένα πίνακα Νx2 (έστω Ν=1000) με Ν τυχαίες ζαριές. Στην συνέχεια, να υπολογίζει και εκτυπώνει πόσες φορές εμφανίστηκε κάποια συγκεκριμένη ζαριά (να θεωρείτε ότι δεν έχει σημασία η σειρά της ζαριάς, πχ η ζαριά 5-3 είναι ίδια με την 3-5) (3 μονάδες). #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int X[N][2]; int i, a, b; int c = 0; srand(time(null)); for (i=0; i<n; i++) X[i][0] = rand()%6+1; X[i][1] = rand()%6+1; printf("\neisagogi zarias:"); 9
scanf("%d%d", &a, &b); for (i=0; i<n; i++) if ((X[i][0]==a && X[i][1]==b) (X[i][0]==b && X[i][1]==a)) c++; printf("\nsynolo emfanisewn = %d", c); 10