Vous êtes sur la page 1sur 7

ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ

ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ


ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ
ΕΡΓΑΣΤΗΡΙΟ ΔΙΑΝΕΜΗΜΕΝΩΝ
ΠΛΗΡΟΦΟΡΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΚΑΙ ΕΦΑΡΜΟΓΩΝ
http://courses.ece.tuc.gr
ΗΜΜΥ ΠΛΗ 101 - ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΗΛΕΚΤΡΟΝΙΚΟΥΣ ΥΠΟΛΟΓΙΣΤΕΣ ΚΑΙ ΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ
1H ΕΡΓΑΣΤΗΡΙΑΚH ΑΣΚΗΣΗ: ΥΠΟΣΤΗΡΙΚΤΙΚΟ ΥΛΙΚΟ
ΥΠΕΥΘΥΝΟΙ ΕΡΓΑΣΤΗΡΙΟΥ: ΑΝΕΣΤΗΣ ΓΕΩΡΓΙΟΣ, ΜΟΥΜΟΥΤΖΗΣ ΝΕΚΤΑΡΙΟΣ, ΜΑΡΑΓΚΟΥΔΑΚΗΣ ΙΩΑΝΝΗΣ

A. Μεταβλητές
Μια μεταβλητή (variable) είναι μία κατονομασμένη θέση αποθήκευσης δεδομένων στη μνήμη του
υπολογιστή σας. Χρησιμοποιώντας το όνομα μιας μεταβλητής στο πρόγραμμά σας, αναφέρεστε
στην ουσία στα αποθηκευμένα εκεί δεδομένα.

A.1. Ονόματα Μεταβλητών


Στην C, μία μεταβλητή πρέπει να δηλωθεί πριν μπορέσετε να τη χρησιμοποιήσετε. Η δήλωση μιας
μεταβλητής πληροφορεί το μεταγλωττιστή (compiler) για το όνομα της μεταβλητής και τον τύπο
των δεδομένων που φέρει. Στην C, τα ονόματα των μεταβλητών πρέπει να ακολουθούν τους εξής
κανόνες:
 Το όνομα μπορεί να περιέχει γράμματα, ψηφία και το χαρακτήρα υπογράμμισης (_).
 Ο πρώτος χαρακτήρας του ονόματος πρέπει να είναι ένα γράμμα. Η υπογράμμιση επίσης
είναι έγκυρη ως πρώτος χαρακτήρας, αλλά η χρήση της δεν συνιστάται.
 Υπάρχει διάκριση μεταξύ πεζών και κεφαλαίων, δηλαδή τα πεζά και τα κεφαλαία γράμματα
είναι διαφορετικά.
 Οι λέξεις - κλειδιά της C δεν μπορούν να χρησιμοποιηθούν ως ονόματα μεταβλητών. Μια
λέξη - κλειδί είναι μία λέξη που αποτελεί τμήμα της γλώσσας C.

Οι προγραμματιστές της C χρησιμοποιούν συχνά μόνο πεζά γράμματα για τα ονόματα των
μεταβλητών, αν και αυτό δεν είναι υποχρεωτικό. Πρέπει να δημιουργείτε ονόματα μεταβλητών
περιγραφικά των δεδομένων που πρόκειται να αποθηκεύσουν. Για παράδειγμα, ένα πρόγραμμα
που υπολογίζει τις δόσεις δανείου, θα μπορούσε να αποθηκεύσει την τιμή του επιτοκίου σε μία
μεταβλητή με το όνομα interest_rate. Το όνομα μεταβλητής βοηθά να γίνει σαφής η
χρήση της. Θα μπορούσατε για την προαναφερόμενη μεταβλητή να χρησιμοποιήσετε το όνομα a
ή dennis_ritchie   αλλά   αυτά   τα   ονόματα   δεν   βοηθούν   στην   κατανόηση   του   ρόλου   της
μεταβλητής. Το όνομα μιας μεταβλητής δεν απασχολεί τον compiler της C (εφόσον δεν
παραβιάζονται οι κανόνες ονοματολογίας που αναφέρθηκαν παραπάνω). Όμως, η χρήση της
μεταβλητής δεν θα είναι σαφής σε οποιονδήποτε άλλο εξετάσει τον πηγαίο σας κώδικα εάν το
όνομά της δεν βοηθά στην κατανόηση του ρόλου της.

