ΠΕΡΙΕΧΟΜΕΝΑ

 

Ζήτημα 25

Ζήτημα 26

Ζήτημα 27

Ζήτημα 28

Ζήτημα 29

Ζήτημα 30

Ζήτημα 31

Ζήτημα 32

Ζήτημα 33

Ζήτημα 34

Ζήτημα 35

Ζήτημα 36

Ζήτημα 37

Ζήτημα 38

Ζήτημα 39

Ζήτημα 40

Ζήτημα 41

Ζήτημα 42

 

Παλαιό Ζήτημα 4

 

Παλαιό Ζήτημα 15

 

Παλαιό Ζήτημα 18

 

Επιστροφή στις προηγούμενες ερωτήσεις <-

 

 

 

 

 

 

 

 

 

 

 

 

Ζήτημα 25ο:

 

Να περιγραφεί η λειτουργία της παρακάτω function της C.

 

            void unknown_function (char  *s, char *t)

            {

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

                        ;

            }

 

            Προσέξτε ότι έχει μόνο ένα =.

 

ΛΥΣΗ:

 

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

            Στην εντολή while καταχωρούνται οι χαρακτήρες του string t στο string s, έως ότου βρεθεί το τέλος του t.

            Σε γενικές γραμμές είναι μία συνάρτηση που αντιγράφει strings.

 

 

Ζήτημα 26ο:

 

Να γραφεί συνάρτηση της C με όνομα strcmp(s, t) που επιστρέφει 0 εάν το string s είναι το ίδιο με το string t. Αρνητικό αριθμό εάν το string s είναι αλφαβητικά μικρότερο από το string t, και θετικό αριθμό εάν το string s είναι αλφαβητικά μεγαλύτερο από το string t.

 

ΛΥΣΗ:

 

            Η συνάρτηση strcmp( ) αποτελεί μέρος της standard βιβλιοθήκης της Turbo C Ver. 2.0. Για να αποφευχθεί λοιπόν σύγχυση του compiler με τη standar library της γλώσσας , η συνάρτηση θα δηλωθεί ως strcmpr( ).

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

Μέσα στη συνάρτηση ελέγχουμε τα στοιχεία των αλφαριθμητικών ένα προς ένα με μία while και εφόσον είναι ίσα ελέγχουμε τα επόμενα για NULL. Εάν τα μεγέθη των string είναι ίσα με το i, τότε και τα string είναι ίσα αλλιώς ελέγχουμε τους αντίστοιχους χαρακτήρες και επιστρέφουμε.

 

#include <stdio.h>

int strcmpr (char  *, char *);

main( )

{

               char  *str1, *str2;

               int c;

               clrscr( );

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

               gets(str1);

               printf(“Δώστε Το Δεύτερο Αλφαριθμητικό :”);

               gets(str2);

               c=strcmpr (str1, str2);

               if (c==0)

                        printf(“Τα Αλφαριθμητικά Είναι Ίσα \n”);

               if (c==1)

                        printf(“Το %s Είναι Μεγαλύτερο του %s \n”, str1, str2);

               if (==-1)

                        printf(“Το %s Είναι Μικρότερο του %s \n”, str2, str1);

}

 

int strcmpr (char  *s, char *t)

