Π Ι Ν Α Κ Ε Σ (arrays) ΤΑΞΙΝΟΜΗΣΗ Η μέθοδος της φυσαλίδας (bubble sort) Η μέθοδος της επιλογής (selection) Η μέθοδος της γρήγορης ταξινόμησης (quicksort) Η μέθοδος της συγχώνευσης (merge sort)
Π Ι Ν Α Κ Ε Σ (arrays) ΑΝΑΖΗΤΗΣΗ Η μέθοδος της ακολουθιακής αναζήτησης (sequential search) Η μέθοδος της δυαδικής αναζήτησης (binary search)
0 1 2 3 4 5 . . . 18 19 ? ? ? ? ? ? ? ? ? ? ? ? Δήλωση Πίνακα τύπος όνομα_πίνακα [ μέγεθος ] ; Παράδειγμα #define N 20 double a[N]; Αν a[4] αναφέρεται στο 5ο στοιχείο Αν i = 3 a[i+2] αναφέρεται στο 6ο στοιχείο
for ( i=0; i<20; i ++) vathmos [i] = 0; 0 1 2 3 4 5 . . . 18 19 0 0 0 0 0 0 0 0 0 0 0 0 0
Χωρίς τη χρήση δεικτών athroisma = 0; for ( i=0; i<N; i++) athroisma += vathmos[i];
Το πέρασμα των πινάκων στις συναρτήσεις γίνεται μόνο με αναφορά. Παράδειγμα Να γραφεί μία συνάρτηση που να υπολογίζει το μέσο όρο των τιμών των στοιχείων του πίνακα. double mesos_oros ( int vathmos[], int megethos); { int i; double athroisma = 0.0; for ( i=0; i< megethos; i++) athroisma += vathmos[i]; return ( athroisma / megethos ); }
Πρόβλημα Γράψτε ένα πρόγραμμα που να μετρά τους χαρακτήρες ενός κειμένου που δίνει από το πληκτρολόγιο και να τυπώνει τη συχνότητα εμφάνισης των κεφαλαίων γραμμάτων.
Πρόγραμμα /* Υπολογίζει τη συχνότητα εμφάνισης των κεφαλαίων γραμμάτων σε ένα κείμενο */ #include <stdio.h> #define PLITHOS 26 int main (void) { double pinakas[PLITHOS]; int xar; int i, grammata;
/. Αρχικές τιμές. / for (i = 0; i < PLITHOS; ++i) pinakas [i] = 0 /* Αρχικές τιμές */ for (i = 0; i < PLITHOS; ++i) pinakas [i] = 0.0; grammata = 0; printf (“\n Εισάγετε το κείμενο. Πατήστε Enter και Cltrl-Z για τέλος δεδομένων”); while (xar = getchar() != EOF) { if (‘A’ <= xar && xar <= ‘Z’) grammata++; switch (xar)
pinakas [0]++; break; case ‘A’: case ‘B’: pinakas [1]++; break; : case ‘Z’: pinakas [25]++; break; default : printf(“Λάθος γράμμα”); }
printf (“\n Αποτελέσματα: \n”); for (i = 0; i < PLITHOS; i++) pinakas[i] /= grammata; printf (“\n Αποτελέσματα: \n”); i=0; for (xar=‘A’; xar<=‘Z’; xar ++) { printf (“Συχνότητα εμφάνισης του %c: %f”, xar, pinakas [i]); i++; } return 0;
Η μέθοδος της φυσαλίδας (bubble sort) Πρόβλημα Γράψτε μία function που να ταξινομεί σε αύξουσα σειρά τους ακέραιους αριθμούς με τη μέθοδο της φυσαλίδας.
void fysalida (int m[], int n) /* n είναι το μέγεθος του m[] */ { int i, j; for (i = n-1; i>0; ++i) for ( j =0; j< i; ++j) if (m[j] > m[j+1]) andallagi(&m[j], &m[j+1]); }
void andallagi(int *p, int *q) { int pros; pros = *p; *p = *q; *q = pros; }
void fysalida(int m[], int n) { int pros, i; char taxinomisi= ‘o’; /* όχι ταξινομημένη*/ do { taxinomisi = ‘n’; for (i=0; i<n-1; i++) if ( m[i] > m[i+1]) andallagi( &m[i], &m[i+1]); taxinomisi = ‘o’; n = n - 1; /*ελαττώνεται κατά ένα ο πίνακας*/ } while (taxinomisi == ‘o’); }
#include <stdio.h> #define N 200 void andallagi(int *p, *int *q); void fysalida(int m[], int n) int main(void) { int i, pinakas[N]; printf(“\nΕισάγετε %d ακέραιους αριθμούς”, N); for (i=0; i <N; ++i) scanf(“%d”, &pinakas[i]); fysalida(pinakas, N); /* κλήση της fysalida */
printf(“\nΟι ταξινομημένοι αριθμοί είναι :”); for (i=0; i <N; ++i) printf(“%d”, pinakas[i]); return 0; }
ΑΝΑΖΗΤΗΣΗ Σειριακή Αναζήτηση Πρόβλημα Γράψτε μία συνάρτηση που να βρίσκει ένα συγκεκριμένο στοιχείο του πίνακα των ακεραίων αριθμών .
Συνάρτηση /* Υλοποιεί τη μέθοδο της σειριακής αναζήτησης σε μη ταξινομημένη λίστα */ void seiriaki_anazitisi_1 (int kleidi, int megethos, int pinakas [ ], int *deiktis, int *vrethike) { int i; *vrethike = 0; /* δεν έχει βρεθεί το στοιχείο */ *deiktis = -1;
for (i = 0; i < megethos; i++) if (kleidi = = pinakas [i]) { deiktis = i; *vrethike = 1; /* βρέθηκε το στοιχείο */ break; }
Συνάρτηση /. Σειριακή αναζήτηση σε ταξινομημένη (αύξουσα) λίστα Συνάρτηση /* Σειριακή αναζήτηση σε ταξινομημένη (αύξουσα) λίστα */ void seiriaki_anazitisi_2 (int kleidi, int megethos, int pinakas [ ], int *deiktis, int *vrethike) { int i; *vrethike = 0; /* δεν έχει βρεθεί το στοιχείο */ *deiktis = -1;
for (i = 0; i < megethos; i++) if (kleidi < pinakas [i]) / for (i = 0; i < megethos; i++) if (kleidi < pinakas [i]) /*δεν υπάρχει το κλειδί στη λίστα */ break; else if (kleidi = = pinakas [i]) { *deiktis = i; *vrethike = 1; }
Πρόβλημα Να γραφεί ένα πρόγραμμα, το οποίο Να δημιουργεί ένα πίνακα ακέραιων αριθμών, οι οποίοι δίνονται από το πληκτρολόγιο. Να ταξινομεί τους αριθμούς αυτούς με τη χρήση της μεθόδου ταξινόμησης φυσαλίδα και Να αναζητά ένα δεδομένο αριθμό με τη μέθοδο της δυαδικής αναζήτησης
Πρόγραμμα #include <stdio. h> #include “taxi. c” #include “anaz Πρόγραμμα #include <stdio.h> #include “taxi.c” #include “anaz.c” #define MEGETHOS 100 /* Πρωτότυπα συναρτήσεων */ void eisodos (int pinakas[], int *megethos); int main (void) { int megethos, kleidi, thesi, i; int pinakas [MEGETHOS] eisodos (pinakas, &megethos); printf (“\n Μη ταξινομημένος πίνακας”);
for (i = 0; i < megethos; ++i) printf (“\n %d %d”, i, pinakas[i]); fysalida(pinakas, megethos); printf (“\n Ταξινομημένος πίνακας”); printf(“\n %d %d”, i, pinakas[i]); printf (“\n Εισάγετε έναν ακέραιο αριθμό για αναζήτηση (κλειδί)”); scanf (“%d”, &kleidi); dyadiki_anazitisi_1 (kleidi, pinakas, megethos, &thesi, &vrethike); if (vrethike) printf (“\n Επιτυχημένη αναζήτηση. Ο αριθμός %d είναι το% -οστό στοιχείο του πίνακα”, kleidi, thesi+1);
else printf (“\n Αποτυχημένη αναζήτηση”); return 0; } void eisodos (int pinakas[], int *megethos) { int i; printf (“\n Εισάγετε το πλήθος των αριθμών”); scanf (“%d”, megethos); for (i = 0; i < *megethos; ++i) { printf (“\n Εισάγετε ένα ακέραιο αριθμό:”); scanf (“%d”, &pinakas [i]); } /* Τέλος της eisodos */
Οι Πίνακες Μεγαλύτερης Διάστασης Στήλες 0 1 2 α[0][0] α[0][1] α[0][2] 0 86 73 35 α[1][0] α[1][1] α[1][2] Γραμμές 1 64 52 43 α[2][0] α[2][1] α[2][2] 2 87 93 57 α[3][0] α[3][1] α[3][2] 3 28 32 14 Αναφορά στοιχείου πίνακα A[i][j] Δείκτης γραμμής δείκτης στήλης
Δήλωση Δισδιάστατων Πινάκων Επεξεργασία Δισδιάστατων Πινάκων int a[4][3]; 86 73 35 64 52 43 87 93 57 28 32 14 Γραμμή 0 Γραμμή 1 Γραμμή 2 Γραμμή 3 Επεξεργασία Δισδιάστατων Πινάκων int vathmos [4][3]; for (i = 0; i < 4; i++) vathmos [i][j] = 0;
int a[4][3] = {{86,73,35}, {64,52,43}, {87,93,57}, {28,32,14}}; int a[ ][3] = {{86,73,35}, {64,52,43}, {87,93,57}, {28,32,14}}; Δισδιάστατοι Πίνακες σαν ορίσματα στις Συναρτήσεις Συνάρτηση double mesi_timi(int a[ ][STHLES], int n, int m) { int athroisma, i, j; double mesos_oros; athroisma = 0;
for (i = 0; i < n; i++) for (j = 0; j < m; j++) athroisma += a[i][j]; mesos_oros = athroisma/(n*m); return mesos_oros; } Παράδειγμα #include <stdio.h> #define GRAMMES 50 #define STHLES 50 void eisodos (int pin[] [STHLES], int *n, int *m); void exodos (int pin[] [STHLES], int n, int m); double mesi_timi (int pin[] [STHLES], int n, int m);
int main (void) { int pinakas [GRAMMES] [STHLES]; int n, m; eisodos (pinakas, &n, &m); exodos (pinakas, n, m); printf(“\n\n Η μέση τιμή είναι: %d”, mesi_timi (pinakas, n, m)); return 0; } void eisodos (int pinakas [ ] [STHLES], int *n, int *m) int i, j;
printf(“\n Εισάγετε πλήθος γραμμών:”); scanf (“%d”, n); printf(“\n Εισάγετε πλήθος στηλών:”); scanf (“%d”, m); for (i = 0; i < *n; ++i) for (j = 0; j < *m; ++j) { printf(“\n Εισάγετε μια τιμή για το στοιχείο του πίνακα [%d] [%d]:”, i, j); } /* τέλος for */ } /* τέλος eisodos */
void exodos (int pinakas [ ] [STHLES], int n, int m) { int i, j; for (i = 0; i < n; ++i) for (j = 0; j < m; ++j) printf(“%3d”, pinakas [i] [j]); } /* τέλος της exodos */ double mesi-timi (int pinakas [ ] [STHLES], int n, int m) Δηλώσεις και σώμα της mesi_timi } /* τέλος της mesi_timi */