ΠΕΡΙΕΧΟΜΕΝΑ

 

Ζήτημα 1

Ζήτημα 2

Ζήτημα 3

Ζήτημα 4

Ζήτημα 5

Ζήτημα 6

Ζήτημα 7

Ζήτημα 8

Ζήτημα 9

Ζήτημα 10

Ζήτημα 11

Ζήτημα 12

Ζήτημα 13

Ζήτημα 14

Ζήτημα 15

Ζήτημα 16

Ζήτημα 17

Ζήτημα 18

Ζήτημα 19

Ζήτημα 20

Ζήτημα 21

Ζήτημα 22

Ζήτημα 23

Ζήτημα 24

 

Συνέχεια στις επόμενες ερωτήσεις ->

 

 


Ζήτημα 1ο:

 

Αναφέρατε τους σχεσιακούς και λογικούς τελεστές τους οποίους χρησιμοποιεί η γλώσσα C.

 

ΛΥΣΗ:

 

                        Σχεσιακοί Τελεστές                            Λογικοί Τελεστές

                          

                           >       Μεγαλύτερο Από                      &&    AND

                           > =    Μεγαλύτερο ή Ίσο                                    OR

                           <       Μικρότερο"Από                         !       ΝΟΤ

                           < =    Μικρότερο ή Ίσο

                           ==     Ίσο

                           !=      Διάφορο

 

 

Ζήτημα 2ο:

 

Αναφέρετε τους βασικούς τύπους δεδομένων της γλώσσας C, το χώρο αποθήκευσης, καθώς και το εύρος τιμών έκαστου.

 

ΛΥΣΗ:

 

               Τύπος                             Χώρος (bytes)               Εύρος Τιμών

 

char                                            8                         -128     to   +127

unsigned char                            8                              0     to   -225

signed char                                8                         -128     to   +127

int                                               16                    -32768    to   +32767

unsigned int                                16                             0    to   +65535

singed int                                    16                    -32768    to   +32767

short [int]                                    16                    -32768    to   +32767

unsigned short [int]                     16                             0    to   +65535

long [int]                                      32           -2147483648   to   +2147483647

unsigned long [int]                      32                             0    to   +4294967595

float                                            32              3.4 E - 38    to   3.4 E + 38

double                                        64              1.7 E – 308   to   1.7 E + 308

long double                                 64              1.7 E – 308   to   1.7 E + 308

 

 

 

Ζήτημα 3ο:

 

Δίδεται αρχείο το οποίο έχει 100 εγγραφές με την εξής δομή:

 

                                             struct rec   {

                                                   int code;

                                                   char eponymo [20];

                                                   char onoma[15];

                                                   long misthos;

                                             }

 

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

 

ΛΥΣΗ:

 

Δημιουργούμε τη Δομή rec και μέσα στη συνάρτηση main( ) δηλώνουμε μία μεταβλητή πίνακα με 100 θέσεις, όπου κάθε θέση είναι της δομής rec.

 

            Καθώς διαβάζεται το αρχείο, κάθε εγγραφή περνά και σε μία θέση του πίνακα. Για την ταξινόμηση χρησιμοποιούμε τη μέθοδο της φυσαλίδας (bubble short). Επίσης χρησιμοποιούμε μία ενδιάμεση μεταβλητή, την Temp, για να καταφέρουμε να υλοποιήσουμε τη μέθοδο της φυσαλίδας. Η μέθοδος αυτή ελέγχει αν το τρέχον σημείο είναι μικρότερο ή μεγαλύτερο από τα υπόλοιπα (ανάλογα με το αν η ταξινόμηση είναι αύξουσα ή φθίνουσα) και τότε το τοποθετεί πρώτο.

 

 

#include <stdio.h>

#include <stdlib.h>

#define MAXREC 100

 

struct rec   {

            int code;

            char eponymo [20];

            char onoma [15];

            long misthos;

};

main( )

{

            struct rec Temp, Egr [MAXREC];

            int, Ctr1, Ctr2;

            char ch ;

            FILE  *in ;

 

            clrscr( ) ;

            if( (in =fopen (“FILE1”, “rb”) ) == NULL)   {

                        printf (“Σφάλμα Κατά το Άνοιγμα Του Αρχείου. \n”);

                        exit (0);

            }

 

            for(Ctr1=0; Ctr1<MAXREC; Ctr1++)

                        fscanf(in, “%d %s %s %ld”, &Egr [Ctr1].code, Egr[Ctr1].eponymo, Egr[Ctr1].onoma, &Egr[Ctr1].misthos);

 

            clrscr( );

            for (Ctr1 = 0; Ctr1<MAXREC; Ctr1++)   {

                        for (Ctr2 = Ctr1;  Ctr2 <MAXREC; Ctr2++)   {

                              if(Egr[Ctr1].code > Egr [Ctr2].code)  {

                                    Temp.code = Egr [Ctr2].code;

                                    strcpy (Temp.eponymo, Egr[Ctr2].eponymo);

                                    strcpy (Temp.onomaCtr2].onoma);

                                    Temp.misthos = Egr [Crt2].misthos;

 

                                    Egr[Ctr2].code = Egr[Ctr1].code;

                                    strcpy (Egr[Ctr2].eponymo, Egr[Ctr1].eponymo);

                                    strcpy (Egr[Ctr2].onoma, Egr[Ctr1].onoma);

                                    Egr[Ctr2].misthos = Egr[Ctr1].misthos;

 

                                    Egr[Ctr2].code = Temp.code;

                                    strcpy (Egr[Ctr1].eponymo,Temp.eponymo);

                                    strcpy (Egr[Ctr1].onoma,Temp.onoma);

                                    Egr[Ctr1].misthos =Temp.misthos;

                              }

            }

}