{

               int val, i=0;

               while (s [ i ] == t [ i ]   {

                        i++;

                        if (s [ i ] == NULL   t [ i ] == NULL)  break;

               }

               if (i==strlen(s)  &&  i==strlen(t))

                        val = 0;

               else   {

                        if (s [ i ] < t [ i ]) val = -1;

                        if (s[ i ] > t [ i ]) val = -1;

               }

               return val;

}

 

 

Ζήτημα 27ο:

 

Να γραφεί πρόγραμμα C που θα διαβάζει μία ημερομηνία με τη μορφή 25 Feb 1995, και θα την τυπώνει με τη μορφή: 25/2/95.

 

ΛΥΣΗ:

 

#include <stdio.h>

#include <string.h>

 

main( )

{

            char months [ ] [4] =  {           \0”,

                                                      “Jan\0”,

                                                      “Feb\0”,

                                                      “Mar\0”,

                                                      “Apr\0”,

                                                      “May\0”,

                                                      “Jun\0”,

                                                      “Jul\0”,

                                                      “Aug\0”,

                                                      “Sep\0”,

                                                      “Oct\0”,

                                                      “Nov\0”,

                                                      “Dec\0”

                                                   };

            int hm, etos, neo_etos, i=0;

            char mhn[3];

 

            clrscr( );

            printf(“Δώσε Ημερομηνία Με Μορφή 25 Feb 1995: “);

            scanf(“%d %s %d, &hm, mhn, &etos);

           

            while (strcmp(mhn, months[ i ]))  i++;

 

            neo_etos = etos%100;

           

            printf(“Η Ημερομηνία Είναι: %d / %d / %d”, hm, i, neo_etos);

}

 

 

Ζήτημα 28ο:

 

Να γραφεί πρόγραμμα της C με το όνομα filecopy που θα αντιγράψει τα περιεχόμενα ενός αρχείου σε ένα άλλο αρχείο. Τα ονόματα των δύο αρχείων θα περνούν ως Command-Line Arguments, δηλαδή η κλήση του προγράμματος θα γίνεται ως εξής:

                        filecopy inputfile outputfile

 

ΛΥΣΗ:

 

            Πρόκειται για πρόγραμμα που διαβάζει και αντιγράφει Δυαδικά Αρχεία. Δηλαδή μπορεί να αντιγράψει όλους τους τύπους αρχείων που χρησιμοποιεί το DOS, ακόμη και .EXE ή .COM. Για το λόγο αυτό σαν καθοριστές ανοίγματος στη συνάρτηση fopen( ) χρησιμοποιούνται οι παράμετροι rb και wb. Η συνάρτηση feof( ) χρησιμοποιείται για τον έλεγχο τέλους του Δυαδικού αρχείου.

 

#include <stdio.h>

 

main(argc, argv)

int argc;

char  *argv[ ];

{

              

               FILE  *in, *out;

               char ch;

 

               clrscr( );

               if (argc!=3)   {

                              printf(“Εσφαλμένη Σύνταξη !!! \n”);

                              printf(“ ΣΥΝΤΑΞΗ : Filecopy InputFile OutputFile \n”);

                              exit (0);

               }

 

               if ( ( in = fopen (argv [1], “rb”) ) == NULL)   {

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

                              exit (0);

               }

 

               if ( ( out = fopen (argv [2], “wb”) ) == NULL)   {

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

                              exit (0);

               }

 

               while (!feof (in) )   {

                              ch = getc(in);

                              if (!feof (in) )  putc (ch, out);

               }

 

               fclose(in);

               fclose(out);

               printf(“ Η Αντιγραφή Ολοκληρώθηκε Με Επιτυχία \n”);

}

 

 

 

Ζήτημα 29ο:

 

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

                                                            Compfiles File_1  File_2

 

ΛΥΣΗ:

 

#include <stdio.h>

#define NEWLINE ‘\n’

main (int argc, char  *argv[ ])

{

            FILE  *fp1, *fp2;

            char ch1, ch2,  *s1,  *s2;

            int flag = 0, cntr = 0;

            clrscr( );

            if (argc!=3)   {

                           printf(“Εσφαλμένες Παράμετροι !!! \n”);

                           printf(“ΣΥΝΤΑΞΗ: Compfile File1 File2 \n”);

                           exit (0);

 

            }

            if ((fp1 = fopen(argv[1], “r”)) ==NULL)   {

                           printf(“Σφάλμα Στο Άνοιγμα Του %s \n”, argv[1]);

                           exit(0);

            }

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

                           printf(“Σφάλμα Στο Άνοιγμα Του %s \n”, argv[2]);

                           exit(0);

            }

            for (;;)   {

                           ch1 = getc(fp1);

                           ch2 = getc(fp2);

                           if (( ch1 == EOF)  (ch2 ==EOF) )  break;

                           if (( ch1 == NEWLINE)  (ch2 ==NEWLINE) )   {

                                    s1 [cntr] = NULL;

                                    s2 [cntr] = NULL;

                                    if (strcmp (s1, s2) )   {

                                                printf(“\n%s”, s1);

                                                printf(“\n%s”, s2);

                                                fclose(fp1);

                                                fclose(fp2);

                                                exit(0);

                                    }

                                    else cntr = 0;

                           }

                           else  {

                                    s1[cntr] = ch1;

                                    s2[cntr] = ch2;

                                    cntr++;

                           }

            }

            printf(“Τα Αρχεία Δεν Έχουν Διαφορές \ n”);

            fclose(fp1);

            flocse(fp2);

}

 

 

Ζήτημα 30ο:

 

Να γραφεί συνάρτηση C που θα δέχεται σαν παραμέτρους το όνομα ενός μήνα (π.χ. Jan, Feb, κλπ) και το έτος (π.χ. 1996) και θα επιστρέφει τον αριθμό των ημερών του μήνα(28, 29, 30, 31). Να ληφθούν υπόψη τα δίσεκτα έτη και να χρησιμοποιηθεί η εντολή case.

 

