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



Σχετικά έγγραφα
ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

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

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

Χρησιμοποιείται για να αποφασίσει το πρόγραμμα αν θα κάνει κάτι σε ένα σημείο της εκτέλεσής του, εξετάζοντας αν ισχύει ή όχι μια συνθήκη.

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

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

ΑΣΚΗΣΗ 1: TO ΠΕΡΙΒΑΛΛΟΝ ΕΡΓΑΣΙΑΣ DEV-C++

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

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

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

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

Εντολές ελέγχου ροής if, for, while, do-while

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΓΛΩΣΣΑ ΑΛΦΑΒΗΤΟ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΣΤΑΘΕΡΕΣ ΜΕΤΑΒΛΗΤΕΣ

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

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

5. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Β' μέρος: while - do..while)

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

ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1

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

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

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

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

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

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

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

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

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

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

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

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

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

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

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

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

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης

for for for for( . */

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

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

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

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 2 Εντολές Εισόδου/Εξόδου Τελεστές. Δρ. Γιώργος Λαμπρινίδης 23/10/2015 Η - Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

lab2 -Στην printf να βάζεις \n έτσι ώστε να αλλάζει γραµµή όποτε σου εµφανίζει κάποιο µήνυµα.

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

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

Δομές Ακολουθίας- Επιλογής - Επανάληψης. Δομημένος Προγραμματισμός

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

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

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

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

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

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

Σύντομες εισαγωγικές σημειώσεις για την. Matlab

Λύσεις για τις ασκήσεις του lab5

ΕΡΓΑΣΤΗΡΙΟ 4: Μεταβλητές, Δομές Ελέγχου και Επανάληψης

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

Προγραμματιστικό Περιβάλλον

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

ΑΣΚΗΣΗ 3: ΠΡΟΤΑΣΕΙΣ, ΕΚΦΡΑΣΕΙΣ ΚΑΙ ΤΕΛΕΣΤΕΣ

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

Σκοπός. Αλγεβρικοί και Λογικοί Υπολογισμοί στη PASCAL

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

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

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

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

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

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

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

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

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

Transcript:

ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ (ΜΕΣΟΛΟΓΓΙ) ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΣΗΜΕΙΩΣΕΙΣ ΓΙΑ ΤΟ ΜΑΘΗΜΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ «Βασική Θεωρία, Παραδείγματα και Εργαστηριακές Ασκήσεις για την Εισαγωγή στον Προγραμματισμό σε C» (Έκδοση 3.0, Ιούνιος 2014) Δρ Αριστομένης Θανόπουλος Εργαστηριακός Συνεργάτης ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ

Ενότητα 1: TO ΠΕΡΙΒΑΛΛΟΝ ΕΡΓΑΣΙΑΣ ΤΗΣ DEV-C++ Σκοπός της Άσκησης Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η εξοικείωση µε τη χρήση της Dev C++ η οποία θα χρησιµοποιηθεί ως εργαλείο των Εργαστηριακών Ασκήσεων της C. 1.1 Εισαγωγή Όλα τα προγράµµατα που θα αναπτύξουµε προϋποθέτουν την ολοκληρωµένη γνώση του περιβάλλοντος εργασίας DevC++. To εργαλείο αυτό είναι ανοικτού κώδικα (open source) και µπορούν οι φοιτητές να το κατεβάσουν από τον Δικτυακό τόπο www.bloodshed.net. Οι κύριες λειτουργίες του περιβάλλοντος σε όλες τις ασκήσεις είναι οι ακόλουθες: Σύνταξη ή άνοιγμα προγράµµατος πηγαίου κώδικα C Μεταγλώττιση (Compilation): Συντακτικός Έλεγχος του προγράµµατος Δοκιµαστική ή τελική εκτέλεση του µεταγλωττισµένου προγράµµατος Το περιβάλλον της γλώσσας ενσωµατώνει ένα σύνολο από χρήσιµες δυνατότητες όπως: Επεξεργασία κειμένου: Για τη σύνταξη των προγραµµάτων µε ταυτόχρονη δυνατότητα διαγραφής, αντιγραφής, αναζήτησης όπως δηλαδή και σε ένα απλό επεξεργαστή κειµένου Διαχείριση Αρχείων Πηγαίου κώδικα C µε δυνατότητα ανάγνωσης, αποθήκευσης, εκτύπωσης κτλ. Εκτέλεση προγράµµατος: Δοκιµή του κώδικα και της αποτελεσµατικότητας του προγράµµατος. Μεταγλώττιση προγράµµατος και δημιουργία του εκτελέσιµου αρχείου µε δυνατότητα ενεργοποίησης διαδικασιών όπως Make, Build κτλ Διόρθωση σφαλµάτων µε βήµα προς βήµα παρακολούθηση κατά τη διάρκεια της εκτέλεσης του προγράµµατος, πρόσθεση σηµείων παρακολούθησης στον κώδικα κτλ Ρυθµίσεις των χαρακτηριστικών του περιβάλλοντος. Ανάκληση βοήθειας (Help) σχετικά με το περιβάλλον ή τη C. 2 1.2 Ξεκινώντας το Περιβάλλον DevC++ Την πρώτη φορά που θα τρέξετε το Περιβάλλον DevC++, πιθανόν να σας ζητηθούν από το πρόγραμμα οδηγίες εγκατάστασης. Γενικά δίνετε NEXT χωρίς αλλαγές. Προσοχή! Στην επιλογή γλώσσας μην επιλέξετε Ελληνικά, αφήστε την προεπιλογή «English». Αν έχετε αμφιβολία πώς θα προχωρήσει η εγκατάσταση, απευθυνθείτε στον καθηγητή σας. Κάθε φορά που θα ξεκινάτε το Περιβάλλον DevC++ για να φτιάξετε ένα αρχείο κώδικα, πηγαίνετε στο μενού File (το 1 ο από αριστερά στη γραμμή των μενού) και αν είναι ενεργή η επιλογή Close All, κλικάρετέ την, για να κλείσουν τυχόν προηγούμενα αρχεία. Ακολούθως, στο ίδιο μενού, δώστε New και επιλέξετε την εντολή Project. Ακολούθως επιλέξτε C Project και Console Application και πατήστε ΟΚ. Θα σας ζητηθεί ο χώρος αποθήκευσης. Προσοχή: Δημιουργήστε νέο φάκελο και αποθηκεύστε εκεί. Αµέσως δηµιουργήθηκε στο περιβάλλον εργασίας το παράθυρο επεξεργασίας κειμένου στο οποίο θα γράψουµε τον πηγαίο κώδικα του προγράµµατος µας.

Πατήστε Compile & Run από το μενού Execute (F9 ή F11, ανάλογα με την έκδοση της DevC++), και θα σας ζητηθεί να αποθηκεύσετε το πηγαίο αρχείο main.c. ΠΡΟΣΟΧΗ: Αποθηκεύστε χωρίς να αλλάξετε το όνομα αρχείου ή το φάκελο αποθήκευσης. Το κυρίως πρόγραμμα το γράφουμε αμέσως μετά από το άγκιστρο το οποίο βρίσκεται μετά τη γραμμή int main( ) Στην συνέχεια πηγαίνουµε στο menu επιλογής Execute και επιλέγουµε Compile από το μενού Execute. Στην περίπτωση που το πρόγραμμα έχει συντακτικά λάθη (Errors) ή προειδοποιήσεις (Warnings), αυτά εµφανίζονται σε ένα παράθυρο κάτω από τον πηγαίο κώδικα όπως φαίνεται στο Σχήµα 3. Το παράθυρο παρέχει στον προγραµµατιστή τις παρακάτω πληροφορίες: Γραµµή στην οποία εμφανίστηκε λάθος. Προσέξτε! Κάποιες φορές το πραγματικό λάθος στον κώδικα βρίσκεται πιο πάνω, σε κάποια προηγούμενη γραμμή! Συχνά, αν δεν είναι στην ίδια, είναι στην αμέσως προηγούμενη. Επεξήγηση ως προς τον τύπο του λάθους. Με λίγη εμπειρία στον προγραμματισμό και γνώση της Αγγλικής συχνά μπορούμε να καταλάβουμε αμέσως ποιο είναι το λάθος ακριβώς. Tip: Με διπλό κλικ πάνω στο μήνυμα του λάθους, μας πάει κατευθείαν στη γραμμή που εμφανίστηκε για να το διορθώσουμε. Εκτός από τα συντακτικά λάθη (errors) o compiler μπορεί να εμφανίσει κάποιες προειδοποιήσεις (warnings) σε κάποιες γραμμές κώδικα. Ένα πρόγραμμα χωρίς Errors αλλά με Warnings μπορεί να τρέξει, αλλά υπάρχει σημαντική πιθανότητα να υπάρχει κάποιο λάθος, με αποτέλεσμα να τρέξει μεν αλλά να μην συμπεριφερθεί σωστά, π.χ. να βγάλει λάθος αποτελέσματα ή να «κολλήσει» (δηλ. να σταματήσει να λειτουργεί χωρίς να έχει ολοκληρώσει τη ζητούμενη εργασία). Παρατήρηση: Αν ο compiler 'χτυπάει' πολλά λάθη, μην προσπαθείτε να τα διορθώσετε όλα μαζί. Πιθανώς ένα λάθος να δημιουργεί πολλά μηνύματα λάθους, οπότε διορθώστε το πρώτο που σας εμφανίζει και μετά ξανακάνετε Compile&Run. Επαναλάβετε τη διαδικασία έως ότου να μην υπάρχουν άλλα λάθη. Αν τελειώσουμε με τη διόρθωση των λαθών και προειδοποιήσεων, καλούμε την εντολή Run (μενού Execute), οπότε εµφανίζεται το μαύρο παράθυρο («κονσόλα») στο οποίο εκτελείται το πρόγραµµα που έχουµε δηµιουργήσει (Σχήµα 4). Σημείωση: Με την επιλογή Compile & Run (F9) από τo menu Execute γίνεται Compile, και, αν δεν προκύψουν συντακτικά λάθη (errors), στη συνέχεια δημιουργείται και «τρέχει», δηλαδή εκτελείται, το εκτελέσιμο πρόγραμμα (*.exe). Τα λάθη που εμφανίζονται κατά την εκτέλεση του προγράμματος, ονομάζονται λογικά ή σημασιολογικά λάθη (bugs), και δεν είναι καθόλου απαραίτητο να τα έχει ανιχνεύσει ο compiler ως προειδοποίηση. Για να τα ανιχνεύσουμε και να τα διορθώσουμε, συχνά θα χρειαστεί να τρέξουμε το πρόγραμμά μας περισσότερες από μια φορές, δίνοντας κάθε φορά διαφορετικά δεδομένα εισόδου και βλέποντας κάθε φορά αν λειτουργεί σωστά και αν βγάζει σωστά αποτελέσματα. 3

4 Σχήµα 1: Έλεγχος λαθών Σχήµα 2: Εκτέλεση του προγράµµατος (παράθυρο κονσόλας) Παρατήρηση: Εάν έχει τρέξει το πρόγραμμα και το μαύρο παράθυρο της κονσόλας παραμένει ανοιχτό, εάν χρειαστεί να τροποποιήσετε τον κώδικα (π.χ. είτε για να διορθώσετε κάποιο σημασιολογικό (λογικό) λάθος, είτε για να προσθέσετε καποια λειτουργία στο πρόγραμμα κλπ.) θα πρέπει πρώτα να κλείσετε το παράθυρο της κονσόλας, αλλιώς δε μπορεί να δημιουργηθεί το νέο εκτελέσιμο αρχείο (*.exe).

5 ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ Άσκηση 1.1. Να γραφεί το παρακάτω πρόγραµµα. #include <stdio.h> #include <stdlib.h> int main() printf( This is your first program!\n); // η προηγούμενη γραμμή είναι και η μόνη εντολή (σχόλιο) /* όλα τα υπόλοιπα τα γράφουμε πάντα (άλλο σχόλιο) */ system( pause ); return 0; Επιλέξετε την επιλογή Compile & Run (F9) από τo menu Execute Διορθώσετε τυχόν συντακτικά λάθη αν υπάρχουν Τροποποιήσετε το µήνυµα που εµφανίζεται στην οθόνη του υπολογιστή ώστε να εμφανίζει στην παρακάτω γραμμή το μήνυμα «τέλος προγράμματος» (με αγγλικούς χαρακτήρες, όπως και όλο το πρόγραμμα, εκτός από τα σχόλια). Βρείτε το εκτελέσιμο αρχείο και τρέξτε το απευθείας από τα Windows. Άσκηση 1.2. Να τροποποιήσετε το πρόγραµµα συµπεριλάβετε τον παρακάτω κώδικα: #include <stdio.h> #include <stdlib.h> int main() int a,b; printf( Your name is ***********\n ); printf( You are a student at EPDO\tΤΕΙ Mesologgiou.\); printf ( %d+%d=%d,a,b,a+b) system( pause ); return 0; Κάντε Compile και διορθώσετε τυχόν συντακτικά λάθη αν υπάρχουν Μετά τρέξτε το. Είναι σωστό; Βάλτε να εμφανίζεται το όνομά σας αντί για τα αστεράκια. Δώστε αρχικές τιμές στις μεταβλητές, και ξανατρέξτε το Παρεμβάλλετε κενά σε διάφορα σημεία της τελευταίας printf και παρατηρήστε τι συμβαίνει στο πρόγραμμα. Άσκηση 1.3. Να αναζητήσετε δια µέσου του µενού Help πληροφορίες για τις εντολές-συναρτήσεις της C: main(), scanf(), printf().

6 Ενότητα 2. Δομή Προγράμματος C, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου Σκοπός της Άσκησης Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η ανάλυση των βασικών χαρακτηριστικών της Γλώσσας Προγραµµατισµού C: τη δοµή των προγραµµάτων της, τους βασικούς τύπους δεδοµένων που υποστηρίζει, τις δηλώσεις μεταβλητών και σταθερών, τις εντολές ανάθεσης και τις βασικές εντολές εισόδου/εξόδου printf και scanf. ΔΟΜΗ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΤΗ C Η Γλώσσα Προγραµµατισµού C, όπως και κάθε άλλη δοµηµένη γλώσσα, απαιτεί τα προγράµµατα της να έχουν µια συγκεκριµένη δοµή. Πριν παρουσιάσουµε τη δοµή του προγράµµατος, αξίζει να αναφέρουµε ότι η γλώσσα C ξεχωρίζει τους πεζούς από τους κεφαλαίους χαρακτήρες. Το 1 ο τμήμα ενός προγράμματος C ξεκινά με τις εντολές προεπεξεργαστή. Είναι εντολές που ξεκινούν με το χαρακτήρα # και δεν τελειώνουν με ;. Εμείς θα χρησιμοποιήσουμε τις #include <αρχείο> και #define ετικέττα. (Εντολές τέτοιου τύπου προκαλούν την ενεργοποίηση διαφόρων πριν την έναρξη της διαδικασίας µεταγλώττισης.) Η οδηγία #include <αρχείο.h> χρησιµοποιείται για να διαβάσει το συγκεκριµένο αρχείο επικεφαλίδας (header file) και να το ενσωµατώσει στο πρόγραµµα που γράφουµε σαν να ήταν αναπόσπαστο τµήµα του. Τα αρχεία αυτά περιέχουν τις δηλώσεις κάποιων συναρτήσεων που θα χρειαστούμε, όπως οι scanf(), printf(), system(), sqrt() κλπ. Κάθε φορά που συµπεριλαµβάνουµε ένα αρχείο επικεφαλίδας, εµπλουτίζουµε το πρόγραµµά µας µε µια γκάµα βιβλιοθηκών/συναρτήσεων (εντολών) που περιέχονται σε αυτό. Έτσι ανάλογα µε τις συναρτήσεις που θέλουµε να χρησιµοποιήσουµε ενεργοποιούµε το αντίστοιχο αρχείο µέσω της εντολής #include. Τέλος θα πρέπει να αναφέρουµε ότι κάθε χρήστης έχει τη δυνατότητα να δηµιουργήσει δικά του αρχικά αρχεία επικεφαλίδων (βιβλιοθήκες) τα οποία μπορεί να ενσωµατώσει στα προγράµµατά του. To 2o και κύριο μέρος του προγράμματος συνίσταται στη δήλωση της συνάρτησης main(). Συνολικά η δομή των προγραμμάτων C που θα υλοποιήσουμε, τουλάχιστον στα πρώτα μαθήματα, είναι η εξής: Δηλώσεις προεπεξεργαστή int main () Δηλώσεις μεταβλητών Ακολουθία εντολών system ( pause ); return 0; Παρατήρηση: η συνάρτηση/εντολή system( pause ); παγώνει την εκτέλεση μέχρι να πατηθεί ένα πλήκτρο. Τη βάζουμε πάντα πριν το τέλος για να μην κλείσει το παράθυρο της εφαρμογής και να προλάβουμε να δούμε τα αποτελέσματα, αλλά μπορεί να μπεί και σε άλλα σημεία, για παρόμοιο λόγο, αν δηλ. θέλουμε να παγώσει το πρόγραμμα προσωρινά. Σχόλια (Comments) στη C Τα σχόλια προστίθενται ενδιάμεσα γιά να βοηθήσουν στη τεκμηρίωση και αναγνωσιμότητα του προγράμματος. Τα σχόλια απευθύνονται στον αναγνώστη του κώδικα του προγράμματος. Δεν απευθύνονται στον χρήστη του προγράμματος, δηλαδή δεν είναι μηνύματα που εμφανίζονται στην οθόνη. Επίσης δεν απευθύνονται στον Compiler (μεταφραστή), αφού αγνοούνται τελείως από αυτόν. Ένα σχόλιο της C ξεκινά με τον συνδυασμό χαρακτήρων '/*' και τελειώνει με τον συνδυασμό '*/'. Σε

κάποιους compilers (MS, BloodShed) επίσης μπορεί να ξεκινά με διπλή δεξιά κεκλιμένη ("//", slash), οπότε τελειώνει στο τέλος της γραμμής. Περιοχή κώδικα κυρίας συνάρτησης (κυρίως πρόγραµµα, main program) Όλα τα προγράµµατα της C είναι στην ουσία ένα σύνολο από συναρτήσεις. Η βασική συνάρτηση που θα περιέχει το κυρίως πρόγραµµα ονοµάζεται main και η επικεφαλίδα της συντάσσεται ως int main(), δηλαδή η συνάρτηση αυτή επιστρέφει ακέραιο αριθμό. Οι διάφορες δηλώσεις και ο κώδικας που θα ενσωµατωθούν πρέπει υποχρεωτικά να παρέχονται µεταξύ των συµβόλων "" και "" τα οποία και θέτουν το αρχικό και τελικό της όριο µέσα στο πρόγραµµα C. Πριν κλείσει η main(), δηλαδή πριν το βάζουμε την εντολή return 0;, ώστε να γνωρίζει το λειτουργικό σύστημα ότι, αν το πρόγραμμα επέστρεψε την τιμή μηδέν, έχει φτάσει στην τελευταία γραμμή και συνεπώς έχει τελειώσει κανονικά την εκτέλεση όλων των εντολών του. Περιοχή Δήλωσης Μεταβλητών Σε αυτό το τµήµα δηλώνουµε µεταβλητές και σταθερές οι οποίες µπορούν να χρησιµοποιηθούν µόνο στη συνάρτηση της main. Οι µεταβλητές δηλώνονται αµέσως µετά την εισαγωγή του συµβόλου στην συνάρτηση main. Οι µεταβλητές που δηλώνουµε ανήκουν στους τύπους δεδοµένων που υποστηρίζει η C. Κάθε µεταβλητή περιλαµβάνει τα παρακάτω χαρακτηριστικά: Τύπο της µεταβλητής Όνοµα της µεταβλητής Τιµή που της εκχωρείται Τύποι Μεταβλητών Οι µεταβλητές µπορούν να περιέχουν διάφορους τύπους δεδοµένων. Ο παρακάτω πίνακας δίνει τις πιο σηµαντικούς τύπους µεταβλητών στη C, το εύρος τιµών (ελάχιστη τιµή - µέγιστη τιµή που µπορεί να καταχωρηθεί σε µία µεταβλητή) καθώς και το πεδίο τιμών τους. 7 Τύπος Δεδομένων στη C Περιγραφή Πεδίο Ορισμού char χαρακτήρας '!','@',,'1',, 'a', 'A',. int ακέραιος αριθμός, θετικός ή αρνητικός [-2147483646, 2147483647] unsigned int θετικός ακέραιος αριθμός [0, 2 32 ) = [0, 4294967295] float δεκαδικός απλής ακρίβειας (-3.4 10 38, 3.4 10 38 ) double δεκαδικός διπλής ακρίβειας (-1.7 10 308, 1.7 10 308 ) Δήλωση μεταβλητών: Περιορισμοί: Μήκος ονόματος μεταβλητής: 1-31 χαρακτήρες Επιτρέπονται γράμματα, αριθμοί και το underscore ('_', κάτω παύλα). Πρέπει το αρχικό γράμμα να είναι χαρακτήρας. Δεν πρέπει να χρησιμοποιούνται δεσμευμένες λέξεις της C ή ονόματα συναρτήσεων. Αλλαγή έστω κι ενός γράμματος από πεζό σε κεφαλαίο ή αντίστροφα, αλλάζει τη μεταβλητή (case sensitivity) Εκχώρηση ή Ανάθεση Μεταβλητών Για να αποθηκεύσουμε σε μια μεταβλητή μια τιμή η οποία υπολογίζεται από το αποτέλεσμα μιας παράστασης, γράφουμε: Mεταβλητή = Παράσταση;

8 Αυτή η εντολή ονομάζεται ανάθεση ή εκχώρηση. Προφανώς, οι πιο απλές περιπτώσεις ανάθεσης είναι αν έχουμε αντί για ολόκληρη παράσταση μια μόνο μεταβλητή ή μια σταθερά. Το αποτέλεσμα της παράστασης πρέπει να είναι ίδιου τύπου δεδομένων με τη μεταβλητή. Αλλιώς μετατρέπεται στον τύπο της μεταβλητής αυτόματα, οπότε πιθανόν να χαθεί πληροφορία, π.χ. αν αποθηκευτεί σε μια ακέραια μεταβλητή το δεκαδικό αποτέλεσμα μιας παράστασης, τα δεκαδικά ψηφία θα αποκοπούν. /* ΠΑΡΑΔΕΙΓΜΑ: Υπολογισμός Περιμέτρου και Εμβαδού κύκλου*/ int main () const double PI = 3.1415926; //δήλωση της σταθεράς π float r = 3; //δήλωση και αρχικοποίηση της ακτίνας float s, perimeter; /* δήλωση των άλλων δύο μεταβλητών του προβλήματος */ s = PI * r * r; perimeter = 2 * PI * r; return 0; Παρατηρήστε τη δήλωση του π: Όταν ένας προσδιοριστής δεν πρέπει να αλλάξει κατά την εκτέλεση, μπορούμε να τον δηλώσουμε ως σταθερά (αντί για μεταβλητή), οπότε στη δήλωση βάζουμε τη λέξη const πριν τον τύπο δεδομένων. Τις σταθερές συνηθίζουμε να τις δηλώνουμε με κεφαλαία γράμματα, και τις μεταβλητές με πεζά. Εναλλακτικά, θα μπορούσαμε αντί να δηλώσουμε στην αρχή της main() την σταθερά const double PI = 3.1415926; να δώσουμε στην αρχή την οδηγία προεπεξεργαστή (προσέξτε, χωρίς = και ; ): #define PI 3.1415926 Οι Εντολές - Συναρτήσεις Εισόδου και Εξόδου H συνάρτηση printf() Η printf() είναι η βασική συνάρτηση παρουσίασης ενός µηνύµατος ή της τιµής µιας µεταβλητής ή παράστασης στην οθόνη του υπολογιστή. H συνάρτηση printf() περιλαµβάνεται στην βιβλιοθήκη <stdio.h.>. Η σύνταξη της συνάρτησης printf() είναι η ακόλουθη: printf("<συµβολοσειρά>", <ακολουθία μεταβλητών>); Στη συµβολοσειρά, εκτός από τους χαρακτήρες που πρόκειται να εκτυπωθούν, μπορούν να παρεμβάλλονται και: μη εκτυπώσιμοι χαρακτήρες, οι οποίοι ξεκινούν με backslash ('\') και έχουν τις εξής σημασίες: \n νέα γραμμή \t στηλοθέτης (tab) \a ηχητικό σήμα (beep) \b backspace \\ εκτύπωση ενός \ \" εκτύπωση ενός διπλού εισαγωγικού \' εκτύπωση ενός μονού εισαγωγικού κλπ. προσδιοριστές, που ξεκινούν με το χαρακτήρα %, πρέπει να είναι όσες και οι μεταβλητές που ακολουθούν (διαχωρισμένες με κόμμα) και αντίστοιχου τύπου. Κάθε προσδιοριστής δείχνει πως πρέπει να εκτυπωθεί η αντίστοιχη μεταβλητή. Συγκεκριμένα: %c χαρακτήρας

9 %d ακέραιος στο δεκαδικό σύστημα. Αν πρόκειται για μεταβλητή τύπου χαρακτήρα θα εκτυπωθεί ο αντίστοιχος ASCII κωδικός του! %αd ακέραιος στο δεκαδικό σύστημα. Δεσμεύονται α θέσεις για την εκτύπωσή του. Αν όμως δεν χωράει, η εκτύπωση θα γίνει κανονικά χρησιμοποιώντας όσα ψηφία απαιτούνται. %f πραγματικός αριθμός (float ή double) %α.βf πραγματικός αριθμός που θέλουμε να εκτυπωθεί με α ψηφία συνολικά (περιλαμβάνει υποδιαστολή και πρόσημο) και β ψηφία δεκαδικό μέρος. Τα α και β πρέπει να είναι συγκεκριμένοι ακέραιοι αριθμοί, όχι μεταβλητές. Το ένα από τα δύο μπορεί να απουσιάζει, οπότε το μήκος τίθεται αυτόματα από τον compiler. Η ακολουθία μεταβλητών στη σύνταξη της printf() που είδαμε παραπάνω είναι προαιρετική, π.χ. στις 3 πρώτες γραμμές στο Παράδειγμα 1 δεν υπάρχουν μεταβλητές, αφού δεν υπάρχουν προσδιοριστές, όπως «%7.1f» μέσα στη συμβολοσειρά. ΠΑΡΑΔΕΙΓΜΑ 1: #include <stdio.h> // Περιέχει την scanf() #include <stdlib> // Περιέχει την system() int main () printf("line 1\tStili2\n"); printf("line 2\tStili2\n"); printf("line 3\t\tStili3\n"); printf("%7.1f\n", 5/3.); /* βάζουμε 3. αντί για 3 γιατί πράξεις μεταξύ ακεραίων δίνουν ακέραιο! */ printf("%7.3f\n", 5/3.); system( pause ); return 0; Στην οθόνη του υπολογιστή εµφανίζεται το παρακάτω µήνυµα Line1 Stili2 Line2 Stili2 Line3 Stili3 1.7 1.667 Η συνάρτηση scanf () Περιλαµβάνεται στην βιβλιοθήκη <stdio.h>. Χρησιμοποιείται για την εισαγωγή τιμών από το πληκτρολόγιο. Οι τιμές αυτές αποθηκεύονται μια προς μία σε αντίστοιχες μεταβλητές, που περιλαμβάνονται στην scanf(). Η συνάρτηση scanf(), που µοιάζει µε την printf(), δέχεται ως πρώτο όρισμα (μέσα σε διπλά εισαγωγικά) µια συµβολοσειρά ελέγχου και στη συνέχεια τα ονόματα των μεταβλητών που θα λάβουν τιμές από το πληκτρολόγιο. Η συµβολοσειρά ελέγχου περιγράφει στη C ακριβώς τι είναι οι τιµές που πληκτρολογούνται και τον τύπο τους. Η σύνταξη της scanf() είναι η ακόλουθη: scanf("<συµβολοσειρά Ελέγχου>",< λίστα μεταβλητών>); Αν και η σύνταξή της είναι παρόμοια με της printf(), στη συμβολοσειρά ελέγχου της scanf επιτρέπονται μόνο προσδιοριστές και όχι άλλοι χαρακτήρες, εκτυπώσιμοι ή μη. Προσοχή: Πρίν το όνομα κάθε μεταβλητής μπαίνει, χωρίς κενό, ο χαρακτήρας '&' (που σημαίνει "διεύθυνση της μεταβλητής").

10 Πριν από κάθε scanf() πρέπει να προηγείται μια printf(), ώστε να εξηγεί στο χρήστη τι περιμένει ακριβώς το πρόγραμμα από αυτόν. Αν μια scanf() περιμένει πολλές τιμές, αυτές πρέπει να διαχωριστούν κατά την πληκτρολόγηση με κενά διαστήματα. Πάντως είναι πιο ασφαλές, αν θέλουμε να εισαχθούν πολλά δεδομένα, να χρησιμοποιούμε μια scanf() για καθένα. Για παράδειγμα: scanf( %d,&k); // αποθηκεύει την ακέραια τιμή που θα δώσει ο χρήστης στην ακέραια μεταβλητή k. Προσοχή: μέσα στα εισαγωγικά μην βάζετε τίποτε άλλο! Μόνο το % και τον χαρακτήρα που αντιστοιχεί στον τύπο της μεταβλητής, π.χ. %f H συνάρτηση scanf() γνωρίζει πότε τερµατίζεται η είσοδος µε το πάτηµα του πλήκτρου Enter. Επειδή δεν µπορείτε να ελέγχετε τον τρόπο πληκτρολόγησης του χρήστη, αν κάνει λάθος εισαγωγή δεδομένων λανθασμένου τύπου, το πρόγραμμα δεν µπορεί να κάνετε πολλά. Τα αποτελέσµατα θα είναι λανθασµένα, αλλά το πρόγραµµα C δεν διαθέτει µέθοδο ελέγχου της ακρίβειας του χρήστη πριν την εκτέλεση του. ΠΑΡΑΔΕΙΓΜΑ 2: #include <stdio.h> #include <stdlib.h> int main () float totalsale; float tax; printf("enter the sales amount:\n"); scanf("%f",&totalsale); tax=totalsale*0.07; printf("the sales tax for %.2f\t is %.2f\n",totalSale,tax); system ("pause"); return 0; ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ Άσκηση 2.1. Να γραφεί πρόγραµµα που να εκτελεί τις παρακάτω διαδικασίες: a) Να διαβάζει από το πληκτρολόγιο 2 πραγµατικούς αριθµούς, και 2 ακέραιους b) Για τους δύο πραγματικούς να εκτελεί τις πράξεις πρόσθεση και διαίρεση και να τυπώνει τα αποτελέσµατα µε τη µορφή 3+5=8, κλπ. c) Να υπολογίζει το άθροισµα των δύο πρώτων, του 30% του τρίτου αριθµού και του τετραγώνου του 4ου και να τυπώνει το συνολικό αποτέλεσµα Άσκηση 2.2. Να γραφεί πρόγραμμα σε C που να ζητάει από το χρήστη δύο χαρακτήρες και να εκτυπώνει: Α) για τον πρώτο χαρακτήρα, τον επόμενό του στον πίνακα ASCII, και B) για το 2o χαρακτήρα, τον προηγούμενό του στον πίνακα ASCII. Άσκηση 2.3. Να γραφεί πρόγραµµα που να διαβάζει την ηλικία σε έτη και να την μετατρέπει σε μήνες, σε ηµέρες, σε ώρες και σε λεπτά, (ανεξάρτητα μεταξύ τους) και να την τυπώνει ως εξής: H HLIKIA EINAI:20 years, or 480 months, or 17539305 days, or 185200 hours, or 10512000 mins, or 630720000 sec.

11 Ενότητα 3. Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου Η C, όπως όλες οι γλώσσες προγραμματισμού, χρησιμοποιεί τελεστές για να εκτελέσει τις αριθμητικές και λογικές λειτουργίες. Συνοπτικά οι βασικότεροι είναι οι εξής: Ανάθεσης (=) Αριθμητικοί (+, -, *, /, % ακέραιο υπόλοιπο) Λογικοί (&& AND, OR,! NOT) Σύγκρισης ή Συσχετιστικοί (>, >=, ==,!=, <, <=) == τελεστής ισότητας (όχι το μονό =, αφού σημαίνει ανάθεση)!= τελεστής ανισότητας ( ) Μοναδιαίας αύξησης και μείωσης (++, --) Ανάθεση ή καταχώρηση ή εκχώρηση τιμής: Το = είναι ένας τελεστής καταχώρησης τιμής. Δεν μπορούμε να καταχωρήσουμε τιμή σε μια σταθερά, ούτε σε παράσταση, άρα στα αριστερά του συμβόλου = πρέπει να είναι το όνομα μιας μόνο μεταβλητής. Εφαρμογές της εντολής αυτής είναι οι εξής : year = 2006; i = i + 1; t1 = t2 = 68; Στην τελευταία εντολή οι καταχωρήσεις γίνονται από τα δεξιά προς τα αριστερά. Στην πραγματικότητα μια εντολή ανάθεσης είναι επίσης μια παράσταση, η οποία παίρνει τιμή την τιμή που ανατέθηκε στη μεταβλητή! Έτσι το t2 γίνεται 68 και το t1 γίνεται ίσο με την τιμή της παράστασης t2=68, δηλαδή με 68. ΑΡΙΘΜΗΤΙΚΟΙ ΤΕΛΕΣΤΕΣ: πρόσθεσης: +, αφαίρεσης: -, πολλαπλασιασμού: *, διαίρεσης: /, ακέραιο υπόλοιπο διαίρεσης: %. Ο τελεστής ακεραίου υπολοίπου (%) χρησιμοποιείται στην αριθμητική των ακεραίων και επιστρέφει το υπόλοιπο της ακέραιας διαίρεσης του ακεραίου στα αριστερά με τον ακέραιο στα δεξιά. Για παράδειγμα, η πράξη 13 % 5 δίνει σαν αποτέλεσμα την τιμή 3, αφού το 5 χωράει δύο φορές στο 13 και έχει υπόλοιπο 3. ΠΡΟΣΟΧΗ! Στη διαίρεση πρέπει να έχουμε υπόψη μας ότι η διαίρεση μεταξύ δύο ακεραίων δίνει ακέραιο, δηλαδή το δεκαδικό μέρος αποκόπτεται! Διαίρεση μεταξύ ακεραίου και δεκαδικού (float ή double) δίνει δεκαδικό. Ακολουθεί ένα παράδειγμα : #include <stdio.h> main() printf("ακέραια διαίρεση : 5/3 είναι %d \n", 5/3); printf("ακέραια διαίρεση : 8/4 είναι %d \n", 8/4); printf("ακέραια διαίρεση : 7/5 είναι %d \n", 7/5); printf("ακέραιo πηλίκο: 7/5 είναι %d \n", 7/5); printf("διαίρεση κινητής υποδιαστολής : 7./4. είναι %1.2f \n", 7./4.); printf("μικτή διαίρεση : 7./4 είναι %1.2f \n", 7./4); Το αποτέλεσμα θα είναι : ακέραια διαίρεση : 5/3 είναι 1 ακέραια διαίρεση : 8/4 είναι 2

12 ακέραια διαίρεση : 7/5 είναι 1 ακέραιο πηλίκο: 7/5 είναι 2 διαίρεση κινητής υποδιαστολής : 7./4. είναι 1.75 μικτή διαίρεση : 7./4 είναι 1.75 ΛΟΓΙΚΟΙ ΤΕΛΕΣΤΕΣ και ΠΡΑΞΕΙΣ Το λογικό ΚΑΙ (AND) παριστάνεται με &&. Η παράσταση Α&&Β δίνει αποτέλεσμα αληθές αν και μόνο αν και το Α και το Β είναι αληθή. Το λογικό Ή (OR) παριστάνεται με. Η παράσταση Α Β δίνει αποτέλεσμα αληθές αν είτε το Α είτε το Β είναι αληθές, ή και τα δύο. Αλλιώς δίνει ψευδές. Το λογικό ΟΧΙ (NOT) παριστάνεται με!. Η παράσταση!α δίνει αποτέλεσμα αληθές αν και μόνο αν και το Α είναι ψευδές. Για τη C, το ψευδές συμβολίζεται με μηδέν (0), ενώ το αληθές με τη μονάδα (1). Συνεπώς η παράσταση 5>2 έχει τιμή (αποτέλεσμα) 1. Επίσης οποιαδήποτε μη μηδενική τιμή θεωρείται αληθής, π.χ. 6 &&7 δίνει 1, ενώ 6&&0 δίνει 0. Οι Τελεστές Μοναδιαίας Αύξησης ++ και Μείωσης -- μπορεί να εμφανιστούν μέσα σε μια παράσταση και να συνοδεύουν μια μεταβλητή. Ο τελεστής αύξησης (++) αυξάνει κατά ένα την τιμή της μεταβλητής την οποία συνοδεύει, ενώ ο -- τη μειώνει κατά μια μονάδα. Οι τελεστές αυτοί υπάρχουν σε δύο μορφές : Το ++ ή το -- μπορεί να βρίσκεται: Α) πριν από την επηρεαζόμενη μεταβλητή, π.χ. ++n, (προθεματικός), οπότε αλλάζει την τιμή της μεταβλητής πριν να γίνει ο υπολογισμός της παράστασης, B) μετά απ αυτήν, π.χ. n++, οπότε ονομάζεται επιθεματικός τελεστής, οπότε υπολογίζεται πρώτα η παράσταση και μετά γίνεται η αλλαγή τιμής της μεταβλητής. Η διαφορά φαίνεται παρακάτω: int p=5, n=10; // αρχικοποίηση y = p++ * --n; πρώτα αλλάζει η τιμή του n (γιατί έχει προθεματικό --) και γίνεται 9, μετά γίνεται η πράξη y=p*n=5*9=45, και μετά γίνεται η p++ δηλαδή p=p+1=6. Παρατηρήσεις: Οι τελεστές αύξησης και μείωσης έχουν υψηλή προτεραιότητα και μόνο οι παρενθέσεις έχουν υψηλότερη. ΠΡΟΣΟΧΗ: η έκφραση n++ είναι ισοδύναμη με την n=n+1 και όχι με την n+1. Είναι ένα λάθος που κάνουν συχνότατα οι αρχάριοι προγραμματιστές της C. Δεν πρέπει να χρησιμοποιούμε τελεστές αύξησης ή μείωσης σε μεταβλητή που εμφανίζεται περισσότερες από μία φορές σε μια έκφραση, π.χ. y = ++n + 2*n γιατί δεν μπορούμε να είμαστε σίγουροι για το αποτέλεσμα. Οι Προτεραιότητες των Τελεστών Στα μαθηματικά οι αριθμητικοί τελεστές έχουν διαφορετική προτεραιότητα μεταξύ τους όταν βρίσκονται πολλοί σε μια παράσταση χωρίς παρενθέσεις. Για παράδειγμα, ο πολλαπλασιασμός και η διαίρεση έχουν υψηλότερη προτεραιότητα από την πρόσθεση και την αφαίρεση. Αν 2 τελεστές διαίρεσης ή πολλ/μού βρίσκονται στην ίδια έκφραση, αφού έχουν ίδια προτεραιότητα, ο κανόνας λέει ότι εκτελούνται οι πράξεις από αριστερά προς τα δεξιά. Έτσι και η C τοποθετεί κάθε τελεστή σε κάποιο επίπεδο προτεραιότητας. Τα επίπεδα προτεραιότητας των τελεστών φαίνονται παρακάτω:

