Μεταβλητές και τύποι δεδομένων
Στο προηγούμενο κεφάλαιο κοιτάξαμε λεπτομερώς ένα μικρό πρόγραμμα το οποίο τυπώνει ένα μήνυμα στην οθόνη του υπολογιστή. Με αφορμή το συγκεκριμένο πρόγραμμα μιλήσαμε για πολλές θεμελειώδεις ιδέες της C, όπως εντολές, συναρτήσεις, αρχεία--επικεφαλίδες και την πρότυπη βιβλιοθήκη. Για να προχωρήσουμε στη συγγραφή περισσότερο χρήσιμων προγραμμάτων χρειαζόμαστε την έννοια της μεταβλητής (variable). Θα μπορούσαμε να ορίσουμε μια μεταβλητή ως ένα αντικείμενο το οποίο αναγνωρίζεται από το όνομά του. Για να χρησιμοποιήσουμε μια μεταβλητή θα πρέπει να της δώσουμε ένα όνομα και να ορίσουμε τον τύπο (type) της. Το όνομα μια μεταβλητής πρέπει να αποτελείται από ένα ή περισσότερα γράμματα, ψηφιά ή τον χαρακτήρα _ (underscore). Ο πρώτος χαρακτήρας του ονόματος μιάς μεταβλητής πρέπει να είναι είτε γράμμα είτε ο χαρακτήρας _ αλλά ονόματα που αρχίζουν με τον συγκεκριμένο χαρακτήρα είναι συνήθως δεσμευμένες λέξεις του μεταγλωττιστή ή κάποιας βιβλιοθήκης. Καλό είναι στα δικά μας προγράμματα να αποφεύγουμε τη χρήση του συγκεκριμένου χαρακτήρα στην αρχή του ονόματος μιας μεταβλητής. Επιπλέον, το όνομα μιας μεταβλητής δεν μπορεί να είναι μία από τις δεσμευμένες λέξεις της C οι οποίες φαίνονται παρακάτω:
auto, break, case, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while
Στην C πεζά και κεφαλαία γράμματα λογίζονται ως διαφορετικοί χαρακτήρες. Επομένως το όνομα homeWork είναι διαφορετικό από το HomeWork. Το όνομα count είναι έγκυρο όνομα μεταβλητής ενώ το 3Dmovie δεν είναι επειδή ο πρώτος χαρακτήρας είναι αριθμός.
Για να χρησιμοποιήσουμε μια μεταβλητή στην C θα πρέπει πρώτα να την δηλώσουμε. Το συντακτικό της γλώσσας απαιτεί να γράψουμε πρώτα τον τύπο της μεταβλητής ακολουθούμενο από το όνομά της. Για παράδειγμα, η δήλωση
int num;
δηλώνει τη μεταβλητή num να έχει τύπο int. Όπως είδαμε και στην προηγούμενη παράγραφο, μια μεταβλητή τύπου int δέχεται τιμές που είναι ακέραιοι αριθμοί. Το εύρος των ακεραίων αριθμών που μπορούν να αναπαρασταθούν εξαρτάται τόσο από τον υπολογιστή όσο και από την υλοποίηση της γλώσσας στον συγκεκριμένο υπολογιστή. Στον υπολογιστή στον οποίο γράφονται αυτές εδω οι σημειώσεις ο ελάχιστος ακέραιος που παριστάνεται είναι ο -2147483648 και ο μέγιστος ο 2147483647.
Αν θέλαμε να δηλώσουμε και τη μεταβλητή count να έχει τον ίδιο τύπο θα
μπορούσαμε να γράψουμε int num, count;
αντί για
int num; int count;
Το παρακάτω πρόγραμμα ζητάει από τον χρήστη να δώσει δύο αριθμούς και τυπώνει το άθροισμά τους:
#include <stdio.h> int main() { int a, b, c; printf("Give the first number: "); scanf("%d", &a); printf("Give the second nummber: "); scanf("%d", &b); c = a + b; printf("The sum of the two numbers is %d\n", c); return 0; }
Τα καινούργια στοιχεία εδώ είναι κατ' αρχήν η δήλωση των μεταβλητών a, b, c, οι κλήσεις της συνάρτησης
scanf της πρότυπης βιβλιοθήκης, ο υπολογισμός του αθροίσματος των a και b, και τέλος η
εκτύπωση του αθροίσματος. Όπως είπαμε και πριν κάθε μεταβλητή πρέπει να δηλωθεί πρίν χρησιμοποιηθεί. Έτσι, η πρώτη
εντολή στο παραπάνω πρόγραμμα είναι η δήλωση των τριών μεταβλητών. Η επόμενη εντολή τυπώνει στην οθόνη το
μήνυμα Give the first number στο οποίο ο χρήστης πρέπει να απαντήσει δίνοντας ένα ακέραιο αριθμο. Η
συνάρτηση scanf αναλαμβάνει να διαβάσει τον αριθμό αυτό και να τον αποθηκεύσει στην μεταβλητή a.
Αντίστοιχη είναι και η λειτουργία των επόμενων δύο εντολών. Το άθροισμα των δύο αριθμών υπολογίζεται με την
εντολή c = a + b
. Εδώ + ο γνωστός μας από την αριθμητική τελεστής της πρόσθεσης και η εντολή
αυτή είναι το πρώτο παράδειγμα μιας εντολής ανάθεσης. Ο τελεστής = είναι ο
τελεστής ανάθεσης της C. Ο υπολογιστής υπολογίζει το άθροισμα των
a και b και το αποθηκεύει στη μεταβλητή c. Η προτελευταία εντολή της main
εκτυπώνει στην οθόνη το μήνυμα The sum of the two numbers is ακολουθούμενο από την τιμή της
μεταβλητής c. Παρατηρήστε εδώ ότι, σε αντίθεση με προηγούμενες κλήσεις της συνάρτησης printf,
ο αριθμός των ορισμάτων της είναι δύο. Το πρώτο όρισμα είναι ένα αλφαριθμητικό και το δεύτερο μια μεταβλητή
τύπου int, η c. Οι χαρακτήρες %d αποτελούν ένα κωδικό μορφοποίησης (format code) ο
οποίος ενεργεί ως δεσμευτικό θέσης για μια τιμή η οποία εισάγεται σε εκείνο το σημείο κατά την έξοδο. Ο χαρακτήρας
% δηλώνει την αρχή του κωδικού μορφοποίησης, ενώ το γράμμα που ακολουθεί καθορίζει τη μορφοποίηση της
εξόδου. Στη συγκεκριμένη περίπτωση ο κωδικός %d δηλώνει ότι η έξοδος πρέπει να εμφανιστεί ως
δεκαδικός αριθμός (decimal integer). Θα μπορούσαμε να γράψουμε τη συγκεκριμένη εντολή εκτύπωσης
και ως
printf("The sum of %d and %d is %d\n", a, b, c);
έτσι ώστε στην περίπτωση που η τιμή της a ήταν 3 και η τιμή της b ήταν 12 να βλέπαμε το μήνυμα
The sum of 3 and 12 is 15
Δείτε εδώ ότι ο αριθμός ορισμάτων της printf είναι τέσσερα και ότι υπάρχουν τρεις κωδικοί μορφοποίησης, ένας για κάθε μεταβλητή της οποίας την τιμή θέλουμε να εκτυπώσουμε. Θα έχουμε πολλά περισσότερα να πούμε για τους κανόνες μορφοποίησης εξόδου σε επόμενες πραγράφους. Κλείνουμε με μερικά σχόλια για την εντολή scanf. Όπως και η printf, το πρώτο όρισμά της είναι ο κωδικός μορφοποίησης %d, που δηλώνει ότι η συνάρτηση περιμένει να διαβάσει ένα δεκαδικό ακέραιο αριθμό. Το δεύτερο όμως όρισμα της δεν είναι το όνομα της μεταβλητής στην οποία θα αποθηκευτεί η τιμή που θα διαβαστεί αλλά η διεύθυνση της στη μνήμη. Ο τελεστής & είναι ο λεγόμενος τελεστής διεύθυνσης (address operator) και η εφαρμογή του σε μια μεταβλητή επιστρέφει τη διεύθυνση της μεταβλητής στη μνήμη. Η υπόθεση που κάνουμε εδώ είναι ότι η μνήμη ενός υπολογιστή είναι οργανωμένη σε θέσεις οι οποίες μπορούν να απαριθμηθούν.
Ασκήσεις
- Μεταγλωττίστε και τρέξτε το πρόγραμμα αυτής της ενότητας.
- Ποιά από τα παρακάτω είναι αποδεκτά ονόματα μεταβλητών;
joe, merry_christmas, 1_more, yes, do, xDollar$, navier-stokes, Allen_Cahn, _long_name, 7years, false, MinMax - Αλλάξτε το πρόγραμμα αυτής της ενότητας έτσι ώστε να αποθηκεύει στην μεταβλητή d τη διαφορά των δύο αριθμών που διαβάζει. Εκτυπώστε την με ανάλογο τρόπο. Όπως περιμένει κανείς ο τελεστής της αφαίρεσης είναι ο '-'.