Τι είναι ο υπολογιστής;

Σχετικά έγγραφα
Προγραμματισμός Ι. Θεματική ενότητα 4: Έλεγχος ροής Προτάσεις υπό συνθήκη διακλάδωσης

Προγραμματισμός Ι. Θεματική ενότητα 2: Μεταβλητές σταθερές Ι/Ο κονσόλας

Προγραμματισμός Ι. Θεματική ενότητα 3: Tελεστές. εκφράσεις

Διδάσκων: Δημήτριος Βαρσάμης

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

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

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

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

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

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

Προγραμματισμός Ι. Προτάσεις επανάληψης βρόχοι

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

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

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

Προγραμματισμός I (Θ)

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

TEI Σερρών - Τμήμα Πληροφορικής & Επικοινωνιών

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

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

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο)

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

Στόχοι και αντικείμενο ενότητας. Προτάσεις επανάληψης. Έλεγχος ροής προγράμματος. #5.. Εντολές Επανάληψης

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

Ερωτήσεις αυτοαξιολόγησης τετραπλής επιλογής για το μάθημα Προγραμματισμός I.

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

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

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

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

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

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

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

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

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

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

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

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

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 131 Αρχές Προγραµµατισµού I 3-2

Προγραμματισμός I (Θ)

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

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

Στόχοι και αντικείμενο ενότητας. Συντακτικό Γλώσσας. Αλφάβητο. #2.. Εισαγωγή στη C (Μέρος Πρώτο)

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

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

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

Εισαγωγή στην Πληροφορική

Οικονόμου Βαγγέλησ Διάλεξη Νο 2. Δομημένοσ Προγραμματιςμόσ - Διάλεξη 2

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

a = 10; a = k; int a,b,c; a = b = c = 10;

Προγραμματισμός Η/Υ. Ενότητα 5: Εντολές Επανάληψης

Προγραμματισμός Η/Υ. Ενότητα 2α: Εισαγωγή στη C (Μέρος Πρώτο)

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

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

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

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

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

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

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

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

Προγραμματισμό για ΗΜΥ

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

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

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

Η Γλώσσα C Μία Σφαιρική Ανασκόπηση

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

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

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

Δεδομένα, Τύποι και Τιμές

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

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

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

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

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

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

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

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

for for for for( . */

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

Αρχές Προγραμματισμού

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

8. Συνθήκες ελέγχου, λογικοί τελεστές

Προγραμματισμός Η/Υ. Ενότητα 4: Εντολές Επιλογής

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

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

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

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

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

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

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

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

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

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

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

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

Διαδικασία Ανάπτυξης Λογισμικού

Εισαγωγή στην γλώσσα προγραμματισμού C

Στόχοι και αντικείμενο ενότητας. Βασικές κατασκευές ΓΠ. Έλεγχος ροής προγράμματος. #4.. Εντολές Επιλογής

Transcript:

Σχολή Τεχνολογικών Εφαρµογών Τµήµα Πληροφορικής & Επικοινωνιών Προγραµµατισµός Ι (παρουσιάσεις διαλέξεων) ρ. Πάρις Μαστοροκώστας Επίκουρος Καθηγητής Σέρρες 2004

Τι είναι ο υπολογιστής; Οι κανόνες αποτελούν την καρδιά της επιστήµης, της κοινωνίας και της ισχύος σε οιαδήποτε µορφή. Ο υπολογιστής είναι µία ταχεία, ακούραστη µηχανή που ακολουθεί κανόνες. Τι είναι ο προγραµµατισµός Πρόγραµµα: Ακολουθία εντολών, µε τις οποίες ο υπολογιστής εκτελεί µία συγκεκριµένη εργασία και επιλύει ένα δοθέν πρόβληµα. Προγραµµατισµός: Κατάστρωση και συγγραφή προγραµµάτων.

Τι θα µάθετε 1) Να λύνετε προβλήµατα που περιγράφονται από κανόνες: γράφοντας σύνολα κανόνων (συναρτήσεις), οι οποίοι εφαρµόζονται σε σύνολα δεδοµένων (δοµές), χρησιµοποιώντας ταυτόχρονα και έτοιµα προγράµµατα (βιβλιοθήκες) 2) Θεµελιώδεις έννοιες, κοινές σε όλες τις γλώσσες προγραµµατισµού 3) Εξοικείωση µε ένα αποδοτικό Εργαλείο Προγραµµατισµού: Το περιβάλλον προγραµµατισµού της C++

Προγραµµατισµός: Κοινή λογική και καλλιτεχνία 1) Aνάλυση: (εύρεση του πυρήνα του προβλήµατος) Καθόρισε τις συγκεκριµένες εισόδους και εξόδους Καθόρισε τη σχέση εισόδου - εξόδου Τεµάχισε το πρόβληµα σε υποπροβλήµατα 2) Υλοποίηση: Γράψε το σύνολο κανόνων για κάθε υποπρόβληµα 3) Debug: Έλεγξε κάθε τµήµα ξεχωριστά. Στη συνέχεια συνέδεσέ τα και έλεγξέ τα έως ότου το συνολικό πρόγραµµα λειτουργήσει σωστά.

Ο πυρήνας ενός προβλήµατος Παράδειγµα: Να γραφεί πρόγραµµα που υπολογίζει το εµβαδό ενός σπιτιού, µε δεδοµένες τις διαστάσεις κάθε δωµατίου. Είσοδοι: Ο αριθµός των δωµατίων (ακέραιος αριθµός) Οι διαστάσεις κάθε δωµατίου (πραγµατικοί αριθµοί) Έξοδοι: Το εµβαδό του σπιτιού (πραγµατικοί αριθµοί)

Ανάλυση: Βρείτε τον πυρήνα Καταστείτε σίγουροι ότι καταλάβατε πραγµατικά το πρόβληµα! Απλοποιείστε το, διευκρινίστε τα σκοτεινά σηµεία, σκεφθείτε. Επαναλάβατε. Τεµαχίσατέτοσευποπροβλήµατα. Οι πρώτες σκέψεις δεν είναι ΠΟΤΕ οι καλύτερες. Παράδειγµα σπιτιού: Υποπρόβληµα 1: υπολογισµός του εµβαδού κάθε δωµατίου Υποπρόβληµα 2: πρόσθεση των εµβαδών των δωµατίων

Ανάλυση: Βρείτε τον πυρήνα Εργαλεία που βοηθούν στην περιγραφή του προβλήµατος Φυσική γλώσσα: κάνε αυτό, στη συνέχεια εκείνο, εκτός εάν, κ.λ.π. ιάγραµµα ροής Ψευδοκώδικας Παράδειγµα: Να µετατραπούν οι βαθµοί Farenheit σε βαθµούς Κελσίου

Εργαλείο ανάλυσης: : η φυσική γλώσσα - Ζήτησεαπότοχρήστητηθερµοκρασία σε βαθµούς F. - ιάβασε την τιµήπουδίνειο χρήστης. - Αποθήκευσε την τιµή σε θέση αποθήκευσης που καλείται degf. - Υπολόγισε τους βαθµούς C µε χρήση µαθηµατικής σχέσης. - Αποθήκευσε το αποτέλεσµα σε θέση αποθήκευσης που καλείται degc. - Τύπωσε το περιεχόµενο της degc.

Εργαλείο ανάλυσης: το διάγραµµα ροής Προτιµητέο εργαλείο για σύνθετα προβλήµατα µε περιορισµούς

Εργαλείο ανάλυσης: : ο ψευδοκώδικας print enter degrees in Farenheit read degf degc = (degf - 32) * 5 / 9 print degc

Υλοποίηση Μετατροπή του συνόλου κανόνων σε συντακτικό της γλώσσας C. Ο τρόπος µετατροπής εξάγεται διερευνώντας: Μεταβλητές, τύπους δεδοµένων, εκφράσεις, υποθετικές προτάσεις και προτάσεις ελέγχου ροής, συναρτήσεις κ.ά.

Χαρακτηριστικά της γλώσσας C 1) Μπορεί να χρησιµοποιηθεί και ως γλώσσα προγραµµατισµού χαµηλού επιπέδου, επιτρέποντας άµεση πρόσβαση στους πόρους του υπολογιστή. 2) Είναι σχετικά µικρή και εύκολη στην εκµάθηση. 3) Υποστηρίζει δοµηµένο προγραµµατισµό. 4) Είναι αποτελεσµατική, παράγοντας συµπαγή και γρήγορα στην εκτέλεση προγράµµατα. 5) Αποτελεί µαζί µε τη C++ τις ευρύτερα χρησιµοποιούµενες γλώσσες σε ερευνητικά και αναπτυξιακά προγράµµατα, γεγονός που έχει δηµιουργήσει µία πολλή µεγάλη εγκατεστηµένη βάση εφαρµογών που αναπτύχθηκαν µε αυτές τις γλώσσες και πρέπει να συντηρούνται και να εξελίσσονται.

Μεταγλωττιστής και Συνδέτης (Compiler & Linker) Η C είναι µεταγλωττισµένη γλώσσα, µε στόχο να είναι αναγνώσιµηκαικατανοητή. Compiler : πρόγραµµα µετατροπής αναγνώσιµο εκτελέσιµο απότονη/υ Compile: C αρχεία κειµένου.οbject file(s) Linking: object file(s).executable file

