ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ. Τεχνολογικό Εκπαιδευτικό Ίδρυμα Λαμίας ΤΕΙ ΛΑΜΙΑΣ ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ ΤΟΥ ΜΑΘΗΜΑΤΟΣ



Σχετικά έγγραφα
Τύποι Δεδομένων Είσοδος/Έξοδος

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

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

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

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

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

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

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

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

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

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

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

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

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

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

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

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

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

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

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

Ενδεικτική περιγραφή μαθήματος

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

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Εισαγωγή στον προγραμματισμό. Τμήμα Πληροφορικής & Επικοινωνιών ΤΕΙ Σερρών Εργαστήριο 2

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

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

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

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

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

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

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

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

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

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

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

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

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

Μεταφερσιμότητα Τα προγράμματα μεταφέρονται εύκολα σε διαφορετικά λειτουργικά συστήματα

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

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

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

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

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

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

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

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

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

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

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

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

Προσέξτε πως η παράσταση μπορεί να περιλαμβάνει όχι μόνο μία τιμή ή μια άλλη μεταβλητή αλλά μια ολόκληρη μαθηματική παράσταση, όπως η εξής:

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

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

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

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

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

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

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

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

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

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

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

Ινστιτούτο Επαγγελµατική Κατάρτιση Κορυδαλλού "ΤΕΧΝΙΚΟΣ ΣΥΣΤΗΜΑΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ" (Ερωτήσεις Πιστοποίησης στην γλώσσα προγραµµατισµού C)

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

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

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

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

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

ΗΥ-150. Προγραμματισμός

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

Είδη εντολών. Απλές εντολές. Εντολές ελέγχου. Εκτελούν κάποια ενέργεια. Ορίζουν τον τρόπο με τον οποίο εκτελούνται άλλες εντολές

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

4. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Α' μέρος: for)

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

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

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

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

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

ΑΣΚΗΣΗ 2: ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΣΤΗ C

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

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

Σε γενικές γραμμές, είναι καλή πρακτική να γράϕουμε προγράμματα C που αποτελούνται από πολλές και μικρές συναρτήσεις, παρά από λίγες και μεγάλες.

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

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

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

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

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

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

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

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

οµές (structures) και Eνώσεις (unions)

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή

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

Transcript:

ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ Τεχνολογικό Εκπαιδευτικό Ίδρυμα Λαμίας ΤΕΙ ΛΑΜΙΑΣ ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ ΤΟΥ ΜΑΘΗΜΑΤΟΣ «ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Ι» ΓΛΩΣΣΑ C Δρ. ΠΑΠΑΓΕΩΡΓΙΟΥ ΕΛΠΙΝΙΚΗ ΚΑΘΗΓΗΤΡΙΑ ΕΦΑΡΜΟΓΩΝ ΣΕΠΤΕΜΒΡΙΟΣ 2010

Σκοπός: 1 η Εργαστηριακή Ασκηση Προγραμματισμού Ι - Γλώσσα C Γνωριμία με τη γλώσσα προγραμματισμού C, το περιβάλλον της και τον compiler της C που χρησιμοποιείται στο εργαστήριο. Βασική δομή ενός προγράμματος Δημιουργία, μεταγλώττιση και εκτέλεση απλών προγραμμάτων Μπείτε στο λογαριασμό σας και φτιάξτε ένα φάκελο μέσα στον οποίο θα γράφετε όλα τα προγράμματα για το εργαστήριο. Μπορείτε να τον ονομάσετε ProgI ή κάποιο άλλο αντιπροσωπευτικό όνομα. Μέσα σε αυτό το φάκελο φτιάξτε έναν γι'αυτό το πρώτο εργαστήριο. Μπορείτε να τον ονομάσετε lab1 ή κάποιο άλλο αντιπροσωπευτικό όνομα. Ανοιξτε τη Microsoft Visual C++ που είναι εγκατεστημένη στους υπολογιστές του εργαστηρίου, ή όποιο άλλο προγραμματιστικό περιβάλλον είναι εγκατεστημένο για τη C (περαιτέρω πληροφορίες θα δοθούν στο εκάστοτε εργαστήριο), δημιουργήστε ένα νέο project (empty workspace) και στη συνέχεια δημιουργήστε ένα νέο αρχείο για να γράψετε το πρόγραμμά σας (new C++ source file). Θα δώσετε ένα όνομα στο αρχείο που θα δημιουργήσετε για την 1 η εργαστηριακή άσκηση το οποίο θα έχει την επέκταση.cpp (π.χ. askisi1.cpp). Header files και η ντιρεκτίβα του προεπεξεργαστή (preprocessor) #include Δομή ενός προγράμματος σε C Εντολές προεπεξεργαστή Δηλώσεις συναρτήσεων Δηλώσεις μεταβλητών Κυρίως πρόγραμμα Ορισμοί συναρτήσεων Κυρίως Πρόγραμμα int main ( ) - δηλώσεις μεταβλητών - προτάσεις γλώσσας Είσοδος δεδομένων Επεξεργασία δεδομένων Έξοδος αποτελεσμάτων Συναρτήσεις εισόδου/εξόδου π.χ. printf( αλφαριθμητικό ); Δρ. Ελπινίκη Παπαγεωργίου 2

Χρήση σχολίων και αναγνωσιμότητα προγράμματος /* Εισαγωγή σχολίων στο πρόγραμμα σας είναι απαραίτητη για τον Καλό /* /* Προγραμματισμό! */ Γράφοντας το πρώτο πρόγραμμα σε C: Hello world! Είστε έτοιμοι να γράψετε το παρακάτω πρόγραμμα το οποίο εκτυπώνει στην οθόνη το μήνυμα Hello world! /* Display the message "Hello world!" on the screen */ int main () printf("hello world!\n"); Σώστε το αρχείο με όνομα hello_world.cpp στο φάκελο που φτιάξατε γι'αυτό το εργαστήριο. Στη συνέχεια μεταγλωττίστε (compile) και εκτελέστε (execute) το πρώτο πρόγραμμά σας. Αν δεν υπάρχουν λάθη, ο compiler θα παράγει ένα εκτελέσιμο πρόγραμμα. Τι παρατηρείτε??? Ασκηση Γράψτε ένα πρόγραμμα το οποίο κάνει το εξής: Εκτυπώνει στην οθόνη το Όνομα και το Επιθετό σας, τον ΑΜ σας και το Τμήμα στο οποίο ανήκετε, σε διαφορετικές γραμμές το καθένα με την χρήση του \n. Δρ. Ελπινίκη Παπαγεωργίου 3

2 η Εργαστηριακή Ασκηση Προγραμματισμού Ι - Γλώσσα C Σκοπός: Εξάσκηση στη βασική είσοδο / έξοδο Εξάσκηση στη δήλωση και χρήση μεταβλητών Αναγνώριση και διόρθωση τυπικών συντακτικών και σημασιολογικών λαθών Ανοίξτε το περιβάλλον προγραμματισμού της C (π.χ. Microsoft Visual C++). Δημιουργήστε ένα κενό αρχείο (π.χ. lab2.cpp). Σε αυτό θα γράψετε το πρόγραμμά σας. ΕΙΣΟΔΟΣ/ΕΞΟΔΟΣ (scanf/printf) Είσοδος Δεδομένων (& τελεστής διεύθυνσης) Εντολή/Συνάρτηση scanf: scanf ( <προσδιοριστής>, &<μεταβλητή>); Είσοδος ακεραίων: scanf ( %d, &num); Είσοδος πραγματικών: scanf ( %f, &num); Προσδιοριστές: %f, %e, %g Είσοδος χαρακτήρων: scanf ( %c, &ch); % - Κωδικός μορφοποίησης Άλλοι κωδικοί: %c για χαρακτήρες και %f για αριθμούς κινητής υποδιαστολής Εξοδος αποτελεσμάτων: Εντολή/Συνάρτηση printf: printf ( <περιγραφή>, <ακολουθία μεταβλητών>); Έξοδος ακεραίων: printf ( %d, num); Προσδιοριστές: %d, %x, %o Έξοδος πραγματικών: printf ( %f, num); Προσδιοριστές: %f, %e, %g Έξοδος χαρακτήρων: printf ( %c, ch); (χαρακτήρας) printf ( %d, ch); (Κωδικός ASCII) Προσδιοριστές: %c, %d Προσδιοριστές μορφής εκτύπωσης Οθόνης: \t, \n Αριθμών: %<ακέρ><προσδιορ> (καθορισμός πλάτους πεδίου). Π.χ. %3d %[<ακέρ>][.<ακέρ>]<προσδιορ> (καθορισμός πλάτους πεδίου και δεκαδικών ψηφίων). Π.χ. %6.1f, %.2f, %6f ΔΗΛΩΣΗ ΜΕΤΑΒΛΗΤΩΝ & ΕΚΧΩΡΗΣΗ ΤΙΜΩΝ Κάθε μεταβλητή, σταθερά έχει ένα τύπο Δρ. Ελπινίκη Παπαγεωργίου 4

τύπος όνοµα-µεταβλητής; Τύπος Δεσµευµένη λέξη χαρακτήρας char προσηµασµένος ακέραιος int αριθµός κινητής υποδιαστολής float αριθµός κινητής υποδιαστολής διπλής ακρίβειας double απουσία τιµής void Ο τύπος καθορίζει το μέγεθος του «κουτιού» που θα δεσμευτεί στη μνήμη char: 1 byte int: 4 bytes float: 4 bytes double: 8 bytes Προσδιοριστές short int: 2 bytes long int: 8 bytes long double:.. bytes Προσδιοριστές: signed, unsigned unsigned int, unsigned char 32 bits, 8 bits 0 232-1, 0 28-1 signed int, signed char 31 bits, 7 bits -231 231-1, -27 27-1 Πολλαπλή δήλωση μεταβλητών Π.χ. float x, y, z; Ονοματολογία μεταβλητών όμοια με συναρτήσεις (0-9 όχι στην αρχή, γράμματα αλφαβήτου και κάτω παύλα) Η C είναι case-sensitive Π.χ. int count, COUNT; Eκχώρηση τιμών (αποτελεί εντολή): όνομα-μεταβλητής = τιμή; Παράδειγματα: counter = 100; fl = 100.1; fl = 100.0; Κάτι ακόμα για τη συνάρτηση εξόδου printf() printf("this prints the number %d", 99); printf("this displays %d, too", 99); Δρ. Ελπινίκη Παπαγεωργίου 5