Η χρήση μιας υπογράμμισης για το διαχωρισμό των λέξεων σε ένα όνομα μεταβλητής κάνει
εύκολη την ερμηνεία τους π.χ. interest_rate. Ένα άλλο στυλ λέγεται σημειογραφία καμήλας
(camel case). Αντί της χρήσης της υπογράμμισης για το διαχωρισμό των λέξεων, το πρώτο
γράμμα κάθε λέξης είναι κεφαλαίο με εξαίρεση το πρώτο γράμμα της πρώτης λέξης το οποίο
μπορεί να είναι πεζό. Αντί interest_rate η μεταβλητή θα γραφόταν InterestRate ή
interestRate (η δεύτερη επιλογή είναι πιο δημοφιλής στον προγραμματισμό).

1/7
A.2. Τύποι Δεδομένων
Η C περιέχει διάφορους τύπους αριθμητικών μεταβλητών. Χρειάζεστε διαφορετικούς τύπους
μεταβλητών επειδή οι διαφορετικές αριθμητικές τιμές έχουν ποικίλες απαιτήσεις μνήμης. Οι
μικροί ακέραιοι (για παράδειγμα 1, 199 και ­8) απαιτήσουν λιγότερη μνήμη για την αποθήκευσή
τους και οι υπολογισμοί με αυτούς εκτελούνται γρηγορότερα. Αντιθέτως, οι μεγάλοι ακέραιοι και
οι τιμές κινητής υποδιαστολής (123000000 ή 0,00000001234 για παράδειγμα) απαιτούν
μεγαλύτερο χώρο αποθήκευσης και περισσότερο χρόνο για τις μαθηματικές πράξεις.
Χρησιμοποιώντας τους κατάλληλους τύπους μεταβλητής, εξασφαλίζετε ότι το
πρόγραμμά σας εκτελείται όσο το δυνατόν αποτελεσματικότερα.

Πίνακας 1. Οι αριθμητικοί τύποι δεδομένων της C. Οι τύποι δεδομένων με την ένδειξη (*)
έχουν μέγεθος 8 bytes σε περίπτωση 64-bit επεξεργαστών/λειτουργικών συστημάτων.

Τύπος Μέγεθος Εύρος τιμών


μνήμης
char 1 byte -128 έως 127 ή 0 έως 255
unsigned char 1 byte 0 έως 255
signed char 1 byte -128 έως 127
int 2 ή 4 bytes -32,768 έως 32,767 ή -2,147,483,648 έως
2,147,483,647
unsigned int 2 ή 4 bytes 0 έως 65,535 ή 0 έως 4,294,967,295
short 2 bytes -32,768 έως 32,767
unsigned short 2 bytes 0 έως 65,535
long(*) 4 bytes -2,147,483,648 έως 2,147,483,647
unsigned long(*) 4 bytes 0 έως 4,294,967,295
float 4 byte 1.2E-38 έως 3.4E+38
double 8 byte 2.3E-308 έως 1.7E+308
long double 10 byte 3.4E-4932 έως 1.1E+4932

A.3. Δηλώσεις Μεταβλητών


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

όνομα_τύπου όνομα_μεταβλητής;

Το όνομα_τύπου καθορίζει τον τύπο της μεταβλητής και πρέπει να είναι μία από τις λέξεις
κλειδιά που παρατίθενται στην Πίνακα 1. Το όνομα_μεταβλητής είναι το όνομα της μεταβλητής,
το οποίο πρέπει να ακολουθεί τους κανόνες που αναφέρθηκαν προηγουμένως. Μπορείτε να
δηλώσετε πολλές μεταβλητές του ίδιου τύπου σε μία γραμμή, διαχωρίζοντας τα ονόματα με
κόμματα:

int count, number, start;  /* δήλωση τριών ακεραίων μεταβλητές */
float percent, total; /* δήλωση δύο μεταβλητών float */

