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

Σχετικά έγγραφα
Γλώσσα Προγραμματισμού C. Προγραμματισμός HY: Γλώσσα Προγραμματισμού C. Γρήγορος Πίνακας Αναφοράς Σύνταξης. Εισήγηση #4. Επαναληπτικές δομές:

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

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

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

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

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

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

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

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

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

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

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

Πίνακες. Οι πίνακες αποτελούν ένα σηµαντικό δοµηµένο τύπο δεδοµένων (structured data type) ή πιο απλά µία δοµή δεδοµένων (data structure).

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

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

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

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

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

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

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

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

Κεφάλαιο Πίνακες Ι. (Διάλεξη 16)

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

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

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

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

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

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

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

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

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

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

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

Ηλεκτρονικοί Υπολογιστές

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

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

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

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

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

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

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

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

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

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

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

Υπολογισμός - Εντολές Ελέγχου

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

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

Κεφάλαιο 8.6. Πίνακες ΙI (Διάλεξη 17)

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7) Είσοδος/ Έξοδος

Υπολογισμός - Εντολές Επανάληψης

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

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7)

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

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

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

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

Προγραμματισμός Μεθόδων Επίλυσης Προβλημάτων. 14. Πίνακες Ι. Ιωάννης Κατάκης. ΕΠΛ 032: Προγραμματισμός Μεθόδων Επίλυσης Προβλημάτων

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

Βαθμός Σχόλια. lab PASS 1194 PASS 1238 PASS 1239 PASS

scanf() scanf() stdin scanf() printf() int float double %lf float

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΑΣΚΗΣΗ #5 Προτεινόμενη Λύση

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

Κεφάλαιο 2.6: Είσοδος / Έξοδος εδοµένων, Μορφοποίηση εδοµένων Εξόδου. ( ιάλεξη 7) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

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

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

Κεφάλαιο Πίνακες Ι. ( ιάλεξη 15) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Εργαστήριο 2: Πίνακες

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

Κεφάλαιο 8.6. Πίνακες ΙI ( ιάλεξη 16) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

2.1. Εντολές Σχόλια Τύποι Δεδομένων

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

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

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

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

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

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

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

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

Οι εντολές ελέγχου της ροής ενός προγράμματος.

Τύποι Δεδομένων Είσοδος/Έξοδος

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

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

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

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

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

Sheet2 Α.Μ FAIL. οριακό PASS. - Έπρεπε να χρησιµοποιήσετε συναρτήσεις από τη string.h

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

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Ενότητα 3: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

C: Από τη Θεωρία στην Εφαρμογή

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

2ο σετ σημειώσεων. 1 Εντολές εκτέλεσης υπό συνθήκη. 19 Μαρτίου 2012

Transcript:

Προγραμματισμός HY: Γλώσσα Προγραμματισμού C Δρ. Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας Email: savvas@teilar.gr URL: http://teilar.academia.edu/iliassavvas Γρήγορος Πίνακας Αναφοράς Σύνταξης if- switch Σύνταξη if (λογική έκφραση) πρόταση (εις) (λογική έκφραση =ΑΛΗΘΗΣ); πρόταση (εις) (λογική έκφραση =ΨΕΥΔΗΣ); switch (τιμή ελέγχου) case τιμή 1: πρόταση (εις); case τιμή 2: πρόταση (εις); default : πρόταση (εις); Παραδείγματα if (a>b) c=(a+b); printf( \n c = %d, c); printf ( \nκαμία ενέργεια ); switch (traffic_light) case Κ : case κ : printf( \nκοκκινο---σταματήστε ); case Π : case π : printf( \nπρασινο---περάστε ); Ηλίας Κ. Σάββας Εισήγηση #5 2 Γρήγορος Πίνακας Αναφοράς Σύνταξης Σύνταξη while while (έκφραση ελέγχου) προτάσεις; do while do προτάσεις; while (έκφραση ελέγχου); for for (Αρχική έκφραση; Έκφραση συνέχισης; Έκφραση μεταβολής) προτάσεις; Παραδείγματα int i = 1; while (i<100) s = i * i; printf( %d %d, i, s); i++; int i = 1; do s = i * i; printf( %d %d, i, s); i++; while (i<100; int i ; for (i=1; i<100; i++) s = i * i; printf( %d %d, i, s); Ηλίας Κ. Σάββας Εισήγηση #5 3 1