fclose(in);

 

clrscr( );

for (Ctr1=0; Ctr1<MAXREC; Ctr1++)   {

            printf(“ Κωδικός : %d \n”, Egr[Ctr1].code);

            printf(“ Επώνυμο : %s \n”, Egr[Ctr1].eponymo);

            printf(“ Όνομα : %s \n”, Egr [Ctr1].onoma);

            printf(“ Μισθός : %ld \n”, Egr[Ctr1].misthos);

            printf(“------------------------------------------------\n

            ch = getche( );

}

 

 

Ζήτημα 4ο:

 

Εξηγήστε την έννοια του δείκτη (pointer) και πως δηλώνονται οι μεταβλητές αυτού του τύπου στη C.

 

ΛΥΣΗ:

 

            Οι μεταβλητές του τύπου pointer περιέχουν τη διεύθυνση (θέση μνήμης) μιας άλλης μεταβλητής. “Δείχνουν” δηλαδή σε άλλες μεταβλητές στη μνήμη.

            Μία δήλωση pointer περιλαμβάνει έναν Βασικό Τύπο, ένα * και το όνομα της μεταβλητής. Η γενική μορφή δήλωσης pointer είναι:

 

                                                                                                type  *name;

 

όπου type μπορεί να είναι οποιοσδήποτε αποδεκτός C τύπος (καλείται βασικός τύπος) και *name είναι το όνομα της pointer μεταβλητής.

 

 

Ζήτημα 5ο:

 

Να γράψετε ένα πρόγραμμα σε γλώσσα C το οποίο να διαβάζει από την οθόνη μία σειρά χαρακτήρες, να μετρά το πλήθος των αριθμητικών χαρακτήρων, των κενών και των αλφαβητικών χαρακτήρων, και να εμφανίζει στην οθόνη τα αποτελέσματα.

 

ΛΥΣΗ:

 

Εδώ θα χρησιμοποιήσουμε τρεις αθροιστές, ένα για τα κενά, ένα για τα ψηφία, και ένα για τους χαρακτήρες.

Επίσης χρησιμοποιούμε τα macros isalpha( ), isspace( ) και isdigit( ) τα οποία είναι δηλωμένα στο ctype.h και επιστρέφουν True αν το όρισμα είναι χαρακτήρας, κενό ή ψηφίο αντίστοιχα.

 

 

#include <stdio.h>

#include <ctype.h>

main( )

{

            char *str;

            int SpcCntr = 0, DigCntr = 0, AlpCntr = 0;

 

            clrscr( );

            printf( “ Δώσε Ένα Αλφαριθμητικό: “);

            gets(str);

 

            while (*str)   {

                        if (isspace (*str) ) SpcCntr++;

                        if(isdigit (*str) ) DigCntr++;

                        if(isalpha (*str) ) AlphCntr++;

                        *str++;

            }

 

            printf (“Κενά                : %d \n”, SpcCntr);

            printf (“Ψηφία              : %d \n”, SpcCntr);

            printf (“Χαρακτήρες    : %d \n”, SpcCntr);

}

 

 

Ζήτημα 6ο:

 

Να γραφεί Συνάρτηση της C που να δέχεται ως παράμετρο έναν πίνακα ακεραίων Α, με διαστάσεις 3Χ4, και να τυπώνει στην οθόνη τα στοιχεία του σε μορφή πίνακα τριών γραμμών και τεσσάρων στηλών.

 

ΛΥΣΗ:

 

#include <stdio.h>

#define LINES 3

#define COLLS 4

main( )

{

            /* Αρχικοποίηση του πίνακα */

 

            int pin[LINES][COLLS] = { 1, 2, 3, 4,

                                                       5, 6, 7, 8,

                                                       9, 0, 1, 2

                                                     };

 

            clrscr();

            Arr_Funct(pin);

}

 

Arr_Func(int A [LINES] [COLLS])

            register int x, y;

 

            for( x=0; x<LINES; x++)   {

                        for (y=0; y<COLLS; y++)   {

                                    printf (“%d”, A[x] [y]);

                        }

                        printf(“\n”);

            }

}

 

 

Ζήτημα 7ο:

 

Να γραφεί συνάρτηση C που να δέχεται ως παράμετρο ένα πίνακα ακεραίων Α με 3 γραμμές και 4 στήλες και να τυπώνει στην οθόνη τον ανάστροφό του, δηλαδή έναν πίνακα με 4 γραμμές και 3 στήλες.

 

