+ All Categories
Home > Documents > Προγραμματισμός σε C με το Code Blocks

Προγραμματισμός σε C με το Code Blocks

Date post: 06-Apr-2023
Category:
Upload: independent
View: 0 times
Download: 0 times
Share this document with a friend
24
Εκπαιδευτήρια Γείτονα Τμήμα Πληροφορικής Προγραμματισμός με σε γλώσσα προγραμματισμού C Βάρη 2014
Transcript

Εκπαιδευτήρια Γείτονα

Τμήμα Πληροφορικής

Προγραμματισμός με

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

Βάρη 2014

1

Προγραμματιστικό περιβάλλον της γλώσσας C

Πληκτρολογούμε την διεύθυνση www.codeblocks.org/downloads/binaries και

πηγαίνοντας στην κατηγορία Windows 2000/ XP / Vista / 7 κάνουμε

download το αρχείο codeblocks-13.12-setup.exe και ξεκινάει η εγκατάσταση…

Μετά την εγκατάσταση του προγράμματος εμφανίζεται ένα μήνυμα

σχετικά με το συσχετισμό των αντίστοιχων αρχείων με το πρόγραμμα. Αν

λοιπόν δεν έχετε κάποιο άλλο σχετικό πρόγραμμα στον υπολογιστή σας

προτείνεται να αφήσετε την προεπιλογή που θα επιτρέπει στο Code Blocks

να χειρίζεται τα αρχεία αυτά.

Ξεκινώντας λοιπόν με το λογισμικό, κάθε φορά που θα θέλετε να

δημιουργήσετε ένα νέο πρόγραμμα δεν έχετε παρά να επιλέξετε την εντολή

Create new project και στη

συνέχεια από τις επιλογές

που δίνονται επιλέγουμε

Console application.

1

2

2

Έπειτα ακολουθώντας τα βήματα του οδηγού που εμφανίζεται επιλέγουμε

ότι θα προγραμματίσουμε σε γλώσσα C

και στη συνέχεια δίνουμε στο πρόγραμμα μας όνομα, καθώς επίσης και

τοποθεσία αποθήκευσης.

Για κάθε πρόγραμμα που γράφουμε,

δημιουργείται ένας φάκελος ο οποίος

περιέχει μεταξύ άλλων, το εκτελέσιμο

αρχείο του προγράμματος καθώς επίσης

και τον πηγαίο κώδικα ο οποίος μπορεί

να ανοίξει και με

σημειωματάριο στην

περίπτωση που δεν έχουμε

σε κάποιον υπολογιστή το

Code Blocks.

Στο επόμενο βήμα αφήνουμε τον

προεπιλεγμένο μεταγλωττιστή

να αναλάβει την μετάφραση και

τη διόρθωση του προγράμματός

μας και είμαστε έτοιμοι να

προγραμματίσουμε!

3

Περιβάλλον εργασίας του Code Blocks

Στο αριστερό μέρος της οθόνης σας στην καρτέλα Projects και στα

περιεχόμενα του Sources θα βρείτε την κύρια συνάρτηση του προγράμματος

την οποία και θα τροποποιήσετε για να δημιουργήσετε το πρώτο σας

πρόγραμμα.

Πριν δώσουμε τις βασικές οδηγίες για το πώς προγραμματίζουμε σημειώστε

ότι κάθε φορά πριν εκτελέσουμε ένα πρόγραμμα κάνουμε από τη

γραμμή εργαλείων ή το μενού Build, για την μεταγλώττιση του

προγράμματός μας και τον εντοπισμό των συντακτικών λαθών, τα

αποτελέσματα της οποίας βλέπω στο κάτω μέρος της οθόνης.

4

Τέλος εκτελώ το πρόγραμμά πατώντας και δοκιμάζω αυτό που

έγραψα σε μια οθόνη όπως η παρακάτω.

Ας δούμε όμως πιο αναλυτικά πως γράφεται το πιο απλό πρόγραμμα σε

γλώσσα C:

//first_program

//Εμφανίζει στην οθόνη την φράση Hello world!

#include <stdio.h>

int main()

{

printf("Hello world!\n");

return 0;

}

Σχόλια:

// Μιας γραμμής