2/7
int size; /* Η δήλωση δεσμεύει αποθηκευτικό χώρο για την size */
size = 0; /* Θέτει την τιμή 0 στο size */

double percent = 0.01, taxrate = 28.5; /* Δήλωση και αρχικοποίηση δύο μεταβλητών double */

A.4. Οργάνωση Μνήμης


Η μνήμη RAM του υπολογιστή μπορεί να θεωρηθεί ως ένας πολύ μεγάλος πίνακας από bytes. Κάθε
byte έχει τη διεύθυνσή του. Με τη δήλωση κάθε μεταβλητής δεσμεύεται (bind) ο απαραίτητος
χώρος στη μνήμη στον οποίο θα αποθηκεύεται το περιεχόμενο της μεταβλητής. Το μέγεθος του
χώρου που δεσμεύεται για κάθε μεταβλητή καθορίζεται από τον τύπο της μεταβλητής (Πίνακας
1). Μια σχηματική αναπαράσταση των προαναφερθέντων ακολουθεί:

char καταλαμβάνει 1 byte &c 1001 char c


short καταλαμβάνει 2 bytes 1002
int τυπικά καταλαμβάνει 4 bytes &s 1003 short s

Χρησιμοποιείτε το sizeof(<type>)για  1004
να βρίσκετε το μέγεθος του χώρου  1005
μνήμης που καταλαμβάνει μια μεταβλητή  &i 1006 int i
τύπου <type>
1007
1008
1009
1010
1011
1012

B. Συναρτήσεις εισόδου / εξόδου


Οι βασικές συναρτήσεις εισόδου / εξόδου είναι οι εξής δύο:
1. Η συνάρτηση printf με την οποία εκτυπώνουμε πληροφορίες στην τυπική έξοδο (standard
output). Η τυπική έξοδος αντιστοιχεί στην οθόνη του υπολογιστή.
2. Η συνάρτηση scanf με την οποία διαβάζουμε τιμές από την τυπική είσοδο (standard input).
Η τυπική είσοδος αντιστοιχεί στο πληκτρολόγιο του υπολογιστή.

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


επικεφαλίδας “stdio.h”:

#include <stdio.h>

B.1. Η συνάρτηση εκτύπωσης στην οθόνη printf


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

printf(“format string”, expr1, expr2, ... );

Το πρώτο όρισμα (δήλωση φόρμας) προσδιορίζει τι και πώς θα εκτυπωθεί. Τα σημεία εκτύπωσης
των εκφράσεων υποδεικνύονται με τη χρήση χαρακτήρων μορφοποίησης (Πίνακας 2). Η
απλούστερη μορφή έκφρασης (expr1, ...) είναι το όνομα μιας μεταβλητής και επιτρέπει
την εκτύπωση της τιμής της.

3/7
Πίνακας 2. Χαρακτήρες μορφοποίησης και αντίστοιχοι τύποι δεδομένων (συνάρτηση printf)

Χαρακτήρες Τύποι
μορφοποίησης δεδομένων
%d int 
%u unsigned 
%c char
%f float
%p pointer
%s string

Εκτός από τους χαρακτήρες μορφοποίησης του ανωτέρω πίνακα αναφέρουμε επίσης τους %e (ή
%E) που εκτυπώνουν πραγματικούς αριθμούς σε εκθετική μορφή με χρήση του χαρακτήρα e πριν
τον εκθέτη (ή τον χαρακτήρα E). Υπάρχουν ακόμη οι χαρακτήρες μορφοποίησης %g (ή %G) που
εκτυπώνουν τη συντομότερη μορφή μεταξύ %f και %e (ή %f και %E). Τέλος οι χαρακτήρες
μορφοποίησης %o και %x εκτυπώνουν ακεραίους αριθμούς στην οκταδική ή δεκαεξαδική τους
αναπαράσταση αντίστοιχα.

Για τον έλεγχο του πλήθους των ψηφίων εκτύπωσης, υπάρχει η γενικευμένη μορφή: %m.pX
όπου m είναι ο ελάχιστος αριθμός χαρακτήρων προς εκτύπωση, p είναι ο αριθμός των δεκαδικών
ψηφίων και X μπορεί να είναι d (ακέραιος), f ή g (πραγματικός).

