ΠΙ Ν Α Κ Ε Σ (arrays)

Σχετικά έγγραφα
ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

ΣΥΝΑΡΤΗΣΕΙΣ (Functions)

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

Εργαστηριακή Άσκηση 1

Πίνακες. Χρησιμοποιούνται για αποθήκευση συνόλου δεδομένων του ίδιου τύπου. Γραμμική Διάταξη Δήλωση Τύπος Δεδομένων ΌνομαΠίνακα[ length ]

Περιεχόμενα. Πρόλογος... 17

Γλώσσα Προγραμματισμού C

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Η/Υ (ΤΛ2007 )

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προχωρημένες έννοιες προγραμματισμού σε C

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Πίνακες. Χρησιμοποιούνται για αποθήκευση συνόλου δεδομένων του ίδιου τύπου. Γραμμική Διάταξη Δήλωση Τύπος Δεδομένων ΌνομαΠίνακα[ length ]

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Περιεχόμενα. Πρόλογος... 21

Δομημένος Προγραμματισμός (ΤΛ1006)

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Διαδικασιακός Προγραμματισμός

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

Εισαγωγή στον Προγραμματισμό

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

A[0] = 0; /* To μηδέν δεν έχει διαιρέτες */ for (i=1; i<n; i++) { S=0; for (d=1; d<=i; d++) if (i % d == 0) S += d; A[i] = S; }

Εισαγωγή στον Προγραμματισμό

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

ΕΠΛ232: Εργαστήριο 2

Εισαγωγή στον δομημένο προγραμματισμό

Προγραμματισμός Η/Υ (ΤΛ2007 )

ιαφάνειες παρουσίασης #4

Αλγόριθμοι Ταξινόμησης Μέρος 1

Εντολές Επανάληψης. int sum = 0, i=1; sum += i++ ; sum += i++ ; Η πράξη αυτή θα πρέπει να επαναληφθεί Ν φορές!

Προγραμματισμός Η/Υ (ΤΛ2007 )

Δείκτες & Πίνακες Δείκτες, Πίνακες

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

Επανάληψη για τις Τελικές εξετάσεις

Εισαγωγή στον Προγραμματισμό (με. τη C)

242 -ΕισαγωγήστουςΗ/Υ

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

ΤΕΙ Θεσσαλίας, Τμήμα Μηχανικών Πληροφορικής ΤΕ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΥ ΕΡΓΑΣΤΗΡΙΟ 9. ΑΣΚΗΣΕΙΣ (με ενδεικτική λύση)

Δομές δεδομένων (2) Αλγόριθμοι

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΠΡΟΓΡΜΜΑΤΑ ΣΕ C. Γράψτε σε γλώσσα προγραμματισμού C τη συνάρτηση:

Εργαστήριο 3 Εντολή for while, do while

ΣΤΟΙΒΕΣ (stacks) Σχήµα: Λειτουργία Στοίβας

Εισαγωγή στον δομημένο προγραμματισμό

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Τμ. Τεχνολογίας Πληροφορικής & Τηλεπικοινωνιών Α Εξεταστική Περίοδος, 5 Φεβρουαρίου 2009 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ Ηλίας. Κ. Σάββας

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 8 Ασκήσεις Πινάκων Ταξινόμηση Αναζήτηση. Γιώργος Λαμπρινίδης

ΣΥΝΟΠΤΙΚΟΣ ΟΔΗΓΟΣ ΓΛΩΣΣΑΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C

Προγραμματισμός HY: Γλώσσα Προγραμματισμού C

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

Τμ. Τεχνολογίας Πληροφορικής & Τηλεπικοινωνιών Α Εξεταστική Περίοδος, 25 Ιουνίου 2009 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ Ηλίας. Κ. Σάββας

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

Η γλώσσα προγραμματισμού C

Διάλεξη 8η: Αλφαριθμητικά (strings)

Συµβολοσειρές - Strings

Ανάπτυξη και Σχεδίαση Λογισμικού

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

