ΚΕΝΤΡΟ ΠΛΗ.ΝΕ.Τ. Ν. ΦΛΩΡΙΝΑΣ

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

Τα σχόλια στη C γράφονται ανάμεσα στα σύμβολα /* και */ και μπορούν να καταλαμβάνουν και περισσότερες από μία γραμμές.

Ένα πρόγραμμα στη C πρέπει να ξεκινά με τις δηλώσεις #include <stdio.h> και main() και μετά όλο το πρόγραμμα περικλείεται στις αγκύλες { και }. Με τις αγκύλες αυτές δηλώνουμε γενικότερα μια ομάδα (μπλοκ) εντολών, κάτι αντίστοιχο δηλ. των δηλώσεων begin και end της Pascal.

#include <stdio.h>

main

{

            /* κύριο πρόγραμμα */

}

 

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

int  i;                /* ακέραιος από -32767 έως 32768 */

char  ch;             /* χαρακτήρας ascii από 0-255 */

char  name[20];        /* string 20 χαρακτήρων */

long  misthos;         /* μεγάλος ακέραιος */

float  b;             /* πραγματικός αριθμός */

double  a;           /* πραγματικός αριθμός μεγαλύτερης ακρίβειας */ 

 

Τα απλά εισαγωγικά (‘’) περικλείουν έναν και μόνον έναν χαρακτήρα (‘x’), ενώ τα διπλά εισαγωγικά ("xyz") μπορούν να περικλείουν οσουσδήποτε χαρακτήρες, αλλά στο τέλος της σειράς των χαρακτήρων προστίθεται ο χαρακτήρας που έχει ascii κωδικό ίσο με 0 και ο οποίος γράφεται ως εξής : \0’.

‘x’                    /* είναι μόνο ο χαρακτήρας x */

"x"                    /* είναι ίσο με x\0 */

 

Η εντολή εκτύπωσης συντάσσεται ως εξής :

printf("Ο αριθμός είναι %d και ο χαρακτήρας είναι %c \n", i, ch);

/* τα %d και %c είναι προσδιοριστές ακεραίων και χαρακτήρων αντίστοιχα*/

printf("Ο αριθμός είναι %ld και το όνομα είναι %s \n", mi, name);

/* τα %ld και %s είναι προσδιοριστές μεγάλων ακεραίων και strings αντίστοιχα */

printf("Ο αριθμός είναι %10.2f \n", a);

/* το %f είναι προσδιοριστής πραγματικών αριθμών και εδώ ορίζουμε 10 θέσεις με 2 δεκαδικά στην εκτύπωση */

 

Η χρήση του χαρακτήρα \n αλλάζει γραμμή στην οθόνη. Αν δεν τον χρησιμοποιήσουμε, τότε η επόμενη εντολή printf() θα συνεχίσει από εκεί που σταμάτησε η προηγούμενη.

Μπορούμε να δώσουμε αρχικές τιμές μαζί με τη δήλωση των μεταβλητών ως εξής :

int i = 0;

char ch = ‘A’;

char p = 65;               /* η ascii τιμή του Α είναι 65 */

 

Μια μεταβλητή που δηλώθηκε σαν χαρακτήρας με το char, μπορεί να εκτυπωθεί και με ακέραιο προσδιοριστή και μπορεί να πάρει μέρος και σε αριθμητικές πράξεις.

char ch = 65;             /* ch = A */

ch = ch + 1;             /* η ch γίνεται τώρα ίση με Β */

printf("η τιμή της c είναι αριθμός %d και χαρακτήρας %c", ch, ch);

/* θα τυπώσει τις τιμές 66 και c */

 

Οι σταθερές τιμές στη C δηλώνονται με δύο τρόπους :

#define  PI  3.1415926

const  float  PI = 3.1415926;

Η εντολή define δηλώνεται στην αρχή του προγράμματος και πριν από τη main(), ενώ η const δηλώνεται μαζί με τις άλλες δηλώσεις μεταβλητών.

 