ιαδικασία αποσφαλµάτωσης (Debugging( Debugging) bug = σφάλµα debug = εύρεση και διόρθωση σφαλµάτων ύο είδη προγραµµατιστικών σφαλµάτων: Συντακτικά σφάλµατα: Σφάλµατα που οφείλονται σε παραβίαση των συντακτικών κανόνων (π.χ. λανθασµένη γραφή µίας εντολής). Ανιχνεύονται από το µεταγλωττιστή κατά το χρόνο µεταγλώττισης και αναφέρονται υπό µορφή λίστας (οπότε µπορούν να διορθωθούν προτού τρέξει το πρόγραµµα). Σηµασιολογικά σφάλµατα (semantic errors): Σφάλµατα που οφείλονται σε εσφαλµένη σχεδίαση της λύσης του προβλήµατος (π.χ. διαίρεση µε το µηδέν). Τα σφάλµατα αυτής της κατηγορίας δεν αναγνωρίζονται από το µεταγλωττιστή, εµφανίζονται αργότερα στο χρόνο εκτέλεσης και είναι δυσκολότερα στη διόρθωση καθώς απαιτούνται µεταβολές στη σχεδίαση και ακολούθως στον κώδικα).

Debug: Εύρεση και διόρθωση σφαλµάτων Κώδικας C Μεταγλώττιση Εκτέλεση, επανάληψη Γίνεται η µεταγλώττιση; ΟΧΙ ο µεταγλωττιστής αναφέρει τους λόγους. Τροποποίησε τον κώδικα και δοκίµασε εκ νέου ΝΑΙ. Λειτουργεί σωστά; ΟΧΙ ανάλυσε, τροποποίησε, δοκίµασε εκ νέου ΝΑΙ. Αλλά δουλεύει πάντοτε σωστά; Μπορείς να αποδείξεις ότι η ανάλυση είναι εύρωστη;

Ένα απλό πρόγραµµα σε C /* ********************************************* * This program prints out the sentence This is a test. * ********************************************* */ #include<stdio.h> void main() { printf( This is a test.\n ); }

Ένα απλό πρόγραµµα σε C /* This program prints out the sentence This is a test. */ #include<stdio.h> void main () { printf( This is a test.\n ); } To Σχόλιο (comment) είναι κείµενο ανάµεσα σε /* και */. Να χρησιµοποιείτε συχνά σχόλια για να επεξηγείτε το πρόγραµµά σαςκαιτα τµήµατά του. Ο µεταγλωττιστής δε λαµβάνει υπόψη τα σχόλια.

/* Προγραµµατισµός ς Ι This program prints out the sentence This is a test. */ #include<stdio.h> Ένα απλό πρόγραµµα σε C #include σηµαίνει διάβασε και από αυτό το αρχείο void main () { printf( This is a test.\n ); } stdio είναι ένα αρχείο (library) που παρέχει πρότυπες συναρτήσεις εισόδου/εξόδου (όπως η printf) Αρχείο µε κατάληξη.h ονοµάζεται αρχείο κεφαλίδας

Ένα απλό πρόγραµµα σε C /* This program prints out the sentence This is a test. */ #include<stdio.h> void main () { printf( This is a test.\n ); } Η εκτέλεση του προγράµµατος αρχίζει πάντοτε από τη συνάρτηση main(). ΟΛΑ τα προγράµµατα σε C ή C++ έχουν συνάρτηση main(), η οποία συνήθως καλεί άλλες συναρτήσεις.

Ένα απλό πρόγραµµα σε C #include<stdio.h> void main () { Όλες οι συναρτήσεις χρησιµοποιούν άγκιστρα για να σηµειώσουν την αρχή και το τέλος της συνάρτησης. printf( This is a test.\n ); } Tο τµήµαανάµεσα στα άγκιστρα ονοµάζεται σώµα (body) της συνάρτησης.

Ένα απλό πρόγραµµα σε C #include<stdio.h> void main () { printf( This is a test.\n n ); } Μία συνάρτηση είναι ένα σύνολο προτάσεων µε ένα δεδοµένο όνοµα, π.χ. main(), printf(). Ηπρότασηαυτήκαλεί τη συνάρτηση printf() γιανατυπώσειτοκαθορισµένο κείµενο. Τα ορίσµατα εισόδου (input arguments) περικλείονται από παρενθέσεις και προσδιορίζουν το προς εκτύπωση κείµενο και τη µορφή µε τηνοποίαθαεκτυπωθεί.

Ένα απλό πρόγραµµα σε C #include<stdio.h> void main () { printf( This is a test.\n ) ); } ΟΛΕΣ οι προτάσεις τελειώνουν µε ερωτηµατικό (semicolon) ; το οποίο ονοµάζεται σύµβολο τερµατισµού πρότασης. Λεπτοµέρειες της printf(): \n σηµαίνει µετακινήσου στην επόµενη γραµµή. Ονοµάζεται ακολουθία διαφυγής (escape sequence). Η έξοδος στην οθόνη είναι: >This is a test. >

Σύνταξη σχολίων Τα σχόλια πρέπει να χρησιµοποιούνται αφειδώς γιατί καταστούν τον κώδικα ευανάγνωστο και συνεισφέρουν στην επεξήγηση δυσνόητων σηµείων. /* Tο T /* σχόλιο */ αυτό είναι λανθασµένο */ /* Tο σχόλιο αυτό χρησιµοποιεί σωστή σύνταξη */ /* Οµοίως και αυτό. */

Σύνταξη σχολίων /* Tο σχόλιο /* αυτό */ είναι λανθασµένο */ σχόλιο κώδικας; Να ευθυγραµµίζετε τα σύµβολα των σχολίων και να µην τοποθετείτε ποτέ σχόλια µέσα σε σχόλια (φώλιασµα, nesting) γιατί µερικοί µεταγλωττιστές θα µπερδευτούν.

Παρατηρήσεις: Η γλώσσα C διαχωρίζει τα κεφαλαία γράµµατα από τα µικρά (case sensitive). Η εντολή Printf() ΕΝ είναι ίδια µε τηνprintf() (). Όλες οι εντολές στη C γράφονται µε µικρά γράµµατα! Η σωστή στηλοθεσία είναι πολύ σηµαντική καθώς καθιστά τον κώδικα ευανάγνωστο. Να γράφετε πάντοτε σχόλια στα προγράµµατά σας. Η εντολή printf() ανήκει στις µορφοποιούµενες συναρτήσεις εισόδου εξόδου. Ονοµάζεται µορφοποιούµενη γιατί δίνει τη δυνατότητα στο χρήστη να µορφοποιήσει την έξοδό της, δυνάµενη να εκτυπώσει µεταβλητές διαφόρων τύπων και µε διάφορους τρόπους, χρησιµοποιώντας κατάλληλα σύµβολα. υαδική της printf() είναι η scanf() (), η οποία λαµβάνει πληροφορία από την είσοδο (πληκτρολόγιο).