/*Μπλοκ σχολίων περισσότερων γραμμών.

Τα σχόλια είναι το μοναδικό μέρος του προγράμματος στο οποίο μπορούμε να

γράψουμε ελληνικούς χαρακτήρες μιας και αυτά αγνοούνται από το

μεταγλωττιστή */

Συνηθίζεται να εμπλουτίζουμε τα προγράμματά μας με πολλά

επεξηγηματικά σχόλια για να γίνονται εύκολα κατανοητά από οποιονδήποτε

τα διαβάζει και τα χρησιμοποιεί.

Επίσης κανόνα καλής πρακτικής αποτελεί το γεγονός να ξεκινάμε το

πρόγραμμά μας με δύο σχόλια στα οποία θα αναφέρουμε τον τίτλο του

προγράμματός μας καθώς και την περιγραφή του τι αυτό κάνει.

5

#include <stdio.h>

Ένταξη βιβλιοθηκών κώδικα κοινής χρήσης: πρώτη εντολή με την οποία

ξεκινά το πρόγραμμά μας είναι μια εντολή που αναφέρεται στον

προεπεξεργαστή και αυτό φαίνεται από τη χρήση του συμβόλου # πριν από

την εντολή. Ζητά από τον συνδέτη να συμπεριλάβει την βιβλιοθήκη

συναρτήσεων stdio (standard input output) που περιλαμβάνει τις συναρτήσεις

όπου παρακάτω θα εξετάσουμε την λειτουργία τους. Αν δεν συμπεριλάβουμε

αυτή τη βιβλιοθήκη, ο υπολογιστής δεν γνωρίζει τι πρέπει να κάνει με

βασικές εντολές εισόδου/εξόδου όπως οι printf και scanf.

Χρήση ερωτηματικού (;) στο τέλος κάθε εντολής εκτός από τις εντολές που

αναφέρονται στον προεπεξεργαστή π.χ. #include <stdio.h> και άλλων

εξαιρέσεων που θα τις αναφέρουμε στη συνέχεια.

Χρήση { }

{

σε αγκύλες ενοποιούμε τα block των εντολών

}

Όταν θέλω να αλλάξω γραμμή εισάγω τους χαρακτήρες \n

Όσες γραμμές θέλω να έχω κενές τόσες φορές επαναλαμβάνω τους

χαρακτήρες \n

printf("this is my ");

printf("first program\n\n ");

printf("this is my \n first program \n");

Το αποτέλεσμα στην οθόνη θα είναι:

Όταν έχω μαζί τις εντολές printf και scanf η αλλαγή γραμμής εννοείται

6

Η συνάρτηση main ()

Η συνάρτηση main έχει ιδιαίτερη σημασία, διότι είναι η συνάρτηση από την

οποία ξεκινάει πάντα να τρέχει ένα πρόγραμμα γραμμένο σε C. Κάθε

συνάρτηση στην γλώσσα C έχει ορίσματα (arguments) είτε είναι κενή

ορισμάτων όπως η main( ) = main(void). Στη συγκεκριμένη περίπτωση

δηλώνεται η main σαν συνάρτηση που επιστρέφει ακέραιο (int) γι’ αυτό και

βλέπουμε στο τέλος του προγράμματός μας την εντολή return 0; Εφόσον

πρέπει να επιστραφεί ένας ακέραιος που στην προκειμένη περίπτωση είναι

το 0.

Η εντολή printf και η σύνταξή της

Η εντολή printf εμφανίζει μηνύματα στην οθόνη του χρήστη. Η

πολυπλοκότητά της ποικίλει αλλά η σύνταξή της στην απλή της μορφή

είναι η παρακάτω:

pr int f ( " Hel l o Wor ld ! ! " ) ;

Εμφανίζει λοιπόν ότι βρίσκεται μέσα στα εισαγωγικά.

Η εντολή scanf και η σύνταξή της

H scanf υλοποιεί τη διαδικασία ανάγνωσης μορφοποιημένων δεδομένων από

το πληκτρολόγιο και τα αποθηκεύει σε μεταβλητές. Κάθε φορά λοιπόν που

ζητάμε από το χρήστη να καταχωρήσει κάποια τιμή που θα χρειαστούμε στο