Κατανεμημένος και Παράλληλος Προγραμματισμός. Εισαγωγή στο MPI. Εγκατάσταση MPICH σε ένα ΗΥ 10/3/2017

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

Δομημένος Προγραμματισμός (ΤΛ1006)

Ουρές (Queues) FIFO A B C. Διαγραφή. Εισαγωγή. εµπρός. πίσω. πίσω. πίσω

Ταξινόμηση. Παύλος Εφραιμίδης. Δομές Δεδομένων Ταξινόμηση 1

ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ

ΑΣΚΗΣΗ 7: ΑΛΦΑΡΙΘΜΗΤΙΚΑ

Δομημένος Προγραμματισμός (ΤΛ1006)

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Δείκτες στην C (επανάληψη)

Συναρτήσεις και Πίνακες

Βήματα: μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων. Δομές Δεδομένων + Αλγόριθμοι = Προγράμματα

Μεθόδων Επίλυσης Προβλημάτων

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

Η γλώσσα προγραμματισμού C

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #5

Γλώσσα Προγραμματισμού C

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 4η Διάλεξη Πίνακες Συναρτήσεις

Κατανεμημένος και Παράλληλος Προγραμματισμός

Αλγόριθμοι ταξινόμησης

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραμματισμός Ι (ΗΥ120)

Ανάπτυξη και Σχεδίαση Λογισμικού

Δομημένος Προγραμματισμός

Μεθόδων Επίλυσης Προβλημάτων

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

H ΓΛΩΣΣΑ C. Μάθηµα 7: Πίνακες. ηµήτρης Ψούνης

Transcript:

ΠΙ Ν Α Κ Ε Σ (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 Δείκτες #define N 20 int vathmos [N], *dktis; dktis = vathmos dktis = &vathmos[0];

Χωρίς τη χρήση δεικτών athroisma = 0; for ( i=0; i<n; i++) athroisma += vathmos[i]; Με τη χρήση δεικτών athroisma = 0; for ( i=0; i<n; i++) athroisma += *(vathmos +i); int vathmos[]; int *vathmos;

Το πέρασμα των πινάκων στις συναρτήσεις γίνεται μόνο με αναφορά. Παράδειγμα Να γραφεί μία συνάρτηση που να υπολογίζει το μέσο όρο των τιμών των στοιχείων του πίνακα. 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 ); }

Δυναμικές μεταβλητές και Δυναμικοί πίνακες Δυναμικές μεταβλητές : Μεταβλητές που δημιουργούνται κατά τη διάρκεια εκτέλεσης του προγράμματος και καταστρέφονται όταν δεν χρειάζονται.

int *dktis; dktis? dktis = malloc(sizeof(int)); dktis *dktis? *dktis = 10; free(dktis); dktis = NULL; dktis dktis Μη έγκυρη διεύθυνση dktis NULL *dktis 10

Δυναμικοί Πίνακες int *a; a = malloc(megethos * sizeof(int)); a???????? a[0] a[1] a[2].a[megethos-1] Αποδέσμευση free( a ); a = NULL;

Η μέθοδος της φυσαλίδας (bubble sort) Πρόβλημα Γράψτε μία function που να ταξινομεί σε αύξουσα σειρά τους ακέραιους αριθμούς μ i, i = 1(1) n με τη μέθοδο της φυσαλίδας. Τέλος 1 ης φάσης Τέλος 2 ης φάσης Τέλος 3 ης φάσης 4 η φάση m[0] 60 42 42 42 42 25 25 m[1] 42 60 60 60 25 42 42 m[2] 83 83 25 25 60 60 60 m[3] 25 25 83 75 75 75 75 m[4] 75 75 75 83 83 83 83

void andallagi(int *p, int *q) int pros; pros = *p; *p = *q; *q = pros; }

void fysalida(int m[], int n) } while (taxinomisi == o ); } 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; /*ελαττώνεται κατά ένα ο πίνακας*/

#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; }