Η δήλωση φόρμας μπορεί να περιέχει και ειδικούς χαρακτήρες. Οι πιο συνηθισμένοι είναι οι εξής:

Πίνακας 3. Ειδικοί χαρακτήρες (συνάρτηση printf).

Ειδικός Σημασία
χαρακτήρας
\n Νέα γραμμή
\t Διάστημα μεταβλητού μήκους με στοίχιση
\\ (tab)
χαρακτήρας '\'

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


printf.

Πίνακας 4. Παραδείγματα εκτυπώσεων με τη συνάρτηση printf

Κώδικας Εκτύπωση
printf("The color: %s\n", "blue"); The color: blue
printf("First number: %d\n", 12345); First number: 12345
printf("Second number: %04d\n", 25); Second number: 0025
printf("Third number: %i\n", 1234); Third number: 1234
printf("Float number: %3.2f\n", 3.14159); Float number: 3.14
printf("Hexadecimal: %x\n", 255); Hexadecimal: ff
printf("Octal: %o\n", 255); Octal: 377
printf("Unsigned value: %u\n", 150); Unsigned value: 150
printf("Just print the percentage sign %%\n"); Just print the percentage sign %

4/7
B.2. Η συνάρτηση εισόδου από το πληκτρολόγιο scanf
Η σύνταξη της εντολής scanf είναι αντίστοιχη με εκείνη της printf:

scanf(“format string”, expr1, expr2, …);

Το πρώτο όρισμα αποτελεί τη δήλωση φόρμας η οποία προσδιορίζει τι θα διαβαστεί από το


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

scanf(“%d”, &age);

Ακολουθούν οι πιο συνηθισμένοι χαρακτήρες μορφοποίησης και οι αντίστοιχοι τύποι:

Πίνακας 5. Χαρακτήρες μορφοποίησης και αντίστοιχοι τύποι δεδομένων (συνάρτηση scanf)


Χαρακτήρες Τύποι
μορφοποίησης δεδομένων
%d int 
%u unsigned 
%c char
%f float
%s string

Αναφορές
1. Εγχειρίδιο της C, Peter Aitken & Bradley L. Jones.
2. Σημειώσεις τρίτης διάλεξης (“Μεταβλητές - Σταθερές”) του μαθήματος “Εισαγωγή στους
Η/Υ και την Πληροφορική” στη Σχολή Ηλεκτρονικών Μηχανικών και Μηχανικών
Υπολογιστών του Πολυτεχνείου Κρήτης (Δρ. Κατερίνα Μανιά).
3. Τα παραδείγματα εκτυπώσεων του Πίνακα 4 προέρχονται από τη σελίδα
http://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-
output

5/7
Ένα πρόγραμμα που προβάλλει το μέγεθος των τύπων μεταβλητών
Ο κώδικας του προγράμματος που θα μελετήσουμε στην εργαστηριακή άσκηση δίνεται
παρακάτω. Δοκιμάστε να τον τρέξετε πριν προσέλθετε στο εργαστήριο. Δοκιμάστε επίσης να
δείτε πώς τρέχει βήμα προς βήμα με τον debugger. Χρησιμοποιήστε watches για να δείτε πώς
αλλάζουν οι τιμές των μεταβλητών κατά την βήμα προς βήμα εκτέλεση. Κατά τη διάρκεια του
εργαστηρίου θα έχουμε την ευκαιρία να πούμε περισσότερα και να επισημάνουμε κάποια σημεία
που αξίζει να γνωρίζετε. Αν έρθετε προετοιμασμένοι, έχοντας ήδη δοκιμάσει τον κώδικα μόνοι
σας, θα μπορέσετε να εμβαθύνετε καλύτερα στα θέματα που θα πραγματευθούμε στο εργαστήριο.

/* 
 * File:   main.c
 * Author: ganest
 *
 * Created on October 12, 2015
 * 
 * A program that prints the address of variables and sizes (in bytes) of variable types
 */
#include <stdio.h>

