Μεταβλητές, βασικοί τύποι δεδομένων και άλλα 

 

Τα δεδομένα

Τα δεδομένα (πληροφορίες-data) είναι απαραίτητα στοιχεία ενός προγράμματος, καθώς οι βασικές λειτουργίες ενός προγράμματος είναι η επεξεργασία αυτών των δεδομένων και η εξαγωγή αποτελεσμάτων (δηλαδή άλλα δεδομένα). Απαιτείται λοιπόν η δέσμευση  κάποιων  χώρων μνήμης για να αποθηκευτούν αυτά τα δεδομένα, κατα την διάρκεια της εκτέλεσης του προγράμματος. Αυτοί οι χώροι μνήμης που τους χρησιμοποιούμε για την φύλαξη δεδομένων όταν εκτελείται ένα πρόγραμμα, ονομάζονται ανάλογα με την χρήση τους σταθερές ή μεταβλητές και κάθε γλώσσα προγραμματισμού μας δίνει την δυνατότητα με διάφορους τρόπους να δηλώσουμε (καθορίσουμε) κάποιους τύπους μεταβλητών/σταθερών, τις οποίες θα χρησιμοποιήσουμε για την αποθήκευση δεδομένων, όταν εκτελείται ένα προγραμμα.

Οι σταθερές