Παράδειγµα 1 char ch; int i; float f; double d; ch= A ; i=10; f=100.1; d=150.2; printf("ch is %c, ", ch); printf("i is %d, ", i); printf("f is %f, ", f); printf("d is %f.", d); ΕΙΣΟΔΟΣ ΑΡΙΘΜΩΝ ΑΠΟ ΤΟ ΠΛΗΚΤΡΟΛΟΓΙΟ scanf( %d, &όνομα-μεταβλητής-int); Π.χ. int num; scanf("%d", &num); scanf( %f, &όνομα-μεταβλητής-float); Π.χ. float fl; scanf("%f", &fl); scanf( %lf, &όνομα-μεταβλητής- double); Π.χ. double dbl; scanf("%lf", &dbl); Παράδειγµα 2 int num; float f; double d; printf("enter an integer: "); scanf("%d", &num); printf("enter a floating point number: "); scanf("%f", &f); printf("enter a floating point number (double): "); scanf("%lf", &d); printf("%d ", num); printf("%f ", f); printf("%f", d); Δρ. Ελπινίκη Παπαγεωργίου 6

ΑΡΙΘΜΗΤΙΚΕΣ ΕΚΦΡΑΣΕΙΣ -Αριθµητικοί τελεστές της C Η C ορίζει ένα εκτεταμένο σύνολο αριθμητικών τελεστών: Προτεραιότητα Υψηλότερη ( ) * / % Χαµηλότερη + - Παράδειγμα 3: printf("%d", 5/2); printf(" %d", 5%2); printf(" %d", 4/2); printf(" %d", 4%2); Παράδειγµα 4 /* Αυτό είναι ένα πρόγραµµα υπολογισµού του όγκου σφαίρας όταν δίνεται η ακτίνα της. */ float pi, r, v; /* δήλωση µεταβλητών */ pi = 3.141592; /* ο αριθµός π */ printf("enter radius: "); scanf("%f", &r); /* είσοδος της ακτίνας */ v=(4.0 * pi * r * r * r) / 3.0 ; /* υπολογισµός όγκου */ printf("volume is %f", v); /* εµφάνιση αποτελέσµατος */ Εντολή Return Στην εντολή return, η συνάρτηση επιστρέφει (τερματίζει) αμέσως. Καμία εντολή μετά δεν εκτελείται. Η τιμή της return μπορεί να είναι οποιαδήποτε έγκυρη έκφραση της C. Xωρίς τιμή η Return ; Κυρίως σε συναρτήσεις τύπου void. Δρ. Ελπινίκη Παπαγεωργίου 7

Ασκήσεις στο Εργαστήριο 1. Λήψη δυο ακέραιων θετικών αριθμών από το πληκτρολόγιο, έστω a και b, και εμφάνιση της διαφοράς (a-b) και του γινομένου (a b). 2. Γράψτε ένα πρόγραµµα το οποίο θα υπολογίζει τον όγκο ενός ορθογώνιου παραλληλεπίπεδου. Το πρόγραµµα σας θα πρέπει να ζητά τις διαστάσεις του ορθογώνιου από τον χρήστη. Χρησιµοποιήστε σχόλια για να εξηγήσετε την ροή του προγράµµατος. 3. Γράψτε ένα πρόγραμμα το οποίο κάνει τα εξής: Εκτυπώνει στην οθόνη το μήνυμα How many students are there in a lab? Διαβάζει από το πληκτρολόγιο το πλήθος των φοιτητών ενός εργαστηρίου. Εκτυπώνει στην οθόνη το μήνυμα How many labs are there? Διαβάζει από το πληκτρολόγιο το πλήθος των εργαστηρίων. Εκτυπώνει στην οθόνη το μήνυμα There are X labs and Y students in a lab, όπου X είναι το πλήθος των φοιτητών και Υ το πλήθος των εργαστηρίων. Εκτυπώνει στην οθόνη το μήνυμα There are Z students total., όπου Ζ είναι το γινόμενο του πλήθους των φοιτητών επί του πλήθους των εργαστηρίων. Παρατηρείστε πως για να λειτουργήσει το πρόγραμμά σας θα χρειαστεί να δηλώσετε κατάλληλες μεταβλητές. Φροντίστε οι μεταβλητές σας να έχουν περιγραφικά ονόματα όπως περιγράφεται στις σημειώσεις του μαθήματος. Επιπλέον, το πρόγραμμά σας πρέπει να έχει σωστή στοίχιση και σχόλια. Το πρόγραμμά σας πρέπει να μεταγλωτίζεται χωρίς λάθη ή προειδοποιήσεις και να εκτελείται ακριβώς όπως περιγράφεται πιο πάνω. Δρ. Ελπινίκη Παπαγεωργίου 8

3 η Εργαστηριακή Ασκηση Προγραμματισμού Ι - Γλώσσα C Σκοπός: Σχεσιακοί και Λογικοί Τελεστές Κατανόηση των εντολών if (συνθήκη) εντολή1 else εντολή2 και των μακροεντολών getchar(); putchar(); Ενθεση εντολών If Σχεσιακοί και λογικοί τελεστές Σχεσιακοί τελεστές της C Τελεστής Ενέργεια > µεγαλύτερο από >= µεγαλύτερο από ή ίσο µε < µικρότερο από <= µικρότερο από ή ίσο µε == ίσο µε!= άνισο (διάφορο) Λογικοί τελεστές της C Τελεστής Ενέργεια && AND OR! NOT Προτεραιότητα σχεσιακών και λογικών τελεστών Υψηλότερη! > >= < <= ==!= && Χαµηλότερη ΠΑΡΑΔΕΙΓΜΑΤΑ ΛΟΓΙΚΩΝ & ΣΧΕΣΙΑΚΩΝ ΤΕΛΕΣΤΩΝ Παράδειγμα: p=0, q=1 p&&q=0, p q=1,!p=1 Παράδειγµα 1 int xor(int a, int b); int p, q; printf("enter P (0 or 1): "); scanf("%d", &p); printf("enter Q (0 or 1): "); scanf("%d", &q); printf("p AND Q: %d\n", p && q); printf("p OR Q: %d\n", p q); printf("p XOR Q: %d\n", xor(p, q)); Δρ. Ελπινίκη Παπαγεωργίου 9

int xor(int a, int b) return (a b) &&!(a && b); if(έκφραση) εντολή; Έλεγχος της ροής εκτέλεσης των προγραμμάτων (IF) if(έκφραση) εντολή1; else εντολή2; αν η έκφραση είναι true ( 0) η εντολή θα εκτελεστεί αν η έκφραση είναι false (=0) η εντολή θα αγνοηθεί if(έκφραση) εντολή1; εντολή2; τµήµα κώδικα (code block) : εντολήν; else εντολή1; εντολή2; το τµήµα else είναι προαιρετικό : εντολήμ; Παράδειγµα 2 int num1, num2; printf("enter first number: "); scanf("%d", &num1); printf("enter second number: "); scanf("%d", &num2); if(num2 == 0) printf("cannot divide by zero."); else printf("answer is: %d.", num1 / num2); Παράδειγµα 3: Έστω µία µη συνεχής συνάρτηση που ορίζεται µε το παρακάτω τµήµα κώδικα. float f(float x) float value; if(x < 0) value = - x; else value = x; return value; Δρ. Ελπινίκη Παπαγεωργίου 10

Είσοδος χαρακτήρων από το πληκτρολόγιο Η getchar() χρησιμοποιεί line buffer και αναμένει το Enter για να επιστρέψει τον χαρακτήρα. char ch; ch = getchar(); printf(" you typed: %c", ch); H getche() χωρίς temp line character buffer επιστρέφει αμέσως τον χαρακτήρα (conio.h) Παράδειγµα 4 int a, b; char ch; printf("do you want to:\n"); printf("add, Subtract, Multiply, or Divide?\n"); printf("enter first letter: "); ch = getchar(); printf("\nenter first number: "); scanf("%d", &a); printf("enter second number: "); scanf("%d", &b); if(ch=='a') printf("%d", a+b); if(ch=='s') printf("%d", a-b); if(ch=='m') printf("%d", a*b); if(ch=='d' && b!=0) printf("%d", a/b); Παράδειγµα 5 #include <conio.h> char ch; printf("enter a character: "); ch = getche(); printf("\nits ASCII code is %d", ch); #include <conio.h> γιατί το αρχείο conio.h περιέχει το πρωτότυπο της συνάρτησης getche(). Ένθεση εντολών if (ή φωλιασμένα if) Η δεύτερη if είναι ένθετη (nested) µέσα στην πρώτη. Κλίµακα if-else-if if(έκφραση) εντολή; else if(έκφραση) εντολή; else if(έκφραση) εντολή; : : else εντολή; Δρ. Ελπινίκη Παπαγεωργίου 11