13 ( )! ++ -- - * / % + - < <= > >= ==!= && = Ψηλότερα στον πίνακα σημαίνει υψηλότερη προτεραιότητα. Προφανώς οι παρενθέσεις έχουν την υψηλότερη από όλους, οπότε τις χρησιμοποιούμε αν δεν είμαστε βέβαιοι για τη σειρά εκτέλεσης των πράξεων. Επίσης έτσι ο κώδικας γίνεται πιο ευανάγνωστος. Το βέλος δείχνει την σειρά εκτέλεσης μεταξύ τελεστών με ίδια προτεραιότητα. Αν υπάρχουν μέσα στην έκφραση τελεστές στο ίδιο επίπεδο, ισχύει γενικά προτεραιότητα από αριστερά προς τα δεξιά (εκτός του τελεστή ανάθεσης: πχ. x = y = 1 πρώτα y=1 και μετά x=1) και των τελεστών μοναδιαίας μεταβολής (++, --) και του προσήμου (-) Παράδειγμα: x=5>3&&9==8; σημαίνει: x= ( (5 μεγαλύτερο 3) ΚΑΙ (9 ίσο με 8) ) άρα ψευδές, άρα το x θα γίνει μηδέν. Υπονοούμενες Μετατροπές Τύπου (σε εκφράσεις) Στη C μπορούμε να έχουμε μια αριθμητική παράσταση με μεταβλητές και σταθερές διαφορετικών τύπων δεδομένων. Η C χρησιμοποιεί ορισμένους κανόνες για να μετατρέψει αυτόματα τους τύπους και να δώσει αποτέλεσμα: 1. Όταν εμφανίζονται σε εκφράσεις ο τύπος char και ο τύπος short, με πρόσημο ή χωρίς, αυτόματα μετατρέπονται σε τύπο int. 2. Σε κάθε πράξη όπου εμπλέκονται δύο τύποι, οι δύο τιμές μετατρέπονται στον τύπο αυτής με τον "υψηλότερο" βαθμό. 3. Η ιεραρχία των τύπων από τους υψηλότερους προς τους χαμηλότερους είναι η εξής : long double, double, float, unsigned long, long, unsigned int και int. 4. Σε μια εντολή ανάθεσης το τελικό αποτέλεσμα των υπολογισμών μετατρέπεται στον τύπο της μεταβλητής στην οποία καταχωρήθηκε η τιμή. Έτσι, όμως, μπορεί μια τιμή να μετατραπεί σε τύπο χαμηλότερου βαθμού, όταν π.χ. καταχωρούμε τύπο float σε τύπο int και γίνεται, όπως είδαμε, αποκοπή του δεκαδικού μέρους. Ρητές μετατροπές τύπου (Τελεστής «Εκμαγείο», Cast) Όλες οι μετατροπές τύπων που αναφέραμε μέχρι τώρα γίνονται αυτόματα. Όμως, είναι πιθανό να θέλουμε να δώσουμε εμείς τις οδηγίες για την ακριβή μετατροπή του τύπου που θέλουμε. Η μέθοδος αυτή λέγεται εκμαγείο ή ρητή μετατροπή (cast) και συνίσταται στην τοποθέτηση μπροστά από την μεταβλητή (ή μια σταθερά, ή μια παράσταση μέσα σε παρενθέσεις), του επιθυμούμενου τύπου μέσα σε παρενθέσεις. Οι παρενθέσεις μαζί με το όνομα του τύπου αποτελούν τον τελεστή-εκμαγείο. Παρατηρήστε τα παραδείγματα: int m; float x, a=1.5; m = 1.6 + 1.7; // τo m γίνεται 3, δηλ. το ακέραιο μέρος του 3.3 m = (int) 1.6 + (int) a; //το m γίνεται 1+1=2 x = (int) a*a; // 1*1.5 = 1.5, άρα το x γίνεται 1.5 x = (int) (a*a); // 1.5*1.5=2.25, άρα το x γίνεται 2.0