ΛΥΣΗ:

 

            Το έτος είναι δίσεκτο όταν διαιρείται ακριβώς με το 4 εκτός αν είναι πολλαπλάσιο του 100 και όχι του 400. για την απάντηση του ζητήματος δε χρειάζεται όλο το πρόγραμμα αλλά μόνο η συνάρτηση.

 

#include <stdio.h>

main( )

{

     clrscr( );

     printf(“%d”, Days_Of_Month (“Feb”, 1992) );

 

     }

     Days_Of_Month (char  *mhnas, int  etos)

     {

                  int hmeres, ypol, i = 0;

                  char months[ ] [4] =   { “    \0”,

                                                      “Jan\0”,

                                                      “Feb\0”,

                                                      “Mar\0”,

                                                      “Apr\0”,

                                                      “May\0”,

                                                      “Jun\0”,

                                                      “Jul\0”,

                                                      “Aug\0”,

                                                      “Sep\0”,

                                                      “Oct\0”,

                                                      “Nov\0”,

                                                      “Dec\0”

                  };

                  while (strcmp (mhnas, months [ i ]) ) i++;

                  switch( i )   {

                                 case 1:         hmeres = 31;        break;

                                 case 2:

                                     if( ( (etos%4)!=0) && ((etos%100)!=0 (etos%400)==0)

                                                hmeres = 28 ;

                                     else  hmeres = 29 ;  break ;

                                 case   3:       hmeres = 31;        break;

                                 case   4:       hmeres = 30;        break;

                                 case   5:       hmeres = 31;        break;

                                 case   6:       hmeres = 30;        break;

                                 case   7:       hmeres = 31;        break;

                                 case   8:       hmeres = 31;        break;

                                 case   9:       hmeres = 30;        break;

                                 case 10:       hmeres = 31;        break;

                                 case 11:       hmeres = 30;        break;

                                 case 12:       hmeres = 31;        break;

                  }

                  return hmeres;

}

 

 

Ζήτημα 31ο:

 

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

 

ΛΥΣΗ:

 

            Για το πέρασμα του πίνακα στη συνάρτηση χρησιμοποιείται η μέθοδος Call By Reference, ενώ για το πέρασμα του μεγέθους του πίνακα η μέθοδος Call By Value.

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

 

#include <stdio.h>

float Mesos_oros (int  *, int);

main( )

{

         int num, i;

         int  *pinax;

         clrscr( );

         scanf(“%d”, &num);

 

         for(i=0 ; i<=num ; i++)  pinax [ i ] = i;

         printf(“%f”, Mesos_oros(pinax, num) );

}

 

float Mesos_oros(int *pin, int n)

{

         float sum = 0.0;

         int j;

 

         for( j = 0; j<=n-1; j++)

                     sum = sum +  *(pin + j);

         return (sum/n);

}

 

 

Ζήτημα 32ο:

 

Η μεταβλητή STATE παίρνει δύο μόνο τιμές ENABLED και DISABLED.

α) Να δηλωθεί η STATE ως τύπου enum.

β) Να γραφεί συνάρτηση της C που να δέχεται ως παράμετρο την STATE και να τυπώνει το κείμενο:

                                    The Machine Is ENABLED      ή

                                    The Machine Is DISABLED

            Ανάλογα με τη τιμή της STATE.

 

 

ΛΥΣΗ:

 

Εδώ τα δύο ερωτήματα ενσωματώνονται στο ίδιο πρόγραμμα. Δηλώνεται η μεταβλητή STATE να είναι του τύπου s όπου πρόκειται για έναν απαριθμητή με δύο τιμές ENABLED και DISABLED. Πρόκειται για κλήση Call By Value γιατί η μεταβλητή STATE αναγνωρίζεται σαν διαφορετική από τη state από την C.

 

/ * Το (α) Ερώτημα */

enum s {ENABLED, DISABLED};

enum s STATE;

/ * To (β) Ερώτημα */

void status (enum s state)

{

            printf(“The Machine’s State Is “);

            if (state ==ENABLED)

                        printf(“ENABLED\n”);

            else

                        printf(“DISABLED\n”);

}

 

 

Ζήτημα 33ο:

 

Να γραφεί πρόγραμμα C το οποίο θα αλλάζει τους χαρακτήρες * ενός αρχείου, σε +. Τα ονόματα των αρχείων εισόδου – εξόδου θα περνούν σαν Command Line Arguments.

 