Γλώσσα Προγραμματισμού C Εισήγηση #5 Μονοδιάστατοι Πίνακες, Διαχείριση Συμβολοσειρών (strings). Ηλίας Κ. Σάββας Εισήγηση #5 4 Άσκηση Γράψτε ένα πρόγραμμα που αφού εισάγει τις ηλικίες 10 ατόμων, να υπολογίζει και εκτυπώνει το μέσο όρο τους. int age1, age2, age3, age4, age5, age6, age7, age8, age9, age10; int total; float average; printf( \nδώστε τις ηλικίες 10 ατόμων\n ); scanf( %d, &age1); scanf( %d, &age2);.. scanf( %d, &age10); total = age1+age2+age3+age4+age5+age6+age7+age8+age9+age10; average = (float) total / 10; Δέκα άτομα εντάξει Αν είχαμε όμως 100 η και περισσότερα??? printf( \nο μέσος όρος είναι %.2f\n\n, average); Ηλίας Κ. Σάββας Εισήγηση #5 5 Λύση: Χρήση ΠΙΝΑΚΩΝ (ARRAYS) Πίνακας: Ένα συγκεκριμένο σύνολο τιμών του ιδίου τύπου δεδομένων (int, ή float, ή char, ). Όλες οι τιμές αποθηκεύονται μαζί στην μνήμη του υπολογιστή με ένα κοινό όνομα, δηλ. του ονόματος του πίνακα! Πίνακας 10 ακεραίων: Ages[10] 17 23 12 52 19 42 31 37 46 62 0 1 2 3 4 5 6 7 8 9 Δείκτες Η θέση ενός στοιχείου στον πίνακα ονομάζεται δείκτης του στοιχείου αυτού. Ο δείκτης του πρώτου στοιχείου έχει την τιμή 0. Η αναφορά σε κάθε στοιχείο γίνεται με το όνομα του πίνακα και τον δείκτη που το αντιστοιχεί μέσα σε αγκύλες, π.χ. Ages[4]19 Ηλίας Κ. Σάββας Εισήγηση #5 6 2

Πρόγραμμα (βελτιωμένο) #define N 10 /* Το μέγεθος του πίνακα */ int Ages[N], i, total=0; float average; printf("\n\nεισαγωγή %d ηλικιών από %d άτομα\n, N, N); for (i=0; i<n; i++) printf("%2d : ", i+1); scanf("%d", &Ages[i]); total += Ages[i]; average = (float) total / N; printf("\n\nο μέσος όρος είναι %.2f\n\n", average); Καλή προγραμματιστική τακτική: Χρησιμοποιούμε #define για να ορίσουμε το πλήθος των στοιχείων ενός πίνακα. Ηλίας Κ. Σάββας Εισήγηση #5 7 Χρησιμοποιώντας Πίνακες Δήλωση ενός πίνακα: Τύπος_Δεδομένων Όνομα_Μεταβλητής[Πλήθος_Στοιχείων]; int Ages[10]; float x[100]; char Epitheta[20], Onomata[10]; Αρχικές τιμές σε πίνακα: Τύπος_Δεδομένων Όνομα_Μεταβλητής[Πλήθος_Στοιχείων]=τιμές διαχωρισμένες με κόμματα; int Ages[5]=12,52,34,19,22; float X[] = 2.2, 4.12, 3.1; float X[4] = 2.2, 4.12, 3.1; Ηλίας Κ. Σάββας Εισήγηση #5 8 Πίνακες και ο Βρόγχος του for /* Εισαγωγή Στοιχείων Πίανκα */ for (i=0; i<n; I++) printf( \nδώσε το %d στοιχείο:, i+1); scanf( %d, &a[i]); Γιατί i+1??? Για να δημιουργούμε την ψευδαίσθηση του πίνακα όπως τον ξέρουμε από τα μαθηματικά! /* Εμφάνιση Στοιχείων Πίνακα */ for (i=0; i<n; I++) a[n] printf( \n το %d στοιχείο είναι %d:, i+1, a[i]); Ηλίας Κ. Σάββας Εισήγηση #5 9 3