Παράδειγµα 6 int a, b; char ch; printf("do you want to:\n"); printf("add, Subtract, Multiply, or Divide?\n"); printf("enter first letter: "); ch = getchar(); printf("\nenter first number: "); scanf("%d", &a); printf("enter second number: "); scanf("%d", &b); if(ch=='a') printf("%d", a+b); else if(ch=='s') printf("%d", a-b); else if(ch=='m') printf("%d", a*b); else if(ch=='d' && b!=0) printf("%d", a/b); Ασκήσεις 1. Να γίνει ένα πρόγραμμα που να διαβάζει έναν χαρακτήρα από το πληκτρολόγιο και να εμφανίζει τον αντίστοιχο αριθμό ASCII σε δεκαδική, οκταδική και δεκαεξαδική μορφή. 2. Τι αποτελέσματα δίνουν οι παρακάτω πράξεις; x = 1+2*3+10/4; y = (7/3-2)*5; z = (7.0/2-2)*4; w = 2*4-16%5+2-2/3; 3. Να γραφεί ένα πρόγραμμα το οποίο να διαβάζει έναν ακέραιο, να ελέγχει αν είναι άρτιος ή περιττός (μονός ή ζυγός) και να εμφανίζει το αντίστοιχο μήνυμα. 4. Να γίνει ένα πρόγραμμα το οποίο να δέχεται μια χρονολογία από το πληκτρολόγιο να διαπιστώνει αν το έτος αυτό είναι δίσεκτο ή όχι και να επιστρέφει το κατάλληλο μήνυμα. 5. Να γίνει ένα πρόγραμμα που θα ζητάει από το χρήστη να πληκτρολογήσει το ύψος του σε εκατοστά του μέτρου και ανάλογα με αυτό θα του επιστρέφει έναν χαρακτηρισμό σύμφωνα με τις παρακάτω συνθήκες: ύψος < 150 Είσαι κοντός 150 ύψος 180 Είσαι μέτριος 180 < ύψος Είσαι ψηλός [με απλά και με φωλιασμένα if] 6. Γράψτε ένα πρόγραμμα το οποίο θα υπολογίζει το εμβαδόν ενός κύκλου, ενός ορθογωνίου ή ενός τριγώνου. Χρησιμοποιήστε μία κλίμακα if-else-if. Δρ. Ελπινίκη Παπαγεωργίου 12

4 η Εργαστηριακή Ασκηση Προγραμματισμού Ι - Γλώσσα C Σκοπός: Κατανόηση της εντολής for (αρχικοποίηση; συνθήκη; βήμα) Εντολή switch Κατανόηση των βρόχων while and do-while ΧΡΗΣΗ ΤΗΣ for for (αρχικοποίηση; συνθήκη; βήμα) π.χ. for(count=1; count<11; count++) εντολές; Παράδειγµα int answer, count; int again; for(count=1; count<11; count++) printf("what is %d + %d? ", count, count); scanf("%d", &answer); if(answer == count+count) printf("right!\n"); else printf("sorry, you're wrong\n"); printf("try again.\n "); printf("\nwhat is %d + %d? ", count, count); scanf("%d", &answer); if(answer == count+count) printf("right!\n"); else printf("wrong, the answer is %d\n", count+count); ΟΙ ΠΑΡΑΛΛΑΓΕΣ ΤΟΥ ΒΡΟΧΟΥ for /*Συνθήκη ελέγχου*/ int i; char ch = 'a'; /* give ch an initial value */ for(i=0; ch!= 'q'; i++) printf("pass: %d\n", i); ch = getchar(); /*Κενό προορισμό*/ Δρ. Ελπινίκη Παπαγεωργίου 13

char ch; for (ch=getchar(); ch!='q'; ch=getchar()); printf("found the q."); //ΠΡΟΓΡΑΜΜΑ που εκτυπώνει το χαρακτήρα που θα δίνετε κάθε φορά, μέχρι 10 //φορές int i; char ch; for(i=0; i<10; ch=getchar()) printf("dwse ena xaraktira ); ch = getchar(); printf( o xarakthras einai %c, ch); i=i+1; Χρήση της switch Πολλαπλές εναλλακτικές επιλογές µε την switch switch(µεταβλητή) case σταθερά1: αλληλουχία εντολών break; case σταθερά2: αλληλουχία εντολών break; : : default: αλληλουχία εντολών break; Η σταθερά είναι ακέραιος ή χαρακτήρας. Η χρήση της default και break είναι προαιρετική. switch (choice) case 1: x = a + b; break; case 2: x = a b; break; case 3: x = a * b; break; case 4: x = a / b; Δρ. Ελπινίκη Παπαγεωργίου 14

break; default: printf ( Ανύπαρκτη επιλογή ); break; Παράδειγµα int a, b; char ch; printf("do you want to:\n"); printf("add, Subtract, Multiply, or Divide?\n"); printf("enter first letter: "); ch = getchar(); printf("\n"); printf("enter first number: "); scanf("%d", &a); printf("enter second number: "); scanf("%d", &b); switch(ch) case 'A': printf("%d", a+b); break; case 'S': printf("%d", a-b); break; case 'M': printf("%d", a*b); break; case 'D': if(b!=0) printf("%d", a/b); while (<εκφραση>) πρόταση while (count<limit) count++; printf( count is %d\n,count); < επόμενη πρόταση> do πρόταση while(<εκφραση>) do count++; printf( count is %d\n,count); while (count<limit) <επόμενη πρόταση> ΒΡΟΧΟΙ WHILE ΚΑΙ DO-WHILE Παράδειγµα Δρ. Ελπινίκη Παπαγεωργίου 15

#include <conio.h> char ch; printf("enter your message.\n"); ch = getche(); while(ch!= '\r') printf("%c", ch+1); ch = getche(); Τι θα εκτυπώσει το παραπάνω πρόγραμμα? Παράδειγµα int total, i, j; total = 0; do printf("enter next number (0 to stop): "); scanf("%d", &i); printf("enter number again: "); scanf("%d", &j); if(i!= j) printf("mismatch\n"); continue; total = total + i; while(i); printf("total is %d\n", total); Ασκήσεις για λύση 1. Να φτιάξετε πρόγραμμα που να διαβάζει το μέσο όρο βαθμολογίας(μο) ενός σπουδαστή στα ΤΕΙ και αν είναι σωστός (0<=ΜΟ<=10) να εμφανίζει: FAIL αν 0<=ΜΟ<5 GOOD αν 5<=ΜΟ<6,5 VERY GOOD αν 6,5<=ΜΟ<8,5 EXCELLENT αν 8,5<=ΜΟ<10 Αλλιώς να εμφανίζει το μήνυμα «WRONG GRADE 2. Με το νέο σύστημα πληρωμής των διοδίων, οι οδηγοί των τροχοφόρων έχουν τη δυνατότητα να πληρώνουν το αντίτιμο των διοδίων µε ειδική μαγνητική κάρτα. Υποθέστε ότι υπάρχει μηχάνημα το οποίο διαθέτει είσοδο για την κάρτα και φωτοκύτταρο. Το μηχάνημα διαβάζει από την κάρτα το υπόλοιπο των χρημάτων και το αποθηκεύει σε µία μεταβλητή Υ και, µε το φωτοκύτταρο, αναγνωρίζει τον τύπο του τροχοφόρου και το αποθηκεύει σε µία μεταβλητή Τ. Δρ. Ελπινίκη Παπαγεωργίου 16

Υπάρχουν τρεις τύποι τροχοφόρων: δίκυκλα (D), επιβατικά (E) και φορτηγά (F), µε αντίτιμο διοδίων 1, 2 και 3 ευρώ αντίστοιχα. Να αναπτύξετε πρόγραμμα, το οποίο: α. ελέγχει τον τύπο του τροχοφόρου και εκχωρεί στη μεταβλητή Α το αντίτιμο των διοδίων, ανάλογα µε τον τύπο του τροχοφόρου β. ελέγχει την πληρωμή των διοδίων µε τον παρακάτω τρόπο. Αν το υπόλοιπο της κάρτας επαρκεί για την πληρωμή του αντιτίμου των διοδίων, αφαιρεί το ποσό αυτό από την κάρτα. Αν η κάρτα δεν έχει υπόλοιπο, το μηχάνημα ειδοποιεί µε μήνυμα για το ποσό που πρέπει να πληρωθεί. Αν το υπόλοιπο δεν επαρκεί, μηδενίζεται η κάρτα και δίνεται µε μήνυμα το ποσό που απομένει να πληρωθεί. 3. Να γίνει ένα πρόγραμμα το οποίο θα ζητάει ακέραιους αριθμούς μέχρι να λάβει την τιμή 0 (μηδέν). Γι αυτούς τους αριθμούς (με εξαίρεση του μηδενός) θα υπολογίζει το άθροισμα, το πλήθος και τη μέση τιμή. Επίσης θα επιστρέφει την τιμή του μεγαλύτερου και του μικρότερου. 4. Δημιουργήστε ένα πρόγραμμα που να τυπώνει την προπαίδεια όλων των ακεραίων από το 1 μέχρι το 10. 5. Να γίνει ένα πρόγραμμα που θα γεμίζει ένα γραμμικό πίνακα ακεραίων 10 στοιχείων, με τιμές από το πληκτρολόγιο και θα τον εμφανίζει σε μια γραμμή. [με for και με do while] 6. Να γίνει ένα πρόγραμμα που θα γεμίζει ένα γραμμικό πίνακα ακεραίων 15 στοιχείων, με τυχαίες τιμές [με την βοήθεια της random]. Κατόπιν, να ζητάει ένα ακέραιο από το πληκτρολόγιο, να υπολογίζει και να αποθηκεύει σε έναν άλλο πίνακα το γινόμενο του πρώτου πίνακα με τον ακέραιο αυτό και τέλος να εμφανίζει στην οθόνη τον αρχικό πίνακα και τον πίνακα του γινομένου σε μια γραμμή τον καθένα. 7. Να φτιάξετε πρόγραμμα που να διαβάζει έναν ακέραιο αριθμό Ν και να εμφανίζει στην οθόνη ένα δέντρο με Ν γραμμές από αστεράκια. Π.χ. αν Ν=4 θα πρέπει να εμφανίζεται το παρακάτω σχήμα: * *** ***** ******* Παρατήρηση: Η ι-οστή γραμμή έχει Ν-ι κενά και 2*ι-1 αστεράκια Δρ. Ελπινίκη Παπαγεωργίου 17