ΛΥΣΗ:

 

#include <stdio.h>

#define LINES 3

#define COLLS 4

main( )

{

            / * Αρχικοποίηση του Πίνακα Με Δικές Μας Τιμές  * /  int

            pin [LINES] [COLLS] = { 1,  2,  3,  4,

                                                     5,  6,  7,  8,

                                                     9,  0,  1,  2

                                                   };

            clrscr( );

 

            Arr_Funct(pin);

}

Arr_Funct(int A[LINES] [COLLS])

{

            register int x,y;

 

            for (x = 0; x<COLLS; x++)   {

                        for (y = 0; y<LINES;  y ++)

                                    printf(“%d”, A[y][x]);

                        printf(“ \ n “);

            }

}

 

 

Ζήτημα 8ο:

 

Εξηγήστε τον τρόπο με τον οποίο ενεργούν οι εντολές της C break και continue και δώστε κατάλληλα παραδείγματα.

 

ΛΥΣΗ:

 

            Η δήλωση break έχει δύο χρήσεις. Η πρώτη είναι να τελειώνει μια case μέσα στο switch. Η δεύτερη είναι να οδηγεί σε άμεσο τερματισμό ενός loop, προσπερνώντας τον κανονικό έλεγχο του loop.

            Όταν μία break συναντάται μέσα σε ένα while, αυτό σταματά αμέσως και ο έλεγχος της ροής περνά στη συνθήκη, την οποία και θα μετατρέψει σε ψευδή. Όταν συναντάται σε for ή while, αυτό σταματά αμέσως και ο έλεγχος της ροής περνά στην αμέσως επόμενη εντολή έξω από το loop.

            Σε περίπτωση φωλιαμένων βρόγχων, η χρήση της break θα προκαλέσει έξοδο από τον εσωτερικό βρόγχο. Ένα break που χρησιμοποιείται μέσα σε switch, θα προκαλέσει έξοδο από το switch και όχι από το loop, που αυτή βρίσκεται. Π.χ.:

 