Η εντολή καταχώρησης δεδομένων συντάσσεται ως εξής :

scanf("%d", &i);

scanf("%ld", &misthos);

scanf("%c", &ch);

scanf("%s", name);                /* το name είναι string και δεν θέλει το & */

 

Η C δεν έχει λογικούς τύπους δεδομένων, αλλά αν το αποτέλεσμα μιας σύγκρισης είναι αληθές, τότε επιστρέφει αποτέλεσμα 1, ενώ αν είναι ψευδές, τότε επιστρέφει αποτέλεσμα 0.

a = 5 > 3;                  /* το a γίνεται ίσο με 1 */

b = 4 > 10;                /* το b γίνεται ίσο με 0 */

 

Οι τελεστές σύγκρισης είναι όπως και στις άλλες γλώσσες, με τη διαφορά ότι για τη σύγκριση της ισότητας έχουμε το == και για την ανισότητα ένα από τα : <>, != και #.

if (a == 1)                 /* Έλεγχος ισότητας */

if (a = 1)                   /* Προσοχή! Καταχωρεί το 1 στο a και το αποτέλεσμα είναι αληθές (1) */

if (a != 1)                  /* έλεγχος ανισότητας */

 

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

i++                /* αυξάνει το i κατά ένα μετά τη χρήση του i */

++i                /* αυξάνει το i κατά ένα πριν τη χρήση του i */

i- -                 /* μειώνει το i κατά ένα μετά τη χρήση του i */

- -i                 /* μειώνει το i κατά ένα πριν τη χρήση του i */

 

Όταν διαιρούμε δύο ακεραίους, τότε με τον τελεστή / παίρνουμε το πηλίκο της ακέραιας διαίρεσης και με τον τελεστή % το υπόλοιπο.

p = a / 3;

ypol = a % 3;

Για να μην κάνουμε ακέραια διαίρεση, αλλά να προκύψει δεκαδικός αριθμός, πρέπει ο ένας τουλάχιστον τελεστέος να είναι δεκαδικός :

p = a / 3.0;

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

a = (int) 3.2 + (int) 4.8        /* το αποτέλεσμα είναι 3 + 4 = 7 */

b = (float) 3 / 1              /* το αποτέλεσμα είναι 3.0 */

Με τον τελεστή sizeof μπορούμε να βρούμε από πόσα bytes αποτελείται ένας τύπος δεδομένων ή μια μεταβλητή.

char  ch;

a = sizeof  ch;               /* οι χαρακτήρες πιάνουν 1 byte */

b = sizeof(int);               /* οι ακέραιοι χρειάζονται 2 bytes */

c = sizeof(long);              /* ο τύπος long θέλει 4 bytes */

 

Η εντολή if στη C συντάσσεται ως εξής :

if  (i < 10)

            printf("Ο αριθμός %d είναι μικρότερος του 10", i);

else

{

            printf("Ο αριθμός %d είναι μεγαλύτερος του 10", i);

            printf("Δώσε έναν άλλον αριθμό : ");

            scanf("%d", &i);

}

/* η συνθήκη της if περικλείεται σε παρενθέσεις και αν οι εντολές που ακολουθούν την if ή την else είναι παραπάνω από μία, τότε περικλείονται σε αγκύλες. Η χρήση της else δεν είναι υποχρεωτική πάντα */

 

Η C έχει τον τελεστή υπό συνθήκη () ? :, που μπορεί να αντικαταστήσει την εντολή if else :

max = (a > b) ? a : b;

Η παραπάνω εντολή είναι ισοδύναμη με την εξής if else :

if  (a > b)

            max = a;

else

            max = b;

 

Η εντολή case στη C συντάσσεται ως εξής :

switch (a)