Άσκηση: μέγιστη τιμή πίνακα #define N 10 int a[n], i, pos; printf("\n\nεισαγωγή 10 ακεραίων\n"); for (i=0; i<n; i++) printf("%2d : ", i+1); scanf("%d", &a[i]); pos = 0; for (i=1; i<n; i++) if (a[pos] < a[i]) pos = i; printf("\n\nη μέγιστη τιμή είναι %d και βρέθηκε στη θέση %d\n\n", a[pos],pos+1); ΣΗΜΑΝΤΙΚΗ τεχνική! Υποθέτουμε ότι το πρώτο στοιχείο του πίνακα είναι αυτό με την μεγαλύτερη τιμή και μετά συγκρίνουμε όλα τα υπόλοιπα στοιχεία με το υποθετικό μέγιστο. Κάθε φορά που εμφανίζεται ένα μεγαλύτερο στοιχείο αποδίδουμε την τιμή του δείκτη του στην τιμή του δείκτη του υποθετικά μεγαλύτερου στοιχείου. Στο τέλος: έχουμε το πραγματικό Ηλίας Κ. Σάββας Εισήγηση #5 10 μέγιστο! Άσκηση: ελάχιστη τιμή πίνακα #define N 10 int a[n], i, pos; printf("\n\n Εισαγωγή 10 ακεραίων \n"); for (i=0; i<n; i++) printf("%2d : ", i+1); scanf("%d", &a[i]); pos = 0; for (i=1; i<n; i++) if (a[pos] > a[i]) pos = i; printf("\n\n Η ελάχιστη τιμή είναι %d και βρέθηκε στη θέση %d\n\n", a[pos],pos+1); Ηλίας Κ. Σάββας Εισήγηση #5 11 Άσκηση Γράψτε ένα πρόγραμμα το οποίο να διαβάζει 15 αριθμούς και να τους εμφανίζει ως εξής: (a) Κάθε αριθμός σε διαφορετική γραμμή, (b) Όλους στην ίδια γραμμή αλλά να διαχωρίζονται με κόμματα και ένα κενό διάστημα, (c) Ότι και στο (b) αλλά με την ανάποδη φορά που εισήχθησαν. Ηλίας Κ. Σάββας Εισήγηση #5 12 4

Άσκηση #define N 15 int a[n], i; printf("\n\nεισαγωγή 15 ακεραίων\n"); for (i=0; i<n; i++) printf("%2d : ", i+1); scanf("%d", &a[i]); /* (a) */ for (i=0; i<n; i++) printf("\n%d", a[i]); printf("\n\n"); /* (b) */ for (i=0; i<n; i++) printf("%d, ", a[i]); printf("\n\n"); /* (c) */ for (i=n-1; i>=0; i--) printf("%d, ", a[i]); printf("\n\n"); Ηλίας Κ. Σάββας Εισήγηση #5 13 Ταξινόμηση Πίνακα (μέθοδος επιλογής) Γράψτε ένα πρόγραμμα το οποίο να εισάγει N τιμές σε ένα πίνακα. Το πρόγραμμα στην συνέχεια να επαναλαμβάνει N-1 φορές την ακόλουθη διαδικασία (πέρασμα): 1) να επιλέγει την ελάχιστη τιμή σε κάθε πέρασμα. 2) σε κάθε πέρασμα, το στοιχείο με την ελάχιστη τιμή να αντιμετατίθεται με την τιμή του πίνακα που έχει δείκτη όσο και το εκάστοτε «πέρασμα». Στο τέλος ο πίνακας θα είναι ταξινομημένος (αύξουσα διάταξη). Ηλίας Κ. Σάββας Εισήγηση #5 14 Μέθοδος Επιλογής (Selection Sort): Παράδειγμα 37 23 12 52 19 42 31 37 46 62 Πέρασμα 0 12 23 37 52 19 42 31 37 46 62 Αντιμετάθεση 12 23 37 52 19 42 31 37 46 62 Πέρασμα 1 17 19 37 52 23 42 31 37 46 62 Αντιμετάθεση ---------------------------------------------------------------------------------- 17 19 23 31 37 37 42 46 62 56 Πέρασμα N-1 17 19 37 31 37 37 42 46 56 62 Αντιμετάθεση Ηλίας Κ. Σάββας Εισήγηση #5 15 5