5 η Εργαστηριακή Ασκηση Προγραμματισμού Ι - Γλώσσα C Σκοπός: Επανάληψη στη χρήση των δομών ελέγχου Χρήση Πινάκων (arrays) Επαναληπτική άσκηση στις δομές ελέγχου Γράψτε ένα πρόγραμμα το οποίο θα χρησιμοποιηθεί για τη διαχείριση των βαθμών στο εργαστήριο ενός μαθήματος. Γνωρίζουμε ότι το εργαστήριο έχει 10 φοιτητές και ότι οι βαθμοί είναι πραγματικοί αριθμοί μεταξύ 0 και 100. Το πρόγραμμά σας πρέπει να κάνει τα εξής: Ορίζει ένα πίνακα στον οποίο θα αποθηκευτούν οι βαθμοί Διαβάζει από το πληκτρολόγιο τους βαθμούς των φοιτητών και τους αποθηκεύει στον πίνακα Εκτυπώνει τους βαθμούς στην οθόνη, έναν σε κάθε γραμμή (με 2 δεκαδικά ψηφία) #include<stdio.h> #define CLASS_SIZE 10 int main (int argc, char *argv[]) double scores[class_size]; char doaverage; int i; double sum, average; /* read data */ for (i=0; i < CLASS_SIZE; i++) printf("enter score: "); scanf("%lf", &scores[i]); if (scores[i] < 0 scores[i] > 100) printf("error: Invalid value.\n"); return (1); /* print data */ for (i=0; i < CLASS_SIZE; i++) printf("%6.2f\n", scores[i]); /* request to compute average */ do printf("compute average? (y/n)"); scanf(" %c", &doaverage); while (doaverage!= 'y' && doaverage!= 'n'); /* compute and display average, if requested */ if (doaverage == 'y') sum = 0; for (i=0; i<class_size; i++) sum += scores[i]; average = sum / CLASS_SIZE; printf("%.2f\n", average); Δρ. Ελπινίκη Παπαγεωργίου 18

Συνέχεια άσκησης για το εργαστήριο Προσθέστε κώδικα στο πρόγραμμά σας ώστε να Για κάθε βαθμό που διαβάζει, ελέγχει ότι είναι μεταξύ 0 και 100. Αν κάποιος βαθμός δεν είναι εντός τον ορίων, το πρόγραμμα εκτυπώνει το μήνυμα "Error: Invalid grade" και τερματίζει. Αφού εκτυπώσει τους βαθμούς, εκτυπώνει το μήνυμα "Compute average? (y/n)" και διαβάζει την απάντηση του χρήστη η οποία πρέπει να είναι είτε ο χαρακτήρας 'y' είτε ο χαρακτήρας 'n'. Αν η απάντηση είναι οποιοσδήποτε άλλος χαρακτήρας, το πρόγραμμα ξαναρωτά έως ότου δοθεί έγκυρη απάντηση. Αν η απάντηση ήταν 'y', υπολογίζει και εκτυπώνει το μέσο όρο των βαθμών, διαφορετικά τερματίζει. Πίνακες 'Ενας πίνακας (array) στη C είναι ένας αριθμός από ομοειδή δεδομένα στο καθένα από τα οποία μπορούμε να αναφερθούμε με το όνομα του πίνακα και τον αύξοντα αριθμό του μέσα στον πίνακα (array). Για να δηλώσουμε έναν πίνακα χρησιμοποιούμε μία δήλωση της μορφής: τύπος_δεδομένου όνομα[πλήθος_στοιχείων]; τύπος όνομα_πίνακα[μέγεθος] int pinakas[10]; Π.χ. float bathmos[5]; Αρχικοποίηση πίνακα float bathmos[5]= 10, 8, 12.5, 15.5, 14; float bathmos[] = 10, 8, 12.5, 15.5, 14; (προσοχή στο πλήθος των αρχικών τιμών) Το πλήθος_στοιχείων θα πρέπει να είναι ακέραια σταθερά (μεγαλύτερη του μηδενός) ή σταθερή έκφραση. Ο πίνακας είναι μια δομή τυχαίας προσπέλασης. Δρ. Ελπινίκη Παπαγεωργίου 19

bathmos 0 1 2 3 4 10 8 12.5 15.5 14 Δείκτες θέσεων bathmos[0] bathmos[1] bathmos[4] Μεταβλητές με δείκτες Δείκτης θέσης Με τον όρο αναφορά εννοούμε ότι μπορούμε να χρησιμοποιήσουμε την τιμή του στοιχείου σε μία έκφραση (π.χ. όνομα[2] + 6) ή να αλλάξουμε την τιμή του μέσω μιας έκφρασης-εκχώρησης (π.χ. όνομα[2] = 14;). 'Ενα array μπορεί, όπως και μία μεταβλητή, να αρχικοποιείται, μόνο όμως όταν η δήλωσή του βρίσκεται έξω από κάθε συνάρτηση, δεν μπορούμε δηλαδή να αρχικοποιήσουμε ένα array το οποίο δηλώνεται ως τοπικό δεδομένο σε μία συνάρτηση ή σε μία σύνθετη εντολή. Υλοποιήστε στον επεξεργαστή της C τα ακόλουθα παραδείγματα: Παράδειγμα 1 int a1[10], a2[10]; int i; for(i=1; i<11; i++) a1[i-1] = i; for(i=0; i<10; i++) a2[i] = a1[i]; for(i=0; i<10; i++) printf("%d ", a2[i]); /*Άσκηση: Αντιγραφή και αντεστραμμένα*/ Παράδειγμα 2 /* Να καταχωρηθούν ακέραιες τιμές σ έναν πίνακα 10 θέσεων και να βρεθεί η μέγιστη και η ελάχιστη τιμή του πίνακα καθώς και η μεταξύ τους διαφορά */ main() int i, a[10], max, min; clrscr(); /* καταχώρηση τιμών */ for (i=0; i<10; i++) Δρ. Ελπινίκη Παπαγεωργίου 20

printf("\nδώσε το %dο στοιχείο του πίνακα : ", i); scanf("%d", &a[i]); /* end of for */ max = a[0]; min = a[0]; for (i=1; i<10; i++) if (a[i] > max) max = a[i]; if (a[i] < min) min = a[i]; /* end of for */ printf("\nη μέγιστη τιμή του πίνακα είναι : %d", max); printf("\nη ελάχιστη τιμή του πίνακα είναι : %d", min); printf("\nη διαφορά μέγιστης και ελάχιστης τιμής είναι : %d", \ max-min); scanf("%d", &i); /* end of main */ Παράδειγμα 3 /*Δώστε τον αριθμό των ημερών της εβδομάδας για τις οποίες θέλετε να καταγράψετε τις θερμοκρασίες. Καταχωρήστε τις θερμοκρασίες σε πίνακα και υπολογίστε τη μέση θερμοκρασία, την ελάχιστη και τη μέγιστη. */ int temp[31], i, min, max, avg; int days; printf("how many days in the month? "); scanf("%d", &days); for(i=0; i<days; i++) printf("enter noonday temperature for day %d: ", i+1); scanf("%d", &temp[i]); /*Μέσος όρος*/ avg = 0; for(i=0; i<days; i++) avg = avg + temp[i]; printf("average temperature: %d\n", avg/days); /*Ελάχιστο/Μέγιστο*/ min = 200; /* initialize min and max */ max = 0; for(i=0; i<days; i++) if(min>temp[i]) min = temp[i]; if(max<temp[i]) max = temp[i]; printf("mini/max temperature: %d\n %d\n", min, max); Παράδειγμα 4: /*Γράψτε ένα πρόγραμμα σε C που να διαβάζει τον βαθμό και την τάξη από 20 μαθητές, να ελέγχει αν ο βαθμός ανήκει στο διάστημα 0-20 και αν η τάξη είναι μία από τις a, b ή c - μόλις διαβάσει τα στοιχεία ενός μαθητή, τοποθετεί τον βαθμό του σ έναν αντίστοιχο πίνακα ανάλογα με την τάξη που ανήκει ο μαθητής */ Δρ. Ελπινίκη Παπαγεωργίου 21

main() int bathmos, i; char taxi; int ia, ib, ic; /* μετρητές για τις τρεις τάξεις */ int a[20], b[20], c[20]; /* πίνακες βαθμών για κάθε τάξη */ ia=ib=ic=0; /* απόδοση τιμών σε πολλές μεταβλητές μαζί */ clrscr(); for (i=0; i<20; i++) do printf("\nδώσε τον βαθμό του %dου μαθητή : ", i); scanf("%d", &bathmos); while (bathmos < 0 bathmos > 20); do printf("\nδώσε την τάξη του %dου μαθητή : ", i); scanf("%c", &taxi); while (taxi!= a && taxi!= b && taxi!= c ); switch (taxi) case a : a[ia] = bathmos; ia++; break; case b : b[ib] = bathmos; ib++; break; case c : c[ic] = bathmos; ic++; break; default: printf("\n Κάτι δεν πήγε καλά"); /* end of switch */ /* end of for */ scanf("%d", &i); /* end of main */ Ασκήσεις για λύση 1. Να γίνει πρόγραμμα που αφού δέχεται σαν δεδομένους δύο πίνακες a και b, 10 ακεραίων ο καθένας, να υπολογίζει και αποθηκεύει σε δύο άλλους πίνακες ath και diaf το άθροισμα και την διαφορά τους αντίστοιχα. 2. Να δημιουργήσετε ένα αρχείο κειμένου με 12 πραγματικούς αριθμούς που αντιστοιχούν στις μέσες θερμοκρασίες ενός τόπου ανά μήνα. Στη συνέχεια να γίνει πρόγραμμα που αφού διαβάζει και αποθηκεύει αυτές τις θερμοκρασίες σε ένα πίνακα Δρ. Ελπινίκη Παπαγεωργίου 22