Η μέθοδος της επιλογής (selection sort) Πρόβλημα Γράψτε μία function που να ταξινομεί σε φθίνουσα σειρά τους ακεραίους αριθμούς μ i, i = 1(1) n με τη μέθοδο της επιλογής (selection sort). 1 η 2 η 3 η 4 η m[0] 60 83 83 83 83 m[1] 42 42 75 75 45 m[2] 83 60 60 60 60 m[3] 25 25 25 25 42 m[4] 75 75 42 42 25

void epilogi(int m[], int n) /* n είναι το μέγεθος του m[] */ int i, j, meg; for ( i=0; i<n-1; i++) meg = i; for ( j= i; j<n; j++) if ( m[j] > m[meg]) meg =j; andallagi( &m[i], &m[meg]); } } ( 2 O n ) συγκρίσεις

void andallagi(int *p, int*q) int pros; pros = *p; *p = *q; *q = pros; }

#include <stdio.h> #define N 200 void andallagi(int *p, *int *q); void epilogi(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]); epilogi(pinakas, N); /* κλήση της epilogi */

printf( \nοι ταξινομημένοι αριθμοί είναι : ); for (i=0; i <N; ++i) printf( \n%d, pinakas[i]); return 0; }

Μέθοδος της Γρήγορης Ταξινόμησης (quicksort) οδηγό στοιχείο = το πρώτο (4) 4 3 1 9 2 6 5 p q 4 3 1 9 2 6 5 p q 4 3 1 9 2 6 5 p q

4 3 1 9 2 6 5 p q 4 3 1 9 2 6 5 p q 4 3 1 9 2 6 5 p q 4 3 1 2 9 6 5 (εναλλαγή) p q

4 3 1 2 9 6 5 p q [2 3 1] 4 [9 6 5] τελική θέση του οδηγού [2 3 1] 4 [9 6 5] [1] 2 [3] 4 [5 6] 9 1 2 3 4 5 [6] 9 1 2 3 4 5 6 9

void grigori_tax (int a[ ], int arxi, int telos) /* H γρήγορη ταξινόμηση ταξινομεί σε αύξουσα σειρά τα στοιχεία του a[ ] */ int p, q, odigo; if (arxi < telos ) /* αν ο πίνακας περιέχει λιγότερα από δύο στοιχεία (arxi >= telos) τότε σταμάτησε (κατάσταση διακοπής) */ p= arxi; q = telos; odigo = a[arxi];

/*επανάλαβε την ακόλουθη διαδικασία μέχρις ότου p>= q */ while (p < q) /* μετακίνηση του δείκτη q */ while ( a[q] > odigo ) --q; /* μετακίνηση του δείκτη p*/ while ( a[p ] <= odigo && p < q) ++p; if (p < q) andallagi (&a[p], &a[q]); }/* τέλος του while */

/* Επειδή p=q,απαιτείται ανταλλαγή του οδηγού στοιχείου με αυτό που δείχνουν οι p και q */ } } andallagi (&a[arxi], &a[q]); grigori_tax (a, arxi, q-1); grigori_tax (a, q+1, telos); O(nlogn) συγκρίσεις

#include <stdio.h> #define N_1 200 void andallagi(int *p, *int *q); void grigori_tax(int m[], int arxi, int telos); int main(void) int i, N, pinakas[n_1]; printf( \nεισάγετε το πλήθος των αριθμών : ); scanf( %d, N); printf( \nεισάγετε %d ακέραιους αριθμούς, N);

for (i=0; i <N; ++i) scanf( %d, &pinakas[i]); grigori_tax(pinakas, 0, N-1); /* κλήση της grigori_tax */ printf( \nοι ταξινομημένοι αριθμοί είναι : ); for (i=0; i <N; ++i) printf( \n%d, pinakas[i]); return 0; }