πρόγραμμα, αυτό γίνεται με τη χρήση της εντολής scanf. Το συντακτικό της

και η χρήση της μοιάζουν πολύ με την printf.

Στον πίνακα που ακολουθεί βλέπετε ποιο γράμμα χρησιμοποιείται στην

περίπτωση που κάνετε χρήση της αντίστοιχης μεταβλητής:

Specifier Τύπος Δεδομένων Παράδειγμα

d ή i Προσημασμένος Ακέραιος 392

u Μη Προσημασμένος Ακέραιος 7235

f Δεκαδικός (Κινητής Υποδιαστολής) 392.65

F Δεκαδικός (Κινητής Υποδιαστολής) 392.65

c Χαρακτήρας a

s String (Συμβολοσειρά) sample

7

Αλλά για να το καταλάβετε ακόμα καλύτερα ας μελετήσουμε μαζί το

παρακάτω παράδειγμα:

/* scanf-sample A simple program that demonstrates using scanf to read values from

the end user, as well as combining it with printf. */

#include <stdio.h>

int main(void)

{

char name, surname;

double first;

int second;

printf("Welcome to scanf-sample!\n\n");

// Prompt message #1.

printf("What are your initials?\n");

// Read floating point value.

scanf("%c%c", &name, &surname);

// Prompt message #2.

printf("Please enter a floating point number: ");

// Read floating point value.

scanf("%lf", &first);

// Prompt message #3.

printf("Please enter an integer number: ");

// Read floating point value.

scanf("%d", &second);

// Print information,

printf("The first number (2 decimal digits) you entered was: %.2f\n", first);

printf("The second number you entered was: %d (%x in hexadecimal)\n", second, second);

printf("%c%c, Have a nice day!!\n\n", name, surname);

return 0;

}

8

Μεταβλητές (τύποι και ιεραρχία)

Τυπικά, μια μεταβλητή έχει τα εξής χαρακτηριστικά:

Τύπο Δεδομένων: το είδος των δεδομένων (αριθμοί, χαρακτήρες, κ.λπ.) που

αναπαρίστανται από τη μεταβλητή

Όνομα: ο τρόπος με την οποία αναφερόμαστε σε αυτή μέσα στον κώδικα

Τιμή: το περιεχόμενο της θέσης (ή θέσεων) μνήμης όπου αντιστοιχίζεται η

μεταβλητή

Η γενική μορφή μιας δήλωσης μεταβλητής είναι:

<τύπος_δεδομένων> <όνομα_μεταβλητής>;

Έτσι, για παράδειγμα, το statement:

int weight;

δηλώνει μια ακέραια (τύπος δεδομένων int) μεταβλητή με όνομα weight.

Τα ονόματα των μεταβλητών:

Δεν επιτρέπονται τα κενά.

Μπορεί να αποτελείται από πεζά και κεφαλαία γράμματα του λατινικού

αλφαβήτου και ψηφία.

Αποδεκτός είναι επίσης και ο χαρακτήρας υπογράμμισης (underscore) _.

Ο πρώτος χαρακτήρας πρέπει να είναι γράμμα ή ο χαρακτήρας

υπογράμμισης _. Δεν επιτρέπεται δηλαδή το όνομα μιας μεταβλητής να

ξεκινάει με αριθμό.

Είναι διαφορετικά στην περίπτωση που κάνουμε χρήση κεφαλαίων

χαρακτήρων. Έτσι η μεταβλητή Max είναι διαφορετική από την μεταβλητή

max.

Επιπλέον, δεν επιτρέπεται η χρήση ως ονόματος μεταβλητής μιας σειράς

από λέξεις που έχουν ειδική σημασία για τη C και είναι δεσμευμένες γι

αυτό το σκοπό.

Συνήθης πρακτική θεωρείται το όνομα της μεταβλητής να είναι

«εκφραστικό». Για παράδειγμα αν σε μια μεταβλητή έχουμε εκχωρήσει το

εμβαδόν ενός τριγώνου καλό θα είναι να την ονομάσουμε area είτε

embadon.

Πολλαπλές Δηλώσεις

Η C επιτρέπει την ταυτόχρονη δήλωση πολλών μεταβλητών του ίδιου τύπου

σε μια γραμμή διαχωρίζοντας τις μεταβλητές με κόμμα.