ΛΥΣΗ:

 

            Διαβάζεται το αρχείο χαρακτήρα – χαρακτήρα. Ο χαρακτήρας που διαβάστηκε γράφεται στο δεύτερο αρχείο. Εάν ο χαρακτήρας που διαβάστηκε είναι * τότε στο δεύτερο αρχείο γράφεται ένα +.

 

#include <stdio.h>

#include <conio.h>

 

main (argc, argv)

int argc;

char  *argv[ ];

{

               char ch;

               FILE  *in,  *out;

              

               if (argc!=3)   {

                     printf(“Λάθος Ορίσματα !!!\n”);

                     exit (0);

               }

               if ( (in = fopen (argv [1], “r”) ) == NULL)   {

                     printf(“Το Πηγαίο Αρχείο Δεν Άνοιξε \n”);

                     exit (0);

               }

               if ( (out = fopen (argv [2], “w”) ) == NULL)   {

                     printf(“Το Αρχείο Προορισμού Δεν Άνοιξε \n”);

                     exit (0);

               }

 

               while ( (ch=getc(in))!=EOF)

               {

                                 if (ch == ‘*’)

                                             putc(‘+’, out);

                                 else

                                             putc(ch, out);

               }

               fclose(in);

               fclose(out);

}

 

 

Ζήτημα 34ο:

 

Έχουμε ένα αρχείο που κάθε γραμμή του είναι ένας πραγματικός αριθμός. Να γραφεί πρόγραμμα σε C που θα μετρά και θα τυπώνει:

α) Τον αριθμό των γραμμών του αρχείου.

β) Πόσες τιμές υπάρχουν στο αρχείο μεταξύ 3 και 5.

γ) Τον μέσο όρο των τιμών του αρχείου.

Το όνομα του αρχείου θα περνά σαν Command Line Argument.


ΛΥΣΗ:

 

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

 

#include <stdio.h>

#include <conio.h>

main (argc, argv)

int argc;

char  *argv[ ];

{

 

                  char ch;

                  FILE  *in;

                  float num, sum = 0.0, MO;

                  int lines = 0;

                  int times = 0;

                  clrscr( );

                  if (argc!=2)   {

                        printf(“Λάθος Ορίσματα \n”);

                        exit (0);

                  }

                  if ( (in = fopen (argv[1], “r”))==NULL)   {

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

                        exit (0);

                  }

                  while (fscanf(in, “%f”, &num)==1)

                  {

                        printf(“%f\n”, num);

                        sum = sum + num;

                        lines++;

                        if (num >=3  &&  num<=5)  times++;

                  }

                  MO = sum / lines;

                  printf(“Το Αρχείο Έχει %d Γραμμές \n”, lines);

                  printf(“ Τιμές Μεταξύ 3 και 5 %d \n”, times);

                  printf(“ Μέσο Όρο Τιμών %f”, MO);

                  fclose(in);

}

 

/ * ΣΥΝΕΧΕΙΑ ΖΗΤΗΜΑΤΟΣ 34 – ΔΗΜΙΟΥΡΓΙΑ ΑΡΧΕΙΟΥ */

/ * Χρησιμοποιήστε το παρακάτω πρόγραμμα για να δημιουργήσετε το

     αρχείο και να του περάσετε στοιχειώδεις τιμές */

 

main( )

{

                  FILE  *in;

                  int i;

                  float num;

 

                  clrscr( );

                  if ( (in=fopen(“testf1.f1o”, “wb”)) ==NULL)   {

                              printf(“Error !!! “);

                              exit (0);

                  }

                 

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

                              scanf(“%f”, &num);

                              fprintf(in, “%f\n”, num);

                  }

                  fclose (in);

}

 

 

Ζήτημα 35ο:

 

Δίδονται δύο αρχεία που κάθε γραμμή είναι ένας ακέραιος. Να γραφεί πρόγραμμα C που θα περιέχει τις κοινές τιμές των δύο αρχείων εισόδου. Τα ονόματα των τριών αρχείων θα περνούν σαν Command Line Arguments.

 

ΛΥΣΗ:

 

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

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

 

#include <stdio.h>

#include <conio.h>

 

main (argc, argv)

int argc;

char  *argv[ ];

{

               FILE  *f1,  *f2,  *f3;

               int num1, num2;

 

               clrscr( );

               if (argc!=4)   {

                           printf(“Λάθος Ορίσματα !!! \n”);

                           exit (0);

               }

               if (( f1=fopen (argv [1], “r”)) == NULL)  {

                           printf(“Το Πρώτο Αρχείο Δεν Άνοιξε \n”);

                           exit (0);

               }

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

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

                           exit (0);

               }

               if (( f3=fopen (argv [3], “w”)) == NULL)  {

                           printf(“Το Aρχείο Προορισμού Δεν Άνοιξε \n”);

                           exit (0);

               }

 

               while (((fscanf (f1, “%d”, &num1)==1)   &&

                           (fscanf(f2, “%d”, &num2)==1)))

                                    if (num1==num2)

                                                fprintf(f3, “%d\n”, num1);

               fclose(f1);

               fclose(f2);

               fclose(f3);

}

 