να υπολογίζει την μέση τιμή, την τυπική απόκλιση και την διασπορά αυτών των τιμών. 3. Να γίνει πρόγραμμα που αφού δέχεται σαν δεδομένους δύο πίνακες a και b, 10 ακεραίων ο καθένας, να τους ταξινομεί με την μέθοδο της φυσαλίδας και στη συνέχεια να τους ενοποιεί ταξινομημένα προς ένα τρίτο νέο πίνακα 20 θέσεων. Δρ. Ελπινίκη Παπαγεωργίου 23

6 η Εργαστηριακή Ασκηση Προγραμματισμού Ι - Γλώσσα C Σκοπός: Εξοικείωση στη χρήση συναρτήσεων (ορισμός και κλήση συναρτήσεων) Κατανόηση της αναδρομής και του τρόπου δημιουργίας αναδρομικών συναρτήσεων ΣΥΝΑΡΤΗΣΕΙΣ Συνάρτηση (function): σύνολο εντολών που έχει ομαδοποιηθεί και τους έχει αποδοθεί ένα όνομα Κλήση (calling) : η εκτέλεση των εντολών της συνάρτησης που έχει κληθεί Ορίσματα (arguments): οι παραστάσεις που επιτρέπουν στο καλούν πρόγραμμα να μεταβιβάζει πληροφορία στη συνάρτηση π.χ. printf( Hello, World); Επιστροφή (returning): η επάνοδος στο καλούν πρόγραμμα μετά το τέλος εκτέλεσης των εντολών της συνάρτησης Επιστροφή τιμής (returning value): H επιστροφή κάποιας τιμής στο καλούν πρόγραμμα μετά το τέλος εκτέλεσης εντολών μιας συνάρτησης π.χ. n1 = GetInteger(); Δήλωση συναρτήσεων (πριν τη main) Πρωτότυπο Συνάρτησης (function prototype) επιστρεφόμενος_τύπος όνομα(όρισμα 1, όρισμα 2,...) επιστρεφόμενος_τύπος: ο τύπος δεδομένων της τιμής που επιστρέφει η συνάρτηση όνομα: το όνομα της συνάρτησης όρισμα: τύπος δεδομένων και όνομα μεταβλητής που μεταβιβάζεται ως όρισμα από το καλούν πρόγραμμα στη συνάρτηση void ορίζει ότι μια συνάρτηση δεν επιστρέφει κάποια τιμή ή δεν δέχεται κάποιο όρισμα π.χ. void function1(int a); π.χ. int function2(void); Ορισμός Συνάρτησης (μετά τη main) Για κάθε μη ενσωματωμένη (δική μας) συνάρτηση πρέπει να ορίσουμε το σώμα της στο πρόγραμμα (μετά την main) <τύπος> (<όνομα - συν> (<παράμετροι>); <δηλώσεις τοπικών μεταβλητών> <προτάσεις> return(παράσταση); παράσταση: η τιμή που επιστρέφει η συνάρτηση στο καλούν πρόγραμμα return; αν η συνάρτηση δεν επιστρέφει κάποια τιμή ο επιστρεφόμενος τύπος είναι void Δρ. Ελπινίκη Παπαγεωργίου 24

Κλήση Συνάρτησης (μέσα στη main) Καλείται η συνάρτηση για εκτέλεση με συγκεκριμένα ορίσματα <όνομα συν> (<παραμ1>, <παραμ2>,, <παραμν>); Τρόπος Χρήσης Συναρτήσεων main () int a, b; f(a,b); /* καθορίζω τα δεδομένα πάνω στα οποία θα γίνει η επεξεργασία */ void f(int x, int y) /* στον ορισμό της συνάρτησης αυτά τα δεδομένα έχουν καθοριστεί γενικά Παράδειγμα: Συνάρτηση Υπολογισμού Δύναμης int power(int m, int n); main() int i, res; for (i=0; i<10; i++) res = power (2, i); printf( %d %d \n, i, res); int power(int base, int n) int i, p; p =1; for (i =1; i <=n; i++) p = p*base; return p; /* να καταχωρούνται τιμές σε τρεις ακέραιες μεταβλητές και μετά να καλείται μια συνάρτηση που θα υπολογίζει τη μεγαλύτερη τιμή */ main() int a, b, c; int max; int maximum(); /* εδώ δηλώνουμε τις συναρτήσεις που θα χρησιμοποιήσει το πρόγραμμα - μια συνάρτηση επιστρέφει μία και μόνο μία τιμή στο όνομά της και όταν την δηλώνουμε, γράφουμε πριν από το όνομά της τον τύπο δεδομένων της, τον τύπο δεδομένων δηλ. της τιμής που επιστρέφει */ clrscr(); Δρ. Ελπινίκη Παπαγεωργίου 25

printf("\nδώσε τον πρώτο αριθμό : "); scanf("%d", &a); printf("\nδώσε τον δεύτερο αριθμό : "); scanf("%d", &b); printf("\nδώσε τον τρίτο αριθμό : "); scanf("%d", &c); max = maximum(a, b, c); /* καλείται η συνάρτηση */ printf("\nη μεγαλύτερη τιμή είναι : ", max); scanf("%d", &a); /* end of main */ /* εδώ γράφουμε τις εντολές της συνάρτησης */ int maximum(a1, b1, c1) int a1, b1, c1; /* τα a1, b1 και c1 είναι τα ορίσματα της συνάρτησης, αλλά είναι και τοπικές μεταβλητές και εδώ δηλώνεται ο τύπος δεδομένων τους */ int max1; max1=a1; if (b1>max1) max=b1; if (c1>max1) max=c1; return max1; /* end of sum() */ /* να καταχωρούνται τιμές σε μια ακέραια μεταβλητή και σε μια μεταβλητή χαρακτήρα και μετά να καλείται μια συνάρτηση τύπου void που θα εκτυπώνει τον χαρακτήρα τόσες φορές όσο είναι η τιμή της ακέραιας μεταβλητής - εκμάθηση των συναρτήσεων τύπου void */ main() int a; char ch; void ektyp(); /* μια συνάρτηση τύπου void δεν επιστρέφει καμία τιμή ή επηρεάζει δύο ή περισσότερες τιμές στο κυρίως πρόγραμμα και όταν τη δηλώνουμε, γράφουμε πριν από το όνομά της τη λέξη void */ clrscr(); printf("\nδώσε τον αριθμό : "); scanf("%d", &a); printf("\nδώσε τον χαρακτήρα : "); scanf("%c", &ch); ektyp(a, ch); /* μια συνάρτηση τύπου void καλείται με απλή αναγραφή του ονόματός της και των ορισμάτων της */ scanf("%d", &a); /* end of main */ void ektyp(a1, ch1) int a1; char ch1; Δρ. Ελπινίκη Παπαγεωργίου 26

int i; for (i=1; i<=a1; i++) printf(ch); /* μια συνάρτηση τύπου void δεν έχει εντολή return */ /* end of ektyp() */ Αναδρομικές Συνάρτησεις Ορισμός συνάρτησης μέσω κλήσης του εαυτού της Μία τεχνική επίλυσης προβλημάτων Π.χ. εύρεση αθροίσματος 1+2+ +n - Κλασσική λύση int sum (int n) s=0; for (i=1; i<=n; i++) s=s+i; return s; Αναδρομική λύση sum(n) = sum (n-1) + n int sum (int n) if (n<=1) return n; Else return (sum(n-1)+n); Ασκήσεις Συνάρτηση υπολογισμού του παραγοντικού ενός ακεραίου Συνάρτηση υπολογισμού αθροίσματος, διαφοράς και γινομένου δύο αριθμών. Υπολογισμός ύψωσης δύναμης ακεραίου σε μη αρνητικό ακέραιο Υπολογισμός ν-οστού όρου ακολουθίας Fibonacci 1. Να γίνει ένα πρόγραμμα το οποίο να ζητάει έναν ακέραιο από το πληκτρολόγιο, έστω το n, και να επιστρέφει στην οθόνη το n-παραγοντικό (n!). Ο υπολογισμός του παραγοντικού να γίνει σε ξεχωριστή συνάρτηση πρώτα μη αναδρομικά και κατόπιν αναδρομικά. 2. Να γίνει μια αναδρομική συνάρτηση για την ύψωση ενός ακεραίου σε έναν άλλο και να συγκριθεί με τις προηγούμενες συναρτήσεις που έκαναν τους ίδιους υπολογισμούς σε μη αναδρομική μορφή. Επίσης, να γίνει πρόγραμμα που να την χρησιμοποιεί. (δοκιμάστε και με αρνητικό εκθέτη) 3. Να γίνει μία συνάρτηση, με αναδρομική μορφή, που να υπολογίζει και να επιστρέφει την τιμή του ν-οστού όρου της ακολουθίας του Fibonacci. Κατόπιν, να γραφεί πρόγραμμα που να την χρησιμοποιεί. Δρ. Ελπινίκη Παπαγεωργίου 27

7 η Εργαστηριακή Ασκηση Προγραμματισμού Ι - Γλώσσα C Σκοπός: Χρήση αλφαριθμητικών (strings) ΑΛΦΑΡΙΘΜΗΤΙΚΑ 'Ενα αλφαριθμητικό (string) στη C είναι στην πραγματικότητα μία σειρά από χαρακτήρες των οποίων το τέλος υποδηλώνεται από την ύπαρξη του χαρακτήρα '\0'. Μία σταθερά τύπου string ορίζεται όπως έχουμε ήδη δει (συμβολισμός "..."), ενώ για να δηλώσουμε μία μεταβλητή τύπου string θα τη δηλώσουμε ως array χαρακτήρων. Το μέγεθος του array θα είναι το μέγιστο πλήθος χαρακτήρων που θέλουμε να χωράνε στο array συν ένα για το χαρακτήρα '\0'. 'Ετσι η δήλωση char my_string[50]; δηλώνει τη μεταβλητή my_string που χωράει 49 κανονικούς χαρακτήρες και το '\0'. Μία δήλωση μεταβλητής τύπου string μπορεί να έχει και αρχικοποίηση (με τους περιορισμούς που προαναφέρθησαν). Αυτή μπορεί να γίνει: με τον -πιο εύχρηστο- συμβολισμό char str[20] = "Hello"; Παρατηρούμε ότι δεν είναι απαραίτητο να βάλουμε το χαρακτήρα '\0', γιατί αυτό το κάνει ο compiler. 'Οπως και στους άλλους πίνακες έτσι και στα strings μπορούμε σε μία αρχικοποιημένη δήλωση να παραλείψουμε το πλήθος στοιχείων του array και ο compiler θα το συμπεράνει από την έκφραση που χρησιμοποιείται για να γίνει η αρχικοποίηση. Εκτύπωση printf ( Hello ); printf ( Ο αριθμός είναι: %s\n, str); Εισαγωγή scanf ( %s, str); ή scanf ( %s, &str[0]); *διαβάζει μέχρι το πρώτο κενό *προσοχή στην υπέρβαση του μεγέθους Παράδειγμα: #define MAX_CHARS 80 main () char str[max_chars]; int i; printf( Δώσε αλφαριθμητικό: ); scanf( %s, str); for (i = 0; i < 10; i++) printf( %s\n, str); Δρ. Ελπινίκη Παπαγεωργίου 28

Δεδομένου ότι τα strings είναι πίνακες δεν μπορούμε να χρησιμοποιήσουμε σ' αυτά τελεστές για να ελέγξουμε την ισότητα, να εκχωρήσουμε την τιμή ενός string σε κάποιο άλλο, κ.ο.κ. Για να κάνουμε αυτές τις λειτουργίες θα πρέπει να χρησιμοποιήσουμε συναρτήσεις που παρέχονται στη βασική βιβλιοθήκη της γλώσσας C. #include <string.h>. Οι πιο συχνά χρησιμοποιούμενες από αυτές είναι: α) strcpy(char str1[], char str2[]), η οποία αντιγράφει το string str2 στο string str1. Μετά την κλήση της συνάρτησης δηλαδή το str1 θα έχει τους ίδιους χαρακτήρες με το str2. β) strncpy(char str1[], char str2[], int n), με την οποία αντιγράφουμε το πολύ n χαρακτήρες από το str2 στο str1. Η συνάρτηση αυτή χρησιμοποιείται όταν δεν είμαστε βέβαιοι ότι το str1 έχει αρκετό χώρο διαθέσιμο για να αποθηκεύσει όλους τους χαρακτήρες που περιέχονται στο str2. 'Ετσι τη συνάρτηση strncpy θα τη χρησιμοποιούσαμε σε κάποια περίπτωση όπως η πιο κάτω: char str1[20], str2[50];... strncpy(str1, str2, 19); Η strncpy ενδέχεται να μην προσθέσει το χαρακτήρα '\0' στο τέλος του str1 αν το str2 έχει περισσότερους χαρακτήρες από n (εξαρτάται από την υλοποίηση του compiler). Για να είναι ασφαλής έτσι μία κλήση στη strncpy θα πρέπει να ακολουθείται από την εντολή str1[n] = '\0' γ) strcat(char str1[], char str2[]) με την οποία προσθέτουμε στο τέλος του string str1 το string str2. 'Ετσι, αν το str1 έχει την τιμή "Hello " και το str2 την τιμή "there!" τότε μετά την κλήση της strcat το str1 θα έχει την τιμή "Hello there!". Το str1 θα πρέπει να έχει αρκετό χώρο για να αποθηκεύσει τους έξτρα χαρακτήρες δ) strncat(char str1[], char str2[], int n) με την οποία προσθέτουμε το πολύ n χαρακτήρες του str2 στο τέλος του str1, το οποίο πρέπει να έχει αρκετό χώρο για να αποθηκεύσει τους έξτρα χαρακτήρες. Στο νέο τέλος του str1 προστίθεται ο χαρακτήρας '\0'. ε) size_t strlen(char s[]) η οποία επιστρέφει το πλήθος των χαρακτήρων που περιέχει το string s (ο χαρακτήρας '\0' δεν υπολογίζεται). Ο τύπος size_t ορίζεται από τον C compiler με βάση ήδη υπάρχοντες τύπους. συνήθως ορίζεται ως int ή unsigned int και είναι απόλυτα ασφαλές να εκχωρήσουμε το αποτέλεσμα της strlen (ή οποιασδήποτε άλλης συνάρτησης ή τελεστή επιστρέφει τύπο size_t) σε μία μεταβλητή τύπου int ή unsigned int στ) int strcmp(char str1[], char str2[]) που επιστρέφει έναν ακέραιο μικρότερο από το μηδέν αν το str1 είναι μικρότερο από το str2, 0 αν τα strings είναι ίσα και έναν ακέραιο μεγαλύτερο από το μηδέν αν το str1 είναι μεγαλύτερο από το str2. Η σύγκριση στα strings γίνεται με λεξικογραφική σειρά, συγκρίνονται δηλαδή χαρακτήρα προς χαρακτήρα μέχρι να βρεθεί κάποιος διαφορετικός ή να φτάσουμε στο τέλος του ενός string. Αν έχει βρεθεί διαφορετικός χαρακτήρας τότε το string στο οποίο ανήκει ο μικρότερος από τους δύο χαρακτήρες είναι το μικρότερο. Αν φτάσουμε στο τέλος του ενός string, τότε αν ταυτόχρονα Δρ. Ελπινίκη Παπαγεωργίου 29