Παρατηρήσεις (συνέχεια): Προγραµµατισµός ς Ι Η πρόταση printf( ( "This" is a test.\n" " ); καλεί την printf() για να τυπωθεί το καθορισµένο κείµενο. Τα ορίσµατα εισόδου (input arguments) περικλείονται από παρενθέσεις και προσδιορίζουν το προς εκτύπωση κείµενο και τη µορφή µε την οποία θα εκτυπωθεί. Τέλος, το σύµβολο \n, που ανήκει στις ακολουθίες διαφυγής, σηµαίνει «µετακινήσου στην επόµενη γραµµή». Λεπτοµερής περιγραφή της λειτουργίας των συναρτήσεων εισόδου εξόδου δίνεται στη συνέχεια. Πέραν της include, µία σηµαντική οδηγία προς τον προεπεξεργαστή είναι η define, η οποία αντιστοιχίζει ένα όνοµα µε µία σταθερά ή µε µία σειρά χαρακτήρων. Οποτεδήποτε εµφανίζεται το όνοµα µέσα στον κώδικα, αντικαθίσταται αυτόµατα µε την τιµή της σταθεράς ή τη συµβολοσειρά.

Για παράδειγµα, εάν χρησιµοποιηθεί η λέξη TRUE στη θέση της τιµής 1 και η λέξη FALSE στη θέση της τιµής 0, θα δοθούν δύο define ως εξής: #define TRUE 1 #define FALSE 0 Εάν αντικατασταθεί ολόκληρη φράση, µπορεί να εµφανισθεί στην οθόνη µε χρήση της printf() (): #define TITLOS "Dpt" of Informatics and Communications\n n " printf( TITLOS ); To αποτέλεσµα είναι: Dpt of Informatics and Communications Μία συνηθισµένη χρήση της define είναι για τον καθορισµό του µεγέθους στοιχείων, όπως είναι η διάσταση ενός πίνακα, τα οποία µπορεί να αλλάξουν κατά την εκτέλεση του προγράµµατος.

Λεξιλόγιο της γλώσσας C εσµευµένες λέξεις (reserved words) Λέξεις κλειδιά (keywords) Τελεστές (operators) Αναγνωριστές (identifiers)

εσµευµένες λέξεις: πρέπει να αποφεύγεται η χρήση τους ως ονόµατα Ονόµατα συναρτήσεων πρότυπης βιβλιοθήκης (runtime function names), όπως printf() (), abs() κ.λ.π. Macro names. Είναι ονόµατα που περιέχονται σε αρχεία κεφαλίδας για ορισµό µακροεντολών, π.χ. EOF, INT_MAX. Τype names. Είναι ονόµατα τύπων σε ορισµένα αρχεία κεφαλίδας, π.χ. time_t, va_list. Ονόµατα εντολών προεπεξεργαστή (preprocessor). Είναι ονόµατα που χρησιµοποιεί προεπεξεργαστής της C και έχουν προκαθορισµένη σηµασία, π.χ. include, define. Ονόµατα που αρχίζουν µε το χαρακτήρα υπογράµµισης _ και έχουν δεύτερο χαρακτήρα τον ίδιο ή κεφαλαίο γράµµα, π.χ. _DATE_, _FILE_.

Λέξεις κλειδιά: Λεκτικές µονάδες που µόνες τους ή µε άλλες λεκτικές µονάδες χαρακτηρίσουν κάποια γλωσσική κατασκευή Π.χ. int: αναπαριστά τον ακέραιο τύπο δεδοµένων if-else else: χρησιµοποιούνται στον έλεγχο ροής προγράµµατος Οι λέξεις κλειδιά, αν και είναι ένας περιορισµός των γλωσσών, αυξάνουν την αναγνωσιµότητα και αξιοπιστία των προγραµµάτων ενώ ταυτόχρονα επιταχύνουν τη διαδικασία της µεταγλώττισης. Λέξεις κλειδιά όπως if, else, for, case, while, do έχουν γίνει κοινά αποδεκτές, διευκολύνοντας την εκµάθηση των γλωσσών προγραµµατισµού.

Λέξεις κλειδιά στην ANSI C: auto else register union break enum return unsigned case extern short void char float signed volatile const for sizeof while continue goto static default if struct do int switch double long typedef

Αναγνωριστές: Λεκτικές µονάδες που κατασκευάζει ο προγραµµατιστής. Αυτές οι λεκτικές µονάδες χρησιµοποιούνται συνήθως ως ονόµατα που ο προγραµµατιστήςδίνεισεδικέςτου κατασκευές, όπως µεταβλητές, σταθερές, συναρτήσεις και δικούς του τύπους δεδοµένων. Ένα όνοµα προσδιορίζει µοναδιαία (uniquely identifies), από το σύνολο των κατασκευών του προγράµµατος, την κατασκευή στην οποία αποδόθηκε, εξ ου και το όνοµα αναγνωριστής (identifier).

Κανόνες δηµιουργίας ευανάγνωστου προγράµµατος Αποφύγετε ονόµατα ενός χαρακτήρα, όπως i, j, x, y (εκτός από ειδικές περιπτώσεις που θα εξετασθούν αργότερα). Χρησιµοποιείτε εκφραστικά ονόµατα. Συγκεκριµένα: - ονοµάστε τη µεταβλητή που αναπαριστά την ταχύτητα ως velocity και τη µέγιστη τιµήτηςmax_velocity ή maxvelocity. - ονοµάστε τη συνάρτηση που εµφανίζει τα λάθη στην οθόνη display_error ή displayerror. Για καλύτερη αναγνωσιµότητα των µεταβλητών που αποτελούνται από δύο ή περισσότερες λέξεις αποφασίστε αν θα χρησιµοποιείτε τη µορφή display_error ή τη µορφή displayerror. Τηρείστε τη σύµβαση σε όλο το πρόγραµµα. Χρησιµοποιείστε µικρά γράµµατα για ονόµατα µεταβλητών.

Μεταβλητές Ίδια χρήση µε εκείνη της άλγεβρας: 3x +5 = y x και y είναι οι µεταβλητές Αλλά γενικευµένη: η µεταβλητή είναι µία θέση µνήµης για ένα δεδοµένο. Η τιµήτηςµπορεί να είναι άγνωστη έως ότου εκτελεσθεί το πρόγραµµα ( run-time ).

ήλωση µεταβλητών Με πρόταση ορισµού (τελειώνει πάντοτε µε ;) Η µορφή: data_type var, var, ; Παράδειγµα: int counter1, counter2; Πού; Οι µεταβλητές δηλώνονται στην αρχή µίας συνάρτησης, αµέσως µετά το εισαγωγικό άγκιστρο {

Στην C τα ονόµατα των µεταβλητών σχηµατίζονται από: τα γράµµατα του αλφαβήτου τα ψηφία 0 έως 9 το χαρακτήρα υπογράµµισης (underscore) Το όνοµα πρέπειναξεκινάµε γράµµα ή το χαρακτήρα υπογράµµισης (στη δεύτερη περίπτωση ο επόµενος χαρακτήρας πρέπει να είναι µικρό γράµµα). Το όνοµα δεν πρέπει να είναι ίδιο µεδεσµευµένη λέξη. Σηµαντικοί είναι µόνο οι πρώτοι 31 χαρακτήρες του ονόµατος. Οι υπόλοιποι δε λαµβάνονται υπόψη.

/******************************************* Hydra.c *******************************************/ #include < stdio.h > void main() { int heads; int eyes; heads = 3; /* ανάθεση τιµής */ eyes = heads * 2; /* υπολογισµός τιµής */ } printf( It has %d heads and %d eyes! \n", heads, eyes); Έξοδος: > It has 3 heads and 6 eyes!

/******************************************* Hydra.c *******************************************/ #include < stdio.h > void main() { int heads; int eyes; ήλωσε (declare) κάθε µεταβλητή. Γράψε µία πρόταση για να τεθεί το όνοµά τηςκαιτοείδοςτης heads = 3; /* ανάθεση τιµής */ eyes = heads * 2; /* υπολογισµός τιµής */ } printf( It has %d heads and %d eyes! \n", heads, eyes); Έξοδος: > It has 3 heads and 6 eyes!

/******************************************* Hydra.c *******************************************/ #include < stdio.h > void main() { int heads; int eyes; Μετά τον ορισµό, θέσε τιµές στις µεταβλητές heads = 3; /* ανάθεση τιµής */ eyes = heads * 2; /* υπολογισµός τιµής */ } printf( It has %d heads and %d eyes! \n", heads, eyes); Έξοδος: > It has 3 heads and 6 eyes!

Ονόµατα µεταβλητών Έγκυρα ονόµατα µεταβλητών: totalarea max_amount counter1 Counter1 _temp_in_f Μη έγκυρα ονόµατα µεταβλητών: $product total% 3rd Απαράδεκτα ονόµατα µεταβλητών: l x2 maximum_number_of_students_in_my_class

Τύποι µεταβλητών Υπάρχουν 4 βασικοί τύποι µεταβλητών στη γλώσσα C: Τύπος Integer Floating point Double Character Λέξη κλειδί στη C: int float double char

Ο τύπος του χαρακτήρα (char) Παριστάνει απλούς χαρακτήρες του αλφάβητου της γλώσσας. Βρίσκεται ανάµεσα σε απλά εισαγωγικά (π.χ. C, 2, *, ) ). ήλωση: char choice; ήλωση µεαρχικήτιµή: char choice= A ; Εκτύπωση: µε χρήση της συνάρτησης printf() και του προσδιοριστή (specifier) %c. printf( ( The character is %c\n, choice ); Εάν αντί του %c χρησιµοποιηθεί ο %d, η printf() θα εµφανίσει τον ASCII κωδικό του χαρακτήρα. Η πρόταση printf( ( The ASCII Code of %c is %d\n, choice,choice); θα τυπώσει The ASCII Code of A is 65

Ο τύπος του χαρακτήρα Εισαγωγή: µε χρήση της συνάρτησης scanf() και του προσδιοριστή (specifier) %c. Η πρόταση scanf( ( %c, &ch& ); διαβάζει από την κύρια είσοδο (πληκτρολόγιο) ένα χαρακτήρα και τον αποδίδει στη µεταβλητή ch.θα πρέπει να προσεχθεί η χρήση του & πριν από τη µεταβλητή. Ονοµάζεται τελεστής διεύθυνσης και προηγείται πάντοτε των µεταβλητών στην εντολή scanf() (). Αποθήκευση και ανάκληση ASCII χαρακτήρα: Ο µεταγλωττιστής απαιτεί 1 byte µνήµης για την αποθήκευση της τιµής µιας µεταβλητής χαρακτήρα. Η αποθήκευση και ανάκληση παρουσιάζεται στην επόµενη διαφάνεια:

Αποθήκευση και ανάκληση ASCII χαρακτήρα

Μη εκτυπούµενοι χαρακτήρες Οι σταθερές τύπου χαρακτήρα νέα γραµµή (new-line) και στηλοθέτης (tab) ανήκουν στην κατηγορία των µη εκτυπούµενων χαρακτήρων, τους οποίους η C αναπαριστά µε τις ακολουθίες διαφυγής (escape sequences) \n \t, αντίστοιχα. Η παρακάτω πρόταση δίνεται ως παράδειγµα χρήσης χαρακτήρων διαφυγής: printf( ( Write, \ a \\ is a backslash. \ \n ); Η πρόταση θα εµφανίσει στην κύρια έξοδο (οθόνη): Write, a \ is a backslash. ιπλό εισαγωγικό ιπλό εισαγωγικό Νέα γραµµή

Μη εκτυπούµενοι χαρακτήρες και αντίστοιχες ακολουθίες διαφυγής

Παράδειγµα:Να καταστρωθεί πρόγραµµα που να επιτελεί τα παρακάτω: Ζήτησεαπότοχρήστηέναχαρακτήρα Πάρε από το χρήστη το χαρακτήρα Τύπωσε το χαρακτήρα και τον ASCII κωδικό του Βρες τον επόµενο χαρακτήρα Τύπωσέ τον µαζί µε τονκωδικότου

/************************************************************ Το πρόγραµµα διαβάζει ένα χαρακτήρα και τυπώνει το χαρακτήρα και τον επόµενό του καθώς και τους ASCII κωδικούς τους. ************************************************************/ #include <stdio.h< stdio.h> void main() { char ch,next_ch; printf( ( Write a character:\t t ); scanf( ( %c,&ch ); printf next_ch=ch+1; /* βρίσκει τον printf } Για να τυπωθεί ο χαρακτήρας ένα στηλοθέτη δεξιότερα printf( ( The ASCII code of char %c is %d\n, ch, ch ); τον επόµενο χαρακτήρα */ printf( ( The ASCII code of char %c is %d\n, next_ch, next_ch );

Ο τύπος του ακεραίου ήλωση: δηλώνεται µε τη λέξη κλειδί int και χρησιµοποιείται για να παραστήσει ακέραιους αριθµούς, αρνητικούς ή θετικούς. Η περιοχή τιµών εξαρτάται από την αρχιτεκτονική του µηχανήµατος. Για έναν υπολογιστή µε λέξη16 bits η περιοχή τιµών του τύπου int είναι από -32767 έως +32767. Εάν πριν από τη λέξη int τοποθετηθεί ο προσδιοριστής long τότε οι ακέραιοι long int εξασφαλίζουν αποθηκευτικό χώρο 32 bits. Αντίστοιχα, ο προσδιοριστής unsigned χρησιµοποιείται πριν από τη λέξη int γιαναχαρακτηρίσειτηµεταβλητή χωρίς πρόσηµο, η οποία λαµβάνει τιµές από 0 έως 65535 για λέξη 16 bits. Σε περιβάλλοντα 32 bits, όπως τα WinXP, οι ακέραιοι αποθηκεύουν τιµές στο διάστηµα από -2.147.483.648 έως +2.147.483.648. Ένας ακέραιος short int είναι τουλάχιστον 16 bits και ο int είναι τουλάχιστον τόσο µεγάλος όσο ο short int.

Εκτύπωση: µε χρήση της συνάρτησης printf και των προσδιοριστών %d, %o, %x για την εµφάνιση σε δεκαδική, οκταδική και δεκαεξαδική µορφή, αντίστοιχα. Οι προσδιοριστές l (long), h (short), και u (unsigned) τοποθετούνται πριν από τους d, o, x. printf( ( dec dec=%d, octal=%o, hex=%x, num,num,num ); Εισαγωγή: µε χρήση της συνάρτησης scanf και του προσδιοριστή (specifier) %d. Η πρόταση scanf( ( %d, &num ); διαβάζει από την κύρια είσοδο (πληκτρολόγιο) σε δεκαδική µορφή και αποδίδει την τιµήστηνακέραιαµεταβλητή num. Ακέραια σταθερά: Όταν στον πηγαίο κώδικα γράφουµε έναναριθµό χωρίς δεκαδικό ή εκθετικό µέρος, ο compiler το χειρίζεται ως ακέραια σταθερά. Η σταθερά 245 αποθηκεύεται ως int, ενώ η σταθερά 100.000 αποθηκεύεται ως long int. Εάν ορίσουµε τη σταθερά 8965 ως 8965L, ο compiler δεσµεύει χώρο για long int.

Παρατήρηση: Υπάρχει η δυνατότητα να καθορισθεί ο αριθµός των ψηφίων που θα εκτυπωθούν, τοποθετώντας τον επιθυµητό αριθµό ανάµεσα στο % και το d. Εάν ο αριθµός είναι µικρότερος από τον απαιτούµενο αριθµό ψηφίων του ακέραιου, η επιλογή δε θα ληφθεί υπόψη. Στην αντίθετη περίπτωση, στις πλεονάζουσες θέσεις θα τοποθετηθούν κενά. Ο αριθµός που τοποθετείται στον προσδιοριστή %d ονοµάζεται καθοριστικό ελάχιστου πλάτους πεδίου. Με αυτόν τον τρόπο, σε διαδοχικές printf() θα υπάρξει ευθυγράµµιση των αποτελεσµάτων κατά στήλες. Οι προτάσεις printf( ( "dec" dec=%1d, octal=%4o, hex=%4x", num,num,num ); printf( ( "dec" dec=%4d, octal=%4o, hex=%4", num,num,num ); θα τυπώσουν αντίστοιχα: dec=46, octal= 56, hex= 2e dec= 46, octal= 56, hex= 2e

/************************************************************ Το πρόγραµµαεξετάζειτοµήκος του τύπου ακεραίου. ************************************************************/ #include <stdio.h< stdio.h> // για την printf #include <climits.h< climits.h> // limits.h για παλαιότερα συστήµατα void main(){ int number_int=int_max; // Mέγιστος ακέραιος, οριζόµενος στο climits.h short int number_short=shrt_max; // Μέγιστος short int long int number_long=long_max; // Μέγιστος long integer // ο τελεστής sizeof δίνει το µέγεθος ενός τύπου δεδοµένου ή µίας µεταβλητής printf( ( "int" is %d bytes\n",sizeof(int n",sizeof(int) ) ); printf( ( "short is %d bytes\n",sizeof(short n",sizeof(short) ) ); printf( ( "long is %d bytes\n",sizeof(long n",sizeof(long) ) ); printf( ( "\nmax" int:%d min int:%d\n",number_int,int_min n",number_int,int_min ); printf( ( "\nmax" short:%d min short:%d\n",shrt_max,shrt_min ); printf( ( "\nmax" long:%d min long:%d\n",number_long,long_min n",number_long,long_min ); } // τέλος της main

Αποτελέσµατα: Προγραµµατισµός ς Ι Ταυτίζονται τα bytes για int και long γιατί στην έκδοση 5 της C++ και µελειτουργικάwin95 και µεταγενέστερα ο int καταλαµβάνει 4 bytes.

Τύποι πραγµατικών αριθµών ήλωση: πραγµατικοίείναιοιαριθµοί που διαθέτουν κλασµατικό µέρος και εκφράζονται συνήθως στις ακόλουθες µορφές: Fixed-point number 123.456 0.00002 50000.0 Scientific notation 1.23456x10 2 2.0x10-5 2.0x10 4 Exponential notation 1.23456e+02 2.0e-5 5.0e+04 ΗγλώσσαC διαθέτει δύο τύπους για αναπαράσταση πραγµατικών αριθµών. Τον τύπο float για αριθµούς κινητής υποδιαστολής απλής ακρίβειας και τον τύπο double για αριθµούς κινητής υποδιαστολής διπλής ακρίβειας. Η πρόταση float plank=6.63e-34; 34; δηλώνει τη µεταβλητή plank ως απλής ακρίβειας και της δίνει την τιµή 6.63e-34. Η χρήση του προσδιοριστή long πριν από τον τύπο double χρησιµοποιείται για δήλωση µεταβλητής κινητής υποδιαστολής εκτεταµένης ακρίβειας, π.χ. long double plank;

Εκτύπωση: µεχρήσητηςprintf() και των προσδιοριστών %f για εµφάνιση σε fixed point µορφή, %e για εµφάνιση σε εκθετική µορφή, και %g για να ανατεθεί στο σύστηµα ναεπιλέξειµεταξύ των δύο προηγουµένων, µε προτεραιότητα στη µορφή µε τοµικρότερο µέγεθος. Αποθήκευση: ως συνηθισµένα µεγέθη αναφέρονται για τους µεν float τα 32 bits, 8 για εκθέτη και πρόσηµο και24 για τη βάση, για τους δε double τα 64 bits, µε τα επιπλέον 32 να χρησιµοποιούνται για αύξηση της ακρίβειας της βάσης. Πραγµατικές σταθερές: Πραγµατικοί αριθµοί όπως οι 0.12 45.68 9e-5 24e09 0.0034e-08 όταν εµφανίζονται στον πηγαίο κώδικα αποτελούν τις πραγµατικές σταθερές. Θεωρούνται από το µεταγλωττιστή ως double και δεσµεύουν τον αντίστοιχο χώρο.

/************************************************************** Το πρόγραµµα εξετάζειτοµήκος του τύπου κινητής υποδιαστολής. **************************************************************/ #include <stdio.h< stdio.h> #include <float.h> // για το µέγιστο και τον ελάχιστο float, double void main() { float num_float=flt_max; // Mέγιστος float double num_double=dbl_max; // Mέγιστος double printf( ( "float is %d bytes\n",sizeof(float n",sizeof(float) ) ); printf( ( "double is %d bytes\n",sizeof(double n",sizeof(double) ) ); printf("\nmax nmax float:%e min float:%e\n",num_float,flt_min); printf("\nmax nmax double:%e,min double:%e\n" num_dοuble,dbl_min); } //intro_prog_example_2.cpp

Αποτελέσµατα: Προγραµµατισµός ς Ι

Ι/Ο κονσόλας Η Ι/Ο κονσόλας αναφέρεται στις λειτουργίες που γίνονται στο πληκτρολόγιο και στην οθόνη του υπολογιστή. Εκτός από τις printf() και scanf() που χρησιµοποιήθηκαν προγουµένως (και αποτελούν τη φορµαρισµένη Ι/Ο κονσόλας γιατί µπορούν να διαβάζουν δεδοµένα σε διάφορες φόρµες), υπάρχει µία σειρά απλούστερων συναρτήσεων που αναπτύσσεται ακολούθως.

Οι συναρτήσεις getche, getch H συνάρτηση getche() διαβάζει ένα χαρακτήρα από την κύρια είσοδο (πληκτρολόγιο). Αναµένει έως ότου πατηθεί ένα πλήκτρο και στη συνέχεια επιστρέφει την τιµή του, εµφανίζοντας στην οθόνη το πλήκτρο που πατήθηκε. Το πρωτότυπο της getche() είναι το ακόλουθο: int getche(void); H getche() επιστρέφει µεν έναν ακέραιο αλλά το byte χαµηλής τάξης περιέχει τον χαρακτήρα. Η χρήση ακεραίων γίνεται για λόγους συµβατότητας µε τοναρχικόµεταγλωττιστή της UNIX C.

Οι συναρτήσεις getche, getch (συνέχεια) Το αρχείο κεφαλίδας της συνάρτησης getche() βρίσκεται στο conio.h. H συνάρτηση getch() αποτελεί παραλλαγή της getche() και βρίσκεται στο conio.h. Λειτουργεί όπως ακριβώς η getche µε τη διαφορά ότι η getch() δεν εµφανίζει τον πληκτρολογηθέντα χαρακτήρα στην οθόνη. Το πρωτότυπο της getch() είναι το ακόλουθο: int getch(void);

Η συνάρτ ρτηση getchar H συνάρτηση getchar() διαβάζει ένα χαρακτήρα από την κύρια είσοδο και τον επιστρέφει στο πρόγραµµα. Αποτελεί παραλλαγή της getche() (). Είναι η αρχική συνάρτηση εισόδου χαρακτήρων που βασίζεται στο UNIX. Το πρόβληµα µε τη συνάρτηση αυτή είναι ότι κρατά την είσοδο στην περιοχή προσωρινής αποθήκευσης µέχρι να δώσουµε επαναφορά κεφαλής. Έτσι, µετά την επιστροφή της getchar() περιµένουν ένας ή περισσότεροι χαρακτήρες στην ουρά εισόδου. Το πρωτότυπο της getchar() είναι το ακόλουθο: int getchar(void); Το αρχείο κεφαλίδας της συνάρτησης getchar() βρίσκεται στο stdio.h.

Η συνάρτηση putchar H συνάρτηση putchar() εµφανίζει στην οθόνη το χαρακτήρα που έχει ως όρισµα (π.χ. c), στην τρέχουσα θέση του δροµέα. Το πρωτότυπο της putchar() είναι το ακόλουθο: int putchar(int c); H putchar() επιστρέφει µεν έναν ακέραιο αλλά το byte χαµηλής τάξης περιέχει τον χαρακτήρα. Η χρήση ακεραίων γίνεται για λόγους συµβατότητας µε τοναρχικόµεταγλωττιστή της UNIX C. Το αρχείο κεφαλίδας της συνάρτησης putchar() βρίσκεται στο stdio.h.

Η συνάρτηση kbhit H συνάρτηση kbhit() (keyboard hit) ελέγχει κατά πόσον ο χρήστης έχει πατήσει κάποιο πλήκτρο. Εφόσον έχει πατήσει κάποιο πλήκτρο η συνάρτηση επιστρέφει ως αληθής, σε αντίθετη περίπτωση επιστρέφει ως ψευδής.. Η συνάρτηση kbhit() χρησιµοποιείται κυρίως για να διακόπτει ο χρήστης το πρόγραµµα κατά το δοκούν. Το πρωτότυπο της kbhit() είναι το ακόλουθο: int kbhit(void); Το αρχείο κεφαλίδας της συνάρτησης kbhit() βρίσκεται στο conio.h.

Παράδειγµα: Το ακόλουθο πρόγραµµα παίρνει χαρακτήρες από το πληκτρολόγιο και µετατρέπει τα κεφαλαία σε µικρά και τούµπαλιν. Το πρόγραµµασταµατά µόλις πληκτρολογηθεί µία τελεία. Το αρχείο-κεφαλίδα ctype.h απαιτείται για τη συνάρτηση islower() (), που αληθεύει αν το όρισµάτηςείναισεµικρά γράµµατα, και τις συναρτήσεις toupper() (), tolower() (), που µετασχηµατίζουν τα γράµµατα. (να µη γίνει ιδιαίτερη µνεία για την επαναληπτική πρόταση και την υπό συνθήκη διακλάδωση. Θα µελετηθούν εκτενώς αργότερα.) #include <stdio.h< stdio.h> #include <conio.h< conio.h> #include <ctype.h< ctype.h> void main() { char ch; printf( ( "Start writing letters without ENTER\n\n"); do { ch=getche getche(); printf( ( " -> > " ); if (islower(ch( islower(ch)) putchar(toupper(ch)); else putchar(tolower(ch)); } while (ch( ch!='.'); // τέλος του βρόχου µε το χαρακτήρα '.' }

Αποτελέσµατα: Προγραµµατισµός ς Ι

Τελεστές (operators) Εκφράσεις (expressions) Σύµβολα ή λέξεις που αναπαριστούν συγκεκριµένες διεργασίες, οι οποίες εκτελούνται πάνω σε ένα ή περισσότερα δεδοµένα. Τα δεδοµένα καλούνται τελεστέοι (operands) και µπορούν να είναι µεταβλητές, σταθερές ή ακόµη και κλήσεις συναρτήσεων. Οι τελεστές χρησιµοποιούνται για το σχηµατισµό εκφράσεων. Μία έκφραση, εν γένει, αποτελείται από έναν ή περισσότερους τελεστέους και προαιρετικά από έναν ή περισσότερους τελεστές. Κάθε έκφραση έχει µία τιµή, η οποία υπολογίζεται µε ορισµένους κανόνες.

Σύµβολα συνηθισµένων τελεστών

Συµβολισµοί στο σχηµατισµό εκφράσεων Ένας δυαδικός (binary) τελεστής µπορεί να τοποθετηθεί: Μεταξύ των δεδοµένων στα οποία ενεργεί, όπως στην έκφραση x+y, οπότε έχουµε τη σηµειογραφία ένθεσης ή ένθετου τελεστή (infix notation). Πριν από τους τελεστέους, όπως στην έκφραση +x y, y οπότε έχουµε τησηµειογραφία πρόθεσης ή προπορευόµενου τελεστή (prefix notation). Μετά από τους τελεστέους, όπως στην έκφραση x y+ x y+, οπότε έχουµε τη σηµειογραφία επίθεσης ή παρελκόµενου τελεστή (postfix notation).

Προσοχή: Καλύτερη πρακτική: να µη χρησιµοποιούνται τελεστές σε µεικτούς τύπους: out_int = my1_int + my2_int; // καλό out_float = my_double / my_int; // κακό!!κιν ΥΝΟΣ!!: Όταν γίνεται διαίρεση ακεραίων το αποτέλεσµα είναι το πηλίκο, δηλαδή 5 / 2 = 2 κι όχι 2.5 Για να ληφθεί ως αποτέλεσµα αριθµός κινητής υποδιαστολής, τουλάχιστον έναςαπότουςτελεστέουςπρέπειναείναιαριθµός κινητής υποδιαστολής: 5.0 / 2 υπολογίζεται ως 2.5

Οι εκφράσεις είναι συχνά φωλιασµένες (nested): (((n+5)<=a) && q) H έκφραση αυτή Υπολογίζεται και γίνεται ένας όρος: (((n+5)<=a) && q) στη συνέχεια η έκφραση υπολογίζεται και γίνεται ένας όρος: (((n+5)<=a) && q)

Προτεραιότητα (precedence) και προσεταιριστικότητα (associativity) Πώς θα υπολογισθεί η έκφραση 17 * 8-2; Είναι 17*(8-2) ή (17*8)-2 ; Οι ανωτέρω εκφράσεις οδηγούν σε διαφορετικά αποτελέσµατα. Κατά συνέπεια απαιτούνται κανόνες. Η σειρά εφαρµογής των τελεστών ονοµάζεται εφαρµοστική σειρά (applicative order).

Προτεραιότητα και προσεταιριστικότητα τελεστών στη C

Προτεραιότητα και προσεταιριστικότητα Παραδείγµατα: X =17-2 * 8 Aπάντηση: X=17-(2*8), X=1 Y = 17-2 - 8 Aπάντηση: Y = (17-2) 2)-8, Y=7 Z = 10 + 9 * ((8 + 7) % 6) + 5 * 4 % 3 *2 + 1 (;) Μπερδευτήκατε; Τότε χρησιµοποιείστε παρενθέσεις στον κώδικά σας.

Τελεστές αύξησης και µείωσης Τελεστής αύξησης (increment operator): ++ Αντί για num = num + 1; γράφουµε num++; Τελεστής µείωσης (decrement operator): -- Αντί για Γράφουµε num = num - 1; num-- --; Μήπως γίνεται πλέον φανερό από πού έλαβε η C++ το όνοµάτης;

Παράδειγµα: Στην ακολουθία εκφράσεων που παρουσιάζεται ακολούθως παρουσιάζεται ενδεικτικά η λειτουργία των προπορευόµενων και παρελκόµενων τελεστών µοναδιαίας αύξησης και µείωσης.

Παράδειγµα: Να προσδιορισθεί η τιµή τωνx και z µετά την εκτέλεση κάθε µίας από τις παρακάτω προτάσεις, θεωρώντας ότι, πριν την εκτέλεση της κάθε πρότασης, οι τιµές των x και y είναι το 10 και 20 αντίστοιχα. α) z = ++x + y; β) z = --x x + y; γ) z = x++ + y; δ) z = x--x + y; Λύση: Στην περίπτωση του προπορευόµενου τελεστή, το σύστηµα πρώτα εκτελεί την αύξηση ή µείωση και µετά χρησιµοποιεί τη νέα τιµή της µεταβλητής στον υπολογισµό της τιµής της έκφρασεις (προτάσεις α και β). Αντίθετα, στην περίπτωση του παρελκόµενου τελεστή το σύστηµα πρώτα χρησιµοποιεί την τιµή της µεταβλητής για τον υπολογισµό τηςτιµής της έκφρασης και µετά εκτελεί την αύξηση ή µείωση της τιµής της µεταβλητής (προτάσεις γ και δ).

Αποτελέσµατα: Προγραµµατισµός ς Ι

Τελεστές ανάθεσης (assignment) x* = 10; εκτελεί την πράξη του πολλαπλασιασµού µεταξύ των x και 10 και εκχωρεί το αποτέλεσµα στοx. Αντιστοιχεί στην πρόταση x = x * 10; x* = y + 1;Αντιστοιχεί στην πρόταση x = x * (y + 1); κι ΟΧΙ στην πρόταση x = x * y + 1; Τελεστές ανάθεσης δηµιουργούν κι οι τελεστές διαχείρισης δυαδικών ψηφίων (bitwise operators). Οι τελεστές αυτοί είναι: >>= <<= &= ^= =.

Τελεστές ανάθεσης (συνέχεια) Οι τελεστές ανάθεσης µαζί µε τους τελεστές αύξησης/µείωσης γίνονται αιτία δηµιουργίας παρενεργειών (side effects), για το λόγο αυτό αναφέρονται και ως παρενεργοί τελεστές (side effect operators). Οι παρενέργειες αυτές έχουν ως αποτέλεσµα την απροσδιόριστη συµπεριφορά του συστήµατος ως προς τον τρόπο υπολογισµού της τιµής της µεταβλητής i σε εκφράσεις όπως: i = n[i++]; ή i = ++i + 1;

Συσχετιστικοί τελεστές (relational operators) Τελεστής < > <= >= ==!= ράση Μικρότερο από Μεγαλύτερο από Μικρότερο ή ίσον από Μεγαλύτερο ή ίσον από Ίσο διάφορο Το αποτέλεσµαείναιπάντοτεείτεαληθεσ (ΤRUE) είτε ΨΕΥ ΕΣ (FALSE)

Συσχετιστικοί τελεστές Παράδειγµα: Η τιµή της έκφρασης (3 < 2) είναι ΨΕΥ ΗΣ Η τιµή της έκφρασης (2 = = 2) είναι ΑΛΗΘΗΣ Στη C (και σε πολλές άλλες γλώσσες), Η τιµή ΑΛΗΘΗΣ αντιστοιχεί στον ακέραιο 1 Η τιµή ΨΕΥ ΗΣ αντιστοιχεί στον ακέραιο 0

Συσχετιστικοί Αριθµητικοί Τελεστές: ΚΑΙ ΟΙ ΥΟ χρησιµοποιούν αριθµητικές εισόδους: Παράδειγµα: (num < 10) και (num + 10) (όπου num είναι µία ακέραια µεταβλητή) Ωστόσο, οι συσχετιστικές έξοδοι είναι µόνο TRUE/FALSE. (number < 10) δίνει TRUE ή FALSE (0/1) (number + 10) δίνει οποιοδήποτε αριθµό

Λογικοί τελεστές ιαφορετικοί από τους συσχετιστικούς τελεστές καθώς έχουν εισόδους True/False και εξόδους True/False. Τελεστής ράση Πίνακας αληθείας &&! AND OR NOT p q p&&q p q!p (and) (or) (not) T T T T F T F F T F F T F T T F F F F T

Λογικοί τελεστές Παραδείγµατα: int x,y; x=10; y=-8; Υπολογισµός των παρακάτω εκφράσεων: (x+5) < (12-y) (10+5) < (12- (-8)) 15< 20 TRUE (x>5) (y>10) (10>5) (-8>10) (TRUE) (FALSE) TRUE

Τελεστής µετατροπής τύπου (typecasting) Ο τελεστής µετατροπής τύπου ή cast τελεστής, όπως αποκαλείται, είναι µοναδιαίος κι έχει τη µορφή (τύπος δεδοµένων), π.χ. (float). Τοποθετείται µπροστά από µία έκφραση για να µετατρέψει την τιµή της στον περικλειόµενο σε παρενθέσεις τύπο. Η µετατροπή ισχύει αποκλειστικά στο σηµείο εφαρµογής της, όπως φαίνεται στο ακόλουθο παράδειγµα: Παράδειγµα: int i,j; µετατροπή των i και j σε float float f1,f2,f3; i=5; j=2; fl = i/j + 0.5; /* αποτέλεσµα: 2.5 */ f2 = (float)i/(float)j + 0.5; /* αποτέλεσµα : 3.0 */ f3 = i/j + 0.5; /* αποτέλεσµα : 2.5 */

Παράδειγµα: Στον κώδικα που ακολουθεί αποδεικνύεται ότι η µετατροπή τύπου ισχύει για όλους τους τύπους δεδοµένων. #include <stdio.h< stdio.h> void main(){ char x='a',y A',y; int i=78; float f1; y=(char)i char)i; printf( ( "\ni" ni=%d y=%c\n",i,y ); f1=(float)x float)x; printf( ( "x=%c f1=%f\n",x,f1 ); } Ο ASCII χαρακτήρας µε δεκαδικό ισοδύναµο 78

Τελεστής sizeof Ο τελεστής sizeof είναι µοναδιαίος και δρα: α) σε έκφραση, π.χ. sizeof(x+y) και β) σε τύπο δεδοµένων, πχ. sizeof(int) Σε κάθε περίπτωση, επιστρέφει τον αριθµό τωνbytes που η τιµή τήςέκφρασηςή ο τύπος των δεδοµένων καταλαµβάνει στη µνήµη. Προσοχή θα πρέπει να δοθεί στο γεγονός ότι το σύστηµα δεν υπολογίζει την τιµή της έκφρασης κι έτσι πιθανή ύπαρξη παρενεργειών τελεστών δε δηµιουργεί παρενέργειες. Μπορεί να βρεθεί το µέγεθος σε bytes ενός πίνακα χρησιµοποιώντας τον τελεστή sizeof. Για παράδειγµα, αν θεωρηθεί ο πίνακας int ar[5]; η έκφραση sizeof(ar) δίνει τιµή 20 επειδή ο πίνακας αποτελείται από 5 ακεραίους των 4 bytes.

Τελεστής sizeof (συνέχεια) Στη sizeof θα πρέπει να περιλαµβάνεται µόνο το όνοµα του πίνακα. Αν περιληφθεί δείκτης ενός στοιχείου, τότε θα εξαχθεί το µέγεθος του στοιχείου. Για παράδειγµα, η έκφραση sizeof(ar[0]) δίνει τιµή 4. Χρησιµοποιώντας ένα συνδυασµό των παραπάνω µπορεί να βρεθεί ο αριθµός των στοιχείων του πίνακα. Η έκφραση sizeof(ar)/sizeof(ar[0]) δίνει 5, τον αριθµό δηλαδή των στοιχείων του πίνακα ar.

Παράδειγµα: Ο κώδικας που ακολουθεί δίνει το µέγεθος των 4 βασικών τύπων δεδοµένων της C. #include <stdio.h> void main() { printf( "\nsize" of char = %d",sizeof(char) ); printf( "\nsize" of int = %d",sizeof(int) ); printf( "\nsize" of float = %d",sizeof(float) ); printf( "\nsize" of double = %d",sizeof(double) ); }

Προτάσεις ελέγχου ροής Ο πιο συνηθισµένος τρόπος εκτέλεσης είναι ο ακολουθιακός: δύο ή περισσότερες προτάσεις βρίσκονται διατεταγµένες η µία µετά την άλλη και εκτελούνται διαδοχικά.

Προτάσεις ελέγχου ροής Ωστόσο, ορισµένες φορές επιβάλλεται να γίνουν λογικές επιλογές (µε χρήση λογικών τελεστών και τελεστών συσχέτισης). Παράδειγµα: ΕΑΝ στο σηµατοδότη βρίσκεται ο ΓΡΗΓΟΡΗΣ ΤΟΤΕ µπορείς να διασχίσεις την οδό ΑΛΛΙΩΣ περίµενε αλλαγή του σηµατοδότη Για να επιτευχθεί οποιαδήποτε διαφοροποίηση από την ακολουθιακή εκτέλεση απαιτούνται ειδικές κατασκευές. Ορισµένες από αυτές τις κατασκευές διασφαλίζουν ταυτόχρονα τη δόµηση του προγράµµατος, µε κύριο στόχο: η δοµή του πηγαίου κώδικα να µας βοηθά να κατανοήσουµε τι κάνει το πρόγραµµα. Οι κατασκευές διακρίνονται σε δύο βασικές κατηγορίες: 1) την επανάληψη (looping) 2) την υπό συνθήκη διακλάδωση (conditional branching)