/ * ΣΥΝΕΧΕΙΑ ΣΤΗΝ ΑΣΚΗΣΗ 35 */

/ * Το πρόγραμμα αυτό δεν είναι απαραίτητο για την επίλυση της άσκησης. Σας χρειάζεται όμως για να δώσετε κάποιες τιμές στα αρχεία σας και να κάνετε έλεγχο για την ορθότητα του παραπάνω κώδικα.

 

               Πρόγραμμα για την αρχικοποίηση των αρχείων      */

 

main( )

{

               FILE  *fp1,  *fp2;

               int i, j;

 

               clrscr( );

               if ((fp1 = fopen (“inttst1”, “w”)) ==NULL)  {

                           printf(“Το Πρώτο Αρχείο Δεν Άνοιξε”);

                           exit (0);

               }

               if ((fp2 = fopen (“inttst2”, “w”)) ==NULL)  {

                           printf(“Το Δεύτερο Αρχείο Δεν Άνοιξε”);

                           exit (0);

               }

               for (i=0; i<=10; i++)  fprintf(fp1, “%d\n”, i);

               for (j=0; j<=5; j++)  fprintf(fp2, “%d\n”, j);

               fclose (fp1);

               fclose(fp2);

}

 

 

Ζήτημα 36ο:

 

Δίνεται αρχείο με κείμενο. Να γραφεί πρόγραμμα C που αντιγράφει το αρχείο σε άλλο, αφού πρώτα πετάξει τα περιττά κενά του πρώτου. Δηλαδή όπου στο πρώτο αρχείο υπάρχουν περισσότερα από ένα συνεχόμενα κενά, στο νέο θα υπάρχει μόνο ένα. Τα ονόματα των αρχείων θα περνούν σαν Command Line Arguments.

 

ΛΥΣΗ:

 

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

 

#include <stdio.h>

#include <conio.h>

 

main(argc, argv)

int argc;

char  *argv [ ];

{

               char ch;

               int flag=0;

               FILE  *in,  *out;

 

               clrscr( );

               if (argc!=3)  {

                        printf(“Λάθος Ορίσματα !!! “);

                        exit(0);

               }

               if ((in =fopen (argv [1], “r”)) ==NULL)   {

                        printf(“Το Πηγαίο Αρχείο Δεν Άνοιξε !!!”);

                        exit(0);

               }

               if ((out =fopen (argv [2], “w”)) ==NULL)   {

                        printf(“Το Αρχείο Προορισμού Δεν Άνοιξε !!!”);

                        exit(0);

               }

 

               while ((ch = getc(in))!=EOF)   {

                        if (ch != ‘  ‘ )  {

                                    flag = 0;

                                    putc(ch, out);

                        }

                        if (ch == ‘    &&  flag==0)   {

                                    flag =1;

                                    putc(‘  ‘, out);

                        }

               }

              

               fclose (in);

               fclose (out);

}

 

 

Ζήτημα 37ο:

 

Δίνεται ένα ρχείο με κείμενο. Οι λέξεις χωρίζονται μεταξύ τους με ένα κενό ή τελεία ή κόμμα ή τέλος γραμμής. Γράψτε ένα πρόγραμμα C που να μετράει τον αριθμό των γραμμών, των χαρακτήρων και των λέξεων του αρχείου. Το όνομα του αρχείου περνά σαν Command Line Argument.

 

ΛΥΣΗ:

 

            Χρησιμοποιούμε τη συνάρτηση isalpha( ) για να διερευνήσουμε αν ο χαρακτήρας που διαβάστηκε είναι κανονικό γράμμα ή σημείο στίξης ή τέλος γραμμής.

 

#include <stdio.h>

#include <conio.h>

#include <ctype.h>

 

main (argc, argv)

int argc;

char  *argv [ ];