φτάσαμε στο τέλος του άλλου string, τα strings είναι ίσα. αν όχι, τότε το string στο τέλος του οποίου φτάσαμε είναι το μικρότερο. ζ) int strncmp(char str1[], char str2[], int n) η οποία είναι αντίστοιχη της strcmp με τη διαφορά ότι συγκρίνονται το πολύ n χαρακτήρες από τα strings η) int atoi(char s[]) η οποία μας επιστρέφει την ακέραια τιμή που αναπαριστά το string s. Αν, π.χ. το s έχει τιμή "1201" η atoi(s) θα επιστρέψει τον ακέραιο 1201. Δεν μπορούμε να επιτύχουμε το ίδιο αποτέλεσμα με το συμβολισμό (int)s. Το s μπορεί να περιέχει πρόσημο και κενά πριν και μετά από αυτό θ) long atol(char s[]) η οποία μας επιστρέφει την τύπου long τιμή που αναπαριστά το string s. Ισχύουν οι ίδιες παρατηρήσεις με την atoi. ι) double atof(char s[]) που μας επιστρέφει την τύπου doyble τιμή που περιέχεται στο string s. Το s μπορεί να περιέχει οποιαδήποτε αναπαράσταση μιας double σταθεράς. Παράδειγμα 1 main() char str[50]; int i=0; gets(str); while (str[i]!= '\0') i++; printf("mikos %d", i); Παράδειγμα 2 #include <string.h> main() char str[256]; int n, en1, en2, i; gets(str); n = en1 = en2 = i = 0; while (str[i]!= '\0') if (str[i] >='0' && str[i] <= '9') n++; else if (str[i] >= 'a' && str[i] <= 'z') en1++; else if (str[i] >= 'A' && str[i] <= 'Z') en2++; Δρ. Ελπινίκη Παπαγεωργίου 30

i++; printf("ari8moi %d Mikra %d Kefalaia %d", n, en1, en2); char names[10][40]; Ένας πίνακας με10 αλφαριθμητικά, καθένα με 40 χαρακτήρες (με null). Γιά προσπέλαση καθορίζουμε μόνο τον αριστερότερο δείκτη στοιχείου. πχ. Για το 3 ο αλφαριθμητικό names[2], για το 1ο printf(names[0]). Παράδειγμα 3 #include <string.h> char str1[80], str2[80]; int i; printf("enter the first string: "); printf("enter the second string: "); gets(str1); gets(str2); printf("%s is %d chars long\n", str1, strlen(str1)); printf("%s is %d chars long\n", str2, strlen(str2)); i = strcmp(str1, str2); if(!i) printf("the strings are equal.\n"); else if(i<0) printf("%s is less than %s\n", str1, str2); else printf("%s is greater than %s\n", str1, str2); if(strlen(str1) + strlen(str2) < 80) strcat(str1, str2); printf("%s\n", str1); strcpy(str1, str2); printf("%s %s\n", str1, str2); Ασκηση σε αλφαριθμητικά και πίνακες Γράψτε μια συνάρτηση stringsearch η οποία παίρνει ως παραμέτρους μια συμβολοσειρά μήκους το πολύ 20 και ένα χαρακτήρα και επιστρέφει τη θέση στη συμβολοσειρά όπου εμφανίζεται για πρώτη φορά ο χαρακτήρας (ξεκινώντας απο το 0), ή -1 αν αυτός δεν εμφανίζεται στη συμβολοσειρά. Απαγορεύεται η χρήση συναρτήσεων από το string.h Γράψτε μια συνάρτηση main η οποία: διαβάζει από το πληκτρολόγιο μια συμβολοσειρά και ένα χαρακτήρα, χρησιμοποιεί την stringsearch για να βρεί τη θέση του χαρακτήρα στη συμβολοσειρά, αν αυτός υπάρχει, εκτυπώνει τη θέση του, αν αυτός δεν υπάρχει, εκτυπώνει σχετικό μήνυμα. Δρ. Ελπινίκη Παπαγεωργίου 31