{

            case 1 :

            case 2 :

                        printf("για τις τιμές 1 και 2 εκτελείται αυτή η εντολή \n");

                        break;

            case 3 :

                        printf("για την τιμή 3 εκτελείται αυτή η εντολή \n");

                        break;

            case 4 :

                        printf("για την τιμή 4 εκτελείται αυτή η εντολή \n");

                        printf("η εντολή break μάς βγάζει εκτός της switch \n");

                        break;

            default :

                        printf("εκτελείται όταν δεν ισχύει καμία προηγούμενη \n");

}

 

Η εντολή while στη C συντάσσεται ως εξής :

i = 1;

while  (i <= 10)

{

            printf("Δώσε έναν αριθμό : ");

            scanf("%d", &a);

            i = i + 1;

}

/* ο βρόχος εκτελείται όσο ισχύει η συνθήκη : i < 10 */

 

i = 1;

while  (i++ <= 10)

            scanf("%d", &a);

/* ο βρόχος αυτός κάνει ό,τι και ο προηγούμενος, με τη διαφορά ότι ενσωματώσαμε δύο εντολές σε μία, δηλ. την αύξηση του i κατά ένα και τη σύγκριση */

 

Για τον βρόχο repeat ... until, η C έχει την εξής εντολή :

i = 1;

do

{

            printf("Δώσε έναν χαρακτήρα : ");

            scanf("%d", &ch);

            i = i + 1;

} while  (i < 10);

/* ο βρόχος εκτελείται τουλάχιστον μία φορά και όσο ισχύει η συνθήκη : i<10. Διαφέρει από το repeat ... until της Pascal στο ότι ο βρόχος συνεχίζεται όσο η συνθήκη είναι αληθής, δεν φεύγουμε δηλ. όταν η συνθήκη γίνει αληθής */

 

Η εντολή επανάληψης for στη C συντάσσεται ως εξής :

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

{

            printf("Το %dο στοιχείο του πίνακα είναι %d : ", i, a[i]);

            sum = sum + a[i];

}

/* ξεκινάει με αρχική τιμή i=1, åëέγχει αν i<=10 και κάθε φορά αυξάνει το i κατά ένα */

 

 

Η C έχει δύο πολύ χρήσιμες εντολές, την break και την continue, για την έξοδο από έναν βρόχο ή την επιστροφή στην αρχή του βρόχου αντίστοιχα.

while (1)                     /* öáίνεται σαν ατελείωτος βρόχος, αλλά δεν είναι */

{

            scanf("%d", &i);

            if (i == 99)

                        break;                     /* έξοδος από τον βρόχο */

            else

                        continue;                   /* επιστροφή στην αρχή του βρόχου */

}

 

Ένας πίνακας (array) στη C δηλώνεται ως εξής :

int  a[20];                /* πίνακας ακεραίων μίας διάστασης */

int  b[10][10];             /* πίνακας ακεραίων δύο διαστάσεων */

char  ch[20];             /* πίνακας χαρακτήρων μίας διάστασης */

 

Η επεξεργασία των πινάκων γίνεται πολύ εύκολα με την εντολή for :

sum = 0;

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

{

            scanf("%d", &a[i]);

            sum = sum + a[i];

}

/* το 1ο στοιχείο ενός πίνακα είναι στη θέση 0 και όχι στην 1 */

 

Από τις συναρτήσεις συμβολοσειρών, χρήσιμες είναι οι εξής :

len = strlen(a);          /* επιστρέφει το πλήθος των χαρακτήρων της a */

strcat(s1, s2);              /* προσαρτά την s2 στην s1 */

strcpy(s1, s2); /* αντιγράφει την s2 στην s1 */

strcmp(s1, s2);            /* συγκρίνει τις δύο συμβολοσειρές */

 

Η συνάρτηση getchar() διαβάζει έναν μόνον χαρακτήρα από το πληκτρολόγιο και η putchar() τυπώνει έναν μόνον χαρακτήρα.

ch = getchar();

putchar(ch);

 

Η συνάρτηση gets() διαβάζει χαρακτήρες μέχρι να συναντήσει τον χαρακτήρα <enter> και η συνάρτηση puts() εμφανίζει συμβολοσειρές χαρακτήρων στην οθόνη.