{

 

               char ch;

               long nchars=0L;

               int nlines=0;

               int nwords=0;

               int wflags=0;

               FILE  *in;

 

               clrscr( );

               if(argc!=2)   {

                        printf(“Λάθος Ορίσματα !!! \n”);

                        exit(0);

               }

               if ((in =fopen (argv [1], “r”)) ==NULL)   {

                        printf(“Το Αρχείο Δεν Άνοιξε”);

                        exit(0);

               }

 

               while ((ch = getc (in) != EOF)   {

                        nchars++;

                        if (ch == ‘\n’) nlines++;

                        if (isalpha (ch)  &&  wflag==0)   {

                                    wflag =1;

                                    nwords++;

                        }

                        if ((!isalpha (ch)) && (wflag==1)) wflag =0;

               }

               fclose(in);

              

               printf(“Υπάρχουν %d Χαρακτήρες, %d Λέξεις, %d Γραμμές”, nchars, nwords, nlines);

}

 

 

Ζήτημα 38ο:

 

Να γραφεί function C που να καθορίζει την τιμή ενός δισδιάστατου πίνακα Α από NxN ακεραίους σύμφωνα με τον παρακάτω κανόνα:

Α[i, j] = 1, Αν i + j είναι άρτιος

Α[i, j] = -1, Αν i + j είναι περιττός

Οι παράμετροι της function είναι ο πίνακας Α και η διάστασή του Ν.

 

ΛΥΣΗ:

 

            Εδώ χρειάζεται μόνο η συνάρτηση και όχι ολόκληρο το πρόγραμμα για την απάντηση του ζητήματος. Περνιέται ένας pointer σε δισδιάστατο πίνακα από ακεραίους και για τον υπολογισμό του κάθε στοιχείου χρησιμοποιείται ο τύπος:

           

            a [ j] [k] is equivalent to *(a+( j * row length) +k)

 

#include <stdio.h>

#include <conio.h>

 

main( )

{

         int   *pinax;

         int num,x,y;

        

         clrscr( ) ;

         printf(“Δώσε Μέγεθος Πίνακα:”);

         scanf(“%d”, &num);

 

         Array_Func (pinax, num) ;

 

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

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

                                    printf(“%d”,  (pinax + (x*num) +y));

                                    printf(“\n”);

         }

}

 

Array_Func (int  *Num_Arr [ ], int N)

{

                        register int i, j;

 

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

                                    for( j = 0; j<N; j++)

                                                if ((i+ j ) %2 == 0)  * (Num_Arr + (i*N) +j) =1;

                                                else

                                                (Num_Arr + (i*N) +j) = -1;

}

 

 

Ζήτημα 39ο:

 

Να γραφεί συνάρτηση C που να δέχεται σαν παραμέτρους έναν πίνακα ακεραίων Α και τη διάστασή του Ν, και να επιστρέφει τον ίδιο πίνακα με ανάποδη σειρά, δηλαδή το στοιχείο 0 να έχει αντιμετατεθεί με το στοιχείο Ν-1, το στοιχείο 1 με το Ν-2, κοκ.

 

ΛΥΣΗ:

 

            Κι εδώ επίσης δεν είναι απαραίτητη η συγγραφή ολόκληρου του προγράμματος παρά μόνο της συνάρτησης. Ο πίνακας περνά Call By Reference, ενώ το μέγεθός του Call By Value.

 

#include <stdio.h>

#include <stdlib.h>

void Int_Rev(int *, int);

 

main( )

{

            int *Int_Arr, x, Num;

 

            clrscr( );

            scanf(“%d”, &Num);

            for (x=0 ; x<=Num-1; x++) Int_Arr [x] = x;

 

            Int_Rev(Int_Arr, Num);

 

            for(x=0; x<=Num-1; x++)  printf(“%d”, Int_Arr [x]);

}

void Int_Rev(int *A, int N)

{

            int *B;

            register int i, j;

 

            for (i =0, j = N-1; i<=N-1; i++, j--)  B [i] = A [ j];

 

            for( i = 0; i<=N-1; i++)  A [i]  =  B [i];

}

 

 

Ζήτημα 40:

 

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

 

ΛΥΣΗ:

 

Για την απάντηση του ζητήματος είναι απαραίτητη μόνο η συνάρτηση.

 

#include <stdio.h>

main( )

{

         int  *Int_Arr, Num, x;

 

         clrscr( );

         scanf(“%d”, &Num);

         for (x=0 ; x<=Num-1 ; x++)  Int_Arr [x] = -x;

        

         printf(“Η θέση του ελάχιστου στοιχείου είναι η %d”, Min_Thesi(Int_Arr, Num));

 

}

 

Min_Thesi (int  *A, int N)