14 ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ ΑΣΚΗΣΗ 3.1. Τί θα εκτυπώσει ο παρακάτω κώδικας; Πρίν το τρέξετε (συμπληρώστε ότι χρειάζεται), γράψτε στο τετράδιό σας τί πιστεύετε ότι θα εκτυπωθεί, γραμμή προς γραμμή. Επίσης τις (αριθμητικές ή/και λογικές) πράξεις που κάνατε, καθώς και τις αλλαγές τιμών των μεταβλητών που τυχόν συμβαίνουν. int i=1, j=2, k=3, p; float x=3, y=5; printf("a. %f\n", i+j/x*y); printf("b. %f\n", k/j*++y); printf("c. y=%f, x=%f, x=%f\n", y, x++, x); printf("d. x=%f\n", x); printf("e. %i\n", j>i); printf("f. %d\n", j>i&&!x>=--y); p =!x==0; printf("g. p=%d\n",p); ΑΣΚΗΣΗ 3.2. Υλοποιήστε πρόγραμμα σε C το οποίο: Α) Να ζητά από το χρήστη δύο πραγματικούς αριθμούς στο διάστημα [10,100), πρώτα το μεγαλύτερο και μετά το μικρότερο. Αφού τους δώσει ο χρήστης (θεωρήστε, για τις εκτυπώσεις, ότι οι 2 αριθμοί έχουν διψήφιο ακέραιο μέρος και μονοψήφιο δεκαδικό μέρος), το πρόγραμμα: Β) Να απαντά πόσο είναι το ακέραιο μέρος και ποιο το δεκαδικό μέρος για καθέναν αναλυτικά. Γ) Να εκτελεί και να εκτυπώνει τις 4 αριθμητικές πράξεις μεταξύ τους, καθώς και το ακέραιο πηλίκο και το υπόλοιπο της διαίρεσης των ακέραιων μερών τους. Θεωρήστε 2 δεκαδικά ψηφία για τις εκτυπώσεις των αποτελεσμάτων. Ακολουθεί παράδειγμα επιθυμητής συμπεριφοράς της αλληλεπίδρασης προγράμματος χρήστη: Please enter the bigger of the two numbers: 40.7 Please enter the smaller of the two numbers: 10.3 The integer part of 40.7 is 40 and its fractional part is 0.7. The integer part of 10.3 is 10 and its fractional part is 0.3. 40.7 + 10.3 = 51.00 40.7-10.3 = 30.40 40.7 x 10.3 = 419.21 40.7 / 10.3 = 3.95 40 / 10 = 4 and the remainder is 0