int length, width, height;

9

Έστω λοιπόν ότι θέλουμε να ορίσουμε τρεις μεταβλητές και στη συνέχεια να

τυπώσουμε την τιμή τους στην οθόνη. Η περίπτωση αυτή είναι πιο

σύνθετη οπότε πρέπει να σκεφτούμε:

Το είδος των μεταβλητών (ακέραιες, πραγματικές, χαρακτήρα…) και

Την εμφάνιση των αποτελεσμάτων στην οθόνη (το ένα κάτω από

το άλλο ή το ένα δίπλα στο άλλο, κλπ)

//τυπώνει στην οθόνη τις τιμές τριών μεταβλητών

#include <stdio.h>

int main()

{

// Δήλωση των μεταβλητών

double a1,a2;

long int Z;

// Αρχικοποίηση μεταβλητών

a1 = 5.78;

a2 = 6.97;

Z = 1000;

/* Τυπώνεται η έκφραση: (The numbers are:) ακολουθούμενη από τις τιμές

των τριών μεταβλητών. Οι τιμές των μεταβλητών αυτών θα τυπωθούν

στην οθόνη, στην ίδια γραμμή και η μία δίπλα στην άλλη με κενό ανάμεσα

τους.

*/

printf(“the numbers are: a1= %lf, a2= %lf, %ld \n”, a1, a2, Z);

return 0;

}

Στον επόμενο πίνακα, αναγράφονται οι κυριότεροι τύποι των μεταβλητών

που χρησιμοποιούμε συνήθως, σε ένα πρόγραμμα της γλώσσας C/C++, και

τα αντίστοιχα πεδία μορφοποίησης (format fields) που χρησιμοποιούνται

στις εντολές εισόδου/ εξόδου.

10

Δήλωση Τύπος Μεταβλητής Πεδίο μορφοποίησης

int,

shortint

Ακέραιος απλής, και μικρής

ακρίβειας

%d

longint Ακέραιος διπλής ακρίβειας %ld

float Πραγματικός απλής ακρίβειας %f (σε απλή δεκαδική αναπαράσταση)

double Πραγματικός διπλής ακρίβειας %lf (σε διπλή δεκαδική αναπαράσταση)

char Χαρακτήρας %c

bool Λογική τιμή (Αληθής / Ψευδής) %b

Τιμές μεταβλητής / Αρχικοποίηση

Το όνομα μιας μεταβλητής παραμένει ίδιο στη διάρκεια όλου του

προγράμματος, η τιμή της όμως μπορεί να αλλάζει συνέχεια. Το σίγουρο

είναι ότι οι τιμές που τις αποδίδουμε σε όλη τη διάρκεια του προγράμματος

πρέπει να είναι σύμφωνη με τον τύπο της. Έτσι δεν μπορούμε σε μια

μεταβλητή τύπου ακεραίου να αποδώσουμε την τιμή «Πληροφορική».

Λέγοντας αρχικοποίηση μεταβλητής εννοούμε την ταυτόχρονη απόδοση

τιμής μιας μεταβλητής μαζί με την δήλωσή της στο πρόγραμμα. Δηλαδή:

int a = 5, b, c;

Έχουμε δηλώσει 3 ακέραιες μεταβλητές και έχουμε άμεσα αποδώσει τιμή σε

μία από αυτές.

11

Τελεστές και προτεραιότητες

Ανάλογα με τον αριθμό των τελεστέων στους οποίους επενεργούν, οι

τελεστές διακρίνονται σε:

Unary (μοναδιαίοι): Πρόκειται για τελεστές που επενεργούν πάνω σε ένα

μόνο τελεστέο (π.χ. ο τελεστής ~ ή ο τελεστής πρόσημου +).

Binary (δυαδικοί): Πρόκειται για τελεστές που επενεργούν πάνω σε δύο

τελεστέους και είναι οι πιο κοινοί (π.χ. οι τελεστές των κλασικών

αριθμητικών πράξεων +, -, κ.λπ.).

Ternary (τριαδικοί): Πρόκειται για τελεστές που επενεργούν πάνω σε τρεις

τελεστέους. Υπάρχει μόνο ένας τέτοιος τελεστής (υπό-έλεγχο-ανάθεση).