{

         int i, min, thesi;

 

         min = A [0];

         thesi = 0;

        

         for (i=1; i<N-1; i++)   {

                        if (A [i] < min )  {

                                    min = A [i];

                                    thesi = i

         }

         return thesi;

}

 

 

Ζήτημα 41ο:

 

Ένας καθηγητής στο μάθημα της γλώσσας C κρατάει αρχείο με τους φοιτητές. Για κάθε φοιτητή χρησιμοποιεί το όνομα (15 χαρ.), το επώνυμο (20 χαρ.), το έτος (ακέραιος), το εξάμηνο (1 χαρ. με τιμές Α ή Β) και το βαθμό (ακέραιος).

Α) Να οριστεί η παραπάνω structure (Δομή) της C.

Β) Να γραφεί πρόγραμμα που θα διαβάζει από το αρχείο τα στοιχεία των φοιτητών και να τυπώνει το μέσο όρο βαθμολογίας για το Α’ εξάμηνο του 1995. Κάθε γραμμή του αρχείου αντιστοιχεί σε ένα φοιτητή και τα στοιχεία χωρίζονται μεταξύ τους με ένα ακριβώς κενό. Το όνομα του αρχείου περνά παραμετρικά στο πρόγραμμα (Command Line Argument).

 

ΛΥΣΗ:

 

#include <stdio.h>

#include <conio.h>

/ * To αυποερώτημα  */

struct student   {

            char F_Name [15];

            char L_Name [20];

            int Year;

            char Sem;

            int Grade;

} ;

/ * Το πρόγραμμα, β’ υποερώτημα */

main (argc, argv)

int argc;

char  *argv [ ];

{

            struct student Stud;

            int sum=0, i=0;

            float MO=0.0;

            FILE  *in;

            clrscr( );

            if (argc!=2)    {

                        printf(“Λάθος Ορίσματα !!! \n”);

                        exit (0);

            }

            if (( in =fopen (argv [1], “r”)) ==NULL)   {

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

                        exit(0);

            }

            while ((fscanf (in, “%s %s %d %c %d”, Stud.F_Name, Stud.L_Name, &Stud.Year, &Stud.Sem, &Stud.Grade) == 5))   {

 

                                    if(Stud.Year ==1995  && Stud.Sem==’A’)  {

                                                sum=sum + Stud.Grade;

                                                i++;

                                    }

            }

            MO = sum / i;

           printf(“Ο Μ. Ο. Βαθμολογίας Για Το Α’ Εξάμηνο του ’95 Είναι %f”, MO);

            fclose (in);

}

 

 

Ζήτημα 42ο:

 

Έστω οι δηλώσεις:

 

            int a [10];

            int pa;

 

Ποιες από τις παρακάτω εντολές είναι σωστές:

 

                                                            pa =  &a [0];

                                                            pa = a++;

                                                            pa = a + 4;

                                                            pa = a [2];

                                                            pa = a

                                                            pa = (a+3);

                                                            a = pa;

                                                            pa--;

                                                            pa - = 3;

                                                            a++;

 

ΛΥΣΗ:

 

Σωστές είναι οι εντολές:

                                                            pa = a[2];

                                                            pa --;

                                                            pa -=3;

Οι παρακάτω εντολές είναι λάθος γιατί επιδρούν στο a, που είναι ονομασία Πίνακα και δε μπορεί να αλλάξει τιμή.

                                                            pa = a++;

                                                            a = pa;

                                                            a++;

Οι παρακάτω εντολές είναι λάθος γιατί κάνουν πράξεις με το pa και το a, όπου είναι ακέραιος αριθμός και δείκτης σε ακεραίους αντίστοιχα.

                                                            pa = &a [0];

                                                            pa = a +4;

                                                            pa = a;

                                                            pa = (a+3);

 

 

===============================================================================================================

 

 

 

Ζήτημα 4ο:      (ΔΕΝ ΥΠΑΡΧΕΙ ΣΤΗΝ ΚΑΙΝΟΥΡΙΑ ΠΙΣΤΟΠΟΙΗΣΗ)

 

Να γραφεί συνάρτηση της C με όνομα htoi που θα μετατρέπει ένα string από δεκαεξαδικούς χαρακτήρες στον αντίστοιχο ακέραιο. Οι επιτρεπόμενοι δεκαεξαδικοί χαρακτήρες είναι από 0 ως 9 και Α έως F ή a έως f.

 

ΛΥΣΗ:

 

Για την απάντηση της ερώτησης αυτής χρειάζεται μόνο η συνάρτηση htoi και όχι ολόκληρο το πρόγραμμα. Χρησιμοποιούμε την tolower( ) για να μετατρέψουμε όλους τους χαρακτήρες σε πεζούς.

 

#include <math.h>

#include <stdio.h>

long htoi (char *);

main