Προτάσεις ελέγχου ροής στη C Προτάσεις διακλάδωσης υπό συνθήκη if else switch case Προτάσεις επανάληψης while do while for Προτάσεις διακλάδωσης χωρίς συνθήκη break continue goto

Επιλεκτική εκτέλεση δύο προτάσεων if Ε1 then Π1 else Π2

Επιλεκτική εκτέλεση πολλών προτάσεων µε ένθεση if Ε1 then Π1 else if E2 then Π2 else Π0

Παράδειγµα:Να περιγραφεί µε ψευδοκώδικα η διεργασία που πρέπει να ακολουθήσει ο υπολογιστής για να διαπιστώσει κατά πόσο ένα δεδοµένο έτος είναι δίσεκτο ή όχι. Να χρησιµοποιηθεί η κατασκευή if else. Λύση: Εάν αναπαρασταθεί το έτος µε την ακέραια µεταβλητή year και ο τελεστής υπολοίπου (modulo) µε τοσύµβολο %, η περιγραφή µπορεί να γίνει ως ακολούθως: IF ((year % 400) == 0) THEN το έτος είναι δίσεκτο ELSE IF ((year % 100) == 0) THEN το έτος δεν είναι δίσεκτο ELSE IF ((year % 4) == 0) THEN το έτος είναι δίσεκτο ELSE το έτος δεν είναι δίσεκτο