gets(name);

puts(name);

 

Οι δείκτες (pointers) είναι πολύ χρήσιμοι στη C, αλλά είναι λίγο πονοκέφαλος για τους νεοεισερχόμενους στη γλώσσα. Στην ουσία, είναι ένας τύπος δεδομένων που δείχνει σε κάποια μεταβλητή, περιέχει δηλ. τη διεύθυνση στη μνήμη που έχει μια μεταβλητή. Για να βρούμε τη διεύθυνση μιας μεταβλητής, μπορούμε να χρησιμοποιήσουμε και τον τελεστή &. Οι δείκτες χρησιμοποιούνται κυρίως για να μπορεί να αλλάξει μια συνάρτηση τιμές στο πρόγραμμα που την κάλεσε (κλήση με αναφορά).

int  *p;                /* ο p είναι δείκτης ακεραίων */

int  i, j;                 /* ο i και ο j είναι απλοί ακέραιοι */

p = &i;                /* ο δείκτης p δείχνει τώρα στη μεταβλητή i */

j = *p;                /* o j έχει την τιμή που δείχνει ο p, δηλ. την τιμή του i */

printf("η διεύθυνση του i είναι : %p", &i);

 

Οι συναρτήσεις (functions) στη C είναι δύο ειδών : εκείνες που δεν επιστρέφουν κάποια τιμή στο όνομά τους ή επιστρέφουν δύο ή και παραπάνω τιμές και δηλώνονται με τη λέξη void και εκείνες που επιστρέφουν μία και μόνο μία τιμή στο όνομά τους και δηλώνονται με τον τύπο δεδομένων της τιμής που επιστρέφουν, δηλ. int, char, long κ.ά., πριν από το όνομα της συνάρτησης.

int  max(a, b)

            int  a, b;

{

            int  max;

            if (a > b)

                        max = a;

            else

                        max = b;

return  max;

}

/* η συνάρτηση αυτή έχει δύο ακέραια ορίσματα, τα a και b, και μια τοπική μεταβλητή, τη max. Επιστρέφει μια ακέραια τιμή, τη max, με τη χρήση της εντολής return. Προσέξτε πού δηλώνεται η κάθε μεταβλητή. Η εντολή που κα-λεί τη συνάρτηση max(), μπορεί να την καλεί με ακέραια ορίσματα σταθερών τιμών, π.χ. megistos = max(5, 3);, ή και με ακέραια ορίσματα μεταβλητών, π.χ. megistos = max(i, j); */

 

void  blank_lines()

{

            int  i, j;

            printf("Δώσε έναν ακέραιο : ");

            scanf("%d", &j);

            for (i=1; i<=j; i++)

            printf("\n");

}

/* αυτή η συνάρτηση είναι του τύπου void, δεν δέχεται ούτε επιστρέφει κάποια τιμή στη συνάρτηση που την καλεί και απλά εμφανίζει κενές γραμμές στην οθόνη όσες φορές της πούμε. Καλείται ως εξής : blank_lines(); */

 

void  exch_values(a, b)

            int  *a, *b;

{

            int temp;         /* τοπική μεταβλητή για προσωρινή θέση αποθήκευσης */

            temp = *a;

            *a = *b;

            *b = temp;

}

/* αυτή η συνάρτηση δέχεται δύο ακέραιες τιμές από το πρόγραμμα που την καλεί και ανταλλάσσει τις τιμές τους. Επιστρέφει, δηλ. ουσιαστικά δύο τιμές στο καλούν πρόγραμμα και για να γίνει αυτό, χρησιμοποιεί δείκτες σε ακεραίους και οι τιμές που δέχεται σαν είσοδο είναι οι διευθύνσεις των ακέραιων τιμών που θα ανταλλαγούν. Καλείται, δηλ., ως εξής : exch_values(&m, &n); */

 

back.gif (9867 bytes)

Επιστροφή