ΔΗΜΙΟΥΡΓΙΑ ΒΙΒΛΙΟΘΗΚΗΣ ΤΑΞΙΝΟΜΗΣΗΣ Το αρχείο taxi.h void fysalida(int m[], int n); void andallagi (int *p, int *q); void epilogi(int m[], int n); void grigori_tax(int a[], int arxi, int telos); Το αρχείο taxi.c #include "taxi.h" Κώδικας των συναρτήσεων που περιέχονται στο αρχείο taxi.h #include <stdio.h> #include taxi.c int main(void)

Πρόβλημα ΣΥΓΧΩΝΕΥΣΗ Γράψτε ένα υποπρόγραμμα που να δέχεται σαν είσοδο δύο πίνακες ταξινομημένους σε αύξουσα (φθίνουσα) σειρά και να τους συγχωνεύει σε ένα τρίτο ταξινομημένο πίνακα. Τυχαίο βήμα i a b k j c

Σύγκριση a[i] με b[j] και τοποθέτηση του μικρότερου στο c[k]. if a[i] < b[j] c[k] = a[i]; ++ i; ++ k; } else /* b[j] <= a[i] */ c[k] = b[j]; ++ j; ++ k; }

Στην περίπτωση που έχουν τελειώσει τα στοιχεία του a[ ], τότε αντιγράφονται τα υπόλοιπα στοιχεία του b[ ] στον c[ ]. a b αντιγραφή c Στην περίπτωση που έχουν τελειώσει τα στοιχεία του b[ ], τότε αντιγράφονται τα υπόλοιπα στοιχεία του a[ ] στον c[ ].

void syghonefsi (int a[ ], int b[ ], int c[ ], int n, int m) /* Συγχωνεύει τους ταξινομημένους πίνακες a[i] και b[j] σε ένα ταξινομημένο πίνακα c[k] */ int i, j, k; i = 0; /* δείκτης για τον a[ ] */ j = 0; /* δείκτης για τον b[ ] */ k = 0; /* δείκτης για τον c[ ] */ /* Όσο υπάρχουν στοιχεία στους πίνακες a[i] και b[j] να τοποθετούνται στον πίνακα c[k] σε αύξουσα σειρά */

while (i < n && j < m) if (a[i] < b[j]) c[k] = a[i]; ++ i; ++ k; } else c[k] = b[j]; ++ j; ++ k; }

/* Στην περίπτωση που τελειώσουν πρώτα τα στοιχεία του πίνακα a[ ], αντιγράφονται τα υπόλοιπα στοιχεία του b[ ] στον πίνακα c[ ] */ while (j < m) c[k] = b[j]; ++ j; ++ k; }

/* Στην περίπτωση που τελειώσουν πρώτα τα στοιχεία του πίνακα b[ ], αντιγράφονται τα υπόλοιπα στοιχεία του a[ ] στον πίνακα c[ ] */ while (i < n) c[k] = a[i]; ++ i; ++ k; }

#include <stdio.h> #define N1 200 int main(void) int i, N, M, pin1[n1], pin2[n1], neos_pin[n1]; printf( \nεισάγετε το πλήθος των στοιχείων του 1ου πίνακα ); scanf( %d, &N); printf( \nεισάγετε τα στοιχεία του 1ου πίνακα ); for (i=0; i<n; ++i) scanf( %d, &pin1[i]);

printf( \nεισάγετε το πλήθος των στοιχείων του 2ου πίνακα ); scanf( %d, &M); printf( \nεισάγετε τα στοιχεία του 2ου πίνακα ); for (i=0; i<m; ++i) scanf( %d, &pin2[i]); /* Δημιουργία του νέου συγχωνευμένου πίνακα */ if (N+M <= N1) syghonefsi(pin1, pin2, neos_pin, N, M); else printf( \nδεν είναι δυνατή η συγχώνευση );

printf( \nο συγχωνευμένος πίνακας είναι ο εξής : ); for (i=0; i< N+M; ++i) printf( \n%d, neos_pin[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]) /*δεν υπάρχει το κλειδί στη λίστα */ break; else if (kleidi = = pinakas [i]) *deiktis = i; *vrethike = 1; break; }