Μέθοδος Επιλογής (Selection Sort) #define N 10 int a[n], i, j, pos, temp; printf("\n\nεισαγωγή %d τιμών\n", N); for (i=0; i<n; i++) printf("%2d : ", i+1); scanf("%d", &a[i]); /* Selection Sort */ for (i=0; i<n-1; i++) pos = i; for (j=i+1; j<n; j++) if (a[pos] > a[j]) pos = j; /* swap */ temp = a[pos]; a[pos] = a[i]; a[i] = temp; printf("\n\nταξινομημενοσ\n\n"); for (i=0; i<n; i++) printf("%d ", a[i]); printf("\n\n"); Ηλίας Κ. Σάββας Εισήγηση #5 16 Φθίνουσα Διάταξη (Selection Sort) #define N 10 int a[n], i, j, pos, temp; printf("\n\nεισαγωγή %d τιμών\n", N); for (i=0; i<n; i++) printf("%2d : ", i+1); scanf("%d", &a[i]); /* Selection Sort */ for (i=0; i<n-1; i++) pos = i; for (j=i+1; j<n; j++) if (a[pos] < a[j]) pos = j; /* swap */ temp = a[pos]; a[pos] = a[i]; a[i] = temp; printf("\n\nταξινομημενοσ\n\n"); for (i=0; i<n; i++) printf("%d ", a[i]); printf("\n\n"); Ηλίας Κ. Σάββας Εισήγηση #5 17 Ταξινομήσεις Εκτός από την μέθοδο της επιλογής υπάρχουν και άλλες απλές (και αργές όμως) μέθοδοι ταξινόμησης: Φυσαλίδα (bubble sort), Εισαγωγή (insertion sort), Γράψτε 2 αλγόριθμους και προγράμματα για 2 ακόμη μεθόδους. Στείλτε τα με email: savvas@teilar.gr με θέμα: Sorting Αλλά υπάρχουν και όχι τόσο απλές μέθοδοι αλλά πολύ γρήγορες (quick sort, merge sort, ). Αλλά θα τις δούμε στο επόμενο εξάμηνο Δομές Δεδομένων και Αρχεία! Ηλίας Κ. Σάββας Εισήγηση #5 18 6

Αναζήτηση σε Πίνακα ΣΕΙΡΙΑΚΗ αναζήτηση: (απλή αλλά αργή) Ξεκινάει με το πρώτο στοιχείο του πίνακα και το συγκρίνει με την υπό αναζήτηση τιμή. Εάν ταιριάζουν, επιστρέφει τον δείκτη του στοιχείου. Εάν ΔΕΝ ταιριάζουν, προχωράει στην επόμενη θέση του πίνακα και επαναλαμβάνει τον έλεγχο. Η διαδικασία συνεχίζει μέχρι να βρεθεί το στοιχείο ή να τελειώσουν όλα τα στοιχεία του πίνακα. Εάν δεν βρεθεί το υπό αναζήτηση στοιχείο, τότε είναι καλή πρακτική να επιστραφεί η τιμή -1 για να δείξει ότι τελείωσαν τα στοιχεία του πίνακα χωρίς να βρεθεί το υπό αναζήτηση (γιατί -1?). Ηλίας Κ. Σάββας Εισήγηση #5 19 Σειριακή Αναζήτηση: Version 1 #define N 10 int a[n] = 50,10,100,30,20,70,40,80,60,90; int x, i, pos=-1; printf("\nεισαγωγή του υπό αναζήτηση αριθμού: "); scanf("%d", &x); /* Σειριακή αναζήτηση */ for (i=0; i<n; i++) if (x == a[i]) pos = i; if (pos!= -1) printf("\n\nβρέθηκε στη θέση %d!\n\n", pos+1); printf("\n\nδεν βρέθηκε!\n\n"); Ναι, αλλά εάν το x είναι το πρώτο στοιχείο του πίνακα? Ο βρόγχος θα επαναληφθεί έτσι και αλλιώς Ν φορές! Χάσιμο πολύτιμου υπολογιστικού χρόνου!!! Ηλίας Κ. Σάββας Εισήγηση #5 20 Σειριακή Αναζήτηση: Version 2 #define N 10 int a[n] = 50,10,100,30,20,70,40,80,60,90; int x, i, pos=-1; printf("\n Εισαγωγή του υπό αναζήτηση αριθμού : "); scanf("%d", &x); /* Sequential Search */ i=0; while (i<n && pos==-1) if (x == a[i]) pos = i; i++; if (pos!= -1) printf("\n\n Βρέθηκε στη θέση %d!\n\n", pos+1); printf("\n\nδεν βρέθηκε!\n\n"); Λύση: while αντί για for Ηλίας Κ. Σάββας Εισήγηση #5 21 7