15 Ενότητα 4. Η Δομή Ελέγχου if Χρησιμοποιείται για να αποφασίσει το πρόγραμμα αν θα κάνει κάτι σε ένα σημείο της εκτέλεσής του, εξετάζοντας αν ισχύει ή όχι μια συνθήκη. Γενική Μορφή: if (συνθήκη_1) ακολουθία_εντολών_1 else if (συνθήκη_2) ακολουθία_εντολών_2 else if (συνθήκη_3) ακολουθία_εντολών_3.. else ακολουθία_εντολών_0 επόμενη_εντολή_προγράμματος Αν ισχύει η συνθήκη_1 εκτελείται μόνο η ακολουθία_εντολών_1 και μετά εκτελείται η επόμενη_εντολή_προγράμματος Αν δεν ισχύει η ισχύει η συνθήκη_1 εξετάζεται η συνθήκη_2. Αν ισχύει, εκτελείται μόνο η ακολουθία_εντολών_2 και μετά εκτελείται η επόμενη_εντολή_προγράμματος, κ.ο.κ. Αν δεν ισχύει καμμιά από τις προηγούμενες συνθήκες τότε εκτελείται η ακολουθία_εντολών_0 και μετά εκτελείται η επόμενη_εντολή_προγράμματος. Παρατηρήσεις: 1. Μόνο η γραμμή της if (η 1η) είναι υποχρεωτική. Δηλ, ο προγραμματιστής κρίνει αν χρειάζεται να μπει else ή/και ένα ή περισσότερα else if. 2. Όλος ο κώδικας από το if έως και το else ή, αν δεν υπάρχει else, έως και το τελευταίο else if. είναι μία και μόνο εντολή της C, η οποία δεν τελειώνει με ';'. 3. Οι παρενθέσεις που περιβάλλουν τη συνθήκη είναι υποχρεωτικές. 4. Τα άγκιστρα είναι προαιρετικά αν και μόνο αν η ακολουθία_εντολών είναι μόνο μια εντολή. Ας δούμε παραδείγματα: Η απλούστερη περίπτωση: Η εντολή if ελέγχει τη συνθήκη και αν αυτή είναι αληθής, τότε εκτελείται μια εντολή. Αν είναι ψευδής, δεν εκτελείται, και το πρόγραμμα συνεχίζει κανονικά παρακάτω. Αν θέλουμε, στην περίπτωση που δεν ισχύει η συνθήκη, να γίνει κάτι άλλο, προσθέτουμε το else. Ο διπλανός έλεγχος εκτυπώνει αν ένας μαθητής πέρασε τις εξετάσεις ή όχι, με βάση το 5: if (thermokrasia < 0) printf("it s freezing!\n"); if (apotelesma >= 5.0) printf("perase\n"); else printf("apetyxe\n"); Αν θέλουμε να έχουμε περισσότερες από μια εντολές μετά το if ή το else, πρέπει να είναι ομαδοποιημένες μέσα σε άγκιστρα. Μια τέτοια ομαδοποίηση ονομάζεται block. Μια εντολή σε ένα block μπορεί να είναι οποιαδήποτε εντολή της C, ακόμα κι άλλη if, απλή ή σύνθετη. Παρατήρηση: Πολλοί προγραμματιστές βάζουν πάντα άγκιστρα, ακόμα κι αν το block αποτελείται από μόνο μια εντολή, για λόγους ομοιομορφίας. Παρατήρηση: Η συνθήκη μπορεί να μην είναι Λογική, με την έννοια ότι δίνει αληθή ή ψευδή τιμή, αλλά αριθμητική παράσταση. Τότε, αν έχει τιμή μηδέν, είναι ψευδής. Σε κάθε άλλη περίπτωση είναι αληθής. Π.χ. η εντολή if (5-6) printf("weird!\n"); είναι συντακτικά σωστή, η τιμή της συνθήκης είναι -1, άρα αληθής και άρα θα εκτυπώσει!