Yπό συνθήκη διακλάδωση if - else Μία δήλωση, τρία τµήµατα: συνθήκη if (light_color==green) { cross_the_street(); } else { wait_for_light_to_change(); } Σε απλή πρόταση τα άγκιστρα περιττεύουν

Yπό συνθήκη διακλάδωση if - else Μία δήλωση, τρία τµήµατα: συνθήκη if (light_color==green) { cross_the_street(); } ΑΛΗΘΕΣ else (ΤRUE) ένα µπλοκ προτάσεων { wait_for_light_to_change(); } (ΤRUE) ΤΜΗΜΑ : µία πρόταση ή

Yπό συνθήκη διακλάδωση if - else Μία δήλωση, τρία τµήµατα: if (light_color==green) { cross_the_street(); } else { wait_for_light_to_change(); } συνθήκη ΨΕΥ ΕΣ (FALSE) ΤΜΗΜΑ :µία πρόταση ή ένα µπλοκ προτάσεων ΑΛΗΘΕΣ ΤΜΗΜΑ : µία πρόταση ή ένα µπλοκ προτάσεων

Yπό συνθήκη διακλάδωση if - else Μερικές φορές δεν υπάρχει else, δηλαδή δεν υπάρχει ΨΕΥ ΕΣ τµήµα: Παράδειγµα: if (gas_tank_empty == TRUE) fill_up_tank(); Εάν η συνθήκη είναι ψευδής (π.χ. το ντεπόζιτο της βενζίνης είναι άδειο) δε γίνεται καµία ενέργεια.