Αρκετά πρόγραμματα απαιτούν ορισμένα δεδομένα τα οποία δεν αλλάζουν (ή δεν πρέπει ν' αλλαχθούν) ποτέ κατά την διάρκεια της εκτέλεσης του. Αυτά τα δεδομένα συνήθως καθορίζονται μια φορά και χρησιμοποιούνται όσο συχνά επιθυμούμε, κατά την διάρκεια λειτουργίας του προγράμματος.  Για παράδειγμα, όταν γράφετε ένα πρόγραμμα, μπορείτε να καθορίσετε ότι η τιμή του π είναι 3.14159 και να  χρησιμοποιείτε αυτή την τιμή όταν την χρειάζεστε, ξέροντας ότι είναι διαθέσιμη και σωστή. Οι σταθερές ορίζονται με εντολές του προεπεξεργαστού με την οδηγία #define και συνήθως χρησιμοποιούμε κεφαλαία γράμματα για να τις περιγράψουμε:

# define  PI 3.14159

(προσέξτε!  αυτή η εντολή δεν τελειώνει με το ερωτηματικό ";". Επίσης υπάρχει κενό μεταξύ του PI και του 3.14159)

Οι μεταβλητές

Αντίθετα με τις σταθερές, οι τιμές των μεταβλητών είναι δυνατόν να αλλάξουν κατα την διάρκεια της εκτέλεσης ενός προγράμματος.  Οι γλώσσες προγραμματισμού μας δίνουν την δυνατότητα να καθορίσουμε μεταβλητές και στην συνέχεια να τους δώσουμε  όποια τιμή επιθυμούμε, που έχει βέβαια σχέση με το πρόγραμμα. Η δήλωση των μεταβλητών γίνεται συνήθως στην αρχή του προγράμματος.

Οι τύποι δεδομένων στην C

Ένας τύπος στην C, αλλά και σε πολλές άλλες δημοφιλείς γλώσσες προγραμματισμού, καθορίζει τον τρόπο χειρισμού κάποιας μεταβλητής. Συγκεκριμένα προσδιορίζει το είδος των τιμών που μπορεί να αποθηκεύσει, και καθορίζει ένα σύνολο λειτουργιών που είναι δυνατόν να εφαρμοσθούν πάνω στις μεταβλητές αυτού του τύπου. Η C έχει κάποιους βασικούς τύπους δεδομένων, οι οποίοι έχουν προκαθοριστεί και μπορούν να χρησιμοποιηθούν οπουδήποτε σε ένα πρόγραμμα, υπό τον όρο να χρησιμοποιούνται σωστά (όλοι οι τύποι δεδομένων δεν υποστηρίζονται απαραίτητα από ολους τους compilers):

TΥΠΟΣ ΠΕΡΙΓΡΑΦΗ

char

Χαρακτήρας (π.χ. A,a, C,f ).
Εύρος: από -128 έως 127 (1 byte, 8bits)

Παράδειγμα καθορισμού (δήλωσης): char ch;  char ch1='A'; char ch2='\n'
Παράδειγματα χρήσης: ch='D';     printf("the character is: %c", ch);

unsigned char

Χαρακτήρας χωρίς πρόσημο (η ύπαρξη του εξαρτάται από τον compiler) 
Εύρος:από 0 έως 255(1 byte,8 bits)

short


Aκεραιος (π.χ. ...,-2,-1, 0,1,2,3, ..)
Εύρος:  από -32768 έως 32767 (2 bytes)
Παράδειγματα καθορισμού (δήλωσης):  short alpha; 
Παράδειγμα χρήσης: alpha=5; 

unsigned short


Aκεραιος χωρίς πρόσημο (0,1,2,3,...)
Εύρος:  από 0 έως 65535 (2 bytes)

int

Aκεραιος (π.χ. ...,-2,-1, 0,1,2,3, ..)
Εύρος: συνήθως από -2,147,483,648 έως 2,147,438,647(4bytes).
Παράδειγμα καθορισμού (δήλωσης):  int alpha; int alpha=2; /*αρχική τιμή */
Παράδειγμα χρήσης: alpha=5; printf("the integer is:%d", alpha);
Συνήθως είναι ο ίδιος με τον short ή τον long.

unsigned int

 

Ακεραιος χωρίς πρόσημο
Εύρος: συνήθως από 0 έως 4294967295 (4 bytes)

long

Εκτεταμένος ακεραιος
Εύρος: από -2147483648 έως 2147483647 (4 bytes)
Τυπικά είναι διπλάσιος του short

unsigned long

Εκτεταμένος ακεραιος χωρίς πρόσημο
Εύρος: από 0 έως 4294967295 (4 bytes)

float

Πραγματικός (κινητής υποδιαστολής)
Εύρος: συνήθως από 1.175494e-38 έως 3.402823e+38 (4 bytes)
Ακρίβεια: 6 ψηφίων
Παράδειγμα καθορισμού (δήλωσης):  float alpha;
Παράδειγμα χρήσης: alpha=5.3; printf("the float is:%f", alpha)

double

Εκτεταμένος πραγματικός
Εύρος: από 2.225074e-308 έως 1.797693e+308 (8 bytes)

Επειδή το εύρος των διαφόρων τύπων δεδομένων είναι δυνατόν να είναι διαφορετικό από compiler σε compiler με την χρήση του τελεστή sizeof (που μπορεί να μοιάζει με συνάρτηση, αλλά δεν είναι) μπορούμε να δείτε το εύρος κάθε τύπου δεδομένων στο compiler που χρησιμοποιείτε. H  sizeof() χρησιμοποιείται γιά να υπολογίσει το μέγεθος κάποιας μεταβλητής ή σταθεράς, αλλά μπορεί να παρει σαν παραμέτρους και τύπους δεδομένων:

#include <stdio.h>
main()
{
printf("\nSize of type char: %d bytes", sizeof(char));
printf("\n
Size of type int:  %d bytes", sizeof(int));
printf("\n
Size of type short: %d bytes", sizeof(short));
printf("\n
Size of type long: %d bytes", sizeof(long));
printf("\n
Size of type unsigned char: %d bytes", sizeof(unsigned char));
printf("\n
Size of type unsigned int: %d bytes", sizeof(unsigned int));
printf("\n
Size of type float: %d bytes", sizeof(float));
printf("\n
Size of type double: %d bytes", sizeof(double));

Ονομασίες μεταβλητών

Οι ονομασίες των μεταβλητών πρέπει να αρχίζουν με γράμμα ή με κάτω παύλα. Στην περιγραφή της ονομασίας μπορείτε να χρησιμοποιείστε και αριθμούς, αλλά δεν επιτρέπονται άλλοι ειδικοί χαρακτήρες. Τα πεζά και κεφαλαία γράμματα παίζουν ρόλο (είναι διαφορετικά!). Ενας συγκεκριμένος αριθμός χαρακτήρων είναι σημαντικοί για τον compiler και αυτός ο αριθμός εξαρτάται από τον συγκεκριμένο compiler που χρησιμοποιείτε (πχ για την turbo C τα πρώτα 32 ψηφία είναι σημαντικά)

Φυσικά για την ονομασία των μεταβλητών σας δεν θα πρέπει να χρησιμοποιείστε ονόματα που είναι δεσμευμένες λέξεις για την γλώσσα C. Οι δεσμευμένες λέξεις της standard C είναι:

DATA TYPES STORAGE CLASSES STATMENTS
char auto break
double extern case
enum register continue
float static default
int   do
long   else
short   for
struct   goto
union   if
unsigned   return
void   switch
sizeof   while
typdef    

Βέβαια ανάλογα με τον compiler που χρησιμοποιείτε, είναι δυνατόν να  υπάρχουν και άλλες δεσμευμένες λέξεις της C (cdel, const, far, fortran, huge, near, pascal, signed, volatile κ.α).

Μετατροπές τύπων

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

Πρόγραμμα - Α Πρόγραμμα - Β Πρόγραμμα - Γ
#include <stdio.h>
main()
{
  int x=20; 
  int y=3; 
  float z; 

  z=x/y; 
  printf("z=%f\n",z); 
#include <stdio.h>
main()
{
  int x=20; 
  float y=3.0; 
  float z; 

  z=x/y; 
  printf("z=%f\n",z); 
#include <stdio.h>
main()
{
  int x=20; 
  int y=3; 
  float z; 

  z= (float)x / y; 
  printf("z=%f\n",z); 

ενώ δεν θα μας δώσει κανένα μηνυμα λάθους, θα βγάλει λάθος αποτέλεσμα! Αντίθετα τα Προγράμματα Β και Γ θα δώσουν σωστό αποτέλεσμα...Αυτό γίνεται διότι στο Πρόγραμμα Α και οι δύο όροι της πράξης είναι ακέραιοι και συνεπώς το αποτέλεσμα θα είναι ακέραιο ανεξάρτητα αν το καταχωρούμε σε float μεταβλητή. Στο Προγραμμα Β οι όροι της πράξης είναι διαφορετικού τύπου και το αποτέλεσμα μετατρέπεται στον υψηλότερο ιεραρχικά τύπο, δηλαδή σε float. Στο Πρόγραμμα Γ, όταν γίνεται η πράξη μετατρέπουμε τον ένα από τους δύο ακέραιους όρους σε float (τον x) και το αποτέλεσμα πάλι μετατρέπεται στον υψηλότερο ιεραρχικά τύπο δηλαδή float. Γενικότερα ο υψηλότερος ιεραρχικά τύπος είναι ο double και ακολουθούν ο float, o long int, o unsigned int, o int και τέλος ο char. Τι θα γίνει άραγε αν η εντολή καταχώρησης γίνει z=(float)(x/y);

 Αρχικές τιμές μεταβλητών

Στις μεταβλητές μπορούμε να δώσουμε τιμές κατα την διάρκεια της εκτέλεσης του προγράμματος, είναι όμως δυνατόν να δώσουμε και αρχικές τιμές, όταν τις δηλώνουμε:

int alpha = 6;  /* δίνω αρχική τιμή */

alpha = 6;  /* δίνω τιμή μέσα στο πρόγραμμα */

Χειρισμός των σειρών χαρακτήρων (συμβολοσειρών)

Στην C δεν υπάρχει ιδιαίτερος τύπος για τον χειρισμό των συμβολοσειρών. Για την αποθήκευση τους χρησιμοποιούμε την δομή του πίνακα τύπου char και φυσικά έχουν τα χαρακτηριστικά του πίνακα. O τελευταίος χαρακτήρας του πίνακα είναι ο \0 (μηδενικός χαρακτήρας). Στο πρόγραμμα οι τιμές που δίνουμε στις μεταβλητές που έχουν χαρακτηριστεί σαν συμβολοσειρές, οριοθετούνται με λατινικά εισαγωγικά διπλά (") ή απλά  ( ' ) - δείτε παρακάτω

Παράδειγματα δήλωσης:    char minima1 [40];  

Αρχικές τιμές: 
            char minima1[20 ] = "hello"; 
            char minima2[ ] = {'h', 'e','l','l','o','\0'}; 

Παράδειγματα χρήσης: 

gets (minima1);               /* Δίνοντας τιμή στο minima1 από το πληκτρολόγιο με την gets*/
scanf("%s",minima2); /* Δίνοντας τιμή στο minima1 από το πληκτρολόγιο με την scanf*/
.......
strcpy(minima1, "hello");   /* δινοντας τιμή στην μεταβλητή minima1 στο πρόγραμμα */
.......
puts(minima1);    /* εμφανίζω το περιεχόμενο του minima1 στην οθόνη με την puts */
printf("Τo minina einai:\n", minima2);  /* εμφανίζω το περιεχόμενο του minima2 με την printf */

Παρατηρήσεις γιά τους χαρακτήρες και τις συμβολοσειρές: 

Πρόγραμμα - Α

Πρόγραμμα - Β

#include <stdio.h>
main()
{
char ch1; 

ch1='A';
printf("o ch1: %c\n", ch1);
printf("o ch1: %d\n", ch1);
}

#include <stdio.h>
main()
{
char ch1; 

ch1=65;
printf("o ch1: %c\n", ch1);
printf("o ch1: %d\n", ch1);
}

Αποτέλεσμα (και των δύο προγραμμάτων):
Α
65

#include <stdio.h>
main()
{
char seira [10] = "A"; 
char seira1 [10] = {'A', '\0'};

printf("%s\n", seira);
printf("%s\n", seira1);
}

Αποτέλεσμα:
Α
Α

Κατηγορίες μνήμης

Αργότερα... 

 

 
Στην προηγούμενη ενότητα

Στην αρχική σελίδα

Στην επόμενη ενότητα

 

Κ.Βασιλάκης / ΤΕΙ Κρήτης