#include<stdio.h> #define SIZE 20 int stringsearch (char word[], char letter); int main (int argc, char *argv[]) char word[size]; char letter; int position; printf("enter word: "); scanf("%19s", word); printf("enter letter: "); scanf(" %c", &letter); position = stringsearch(word,letter); if ( position == -1) printf(" '%c' does not appear in \"%s\"\n", letter, word); else printf(" '%c' appears at position %d in \"%s\"\n", letter, position, word); int stringsearch (char word[], char letter) int i; for (i=0; word[i]!= '\0'; i++) if (word[i] == letter) return i; return -1; Ασκήσεις για λύση 1. Να γίνει μια συνάρτηση που να δέχεται μια φράση σαν όρισμα και να επιστρέφει αν είναι καρκινική ή όχι (επιστρέφοντας μη μηδενικό ακέραιο ή μηδέν αντίστοιχα). Στην συνέχεια να γραφεί πρόγραμμα που να την χρησιμοποιεί. Σας υπενθυμίζουμε ότι καρκινική φράση ή παλίνδρομο λέγεται η φράση που μπορεί να διαβαστεί και ανάποδα (π.χ. "ΑΝΝΑ", "radar", "aman a plan a canal panama", το τελευταίο αφού εξαλειφθούν οι χαρακτήρες κενού διαστήματος). 2. Να γίνει ένα πρόγραμμα το οποίο να περιέχει μια συνάρτηση η οποία θα επιστρέφει το μήκος ενός string s (μην χρησιμοποιήσετε την strlen που υπάρχει στο string.h, φτιάξτε μια δικιά σας). Επίσης, να περιέχει κι άλλη συνάρτηση για αντιστροφή του αλφαριθμητικού s στη θέση του. Δρ. Ελπινίκη Παπαγεωργίου 32

8 η Εργαστηριακή Ασκηση Προγραμματισμού Ι - Γλώσσα C Σκοπός: Κατανόηση Δεικτών Κατανόηση Δεικτών σε αλφαριθμητικά ΔΕΙΚΤΕΣ Μεταβλητές οι οποίες περιέχουν την διεύθυνση αντικειμένων στην μνήμη «Η p δείχνει στην q», αν η p περιέχει τη διεύθυνση της q. τύπος *όνομα-μεταβλητής; π.χ. int *p; Τελεστές δεικτών: *(τιμή της διεύθυνσης), &(διεύθυνση της μεταβλητής) Όνομα διάταξης χωρίς δείκτη στοιχείου (index) ~ ουσιαστικά παράγεται δείκτης (pointer) ο οποίος δείχνει στην αρχή της διάταξης. Η C δεν επιτρέπει να περάσετε μια διάταξη ως όρισμα σε μία συνάρτηση, αλλά επιτρέπει το πέρασμα ενός δείκτη προς την διάταξη Π.χ. Η συνάρτηση gets() Παράδειγμα 1 int *p, q; p = &q; /* get q's address */ /* assign q a value using a pointer */ *p = 199; printf("q's value is %d", q); -------------------------------------- int *p; *p = 10; /* incorrect - p is not pointing to anything */ Παράδειγμα 2 char *cp, ch; int *ip, i; Δρ. Ελπινίκη Παπαγεωργίου 33

float *fp, f; double *dp, d; cp = &ch; ip = &i; fp = &f; dp = &d; printf("%p %p %p %p\n", cp, ip, fp, dp); float balance[10][5]; float *p; p = (float *) balance; *(p + (3*5) + 1) -------------------------------------- Δείκτες σε αλφαριθμητικά /* Να χρησιμοποιήσετε το ακόλουθο απόσπασμα κώδικα για να εκτυπώνετε ένα αλφαριθμητικό */ char str[] = "Pointers are fun"; char *p; int i; p = str; for(i=0; p[i]; i++) printf("%c", p[i]); Παράδειγμα 3 #include <string.h> char str1[] = "Pointers are fun to use"; char str2[80], *p1, *p2; /* make p point to end of str1 */ p1 = str1 + strlen(str1) - 1; p2 = str2; while(p1 >= str1) *p2++ = *p1--; /* null terminate str2 */ *p2 = '\0'; printf("%s %s", str1, str2); Δρ. Ελπινίκη Παπαγεωργίου 34

Παράδειγμα 4 char *p[][2] = "Red Delicious", "red", "Golden Delicious", "yellow", "Winesap", "red", "Gala", "reddish orange", "Cortland", "red", "Jonathan", "red", "", "" /* terminate the table with null strings */ ; #include <string.h> int i; char apple[80]; printf("enter name of apple: "); gets(apple); for(i=0; *p[i][0]; i++) if(!strcmp(apple, p[i][0])) printf("%s is %s\n", apple, p[i][1]); Παράδειγμα 5 #include <string.h> char *p = "stop"; char str[80]; do printf("enter a string: "); gets(str); while(strcmp(p, str)); Παράδειγμα 6 Τι κάνει το παρακάτω πρόγραμμα?? char text[10][80]; int i; for(i=0; i<10; i++) Δρ. Ελπινίκη Παπαγεωργίου 35

printf("%d: ", i+1); gets(text[i]); do printf("enter number of string (1-10) : "); scanf("%d", &i); i--; /* adjust value to match array index */ if(i>=0 && i<10) printf("%s\n", text[i]); while(i>=0); Φτιάξτε προγράμματα στα οποία να αρχικοποιείτε ένα αλφαριθμητικό και να χρησιμοποιείτε τα παρακάτω κομμάτια κώδικα για κάθε περίπτωση. char *p = str; while (* str!= \0 ) str++; printf( %d, str p ); void strcpy(char *s, char *t) int i=0; while ((s[i]=t[i])!= \0 ) i++; void strcpy(char *s, char *t) while ((* s++=*t++)!= \0 ) ; /* να δημιουργηθεί ένας πίνακας ακεραίων 10 θέσεων, να καταχωρηθούν σ αυτόν τιμές με τη χρήση δεικτών και να κληθεί μια συνάρτηση τύπου void στην οποία θα περαστεί σαν όρισμα ο πίνακας και η συνάρτηση θα βρίσκει τη μεγαλύτερη τιμή και σε ποια θέση του πίνακα είναι - εκμάθηση της επεξεργασίας πίνακα με τη χρήση δεικτών και του περάσματος ενός πίνακα σαν όρισμα σε μια συνάρτηση */ main() int a[10]; /* Το όνομα ενός πίνακα είναι η διεύθυνση του 1ου στοιχείου του πίνακα, δηλ. ισχύει a == &a[0] και γενικά a+i == &a[i] */ int i; void maximum(); clrscr(); for (i=0; i<10; i++) printf("\nδώσε την %dη τιμή του πίνακα : ", i); scanf("%d", a+i); /* end of for */ maximum(a); Δρ. Ελπινίκη Παπαγεωργίου 36

/* Στη συνάρτηση περνάμε το όνομα του πίνακα, δηλ. τη διεύθυνση του 1ου στοιχείου του πίνακα που είναι στην ουσία ένας δείκτης σ ακέραιο */ scanf("%d", &i); /* end of main */ void maximum(a1) int *a1; /* Το a1 είναι δείκτης σ ακέραιο και με τη βοήθειά του έχουμε απευθείας πρόσβαση στα στοιχεία του πίνακα a[i] */ int max, i_max, i; /* Τα max και i_max είναι τοπικές μεταβλητές */ max = *a1; i_max = 0; for (i=1; i<10; i++) if (*(a1+i) > max) /* Το *(a1+i) = a1[i] = a[i] */ max = *(a1+i); i_max = i; /* end of for */ printf("\nη μεγαλύτερη τιμή είναι : %d και είναι στη θέση : %d", \ max, i_max); /* end of maximum() */ Ασκήσεις για Λύση 1. Nα γραφεί συνάρτηση με όνομα strcmp() που θα δέχεται δύο αλφαριθμητικά σαν είσοδο και θα επιστρέφει 0 αν τα δύο αλφαριθμητικά είναι ίσα, -1 αν το πρώτο αλφαριθμητικό είναι μικρότερο από το δεύτερο και 1 αν το πρώτο αλφαριθμητικό είναι μεγαλύτερο από το δεύτερο. (θα χρησιμοποιηθούν δείκτες). 2. Να φτιάξετε ένα πρόγραμμα το οποίο θα «διαβάζει» από το πληκτρολόγιο μία μεγάλη πρόταση και θα βγάζει τα εξής στοιχεία: Α) Από πόσες λέξεις αποτελείται η πρόταση; (Σημείωση: Οι λέξεις διαχωρίζονται από ένα ή και περισσότερα κενά) Β) Ποιά είναι η μικρότερη και ποια η μεγαλύτερη λέξη σε πλήθος χαρακτήρων; Σημείωση: Το πρόγραμμα να επιλυθεί αυστηρά με χρήση δεικτών (pointers). 3. Εάν έχει γίνει η δήλωση int i, j, *p, *q; Τότε ποια από τα παρακάτω είναι σωστά ποια όχι και γιατί; p = &i p = &*&i i = p q = &p q = &j i = (&)j i = *&*&j i = *p++ + *q 4. Να τροποποιηθεί η bubble sort ώστε η ανταλλαγή τιμών να γίνεται με χρήση συνάρτησης (call by reference). 5. Να γίνει πρόγραμμα με χρήση συνάρτησης που αφού δέχεται τις τιμές τριών μεταβλητών a, b, και c να μεταφέρει την τιμή του a στο b, του b στο c και του c στο a. Δρ. Ελπινίκη Παπαγεωργίου 37

9 η Εργαστηριακή Ασκηση Προγραμματισμού Ι - Γλώσσα C Σκοπός: Κατανόηση δομών και typedef ΔΟΜΕΣ (STRUCTURES) Δομή είναι συλλογή από μία ή περισσότερες μεταβλητές, πιθανώς διαφορετικών τύπων, που ομαδοποιούνται με ένα μόνο όνομα. Οι δομές βοηθούν στην οργάνωση περίπλοκων δεδομένων: struct <ετικέτα δομής> <μέλη> struct Person char firstname[20]; char lastname[20]; char gender; int age; ; Δηλώσεις Μεταβλητών struct Person x; Πίνακας Δομών: struct Person people[40]; Άλλος δυνατός τρόπος: struct Person... x, people[40]; Αρχικοποίηση και Χρήση struct Person x = Μάκης, Ψ, Μ, 40; struct Person people[] = Μάκης, Ψ, Μ, 40, Κώστας, Α, Μ, 50; Χρήση: <όνομα δομή>.<μέλος> x.name x.age Δρ. Ελπινίκη Παπαγεωργίου 38