int main() {

  unsigned int intVar1, intVar2;

  printf("Print addresses of variables and values without initialization\n");
  printf("Address of variable 'intVar1' is:%p and value is: %d\n", &intVar1, intVar1 );
  printf("Address of variable 'intVar2' is:%p and value is: %d\n", &intVar2, intVar2 );

  intVar1 = 1;
  intVar2 = 2;

  printf("\nPrint the addresses of the variables and their values after initialization\n");
  printf("Address of variable 'intVar1' is:%p and value is: %d\n", &intVar1, intVar1 );
  printf("Address of variable 'intVar2' is:%p and value is: %d\n", &intVar2, intVar2 );

  printf("\nA  char is   %u bytes", sizeof(char));
  printf("\nAn int is    %u bytes", sizeof(int));
  printf("\nA  short is  %u bytes", sizeof(short));
  printf("\nA  long is   %u bytes", sizeof(long));
  printf("\nA  float is  %u bytes", sizeof(float));
  printf("\nA  double is %u bytes", sizeof(double));

  printf("\n");
  return 0;
}

Στην επόμενη ενότητα, σας δίνουμε μερικές ιδέες για επεκτάσεις του ανωτέρω κώδικα και
περαιτέρω μελέτη. Ο σκοπός μας είναι να σας δώσουμε τη δυνατότητα για μεγαλύτερη
εμβάθυνση μετά το πέρας του εργαστηρίου. Την τακτική αυτή θα ακολουθήσουμε και στις
επόμενες εργαστηριακές ασκήσεις ώστε να έχετε τη δυνατότητα να οργανώσετε καλύτερα το
χρόνο μελέτης σας και να εμπεδώσετε τις έννοιες και τις τεχνικές που θα παρουσιάζουμε κατά τη
διάρκεια των εργαστηρίων. Αν, κατά τη διάρκεια αυτής της επιπλέον προσωπικής μελέτης, έχετε
κάποιο πρόβλημα, απορία, παρατήρηση, μπορείτε να τα συζητάτε με τους συμφοιτητές σας στο
χώρο συζητήσεων του μαθήματος στo http://courses.ece.tuc.gr/. Αν η απορία ή το πρόβλημα που
έχετε δεν αντιμετωπιστεί με τον τρόπο αυτό, μπορείτε να προσέρχεστε στις ώρες γραφείου των
βοηθών του μαθήματος για επιπλέον υποστήριξη.

6/7
Επεκτάσεις και ιδέες για περαιτέρω μελέτη

 Αφού ολοκληρώσετε την άσκηση δοκιμάστε να τροποποιήσετε τον κώδικα ώστε να


διαβάζονται οι τιμές των μεταβλητών intVar1 και intVar2 με χρήση της scanf.
 Δοκιμάστε να “χαλάσετε” τον κώδικα για να δείτε τι μηνύματα σας δίνει ο μεταφραστής
και έτσι να εξοικειωθείτε με τα μηνύματα αυτά τα οποία, πολλές φορές, είναι δυσνόητα
για τον αμύητο. Συγκεκριμένα, μπορείτε να δοκιμάσετε:
◦ Να σβήσετε κάποιο ειδικό χαρακτήρα όπως τον ‘;’ στο τέλος κάθε εντολής, τον
χαρακτήρα ‘,’ ανάμεσα στα ορίσματα των συναρτήσεων, τους χαρακτήρες ‘{’ ή ‘}’ που
σηματοδοτούν την αρχή και το τέλος του μπλοκ εντολών της main, τους ‘<’ ή ‘>’ στο
include κ.λ.π.
◦ Να γράψετε λανθασμένα (σβήνοντας χαρακτήρες ή εισάγοντας νέους ή αλλάζοντας
κάποιους) τα ονόματα των συναρτήσεων και τις δεσμευμένες λέξεις που
χρησιμοποιούνται όπως printf, sizeof, return, usigned, int.
◦ Να γράψετε σε κάποιο σημείο λανθασμένα το όνομα κάποιας μεταβλητής.
 Δοκιμάστε να τρέξετε και να κάνετε ανάλογες “καταστροφές” των παραδειγμάτων κώδικα
που παρουσιάστηκαν κατά τη διάλεξη του μαθήματος.

7/7

Vous aimerez peut-être aussi