Εργαστήριο 8 Ασκήσεις Πινάκων Ταξινόμηση Αναζήτηση Γιώργος Λαμπρινίδης amprinidis@pharm.uoa.gr
Παραδείγματα στους πίνακες (1) Έστω ότι έχετε το εξής: int a[20]; for(i = 0; i < 20; i++) a[i] = i+1; Ποιες θα είναι οι τιμές των στοιχείων του πίνακα μετά τη for; 2
Παραδείγματα στους πίνακες (2) Έστω ότι έχουμε τον πίνακα του προηγούμενου παραδείγματος. Τι θα εκτυπώσει η παρακάτω εντολή; for(i = 0 ; i < 20; i++) prine( a[%d] = %d\n,i+1, a[i]); 3
Παραδείγματα στους πίνακες (3) Τι κάνει το ακόλουθο κομμάτι κώδικα; int i, temp, a[5]; for (i = 0; i < 4; i++) { if (a[i] > a[i+1]) { temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; Βοήθεια: Σκεφτείτε ότι έχετε τον πίνακα a[5] = {5,1,3,6,4; και τρέξτε τον αλγόριθμο με το χέρι για να δείτε τι θα κάνει στην προκειμένη περίπτωση. Γιατί η for τρέχει μέχρι το 4 και όχι μέχρι το 5; 4
Πράξεις σε πίνακες Ταξινόμηση Αλγόριθμος bubbesort Αναζήτηση Σειριακή αναζήτηση Δυαδική αναζήτηση (δεν θα τη δούμε σε αυτό το εργαστήριο) 5
Ταξινόμηση στοιχείων πίνακα Είναι συχνό φαινόμενο να θέλουμε τα στοιχεία ενός πίνακα ταξινομημένα κατ αύξουσα σειρά. π.χ. αντί για τον πίνακα α[5] = {3,1,5,4,2; προτιμάμε τον πίνακα α[5] = {1,2,3,4,5; 6
Αλγόριθμος bubbesort για την ταξινόμηση στοιχείων πίνακα (1) Δίνουμε τη λογική του αλγορίθμου με ένα παράδειγμα: Έστω ότι θέλουμε να ταξινομήσουμε τον πίνακα με στοιχεία (5,1,4,2,8). Ο αλγόριθμος θα τρέξει ως εξής: 1 ο τρέξιμο: ( 5 1 4 2 8 ) ( 1 5 4 2 8 ) ( 1 5 4 2 8 ) ( 1 4 5 2 8 ) ( 1 4 5 2 8 ) ( 1 4 2 5 8 ) ( 1 4 2 5 8 ) ( 1 4 2 5 8 ) 2 ο τρέξιμο: ( 1 4 2 5 8 ) ( 1 4 2 5 8 ) ( 1 4 2 5 8 ) ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) 3 ο τρέξιμο: ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) 7
Αλγόριθμος bubbesort για την ταξινόμηση στοιχείων πίνακα (2) int i, fag, temp, a[5]; a[5] = {5,1,4,2,8; do { fag = 0; for (i = 0; i < 4; i++) { if (a[i] > a[i+1]) { temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; fag =1; whie (fag == 1); 8
Αναζήτηση στοιχείων πίνακα Γράψτε ένα πρόγραμμα σε C που να ορίζει αρχικοποιεί έναν πίνακα 10 ακεραίων με δικά σας στοιχεία. Στη συνέχεια, να διαβάζει ένα στοιχείο που δίνει ο χρήστης από το πληκτρολόγιο. Το πρόγραμμα να ψάχνει για το στοιχείο αυτό μέσα στον πίνακα. Αν το βρίσκει να ενημερώνει το χρήστη ότι βρέθηκε και σε ποια θέση. Αν δεν υπάρχει να ενημερώνει το χρήστη αντίστοιχα. 9
Λύση #incude <stdio.h> main() { int i, stoixeio, vrethike = 0; int a[10] = {2,56,9,34,44,21,90,78,45,5; prine("\ndwste to stoixeio pou anazitate:"); scanf("%d", &stoixeio); for (i = 0; i < 10; i++) { if (a[i] == stoixeio) { prine("\nvrethike to dothen stoixeio s thesi %d tou pinaka.", i); vrethike = 1; break; if (vrethike == 0) prine("\nto stoixeio pou dwsate den yparxei ston pinaka."); getchar(); getchar(); 10
Πρόβλημα 1 Γράψτε ένα πρόγραμμα σε C που να διαβάζει για 10 οπλίτες τα εξής στοιχεία: το σώμα κατάταξης (1 = στρατός, 2 = ναυτικό) και την ηλικία. Το πρόγραμμα να ελέγχει αν η ηλικία είναι στο διάστημα 17-40. Μόλις διαβάσει τα στοιχεία ενός οπλίτη, τοποθετεί την ηλικία του σε αντίστοιχο πίνακα ανάλογα με το σώμα που ανήκει και υπολογίζει τον μέσο όρο ηλικίας για το κάθε σώμα. 11
Λύση #incude <stdio.h> main() { int age, swma, i; int i_str = 0, i_naut = 0; int sum_str_age = 0; int sum_naut_age = 0; int str_age[10]; int naut_age[10]; doube mo_str_age; doube mo_naut_age; /*oi metavites aytes metroun posous opites exoume sto strato kai posous sto nay ko*/ /*athroisma iikiwn gia strato*/ /*athroisma iikiwn gia nau ko*/ /*pinakas me iikies gia strato*/ /*pinakas me iikies gia nau ko*/ /*mesos oros iikiwn gia strato*/ /*mesos oros iikiwn gia nau ko*/ for (i = 0; I < 10; i++) { do { prine("\ndwste to swma toy %doy opi (1,2): ", i); scanf("%d", &swma); whie (swma!= 1 && swma!= 2); /*eegxw o tha mou dwsei 1,2 aiws ksanazitw mi*/ do { prine("\ndwste n iikia toy %doy opi (17-40): ", i); scanf("%d", &age); whie (age < 17 age > 40); 12
Λύση (Συνέχεια) if (swma == 1) { str_age[i_str] = age; i_str++; sum_str_age += age; ese { naut_age[i_naut] = age; i_naut++; sum_naut_age += age; /* end of for */ mo_str_age = (doube) sum_str_age / (doube) i_str; mo_naut_age = (doube) sum_naut_age / (doube) i_naut; prine("\n%d opites sto strato me mesi iikia %.1f",i_str, mo_str_age); prine("\n%d opites sto nau ko me mesi iikia %.1f",i_naut, mo_naut_age); scanf("%d", &i); /* end of main */ 13
Πρόβλημα 2 Στο προηγούμενο πρόβλημα, να γίνει ταξινόμηση των οπλιτών που βρίσκονται στον στρατό (όχι σε άλλα σώματα), με βάση την ηλικία τους, κατά αύξουσα σειρά. 14
Λύση (Μόνο το κομμάτι της ταξινόμησης) do { fag = 0; for (i = 0; i < i_str-1; i++) { if (str_age[i] > str_age[i+1]) { temp = str_age[i]; str_age[i] = str_age[i+1]; str_age[i+1] = temp; whie (fag == 1); 15
Πρόβλημα 3 Στο προηγούμενο πρόβλημα, να διαβαστεί μία τιμή ηλικίας σε μία μεταβλητή και να βρεθεί αν υπάρχει οπλίτης που υπηρετεί στο ναυτικό, και έχει αυτή την ηλικία. 16
Λύση (Μόνο το κομμάτι της αναζήτησης) vrethike = 0; prine("\ndwste n iikia pou anazitate:"); scanf("%d", &iikia); for (i = 0; i < i_naut; i++) { if(naut_age[i] == iikia) { prine("\nvrethike s thesi %d tou pinaka.", i); vrethike = 1; break; if(vrethike == 0) prine("\h iikia pou dwsate den yparxei ston pinaka."); 17
Ασκήσεις Να διαβαστούν τα εισοδήματα 5 υπαλλήλων σε έναν πίνακα και να γίνει φθίνουσα ταξινόμηση των υπαλλήλων ως προς τα εισοδήματα τους. Να αρχικοποιηθεί ένας πίνακας με 10 βαθμούς. Στη συνέχεια, ο χρήστης να δίνει έναν βαθμό και να εμφανίζεται μήνυμα ανάλογο με το αν ο βαθμός βρέθηκε στον πίνακα η όχι (και αν ναι, που βρέθηκε). 18