Δυαδική Αναζήτηση (Binary Search) Παράδειγμα Αναζήτηση του 18 0 1 2 3 4 5 6 7 8 9 2 3 5 7 8 [11 15 17 18 19] 11 15 17 [18 19] 18 19

Μη αναδρομική Συνάρτηση /* Εντοπίζει τη θέση του κλειδιού αναζήτησης σε ένα ταξινομημένο πίνακα με τη μέθοδο της δυαδικής αναζήτησης. */ void dyadiki_anazitisi_1 (int kleidi, int pinakas [ ], int megethos, int arxi, telos, mesaio; *vrethike = 0; arxi = 0; telos = megethos-1; int *deiktis, int *vrethike) while ( arxi <= telos &&!*vrethike )

mesaio = (arxi + telos) / 2; if (kleidi = = pinakas [mesaio]) *deiktis = mesaio; *vrethike = 1; /* βρέθηκε το στοιχείο */ } } } else /* δεν βρέθηκε */ if (kleidi < pinakas [mesaio]) telos = mesaio-1; else /* kleidi >= pinakas[mesaio] */ arxi = mesaio+1;

Aναδρομική Συνάρτηση /* Εντοπίζει τη θέση του κλειδιού αναζήτησης στον πίνακα με τη μέθοδο της δυαδικής αναζήτησης */ void dyadiki_anazitisi_2 (int kleidi, int pinakas [ ], int arxi, int mesaio; *vrethike = 0; if (arxi <= telos &&!*vrethike) mesaio = (arxi + telos) / 2; int telos, int *deiktis, int *vrethike)

if (kleidi = = pinakas [mesaio]) *deiktis = mesaio; *vrethike = 1; } else if (kleidi < pinakas [mesaio]) dyadiki_anazitisi_2 (kleidi, pinakas, arxi, mesaio-1, deiktis, vrethike); else dyadiki_anazitisi_2 (kleidi, pinakas, mesaio+1, telos, deiktis, vrethike); } }

Δυναμικοί Πίνακες void analysi_vathmon (int megethos, int *megisti, int *elaxisti, int *mesi_timi) int *vathmos; int plithos, mertritis, athroisma; plithos = 0; /* Δημιουργία δυναμικού πίνακα */ vathmos = malloc (megethos *sizeof(int)); printf ( \n Εισάγετε το πλήθος των βαθμών: ); scanf ( %d, plithos); printf ( \n Εισάγετε %d βαθμούς:, plithos);

for (i = 0; i < plithos; i++) scanf ( %d, &vathmos [i]); *megisti = vathmos [0]; *elaxisti = vathmos [0]; athroisma = 0; metritis = 1; while (metritis < plithos) /* Βρίσκει τη μέγιστη τιμή */ if (*megisti < vathmos[metritis]) *megisti = vathmos[metritis];

/* Βρίσκει την ελάχιστη τιμή */ if (*elaxisti > vathmos[metritis]) *elaxisti = vathmos[metritis]; /* Υπολογίζει το άθροισμα */ athroisma += vathmos[metritis]; metritis++; } /* Τέλος του while */ free (vathmos); /* αποδέσμευση της μνήμης */ vathmos = NULL; /* συνιστάται */ *mesi_timi = athroisma/metritis; } /* Τέλος της analysi_vathmon */

Πρόβλημα Να γραφεί ένα πρόγραμμα, το οποίο 1. Να δημιουργεί ένα πίνακα ακέραιων αριθμών, οι οποίοι δίνονται από το πληκτρολόγιο. 2. Να ταξινομεί τους αριθμούς αυτούς με τη χρήση της μεθόδου ταξινόμησης φυσαλίδα και 3. Να αναζητά ένα δεδομένο αριθμό με τη μέθοδο της δυαδικής αναζήτησης

Πρόγραμμα #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 Ταξινομημένος πίνακας ); for (i = 0; i < megethos; ++i) 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++) 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 */