Yπό συνθήκη διακλάδωση if - else Όταν υπάρχουν περισσότερα από δύο τµήµατα και απαιτούνται ένθετες (φωλιασµένες) προτάσεις if/else. Μπορεί να αντικατασταθεί το ζεύγος else { if (συνθήκη) { προτάσεις; } } µε την περισσότερο ευανάγνωστη µορφή: else if (συνθήκη) { προτάσεις;} Π.χ. if (people<5) <get < a car>; else if (people<15) <get < a van>; else if (people<50) <get < a bus>; else <cancel_event>;

Προτάσεις υπό συνθήκη διακλάδωσης if(συνθήκη)πρόταση; if (συνθήκη) { προτάσεις; προτάσεις; } if (συνθήκη) { προτάσεις; προτάσεις; } else { προτάσεις; προτάσεις;... }; 3 µορφές Σηµειώστε ότι η συνθήκη βρίσκεται πάντοτε ανάµεσα σε παρενθέσεις, ΌλαταΑΛΗΘΗ τµήµατα και όλα τα ΨΕΥ Η τµήµατα είναι µία µόνο πρόταση ή ένα µπλοκ προτάσεων {}

Παράδειγµα:Να γραφεί πρόγραµµα που υπολογίζει το µέγιστο ανάµεσα σε τρεις ακέραιους #include <stdio.h< stdio.h> void main() { } int a,b,c; scanf( %d %d\n,&a); scanf( %d %d\n,&b); scanf( %d %d\n,&c); if (a>b) { } if (a>c) printf( max(%d,%d,%d) = %d\n,a,b,c,,a,b,c,a ); else printf( max(%d,%d,%d) = %d\n,a,b,c,,a,b,c,c ); else if (b>c) printf( max(%d,%d,%d) = %d\n,a,b,c,,a,b,c,b ); else printf( max(%d,%d,%d) = %d\n,a,b,c,,a,b,c,c );

