Σχεδιασμός και υλοποίηση λογισμικού

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Οι υπολογιστές και ο προγραμματισμός τους

Καλώς ήρθατε

Σχεδιασμός και υλοποίηση λογισμικού

Τι περιλαμβάνει το μάθημα

  1. Οι υπολογιστές και ο προγραμματισμός τους
  2. Η γλώσσα C, το πρώτο πρόγραμμα
  3. Υπολογισμοί με μεταβλητές, είσοδος και έξοδος
  4. Τελεστές σύγκρισης, λογικής και επαναλήψεις
  5. Προγραμματισμός με χαρακτήρες, αποφάσεις
  6. Πρόσθετες δομές ελέγχου: switch for break continue
  7. Ορισμός συναρτήσεων
  8. Παράδειγμα: μορφοποίηση προγραμμάτων
  9. Πίνακες
  10. Οργάνωση δεδομένων: δομές, ενώσεις, απαριθμήσεις, τύποι
  11. Δείκτες και δυναμικές δομές δεδομένων
  12. Προσδιορισμός απαιτήσεων, ανάλυση και σχεδίαση
  13. Οργάνωση προγραμμάτων: σχεδιασμός σε τμήματα αφηρημένοι τύποι δεδομένων
  14. Συμβολοσειρές
  15. Η πρότυπη βιβλιοθήκη
  16. Ανασκόπηση - επανάληψη

Τρόπος διδασκαλίας

Οι σημειώσεις

Υλικό και λογισμικό

Ιστορική ανασκόπηση

Χαρακτηριστικές αλγοριθμικές γλώσσες

Σε μια αλγοριθμική (imperative) γλώσσα το πρόγραμμα εκφράζει άμεσα τα βήματα που επιθυμούμε να εκτελέσει ο υπολογιστής.

Χαρακτηριστικές δηλωτικές γλώσσες

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

Γλώσσες βασισμένες στη λογική

Γλώσσες βασισμένες σε συναρτήσεις

Βασικά γλωσσικά εργαλεία

Προετοιμαστής/Διορθωτής (Editor)
Επιτρέπει τη συγγραφή και την αλλαγή του προγράμματος.
Προεπεξεργαστής (Preprocessor)
Επεξεργάζεται το πρόγραμμα εκτελώντας απλούς συμβολικούς μετασχηματισμούς και παράγει ένα αντίστοιχο πρόγραμμα. Χρησιμοποιείται σε συμβολικές γλώσσες, τη Fortran (Ratfor), τη C, και τη C++.
Συμβολομεταφραστής (Assembler)
Μετατρέπει τη συμβολική γλώσσα του επεξεργαστή σε γλώσσα μηχανής.
Μεταγλωττιστής (Compiler)
Μεταφράζει μια γλώσσα υψηλού επιπέδου σε γλώσσα επιπέδου μηχανής.
Διερμηνευτής (Interpreter)
Εκτελεί άμεσα ένα πρόγραμμα σε γλώσσα υψηλού επιπέδου.
Συνδέτης (Linker)
Συρράφει τμήματα ενός προγράμματος που έχουν μεταγλωττιστεί ξεχωριστά σε ένα συνεχές πρόγραμμα.
Φορτωτής (Loader)
Φορτώνει το πρόγραμμα στη μνήμη του επεξεργαστή διορθώνοντας αναφορές σε σχετικές θέσεις μνήμης. Συνήθως τμήμα του λειτουργικού συστήματος.
Αποσφαλματωτής (Debuger)
Επιτρέπει την εκτέλεση του προγράμματος βήμα-βήμα, την εξέταση και αλλαγή μεταβλητών του και γενικά ενέργειες που αποσκοπούν στην ανίχνευση λαθών που μπορεί να περιέχει το πρόγραμμα.

Η διεργασία του προγραμματισμού

Βιβλιογραφία

Ασκήσεις

Εξοικείωση με τον υπολογιστή και το διορθωτή

  1. Σχεδιάστε με το διορθωτή του περιβάλλοντος της C και με τη χρήση των συμβόλων του πληκτρολογίου ένα χαμογελαστό πρόσωπο όπως για παράδειγμα το παρακάτω:
                      -----------------
                    /                   \
                    |                   |
                    |    O         O    |
                    |                   |
                    |                   |
                    |        II         |
                    |    \        /     |
                    |     \------/      |
                    |                   |
    	        \                  /
                      -----------------
    

Η γλώσσα C, το πρώτο πρόγραμμα

Ιστορία της C