Επίσης, και ανάλογα με τη σημασία τους, χωρίζονται σε:

Ανάθεσης (Assignment)

Αριθμητικούς (Arithmetic)

Αντικατάστασης (Compound Assignment)

Αύξησης & Μείωσης (Increment & Decrement)

Συγκριτικούς-Σχεσιακούς (Comparison-Relational)

Λογικούς (Logical)

Σημείο Πράξη

- Αφαίρεση a - b

+ Πρόσθεση a + b

* Πολλαπλασιασμός a * b

/ Διαίρεση a / b

% Υπόλοιπο της ακέραιας διαίρεσης του a με το b = a % b

Υποσημείωση: Στο Code Blocks όταν θα χρειαστεί να ξαναγράψουμε εντολές

που έχουμε ήδη χρησιμοποιήσει μια φορά στον κώδικα δεν χρησιμοποιούμε

το Copy - Paste με δεξί κλικ (εφόσον δεν υπάρχει σαν επιλογή) αλλά

αντιγράφουμε με τη χρήση των Ctrl+C & Ctrl+V

12

Δομές ελέγχου στον προγραμματισμό

Στον προγραμματισμό δεν αρκεί η δομή ακολουθίας για να επιλυθούν όλα

μας τα προβλήματα. Υπάρχουν περιπτώσεις όπου απαιτείται να ελέγξουμε

μια συνθήκη και ανάλογα με το αποτέλεσμα αυτής να εκτελέσουμε ένα

μπλοκ εντολών αν η συνθήκη ισχύει ενώ αν δεν ισχύει να εκτελεσθεί ένα

άλλο μπλοκ εντολών.

Για παράδειγμα στην περίπτωση που θέλουμε να υπολογίσουμε την

απόλυτη τιμή ενός αριθμού, ελέγχουμε αν ο αριθμός αυτός είναι

μεγαλύτερος του μηδενός και στην συνέχεια είτε τον εμφανίζουμε ως έχει, ή

τον πολλαπλασιάζουμε με -1 για να αφαιρεθεί το πρόσημο και τον

εμφανίζουμε μετά.

Ένα άλλο επίσης κλασσικό παράδειγμα στον προγραμματισμό αποτελεί η

εύρεση μεγίστου ή ελαχίστου μεταξύ κάποιων αριθμών. Μελετώντας το

παρακάτω παράδειγμα θα διαπιστώσετε και πως συντάσσεται η δομή

ελέγχου στη γλώσσα C.

// Πρόγραμμα εύρεσης μέγιστου μεταξύ δύο αριθμών

#include <stdio.h>

int main()