Προσοχή - Συχνά Λάθη: Α) Η συνθήκη μπαίνει πάντα μέσα σε παρένθεση! Μέσα σε αυτή πιθανά να χρειαστεί να βάλουμε κι άλλες παρενθέσεις, για να ορίσουμε την επιθυμητή προτεραιότητα των πράξεων Β) Η if δεν τελειώνει με το ελληνικό ερωτηματικό (;). Αν το βάλουμε κατά λάθος, δεν είναι συντακτικό λάθος (κι αυτό είναι επικίνδυνο, γιατί δεν to "χτυπάει" ο compiler), αλλά είναι σα να λέμε: Αν ισχύει η συνθήκη, εκτέλεσε την κενή εντολή δηλ. αυτή που δεν κάνει τίποτα. 16 if (result >= 5.0) printf("passed\n"); printf("congratulations\n") else printf("failed\n"); printf("good luck in the resit\n"); Μερικές φορές θα θέλαμε να κάνουμε μια επιλογή ανάμεσα σε πολλές συνθήκες. Ο πιο γενικός τρόπος για να το πετύχουμε είναι να χρησιμοποιήσουμε την παραλλαγή else if της εντολής if. Λειτουργεί κάνοντας πολλές συγκρίσεις. Μόλις κάποια από αυτές δώσει κάποιο αληθές αποτέλεσμα, εκτελείται η επόμενη εντολή και δεν γίνονται περισσότεροι έλεγχοι. Στο επόμενο παράδειγμα το πρόγραμμα δίνει αποτέλεσμα και χαρακτηρισμό ανάλογα με το βαθμό: if (result > 10 result<0) printf("grade should be between 0 and 10!\n"); else if (result >= 8.5) printf("passed: ARISTA!\n"); else if (result >= 6.5) printf("passed: POLY KALA\n"); else if (result >= 5.0) printf("passed: KALA\n"); if (result == 5) printf("alla... ORIAKA\n"); else printf("failed\n"); if (result == 0) printf("leykh KOLLA???\n"); ΠΑΡΑΤΗΡΗΣΗ 1: Αν αντί για το 2 ο «else if» είχαμε βάλει σκέτο if, στην περίπτωση που ο βαθμός θα ήταν 9, θα εκτυπωνόταν και το ΑΡΙΣΤΑ και το ΠΟΛΥ ΚΑΛΑ. Αυτό είναι ένα παράδειγμα λογικού λάθους. Δεν το ανιχνεύει φυσικά ο compiler, ούτε θα φαινόταν το λάθος στην εκτέλεση, παρά μόνο αν εισάγουμε τιμή από 8.5 και πάνω! Γι αυτό και πρέπει να ελέγχουμε τη συμπεριφορά κάθε προγράμματος δοκιμάζοντας ποικίλες τιμές των δεδομένων εισόδου. ΠΑΡΑΤΗΡΗΣΗ 2: Στο block εντολών το 2 ου «else if», καθώς και του else, υπάρχει ένα ακόμη if, αφού κάθε εντολή του block μπορεί να είναι οποιαδήποτε εντολή της C, άρα και μια if. Αυτό ονομάζεται εμφωλιασμένο (nested) if αλλά ακολουθεί κανονικά τον τρόπο σύνταξης if, σύμφωνα με τα παραπάνω.