Χρονολογίες

  • Δημιουργήθηκε από το 1969-1973 μαζί με το λειτουργικό σύστημα Unix
  • Αλλαγές έγιναν το 1977-1979 όταν το Unix μεταφερόταν σε διαφορετικές υπολογιστικές πλατφόρμες
  • Στα μέσα του 1980 έγινε αμερικανικό και διεθνές πρότυπο

    Γενεαλογία

  • Αλγοριθμικές γλώσσες όπως FORTRAN και Algol
  • BCPL (Martin Richards, μέσα 1960)
  • B (Ken Thompson, 1969)

    Απόγονοι

  • Objective C
  • C++
  • Perl, Java

    Το πρώτο μου πρόγραμμα

    Το παρακάτω πρόγραμμα τυπώνει "hello, world" στην οθόνη.
    #include <stdio.h>

    main()
    {
            printf("hello, world\n");
    }
    Μπορούμε να το αλλάξουμε για να τυπώσει:

    Στοιχεία του προγράμματος

    Τα προγράμματα της C αποτελούνται από ορισμένες βασικές τάξεις στοιχείων:

    Ορισμός απλών συναρτήσεων

    Ασκήσεις

    Εξοικείωση με το μεταγλωττιστή και τη διαδικασία προγραμματισμού

    1. Να πληκτρολογήσετε, μεταγλωττίσετε και να εκτελέσετε ένα πρόγραμμα σε C που να τυπώνει "I am learning C"
    2. Πειραματιστείτε αλλάζοντας διάφορα στοιχεία του προγράμματος. (Το πιθανότερο είναι οι περισσότερες αλλαγές σας να καταλήγουν σε λάθη.)
    3. Φτιάξτε ένα πρόγραμμα το οποίο να τυπώνει με * ένα τετράγωνο στην οθόνη σαν το παρακάτω:
      ***************
      *             *
      *             *
      *             *
      *             *
      *             *
      *             *
      ***************
      
      Για να επαναλαμβανόμενα στοιχεία του τετραγώνου να ορίσετε δύο συναρτήσεις οι οποίες να τα τυπώνουν και να τις καλέσετε όσες φορές και με τη σειρά που χρειάζεται.

    Βιβλιογραφία

    Γενική βιβλιογραφία

    Υπολογισμοί με μεταβλητές, είσοδος και έξοδος

    Σταθερές

    Εκτύπωση τιμών

    Απλές πράξεις

    Οι αριθμητικές τιμές της C μπορούν να συνδυαστούν με τη χρήση των παρακάτω τελεστών (operands):
    Πράξη Τελεστής της C
    Πρόσθεση +
    Αφαίρεση -
    Πολλαπλασιασμός *
    Διαίρεση /
    Υπόλοιπο ακέραιας διαίρεσης %

    Παραδείγματα

    Μεταβλητές

    Είσοδος στοιχείων

    Ασκήσεις

    Είσοδος έξοδος και υπολογισμοί

    1. Να γράψετε ένα πρόγραμμα που θα διαβάζει από το χρήστη την ταχύτητα ενός αντικειμένου σε km/h και την τυπώνει σε m/s. Παράδειγμα της εκτέλεσης του πρόγραμματος:
      Speed (km/h)=120
      A speed of 120 km/h is 33.333 m/s
      

    Βιβλιογραφία

    Τελεστές σύγκρισης, λογικής και επαναλήψεις

    Τελεστές σύγκρισης

    Οι αριθμητικές τιμές της C μπορούν να συγκριθούν με τη χρήση των παρακάτω τελεστών:
    Σύγκριση Τελεστής της C
    Ίσο ==
    Διάφορο !=
    Μικρότερο <
    Μεγαλύτερο >
    Μικρότερο ή ίσο <=
    Μεγαλύτερο ή ίσο >=

    Παραδείγματα

    Βρόχοι με την εντολή while

    Βρόχοι με την εντολή do while

    Λογικοί τελεστές

    Τα λογικά αποτελέσματα στη C μπορούν να συνδυαστούν με τη χρήση των παρακάτω λογικών τελεστών:
    Λογική πράξη Τελεστής της C
    Λογική σύζευξη (boolean and) (και) &&
    Λογική διάζευξη (boolean or) (ή) ||
    Λογική άρνηση (boolean not) (όχι) !

    Παράδειγμα

    Ο παρακάτω βρόχος μπορεί να αποτελεί τμήμα του προγράμματος ελέγχου ενός τραπεζικού μηχανήματος αυτομάτων συναλλαγών:
    {
            int secret, pin, tries;

            secret = 1234;                  /* Customer's secret PIN */
            tries = 0;
            do {
                    printf("Δώστε το PIN σας: ");
                    scanf("%d", &pin);
                    tries = tries + 1;
            } while (pin != secret && tries < 4);
            /* Correct PIN entered or number of tries exhausted */
    }

    Βιβλιογραφία

    Ασκήσεις

    Βρόχοι

    1. Να γράψετε ένα πρόγραμμα που να τυπώνει τον πίνακα της προπαίδειας όπως στο παρακάτω παράδειγμα:
         1    2    3    4    5    6    7    8    9   10 
         2    4    6    8   10   12   14   16   18   20 
         3    6    9   12   15   18   21   24   27   30 
         4    8   12   16   20   24   28   32   36   40 
         5   10   15   20   25   30   35   40   45   50 
         6   12   18   24   30   36   42   48   54   60 
         7   14   21   28   35   42   49   56   63   70 
         8   16   24   32   40   48   56   64   72   80 
         9   18   27   36   45   54   63   72   81   90 
        10   20   30   40   50   60   70   80   90  100 
      
      Για να μπορέσουν οι αριθμοί να εμφανιστούν σε στήλες μπορείτε να χρησιμοποιήσετε στην printf τον κωδικό εξόδου %4d (εμφάνιση του αριθμού σε χώρο 4 χαρακτήρων) αντί του κωδικού %d.

    Προγραμματισμός με χαρακτήρες, αποφάσεις

    Η εντολή if-else

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

    Ο τύπος του χαρακτήρα

    Είσοδος και έξοδος χαρακτήρων

    Βιβλιογραφία

    Ασκήσεις

    If, char

    1. Να γράψετε ένα πρόγραμμα που να διαβάζει χαρακτήρες από την είσοδό του μέχρι να τερματιστεί το αρχείο εισόδου. Στο τέλος να τυπώνει τον αριθμό των χαρακτήρων, γραμμών, ψηφίων (0-9), πεζών χαρακτήρων (a-z) και κεφαλαίων χαρακτήρων (A-Z) που διάβασε. (Οι χαρακτήρες στο σύστημα που χρησιμοποιούμε είναι ταξινομημένοι αλφαβητικά. Η παράσταση c >= 'a' && c <= 'z' είναι αληθής για πεζούς χαρακτήρες στη μεταβλητή c.)
    2. Εκτελέστε το πρόγραμμά σας με είσοδο τον εαυτό του.

    Πρόσθετες δομές ελέγχου: switch for break continue

    Η εντολή for

    Η εντολή break

    Η εντολή switch

    Η εντολή continue

    Βιβλιογραφία

    Ασκήσεις

    switch, for

    1. Να γράψετε ένα πρόγραμμα που να διαβάζει χαρακτήρες από την είσοδό του μέχρι να συναντήσει την τελεία. Οι χαρακτήρες που διαβάζει να εκτυπώνονται σύμφωνα με το διεθνές φωνητικό αλφάβητο: Alpha Bravo Charlie Delta Echo Foxtrot Golf Hotel India Juliet Kilo Lima Mike November Oscar Papa Quebec Romeo Sierra Tango Uniform Victor Whiskey Xray Yankee Zulu. Τα ψηφία 1-9 να εκτυπώνονται με επαναλαμβανόμενα αστέρια (*) αντίστοιχα με το ψηφίο. Χαρακτήρες για τους οποίους δεν υπάρχει αντιστοιχία να εκτυπώνονται ως έχουν. Παράδειγμα:
      Είσοδος:
      Hello 2 you!.
      
      Αποτέλεσμα:
      Hotel Echo Lima Lima Oscar ** Yankee Oscar Uniform!
      

    Ορισμός συναρτήσεων

    Δήλωση συναρτήσεων

    Παράμετροι τιμής

    Καθολικές μεταβλητές

    Μεταβλητές static

    Μεταβλητές τοπικές σε μπλοκ

    Ασκήσεις

    Σχεδιασμός

    1. Σκεφτείτε την υλοποίηση ενός προγράμματος που θα στοιχίζει σωστά άλλα προγράμματα.
      Παράδειγμα εισόδου:
      #include <stdio.h>
      main(){ int i; for (i=0
      ;
      i<10;i++)printf("i =   %d\n", i);}
      
      Παράδειγμα εξόδου:
      #include <stdio.h>
      main()
      {
      	int i;
      	for (i = 0; i < 10; i++)
      		printf("i =   %d\n", i);
      }
      
      Το πρόγραμμα αυτό θα συζητηθεί στο επόμενο μάθημα.

    Βιβλιογραφία

    Παράδειγμα: μορφοποίηση προγραμμάτων

    Ο κύκλος ζωής του λογισμικού

    Ανεπίσημες προδιαγραφές

    Να γραφεί ένα πρόγραμμα το οποίο να στοιχίζει σωστά προγράμματα γραμμένα σε C.

    Επίσημες προδιαγραφές

    Να γραφεί ένα πρόγραμμα το οποίο θα θέτει σωστά τα κενά στην αρχή των γραμμών. Παράδειγμα εισόδου:
    #include <stdio.h>
    
    /*
     * Play the bahm boom game:
     * - print ascending numbers;
     * - bahm's at 9 multiples;
     * - boom's at 7 multiples;
     */
    main()
    {
    int i;
    for (i = 0; i < 100; i++) {
    if (i % 9 == 0) {
    printf("{BAHM}\n");
    if (i % 9 == 0) {
    printf("{BAHM}\n");
    } else if (i % 7 == 0) {
    printf("{BOOM}\n");
    } else {
    printf("%d\n", i);
    }
    }
    }
    
    Παράδειγμα εξόδου:
    #include <stdio.h>
    
    /*
     * Play the bahm boom game:
     * - print ascending numbers;
     * - bahm's at 9 multiples;
     * - boom's at 7 multiples;
     */
    main()
    {
    	int i;
    	for (i = 0; i < 100; i++) {
    		if (i % 9 == 0) {
    			printf("{BAHM}\n");
    			if (i % 9 == 0) {
    				printf("{BAHM}\n");
    			} else if (i % 7 == 0) {
    				printf("{BOOM}\n");
    			} else {
    				printf("%d\n", i);
    			}
    		}
    	}
    }
    

    Αρχιτεκτονική σχεδίαση

    Λεπτομερής σχεδίαση

    Κωδικοποίηση

    #include <stdio.h>

    /* States the system can be in */
    enum states {
            NORMAL,
            HASH,
            SLASH,
            COMMENT,
            STAR,
            STRING,
            BACKSLASH_STRING,
            CHARACTER,
            BACKSLASH_CHARACTER,
            NEWLINE,
    };

    /* Current state */
    int state = NORMAL;

    /* Current level of indent (tabs to print at the beginning of a line) */
    int indent_level = 0;

    /*
     * Print tabs to indent the following character by indent_level
     */
    void
    indent(void)
    {
            int i;

            for (i = 0; i < indent_level; i++)
                    putchar('\t');
    }

    /*
     * State processing functions start here
     */
    void
    comment(char c)
    {
            putchar(c);
            if (c == '*')
                    state = STAR;
    }

    void
    slash(char c)
    {
            putchar(c);
            if (c == '*')
                    state = COMMENT;
            else
                    state = NORMAL;
    }

    void
    string(char c)
    {
            putchar(c);
            if (c == '"')
                    state = NORMAL;
            else if (c == '\\')
                    state = BACKSLASH_STRING;
    }

    void
    backslash_string(char c)
    {
            putchar(c);
            state = STRING;
    }


    void
    character(char c)
    {
            putchar(c);
            if (c == '\'')
                    state = NORMAL;
            else if (c == '\\')
                    state = BACKSLASH_CHARACTER;
    }

    void
    backslash_character(char c)
    {
            putchar(c);
            state = CHARACTER;
    }

    void
    hash(char c)
    {
            putchar(c);
            if (c == '\n')
                    state = NORMAL;
    }

    void
    normal(char c)
    {
            putchar(c);
            switch (c) {
            case '#':
                    state = HASH;
                    break;
            case '/':
                    state = SLASH;
                    break;
            case '\'':
                    state = CHARACTER;
                    break;
            case '"':
                    state = STRING;
                    break;
            case '{':
                    indent_level++;
                    break;
            case '\n':
                    state = NEWLINE;
                    break;
            }
    }

    void
    star(char c)
    {
            putchar(c);
            if (c == '/')
                    state = NORMAL;
            else
                    state = COMMENT;
    }

    void
    newline(char c)
    {
            switch (c) {
            case ' ':
            case '\n':
            case '\t':
                    break;
            case '}':
                    indent_level--;
                    /* FALLTRHOUGH */
            default:
                    indent();
                    state = NORMAL;
                    normal(c);
                    break;
            }
    }

    /*
     * Process a single character.
     * Call the appropriate state handling function
     */
    void
    process(char c)
    {
            switch (state) {
            case NORMAL:
                    normal(c);
                    break;
            case COMMENT:
                    comment(c);
                    break;
            case HASH:
                    hash(c);
                    break;
            case SLASH:
                    slash(c);
                    break;
            case STAR:
                    star(c);
                    break;
            case STRING:
                    string(c);
                    break;
            case BACKSLASH_STRING:
                    backslash_string(c);
                    break;
            case NEWLINE:
                    newline(c);
                    break;
            case CHARACTER:
                    character(c);
                    break;
            case BACKSLASH_CHARACTER:
                    backslash_character(c);
                    break;
            }
    }

    main()
    {
            int c;

            while ((c = getchar()) != EOF)
                    process(c);
    }

    Έλεγχος μονάδων

    Ασκήσεις

    Η γλώσσα HTML

    Εμφάνιση HTML

    Παράδειγμα εισόδου

    
    <h1> Κύρια επικεφαλίδα</h1>
    <h2> Επικεφαλίδα επιπέδου 2 </h2>
    <p>
    Κείμενο το οποίο
    πρέπει
    να εμφανίζεται στοιχισμένο μέχρι τη στήλη 60.
    Οι
    λέξεις
    αυτές
    δεν
    πρέπει
    να
    εμφανίζονται
    σε ξεχωριστές
    γραμμές.
    <p>
    Εδώ αλλάζουμε γραμμή, αλλά η γραμμή αυτή είναι πάρα πολύ μεγάλη και πρέπει να σπάσει
    <h2> Άλλη επικεφαλίδα επιπέδου 2 </h2>
    <p>
    Λίστα με στοιχεία (ένα σε κάθε γραμμή):
    <ul>
    <li> Στοιχείο 1 <LI> Στοιχείο 2
    <li> Στοιχείο 3
    <li> Στοιχείο 4
    </ul>
    
    

    Παράδειγμα εξόδου

    
    1.  Κύρια επικεφαλίδα 
    1.1.  Επικεφαλίδα επιπέδου 2  
     Κείμενο το οποίο πρέπει να εμφανίζεται στοιχισμένο μέχρι τη στήλη
    60. Οι λέξεις αυτές δεν πρέπει να εμφανίζονται σε ξεχωριστές γραμμές.
    
     Εδώ αλλάζουμε γραμμή, αλλά η γραμμή αυτή είναι πάρα πολύ μεγάλη
    και πρέπει να σπάσει 
    1.2.  Άλλη επικεφαλίδα επιπέδου 2  
     Λίστα με στοιχεία (ένα σε κάθε γραμμή):  
    -  Στοιχείο 1 
    -  Στοιχείο 2 
    -  Στοιχείο 3 
    -  Στοιχείο 4   
    

    Βιβλιογραφία

    Παράδειγμα HTML

    Επικεφαλίδα επιπέδου 2

    Κείμενο το οποίο πρέπει να εμφανίζεται στοιχισμένο μέχρι τη στήλη 60. Οι λέξεις αυτές δεν πρέπει να εμφανίζονται σε ξεχωριστές γραμμές.

    Εδώ αλλάζουμε γραμμή, αλλά η γραμμή αυτή είναι πάρα πολύ μεγάλη και πρέπει να σπάσει

    Άλλη επικεφαλίδα επιπέδου 2

    Λίστα με στοιχεία (ένα σε κάθε γραμμή):

    HTML example (english)

    Heading level 2

    Text that should appear wrapped at column 60. These words should not be spread on single lines.

    A new paragraph begins at this point, but this line is quite long and should be split.

    Another heading level 2

    Element list (one per line):

    Πίνακες

    Ορισμός και χρήση πινάκων

    Πίνακες πολλαπλών διαστάσεων

    Πίνακες ως ορίσματα

    Αρχικοποίηση πινάκων

    Πρόσθετοι τύποι και μετατροπή μεταξύ τύπων

    Ασκήσεις

    Πίνακες

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

      Παράδειγμα εξόδου:

      a ********
      b ****
      e ************
      z *
      Most frequent: e; 12 time(s).
      Least frequent: z; 1 time(s).
      
      Σημείωση: Αν η είσοδος του προγράμματος δεν περιέχει ελληνικούς χαρακτήρες, τότε μπορείτε να φυλάξετε τη συχνότητα του κάθε χαρακτήρα σε έναν πίνακα 128 θέσεων με δείκτη τον ίδιο το χαρακτήρα.

    Βιβλιογραφία

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

    Δομή

    Ένωση

    Απαρίθμησης

    Ορισμός τύπων με την typedef

    Ασκήσεις

    Δομές

    1. Να γραφεί πρόγραμμα σε C το οποίο να υλοποιεί αριθμομηχανή μιγαδικών αριθμών σύμφωνα με τις παρακάτω προδιαγραφές:
      • Το πρόγραμμα διαβάζει από το χρήστη ένα ζεύγος αριθμών Α, B, το σύμβολο μιας από τις τέσσερεις πράξεις Σ, ένα ακόμα ζεύγος αριθμών Γ, Δ, και τυπώνει το αποτέλεσμα (Α + Bi) Σ (Γ + Δi).
      • Όταν το αποτέλεσμα είναι (0 + 0i) το πρόγραμμα να τερματίζει τη λειτουργία του.
      Οι μιγαδικοί αριθμοί να οριστούν με τη χρήση δομών. Καλό είναι κάθε πράξη να υλοποιείται από ξεχωριστή συνάρτηση.

      Παράδειγμα:

      Enter number a:5 3
      Enter operator:+
      Enter number b:1 2
      Result=6 + 5i
      Enter number a:1 1
      Enter operator:*
      Enter number b:1.5 2
      Result=-0.5 + 3.5i
      

    Βιβλιογραφία

    Δείκτες και δυναμικές δομές δεδομένων

    Διάταξη των δεδομένων και του κώδικα στη μνήμη

    Δήλωση δεικτών

    Ο τελεστής &

    Χρήση δεικτών

    Κλήση κατ' αναφορά

    Αριθμητική με δείκτες

    Ο τελεστής sizeof

    Δυναμική διάθεση μνήμης

    Φροντιστηριακές ασκήσεις

    1. Συμπληρώστε τον πίνακα με τις τιμές των μεταβλητών μετά την εκτέλεση κάθε μιας από τις παρακάτω εντολές.
              int a, b, c;
              int *ip1, *ip2, *ip3;

              a = 3;
              b = 4;
              ip1 = &a;
              *ip1 = 8;
              ip3 = &c;
              ip2 = ip3;
              b = *ip1;
              *ip2 = *ip1;
      a b c ip1 ip2 ip3
      Αρχή - - - - - -
      a = 3 3 - - - - -
      b = 4 3 4 - - - -
      ip1 = &a 3 4 - &a - -
      *ip1 = 8            
      ip3 = &c            
      ip2 = ip3            
      b = *ip1            
      *ip2 = *ip1            
    2. Υπολογίστε τους τύπους των εκφράσεων δεξιά και αριστερά από κάθε ανάθεση και γράψτε ποιες από τις παρακάτω γραμμές είναι σωστές και ποιες όχι.
              int a, b, c, *p1, *p2, *p3;
              double da, db, dc, *pd1, *pd2, *pd3;

              p1 = &a;
              *p1 = 4;
              p2 = &p1;
              *p2 = *c;
              p3 = a;
              p2 = p3;
              pd1 = p2;
              pd2 = &da;
              dc = *pd3;
              db = *p2;
              &a = 43;

    Ασκήσεις

    Δυναμική χρήση της μνήμης

    1. Να σχεδιάσετε και να γράψετε ένα πρόγραμμα το οποίο τυπώνει τους χαρακτήρες που διαβάζει με την ανάποδη σειρά. Δεν πρέπει να υπάρχει περιορισμός από το πρόγραμμα στον αριθμό των χαρακτήρων που να μπορεί να δεχτεί.
    2. Το παρακάτω πρόγραμμα προσθέτει διανύσματα ν διαστάσεων:
      /*
       * Add two vectors
       *
       * Diomidis Spinellis, December 1998
       */

      #include <stdio.h>

      /*
       * Print the contents of vector v consisting of n elements
       */
      void
      vector_print(double v[], int n)
      {
              int i;

              putchar('(');
              for (i = 0; i < n; i++) {
                      printf("%g", v[i]);
                      if (i < n - 1)
                              printf(", ");
              }
              putchar(')');
      }


      /*
       * Input a vector v consisting of n elements
       */
      void
      vector_input(double v[], int n)
      {
              int i;

              for (i = 0; i < n; i++) {
                      printf("\tEnter element %d: ", i);
                      scanf("%lg", &v[i]);
              }
      }


      /*
       * Sum vector a and vector b to vector c
       * All vectors consist of n elements
       */
      void
      vector_add(double a[], double b[], double c[], int n)
      {
              int i;

              for (i = 0; i < n; i++)
                      c[i] = a[i] + b[i];
      }

      main()
      {
              int nelem;
              double a[10], b[10], c[10];

              printf("Enter number of vector elements: ");
              scanf("%d", &nelem);
              if (nelem > sizeof(a) / sizeof(double)) {
                      printf("Vector size too large.  The maximum vector size is %d.\n",
                              sizeof(a) / sizeof(double));
                      return (1);
              }
              printf("Enter vector a\n");
              vector_input(a, nelem);
              printf("Enter vector b\n");
              vector_input(b, nelem);
              vector_add(a, b, c, nelem);
              vector_print(a, nelem);
              putchar('+');
              vector_print(b, nelem);
              putchar('=');
              vector_print(c, nelem);
      }
      1. Να το μεταγλωττίσετε και να το δοκιμάσετε στη μορφή που είναι.
      2. Να το αλλάξετε έτσι ώστε να μην έχει περιορισμό ως προς το μέγεθος των διανυσμάτων που μπορεί να δεχτεί.
      3. Να το αλλάξετε έτσι ώστε να μην εμφανίζονται καθόλου σε αυτό οι χαρακτήρες [ και ] (χρησιμοποιήστε δείκτες αντί για πίνακες).

    Βιβλιογραφία

    Προσδιορισμός απαιτήσεων, ανάλυση και σχεδίαση

    Απαιτήσεις

    Ο προσδιορισμός των απαιτήσεων διαχωρίζεται Το έγγραφο προδιαγραφών απαιτήσεων από το σύστημα (system requirements document) περιέχει τα παρακάτω στοιχεία (Σκορδαλάκης 1991, σ. 54):
    1. Ορισμός του προβλήματος
    2. Αιτιολόγηση του προβλήματος
    3. Σκοπός του συστήματος και του έργου
    4. Σκοπός του συστήματος και του έργου
    5. Περιορισμοί στο σύστημα και στο έργο
    6. Λειτουργίες ανά συνιστώσα του προβλήματος
      1. Υλικό
      2. Λογισμικό
      3. Άνθρωποι
    7. Χαρακτηριστικά χρηστών
    8. Περιβάλλοντα
      1. ανάπτυξης,
      2. λειτουργίας και
      3. συντήρησης
    9. Στρατηγική λύσης του προβλήματος
    10. Προτεραιότητες στα χαρακτηριστικά του συστήματος
    11. Κριτήρια αποδοχής του συστήματος
    12. Πηγές πληροφοριών
    13. Λεξιλόγιο
    Αντίστοιχα το έγγραφο προδιαγραφών απαιτήσεων από το λογισμικό (software requirements document) περιέχει τα παρακάτω στοιχεία (Σκορδαλάκης 1991, σ. 63):
    1. Εισαγωγή
      1. Σκοπός
      2. Έκταση
      3. Ορισμοί, ακρονυμίες και συντομογραφίες
      4. Αναφορές
      5. Γενική εικόνα
    2. Γενική περιγραφή
      1. Προοπτική του προϊόντος
      2. Λειτουργίες
      3. Χαρακτηριστικά των χρηστών
      4. Γενικοί περιορισμοί
      5. Παραδοχές και εξαρτήσεις
    3. Ειδικές απαιτήσεις
      1. Λειτουργικές απαιτήσεις
        1. Λειτουργική απαίτηση 1
          1. Εισαγωγή
          2. Είσοδοι
          3. Επεξεργασία
          4. Έξοδοι
        2. Λειτουργική απαίτηση 1
        3. ...
        4. Λειτουργική απαίτηση ν
      2. Απαιτήσεις εξωτερικών διαπροσωπειών
        1. Διαπροσωπείες χρήστη (user interfaces)
        2. Διαπροσωπείες υλικού (hardware interfaces)
        3. Διαπροσωπείες λογισμικού (software interfaces)
        4. Διαπροσωπείες επικοινωνιών (communication interfaces)
      3. Απαιτήσεις επίδοσης
      4. Περιορισμοί σχεδίασης
        1. Συμμόρφωση με τα πρότυπα
        2. Περιορισμοί από το υλικό
      5. Ιδιώματα
        1. Διαθεσιμότητα
        2. Ασφάλεια
        3. Συντηρισιμότητα
        4. Μεταφερσιμότητα
      6. Άλλες απαιτήσεις
        1. Βάση δεδομένων
        2. Τρόποι λειτουργίας
        3. Προσαρμογή στο χώρο εγκατάστασης
    4. Παραρτήματα
    5. Ευρετήριο

    Ανάλυση

    Για την κατανόηση, τον προσδιορισμό και την έκφραση των απαιτήσεων από το λογισμικό είναι απαραίτητο ένα ιδεατό μοντέλο (conceptual model) των διεργασιών του συστήματος στο οποίο θα λειτουργήσει το λογισμικό. Τα μοντέλα αυτά χρησιμοποιούν τις παρακάτω τεχνικές παράστασης:
    1. Ροή δεδομένων (data flow)
    2. Μηχανή πεπερασμένων καταστάσεων (finite state machine)
    3. επικοινωνούσες ταυτόχρονες διεργασίες (communicating concurrent processes)
    4. Μοντέλο οντοτήτων σχέσεων (entity relationship models)
    5. Εξομοίωση (simulation)
    6. Λειτουργική σύνθεση (functional composition)
    Η δομημένη ανάλυση (structured analysis) χρησιμοποιεί ως βάση το μοντέλο ροής δεδομένων και μια σειρά από εξειδικευμένους συμβολισμούς για την καταγραφή των απαιτήσεων: Εκτός από τη δομημένη ανάλυση η οποία ταιριάζει με το διαδικασιακό παράδειγμα προγραμματισμού όπως υποστηρίζεται από τις γλώσσες C, Pascal, Fortran κλπ, στις μέρες μας χρησιμοποιείται συχνά και η αντικειμενοστρεφής ανάλυση (object oriented analysis) σε συνδυασμό με αντικειμενοστρεφείς γλώσσες όπως η C++, Java, Eiffel, Smalltalk κλπ.

    Διάγραμμα ροής δεδομένων

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

    Έτσι, το επόμενο σχήμα παριστάνει το διάγραμμα ροής δεδομένων για έναν απλό ελεγκτή ορθογραφίας. Το κείμενο αρχικά χωρίζεται σε λέξεις (split words) οι οποίες ταξινομούνται (sort). Στη συνέχεια απαλείφονται οι πολλαπλές εμφανίσεις λέξεων (unique). Το λεξικό του συστήματος ενώνεται με το λεξικό του χρήστη (merge). Τέλος, εμφανίζονται οι λέξεις που υπάρχουν στο κείμενο αλλά όχι στα ενωμένα λεξικά (not common).

    Λεξικό δεδομένων

    Κατά τη δημιουργία ενός μοντέλου θα ονομαστεί τυπικά ένας μεγάλος αριθμός από οντότητες, τύπους, σχέσεις και ιδιότητες. Το λεξικό δεδομένων περιέχει όλα τα παραπάνω ονόματα, μαζί με τον τύπο και μια επεξήγηση του κάθε ονόματος. Ο παρακάτω πίνακας περιέχει ένα παράδειγμα από λεξικό δεδομένων για μια υποθετική εφαρμογή τράπεζας.
    Όνομα Τύπος Περιγραφή
    Πελάτης Δομή Η εγγραφή με τα στοιχεία ενός πελάτη. Περιέχει όνομα, κωδικό λογαριασμού και υπόλοιπο λογαριασμού.
    Κωδικός λογαριασμού INT(20) Ο μοναδικός κωδικός του λογαριασμού
    Όνομα CHAR(30) Το ονοματεπώνυμο ενός πελάτη
    Υπόλοιπο λογαριασμού INT(12) Το καθαρό υπόλοιπο του λογαριασμού σε δρχ.

    Δομικές μονάδες

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

    Έτσι για παράδειγμα το λειτουργικό σύστημα Windows NT μακροσκοπικά χωρίζεται σε συστήματα επικοινωνίας με το χρήστη, επικοινωνίας με το υλικό, βοηθητικά προγράμματα, κλπ. Το σύστημα επικοινωνίας με το χρήστη χωρίζεται στα υποσυστήματα γραφικών, κειμένου, ήχου, ελεγκτών (controls) κλπ. Μικροσκοπικά, οι σύνθετες δομικές μονάδες του υποσυστήματος ελεγκτών μπορεί να είναι ο ελεγκτής για γραφικό πλήκτρο (button), ελεγκτής πεδίο εισόδου (input box), ελεγκτής για κυλιόμενη μπάρα (scrollbar) κλπ. Τέλος, ο ελεγκτής για την κυλιόμενη μπάρα αποτελείται από απλές δομικές μονάδες (συναρτήσεις) που αντιδρούν στις εντολές του χρήστη.

    Μερικά παραδείγματα σύνθετων δομικών μονάδων είναι τα παρακάτω:

    Σχεδίαση

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

    Για την αποτύπωση του αρχιτεκτονικού σχεδίου της δομής του προγράμματος χρησιμοποιείται συχνά το διάγραμμα δομής προγράμματος (program structure chart). Στο διάγραμμα αυτό κάθε δομική μονάδα παριστάνεται από έναν κόμβο και κάθε κλήση από μια δομική μονάδα σε άλλη από ένα βέλος. Παράλληλα με τα βέλη της κλήσης παριστάνεται με πρόσθετα βέλη τα οποία περιγράφουν την είσοδο ή το αποτέλεσμα μιας δομικής μονάδας και η ροή των δεδομένων μεταξύ δομικών μονάδων. Το παρακάτω σχήμα αποτελεί το διάγραμμα δομής προγράμματος για έναν απλό υπολογιστή μιγαδικών αριθμών.

    Για την αποτύπωση του λεπτομερούς σχεδίου του λογισμικού χρησιμοποιείται ο ψευδοκώδικας (pseudocode) καθώς και τα διαγράμματα ροής (flow charts). Ο ψευδοκώδικας αποτελείται από εντολές ελέγχου της ροής της εκτέλεσης αντίστοιχες με αυτές των γλωσσών προγραμματισμού (if, while, do). Η περιγραφές όμως των συνθηκών και των εντολών δίνονται αδρά, σε φυσική γλώσσα, έτσι ώστε να είναι πιο περιεκτικές και ευνόητες από τις αντίστοιχες εντολές της γλώσσας προγραμματισμού.

    Παράδειγμα ψευδοκώδικα ελέγχου κωδικού (PIN) σε μηχάνημα ATM:

    do
    	Display message asking the user for PIN
    	Read user PIN
    	if incorrect PIN
    		Display error message
    while incorrect PIN
    

    Ασκήσεις

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

    Βιβλιογραφία

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

    Χωρισμός του προγράμματος σε αρχεία

    Ξεχωριστή μεταγλώττιση

    Δήλωση και χρήση καθολικών μεταβλητών

    Δήλωση και χρήση συναρτήσεων

    Χρήση αρχείων επικεφαλίδων

    Περιορισμός της εμβέλειας

    Αφηρημένοι τύποι

    Ασκήσεις

    Υλοποίηση σε τμήματα - έλεγχος

    1. Να γράψετε μια συνάρτηση void hangman(int n) η οποία θα σχεδιάζει στην οθόνη μια κρεμάλα με έναν κρεμασμένο άνθρωπο όπως τον παρακάτω:
      ++----
      |    O
      |   /|\
      |   / \
      
      
      (Επιτρέπεται να βελτιώσετε το παραπάνω σχέδιο).

      Ανάλογα με την τιμή του n (0-6) θα εμφανίζεται και αντίστοιχος αριθμός από τα μέλη του ανθρώπου.

      n = 0
      
      ++----
      |
      |
      |
      
      n = 1
      ++----
      |    O
      |
      |
      
         ...
      
      n = 6
      ++----
      |    O
      |   /|\
      |   / \
      
      
      Προσπαθήστε η συνάρτησή σας να μην περιέχει επαναλαμβανόμενο κώδικα.
    2. Ολοκληρώστε το πρόγραμμά σας προσθέτοντας τη συνάρτηση main με εντολές κατάλληλες για να ελέγξετε τη σωστή λειτουργία της συνάρτησης hangman.
    3. Γράψτε (σε ξεχωριστό αρχείο C) πρόγραμμα το οποίο υλοποιεί το παιγνίδι "κρεμάλα" μεταξύ δύο παικτών. Συγκεκριμένα το πρόγραμμα διαβάζει από ένα χρήστη μια λέξη μέχρι 20 χαρακτήρες. Στη συνέχεια επαναλαμβάνει τα παρακάτω:
      • καθαρίζει την οθόνη (τυπώνοντας 24 \n),
      • ζωγραφίζει μια (αρχικά) άδεια κρεμάλα χρησιμοποιώντας τη συνάρτηση που έχετε ορίσει,
      • τυπώνει τόσα αστεράκια (αρχικά) όσα και τα γράμματα της λέξης που έχει δώσει ο πρώτος χρήστης,
      • ζητάει από έναν δεύτερο χρήστη να μαντέψει ένα γράμμα,
      • αν το γράμμα είναι σωστό τότε το γράμμα εμφανίζεται στις αντίστοιχες θέσεις στα αστεράκια που τυπώνονται, αλλιώς αυξάνεται κατά ένα ο αριθμός των τμημάτων του σώματος που εμφανίζονται στην κρεμάλα.
      Όταν ο δεύτερος παίκτης "κρεμαστεί" ή μαντέψει τη λέξη εμφανίζεται αντίστοιχο μήνυμα.
      Σημείωση: για να διαβάσετε τη λέξη μπορείτε να διαβάζετε χαρακτήρες μέχρι να συναντήσετε \n.
      Παράδειγμα:
      Enter word: hello
      
      ++----
      |
      |
      |
      
      The word is: *****
      Enter letter guess: a
      Sorry...
      
      
      
      
      ++----
      |    O
      |
      |
      
      The word is: *****
      Enter letter guess: e
      Bravo!
      
      
      
      
      ++----
      |    O
      |
      |
      
      The word is: *e***
      Enter letter guess: t
      Sorry...
      
      
      
      
      
      ++----
      |    O
      |    |
      |
      
      The word is: *e***
      Enter letter guess: l
      Bravo!
      
      
      
      
      ++----
      |    O
      |    |
      |
      The word is: *ell*
      Enter letter guess: t
      Sorry...
      
      
      
      ++----
      |    O
      |   /|
      |
      The word is: *ell*
      Enter letter guess:
      ...
      

    Βιβλιογραφία

    Συμβολοσειρές

    Παράσταση συμβολοσειρών

    Επεξεργασία συμβολοσειρών

    Είσοδος και έξοδος

    Συναρτήσεις βιβλιοθήκης

    Στην επικεφαλίδα string.h ορίζονται αρκετές συναρτήσεις για το χειρισμό συμβολοσειρών. Οι πιο χρήσιμες από αυτές είναι οι παρακάτω:
    char * strcpy(char * a, const char * b);
    Αντιγράφει τη συμβολοσειρά b στη συμβολοσειρά a.
    char * strcat(char * a, const char * b);
    Προσθέτει τη συμβολοσειρά b στο τέλος της συμβολοσειράς a.
    int strcmp(const char * a, const char * b);
    Συγκρίνει τις συμβολοσειρές a και b και επιστρέφει 0 αν είναι ίδιες, -1 αν ο πρώτος διαφορετικός χαρακτήρας της a είναι μικρότερος από τον αντίστοιχο της b, και 1 στην αντίθετη περίπτωση.
    size_t strlen(const char * a);
    Επιστρέφει τον αριθμό των χαρακτήρων της συμβολοσειράς a.
    char * strchr(const char * a, int c);
    Επιστρέφει ένα δείκτη στην πρώτη εμφάνιση του χαρακτήρα c στη γραμματοσειρά a ή NULL αν δεν εμφανίζεται.

    Σύνθετες δομές

    Ασκήσεις

    Συμβολοσειρές

    1. Υλοποιήστε τις συναρτήσεις που ορίζονται στο string.h με δικό σας όνομα (π.χ. my_strlen) σε ξεχωριστό αρχείο.
    2. Γράψτε ένα πρόγραμμα που να ελέγχει τις συναρτήσεις που υλοποιήσατε.
    Η άσκηση είναι προαιρετική.

    Βιβλιογραφία

    Η πρότυπη βιβλιοθήκη

    Εισαγωγή

    Είσοδος και έξοδος

    Επικεφαλίδα
    #include <stdio.h>
    Περιλαμβάνει
    Συναρτήσεις για είσοδο και έξοδο στοιχείων και επεξεργασία αρχείων.
    Βασικές συναρτήσεις
    fopen
    Επιστρέφει ένα ρεύμα (stream) για την επεξεργασία ενός αρχείου.
    fclose
    Τερματίζει την επεξεργασία ενός αρχείου.
    printf
    Τυπώνει φορμαρισμένα στην έξοδο (stdout).
    fprintf
    Τυπώνει φορμαρισμένα σε αρχείο.
    sprintf
    Τυπώνει φορμαρισμένα σε συμβολοσειρά.
    fscanf
    Διαβάζει φορμαρισμένα από αρχείο.
    scanf
    Διαβάζει φορμαρισμένα από την είσοδο (stdin).
    getc
    Διαβάζει έναν χαρακτήρα από αρχείο.
    getchar
    Διαβάζει έναν χαρακτήρα από την είσοδο.
    putc
    Τυπώνει έναν χαρακτήρα σε αρχείο.
    putchar
    Τυπώνει έναν χαρακτήρα στην έξοδο.
    fread
    Διαβάζει στοιχεία από το αρχείο.
    fwrite
    Τυπώνει στοιχεία στο αρχείο.
    fseek
    Ορίζει τη θέση στο αρχείο
    Παράδειγμα
    Το παρακάτω παράδειγμα τυπώνει τα περιεχόμενα του αρχείου test.c:
    #include <stdio.h>

    main()
    {
            FILE *f;
            int c;

            f = fopen("test.c""r");
            while ((c = getc(f)) != EOF)
                    putchar(c);
    }

    Χαρακτηρισμός χαρακτήρων

    Επικεφαλίδα
    #include <ctype.h>
    Περιλαμβάνει
    Συναρτήσεις που χαρακτηρίζουν τον είδος ενός χαρακτήρα.
    Βασικές συναρτήσεις
    isdigit
    Επιστρέφει αληθές αν ο χαρακτήρας είναι ψηφίο
    isalpha
    Επιστρέφει αληθές αν ο χαρακτήρας είναι αλφαβητικός
    isalnum
    Επιστρέφει αληθές αν ο χαρακτήρας είναι αλφαβητικός ή ψηφίο
    isspace
    Επιστρέφει αληθές αν ο χαρακτήρας είναι κάποιο κενό
    isupper
    Επιστρέφει αληθές αν ο χαρακτήρας είναι κεφαλαίος
    islower
    Επιστρέφει αληθές αν ο χαρακτήρας είναι πεζός
    Οι παραπάνω συναρτήσεις σε πολλές υλοποιήσεις δεν υποστηρίζουν τους ελληνικούς χαρακτήρες.
    Παράδειγμα
    Το παρακάτω παράδειγμα τυπώνει τον αριθμό των ψηφίων, πεζών και κεφαλαίων χαρακτήρων που συναντά στην είσοδό του.
    #include <stdio.h>
    #include <ctype.h>

    main()
    {
            int c;
            int digits, upper, lower;

            digits = upper = lower = 0;
            while ((c = getchar()) != EOF) {
                    if (isdigit(c))
                            digits++;
                    if (isupper(c))
                            upper++;
                    if (islower(c))
                            lower++;
            }
            printf("digits = %d\n", digits);
            printf("upper = %d\n", upper);
            printf("lower = %d\n", lower);
    }

    Μαθηματικά

    Επικεφαλίδα
    #include <math.h>
    Περιλαμβάνει
    Μαθηματικές συναρτήσεις σε αριθμούς κινητής υποδιαστολής (double)
    Βασικές συναρτήσεις
    sin
    Ημίτονο
    cos
    Συνημίτονο
    tan
    Εφαπτομένη
    asin
    Τόξο ημίτονου
    acos
    Τόξο συνημίτονου
    atan2
    Τόξο εφαπτομένης
    sinh
    Υπερβολικό ημίτονο
    cosh
    Υπερβολικό συνημίτονο
    log
    Φυσικός λογάριθμος
    pow
    Δύναμη
    sqrt
    Τετραγωνική ρίζα
    ceil
    Στρογγυλεύει προς τα άνω
    floor
    Στρογγυλεύει προς τα κάτω
    fmod
    Υπόλοιπο διαίρεσης
    Παράδειγμα
    Το παρακάτω παράδειγμα τυπώνει 3.1415...
    #include <stdio.h>
    #include <math.h>

    main()
    {
            printf("%g\n"2.0 * asin(1.0));
    }

    Βοηθητικές συναρτήσεις

    Επικεφαλίδα
    #include <stdlib.h>
    Περιλαμβάνει
    Συναρτήσεις μετατροπής αριθμών, χρήσης δυναμικής μνήμης (βλ. δυναμική διάθεση μνήμης), λειτουργίας στο περιβάλλον του λειτουργικού συστήματος και χρήσης ταξινομημένων πινάκων.
    Βασικές συναρτήσεις
    atof
    Μετατρέπει συμβολοσειρά σε double
    atol
    Μετατρέπει συμβολοσειρά σε long
    atoi
    Μετατρέπει συμβολοσειρά σε int
    abs
    Επιστρέφει την απόλυτη τιμή ενός int
    max
    Επιστρέφει το μέγιστο δύο αριθμών
    min
    Επιστρέφει τον ελάχιστο δύο αριθμών
    rand
    Επιστρέφει έναν ψευδοτυχαίο αριθμό 0 - RAND_MAX
    srand
    Καθορίζει τη βάση εκκίνησης της rand
    malloc
    Δεσμεύει και επιστρέφει δυναμική μνήμη
    free
    Ελευθερώνει δυναμική μνήμη
    realloc
    Αλλάζει το μέγεθος ενός τμήματος δυναμικής μνήμης
    exit
    Τερματίζει το πρόγραμμα
    system
    Εκτελεί εντολή του λειτουργικού συστήματος
    getenv
    Επιστρέφει την τιμή μιας μεταβλητής του λειτουργικού συστήματος
    qsort
    Ταξινομεί έναν πίνακα
    bsearch
    Δυαδική αναζήτηση σε ταξινομημένο πίνακα
    Παράδειγμα
    Το παρακάτω παράδειγμα γεμίζει έναν πίνακα με ψευδοτυχαίους αριθμούς, τον ταξινομεί και επιτρέπει στο χρήστη να ψάξει για έναν αριθμό μέσα στον πίνακα.
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>


    /*
     * Qsort/bsearch comparison function
     */
    int
    compare(const int *a, const int *b)
    {
            return (*a - *b);
    }

    /*
     * Print an integer table contents using a given label
     */
    void
    dump_int_table(char *label, int *table, int nelem)
    {
            int i;

            printf("%s\n", label);
            for (i = 0; i < nelem; i++)
                    printf("(%d%d) ", i, table[i]);
            putchar('\n');
    }

    main()
    {
            int *tbl;                       /* Integer table */
            char buff[10];                  /* User input */
            int n, i;                       /* User number, counter */
            int *pos;                       /* Found position */
            const int TABLE_SIZE = 64;

            /* Randomize the random number generator using current time */
            srand(time(NULL));

            /* Allocate table memory */
            tbl = (int *)malloc(TABLE_SIZE * sizeof(int));

            /* Fill table with random numbers (0 - 2 * TABLE_SIZE) */
            for (i = 0; i < TABLE_SIZE; i++)
                    tbl[i] = rand() % (TABLE_SIZE * 2);
            dump_int_table("Table with random numbers", tbl, TABLE_SIZE);

            /* Sort the table contents */
            qsort(tbl, TABLE_SIZE, sizeof(int), compare);
            dump_int_table("Sorted table with random numbers", tbl, TABLE_SIZE);

            /* Read and convert a number from the user (without using scanf) */
            printf("Search for which number? (0-%d):"2 * TABLE_SIZE);
            fgets(buff, sizeof(buff), stdin);
            n = atoi(buff);

            /* Search for the number and report result */
            pos = bsearch(&n, tbl, TABLE_SIZE, sizeof(int), compare);
            if (pos)
                    printf("The number %d is located at table position %d\n",
                            n, pos - tbl);
            else
                    printf("The number %d is not in the table\n");

            /* Free memory and exit - not strictly needed */
            free(tbl);
            exit(0);
    }

    Συμβολοσειρές

    Επικεφαλίδα
    #include <string.h>
    Περιλαμβάνει
    Συναρτήσεις επεξεργασίας συμβολοσειρών (βλ. αναλυτικές σημειώσεις).

    Διάγνωση

    Επικεφαλίδα
    #include <assert.h>
    Περιλαμβάνει
    Τη συνάρτηση assert
    Βασικές συναρτήσεις
    assert
    Με τη δήλωση assert(x) ο προγραμματιστής δηλώνει στο πρόγραμμα ότι με βάση το σχεδιασμό του περιμένει ότι η χ θα είναι αληθής. Αν η x δεν είναι αληθής το πρόγραμμα διακόπτει την εκτέλεσή του με μήνυμα που πληροφορεί το χειριστή για το σημείο που παρουσιάστηκε το πρόβλημα.
    Παράδειγμα
    Το παρακάτω παράδειγμα τυπώνει τους αριθμούς 0-9. Στη συνέχεια θέλουμε να τυπώσει 20 με τη χρήση του i. Για το σκοπό αυτό ελέγχουμε ότι το i στο τέλος του βρόχου είναι όντως 10.
    #include <stdio.h>
    #include <assert.h>

    main()
    {
            int i;

            for (i = 0; i < 10; i++)
                    printf("%d\n", i);
            /* i should be 10 here */
            assert(i == 10);
            printf("%d\n", i + i);
    }

    Ώρα και ημερομηνία

    Επικεφαλίδα
    #include <time.h>
    Περιλαμβάνει
    Συναρτήσεις για την επεξεργασία ημερομηνίας και ώρας
    Βασικές συναρτήσεις
    time
    Επιστρέφει την ώρα (σε δευτερόλεπτα από το 1970)
    localtime
    Μετατρέπει την ώρα από δευτερόλεπτα σε τοπική ώρα και την αποθηκεύει στη δομή struct tm
    asctime
    Μετατρέπει την ώρα από τη δομή σε συμβολοσειρά.
    difftime
    Επιστρέφει τη διαφορά ανάμεσα σε δύο ώρες
    Παράδειγμα
    Το παρακάτω παράδειγμα τυπώνει την τοπική ώρα.
    #include <stdio.h>
    #include <time.h>

    main()
    {
            struct tm local;
            time_t now;

            time(&now);
            local = *localtime(&now);
            printf("%s\n", asctime(&local));
    }

    Όρια υλοποίησης

    Επικεφαλίδα
    #include <limits.h>
    #include <float.h>
    Περιλαμβάνει
    Σταθερές που ορίζουν τα όρια των ακεραίων και αριθμών κινητής υποδιαστολής για τη συγκεκριμένη υλοποίηση.
    Βασικές τιμές
    CHAR_MAX
    Ο μέγιστος char
    CHAR_MIN
    Ο ελάχιστος char
    INT_MAX
    Ο μέγιστος int
    INT_MIN
    Ο ελάχιστος int
    DBL_MAX
    Ο μέγιστος double
    DBL_MIN
    Ο ελάχιστος double
    DBL_DIG
    Τα δεκαδικά ψηφία ακρίβειας των double
    Παράδειγμα
    Το παρακάτω παράδειγμα τυπώνει τα όρια της υλοποίησης.
    #include <stdio.h>
    #include <limits.h>
    #include <float.h>

    main()
    {
            printf("CHAR_MAX=%d\n"CHAR_MAX);
            printf("CHAR_MIN=%d\n"CHAR_MIN);
            printf("INT_MAX=%d\n"INT_MAX);
            printf("INT_MIN=%d\n"INT_MIN);
            printf("DBL_MAX=%g\n"DBL_MAX);
            printf("DBL_MIN=%g\n"DBL_MIN);
            printf("DBL_DIG=%d\n"DBL_DIG);
    }
    Στην υλοποίηση Visual C++ 5.00 τυπώνει:
    CHAR_MAX=127
    CHAR_MIN=-128
    INT_MAX=2147483647
    INT_MIN=-2147483648
    DBL_MAX=1.79769e+308
    DBL_MIN=2.22507e-308
    DBL_DIG=15
    

    Ασκήσεις

    Πρότυπη βιβλιοθήκη

    1. Να βρείτε και να διαβάσετε την τεκμηρίωση για τη συνάρτηση rename. Γράψτε ένα πρόγραμμα που να τη χρησιμοποιεί.
    Η άσκηση είναι προαιρετική.

    Βιβλιογραφία

    Θέματα εξετάσεων

    Εξεταστική περιόδος Φεβρουαρίου 1999

    ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ

    Τμήμα Πληροφοριακών και Επικοινωνιακών Συστημάτων

    Σχεδιασμός και Υλοποίηση Λογισμικού

    Διδάσκων: Διομήδης Σπινέλλης

    Εξεταστική περίοδος

    Φεβρουαρίου 1999

    Θέμα 1ο: (2 βαθμοί)

    Γράψτε σε C μια συνάρτηση που να δέχεται ως όρισμα τρεις διαφορετικούς δείκτες σε ακεραίους και μεταθέτει κυκλικά δεξιόστροφα τις τιμές τους. Γράψτε ένα πρόγραμμα για τον έλεγχο της λειτουργίας της συνάρτησης αυτής.

    Θέμα 2ο: (2 βαθμοί)

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

    Θέμα 3ο: (3 βαθμοί)

    Γράψτε σε C ένα πρόγραμμα το οποίο να δέχεται για είσοδο τις συντεταγμένες (x,y) 100 σημείων ως αριθμούς κινητής υποδιαστολής. Στο τέλος, το πρόγραμμα πρέπει να τυπώνει για κάθε ένα από τα σημεία τη θέση του (x, y) καθώς και την απόστασή του από την αρχή των αξόνων (0,0). Οι συντεταγμένες κάθε σημείου πρέπει να φυλάσσονται σε δομή (structure). Η συνάρτηση της C για την τετραγωνική ρίζα (sqrt) ορίζεται στην επικεφαλίδα math.h.

    Θέμα 4ο: (3 βαθμοί)

    Ο τελικός βαθμός ενός μαθήματος είναι κατά 20\% ο βαθμός των ασκήσεων και κατά 80\% ο βαθμός των εξετάσεων όταν και οι δύο βαθμοί είναι πάνω από τη βάση, αλλιώς είναι ο κατώτερος από τους δύο. Σας ζητείται να υλοποιήσετε μια εφαρμογή η οποία διαβάζει συνέχεια ζεύγη βαθμών ασκήσεων και εξετάσεων και τυπώνει λεκτικά (π.χ. "δέκα") τον ακέραιο τελικό βαθμό. Όταν εισαχθεί το ζεύγος (-1, -1) η εφαρμογή τυπώνει λεκτικά τον ακέραιο μέσο όρο των τελικών βαθμών και τερματίζει τη λειτουργία της. Σχεδιάστε το διάγραμμα δομής και γράψτε σε C το αντίστοιχο πρόγραμμα.

    Διάρκεια εξέτασης 2,5 ώρες Καλή επιτυχία!

    Πρόγραμμα για το θέμα 1: αντιστροφή τιμών

    #include <stdio.h>
    
    /*
     * Rotate variable values clockwise
     */
    void
    rotate3(int *a, int *b, int *c)
    {
    	int tmp;
    
    	tmp = *c;
    	*c = *b;
    	*b = *a;
    	*a = tmp;
    }
    
    main()
    {
    	int v1, v2, v3;
    
    	v1 = 1;
    	v2 = 2;
    	v3 = 3;
    	rotate3(&v1, &v2, &v3);
    	printf("Expect 3 1 2: [%d %d %d]\n", v1, v2, v3);
    }
    

    Πρόγραμμα για το θέμα 3: απόσταση σημείων

    #include <stdio.h>
    #include <math.h>
    
    
    /*
     * Return x squared
     */
    double
    sqr(double x)
    {
    	return (x * x);
    }
    
    main()
    {
    	struct s_point {
    		double x, y;		/* Coordinates */
    	} points[100];
    	int i;
    
    	for (i = 0; i < 100; i++)
    		scanf("%lg %lg", &points[i].x, &points[i].y);
    	for (i = 0; i < 100; i++) {
    		printf("x=%lg y=%lg ", points[i].x, points[i].y);
    		printf("d=%lg\n", sqrt(sqr(points[i].x) + sqr(points[i].y)));
    	}
    }
    

    Πρόγραμμα για το θέμα 4: βαθμολογία

    #include <stdio.h>
    
    /*
     * Print a number 0-10 as a word
     */
    void
    print_grade(int g)
    {
    	switch (g) {
    	case 0:
    		printf("μηδέν\n");
    		break;
    	case 1:
    		printf("ένα\n");
    	/* ... */
    	case 10:
    		printf("δέκα\n");
    		break;
    	}
    }
    
    main()
    {
    	int exercise, exam, grade;
    	int count, sum;
    
    	count = sum = 0;
    	for (;;) {
    		scanf("%d %d", &exercise, &exam);
    		if (exercise == -1 && exam == -1)
    			break;
    		if (exercise >= 5 && exam >= 5)
    			grade = 0.8 * exercise + 0.2 * grade;
    		else if (exercise < exam)
    			grade = exercise;
    		else
    			grade = exam;
    		print_grade(grade);
    		count++;
    		sum = sum + grade;
    	}
    	printf("M.O. = ");
    	print_grade(sum / grade);
    }
    

    Εξεταστική περιόδος Σεπτεμβρίου 1999

    ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ

    Τμήμα Πληροφοριακών και Επικοινωνιακών Συστημάτων

    Σχεδιασμός και Υλοποίηση Λογισμικού

    Διδάσκων: Διομήδης Σπινέλλης

    Εξεταστική περίοδος

    Σεπτεμβρίου 1999

    Θέμα 1ο: (2.5 βαθμοί)

    Γράψτε σε C τη συνάρτηση strrev που δέχεται ως όρισμα ένα δείκτη σε χαρακτήρες τερματισμένους με Σ\0Τ (συμβολοσειρά) και αντιστρέφει τη σειρά των χαρακτήρων της συμβολοσειράς. Αν για παράδειγμα η συμβολοσειρά πριν την κλήση τής strrev είναι "live" μετά την κλήση της πρέπει να είναι "evil". Γράψτε ένα απλό πρόγραμμα για τον έλεγχο της λειτουργίας της συνάρτησης αυτής.

    Θέμα 2ο: (2.5 βαθμοί)

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

    Θέμα 3ο: (2.5 βαθμοί)

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

    a 12.2\%

    e 9.3\%

    k 7.3\%

    Θέμα 4ο: (2.5 βαθμοί)

    Ο παρακάτω κώδικας ορίζει έναν πίνακα αντιστοιχίας ανάμεσα σε χαρακτήρες του λατινικού αλφαβήτου και τον αντίστοιχο κώδικα Morse:

    struct s_morse {
            char c;			/* Character code */
            char *morse;		/* Morse code */
    } morse_table[] = {
            'A', ".-",
            'B', "-...",
            'C', "-.-.", 
           /* [...] complete table follows */
    };
    

    Να γράψετε ένα πρόγραμμα σε C που να διαβάζει χαρακτήρες από την είσοδό του μέχρι να τερματιστεί το αρχείο εισόδου. Για κάθε χαρακτήρα να τυπώνει (με τη χρήση του morse_table) τον αντίστοιχο κώδικα Morse.

    Διάρκεια εξέτασης 2,5 ώρες

    Καλή επιτυχία!

    Πρόγραμμα για το θέμα 4: Morse

    #include <stdio.h>
    
    struct s_morse {
    	char c;
    	char *morse;
    } morsetable[] = {
    	'A', ".-",
    	'B', "-...",
    	'C', "-.-.",
    };
    
    main()
    {
    	int i, c;
    
    	while ((c = getchar()) != EOF) {
    		for (i = 0; i < sizeof(morsetable) / sizeof(struct s_morse); i++)
    			if (c == morsetable[i].c)
    				printf("%s\n", morsetable[i].morse);
    	}
    }
    

    Πρόοδος 1999

    ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ

    Τμήμα Πληροφοριακών και Επικοινωνιακών Συστημάτων

    Σχεδιασμός και Υλοποίηση Λογισμικού

    Διδάσκων: Επικ. Καθηγητής Διομήδης Σπινέλλης

    Πρόοδος

    Νοεμβρίου 1999

    Θέμα 1ο: (5 βαθμοί)

    Γράψτε σε C ένα πρόγραμμα που διαβάζει από την είσοδό του ακέραιους βαθμούς από το 0 μέχρι το 10. Αφού διαβάσει ένα βαθμό να τυπώνει στην οθόνη του "Περνάει" αν ο βαθμός είναι μεγαλύτερος από 4 ή "Δεν περνάει" αν ο βαθμός είναι μικρότερος από 5. Όταν εισαχθεί ο βαθμός -1, το πρόγραμμα τερματίζει τη λειτουργία του και τυπώνει το μέσο όρο των βαθμών που διάβασε.

    Θέμα 2ο: (2 βαθμοί)

    Τι θα τυπώσει το παρακάτω πρόγραμμα;

    #include <stdio.h>
    
    int
    a(int a, int b)
    {
    	a++;
    	return (a * b + 1);
    }
    
    main()
    {
    	int i, f;
    
    	f = 1;
    	for (i = 0; i < 4; i++) {
    		f = f + a(i, i + 1);
    		printf("%d\n", f);
    	}
    }
    

    Θέμα 3ο: (3 βαθμοί)

    Να ορίσετε σε C μια συνάρτηση που να δέχεται ως όρισμα την ταχύτητα ενός αυτοκινήτου σε km/h και την απόστασή του από τον προορισμό του σε km. Η συνάρτηση να επιστρέφει το χρόνο (σε s) που χρειάζεται το αυτοκίνητο για να φτάσει στον προορισμό του με τη συγκεκριμένη ταχύτητα. Όλα τα μεγέθη να οριστούν ως αριθμοί κινητής υποδιαστολής.

     

    Διάρκεια εξέτασης 2 ώρες

    Καλή επιτυχία!

    Εξεταστική περιόδος Ιανουαρίου 2000

    ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ

    Τμήμα Πληροφοριακών και Επικοινωνιακών Συστημάτων

    Σχεδιασμός και Υλοποίηση Λογισμικού

    Διδάσκων: Επίκ. Καθηγητής Διομήδης Σπινέλλης

    Εξεταστική περίοδος

    Ιανουαρίου 2000

    Θέμα 1ο: (2.5 βαθμοί)

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

    Θέμα 2ο: (2.5 βαθμοί)

    Προσδιορίστε, σε όχι περισσότερο από μια σελίδα, τις απαιτήσεις λογισμικού για ένα σύστημα παρακολούθησης δανεισμού βιβλίων από τη βιβλιοθήκη.

    Θέμα 3ο: (2 βαθμοί)

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

    Λάθος: στο αρχείο εμφανίζονται 5 Σ(Σ και 4 Σ)Τ.

    Λάθος: στο αρχείο εμφανίζονται 12 Σ{Σ και 15 Σ}Τ.

    Το πρόγραμμα δε χρειάζεται να ελέγχει τη σειρά με την οποία εμφανίζονται τα στοιχεία (π.χ. κλείσιμο πριν από άνοιγμα).

    Θέμα 4ο: (3 βαθμοί)

    Να γράψετε σε C ένα πρόγραμμα που να διαβάζει από την είσοδό του θετικούς ακέραιους αριθμούς μέχρι να συναντήσει το -1. Στο τέλος το πρόγραμμα να τυπώνει πόσες φορές εμφανίστηκε ο κάθε αριθμός. Ο κάθε αριθμός μαζί με τις φορές που έχει εμφανιστεί να φυλαχτεί σε μια δομή (struct) της C. Το πρόγραμμα πρέπει να μπορεί να χειριστεί θεωρητικά απεριόριστο αριθμό στοιχείων με τη χρήση δυναμικής μνήμης. Παράδειγμα:

    Είσοδος: 545 79334 2 143 545 79334 79334 934744 934744 -1

    Έξοδος:
    545: 2
    79334: 3
    2: 1
    143: 1
    934744: 2

    Διάρκεια εξέτασης 2,5 ώρες

    Καλή επιτυχία!

    Εξεταστική περιόδος Σεπτεμβρίου 2000

    ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ

    Τμήμα Πληροφοριακών και Επικοινωνιακών Συστημάτων

    Σχεδιασμός και Υλοποίηση Λογισμικού

    Διδάσκων: Επίκ. Καθηγητής Διομήδης Σπινέλλης

    Εξεταστική περίοδος

    Σεπτεμβρίου 2000

    Θέμα 1ο: (2.5 βαθμοί)

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

    Θέμα 2ο: (2.5 βαθμοί)

    Προσδιορίστε, σε όχι περισσότερο από μια σελίδα, τις απαιτήσεις λογισμικού για έναν απλό επεξεργαστή κειμένου.

    Θέμα 3ο: (2 βαθμοί)

    Η γλώσσα επισημείωσης HTML χρησιμοποιεί την ακολουθία "<tag ...>" για να προσδιορίσει χαρακτηριστικά του κειμένου. Να γράψετε ένα πρόγραμμα σε C που να διαβάζει HTML ως χαρακτήρες από την είσοδό του μέχρι να τερματιστεί το αρχείο εισόδου. Το πρόγραμμα θα εμφανίζει στην έξοδό του το κείμενο της εισόδου χωρίς τις ακολουθίες επισημείωσης. Παράδειγμα:
    Είσοδος:
    <html><body><h1>Εισαγωγή</h1> Κείμενο της εισαγωγής</body></html>
    

    Έξοδος:
    Εισαγωγή Κείμενο της εισαγωγής
    

    Το πρόγραμμα δε χρειάζεται να ελέγχει μη κανονικά σχηματισμένη HTML (π.χ. επισημειώσεις μέσα σε επισημειώσεις).

    Θέμα 4ο: (3 βαθμοί)

    Να γράψετε σε C ένα πρόγραμμα που να διαβάζει από την είσοδό του α) τον αριθμό των αθλητών που λαμβάνουν μέρος σε ένα άθλημα και β) για κάθε αθλητή το επώνυμό του (μέχρι 20 χαρακτήρες) και την επίδοσή του (ως αριθμό κινητής υποδιαστολής). Στο τέλος το πρόγραμμα να τυπώνει ξανά τους αθλητές και τις επιδόσεις τους εμφανίζοντας τρία αστεράκια πλάι στο όνομα του αθλητή με την καλύτερη (μικρότερη) επίδοση. Τα στοιχεία του κάθε αθλητή να φυλαχτούν σε μια δομή (struct) της C. Το πρόγραμμα πρέπει να μπορεί να χειριστεί θεωρητικά απεριόριστο αριθμό αθλητών με τη χρήση δυναμικής μνήμης. Το όνομα και η επίδοση του αθλητή μπορούν να διαβαστούν με τη συμβολοσειρά της scanf "%s %g".

    Διάρκεια εξέτασης 2,5 ώρες

    Καλή επιτυχία!

    Πληροφορίες για μεταγλωττιστές

    Ο μεταγλωττιστής gcc

    Προσοχή

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

    Και τώρα τα στοιχεία:

    Καλή τύχη!

    Αποτελέσματα ασκήσεων

    Ασκήσεις 3, 4

    cs00001@icsd.aegean.gr1010
    cs00002@icsd.aegean.gr109.5
    cs00003@icsd.aegean.gr109.5
    cs00004@icsd.aegean.gr1010
    cs00005@icsd.aegean.gr109.5
    cs00006@icsd.aegean.gr1010
    cs00007@icsd.aegean.gr1010
    cs00008@icsd.aegean.gr1010
    cs00009@icsd.aegean.gr
    cs00010@icsd.aegean.gr1010
    cs00011@icsd.aegean.gr1010
    cs00012@icsd.aegean.gr109.5
    cs00013@icsd.aegean.gr1010
    cs00014@icsd.aegean.gr1010
    cs00015@icsd.aegean.gr
    cs00016@icsd.aegean.gr109.5
    cs00017@icsd.aegean.gr109
    cs00018@icsd.aegean.gr1010
    cs00019@icsd.aegean.gr1010
    cs00020@icsd.aegean.gr1010
    cs00021@icsd.aegean.gr1010
    cs00022@icsd.aegean.gr1010
    cs00023@icsd.aegean.gr1010
    cs00024@icsd.aegean.gr
    cs00025@icsd.aegean.gr109.5
    cs00026@icsd.aegean.gr109.5
    cs00027@icsd.aegean.gr010
    cs00028@icsd.aegean.gr1010
    cs00029@icsd.aegean.gr1010
    cs00030@icsd.aegean.gr
    cs00031@icsd.aegean.gr109.5
    cs00032@icsd.aegean.gr1010
    cs00033@icsd.aegean.gr109.5
    cs00034@icsd.aegean.gr010
    cs00035@icsd.aegean.gr1010
    cs00036@icsd.aegean.gr1010
    cs00037@icsd.aegean.gr1010
    cs00038@icsd.aegean.gr1010
    cs00039@icsd.aegean.gr1010
    cs00040@icsd.aegean.gr1010
    cs00041@icsd.aegean.gr1010
    cs00042@icsd.aegean.gr
    cs00043@icsd.aegean.gr1010
    cs00044@icsd.aegean.gr1010
    cs00045@icsd.aegean.gr1010
    cs00046@icsd.aegean.gr1010
    cs00047@icsd.aegean.gr1010
    cs00048@icsd.aegean.gr1010
    cs00049@icsd.aegean.gr109.5
    cs00050@icsd.aegean.gr1010
    cs00051@icsd.aegean.gr109
    cs00052@icsd.aegean.gr109.5
    cs00053@icsd.aegean.gr109.5
    cs00054@icsd.aegean.gr109
    cs00055@icsd.aegean.gr
    cs00056@icsd.aegean.gr109
    cs00057@icsd.aegean.gr
    cs00058@icsd.aegean.gr109.5
    cs00059@icsd.aegean.gr1010
    cs00060@icsd.aegean.gr109.5
    cs00061@icsd.aegean.gr1010
    cs00062@icsd.aegean.gr
    cs00063@icsd.aegean.gr
    cs00064@icsd.aegean.gr109.5
    cs00065@icsd.aegean.gr109.5
    cs00066@icsd.aegean.gr1010
    cs00067@icsd.aegean.gr
    cs00068@icsd.aegean.gr1010
    cs99004@icsd.aegean.gr1010
    cs99010@icsd.aegean.gr1010
    cs99014@icsd.aegean.gr010
    cs99016@icsd.aegean.gr87
    cs99034@icsd.aegean.gr1010
    cs99042@icsd.aegean.gr010
    cs99043@icsd.aegean.gr010
    s96052@math.aegean.gr1010

    Ασκήσεις 3-6

    09-Nov-0009-Nov-0016-Nov-0023-Nov-00
    E-mailΆσκηση 3Άσκηση 4Άσκηση 5Άσκηση 6
    1ο Έτος
    cs00001@icsd.aegean.gr10.010.09.510.0
    cs00002@icsd.aegean.gr10.09.510.010.0
    cs00003@icsd.aegean.gr10.09.59.59,0*
    cs00004@icsd.aegean.gr10.010.010.010.0
    cs00005@icsd.aegean.gr10.09.510.010.0
    cs00006@icsd.aegean.gr10.010.010.010.0
    cs00007@icsd.aegean.gr10.010.010.010.0
    cs00008@icsd.aegean.gr10.010.010.010.0
    cs00009@icsd.aegean.gr0.00.00.00.0
    cs00010@icsd.aegean.gr10.010.09.510.0
    cs00011@icsd.aegean.gr10.010.09.59.5
    cs00012@icsd.aegean.gr10.09.59,0*9.0
    cs00013@icsd.aegean.gr10.010.09.510.0
    cs00014@icsd.aegean.gr10.010.010.09.0
    cs00015@icsd.aegean.gr0.00.00.00.0
    cs00016@icsd.aegean.gr10.09.510.09.0
    cs00017@icsd.aegean.gr10.09.09.59.5
    cs00018@icsd.aegean.gr10.010.09.510.0
    cs00019@icsd.aegean.gr10.010.010.010.0
    cs00020@icsd.aegean.gr10.010.09.50.0
    cs00021@icsd.aegean.gr10.010.00.09,0*
    cs00022@icsd.aegean.gr10.010.010.09.5
    cs00023@icsd.aegean.gr10.010.010.09.5
    cs00024@icsd.aegean.gr0.00.00.00.0
    cs00025@icsd.aegean.gr10.09.510.09,0*
    cs00026@icsd.aegean.gr10.09.58.510.0
    cs00027@icsd.aegean.gr0.010.010.09.5
    cs00028@icsd.aegean.gr10.010.010.09,0*
    cs00029@icsd.aegean.gr10.010.09,0*9.5
    cs00030@icsd.aegean.gr0.00.00.00.0
    cs00031@icsd.aegean.gr10.09.59.510.0
    cs00032@icsd.aegean.gr10.010.09.59.5
    cs00033@icsd.aegean.gr10.09.510.010.0
    cs00034@icsd.aegean.gr0.010.010.010.0
    cs00035@icsd.aegean.gr10.010.010.010.0
    cs00036@icsd.aegean.gr10.010.010.09.0
    cs00037@icsd.aegean.gr10.010.010.010.0
    cs00038@icsd.aegean.gr10.010.09,0*9,0*
    cs00039@icsd.aegean.gr10.010.010.010.0
    cs00040@icsd.aegean.gr10.010.010.09,0*
    cs00041@icsd.aegean.gr10.010.010.010.0
    cs00042@icsd.aegean.gr0.00.00.00.0
    cs00043@icsd.aegean.gr10.010.010.010.0
    cs00044@icsd.aegean.gr10.010.09.59.0
    cs00045@icsd.aegean.gr10.010.00.09.0
    cs00046@icsd.aegean.gr10.010.010.010.0
    cs00047@icsd.aegean.gr10.010.08,5*10.0
    cs00048@icsd.aegean.gr10.010.010.010.0
    cs00049@icsd.aegean.gr10.09.510.010.0
    cs00050@icsd.aegean.gr10.010.010.010.0
    cs00051@icsd.aegean.gr10.09.010.010.0
    cs00052@icsd.aegean.gr10.09.510.010.0
    cs00053@icsd.aegean.gr10.09.510.010.0
    cs00054@icsd.aegean.gr10.09.010.010.0
    cs00055@icsd.aegean.gr0.00.00.00.0
    cs00056@icsd.aegean.gr10.09.010.010.0
    cs00057@icsd.aegean.gr0.00.00.00.0
    cs00058@icsd.aegean.gr10.09.59,0*8,0*
    cs00059@icsd.aegean.gr10.010.010.09.5
    cs00060@icsd.aegean.gr10.09.59,0*10.0
    cs00061@icsd.aegean.gr10.010.010.010.0
    cs00062@icsd.aegean.gr0.00.00.00.0
    cs00063@icsd.aegean.gr0.00.00.00.0
    cs00064@icsd.aegean.gr10.09.510.010.0
    cs00065@icsd.aegean.gr10.09.59,0*10.0
    cs00066@icsd.aegean.gr10.010.09.00.0
    cs00067@icsd.aegean.gr0.00.00.00.0
    cs00068@icsd.aegean.gr10.010.09,0*9,0*
    cs00069@icsd.aegean.gr10.010.09.59.0
    10.010.010.09.0
    2ο Έτος
    cs99004@icsd.aegean.gr10.010.010.010.0
    cs99010@icsd.aegean.gr10.010.09.510.0
    cs99014@icsd.aegean.gr0.010.010.09.5
    cs99016@icsd.aegean.gr8.07.00.010.0
    cs99034@icsd.aegean.gr10.010.010.09,0*
    cs99039@icsd.aegean.gr0.010.010.010.0
    cs99042@icsd.aegean.gr0.010.010.010.0
    cs99043@icsd.aegean.gr0.00.010.010.0
    Μαθηματικό
    s96052@math.aegean.gr10.010.09.59.5