{

int a, b, max;

printf("Give me two numbers and I will tell you which one is the

maximum\n");

printf("Give me the first number\n");

scanf ("%d", &a);

printf("Give me the second\n");

scanf ("%d", &b);

// Ορίζω αυθαίρετα τον πρώτο από τους δύο αριθμούς ως μέγιστο

13

max=a;

// Στη συνέχεια ελέγχω μήπως τελικά ο δεύτερος είναι μεγαλύτερος του

πρώτου

if ( b > a )

// Η εντολή που ακολουθεί θα εκτελεστεί μόνο αν η συνθήκη που

προηγείται ισχύει

max=b;

// Τέλος εκτυπώνεται ο μεγαλύτερος αριθμός, όποιος κι αν είναι αυτός!

printf("Maximum number between %d and %d is %d", a, b, max);

return 0;

}

Στην περίπτωση που μετά την εντολή if ακολουθούσαν περισσότερα του ενός

statements τότε θα ήταν απαραίτητο να χρησιμοποιήσουμε αγκύλες { } για

να γνωρίζει ο υπολογιστής ποιο μπλοκ εντολών εκτελείται στην περίπτωση

που η συνθήκη δίπλα στο if ισχύει.

Στα παραδείγματα που προηγήθηκαν δεν απαιτείται εκτέλεση κάποιων

εντολών αν η συνθήκη δεν ισχύει. Αυτό όμως δεν συμβαίνει πάντα.

Παρατηρήστε στη συνέχεια μια παραλλαγή της παραπάνω άσκησης:

if ( b > a )

// Αν η συνθήκη ισχύει θα εκτελεστεί η εντολή που ακολουθεί αμέσως μετά

max=b;

else

// ενώ σε κάθε άλλη περίπτωση θα εκτελεστούν οι εντολές που βρίσκονται

μετά την εντολή else

max=a;

printf("Maximum number between %d and %d is %d", a, b, max);

14

Υπάρχουν βέβαια και οι περιπτώσεις προβλημάτων που δεν μας καλύπτουν

δύο κατηγορίες επιλογών, αλλά απαιτούνται περισσότερες περιπτώσεις όπως

για παράδειγμα ο χαρακτηρισμός ενός βαθμού ως «Άριστου», «Πολύ καλού»

ή «Μέτριου». Αντίστοιχα με το παράδειγμα που μέχρι τώρα μελετάμε,

μπορεί να αναζητάμε τον μέγιστο όχι μεταξύ δύο αριθμών αλλά τριών. Έτσι

έχουμε το παρακάτω πρόγραμμα με την ανάλογη παραλλαγή της εντολής if:

// Εύρεση του μέγιστου μεταξύ τριών αριθμών

#include <stdio.h>

int main()

{

int a, b, c, max;

printf("Give me three numbers and I will tell you which one is the

maximum\n");

printf("Give me the first number\n");

scanf ("%d", &a);

printf("Give me the second\n");

scanf ("%d", &b);

printf("Give me the third\n");

scanf ("%d", &c);

/* Ο τελεστής && σημαίνει ότι πρέπει να ισχύουν ταυτόχρονα και οι δύο

συνθήκες για να εκτελεστούν οι εντολές που ακολουθούν το If */

if (( a > b ) && ( a > c ))

max=a;

else if (( b > c ) && ( b > a ))

max=b;

15

else

max=c;

printf("Maximum number between %d and %d and %d is %d", a, b, c, max);

return 0;

}

Επιπλέον θα πρέπει να αναφέρουμε ότι υπάρχουν οι περιπτώσεις όπου

συναντάμε και εμφωλευμένες δομές ελέγχου θέλοντας να ελέγξουμε

περισσότερες από μία συνθήκες όπως στην περίπτωση της επίλυσης της

πρωτοβάθμιας εξίσωσης:

if a=0

if b=0

printf(“Unspecified”);

else

printf(“Impossible”);

else

x = -b / a

printf(“Solution is %f”, x);

Η δομή ελέγχου έχει μία ακόμα σύνταξη που εξυπηρετεί την επίλυση άλλου

είδους προβλημάτων. Ελέγχει την τιμή μιας μεταβλητής και ανάλογα με το

περιεχόμενό της εκτελεί το αντίστοιχο μπλοκ εντολών:

/* Το πρόγραμμα ζητά από το χρήστη έναν αριθμό από το 1 έως το 12 και

εμφανίζει τον αντίστοιχο μήνα */

#include <stdio.h>

int main()

{

int month;

16

printf("Give me a number [1-12] to tell you in which month it

corresponds:");

scanf ("%d", &month);

switch (month)

{

case 1:

printf("\n You selected January");

break;

case 2:

printf("\n You selected February");

break;

.

.

.

case 12:

printf("\n You selected December");

break;

default:

printf("\n You gave a wrong number");

break;

}

return 0;

}

17

Στην περίπτωση που θέλουμε να εκτελεστεί το ίδιο μπλοκ εντολών σε

περισσότερες από μια περιπτώσεις, η εντολή switch μπορεί να

χρησιμοποιηθεί και με τον παρακάτω τρόπο:

/* Ζητά από το χρήστη να δώσει έναν αριθμό και του εμφανίζει κατάλληλο

μήνυμα ανάλογα με το αν ο αριθμός είναι μονός ή ζυγός */

#include <stdio.h>

int main()

{ int num;

printf("Give me a number [1-10] to tell you if it's odd or even:");

scanf ("%d", &num);

switch (num)

{

case 1:

case 3:

case 5:

case 7:

case 9:

printf("\n You gave an odd number");

break;

case 2:

case 4:

case 6:

case 8:

case 10:

18

printf("\n You gave an even number");

break;

default:

printf("\n You gave a wrong number");

break;

}

return 0;

}

Δομή επανάληψης στον προγραμματισμό

Στον προγραμματισμό πολλές διαδικασίες επαναλαμβάνονται με τον ίδιο

τρόπο από 2 έως και εκατοντάδες ή χιλιάδες φορές με αποτέλεσμα να

κρίνεται αναγκαία κάποια δομή που θα μας επιτρέπει να γράφουμε μία

μόνο φορά το block των εντολών που θέλουμε να επαναλαμβάνεται και

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

ανάλογα με το κριτήριο που ισχύει κάθε φορά.

Ας πάρουμε σαν πρώτο παράδειγμα την περίπτωση όπου θέλουμε να

εμφανίσουμε τους αριθμούς από το 0 έως και το 10 (ή οποιονδήποτε άλλο

αριθμό). Σε αυτή την περίπτωση προβλήματος, όπου εξ αρχής γνωρίζουμε το

πλήθος των φορών που θα επαναληφθεί ο κώδικας, χρησιμοποιούμε τη δομή

επανάληψης που έχει την παρακάτω γενική μορφή:

for (metritis = arxiki_timi; metritis <= teliki_timi; vima_afxisis)

{

statements

}

ή αλλιώς

for (i = 0; i <= 10; i++) ή for (i = 10; i >= 0; i--) ή for (i = 0; i <= 0; i=i+2)

19

Επομένως το πρόγραμμα που θα εκτελεί το παραπάνω παράδειγμα θα είναι

αυτό που ακολουθεί:

#include <stdio.h>

int main()

{

int i;

for (i=0; i<=10; i++) // Η εντολή i++ ισοδυναμεί με την i=i+1

printf("%d\n", i);

return 0;

}

Το βήμα αύξησης δεν είναι απαραίτητο να είναι πάντα μοναδιαίο. Εκτελέστε

το επόμενο παράδειγμα για να εκτυπώσετε τους ζυγούς αριθμούς από το 0

έως και το 10.

#include <stdio.h>

int main()

{

int i;

for (i=0; i<=10; i=i+2)

printf("%d\n", i);

return 0;

}

Φυσικά οι εντολές που ακολουθούν την εντολή for μπορούν να

περιλαμβάνουν οποιαδήποτε διαδικασία και να είναι και περισσότερες από

μία (όπου στην περίπτωση που είναι περισσότερες από μια πρέπει να

περικλείονται σε αγκύλες { } ).

Επομένως στην περίπτωση που θα ήθελα να εκτυπωθεί κάτι 5 φορές θα

μπορούσα να έχω ένα πρόγραμμα όπως το παρακάτω:

#include <stdio.h>

int main()

{

20

int i;

for (i=1; i<=10; i=i+2)

printf("Hello!\n");

return 0;

}

Ένα παρόμοιο παράδειγμα είναι αυτό που ακολουθεί και υπολογίζει το

άθροισμα των ζυγών αριθμών από το 0 έως και το 100.

#include <stdio.h>

int main()

{

int i, sum;

sum=0;

for (i=0; i<=100; i=i+2)

sum=sum+i;

printf("%d\n", sum);

return 0;

}

Ποια αλλαγή θα χρειαζόταν να κάνετε στο πρόγραμμα για να υπολογίσετε

το άθροισμα των μονών αριθμών;

Ας συνδυάσουμε τώρα τις γνώσεις που μέχρι τώρα αποκτήσατε με τη

δυνατότητα της δομής επανάληψης. Θα υπολογίσουμε το άθροισμα των

αριθμών από το 0 έως και έναν αριθμό που δεν θα τον δηλώσουμε από την

αρχή, αλλά θα περιμένουμε να τον δηλώσει ο χρήστης:

//Υπολογίζει και εμφανίζει το άθροισμα των ακεραίων από το 0 και πάνω

#include <stdio.h>

int main()

{

//Ζητάω από το χρήστη να μου δώσει τον αριθμό όριο

int num, sum, i;

printf("Enter the number limit:\n");

21

scanf("%d", &num);

//Υπολογίζω το άθροισμα 0+1+2+ ... +num.

sum = 0;

for ( i = 0 ; i <= num ; i++ )

{

sum = sum + i;

}

printf("The sum of integers from 0 up to %d is %d. \n", num, sum);

return 0;

}

Υπάρχουν όμως περιπτώσεις όπου δεν γνωρίζουμε εξ αρχής πόσες φορές θα

εκτελεστεί το μπλοκ εντολών που είναι σε επανάληψη, επομένως η σύνταξη

της επανάληψης με το for δεν μας εξυπηρετεί. Αυτό συμβαίνει συχνά στις

περιπτώσεις που χρησιμοποιώ τη δομή επανάληψης για να κάνω έλεγχο

εγκυρότητας τιμών στην εισαγωγή δεδομένων από το χρήστη, στην αρχή

του προγράμματος.

Όταν για παράδειγμα ζητώ από το χρήστη να εισάγει έναν αριθμό στο

διάστημα [1,10] και θέλω να τον υποχρεώσω να μην εισάγει κάποια τιμή

έξω από αυτό το διάστημα, χρησιμοποιώ την δομή επανάληψης, με άλλη

σύνταξη αυτή τη φορά, με σκοπό να επιτύχω τη σωστή εισαγωγή

δεδομένων από το χρήστη.

//Έλεγχος εγκυρότητας τιμών στην εισαγωγή δεδομένων

#include <stdio.h>

int main()

{

int i;

//Ζητώ για πρώτη φορά έναν αριθμό

printf("Give me a number between 1 and 10\n");

scanf("%d", &i);

/* και στην περίπτωση που ο αριθμός αυτός είναι είτε μικρότερος ή ίσος του

0 είτε μεγαλύτερος από το 10 ξαναζητώ από το χρήστη να εισάγει αριθμό,

όσες φορές χρειαστεί, μέχρι ο αριθμός να ανήκει στο ζητούμενο διάστημα */

22

while (i<=0 || i >10) // το || ισοδυναμεί με τον λογικό τελεστή Ή

{

printf("The number must be between 1 and 10\n");

printf("Give me a number between 1 and 10\n");

scanf("%d", &i);

}

//Έπειτα ακολουθούν όποιες εντολές θέλω να εκτελεστούν βάσει της

εισαγωγής των δεδομένων

return 0;

}

Στο πρόγραμμα που ακολουθεί χρησιμοποιούμε μια διαφορετική σύνταξη της

while, την do … while …, για να κάνουμε και πάλι έλεγχο εγκυρότητας τιμών

στην εισαγωγή δεδομένων από το χρήστη, με έναν πιο σύντομο τρόπο.

#include <stdio.h>

int main()

{

int i;

do

{

printf("Give me a number between 1 and 10\n");

scanf("%d", &i);

}

while (i<=0 || i >10);

return 0;

}

Στη συνέχεια ακολουθεί ένα ακόμα παράδειγμα με την do … while …, για

την καλύτερη εμπέδωσή της.

/*Διαβάζει αριθμούς μέχρι ο χρήστης να καταχωρήσει το 0, υπολογίζει και

εμφανίζει το άθροισμά τους */

#include <stdio.h>

int main()

{

23

int counter, num, sum;

/*Αρχικοποίηση (Απόδοση τιμών, που θα μπορούσε να γίνει και στη δήλωση

μεταβλητών) */

counter = 0;

sum = 0;

do

{

printf("Current sum: %d\n", sum);

counter++;

printf("Please enter number #%d: \n", counter);

scanf ("%d", &num);

sum = sum + num;

}

while (num != 0); // Ο συμβολισμός != σημαίνει διάφορο (≠)

printf("Total sum: %d\n", sum);

return 0;

}

Με ποιο τρόπο θα τροποποιήσετε το παράδειγμα αυτό ώστε να κάνει και

καταμέτρηση των αριθμών που προστέθηκαν;

Θα χρειαστείτε μια ακόμα μεταβλητή (π.χ. counter) η οποία θα έχει αρχική

τιμή 0 και κάθε φορά που θα εκτελείται η επανάληψη θα της προστίθεται το

1.

Τέλος παρατηρείστε ένα τελευταίο παράδειγμα με την while το οποίο

εμφανίζει τους ζυγούς αριθμούς στο διάστημα [-10,10]

#include <stdio.h>

int main()

{

int i=-10;

while (i<=10)

{

printf("%d\n", i);

i+=2;

}

return 0;

}


Recommended