Εμφωλευμένες Δομές Οι δομές μπορεί να είναι αλληλένθετες, δηλαδή να φωλιάζονται η μια μέσα στην άλλη, δημιουργώντας πιο πολύπλοκες δομές: struct family struct Person father; struct Person mother; int numofchild; struct Person children[5]; ; Παράδειγμα εμφωλευμένης δομής struct family struct Person father; struct Person mother; int numofchild; struct Person children[5]; ; int main() struct Person x, y, z; struct family fml; fm1.numofchild = 2; strcpy(fml.father.firstname, Joe ); strcpy(fml.children[0].firstname, Marry ); Μεταβλητές τύπου δομής μπορούν να μεταβιβαστούν ως ορίσματα σε συναρτήσεις όπως επίσης και να επιστραφούν ως αποτελέσματα συναρτήσεων Μεταβίβαση ολόκληρης δομής ή δείκτη σε αυτή struct Person inc_age (struct Person x) x.age += 1; return x;... struct Person x1, x2; x2 = inc_age(x1); Παραδείγματα: /* να δημιουργηθεί μια δομή υπαλλήλου με τα εξής στοιχεία : επώνυμο, όνομα, ηλικία και μισθός και να καταχωρηθούν τιμές για 5 υπαλλήλους - να βρεθεί και να εκτυπωθεί το επώνυμο και το όνομα του υπαλλήλου που έχει Δρ. Ελπινίκη Παπαγεωργίου 39

τη μεγαλύτερη ηλικία καθώς και το επώνυμο και το όνομα του υπαλλήλου που έχει το μεγαλύτερο μισθό */ struct ypalilos char eponymo[15]; char onoma[10]; int age; long misthos; ; /* end of struct */ /* η δομή δηλώνεται πριν από τη main() και αποτελεί έναν νέο τύπο δεδομένων - μια δομή περιέχει πεδία, τα οποία μπορεί να είναι γνωστοί τύποι δεδομένων της C ή και άλλες δομές */ main() struct ypalilos ypal; /* η μεταβλητή ypal είναι του τύπου δεδομένων ypalilos, δηλ. είναι δομή (struct) */ int i, max_age, max_misthos; char max_age_eponymo[15]; /* το επώνυμο του υπαλλήλου που έχει τη μεγαλύτερη ηλικία */ char max_age_onoma[10]; /* το όνομα του υπαλλήλου που έχει τη μεγαλύτερη ηλικία */ char max_misthos_eponymo[15]; /* το επώνυμο του υπαλλήλου που έχει το μεγαλύτερο μισθό */ char max_misthos_onoma[10]; /* το όνομα του υπαλλήλου που έχει το μεγαλύτερο μισθό */ clrscr(); max_age=0; max_misthos=0; for (i=0; i<5; i++) printf("\nδώσε τα στοιχεία του %dου υπαλλήλου :", i); printf("\nεπώνυμο : "); scanf("%s", ypal.eponymo); printf("\nόνομα : "); scanf("%s", ypal.onoma); printf("\nηλικία : "); scanf("%d", &ypal.age); printf("\nμισθός : "); scanf("%ld", &ypal.misthos); printf("\n"); /* αφήνει μία σειρά κενή */ /* για να αποκτήσουμε πρόσβαση στα πεδία μιας δομής, γράφουμε το όνομα της δομής, μετά τελεία (.) και μετά το όνομα του πεδίου, π.χ. ypal.eponymo - τα πεδία μιας δομής αντιμετωπίζονται όπως όλοι οι τύποι δεδομένων της C */ if (ypal.age > max_age) Δρ. Ελπινίκη Παπαγεωργίου 40

max_age = ypal.age; strcpy(max_age_eponymo, ypal.eponymo); strcpy(max_age_onoma, ypal.onoma); /* η συνάρτηση strcpy() αντιγράφει τα περιεχόμενα του δεύτερου ορίσματός της, που είναι μια συμβολοσειρά χαρακτήρων, στο πρώτο όρισμά της - χρησιμοποιείται για να καταχωρούμε τιμές σε συμβολοσειρές χαρακτήρων */ if (ypal.misthos > max_misthos) max_misthos = ypal.misthos; strcpy(max_misthos_eponymo, ypal.eponymo); strcpy(max_misthos_onoma, ypal.onoma); /* end of for */ printf("\nο %s %s έχει τη μεγαλύτερη ηλικία : %d", \ max_age_eponymo, max_age_onoma, max_age); printf("\nο %s %s έχει το μεγαλύτερο βαθμό : %d", \ max_misthos_eponymo, max_misthos_onoma, max_misthos); /* end of main */ Ασκηση για την κατανόηση δομών Να γραφεί ένα πρόγραμμα, έστω το leather_store, το οποίο να ορίζει τον τύπο μιας δομής με τέσσερα μέλη: α) το όνομα ενός προϊόντος, β) τον κωδικό του, γ) την ποσότητα που βρίσκεται στην αποθήκη και δ) το κόστος του ανά τεμάχιο. Επίσης, να ορισθεί ένας γραμμικός πίνακας με Ν=500 (συμβολική σταθερά) στοιχεία, όπου το κάθε στοιχείο να είναι ίδιου τύπου με την παραπάνω δομή. Το πρόγραμμα θα πρέπει να περιέχει τις εξής συναρτήσεις: α) μια συνάρτηση για το γέμισμα του πίνακα με στοιχεία από την κονσόλα, β) μια συνάρτηση για την εκτύπωση του πίνακα υπό μορφή κατάστασης όπως στο παρακάτω παράδειγμα: Α/Α ΟΝΟΜΑ ΠΡΟΪΟΝΤΟΣ ΚΩΔΙΚΟΣ ΠΟΣΟΤΗΤΑ ΚΟΣΤΟΣ/ΤΕΜΑΧΙΟ ------------------------------------------------------------- 1 Τσάντα δερμάτινη 508104 86 80,75 2 Βαλίτσα δερμάτινη 705403 34 349,90 3 και γ) μια συνάρτηση για την ταξινόμηση (με την μέθοδο bubble sort) του πίνακα σε αύξουσα διάταξη ως προς το πεδίο του κωδικού του προϊόντος. Το κυρίως πρόγραμμα θα καλεί τις παραπάνω συναρτήσεις με την εξής σειρά: α, β, γ, β. Δρ. Ελπινίκη Παπαγεωργίου 41

10 η Εργαστηριακή Ασκηση Προγραμματισμού Ι - Γλώσσα C Σκοπός: Κατανόηση δεικτών σε συναρτήσεις Κατανόηση δεικτών σε δομές ΔΕΙΚΤΕΣ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ Εκτός από pointers σε δεδομένα μπορούμε να ορίσουμε και pointers σε συναρτήσεις. 'Ενας pointer σε συνάρτηση ορίζεται με μία δήλωση της μορφής τύπος (*όνομα)(τ1, τ2,..., τν) Η πιο πάνω δήλωση ορίζει τον pointer όνομα που δείχνει σε μία συνάρτηση η οποία επιστρέφει κάποιο δεδομένο τύπου τύπος και δέχεται v παραμέτρους, η πρώτη από τις οποίες είναι τύπου τ1, η δεύτερη τ2, κ.ο.κ. Η λίστα των τύπων μέσα στις παρενθέσεις μπορεί να παραλειφθεί, αλλά είναι καλό να δίνεται προκειμένου να έχουμε έλεγχο τύπων των παραμέτρων κατά την κλήση της συνάρτησης. Οι παρενθέσεις που περιβάλουν το *όνομα είναι απαραίτητες γιατί ο συμβολισμός τύπος *όνομα(τ1, τ2,..., τν) δεν ορίζει pointer σε συνάρτηση, αλλά είναι το πρότυπο μιας συνάρτησης που ονομάζεται όνομα, επιστρέφει δεδομένο τύπου τύπος * (δηλ. pointer σε δεδομένα τύπου τύπος) και δέχεται v παραμέτρους, η πρώτη από τις οποίες είναι τύπου τ1, κ.λ.π. Για να ορίσουμε ότι κάποιος pointer σε συνάρτηση δείχνει σε κάποια συγκεκριμένη συνάρτηση χρησιμοποιούμε το συμβολισμό function_pointer = function_name; (όπου function_pointer είναι ένας pointer σε συνάρτηση και function_name το όνομα κάποιας συνάρτησης, χωρίς να ακολουθείται από παρενθέσεις. Φυσικά επιτρέπεται μία εκχώρηση της μορφής function_pointer1 = function_pointer2; Για να καλέσουμε τώρα μία συνάρτηση που δείχνεται από έναν pointer σε συνάρτηση χρησιμοποιούμε το συμβολισμό (*function_pointer)(p1, p2,..., pν); 'Οταν χρησιμοποιούμε το συμβολισμό αυτό θα πρέπει να είμαστε απόλυτα βέβαιοι ότι ο pointer function_pointer δείχνει σε κάποια συνάρτηση, αλλιώς τα αποτελέσματα θα είναι καταστροφικά. Στο πρόγραμμα του σχήματος 23 φαίνεται η συνάρτηση sum, που δέχεται δύο παραμέτρους a και b τύπου double και έναν pointer f σε συνάρτηση που δέχεται ως όρισμα έναν double και επιστρέφει έναν double. Η συνάρτηση πιστρέφει την τιμή του ορισμένου ολοκληρώματος από a έως b της συνάρτησης που δείχνεται από τον pointer f, υπολογισμένη κατά αριθμητικό τρόπο. Η συνάρτηση main() καλεί τη συνάρτηση sum() να υπολογίσει το ορισμένο ολοκλήρωμα της exp(x) (ex) από 0 έως 2 και του λογαρίθμου με βάση 10 (log10(x)) από 10 έως 20 και εκτυπώνει τα αποτελέσματα. #include <math.h> double sum(double a, double b, double (*f)(double)) double step = (b - a) / 100, value = 0.0; while (a < b) Δρ. Ελπινίκη Παπαγεωργίου 42