Σειριακή Αναζήτηση (ταξινομημένος πίνακας): Version 3 #define N 10 int a[n] = 10,20,30,40,50,60,70,80,90,100; int x, i, pos=-1; printf("\n Εισαγωγή του υπό αναζήτηση αριθμού : "); scanf("%d", &x); /* Sequential Search (sorted array */ i=0; while (i<n && pos==-1 && x>=a[i]) if (x == a[i]) pos = i; i++; if (pos!= -1) printf("\n\n Βρέθηκε στη θέση %d!\n\n", pos+1); printf("\n\nδεν βρέθηκε!\n\n"); Εάν το x<=a[current] τότε δεν υπάρχει λόγος να συνεχίζουμε να ψάχνουμε!!! Γιατί? Ηλίας Κ. Σάββας Εισήγηση #5 22 Αναζητήσεις Εκτός από την σειριακή αναζήτηση η οποία είναι σχετικά αργή Δυαδική αναζήτηση (πολύ γρήγορη, ίσως η ταχύτερη) αλλά και αυτή θα την δούμε στο επόμενο εξάμηνο Δομές Δεδομένων και Αρχεία! Ηλίας Κ. Σάββας Εισήγηση #5 23 Συμβολοσειρές (strings) Κάθε ακολουθία χαρακτήρων μέσα σε διπλά εισαγωγικά: Παραδείγματα: John, Ηλίας Σάββας, Hello!!!, Κούμα 12, Λάρισα,... Οι χαρακτήρες της συμβολοσειράς αποθηκεύονται σε συνεχείς θέσεις στην μνήμη, Οι συμβολοσειρές τερματίζονται από τον χαρακτήρα null \0 (προσοχή: πρέπει πάντα να αφήνουμε χώρο για αυτόν τον χαρακτήρα). Μορφοποίηση συμβολοσειρών: %s Ηλίας Κ. Σάββας Εισήγηση #5 24 8

Αρχικοποίηση Συμβολοσειρών char s[] = a, b, c, \0 ); ή char s[] = abc το μέγεθος της s είναι: 3 Εκτύπωση συμβολοσειράς: for (i=0; i<3; i++) printf( %c, s[i]); abc printf( %s, s); abc Ηλίας Κ. Σάββας Εισήγηση #5 25 Παραδείγματα char Address[20] = 12 Hyde Road Str. Διευθύνσεις= 1 2 H y d e R o a d S t r. \0... Δείκτες 0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 0 1 2 3 4 5 6 7 prinf( %s, Address) 12 Hyde Road Str. printf( %c, Address[4]) y printf( %c, Address[16]). printf( %c, Address[17]) y printf( %c, Address[18])? 1 1 8 9 Ηλίας Κ. Σάββας Εισήγηση #5 26 Εκτυπώνοντας μία Συμβολοσειρά Χαρακτήρα προς Χαρακτήρα Είναι σωστό? for (i=0; i<20; i++) 12 Hyde Road Str. ` printf( %c, Address[i]); Γιατί? Αυτό είναι το σωστό: /* Το πραγματικό μέγεθος */ length = 0; while (Address[length]!= \0 ) length++; i = 0; while (i < length) printf( %c, Address[i]); i++; 12 Hyde Road Str. Ηλίας Κ. Σάββας Εισήγηση #5 27 9

Input / Output Input: scanf( %s, string); gets(string) Output: printf( %s, string); puts(string) Ηλίας Κ. Σάββας Εισήγηση #5 28 Τι ΔΕΝ Μπορούμε να Κάνουμε με τις Συμβολοσειρές char s1[10]= abc, s2[10]= def ; s3[10]; Συνήθη προγραμματιστικά λάθη: s3 = s1; if (s1 == s3) while (s1>s3) ΔΕΝ επιτρέπεται να συγκρίνουμε άμεσα δύο συμβολοσειρές όπως συμβαίνει με άλλους τύπους δεδομένων (integers, floats, chars, ) Ηλίας Κ. Σάββας Εισήγηση #5 29 Η Βιβλιοθήκη: <string.h> ακέραιη μεταβλητή = strlen(string);επιστρέφει το μέγεθος της συμβολοσειράς, length = strlen(address); length = 17 strcmp(string1,string2); Συγκρίνει τις s1 and s2. Επιστρέφει 0 εάν s1=s2, -1 εάν s1<s2, και 1 εάν s1>s2 (λεξικογραφική διάταξη), strcpy(string1, string2); Αντιγράφει το s2 στο s1 (s1=s2 για άλλους τύπους δεδομένων) strcat(string1,string2); Συνενώνει τα s1 και s2. Τοποθετεί την τιμη της s2 στην s1 μετά την s1. Προσοχή: η s1 πρέπει να διαθέτει τον απαιτούμενο χώρο) Ηλίας Κ. Σάββας Εισήγηση #5 30 10