Υποθετικός τελεστής Ο υποθετικός τελεστής (?:?:) αποτελείται από δύο σύµβολα. Ανήκει στην κατηγορία των τελεστών που αποτελούνται από συνδυασµό συµβόλων και δεν ακολουθούν καµία από τις postfix, prefix ή infix σηµειογραφίες. Όταν τα σύµβολα ή οι λέξεις του τελεστή είναι διάσπαρτα στους τελεστέους στους οποίους εφαρµόζεται ο τελεστής, λέµε ότιο τελεστής είναι σε µεικτή σηµειγραφία (mixfix notation).

Υποθετικός τελεστής (συνέχεια) Η έκφραση που σχηµατίζει ο υποθετικός τελεστής έχει τη µορφή: εκφρ1? εκφρ2 : εκφρ3 Η τιµή της παραπάνω έκφρασης είναι η τιµή τηςεκφρ2, εάν η εκφρ1 είναι αληθής, αλλιώς είναι η τιµήτηςεκφρ3. Η εκφρ1 αποτελεί τη συνθήκη ελέγχου. Έτσι η έκφραση x>z? x : z έχει τιµή x, εάν το x>z είναι αληθές, διαφορετικά έχει τιµή z.

Παράδειγµα: Nα γραφεί κώδικας που βρίσκει το µεγαλύτερο δύο και τριών ακεραίων αριθµών και τον τυπώνει. ύο αριθµοί: printf( ( maximum is %d\n, (num1>num2)?num1:num2 ); Τρεις αριθµοί: max=(num1>num2?num1:num2) > num3? (num1>num2?num1:num2):num3; printf( ( maximum is %d\n, max ); Προκύπτει ένας αριθµός και συγκρίνεται µε τονnum3. Εάν ισχύει η ανισότητα αυτός ο αριθµός θα τυπωθεί ως µέγιστος, αλλιώς ο num3.

Yπό συνθήκη διακλάδωση switch() switch(έκφραση έκφραση) { case (σταθ.( σταθ.-έκφρ.. 1): 1 προτάσεις; break; case (σταθ.( σταθ.-έκφρ.. 2): 2 προτάσεις; break; default: προτάσεις; break; } Όταν υπάρχουν πολλές ένθετες προτάσεις if ή elseif, υπάρχει δυσκολία στην ανάγνωση και καθυστέρηση στην εκτέλεση. Τότε προτιµάται η χρήση της switch() ().

switch() (συνέχεια) Η πρόταση switch επιτρέπει τον προσδιορισµό απεριόριστου αριθµού διαδροµών ανάλογα µετηντιµή της έκφρασης. Υπολογίζεται η έκφραση και η τιµή της συγκρίνεται διαδοχικά µε τις σταθερές εκφράσεις (σταθ.-έκφρ. 1, σταθ.-έκφρ. 2, ). Ο έλεγχος µεταφέρεται στις προτάσεις που είναι κάτω από τη σταθερά έκφραση µε την οποία ισούται η τιµήτηςέκφρασης. Εάν δεν ισούται µε καµία από τις σταθερές εκφράσεις, ο έλεγχος µεταφέρεται στις προτάσεις που ακολουθούν την ετικέτα default, εάν αυτή υπάρχει, αλλιώς στην πρόταση που ακολουθεί το σώµα τηςswitch.

switch() (συνέχεια) Η πρόταση ελέγχου break, η οποία υποδηλώνει άµεση έξοδο από τη switch, είναι προαιρετική. Εάν αυτή λείπει, η εκτέλεση των προτάσεων που ακολουθούν την επιλεγείσα ετικέτα θα ακολουθήσει από την εκτέλεση και των προτάσεων και των επόµενων case ετικετών. Στην πράξη η break συναντάται σχεδόν πάντοτε, ακόµη και µετά τις προτάσεις τής default. Το τελευταίο γίνεται για να προστατευθούµε από το δύσκολο στην ανεύρεση σφάλµα που θα προκύψει από µελλοντική προσθήκη µίας νέας ετικέτας µε ταυτόχρονη παράλειψη προσθήκης πριν από αυτή τής break.

switch() (συνέχεια) Η λειτουργία της switch διέπεται από το ακόλουθο σύνολο κανόνων: Κάθε case πρέπει να έχει µία int ή char σταθερά έκφραση. ύο case δεν µπορούν να έχουν την ίδια τιµή. Οι προτάσεις κάτω από την ετικέτα default εκτελούνται όταν δεν ικανοποιείται καµία από τις case ετικέτες. Η default δεν είναι απαραίτητα η τελευταία ετικέτα. Οι case και default µπορούν να τοποθετηθούν µε οποιαδήποτε σειρά. Η break µετά την τελευταία ετικέτα αποτελεί καλή τακτική, αν και δεν είναι απαραίτητη.

Παράδειγµα:Να γραφεί τµήµα κώδικα, το οποίο να δίνει τη δυνατότητα στο χρήστη να εισάγει δύο αριθµούς και στη συνέχεια να εκτελεί επί αυτών επιλεκτικά µία από τις τέσσερις αριθµητικές πράξεις Λύση: Χρησιµοποιώντας περιγράφεται ως εξής: δοµηµένα Ελληνικά, η διεργασία 1. πάρε δύο αριθµούς 2. ενηµέρωσε το χρήστη για δυνατές επιλογές 3. πάρε την επιλογή του χρήστη 4. ανάλογα µε την επιλογή 5. εκτέλεσε την αντίστοιχη πράξη 6. εµφάνισε το αποτέλεσµα 7. τερµάτισε Ο κώδικας του προγράµµατος είναι ο ακόλουθος:

#include <stdio.h< stdio.h> #include <conio.h< conio.h> #define ADD 1 #define SUB 2 #define MUL 3 #define DIV 4 Κάθε µία από τις πράξεις αντιστοιχίζεται σε έναν ακέραιο void main(){ float num1, num2,result; int choice; printf( ( "\ngive" first number:"); scanf("%f",&num1 ); printf( ( "\ngive" second number:"); scanf("%f",&num2 ); printf( ( "\n" n Select one of the following:" ); printf( ( "\n\t\t\t" %d -> > + (addition)\n,add n,add ); printf( ( "\n\t\t\t" %d -> - (subtraction)\n,sub n,sub ); printf( ( "\n\t\t\t" %d -> > * (multiplication)\n,mul n,mul ); printf( ( "\n\t\t\t" %d -> > / (division)\n,div n,div ); scanf( ( "%d",&choice ); //example_of_switch.cpp

switch(choice){ case 1: result=num1+num2; break; case 2: result=num1-num2; num2; break; case 3: result=num1*num2; break; case 4: if (num2) result=num1/num2; // num2!= 0 else printf( ( "\t\t" ERROR: division by 0" ); break; default: printf( ( "This selection is not supported" ); break; } // τέλος της switch printf( ( "\n\tresult" tresult: : %f\n",result% ); } // τέλος της main

Αποτελέσµατα: Προγραµµατισµός ς Ι

Προτάσεις επανάληψης - γενικά Οι προτάσεις επανάληψης επαναλαµβάνουν ένα µπλοκ προτάσεων είτε για όσες φορές το επιθυµούµε είτε έως ότου πληρωθεί µία συνθήκη τερµατισµού. Η πλήρωση του κριτηρίου τερµατισµού (terminating( condition) οδηγεί στην περάτωση του βρόχου (loop). Εάν δεν υπάρχει συγκεκριµένος αριθµός επαναλήψεων ή συνθήκη τερµατισµού, ο βρόχος θα εκτελείται αενάως, οδηγώντας σε σφάλµα.

while - do 1) Βρόχος µε συνθήκη εισόδου (pre-test loop): α) οδηγούµενος από γεγονός β) οδηγούµενος από µετρητή { } αληθής(συνθήκη συνθήκη) ναι έναρξη µπλοκ προτάσεων; όχι τερµατισµός

while - do while E do Π

do - while 2) Βρόχος µε συνθήκη εξόδου (post-test loop): α) οδηγούµενος από γεγονός β) οδηγούµενος από µετρητή { } έναρξη µπλοκ προτάσεων; αληθής(συνθήκη συνθήκη); ναι όχι τερµατισµός