{

            char  *Hex_Val ;

           

            clrscr( ) ;

            printf(“Δώστε μία Δεκαεξαδική Τιμή :”);

            gets (Hex_Val);

            printf(“\n\nΗ Δεκαδική Της Τιμή Είναι %ld\n”, htoi (Hex_Val));

}

long htoi (char  *s)

{

            int length, timh, i=1;

            long sum=0;

            length = strlen (s);

            while (*s)   {

                        s = tolower (*s);

                        switch (*s)   {

                                    case ‘0’:  timh = 0;       break;

                                    case ‘1’:  timh = 1;       break;

                                    case ‘2’:  timh = 2;       break;

                                    case ‘3’:  timh = 3;       break;

                                    case ‘4’:  timh = 4;       break;

                                    case ‘5’:  timh = 5;       break; 

                                    case ‘6’:  timh = 6;       break;

                                    case ‘7’:  timh = 7;       break; 

                                    case ‘8’:  timh = 8;       break;

                                    case ‘9’:  timh = 9;       break;

                                    case ‘a’:  timh = 10;     break;

                                    case ‘b’:  timh = 11;     break;

                                    case ‘c’:  timh = 12;     break;

                                    case ‘d’:  timh = 13;     break; 

                                    case ‘e’:  timh = 14;     break;

                                    case ‘f’:   timh = 15;     break;

                                    default:

                                             printf(“Δόθηκε Εσφαλμένη Δεκαεξαδική Τιμή\n”);

                                             exit(0);

                                    }

                                    sum = sum + ((long) pow(16, (double)  lentgh –i  *timh);

                                    i++;  *s++;

            }

            return sum;

}

 

 

Ζήτημα 15ο:    (ΔΕΝ ΥΠΑΡΧΕΙ ΣΤΗΝ ΚΑΙΝΟΥΡΙΑ ΠΙΣΤΟΠΟΙΗΣΗ)

 

Να οριστεί η Structure RecPhones της C που κρατάει το όνομα, τη διεύθυνση και την ημερομηνία γέννησης διαφόρων ανθρώπων. Να ληθφεί υπόψη ότι οι structure αυτές είναι οργανωμένες σε δομή λίστας, δηλαδή κάθε structure αυτού του τύπου “δείχνει” στην επόμενη structure του ίδιου τύπου. Οι τύποι των πεδίων της structure είναι:

                                       Επίθετο              String,        20 χαρ.

                                       Όνομα                String,        15 χαρ.

                                       Διεύθυνση          String,        40 χαρ.

                                       Τηλέφωνο          String,        20 χαρ.

                                       Έτος Γέννησης   Ακέραιος

                                       Μήνας Γένν.       Ακέραιος

                                       Ημέρα Γενν.       Ακέραιος.

ΛΥΣΗ:

 

Στη δομή αυτή θα χρησιμοποιηθεί μία μεταβλητή για να δείξουμε στην επόμενη δομή, μια και η structure RecPhones αποτελεί στοιχείο μιάς λίστας, που το ένα στοιχείο “δείχνει” στο επόμενο. Έτσι θα χρησιμοποιηθεί ένας Pointer του τύπου RecPhones.

 

struct   RecPhones   {

            char Last_Name [20];

            char First_Name [15];

            char Address [40];

            char TeleNum [20];

            int Etos;

            int Mhnas;

            int Hmera;

            struct RecPhones  *Next_Rec;

};

 

 

 

Ζήτημα 18ο:    (ΔΕΝ ΥΠΑΡΧΕΙ ΣΤΗΝ ΚΑΙΝΟΥΡΙΑ ΠΙΣΤΟΠΟΙΗΣΗ)

 

Αν η τιμή του x είναι 9 και του y είναι 3, ποια η τιμή του z σε κάθε μία από τις παρακάτω περιπτώσεις;

                                             z = x & y;

                                             z = x    y ;

                                             z = x << 2 ;

                                             z = x >> 2 ;

                                             z = ~ ;

                                             z = x & ~ 07 ;

 

ΛΥΣΗ:

 

Στο δυαδικό σύστημα έχουμε:

                                                x = 9 = 1001  και y = 3 = 0011

Άρα:

 

            z = x & y = 1001 & 0011 = 0001 = 1

            z = x    y = 1001    0011 = 1011 = 11

            z = x << 2  = 1001 << 2 = 100100 = 36

            z = x >> 2  = 1001 >> 2 = 0010 = 2

            z = ~ x  =  ~ 1001 = 0110 = 6 

            z = x & ~ 07 = 1001 & ~ 0111 = 1001 & 1000 = 1000 = 8