ΕΡΓΑΣΤΗΡΙΑΚΕΣ AΣKHΣΕΙΣ ΑΣΚΗΣΗ 4.1. Να γραφεί πρόγραμμα σε C που θα διαβάζει τρεις ακεραίους αριθμούς και θα βρίσκει και θα εμφανίζει τον μεγαλύτερο από αυτούς. 17 ΑΣΚΗΣΗ 4.2. Να γραφεί πρόγραμμα σε C που θα διαβάζει ένα αριθμό από το πληκτρολόγιο και θα απαντά σε μία πρόταση: Α) Αν είναι θετικός ή αρνητικός ή μηδέν Β) Εάν είναι ακέραιος ή όχι, και, εάν είναι, θα απαντά αν είναι άρτιος (even) ή περιττός (odd). Υπόδειξη: Υλοποιήστε πρώτα το μέρος (Α) και εφόσον λειτουργεί σωστά, προχωρήστε στο (Β). Παράδειγμα αλληλεπίδρασης προγράμματος με το χρήστη: Enter a number: -23 The number -23 is a negative integer and it is odd. ΑΣΚΗΣΗ 4.3. Να γραφεί πρόγραμμα σε C που θα βρίσκει αν ένας ακέραιος αριθμός που θα εισαχθεί από το χρήστη είναι περιττός διψήφιος και διαιρείται ακριβώς με το 11 ή το 7 αλλά όχι με το 5 ή το 9. Για να ελέγξετε την ορθή λειτουργία του προγράμματος εισάγετε τα παρακάτω παραδείγματα ελέγχου: 7, 70, 55: δεν ισχύει η συνθήκη. 33, 21: Ισχύει.

18 1. Βρόχοι με while, do-while και for 2. Μετρητής, Αθροιστής, Πολλαπλασιαστής 3. Οι εντολές ελέγχου break, continue και goto 5.1. Βρόχοι (Loops) Ενότητα 5. Δομές Επανάληψης Όταν θέλουμε να επαναληφθεί μια ομάδα εντολών πολλές φορές, τη βάζουμε μέσα σε ένα βρόχο επανάληψης. Το αν θα (ξανα)επαναληφθεί η εκτέλεση της ομάδας εντολών καθορίζεται από το αν ισχύει μια συγκεκριμένη συνθήκη. Στη C υπάρχουν τρεις τύποι βρόχων: (Α) while, (Β) do while, και (Γ) for. Ακολουθεί η σύνταξη για κάθε μια: while (συνθήκη) ακολουθία_εντολών Αν ισχύει η συνθήκη, θα εκτελεστεί η ακολουθία_εντολών και για όσο ισχύει η συνθήκη, θα ξαναεκτελείται η ακολουθία_εντολών. Αν η συνθήκη αρχικά είναι ψευδής, η ακολουθία_εντολών δεν θα τρέξει καθόλου. do ακολουθία_εντολών while (συνθήκη); Εκτελείται η ακολουθία_εντολών και αν και για όσο ισχύει η συνθήκη, θα ξαναεκτελείται η ακολουθία_εντολών. Δηλαδή η ακολουθία_εντολών θα εκτελεστεί τουλάχιστον μια φορά. for (ανάθεση_αρχικοποίηση ; συνθήκη ; ανάθεση_μεταβολή) ακολουθία_εντολών Εκτελείται μία μόνο φορά η ανάθεση_αρχικοποίηση (συνήθως δίνει αρχική τιμή σε μια μεταβλητή που λέγεται μεταβλητή ελέγχου). Στη συνέχεια, αν ισχύει η συνθήκη, θα εκτελεστεί η ακολουθία_εντολών και μετά η ανάθεση_μεταβολή, η οποία συνήθως αυξάνει ή μειώνει τη μεταβλητή ελέγχου κατά ένα σταθερό "βήμα". για όσο ισχύει η συνθήκη, θα ξαναεκτελείται η ακολουθία_εντολών και ακολούθως η ανάθεση_μεταβολή. ΠΑΡΑΤΗΡΗΣΕΙΣ: Όπως και στην περίπτωση της if, αν η ακολουθία εντολών είναι μόνο μια εντολή, τα άγκιστρα είναι προαιρετικά. Η παρένθεση είναι υποχρεωτική. Προσοχή στο ';' της do while ( ) ; H for και η while δεν τελειώνουν με ';' Ο βρόχος for χρησιμοποιείται συνήθως όταν το πρόγραμμα γνωρίζει από πριν πόσες φορές θα εκτελεστεί το μπλοκ εντολών. Απλό παράδειγμα: for (i=10 ; i<100 ; i++) printf( %d\t, i); Εκτυπώνει όλους τους διψήφιους θετικούς ακεραίους.ο βρόχος for λειτουργεί καλά όπου ο αριθμός των επαναλήψεων είναι γνωστός πριν την είσοδο στο βρόχο. Η κεφαλή του βρόχου αποτελείται από τρία μέρη χωρισμένα με ερωτηματικό. 1. Το πρώτο εκτελείται πριν την είσοδο στο βρόχο. Συνήθως δίνει μια αρχική τιμή σε μια μεταβλητή. 2. Το δεύτερο είναι μια συνθήκη. Ο βρόχος τρέχει για όσο η συνθήκη ικανοποιείται (είναι αληθής). Συνήθως η συνθήκη ελέγχει αν η τιμή της μεταβλητής του (1) βρίσκεται στο επιθυμητό διάστημα. 3. Το τρίτο είναι μια εντολή, η οποία τρέχει κάθε φορά που τελειώνει το σώμα των εντολών του βρόχου. Συνήθως είναι μια εντολή μεταβολής της μεταβλητής (π.χ. i++ ή j = j 2, κλπ.).

