Μεταβλητές και τύποι δεδομένων II

Στο προηγούμενο κεφάλαιο είδαμε τον τύπο ακεραίων int που ορίζει η C καθώς και ένα μικρό πρόγραμμα που ζητάει από τον χρήστη να εισάγει δύο ακεραίους και κατόπιν υπολογίζει και τυπώνει το άθροισμά τους. Στην C ορίζεται και ο τύπος double για την αναπαράσταση αριθμών με κλασματικό μέρος. Στις περισσότερες γλώσσες προγραμματισμού οι αριθμοί αυτοί ονομάζονται αριθμοί κινητής υποδιαστολής (floating point numbers). Όπως και με το τύπο int, μπορούν να αναπαραστήσουν ένα μεγάλο αλλά διακριτό υποσύνολο των πραγματικών αριθμών. Το όνομα του συγκεκριμένου τύπου προέρχεται από τις λέξεις double precision, διπλή ακρίβεια δηλαδή, διότι στην C υπάρχει και ο τύπος δεδομένων float πάλι για την αναπαράσταση αριθμών κινητής υποδιαστολής αλλά με μικρότερο εύρος τιμών και ακρίβεια από τον τύπο double. Δεν θα ασχοληθούμε με τον συγκεκριμένο τύπο εδώ, αλλά όσα ακολουθούν για τον τύπο double ισχύουν σε μεγάλο βαθμό και για τον τύπο float. Δείχνουμε παρακάτω ένα πρόγραμμα το οποίο ζητάει από τον χρήστη δύο αριθμούς και μετά υπολογίζει και τυπώνει το άθροισμά τους. Παρατηρήστε ότι τώρα οι μεταβλητές που χρησιμοποιούμε είναι τύπου double και επιπλέον οι κωδικοί μορφοποίησης είναι διαφορετικοί στη συνάρτηση scanf και στην printf.

#include <stdio.h>

int main()
{
	double a, b, c;

	printf("Give the first number: ");
	scanf("%le", &a);
	printf("Give the second number: ");
	scanf("%le", &b);

	c = a + b;
	printf("The sum of the two numbers is %g\n", c);

	return 0;
}

Η εντολή όμως που υπολογίζει το άθροισμα των δύο αριθμών είναι ακριβώς η ίδια με το αντίστοιχο πρόγραμμα της προηγούμενης παραγράφου. Οι ακολουθία χαρακτήρων που βρίσκεται στα δεξιά του τελεστή ανάθεσης ονομάζεται παράσταση (expression). Αποτελείται από όρους, τις μεταβλητές a, b και ένα τελεστή, τον τελεστή της πρόσθεσης. Γενικότερα στην C, κάθε εντολή ανάθεσης έχει τη μορφή μεταβλητή = παράσταση και κάθε όρος της παράστασης μπορεί να είναι είτε μια σταθερά (constant), είτε μια μεταβλητή, είτε μια κλήση συνάρτησης είτε μια παράσταση σε παρενθέσεις. Εδώ με τον όρο σταθερά εννοούμε είτε ένα ακέραιο αριθμό, π.χ. το 3, είτε ένα αριθμό κινητής υποδιαστολής, π.χ. το 3.14159, είτε τέλος ένα αλφαριθμητικό, όπως το "Hello, world!". Οι απλούστεροι τελεστές είναι αυτοί που χρησιμοποιούνται σε αριθμητικές παραστάσεις και εφαρμόζονται σε όλους τους αριθμητικούς τύπους δεδομένων. Έχουμε ήδη δεί τον τελεστή της πρόσθεσης. Ο τελεστής της αφαίρεσης είναι ο - ενώ του πολλαπλασιασμού και της διαίρεσης οι *, / , αντίστοιχα. Στην C, όπως και στην αριθμητική ο τελεστής - είναι και ο τελεστής προσήμου, επομένως -x σημαίνει το αντίθετο οποιαδήποτε τιμής έχει η μεταβλητή x. Σημειώνουμε ακόμα ότι στην C οι μεταβλητές τύπου int και double μπορούν να συνδιαστούν σε μια παράσταση ελεύθερα. Αν και οι δύο τελεστέοι ενός δυαδικού τελεστή είναι τύπου int τότε το αποτέλεσμα θα είναι τύπου int. Αν ο ένας από τους δύο είναι τύπου int και ο άλλος ή και οι δύο είναι τύπου double τότε το αποτέλεσμα θα είναι τύπου double. Αυτό το γεγονός έχει ιδιαίτερη σημασία σε μια παράσταση όπως η 13 / 4. Αφού οι όροι της παράστασης είναι σταθερές τύπου int το αποτέλεσμα πρέπει να είναι επίσης τύπου int. Ο υπολογιστής διαιρεί το 13 με το 4 και αγνοεί το υπόλοιπο. Έτσι το αποτέλεσμα της πράξης είναι 3 και όχι 3.25. Αν θέλαμε να υπολογίσουμε το μαθηματικά σωστό αποτέλεσμα θα έπρεπε να γράψουμε 13.0/4 ή 13/4.0 ή 13.0/4.0.

Στην C υπάρχει ακόμα και ο τελεστής υπολοίπου % ο οποίος απαιτεί και οι δύο τελεστέοι του να είναι ακεραίου τύπου. Έτσι η τιμή της παράστασης 13 % 4 είναι 1 γιατί η διαίρεση του 13 με το 4 αφήνει υπόλοιπο 1. Όταν ένας από τους δύο τελεστέους είναι αρνητικός τότε τα αποτελέσματα μπορεί να διαφέρουν από υπολογιστή σε υπολογιστή. Το μόνο που προδιαγράφει ο σχεδιασμός της C είναι ότι η απόλυτη τιμή του υπολοίπου θα είναι μικρότερη από την απόλυτη τιμή του διαιρέτη.