for(t=0; t<100; t++)  {                                               switch(choice)  {

            printf(“%d”, t)                           ή                          case 1: x =10;

            if (t==10)  break;                                                              y = x;

}                                                                                                    break;

                                                                                        case 2:

                                                                                                .

                                                                                                .

                                                                                                .

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

Στις περιπτώσεις while και do/while η δήλωση continue θα στείλει τον έλεγχο κατευθείαν στο conditional test (τεστ συνθήκης) και κατόπιν θα συνεχίσει την εκτέλεση του βρόγχου. Στην περίπτωση της for, πρώτα το τμήμα της αύξησης θα εκτελεστεί κι έπειτα η συνθήκη και τέλος το loop θα συνεχιστεί. Π.χ.:

 

do    {                                                  ή                      for(t=0; t<100; t++)  {

      scanf(“%d”, &x);                                                               scanf(“%d”, &x);

      if(x<0) continue ;                                                               if(x<0) continue ;

      printf(“%d”, x);                                                                   printf(“%d”, x);

}  while (x!=100);                                                         }

 

 

Ζήτημα 9ο:

 

Έστω οι παρακάτω εντολές οι οποίες είναι μέρος ενός προγράμματος της γλώσσας C.

                                                      x=5;

                                                      y=10;

                                                      z1=x;

                                                      z2=x++;

                                                      z3=++x;

                                                      y++;

 

Μετά την εκτέλεση των εντολών να αναφέρετε τα περιεχόμενα των μεταβλητών x, y, z1, z2, z3.

 

ΛΥΣΗ:

 

Τα περιεχόμενα των μεταβλητών είναι:

 

                                                      x=7

                                                      y=11

                                                      z1=5

                                                      z2=5

                                                      z3=7

 

Ζήτημα 10ο:

 

Έστω οι παρακάτω εντολές οι οποίες είναι μέρος ενός προγράμματος της γλώσσας C.

 

int a [100];

int *pa;

int x1, x2 ;

 

for (k=1 ; k<=100 ; k++)

            a[k] = k+1;

pa = &a[0];

x1 = *(pa + 5);

 

Ποιο είναι το περιεχόμενο της μεταβλητής x1. Υπάρχει άμεση σχέση με κάποιο στοιχείο του πίνακα, και με ποιο.

 

ΛΥΣΗ:

 

Το περιεχόμενο της x1 θα είναι 6. Υπάρχει σχέση με το στοιχείο 5 του πίνακα (δηλαδή το έκτο στοιχείο, αφού οι πίνακες ξεκινούν από το 0).

 

 

Ζήτημα 11ο:

 

Να γράψετε πρόγραμμα που θα διαβλαζει τη θερμοκρασία σε βαθμούς Φαρενάιτ και την μετατρέπει σε βαθμούς Κελσίου. Ο τύπος της μετατροπής είναι:

                                                            C = 5 * (F –32) / 9

Όπου F οι βαθμοί σε κλίμακα Φαρενάιτ και C οι βαθμοί σε κλίμακα Κελσίου.

 

ΛΥΣΗ:

 

main( )

{

            float C, F;

 

            clrscr( );

            printf(“Δώσε Βαθμούς Φαρενάιτ: \n”);

            scanf(“%f”, &F);

           

            C = 5 * (F – 32) / 9 ;

            printf(“Οι %f Βαθμοί Φαρενάιτ Είναι %f Βαθμοί Κελσίου. \ n”, F, C);

 

 

Ζήτημα 12ο:

 

Να γράψετε πρόγραμμα που να διαβάζει το επώνυμο και τον βαθμό 20 μαθητών και να τα αποθηκεύει σε πίνακα του οποίου κάθε στοιχείο θα είναι μία κατάλληλη δομή. Στη συνέχεια για κάθε μαθητή θα τυπώνει στην οθόνη το επώνυμο και το βαθμό του, και το χαρακτηριστικό επίδοσής του ανάλογα με τον βαθμό του.

            Ο χαρακτηρισμός επίδοσης είναι:

                                                9 < Βαθμός <= 12 ΜΕΤΡΙΑ

                                                12 < Βαθμός <= 15 ΚΑΛΑ

                                                15 < Βαθμός <= 18 ΠΟΛΥ ΚΑΛΑ

                                                18 < Βαθμός <=20 ΑΡΙΣΤΑ

Στο τέλος να τυπωθεί το πλήθος των μαθητών κάθε κατηγορίας επίδοσης, δηλ. ΑΡΙΣΤΑ, ΠΟΛΥ ΚΑΛΑ, κλπ.

 

ΛΥΣΗ:

 

#define ITEMS 0

#include <stdio.h>

main( )

{

            struct  {

                        char L_Name [20];

                        int Grade;

            }  Domi [ITEMS];

            int i;

            int Count1=0, Count2=0, Count3=0, Count4=0;

            for (i=0; i<ITEMS; i++)   {

                                    scanf(“%s”, Domi[i].L_Name);

                                    scanf(“%d”, &Domi [i].Grade) ;

            }

            clrscr( ) ;

            for (i = 0 ; i <ITEMS ; i++)   {

                        printf (“%s %d”, Domi[i].L_Name, Domi[i].Grade);

                        if ( (Domi[i].Grade>9) && (Domi[i].Grade <=12) )   {

                                    Count1++;

                                    printf(“ΜΕΤΡΙΑ \ n”);

if ( (Domi[i].Grade>12) && (Domi[i].Grade <=15) )   {

                                    Count2++;

                                    printf(“ΚΑΛΑ \ n”);

if ( (Domi[i].Grade>15) && (Domi[i].Grade <=18) )   {

                                    Count3++;

                                    printf(“ΠΟΛΥ ΚΑΛΑ \ n”);

if ( (Domi[i].Grade>18) && (Domi[i].Grade <=20) )   {

                                    Count4++;

                                    printf(“ΑΡΙΣΤΑ \ n”);

                        }

            }

            printf( “ \n \ ΚΑΤΗΓΟΡΙΕΣ \ n”);

            printf( “ ----------------------------\n”);

            printf( “ ΜΕΤΡΙΑ         %d \ n”, Count1);

            printf( “ ΚΑΛΑ             %d \ n”, Count2);

            printf( “ ΠΟΛΥ ΚΑΛΑ  %d \ n”, Count3);

            printf( “ ΑΡΙΣΤΑ          %d \ n”, Count4);

 

}

 

 

Ζήτημα 13ο:

 

Να γράψετε πρόγραμμα που να εμφανίζει μία οθόνη επιλογής με τις πράξεις:

                                       1. ΠΡΟΣΘΕΣΗ

                                       2. ΑΦΑΙΡΕΣΗ

                                       3. ΠΟΛ/ΣΜΟΣ

                                       4. ΔΙΑΙΡΕΣΗ

Ο χρήστης θα επιλέγει την πράξη και θα δίνει τους δύο αριθμούς. Ο υπολογιστής θα εκτελεί την αντίστοιχη πράξη και θα εμφανίζει το αποτέλεσμα.

Υπόδειξη:Το πρόγραμμα να γίνει με χρήση της εντολής case. Επίσης, να γίνεται έλεγχος, ώστε να μη γίνεται έλεγχος με το 0 και σε τέτοια περίπτωση να εμφανίζεται κατάλληλο μήνυμα.

 

ΛΥΣΗ:

 

#include <stdio.h>

#include <conio.h>

 

main( )

{

            int Choice;

            float num1, num2, Apot;

 

            clrscr( );

            printf(“Μενού Επιλογών \ n”);

            printf(“----------------------  \ n”);

            printf(“1.     ΠΡΟΣΘΕΣΗ\ n”);

            printf(“2.       ΑΦΑΙΡΕΣΗ\ n”);

            printf(“3.      ΠΟΛ/ΣΜΟΣ\ n”);

            printf(“4.         ΔΙΑΙΡΕΣΗ\ n”);

            printf(“\ n \ n”);

            printf(“ΕΠΙΛΟΓΗ . . ”);

            gotoxy(12,9);

            Choice = getche( );

 

            printf(“ \n \n Δώσε Τους Δύο Αριθμούς :”);

            scanf(“%f %f”, &num1, &num2);

            switch (Choice)      {

                        case ‘1’ :

                                    Apot = num1+num2;

                                    break;

                        case ‘2’ :

                                    Apot = num1-num2;

                                    break;

                        case ‘3’ :

                                    Apot = num1*num2;

                                    break;

                        case ‘4’ :

                                    if(num2 == 0)  Apot = NULL;

                                    else Apot = num1/num2;

            }

            if (Apot!=NULL) printf(“Το Αποτέλεσμα Είναι %f \n”, Apot);

            else printf(“Δεν Γίνεται Διαίρεση Με 0”);

}

 

 

Ζήτημα 14ο:

 

Περιγράψτε την εντολή scanf. Εξηγήστε τον τρόπο λειτουργίας της με μεταβλητές ακέραιες, πραγματικές, string και χαρακτήρες και δώστε κατάλληλα παραδείγματα.

 

ΛΥΣΗ:

 

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

                                    scanf(“Control String”, argument list);

            Οι καθοριστές μορφοποίησης εισόδου ορίζονται με ένα % και “λένε” στη scanf( ) τι είδους δεδομένα θα διαβαστούν. Π.χ. το %s ορίζει ένα string, το %d έναν ακέραιο, το %f έναν πραγματικό αριθμό, ενώ το %c ορίζει έναν χαρακτήρα.

            Όλες οι μεταβλητές που χρησιμοποιούνται για να αποθηκεύσουν τιμές μέσω της scanf( ) πρέπει να περνιούνται μέσω των διευθύνσεών τους. Αυτό σημαίνει ότι όλα τα ορίσματα που χρησιμοποιούνται πρέπει να είναι δείκτες στις μεταβλητές χρησιμοποιούμενοι σαν ορίσματα. Π.χ.:

                                    scanf(“%d”, &count);

                                    scanf(“%f”, &pragm);

                                    scanf(“%c”, &ch);

            Τα string διαβάζονται σαν Array Of Char και στη C, το όνομα ενός πίνακα, χωρίς δείκτες είναι η διεύθυνση του πρώτου στοιχείου του πίνακα. Έτσι, για να διαβάσουμε ένα string θα γράψουμε:

                                                                        scanf(“%s”, str);

            Σ’ αυτή την περίπτωση το str είναι ένας πίνακας από χαρακτήρες. Το str μέσα στην scanf( ) είναι ήδη ένας δείκτης και δεν υπάρχει λόγος για τη χρήση του τελεστή &.

 

            Ένας χαρακτήρας κενού στο control string προκαλεί την scanf( ) να διαβάσει και να αγνοήσει ένα ή περισσότερους χαρακτήρες κενού στην είσοδο. Ένας χαρακτήρας κενού μπορεί να είναι space, ή νέα γραμμή. Στην ουσία ένας χαρακτήρας κενού στο control string οδηγεί την scanf( ) να διαβάσει αλλά όχι και να αποθηκεύσει κάθε αριθμό white-space χαρακτήρων έως ότου συναντηθεί non-white space character.

            Ένα non-white space character προκαλεί την scanf( ) να διαβάσει και να απορρίψει ένα χαρακτήρα. Π.χ. “%d,%d , λέει στη scanf( ) να διαβάσει έναν ακέραιο, να διαβάσει και να αγνοήσει ένα κόμμα και τέλος να διαβάσει έναν άλλο ακέραιο. Αν ο χαρακτήρας αυτός δεν ανιχνευτεί, η scanf( ) τερματίζεται.

 

 

Ζήτημα 15ο:

 

Περιγράψτε την εντολή printf( ). Εξηγήστε τον τρόπο λειτουργίας της με μεταβλητές ακέραιες, πραγματικές, string και χαρακτήρες, και δώστε τα κατάλληλα παραδείγματα.

 

ΛΥΣΗ:

 

            Είναι μία συνάρτηση (και όχι εντολή) εξόδου γενικών καθηκόντων. Χρησιμοποιείται ως εξής:

                                                printf(“Control String”, Argument List);

            Το control string εννοεί δύο τύπους πραγμάτων. Το πρώτο περιέχει χαρακτήρες οι οποίοι πρέπει να τυπωθούν στην οθόνη. Ο δεύτερος τύπος περιέχει εντολές μορφοποίησης οι οποίες ορίζουν τον τρόπο με τον οποίο θα τυπώνονται τα ορίσματα. Μία εντολή μορφοποίησης ξεκινά με το % και ακολουθείται από τον κωδικό μορφοποίησης. Σημειώνεται ότι τα ορίσματα που ακολουθούν πρέπει να είναι ακριβώς ίδια στον αριθμό με τις εντολές μορφοποίησης. Π.χ. το %s ορίζει ένα string, το %d έναν ακέραιο, το %f έναν πραγματικό αριθμό, ενώ το %c έναν χαρακτήρα. Οι εντολές μορφοποίησης διαθέτουν τροποποιητές οι οποίοι ορίζουν το μήκος του πεδίου, τον αριθμό των δεκαδικών σημείων και την left justification flag.

            Ένας ακέραιος μεταξύ του % και της εντολής μορφοποίησης δρα σαν καθοριστής μήκους. Αυτό γεμίζει με 0 ή κενά το αποτέλεσμα για να σιγουρέψει το μέγεθος. Αν θέλουμε να γεμίσουμε με 0, θα τοποθετήσουμε το 0 πριν τον καθοριστή του πεδίου. Π.χ. %05d θα ορίσει έναν αριθμό 5 ψηφίων με μηδενικά μπροστά του. Για να ορίσουμε ένα συγκεκριμένο αριθμό δεκαδικών ψηφίων τοποθετούμε το δεκαδικό σημείο μετά τον καθοριστή μήκους και έπειτα τον αριθμό που θα ορίσει τα δεκαδικά σημεία. Π.χ.: %10.4f, θα ορίσει έναν αριθμό με δέκα ακέραια και 4 δεκαδικά ψηφία.

 

            Παραδείγματα της printf( )

 

            printf (“%5.2f”, 123.234);        Θα επιστρέψει            123.23

            printf (“%d”, num);                  Θα επιστρέψει την τιμή του num

            printf (“%s”, str);                      Θα επιστρέψει την τιμή του str

            printf (“%c”, ch);                      Θα επιστρέψει την τιμή του ch

 

 

Ζήτημα 16ο:

 

Να γραφεί πρόγραμμα το οποίο να τυπώνει στην οθόνη όλους τους χαρακτήρες ASCII, έτσι ώστε να τυπώνεται ο χαρακτήρας και δίπλα η τάξη του. Να τυπώνονται 15 χαρακτήρες ανά γραμμή.

 

ΛΥΣΗ:

 

            Για να τυπώσουμε 15 χαρακτήρες ανά γραμμή εκτελούμε μία ακέραια διαίρεση υπολοίπου με το 15 και ελέγχουμε αν είναι 0.

            Οι χαρακτήρες με κωδικό 6, 7, 8, 10, 11 και 13 είναι μη εκτυπώσιμοι και εάν τους εμφανίσουμε θα προκαλέσουν πρόβλημα στην επιθυμητή μορφή εξόδου αποτελεσμάτων, στην οθόνη.

 

#include <stdio.h>

main( )

{

                  char ch;

                  int i;

 

                  clrscr( );

                  for(i = 0; i <=255; i++)     {

                        if (! (i%15) )  printf(“\n”);

                        if( ( i == 6) (i == 7) (i == 8) (i == 10) (i == 11) (i == 13)

                                    printf(“%d. “, i);

                        else printf(“%d%c  “, i, i);

                  }

}

 

 

Ζήτημα 17ο:

 

Δίδεται ο παρακάτω πίνακας:

            3   8   10   1

            5   9    7    3

            8   3    6    9

Να γραφεί δήλωση δημιουργίας ενός πίνακα ακεραίων ο οποίος να περιέχει ως στοιχεία τα στοιχεία του παραπάνω πίνακα (δηλαδή με τη δήλωση του πίνακα να γίνεται και η εισαγωγή των παραπάνω τιμών, χωρίς να δίνονται εντολές προγράμματος).

 

ΛΥΣΗ:

 

Iint Pinakas [3] [4] =  {   3   8   10   1

                                       5   9    7    3

                                       8   3    6    9

                                 } ;

 

 

 

 

Zήτημα 18ο:

 

Να γραφεί πρόγραμμα C που θα δέχεται σαν παραμέτρους (command line arguments) το ποσό του κεφαλαίου και το ετήσιο επιτόκιο, θα υπολογίζει τον ετήσιο τόκο και θα τα τυπώνει στην έξοδο όπως στο εξής παράδειγμα:

                       

                                    ΚΕΦΑΛΑΙΟ  :  5000000

                                    ΕΠΙΤΟΚΙΟ   :  10%
                                    ΤΟΚΟΣ        :  500000

 

ΛΥΣΗ:

 

            Τα ορίσματα που περνιούνται στο argv είναι αλφαριθμητικά γιατί το argv αποτελεί ουσιαστικά πίνακα από strings. Για το λόγο αυτό θα χρησιμοποιήσουμε τις συναρτήσεις atol( ) και atoi( ), για να μετατρέψουμε το Κεφάλαιο και το Επιτόκιο σε longint και int αντίστοιχα, έτσι ώστε να μπορέσουμε να εκτελέσουμε αριθμητικές πράξεις.

            Το επιτόκιο μετατρέπεται σε ακέραιο, γι’ αυτό το λόγο χρησιμοποιούμε ένα cast(float) στη διαίρεση epitokio / 100 έτσι ώστε το αποτέλεσμα να μετατραπεί σε float.

 

#include <stdlib.h>

#include <stido.h>

main(argc, argv)

int argc;

char *argv[ ];

{

               float tokos;

               long kefalaio;

               int epitokio;

              

               clrscr( );

               if (argc != 3)  {

                                    printf(“Λάθος Παράμετροι ! ! \n”);

                                    exit( 0 );

               }

 

               kefalaio = atol (argv [1]);

               epitokio = atoi (argv [2]);

               tokos = kefalaio * ( (float) epitokio / 100);

               printf(“ΚΕΦΑΛΑΙΟ  :  %d \n”, kefalaio);

               printf(“ΕΠΙΤΟΚΙΟ    :  %d%% \n”, epitokio);

               printf(“ΤΟΚΟΣ        :              %f \n”, tokos);

}

 

 

Ζήτημα 19ο:

 

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

                                                            WORD : ATHENS

                                                            FILE    : POEM.TXT

                                                            COUNT: 7

 

ΛΥΣΗ:

 

            Ξεκινάμε να διαβάζουμε το αρχείο χαρακτήρα – χαρακτήρα. Κάθε χαρακτήρας που διαβάζουμε τοποθετείται στο string wrd, έως ότου βρεθεί κενό η Tab ή Newline (η συνάρτηση isspace επιστρέφει 1 αν βρεθεί κενό, Tab ή Newline). Αν η isspace επιστρέψει 1 σημαίνει ότι βρέθηκε το τέλος του string και τοποθετούμε NULL στο τελευταίο του στοιχείο. Στη συνέχεια ελέγχουμε αν το string που δόθηκε (argv [1]) είναι ίσο με wrd.

 

#include <string.h>

#include <stdio.h>

#include <ctype.h>

 

main(argc, argv)

int argc;

char  *argv[ ];

{

               int count =0, cntr=0;

               char  *wrd;

               FILE  *fp;

               clrscr( );

               if  (argc!=3)   {

                              printf(“Λάθος Παράμετροι !!! \n”);

                              exit (0);

               }

 

               if ( ( fp = fopen (argv [2], “r”) ) == NULL)   {

                              printf(“Το Αρχείο Δεν Άνοιξε !!! \n”);   exit (0);

               }

 

               while ( ( wrd [cntr] =getc (fp) ) !=EOF)   {  if (isspace (wrd [cntr]) )  {

                                                wrd [cntr] = NULL ;

                                                if (!strcmp (wrd, argv [1]) ) count++;  cntr =0;

                              }

                              else cntr++;

               }

 

               fclose (fp);

               printf(“ \n\n”);

               pirntf(“WORD  :  %s \n”, argv [1]);

               printf(“FILE      :   %s \n”, argv [2]);

               printf(“COUNT :  %d \n”, count);

}

 

 

Ζήτημα 20ο:

 

Να γραφεί function της C με όνομα power που θα δέχεται δύο ακραίες παραμέτρους base και n και θα επιστρέφει τον ακέραιο basen (Δύναμη του base εις την n).

Να γραφεί πρόγραμμα που θα καλεί τη συνάρτηση power και θα την ελέγχει. Ο χρήστης του προγράμματος θα μπορεί να καθορίσει παραμετρικά τις τιμές των base και n.

 

ΛΥΣΗ:

 

            Η συνάρτηση power επιστρέφει long, γι’ αυτό το λόγο θα πρέπει να δηλωθεί στην αρχή του προγράμματος. Άλλωστε οι αλλεπάλληλοι πολλαπλασιασμοί σίγουρα θα ξεπεράσουν το όριο των απλών ακεραίων.

            Ο τρόπος κλήσης είναι κλήση με τιμή (call by value) γιατί δεν είναι απαραίτητο να επηρεαστούν οι τιμές των ορισμάτων από τη συνάρτηση.

 

#include <stdio.h>

long power(int, int);

main( )

{

            int vasi, ekthetis;

            long apot;

 

            clrscr( );

            printf(“ Δώσε Δύο Αριθμούς Με Τη Μορφή : Βάση Εκθέτης “);

            scanf(“ %d %d”, &vasi, &ekthetis);

 

            apot = power (vasi, ekthetis) ;

 

            printf(“\n\n Το Αποτέλεσμα Του %d Εις Την %d”, vasi, ekthetis);

            printf(“\n Είναι : %ld”, apot);

}

 

long power (int base, int n)

{

            long basen =1;

            int i;

           

            for (i=1; i<=n; i++)  basen = basen * base;

            return basen;

}

 

 

Ζήτημα 21ο:

 

Να γραφεί συνάρτηση της C με όνομα max(n,m) που να επιστρέφει το μέγιστο από τους ακεραίους n και m. Να χρησιμοποιηθεί ο τελεστής ? για τον υπολογισμό του μεγίστου.

 

ΛΥΣΗ:

 

            Το max(x,y) αποτελεί δεσμευμένο macro name της Turbo C Ver. 2.0, δηλωμένο στο stdlib.h. Γι’ αυτό το λόγο η συνάρτηση θα δηλωθεί σαν maxi( ) έτσι ώστε να αποφευχθεί σύγχυση με τη standard βιβλιοθήκη της Γλώσσας. Επίσης, για την απάντηση του ζητήματος αυτού δε χρειάζεται ολόκληρο το πρόγραμμα αλλά μόνο η δημιουργία της συνάρτησης.

            Για την κλήση της συνάρτησης χρησιμοποιείται η μέθοδος call by value.

 

#include <stdio.h>

 

main( )

{

            int num1, num2;

 

            clrscr( );

            printf(“Δώστε Δύο Ακεραίους : “);

            scanf(“%d %d”, &num1, &num2);

            printf( “ \nΟ Μέγιστος Είναι : %d”, maxi (num1, num2) );   }

 

maxi (int n, int m)

{

            return (n>m) ? n:m;

}

 

 

Ζήτημα 22ο:

 

Να γραφεί συνάρτηση με όνομα reverse(s) που να αντιμεταθέτει τους χαρακτήρες του string s. Για παράδειγμα, αν η τιμή του string πριν την κλήση της συνάρτησης είναι ABCDEF μετά την κλήση της θα είναι FEDCBA.

 

ΛΥΣΗ:

 

Εδώ θα χρησιμοποιηθεί η μέθοδος call by reference και αυτό γιατί θέλουμε η κλήση της συνάρτησης να επηρεάσει το αλφαριθμητικό που χρησιμοποιείται σαν όρισμα.

            Μέσα στη συνάρτηση χρησιμοποιούμε έναν ενδιάμεσο πίνακα t για να περάσουμε τα στοιχεία του αλφαριθμητικού ανεστραμμένα. Στη συνέχεια με μία εντολή while αντιγράφουμε τον πίνακα t πίσω στον πίνακα s που στην ουσία είναι ένας δείκτης στην αρχή του αλφαριθμητικού.

            Για την απάντηση του ζητήματος δεν χρειάζεται ολόκληρο το πρόγραμμα αλλά μόνο η συνάρτηση reverse( ).

            Κατά την διαδικασία μέτρησης του μεγέθους του αλφαριθμητικού, το μήκος ορίζεται len = (strlen(s)-1) και αυτό γιατί το NULL αποτελεί το φυσικό τέλος του string δε θέλουμε να αντιστραφεί (Όλα τα strings στο DOS είναι NULL Terminated).

 

#include <stdio.h>

void reverse(char  *);

 

main( )

{

            char  *str;

           

            clrscr( );

            printf(“Δώσε Ένα Αλφαριθμητικό : “);

            gets (str);

            reverse(str);

            printf(“ \nΤο Αλφαριθμητικό Έγινε : %s”, str);

}

void reverse (char  *s)

{

            char *t;

            int i=0, len;

 

            len=(strlen(s) –1);

            for (i=0; i<=len; i++)  t [i] = s [len –i];

            while (*s++ = *t++);

}

 

 

Ζήτημα 23ο:

 

Να γραφεί συνάρτηση της C με όνομα swap( ) που θα δέχεται δύο ακεραίους και θα αντιμεταθέτει τις τιμές τους. Να δοθεί προσοχή στη μέθοδο περάσματος των παραμέτρων.

 

ΛΥΣΗ:

 

            Εδώ θα χρησιμοποιηθεί η μέθοδος Call By Reference (Κλήση με Αναφορά) και αυτό γιατί θέλουμε η συνάρτηση να επηρεάσει τα ορίσματα κατά την κλήση της.

            Επίσης χρησιμοποιούμε μία βοηθητική μεταβλητή var μέσα στη συνάρτηση, για να αντιμεταθέσουμε τις τιμές. Περνάμε την τιμή της a στη var και στη συνέχεια την τιμή της b στην a. Τέλος, περνάμε την τιμή της var στην b.

 

#include <stdio.h>

void swap (int *, int *);

 

main( )

{

            int num1,num2;

           

            clrscr( );

            printf(“Δώστε Δύο Ακεραίους : “);

            scanf(“%d %d”, &num1, &num2) ;

            printf(“\nΟι Αριθμοί Αντιμετατέθηκαν %d -- %d”, num1, num2);

}

 

void swap (int *a, int *b)

{

            int var;  / * Βοηθητική Μεταβλητή  */

           

            var = *a;

            *a = *b;

            *b = *var;

}

 

 

Ζήτημα 24ο

 

Να γραφεί συνάρτηση της C με όνομα strlen(s) που θα επιστρέφει το μήκος του string s.

 

ΛΥΣΗ:

 

            Η συνάρτηση strlen( ) αποτελεί συνάρτηση της standard βιβλιοθήκης της Turbo C Ver. 2.0. Για να αποφευχθεί τυχόν σύγχυση του compiler με τις Συναρτήσεις Βιβλιοθήκης της Γλώσσας η συνάρτηση θα δηλωθεί ως strleng( ).

            Για την απάντηση του ζητήματος δεν απαιτείται ολόκληρο το πρόγραμμα αλλά μόνο η συνάρτηση strleng( ).

 

#include <stdio.h>

main( )

{

            char *str;

            int num;

 

            clrscr( );

            printf(“Δώστε Ένα Αλφαριθμητικό : “);

            gets(str);

            num = strleng(str);

            printf(“Το Μέγεθος του Αλφαριθμητικού Είναι %d Χαρακτήρες”, num);

}

 

int strleng(char *s);

{

            int  len=0;

 

            while (*s++)  len++;

            return len;

}