19 Καθένα από τα 3 αυτά μέρη-εντολές στην κεφαλή του βρόχου for συνήθως κάνει ένα πράγμα, ωστόσο μπορεί να είναι και κενό. Π.χ. κενή τρίτη εντολή σημαίνει ότι δεν υπάρχει μεταβολή του μετρητή. Αυτό προκαλεί την επ' άπειρο εκτέλεση του βρόχου, εκτός αν διακοπεί με κάποιο άλλο τρόπο, π.χ. με μια εντολή break. Είναι επίσης δυνατό να στριμώξουμε πολλές μεταβλητές μαζί στην πρώτη ή στην τρίτη θέση, χωρίζοντάς τες με κόμμα. Αυτό επιτρέπει στο βρόχο να ελέγχει περισσότερες από μία μεταβλητές. Στο παρακάτω παράδειγμα φαίνεται ο ορισμός ενός τέτοιου βρόχου, με τις μεταβλητές hi και lo να ξεκινούν από το 100 και το 0 αντιστοίχως και να τείνουν στο ίδιο σημείο. for (hi = 100, lo = 0; hi >= lo; hi--, lo++) Ο βρόχος for είναι εξαιρετικά ελαστικός και επιτρέπει πολλούς τύπους συμπεριφοράς του προγράμματος να καθορίζονται με απλό και γρήγορο τρόπο. 1 1 1 1 Στο παράδειγμα υπολογίζεται η τιμή της σειράς + + + +... λαμβάνοντας υπόψη τους ΜΑΧ πρώτους 2 4 8 16 όρους, όπου του ΜΑΧ έχει οριστεί ως σταθερά. Σε κάθε επανάληψη, εκτελείται το σώμα εντολών του βρόχου: υπολογίζεται ο παρονομαστής του τρέχοντος κλάσματος, υπολογίζεται το νέο άθροισμα, και εκτυπώνονται σε μια γραμμή, μαζί με τον αύξοντα αριθμό της επανάληψης, ώστε ο χρήστης να έχει εικόνα για την εξέλιξη της εκτέλεσης του προγράμματος. ΠΑΡΑΔΕΙΓΜΑ: for( ; ; ) long unsigned int paronomastis=1, i, MAX=20; double athroisma = 0; for (i=1;i<=max;i++) paronomastis=paronomastis*2; athroisma = athroisma + 1./paronomastis; printf("%2i. 1/%12d --> %.16f\n", i,paronomastis, athroisma); printf("to athroisma einai %.16f.\n", athroisma); for, while ή do-while? 5.2 Ένα παράδειγμα με χρήση μετρητή, αθροιστή, πολλαπλασιαστή ΠΑΡΑΔΕΙΓΜΑ 1: Να υλοποιηθεί πρόγραμμα σε C στο οποίο ο χρήστης να εισάγει πραγματικούς αριθμούς και το πρόγραμμα να βρίσκει το άθροισμα, το γινόμενο και το πλήθος των αριθμών αυτών. Η εισαγωγή αριθμών θα σταματήσει όταν ο χρήστης θα δώσει 0 ή 1, οπότε το πρόγραμμα θα εκτυπώσει τα αποτελέσματα και θα τερματίσει. (Δηλ. το 0 ή το 1 που θα δώσει για τον τερματισμό να μη ληφθούν υπόψη στο άθροισμα, το γινόμενο και την καταμέτρηση). Τρόπος Σκέψης: Για τη μέτρηση των αριθμών θα χρησιμοποιήσουμε μετρητή, δηλ μια μεταβλητή που θα αρχικοποιείται με μηδενική τιμή και κάθε φορά που θα εισάγεται ένας έγκυρος αριθμός, ο μετρητής θα αυξάνει κατά ένα. Παρομοίως, για το άθροισμα θα χρησιμοποιήσουμε αθροιστή, δηλ μια μεταβλητή που θα αρχικοποιείται με μηδενική τιμή και κάθε φορά που θα εισάγεται ένας έγκυρος αριθμός ο αριθμός αυτός θα προστίθεται στον αθροιστή. Παρόμοια, για το γινόμενο θα χρησιμοποιήσουμε πολλαπλασιαστή, δηλ. μια μεταβλητή που θα αρχικοποιείται στη μονάδα και κάθε φορά που θα εισάγεται ένας έγκυρος αριθμός ο αριθμός αυτός θα πολλαπλασιάζεται με τον πολλαπλασιαστή και το αποτέλεσμα θα αποθηκεύεται στον πολλαπλασιαστή.

Για τον τύπο του βρόχου σκεφτόμαστε ως εξής: Το πρόγραμμα γνωρίζει τον αριθμό των επαναλήψεων πριν μπει στο βρόχο; Όχι, γιατί είναι επιλογή του χρήστη της στιγμής. Άρα δεν χρησιμοποιούμε for. Είναι σίγουρο ότι θα γίνουν υπολογισμοί έστω και μια φορά; Όχι διότι μπορεί να δώσει από την αρχή 0 ή 1, οπότε δεν πρέπει να γίνουν οι 3 πράξεις ούτε μια φορά. Άρα θα χρησιμοποιήσουμε while do, δηλ. για όσο ο χρήστης δεν δίνει 0 ούτε δίνει 1, να εκτελούνται οι 3 πράξεις: #include <stdio.h> #include <stdlib.h> int main() float ginomeno=1, sum=0, a=-1; int count = 0; printf("enter numbers to calculate their sum and their product. ", "Enter 0 or 1 to stop:\n"); printf("enter a number: "); scanf("%f",&a); while (a!=1 && a!=0) count++; sum = sum + a; ginomeno = ginomeno * a; printf("enter a number: "); scanf("%f",&a); printf("to plithos einai %d.\n", count); printf("to athroisma einai %f.\n", sum); printf("to ginomeno einai %f.\n", ginomeno); system("pause"); return 0; Το μειονέκτημα είναι ότι έχουμε επανάληψη του ζεύγους printf-scanf. Ας δούμε τι θα γίνει αν το υλοποιήσουμε με do - while. Για να μη γίνουν οι πράξεις στην περίπτωση του 1 ή 0, πρέπει να βάλουμε if και να επαναλάβουμε τη συνθήκη: #include <stdio.h> #include <stdlib.h> int main() float ginomeno=1, sum=0, a=-1; int count = 0; printf("enter numbers to calculate their sum and their product. ", "Enter 0 or 1 to stop:\n"); do printf("enter a number: "); scanf("%f",&a); if(a!=1 && a!=0) count++; sum = sum + a; ginomeno = ginomeno * a; while (a!=1 && a!=0); printf("to plithos einai %d.\n", count); printf("to athroisma einai %f.\n", sum); 20

21 printf("to ginomeno einai %f.\n", ginomeno); system("pause"); return 0; Και οι 2 τρόποι δίνουν σωστό αποτέλεσμα σε κάθε περίπτωση, άρα θεωρούνται εξίσου σωστές λύσεις. 5.3.1.Η εντολή break Η εντολή break; χρησιμοποιείται για έξοδο από ένα βρόχο. Όταν εκτελεστεί μια break με τον έλεγχο να περνά στην πρώτη εντολή μετά το βρόχο. Με τους βρόχους, η break μπορεί να χρησιμοποιηθεί ώστε να επιβάλει πρόωρη έξοδο από το βρόχο ή για την υλοποίηση ενός βρόχου με μια συνθήκη εξόδου στη μέση του βρόχου. Μια break σε ένα βρόχο συνήθως βρίσκεται μέσα σε μια εντολή if που παρέχει τη συνθήκη για την προαιρετική έξοδο. Δείτε μια πιο οικονομική λύση του Παραδείγματος 1 με τη χρήση της break: #include <stdio.h> #include <stdlib.h> int main() float ginomeno=1, sum=0, a=-1; int count = 0; printf("enter numbers to calculate their sum and their product. ", "Enter 0 or 1 to stop:\n"); do printf("enter a number: "); scanf("%f",&a); if(a==1 a==0) break; count++; sum = sum + a; ginomeno = ginomeno * a; while (a!=1 && a!=0); printf("to plithos einai %d.\n", count); printf("to athroisma einai %f.\n", sum); printf("to ginomeno einai %f.\n", ginomeno); system("pause"); return 0; 5.3.2 Η εντολή continue Λειτουργεί μόνο μέσα σε βρόχους. Αν εκτελεστεί μια continue; οι υπόλοιπες εντολές μέχρι το τέλος του βρόχου δεν εκτελούνται αλλά ξεκινάει η επόμενη επανάληψη του βρόχου. Οπως και η break, έτσι και η continue συνήθως βρίσκεται μέσα σε μια εντολή if που παρέχει τη συνθήκη, η οποία, αν είναι αληθής, οι υπόλοιπες εντολές του βρόχου δεν θα εκτελεστούν. 5.3.3 Η εντολή goto Η C διαθέτει και την εντολή goto η οποία επιτρέπει άλματα προς οποιαδήποτε εντολή, (της οποίας προηγείται μια ετικέττα και άνω κάτω τελεία). Αν χρησιμοποιείται αλόγιστα, καταστρέφει την δόμηση του κώδικα. («Ο δομημένος κώδικας απαρτίζεται από κατασκευές που κάθε μία έχει μια είσοδο και μια έξοδο και συνδέονται ακολουθιακά.»). Δεν θα τη χρειαστούμε. Μπορεί όμως να «βολέψει» σε «βαθιά» εμφωλευμένο βρόχο όπου θέλουμε να βγούμε έξω από τον πιο εξωτερικό βρόχο αν συμβεί μια ειδική συνθήκη, καθώς η break μάς