Ο τύπος char

Στη C μεμονωμένοι χαρακτήρες αναπαριστώνται με τη χρήση του τύπου δεδομένων char. Η τιμή μιάς μεταβλητής τύπου char είναι ένας μικρός ακέραιος αριθμός και το σύνολο των αριθμητικών πράξεων που είναι διαθέσιμες για τους ακεραίους εφαρμόζονται και στις μεταβλητές ή σταθερές τύπου char. Σε κάθε χαρακτήρα που μπορούμε να πληκτρολογήσουμε αλλά και σε μερικούς ακόμα που δεν μπορούμε, αντιστοιχεί ένας μικρός ακέραιος αριθμός σύμφωνα με την κωδικοποίηση των χαρακτήρων με το όνομα ASCII, από τα αρχικά των λέξεων American Standard Code for Information Exchange. Έτσι, όταν πληκτρολογούμε ένα χαρακτήρα στον υπολογιστή μεταφέρετε ο κωδικός του χαρακτήρα, και αντίστροφα όταν ο υπολογιστής στέλνει στην οθόνη τον κωδικό ενός χαρακτήρα στην οθόνη εμφανίζεται ο χαρακτήρας. Στη C μπορούμε να υποδηλώσουμε τον κωδικό ενός χαρακτήρα γράφοντας τον χαρακτήρα μέσα σε απλά εισαγωγικά. Έτσι, 'A' είναι ένας ακέραιος αριθμός, ο κωδικός του χαρακτήρα A κατά την κωδικοποίηση ASCII. Πολλά περισσότερα για τον τύπο char θα δούμε σε επόμενες ενότητες.

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

Σε μια παράσταση που περιέχει περισσότερους από ένα τελεστές, η σειρά με την οποία εφαρμόζονται έχει σημασία. Μπορούμε πάντα να χρησιμοποιήσουμε παρενθέσεις για να επιβάλλουμε μια ορισμένη σειρά υπολογισμών μια και οι παραστάσεις μέσα σε παρενθέσεις υπολογίζονται πρώτα. Για παράδειγμα, στην παράσταση (x-2)*(y+3) θα υπολογιστούν πρώτα οι τιμές των παραστάσεων x-2 και y+3 και μετά θα εκτελεστεί ο πολλαπλασιασμός. Στην παράσταση όμως x-2*y+3 με ποιά σειρά θα γίνουν οι πράξεις; Στην C η σειρά με την οποία γίνονται οι πράξεις υπαγορεύονται από τους λεγόμενους κανόνες προτεραιότητας (precedence rules) και για αριθμητικές παραστάσεις έχουν ως εξής:

  1. Εφαρμόζονται πρώτα τυχόν μονικοί τελεστές προσήμου, σύμβολα - ή + χωρίς τελεστέο στα αριστερά τους.
  2. Εφαρμόζονται έπειτα τυχόν πολλαπλασιαστικοί τελεστές (*, / %) από τα αριστερά πρός τα δεξιά.
  3. Τέλος εφαρμόζονται οι προσθετικοί δυαδικοί τελεστές +, - πάλι από τα αριστερά πρός τα δεξιά.

Ας δούμε μερικά παραδείγματα: Η τιμή της παράστασης 9-12/3+3*2-1 είναι 10 γιατί γίνονται πρώτα οι πράξεις 12/3 και 3*2 και στη συνέχεια οι προσθέσεις και αφαιρέσεις. Ανάλογα, η τιμή της παράστασης 9-12/(3+3)*(2-1) είναι 7. Πράγματι, εκτελώντας πρώτα τις πράξεις μέσα στις παρενθέσεις έχουμε την ισοδύναμη παράσταση 9-12/6*1. Εκτελούμε τώρα την πράξη της διαίρεσης και απλοποιούμε την παράσταση στην ισοδύναμη 9-2*1. Τώρα εκτελούμε πρώτα την πράξη του πολλαπλασιασμού μια και αυτή έχει τη μεγαλύτερη προτεραιότητα και μετά την αφαίρεση. Οι ασκήσεις που ακολουθούν δίνουν την ευκαιρία στον αναγνώστη να εξασκηθεί στον υπολογισμό αριθμητικών παραστάσεων και να απομνημονεύσει την σειρά προτεραιότητας των τελεστών.

Ασκήσεις

  1. Μεταγλωττίστε και τρέξτε το πρόγραμμα αυτής της ενότητας.
  2. Υπολογίστε την τιμή των παρακάτω αριθμητικών παραστάσεων
    3+2*(8+7)-5*9-12%5
    10+9*((8+7)%6)+5*4%3*2+1
    16+1/3*6-12+8*2/5-7
  3. Γράψτε ένα πρόγραμμα το οποίο διαβάζει μια θερμοκρασία σε βαθμούς Fahrenheit και την μετατρέπει στην ισοδύναμη θερμοκρασία σε βαθμούς Celsius. Ο τύπος μετατροπής είναι C = (5/9)(F-32).
  4. Γράψτε ένα πρόγραμμα το οποίο διαβάζει τρείς αριθμούς κινητής υποδιαστολής και υπολογίζει το μέρο όρο τους.