Δισδιάστατοι Πίνακες και Δείκτες int a[3][2] = 75,80}, 78,95}, 65,57}} Οι Συμβολοσειρές char symvoloseira [10]; char symvoloseira [15] = Kalimera ; symvoloseira K a 1 i m e r a \0?????? 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

char *symboloseira; char *symvoloseira = Kalimera ; *symboloseira = Kalimera ; symvoloseira K a 1 i m e r a \0 0 1 2 3 4 5 6 7 8 char symboloseira [ ] = a ; a \0 0 1

Εκτύπωση μιας μεταβλητής συμβολοσειρά printf ( %s, symvoloseira) puts (symvoloseira); sprintf (symvoloseira1, %s, symvoloseira2); Διάβασμα μιας μεταβλητής συμβολοσειρά scanf char symvoloseira [15]; scanf ( %s, symvoloseira);

G e i a \0?????????? 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 char symvoloseira [15]; scanf ( %10s, symboloseira); P r 0 g r a m m a t \0???? 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

gets gets (συμβολοσειρά); char symvoloseira [15]; gets (symboloseira); G e i a s a s! \0??? 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Παράδειγμα Τα αποτελέσματα των char symvoloseira1 [15], symvoloseira2 [15]; gets (symvoloseira); sscanf (symvoloseira1, %s, symvoloseira2); Είναι η symvoloseira1 και symvoloseira2 να περιέχουν την ίδια συμβολοσειρά εισόδου Πέρασμα των Συμβολοσειρών στις Συναρτήσεις void diavase_seira (char symvoloseira [ ]) void diavase_seira (grammi);

Συναρτήσεις που επιστρέφουν μία ακέραια τιμή strcmp (s1, s2) strncmp (s1, s2, n) strlen (s) strchr (s1, c) Συναρτήσεις που επιστρέφουν μία συμβολοσειρά strcat (s1, s2) strncat (s1, s2, n) strcpy (s1, s2) strncpy (s1, s2, n) strstr (s1, s2)

Ηχρήση του typedef typedef τύπος λίστα-τύπων ; typedef int typos_stoixeiou; typos_stoixeiou dianysma[n]; Αν ο τύπος των δεδομένων αλλάξει από int σε double, τότε typedef double typos_stoixeiou ; Ορισμός δισδιάστατου πίνακα 1ος τρόπος #define N 100 typedef int typos_stoixeiou; typedef typos_stoixeiou dianysma[n]; typedef typos_stoixeiou dianysma[n][n];

dianysma v1, v2, v3 ; pinakas a, b, c ; Οι ανωτέρω δηλώσεις είναι ισοδύναμες με τις ακόλουθες : 2ος τρόπος int v1[n], v2[n], v3[n] ; int a[n][n], b[n][n], c[n][n] ; 3ος τρόπος ( οικοδόμηση σύνθετου τύπου ) #define n 100 typedef int typos_stoixeiou ; typedef typos_stoixeiou dianysma[n]; typedef dianysma dianysma[n];

Δημιουργία Τυχαίων αριθμών Παράδειγμα Nα γραφεί ένα πρόγραμμα το οποίο να υπολογίζει και τυπώνει το αποτέλεσμα 20 ρίψεων ενός ζαριού. Πρόγραμμα

#include <stdio.h> #include <stdlib.h> int main(void) int i; for (i = 1; i <= 20; ++i) printf( %d, (1+rand( )%6)); if (i%5 = = 0) printf( \n ); } return 0; }

Παράδειγμα Nα τροποποιηθεί το πρόγραμμα του προηγούμενου παραδείγματος προκειμένου να παράγει πραγματικά τυχαίους ακέραιους αριθμούς μεταξύ του 1 και του 6 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) int i; unsigned int tyxaios; Πρόγραμμα

} tyxaios = time(0); /* ή time(null) */ srand(tyxaios); for (i = 1; i <= 20; ++i) printf( %d, (1+rand( )%6)); if (i%5 = = 0) printf( \n ); } return 0;