do - while do Π while E

Βρόχος µε συνθήκη εισόδου στη C,, οδηγούµενος από το γεγονός: while έναρξη while (συνθήκη( συνθήκη) { προτάσεις στις οποίες αλλάζει η συνθήκη; } { } αληθής(συνθήκη συνθήκη); ναι µπλοκ προτάσεων; όχι τερµατισµός

Βρόχος µε συνθήκη εισόδου στη C,, οδηγούµενος από το γεγονός: while Η λειτουργία της πρότασης επανάληψης while µπορεί να µορφοποιηθεί σε δοµηµένα Ελληνικά ως εξής: Έλεγξε τη συνθήκη. Εάν είναι αληθής Προχώρησε στις προτάσεις Ξεκίνησε από την αρχή Αλλιώς σταµάτησε

Βρόχος µε συνθήκη εισόδου στη C,, οδηγούµενος από το γεγονός: while Ο βρόχος while είναι κατάλληλος στις περιπτώσεις που δεν είναι γνωστός εκ των προτέρων ο αριθµός των επαναλήψεων. Εκτελείται καθόσον η συνθήκη παραµένει αληθής. Όταν η συνθήκη καταστεί ψευδής, ο έλεγχος του προγράµµατος παρακάµπτει το περιεχόµενο του βρόχου και προχωρά στην επόµενη εντολή. Θα πρέπει να σηµειωθεί ότι εάν το σώµα του βρόχου αποτελείται από µία πρόταση, δεν απαιτούνται {}. Ωστόσο προτείνεται η χρήση των αγκίστρων σε κάθε περίπτωση, ανεξάρτητα από τον αριθµό των προτάσεων που απαρτίζουν το σώµα του βρόχου.

Παράδειγµα: int count=30; int limit=40; while (count<limit) { count++; printf( count is %d\n,count); } <επόµενη πρόταση>; /*Εάν αρχικά η count=40, ο βρόχος δε θα εκτελείτο ούτε µία φορά.*/

Άσκηση: ίνονται οι παρακάτω δύο προτάσεις: (α) while (++count<12) Π1 και (β) while (count++<12) Π1. Να περιγραφεί ο τρόπος µε τονοποίοο υπολογιστής τις εκτελεί, εντοπίζοντας τη διαφορά τους, εάν υπάρχει. Λύση: Υπάρχει διαφορά µεταξύ των προτάσεων κι αυτή εντοπίζεται στον αριθµό επαναλήψεων. Η (α) χρησιµοποιεί την προθεµατική σηµειογραφία ενώ η (β) τη µεταθεµατική. Στην (α) πρόταση αυξάνεται πρώτα η τιµή τηςcount και η νέα τιµή της συγκρίνεται µε το12, ενώ στη (β) πρώτα συγκρίνεται η τιµή τηςcount µε το12 και στη συνέχεια αυξάνεται η τιµή της. Αυτό σηµαίνει πως η πρόταση Π1 θα εκτελεσθεί µία φορά παραπάνω στην περίπτωση (β).

Παράδειγµα: #include <stdio.h< stdio.h> void main () { char a='b'; while(a>40) { printf( ( "a=%c ASCII value=%d\n",a,a ); a=a-10; } }

Παράδειγµα: Να γραφεί πρόγραµµα πουναδιαβάζει µία σειρά χαρακτήρων από την είσοδο, να µετρά τα κενά και να τυπώνει τον αριθµό τους. #include <stdio.h< stdio.h> void main() { int num_spaces=0; char ch; printf( ( Give a sentence\n n ); ch=getchar getchar(); while (ch( ch!=!= \n ) { if (ch( ch== ) num_spaces++; ch=getchar getchar(); } printf( The number of spaces is %d\n,num_spaces% n,num_spaces); } //example_of_while

Aποτελέσµατα: Προγραµµατισµός ς Ι

Βρόχος µε συνθήκη εισόδου στη C, οδηγούµενος από µετρητή: for έναρξη for (αρχική; συνθήκη; µετρητής) { προτάσεις; } { } αληθής(συνθήκη συνθήκη); ναι µπλοκ προτάσεων; όχι τερµατισµός

Βρόχος µε συνθήκη εισόδου στη C, οδηγούµενος από µετρητή: for Η λειτουργία της πρότασης επανάληψης for µπορεί να µορφοποιηθεί σε δοµηµένα Ελληνικά ως εξής: Αρχικοποίησε το µετρητή Έλεγξε τη συνθήκη Εάν είναι αληθής Εκτέλεσε τις προτάσεις Ενηµέρωσε το µετρητή Επάνελθε στον έλεγχο της συνθήκης Αλλιώς ενηµέρωσε το µετρητή και σταµάτησε

Βρόχος µε συνθήκη εισόδου στη C, οδηγούµενος από µετρητή: for O βρόχος for στη γλώσσα C παρέχει µεγάλη ευελιξία καθώς οι εκφράσεις µέσα στις παρενθέσεις µπορούν να έχουν πολλές παραλλαγές: Μπορεί να χρησιµοποιηθεί ο τελεστής µείωσης για µέτρηση προς τα κάτω: for (n=10; n>0; n-n -) printf( ( "n=%d\n",n n",n ); Το βήµα καθορίζεται από το χρήστη: for (n=0; n<60; n=n+13) printf( ( "n=%d\n",n n",n ); Ο µετρητής µπορεί να αυξάνει κατά γεωµετρική πρόοδο: for (n=2; n<60.0; n=1.2*n) printf("n=% =%f\n",n );

Βρόχος µε συνθήκη εισόδου στη C, οδηγούµενος από µετρητή: for Χρησιµοποιώντας την ιδιότητα ότι κάθε χαρακτήρας του κώδικα ASCII έχει µία ακέραια τιµή, ο µετρητής µπορεί να είναι µεταβλητή χαρακτήρα. Το παρακάτω τµήµα κώδικα θα τυπώνει τους χαρακτήρες από το a έως το z µαζί µε τον ASCII κωδικό τους: for (n= a ; n< z ; n++) printf( "n=%d, the ASCII value is %d\n",n,n ); Θα πρέπει να σηµειωθεί ότι εάν το σώµα του βρόχου αποτελείται από µία πρόταση, δεν απαιτούνται {}. Ωστόσο προτείνεται η χρήση των αγκίστρων σε κάθε περίπτωση, ανεξάρτητα από τον αριθµό των προτάσεων που απαρτίζουν το σώµα του βρόχου.

Παράδειγµα: int count, max_count=30; for (count=1;count<max_count;count max_count;count+ +) { printf( count is %d\n,count% n,count); <άλλες προτάσεις>; } <επόµενη πρόταση>;

Παράδειγµα: Να γραφεί πρόγραµµα που να διαβάζει από την είσοδο ένα αλφαριθµητικό και το τυπώνει times φορές. #include <stdio.h< stdio.h> #define MAX_CHAR 80 void main() { εν απαιτείται & για τους πίνακες χαρακτήρων char str[max_char]; int i,times; printf( ( \nenter a string: ); scanf( ( %s,str ); printf( ( \nenter the number of repetitions: ); scanf( ( %d,&times ); for (i=0; i<times; i++) printf( ( %s\n,str ); }

Βρόχος µε συνθήκη εξόδου στη C, οδηγούµενος από γεγονός/µετρητή: do{}while() do { προτάσεις στις οποίες αλλάζει η συνθήκη; } while (συνθήκη); // εναλλακτικά η while µπορεί να τοποθετηθεί αµέσως µετά το } { } µπλοκ προτάσεων; αληθής(συνθήκη συνθήκη); ναι έναρξη όχι τερµατισµός

Βρόχος µε συνθήκη εξόδου στη C, οδηγούµενος από γεγονός/µετρητή: do{}while() Η λειτουργία της πρότασης επανάληψης do-while µπορεί να µορφοποιηθεί σε δοµηµένα Ελληνικά ως εξής: Εκτέλεσε τις προτάσεις Έλεγξε τη συνθήκη Εάν είναι αληθής Ξεκίνησε από την αρχή Αλλιώς σταµάτησε

Παράδειγµα: int count=30; int limit=40; do { count++; printf( count is %d\n,count% n,count); } while (count<limit); <επόµενη πρόταση>; /*Tο σώµα του βρόχου εκτελείται µία φορά έστω κι αν αρχικά count>=limit.*/

Ένθετοι βρόχοι (nested( loops) Φώλιασµα (nesting): Τοποθέτηση ενός βρόχου µέσα σε άλλον. Ο εσωτερικός βρόχος είναι µία πρόταση µέσα στον εξωτερικό. printf( \n ); for (i=0; i<4; i++) { for (j=0; j<3; j++) { } printf( %d.%d, i, j); } printf( \n ); Αποτέλεσµα: > 0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2 3,0 3,1 3,2 >

Παράδειγµα: Στο πρόγραµµα που ακολουθεί δηµιουργούνται ένθετοι βρόχοι, όπου χρησιµοποιούνται και τα τρία είδη προτάσεων επανάληψης: #include <stdio.h< stdio.h> Εξωτερικός βρόχος void main() { int i,j; float x; for (i=0;i<=2;i++) { x=0.0; Πρώτο επίπεδο ένθεσης while( x<2) { printf( ( "\ni" ni=%d x=%f",i,x ); x++; do { εύτερο επίπεδο ένθεσης printf( ( "\ngive" an integer: " ); scanf( ( "%d",&j ); } while (j<4); } // τέλος της while } // τέλος της for } // τέλος της main

Αποτελέσµατα έσµατα: Προγραµµατισµός ς Ι

while==for Είναι δυνατό να µετασχηµατισθεί ένας βρόχος FOR σε βρόχο WHILE; Ναι! for (init; cond; ; step) { } προτάσεις; init; while (cond( cond) { προτάσεις; step; };