22 βγάζει μόνο από τον βρόχο στον οποίο βρισκόμαστε. Π.χ.: for( ; ; ) for( ; ; ).. if ( ) goto out1; out1: printf( got outside the loop\n ); Άσκηση 5.1. ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ Το πρόγραμμα να ζητά από το χρήστη κάποιους αριθμούς (Το πλήθος των αριθμών αυτών θα έχει ζητηθεί και δοθεί προηγουμένως από το χρήστη), των οποίων θα υπολογίζει στη συνέχεια και θα εκτυπώνει το άθροισμα, το γινόμενο, τον μέγιστο, τον ελάχιστο και το μέσο όρο τους, καθώς και το πλήθος των αρνητικών αριθμών. Ασκηση 5.2. 4 4 4 4 4 Να υπολογιστεί ο π ως άθροισμα της σειράς + +... Να χρησιμοποιηθούν: 1 3 5 7 9 (Α) Οι Ν πρώτοι όροι (το Ν να ορίζεται με #define), όπου Ν=100. (Β) Όσοι όροι χρειάζεται ώστε η διαφορά του τελευταίου από τον προ-προηγούμενο να είναι μικρότερη του 10-5. Για κάθε νέο όρο να εκτυπώνεται ο αύξων αριθμός του, η τιμή του, καθώς και η τρέχουσα εκτίμηση του π σε μια γραμμή. Ασκηση 5.3. Να γραφεί πρόγραμμα σε C που να υπολογίζει το παραγοντικό ενός ακεραίου αριθμού τον οποίο θα δίνει ο χρήστης από το πληκτρολόγιο.

ΕΠΔΟ ΤΕΙ Μεσολογγίου - Προγραμματισμός Η/Υ Ι (Ε) Ενότητα 8. Οι Δομές στη C 23 Ενότητα 6. Πίνακες (Arrays) Με τους πίνακες δεσμεύουμε ταυτόχρονα πολλές θέσεις στη μνήμη είναι σαν να δηλώνουμε πολλές μεταβλητές με μία δήλωση. Άρα όλα τα στοιχεία του πίνακα είναι του ίδιου τύπου. Η προσπέλαση στα στοιχεία αυτά, δηλ, η εγγραφή ή ανάγνωση του περιεχομένου μιας τέτοιας θέσης γίνεται μέσω μιας μεταβλητής (που φέρει το όνομα του πίνακα) με τον αριθμό θέσης του στοιχείου να μπαίνει μέσα σε αγκύλες [ ]. Οι αριθμοί θέσης δείχνουν δηλαδή τις συντεταγμένες του στοιχείου, με μια σημαντική διαφορά σε σχέση με τον αντίστοιχο συμβολισμό της γραμμικής άλγεβρας: ΠΡΟΣΟΧΗ: Στη C το πρώτο στοιχείο, η πρώτη γραμμή, στήλη, κλπ. φέρει τον αριθμό θέσης 0, το 2ο το αριθμό θέσης 1 και το n-οστό στοιχείο τον αριθμό θέσης n-1. Αν ο πίνακας είναι μονοδιάστατος, προφανώς ο αριθμός θέσης είναι ένας, αν είναι διδιάστατος έχει 2 αριθμούς θέσης, καθένας μέσα στις δικές του αγκύλες, κλπ 6.1 Μονοδιάστατοι Πίνακες Παρακάτω δηλώνουμε ένα μονοδιάστατο πίνακα με όνομα grade, 5 θέσεων που περιέχει 5 πραγματικούς αριθμούς: float grade [5]; Χρησιμεύουν για να αναπαραστήσουμε ένα σύνολο ομοειδών τιμών, π.χ. βαθμοί ενός μαθητή, θερμοκρασίες μιας πόλης στο χρόνο, κλπ Ταυτόχρονα με τη δήλωση μπορούμε προαιρετικά και να αρχικοποιήσουμε τον πίνακα, π.χ. ως εξής: float grade[5] = 10, 8, 12.5, 15.5, 14; Στην παρακάτω εικόνα φαίνεται σχηματικά ο τρόπος προσπέλασης των στοιχείων του πίνακα. Δήλωση μονοδιάστατου πίνακα: float grade[5] grade 10 8 12.5 15.5 14 grade[0] grade[1] grade[2] grade[3] grade[4] Τα στοιχεία του πίνακα τα χρησιμοποιούμε όπως ακριβώς θα χρησιμοποιούσαμε οποιαδήποτε μεταβλητή, π.χ. int x, y; int j = 1 ; x = grade[3]*2; y= (grade[i]+10)/5; grade[3] = 14; grade[j] = grade[j+1] + 10; Για να διατρέξουμε όλα τα στοιχεία ενός πίνακα μπορούμε να χρησιμοποιήσουμε μία επανάληψη με for( ; ; ) η οποία κάθε φορά θα προσπελαύνει διαφορετικό στοιχείο.

ΕΠΔΟ ΤΕΙ Μεσολογγίου - Προγραμματισμός Η/Υ Ι (Ε) Ενότητα 8. Οι Δομές στη C 24 ΠΑΡΑΔΕΙΓΜΑ 1 Το παρακάτω πρόγραμμα θέτει στα 20 στοιχεία του πίνακα ακεραίων zero μηδενικές τιμές, ενώ στα 20 στοιχεία του πίνακα ακεραίων matr θέτει διαδοχικές τιμές, αρχίζοντας από το 100. Στη συνέχεια εκτυπώνει τον κάθε πίνακα σε μια γραμμή: #include <stdio.h> int main () int matr[20], zero[20]; int i, k=100; for (i=0; i<20; i++) zero[i] = 0; matr[i] = k++; printf("matr="); for (i=0; i<20; i++) printf ("%d ", matr[i]); printf("\nzero="); for (i=0; i<20; i++) printf ("%d ", zero[i]); printf("\n"); system("pause"); return 0; Στο επόμενο παράδειγμα, ο χρήστης εισάγει τα στοιχεία ενός πίνακα ακεραίων 10 θέσεων. Έπειτα εμφανίζει: Α. Τα στοιχεία του πίνακα που βρίσκονται στις περιττές (μονές) θέσεις του πίνακα. Β. Τα στοιχεία του πίνακα που έχουν περιττή τιμή. #include <stdio.h> #include <stdlib.h> int main() int i,a[10]; printf ("dose 10 akeraious arithmous pou tha mpoun se pinaka:\n"); for (i=0;i<10;i++) printf ("dose ton %do arithmo: a[%d]= ",i+1,i); scanf("%d", &a[i]); printf ("\nmones theseis:\n"); for (i=0;i<10;i++) if (i%2==1) printf ("a[%d]=%d\n",i,a[i]); printf ("\nmona stoixeia:\n"); for (i=0;i<10;i++) if (a[i]%2==1) printf ("a[%d]=%d\n",i,a[i]); system("pause"); return 0;

ΕΠΔΟ ΤΕΙ Μεσολογγίου - Προγραμματισμός Η/Υ Ι (Ε) Ενότητα 8. Οι Δομές στη C 25 ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ Άσκηση 6.1. Σε πίνακα ακεραίων 10 θέσεων το πρόγραμμα να βρίσκει: 1. πόσες φορές ξαναεμφανίζεται το 1ο στοιχείο του πίνακα. 2. ποιο είναι το μεγαλύτερο στοιχείο του πινακα. 3. πόσες φορές έχουμε σε γειτονικές θέσεις του πίνακα διαδοχικούς αριθμούς. 4. πόσους περιττους αριθμούς έχει ο πίνακας. Άσκηση 6.2. Να δημιουργηθούν 3 πίνακες ακεραίων 10 θέσεων ο καθένας. Ο 1ος θα γεμίζει αυτόματα με τους αριθμούς 1,2,3,4...10 Ο 2ος θα γεμίζει με αριθμούς που θα δίνει ο χρήστης με κατάλληλες προτροπές: ΕΙΣΑΓΩΓΗ ΣΤΟΙΧΕΙΩΝ 2 ου ΠΙΝΑΚΑ: Δώσε το 1ο στοιχείο: 5 Δώσε το 2ο στοιχείο: 12... Δώσε το 10ο στοιχείο: -3 Ο 3ος πίνακας θα είναι το άθροισμα του 1ου και του 2ου. Μετά τη δημιουργία κάθε πίνακα, αυτός να εκτυπώνεται σε μία γραμμή, π.χ.: ΕΚΤΥΠΩΣΗ 1ου ΠΙΝΑΚΑ: 1 2 3 4 5 6 7 8 9 10 Άσκηση 6.3. Ο χρήστης θα δώσει κάποιους πραγματικούς αριθμούς οι οποίοι θα τοποθετηθούν με τη σειρά στις πρώτες θέσεις ενός μονοδιάστατου πίνακα 100 θέσεων. Πριν δώσει τους αριθμούς το πρόγραμμα θα τον ρωτά για το πλήθος των αριθμών που πρόκειται να δώσει. Το πλήθος αυτό δεν μπορεί να υπερβαίνει το 100 (να δηλωθεί στην αρχή του προγράμματος με #define ως MAX). Ακολούθως το πρόγραμμα: Α) Θα εκτυπώνει τον πίνακα με αντίστροφη σειρά. Κάθε στοιχείο θα καταλαμβάνει μια γραμμή στην οθόνη και θα εμφανίζεται με συνολικά 10 ψηφία εκ των οποίων 2 δεκαδικά, στη μορφή: position 6: 23.50 position 5: - 3.00... position 0: 13.33 B) θα υπολογίζει τη μέση τιμή και τη διασπορά των στοιχείων του πίνακα. H διασπορά υπολογίζεται ως η μέση τιμή του (x i -M) 2, όπου Μ η μέση τιμή της μεταβλητής x i.