Άσκηση: Παλινδρομική Συμβολοσειρά Παλινδρομική είναι μία λέξη, φράση, αριθμός ή και συμβολοσειρά η οποία διαβάζεται με τον ίδιο ακριβώς τρόπο και ανάποδα. abcddcba, αννα, 1234554321, 123454321,.. Δεδομένης μίας συμβολοσειράς, γράψτε ένα πρόγραμμα που να εξετάζει εάν είναι παλινδρομική. Ηλίας Κ. Σάββας Εισήγηση #5 31 Παλινδρομική Συμβολοσειρά - Ανάλυση a b c d e f g h i j j i h g f e d c b a.. 0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 0 1 2 3 4 5 6 7 1 1 8 9 s[0]?? s[19], s[1]?? S[18],, s[9]?? S[10] s[0]?? S[N-1], s[1]?? S[N-2],, s[9]?? S[N-10] s[i]?? s[n-i-1], i: 0 N/2 Ηλίας Κ. Σάββας Εισήγηση #5 32 Παλινδρομική Συμβολοσειρά - Πρόγραμμα #include <string.h> #define N 100 int main () char str[n]; int length, i, flag = 0; printf("\nσυμβολοσειρά : "); scanf("%s", &str); length = strlen(str); for (i=0; i<length/2; i++) if (str[i]!= str[length-i-1]) flag = 1; if (flag == 0) printf("\n\n%s είναι ΠΑΛΙΝΔΡΟΜΙΚΗ\n\n", str); printf("\n\n%s ΔΕΝ είναι ΠΑΛΙΝΔΡΟΜΙΚΗ \n\n", str); Ηλίας Κ. Σάββας Εισήγηση #5 33 11

Βελτιώνοντας το Πρόγραμμα length = strlen(str); for (i=0; i<length/2; i++) if (str[i]!= str[length-i-1]) flag = 1; length = strlen(str); i = 0; while (i<length/2 && flag == 0) if (str[i]!= str[length-i-1]) flag = 1; i++; Ηλίας Κ. Σάββας Εισήγηση #5 34 Εκτύπωση Συμβολοσειράς Ανάποδα char str[n]; ------------- scanf( %s, &str); str abc length = strlen(str); for (i=length-1; i>=0; i--) printf( \n%c, str[i]) c b a length = strlen(str); for (i=length-1; i>=0; i--) printf( %c, str[i]) cba Ηλίας Κ. Σάββας Εισήγηση #5 35 Συνήθη Λάθη Τα διπλά εισαγωγικά χρησιμοποιούνται για συμβολοσειρές ενώ τα μονά για απλούς χαρακτήρες. Όταν χρησιμοποιούμε το scanf για την είσοδο μιας συμβολοσειράς δεν υπάρχει λόγος να χρησιμοποιούμε το σύμβολο της διεύθυνσης &. Ο null (τερματισμός) χαρακτήρας είναι \0, και όχι /0. Για την σύγκριση δύο συμβολοσειρών πρέπει να χρησιμοποιούμε την συνάρτηση strcmp(). Η συνάρτηση strcpy(s1,s2), αντιγράφει το s2 στο s1, και όχι ανάποδα. Ηλίας Κ. Σάββας Εισήγηση #5 36 12

Γρήγορος Πίνακας Αναφοράς Σύνταξης Δήλωση συμβολοσειράς Είσοδος συμβολοσειράς από το πληκτρολόγιο Εκτύπωση συμβολοσειράς Σύνταξη char s[n+1]; N είναι το πλήθος των χαρακτήρων. scanf( %s, string); gets(string); printf( %s, string) puts(string); Παραδείγματα char str[11]; s can gold 10 characters plus the null character \0 scanf( %s, str); gets(str); printf( %s, s); puts(str); Μέγεθος συμβολοσειράς size = strlen(string); length = strlen(str); Σύγκριση συμβολοσειρών strcmp(string1,string2); if (strcpy(str1, str2)>0) printf( %s > %s, str1, str2); Αντιγραφή συμβολοσειράς strcpy(destination, source); srtcpy(str1, str2); str1 str2; Ηλίας Κ. Σάββας Εισήγηση #5 37 Άσκηση Να γραφεί πρόγραμμα το οποίο να μετράει το πλήθος των λέξεων σε μία συμβολοσειρά. Λέξη είναι μία ακολουθία χαρακτήρων (όχι του κενού) : Παράδειγμα: 2 Hyde Road Str. Λέξεις: 4 Ηλίας Κ. Σάββας Εισήγηση #5 38 Μέτρηση Λέξεων #define N 100 char sentence[n]; int word_c = 0, i = 0; int within_a_word = 0; printf("\nεισαγωγή πρότασης: "); gets(sentence); while (i<strlen(sentence)) if (sentence[i]>='a' && sentence[i]<='z') if (within_a_word == 0) within_a_word = 1; word_c ++; within_a_word = 1; within_a_word = 0; i++; printf("\n\nπλήθος Λέξεων: %d\n\n", word_c); Ηλίας Κ. Σάββας Εισήγηση #5 39 13

Πίνακες πάλι! Άσκηση Η μηνιαία ηλιοφάνεια σε κάποια περιοχή είναι ως εξής: 100, 90, 120, 150, 210, 250, 300 310, 280, 230, 160, 120 (από Ιανουάριο μέχρι Δεκέμβριο). Γράψτε ένα πρόγραμμα το οποίο: (a) Να αποθηκεύει τις τιμές ηλιοφάνειας σε ένα πίνακα, (b) Να υπολογίζει και εκτυπώνει την μέση ηλιοφάνεια του έτους, (c) Να υπολογίζει και εκτυπώνει τα ονόματα των μηνών με την μεγαλύτερη και μικρότερη ηλιοφάνεια. Ηλίας Κ. Σάββας Εισήγηση #5 41 Πρόγραμμα #define N 12 int Sun[N]=100,90,120,150,210,250,300,310,280,230,160,120; int i, maxsun=0, minsun=0, total=0; float average; for (i=0; i<n; i++) if (Sun[maxsun]<Sun[i]) maxsun = i; if (Sun[minsun] > Sun[i]) minsun = i; total += Sun[i]; average = (float) total / N; printf("\n\nμέση ετήσια ηλιοφάνεια %.2f", average); Ηλίας Κ. Σάββας Εισήγηση #5 42 14

Πρόγραμμα switch (maxsun) case 0: printf("\n\nο μήνας με την μεγαλύτερη ηλιοφάνεια είναι: Ιαν."); case 1: printf("\n\n Ο μήνας με την μεγαλύτερη ηλιοφάνεια είναι : Φεβ."); case 2: printf("\n\n Ο μήνας με την μεγαλύτερη ηλιοφάνεια είναι : Μαρ."); --------------------------------- case 11: printf("\n\n Ο μήνας με την μεγαλύτερη ηλιοφάνεια είναι : Δεκ,."); switch (minsun) case 0: printf("\n\n Ο μήνας με την μικρότερη ηλιοφάνεια είναι : Ιαν."); case 1: printf("\n\n Ο μήνας με την μικρότερη ηλιοφάνεια είναι : Φεβ."); ------------------------------ case 11: printf("\n\n Ο μήνας με την μικρότερη ηλιοφάνεια είναι : Δεκ."); printf("\n\n"); Ηλίας Κ. Σάββας Εισήγηση #5 43 ΒΕΛΤΙΩΣΗ!!! Πίνακας 2 Διαστάσεων char Months[N][3] = "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec";... printf("\n\n Μέση ετήσια ηλιοφάνεια %.2f", average); printf("\n\n Ο μήνας με την μεγαλύτερη ηλιοφάνεια είναι o: %c%c%c", Months[maxsun][0], Months[maxsun][1],Months[maxsun][2]); printf("\n\n Ο μήνας με την μικρότερη ηλιοφάνεια είναι o: %c%c%c\n\n", Months[minsun][0], Months[minsun][1], Months[minsun][2]); Ηλίας Κ. Σάββας Εισήγηση #5 44 Τέλος της #5 Εισήγησης Ερωτήσεις??? Χρησιμοποιήστε το email εάν θέλετε να με ρωτήσετε οτιδήποτε: savvas@teilar.gr Σημειώσεις Μαθήματος (και όχι μόνο): http://e-class.teilar.gr/ Ηλίας Κ. Σάββας Εισήγηση #5 45 15