Προγραμματισμός σε Pascal

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

Εισαγωγή - Τακτικοί τύποι και λογικές παραστάσεις

Καλώς ήρθατε

Προγραμματισμός σε Pascal

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

  1. Τακτικοί τύποι και λογικές παραστάσεις
  2. Ορίσματα και εμβέλειες
  3. Τύποι οριζόμενοι από το χρήστη
  4. Πρόσθετες δομές ελέγχου
  5. Γραφικά με υπολογιστή
  6. Βασικά στοιχεία γραφικών
  7. Πίνακες
  8. Ορμαθοί χαρακτήρων
  9. Εγγραφές
  10. Σειριακά αρχεία

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

Λεπτομέρειες για τις ασκήσεις

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

Χρόνος παράδοσης

Τρόπος παράδοσης

Περιεχόμενο

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

Συνεργασία

Διαδικασία εκτέλεσης της Pascal στα Windows 95

Την πρώτη φορά που χρησιμοποιούμε τα Windows 95 πρέπει να συνδέσουμε σωστά τους δίσκους του δικτύου που περιέχουν τα αρχεία της Pascal
  • Αυτό γίνεται με την παρακάτω διαδικασία:
    1. Κάντε Double click στο Network Neighborhood
    2. Κάντε Double click στο Polycratis
    3. Πιέστε το δεξί πλήκτρο του mouse πάνω στο φάκελο Apps
    4. Επιλέξτε Map Network Drive
    5. Επιλέξτε Drive: Z και τσεκάρετε την επιλογή Reconnect at logon
    6. Κάντε click στο OK
    7. Πιέστε το δεξί πλήκτρο του mouse στο Home
    8. Επιλέξτε Map Network Drive
    9. Επιλέξτε Drive: Y
    10. Κάντε click στο OK
    11. Κάντε Double-click στο Applications
    12. Πιέστε το δεξί πλήκτρο του mouse στο Borland Pascal
    13. Επιλέξτε Properties
    14. Επιλέξτε Program
    15. Πηγαίνετε στο Working : και πληκτρολογήστε Y:\students
    16. Επιλέξτε OK
    Όταν αποθηκεύετε το πρόγραμμά σας μέσα από την Pascal πρέπει πάντα να δίνετε το σωστό φάκελο αποθήκευσης (π.χ. Y:\CS99\s99101).

    Τακτικοί τύποι

    Οι τύποι integer, boolean και char ονομάζονται τακτικοί τύποι (ordered types) διότι ορίζονται σε πεπερασμένες διατεταγμένες ακολουθίες. Στους τύπους αυτούς μπορούμε να ορίσουμε τις παρακάτω συναρτήσεις:
    succ
    Επόμενη τιμή
    pred
    Προηγούμενη τιμή
    ord
    Σειρά στην ακολουθία

    Λογικές παραστάσεις

    Μεταβλητές τύπου boolean μπορούν να ενωθούν σε λογικές παραστάσεις με τις παρακάτω τελεστές:
    and
    Σύζευξη
    or
    Διάζευξη
    not
    Άρνηση

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

    Ασκήσεις

    1. Να γραφεί πρόγραμμα σε Pascal το οποίο να μετατρέπει έναν αριθμό από το δεκαδικό σύστημα στο δυαδικό. Ο αριθμός στο δυαδικό σύστημα επιτρέπεται να τυπώνεται και ανάποδα (από το τέλος προς την αρχή).
    2. Να γραφεί πρόγραμμα σε Pascal το οποίο να τυπώνει σε δύο στήλες την κωδικοποίηση των χαρακτήρων του υπολογιστή (χαρακτήρας, κωδικός). Ο πρώτος χαρακτήρας που θα τυπωθεί πρέπει να είναι το κενό (' ') και έχει τον κωδικό 32 και ο τελευταίος πρέπει να είναι η περισπωμένη και έχει τον κωδικό 126.
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Ορίσματα και εμβέλειες

    Δομή των συναρτήσεων και διαδικασιών

    Οι συναρτήσεις και οι διαδικασίες έχουν τη μορφή ενός προγράμματος. Μετά την επικεφαλίδα της συνάρτησης ή της διαδικασίας ορίζουμε:
    1. Σταθερές
    2. Μεταβλητές
    3. Άλλες συναρτήσεις και διαδικασίες
    4. Τις εντολές που θα εκτελεστούν
    Παράδειγμα:
    program Example;
    const
    	g = 9.81;
    var
    	height : real;
    
    procedure clearScreen;
    const
    	numLines = 24;
    var
    	count : integer;
    begin
    	count := 0;
    	while count < numLines do
    		writeln;
    end;
    
    begin
    	clearScreen;
    	readln(height);
    	writeln(sqrt(2 * height / g), 's')
    end.
    

    Ορίσματα

    Οι τυπικές παράμετροι (formal parameters) που ορίζονται στην επικεφαλίδα της συνάρτησης ή της διαδικασίας μας επιτρέπουν να της περνάμε τιμές. Στο σώμα της συνάρτησης ή της διαδικασίας οι παράμετροι αυτές έχουν την τιμή την οποία περάσαμε κατά την κλήση και μπορούμε να τις χρησιμοποιήσουμε σαν μεταβλητές. Ορίζουμε δύο είδη παραμέτρων:
    παράμετρος τιμής (value parameter)
    Αλλαγές στην τιμή της παραμέτρου στο σώμα της διαδικασίας ή της συνάρτησης δεν αντικατοπτρίζονται έξω από τη συνάρτηση.

    Παράδειγμα ορισμού:

    procedure test(i : integer);
    
    παράμετρος μεταβλητής (variable parameter)
    Αλλαγές στην τιμή της παραμέτρου στο σώμα της διαδικασίας ή της συνάρτησης αλλάζουν την τιμή της μεταβλητής η οποία υποχρεωτικά δώθηκε σαν παράμετρος κατά την κλήση.

    Παράδειγμα ορισμού:

    procedure test(var i : integer);
    

    Εμβέλεια

    Παράδειγμα

    program Test;
    var
    	a : integer;	{a1}
    
    procedure Dummy;
    var
    	a : integer;	{a2}
    begin
    	a := 3		{use a2}
    end;
    
    begin
    	a := 8		{use a1}
    end.
    

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

    Ασκήσεις

    Pascal 03

    1. Να γραφεί πρόγραμμα σε Pascal το οποίο να περιέχει τα παρακάτω στοιχεία:
      1. Διαδικασία INC με όρισμα παράμετρο μεταβλητής η οποία να αυξάνει την τιμή της κατά 1.
      2. Διαδικασία COUNT με όρισμα παράμετρο τιμής η οποία να τυπώνει τους αριθμούς από την τιμή αυτή μέχρι το 10 κάνοντας χρήση της διαδικασίας INC.
      3. Κλήση της διαδικασίας COUNT με όρισμα σε μεταβλητή για να τυπωθούν οι αριθμοί από το 3 μέχρι το 10.
      4. Εκτύπωση της τιμής της παραπάνω μεταβλητής μετά το τέλος της διαδικασίας.
      5. Όλες οι μεταβλητές και τα ονόματα των ορισμάτων στο πρόγραμμα να είναι ίδια. (Η απαίτηση αυτή έχει εκπαιδευτικό μόνο χαρακτήρα. Κανονικά όλες οι μεταβλητές πρέπει να ονοματίζονται με τρόπο ώστε να αποφεύγεται η πιθανότητα σύγχυσης.)
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Πρόσθετες δομές ελέγχου

    Επανάληψη σε ακέραιες τιμές

    Παράδειγμα:
    for i := 1 to 10 do
    begin
    	writeln(i);
    	k := k + i
    end
    
    for c := 'Z' downto 'A' do
    	write(c)
    

    Επιλογή περιπτώσεων

    Παράδειγμα:
    case c of
    	'A' : writeln('alpha');
    	'B', 'C' : writeln('beta');
    	'1', '2': writeln('digit');
    end
    

    Σύνθετες επιλογές

    Παράδειγμα:
    if i < 10 then
    	writeln('Number too small')
    else if i > 1000 then
    	writeln('Number too large')
    else
    	writeln(i)
    

    Έλεγχος βρόχου στο τέλος

    Παράδειγμα:
    repeat
    	readln(number);
    	writeln(number)
    until number < 0;
    

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

    Ασκήσεις

    Pascal 04

    1. Να γραφεί πρόγραμμα σε Pascal σύμφωνα με τις παρακάτω προδιαγραφές:
      • Το πρόγραμμα επαναλαμβανόμενα διαβάζει από το χρήστη έναν αριθμό Α, το σύμβολο μιας από τις τέσσερεις πράξεις Σ και έναν ακόμα αριθμό Β και τυπώνει το αποτέλεσμα Α Σ Β.
      • Όταν το αποτέλεσμα είναι 0 το πρόγραμμα να τερματίζει τη λειτουργία του.
      • Αποτελέσματα με τιμές από το 1 μέχρι το 9 παριστάνονται και με το σύμβολο * επαναλαμβανόμενο ανάλογα με το αποτέλεσμα.
      Παράδειγμα:
      3
      *
      4
      12
      3
      +
      3
      6 (******)
      4
      -
      2
      2 (**)
      2
      -
      2
      0
      
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Τύποι οριζόμενοι από το χρήστη

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

    H Pascal μας επιτρέπει να ορίσουμε νέους τύπους βασισμένους σε τύπους που υπάρχουν με τη δήλωση TYPE. Η δήλωση αυτή γίνεται πριν από τη δήλωση των μεταβλητών.

    Παράδειγμα:

    type
    	force = real;
    	mass = real;
    	acc = real;
    
    var
    	carMass : mass;
    	carAcc : acc;
    
    function theForce(m : mass; a : acc) : force;
    begin
    	theForce := m * a
    end;
    
    begin
    	readln(carMass);
    	readln(carAcc);
    	writeln(theForce(carMass, carAcc)
    end.
    

    Τύποι υποπεριοχής

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

    Παράδειγμα:

    type
    	upper = 'A' .. 'Z';
    	lower = 'a' .. 'z';
    	months = 1..12;
    

    Απαριθμήσιμοι τακτικοί τύποι

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

    Παράδειγμα:

    type
    	ScreenColor = (Red, Green, Blue);
    	Shape = (Line, Triangle, Rectangle, Circle);
    
    Τους απαριθμήσιμους τακτικούς τύπους μπορούμε να τους χρησιμοποιήσουμε σχεδόν όπως και τους υπόλοιπους τακτικούς τύπους. Δεν μπορούμε να τους διαβάσουμε με την εντολή ReadLn και να τους τυπώσουμε με την εντολή WriteLn.

    Παράδειγμα:

    Program EnumExample;
    type
    	ScreenColor = (Red, Green, Blue);
    var
    	Color : ScreenColor;
    begin
    	Color := Red;
    	while Color < Blue do
    	begin
    		writeln(ord(Color));
    		Color := succ(Color)
    	end
    end.
    

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

    Ασκήσεις

    Pascal 05

    1. Να γραφεί πρόγραμμα σε Pascal το οποίο να διαβάζει από το χρήστη το ύψος από την επιφάνεια της γης στο οποίο βρίσκεται ένα αντικείμενο και να τυπώνει το χρόνο που θα διαρκέσει η ελεύθερη πτώση του σύμφωνα με τους παρακάτω περιορισμούς:
      1. Ο υπολογισμός να γίνεται με τη βοήθεια συνάρτησης.
      2. Όλοι οι τύποι φυσικών μεγεθών να οριστούν ξεχωριστά.
      3. Η σταθερά της βαρύτητας να οριστεί ως σταθερά της Pascal.
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Γραφικά με υπολογιστή

    Παράσταση γραφικών

    Συστήματα συντεταγμένων

    Γραφικά σε Turbo Pascal

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

    Ασκήσεις

    Pascal 06

    1. Να γραφεί πρόγραμμα σε Pascal σύμφωνα με τις παρακάτω προδιαγραφές:
      • Το πρόγραμμα σχεδιάζει στην οθόνη τους άξονες συντεταγμένων (x,y) καθώς και τη γραφική παράσταση μιας συνάρτησης της αρεσκείας σας για ένα κατάλληλο (ορισμένο από σας) πεδίο τιμών.
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Πίνακες

    Ορισμός πινάκων

    Παράδειγμα:

    const
    	red = 0;
    	green = 1;
    	blue = 2;
    
    var
       grades : array [1..120] of integer;
       temperatures : array [-5..5] of real;
       table : array [0..10,0..20] of real;
       screen : array [0..479,0..639] of array [red..blue] of integer;
    

    Χρήση στοιχείων

    Παράδειγμα:

       grades[15] := 9;
       temperatures[-2] := 37.8;
       table[3,2] := 12.3;
       screen[5,7][red] := 12;
    

    Χρήση πινάκων

    Παράδειγμα:

    type
         grades = array [1..120] of integer;
    
    var
         thisYear, lastYear : grades;
    
    procedure readGrades(var theGrades : grades);
    ...
    
    begin
         readGrades(lastyear);
         thisYear := lastYear
    end.
    

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

    Ασκήσεις

    Pascal 07

    1. Να γραφεί πρόγραμμα σε Pascal το οποίο να διαβάζει 5 χαρακτήρες και να τους τυπώνει σε αλφαβητική σειρά.

      Παράδειγμα:

      O
      S
      I
      D
      A
      
      A
      D
      I
      O
      S
      
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Ορμαθοί χαρακτήρων

    Ορισμός ορμαθών χαρακτήρων

    Παράδειγμα:

    
    var
       myname : packed array [0..32] of char;
    

    Χρήση ορμαθών χαρακτήρων

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

    Παράδειγμα:

    program test;
    var
       a, b : packed array [0..10] of char;
    
    begin
         readln(a);
         b := a;
         writeln(b);
         writeln(b = a)
    end.
    

    Πρόσβαση στους χαρακτήρες

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

    Παράδειγμα:

    program test;
    var
       a : packed array [0..10] of char;
       i : integer;
    
    begin
         readln(a);
         for i := 0 to 10 do
             write(a[i]);
         writeln
    end.
    

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

    Ασκήσεις

    Pascal 08

    1. Να γραφεί πρόγραμμα σε Pascal το οποίο να παίζει το παιγνίδι της "κρεμάλας" ανάμεσα σε δύο χρήστες Α και Β. Το πρόγραμμα διαβάζει από τον χρήστη Α μια λέξη και το μήκος της, και καθαρίζει την οθόνη τυπώνοντας 24 κενές γραμμές. Στη συνέχεια ζητά από το χρήστη Β να μαντέψει τη λέξη γράμμα-γράμμα. Για κάθε σωστό γράμμα που μαντεύει ο χρήστης Β το πρόγραμμα τυπώνει τη λέξη με το γράμμα στη σωστή θέση. Οι υπόλοιπες θέσεις της λέξης συνεχίζουν να εμφανίζονται με παύλες. Για κάθε λάθος γράμμα που μαντεύει ο χρήστης Β το πρόγραμμα εμφανίζει το χαρακτήρα * τόσες φορές όσα μέλη έχουν απομείνει στο χρήστη (αρχικά 5). Το πρόγραμμα τερματίζει εμφανίζοντας το ανάλογο μήνυμα αν ο χρήστης Β χάσει όλα τα μέλη του ή μαντέψει όλη τη λέξη.

      Παράδειγμα:

      Lexi: PASCAL
      Mikos: 6
      
      
      
      
      Gramma: E
      ****
      Gramma: Q
      ***
      Gramma: A
      -A--A-
      Gramma: T
      **
      Gramma: P
      PA--A-
      Gramma: I
      *
      Gramma: L
      PA--AL
      Gramma: C
      PA-CAL
      Gramma: S
      PASCAL
      You made it!!!
      
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Εγγραφές

    Ορισμός εγγραφών

    Παράδειγμα:

    program test;
    
    type
    
        date = record
           day : 1..31;
           month : 1..12;
           year : integer
        end;
    
        member = record
             name : packed array [1..4] of char;
             from, ending : date
        end;
    
    var
        coordinate : record
            x, y : integer
        end;
    
        members : array [1..100] of member;
    
    

    Χρήση στοιχείων

    Παράδειγμα:

    program test;
    
    type
    
        date = record
           day : 1..31;
           month : 1..12;
           year : integer
        end;
    
        member = record
             name : packed array [1..4] of char;
             from, ending : date
        end;
    
    var
        coordinate : record
            x, y : integer
        end;
    
        members : array [1..100] of member;
    
    begin
        coordinate.x := 5;
        coordinate.y := 4;
        writeln(coordinate.x);
        writeln(coordinate.y);
    
        members[1].name := 'R2D2';
        members[1].from.day := 22;
        members[1].from.month := 5;
        members[1].from.year := 4567;
        members[1].ending.day := 22;
        members[1].ending.month := 5;
        members[1].ending.year := 4570;
    end.
    

    Χρήση εγγραφών

    Παράδειγμα:

    program test;
    
    type
    
        date = record
           day : 1..31;
           month : 1..12;
           year : integer
        end;
    
        member = record
             name : packed array [1..4] of char;
             from, ending : date
        end;
    
    var
        coordinate : record
            x, y : integer
        end;
    
        members : array [1..100] of member;
    
    procedure MyPlot(c : coordinate);
    begin
    	putpixel(c.x, c.y, 1)
    end;
    
    begin
        coordinate.x := 5;
        coordinate.y := 4;
        MyPlot(coordinate);
    
        members[1].name := 'R2D2';
        members[1].from.day := 22;
        members[1].from.month := 5;
        members[1].from.year := 4567;
        members[1].ending.day := 22;
        members[1].ending.month := 5;
        members[1].ending.year := 4570;
        members[2] := members[1];
        members[2].name := 'C3PO'
    end.
    

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

    Ασκήσεις

    Pascal 09

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

      Παράδειγμα:

      5 3
      +
      1 2
      6 + 5i
      1 1
      *
      1.5 2
      -0.5 + 3.5i
      
      Για την υλοποίηση του προγράμματος μπορείτε να επαναχρησιμοποιήσετε το πρόγραμμα της άσκησης PASCAL 04.
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Σειριακά αρχεία

    Εισαγωγή στα αρχεία

    Βασικός χειρισμός

    Παράδειγμα:

    program testfile;
    var
       f : file of integer;
       i : integer;
    
    begin
         assign(f, 'INT.DAT');
    
         rewrite(f);
         for i := 1 to 5 do
             write(f, i);
         close(f);
    
         reset(f);
         while not eof(f) do
         begin
             read(f, i);
             writeln(i)
         end;
         close(f);
    end.
    

    Μετά την εκτέλεση του παραπάνω προγράμματος το αρχείο INT.DAT θα περιέχει τις παρακάτω τιμές:

    01 00 02 00 03 00 04 00 05 00
    

    Αρχεία κειμένου

    Παράδειγμα:

    program testfile;
    var
       f : text;
       i : integer;
    
    begin
         assign(f, 'INT.TXT');
    
         rewrite(f);
         for i := 1 to 5 do
             writeln(f, i);
         close(f);
    
         reset(f);
         while not eof(f) do
         begin
             readln(f, i);
             writeln(i)
         end;
         close(f);
    end.
    

    Μετά την εκτέλεση του παραπάνω προγράμματος το αρχείο INT.TXT θα περιέχει το παρακάτω κείμενο:

    1
    2
    3
    4
    5
    

    Παράδειγμα

    Το παρακάτω παράδειγμα ζητάει από το χρήστη να προσδιορίσει δύο ονόματα αρχείων Α, Β και αντιγράφει το αρχείο Α στο αρχείο Β.
    program copyfile;
    var
       infname, outfname : packed array [0..8] of char;
       fin, fout : file of char;
       c : char;
    
    begin
         write('Give input file:');
         readln(infname);
         write('Give output file:');
         readln(outfname);
         assign(fin, infname);
         assign(fout, outfname);
         rewrite(fout);
         reset(fin);
         rewrite(fout);
         while not eof(fin) do
         begin
             read(fin, c);
             write(fout, c)
         end;
         close(fin);
         close(fout);
    end.
    

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

    Ασκήσεις

    Pascal 10

    1. Να επεκταθεί το πρόγραμμα της αριθμομηχανής (Pascal 09) έτσι ώστε να καταγράφει σε αρχείο κειμένου τις πράξεις και τα αποτελέσματα.
    2. Ως παραδοτέο της άσκησης να αποσταλεί (με τον κωδικό PASCAL 20) και ένα αντίγραφο του αρχείου αυτού που να περιέχει δείγματα όλων των πράξεων.

      Παράδειγμα του αρχείου:

      (5 + 3i) + (1 + 2i) = (6 + 5i)
      (5 + 3i) - (1 + 2i) = (4 + 1i)
      (1 + 1i) * (1.5 + 2i) = (-0.5 + 3.5i)
      ...
      
    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Συναρτησιακός προγραμματισμός

    Συναρτησιακές παράμετροι

    Μπορούμε να ορίσουμε ως ορίσμα μιας διαδικασίας ή συνάρτησης μια άλλη διαδικασία ή συνάρτηση αρκεί να ορίσουμε τον αντίστοιχο τύπο.

    Παράδειγμα:

    program maptest;
    {$F+}
    type
    	realmap = function(x : real) : real;
    
    function map2(f : realmap; n : real) : real;
    begin
    	map2 := f(f(n))
    end;
    
    function double(x : real) : real;
    begin
    	double := x * 2
    end;
    
    begin
    	writeln(map2(double, 1))
    end.
    
    Το πρόγραμμα θα υπολογίσει την τιμή double(double(1)) και θα τυπώσει 4.

    Σημείωση

    Στην Turbo Pascal 7.0 πρέπει στην αρχή του προγράμματος να δωθεί το σχόλιο {$F+} για να υποστηριχτεί η λειτουργία αυτή.

    Η συνάρτηση map

    Η διαδικασία map μετασχηματίζει μια σειρά στοιχείων σε μια άλλη, με βάση μια συνάρτηση από στοιχείο σε στοιχείο. Αν η συνάρτηση είναι η f και η σειρά αποτελείται από τα στοιχεία:
    σ1, σ2, σ3, σ4, σ5 ...
    τότε η νέα σειρά θα είναι:
    f(σ1), f(σ2, f(σ3), f(σ4), f(σ5) ...

    Για παράδειγμα με βάση τη διαδικασία map και αντίστοιχη συνάρτηση f μπορούμε εύκολα να δημιουργήσουμε από έναν πίνακα v έναν νέο πίνακα v' του οποίου τα στοιχεία να είναι διπλάσια κάθε στοιχείου του v:

    program Map;
    {$F+}
    const
    	maxindex = 10;
    
    type
    	realmap = function(x : real) : real;
    	mylist = array [1..maxindex] of real;
    
    var
    	i : integer
    	l1, l2 : mylist;
    
    procedure map(f : realmap; v : mylist; var vnew : mylist);
    var
    	i : integer;
    begin
    	for i := 1 to maxindex do
    		vnew[i] := f(v[i])
    end;
    
    function double(x : real) : real;
    begin
    	double := x * 2
    end;
    
    begin
    	for i := 1 to maxindex do
    		readln(l1[i]);
    	map(double, l1, l2);
    	for i := 1 to maxindex do
    		writeln(l2[i]);
    end.
    

    Η συνάρτηση fold

    Η συνάρτηση fold "διπλώνει" μια σειρά στοιχείων σε μια τιμή με βάση μια συνάρτηση από στοιχείο και τιμή σε τιμή και μια αρχική τιμή. Αν η συνάρτηση είναι η f, η αρχική τιμή α και η σειρά αποτελείται από τα στοιχεία: σ1, σ2, σ3 ... τότε η νέα σειρά θα είναι: f(...,f(σ3, f(σ2, f(σ1, α))))...

    Για παράδειγμα με βάση τη συνάρτηση fold και αντίστοιχη συνάρτηση f μπορούμε εύκολα να βρούμε το άθροισμα των στοιχείων ενός πίνακα:

    program TestFold;
    {$F+}
    const
            maxindex = 10;
    type
            realmap = function(x : real; y : real) : real;
            mylist = array [1..maxindex] of real;
    var
            i : integer;
            l : mylist;
    function fold(f : realmap; a : real; v : mylist) : real;
    var
            i : integer;
            result : real;
    begin
            result := a;
            for i := 1 to maxindex do
                    result := f(v[i], result);
            fold := result;
    end;
    function sum(x : real; y : real) : real;
    begin
            sum := x + y
    end;
    begin
            for i := 1 to maxindex do
                    readln(l[i]);
            writeln(fold(sum, 0, l))
    end.
    

    Αριθμητικές μέθοδοι

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

    Εύρεση ρίζας εξίσωσης με τη μέθοδο Newton-Raphson

    Μπορούμε να επιλύσουμε μια εξίσωση της μορφής f(x) = 0 με βάση την επαναλαμβανόμενη εφαρμογή του

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

    Η εύρεση της παραγώγου f' της f για μια τιμή x μπορεί και αυτή να υπολογιστεί αριθμητικά ως:

    για μια αρκετά μικρή τιμή του h.

    Το παρακάτω πρόγραμμα βρίσκει αριθμητικά μια ρίζα (1.4142135624) της εξίσωσης x^2 - 2 = 0.

    program NewtonRaphsonExample;
    {$F+}
    const
         Epsilon = 1e-8;	{Αρκετά μικρή τιμή}
    
    type
        realfun = function(x : real) : real;
    
    {Εύρεση παραγώγου της f για την τιμή x}
    function DerivativeValue(f : realfun; x : real) : real;
    begin
         DerivativeValue := (f(x + epsilon) - f(x)) / epsilon
    end;
    
    {Εύρεση ρίζας της f για αρχική πιθανή τιμή x}
    function NewtonRaphson(f : realfun; x1 : real) : real;
    var
       x0 : real;
    begin
         repeat
               x0 := x1;
               x1 := x0 - f(x0) / DerivativeValue(f, x0)
         until abs(x1 - x0) < epsilon;
         NewtonRaphson := x1
    end;
    
    {Εξίσωση - παράδειγμα (χ^2 - 2 = 0)}
    function Example(x : real) : real;
    begin
         Example := sqr(x) - 2
    end;
    
    begin
         writeln(NewtonRaphson(Example, 12))
    end.
    

    Αριθμητικός υπολογισμός ολοκληρώματος με τη μέθοδο του τραπεζίου

    Χωρίζοντας την επιφάνεια που ορίζει μια συνάρτηση σε μεγάλο αριθμό τραπεζίων μπορούμε να προσεγγίσουμε αριθμητικά την τιμή του ολοκληρώματος:

    ως άθροισμα των εμβαδών τους. Το όρισμα μιας τέτοιας συνάρτησης είναι της μορφής:
    Function Integrate(f : realfun; a, b : real) : real;
    

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

    Ασκήσεις

    Pascal 11

    1. Να γραφεί πρόγραμμα σε Pascal το οποίο να υπολογίζει με τη μέθοδο του τραπεζίου το ολοκλήρωμα μιας συνάρτησης. Με βάση το πρόγραμμα αυτό να υπολογιστεί η τιμή Α του

      και να τυπωθεί το Α και το 4*Α.

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

    Περισσότερες λεπτομέρειες για τις ασκήσεις

    Από την Pascal στη C

    Δομή

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

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

    Τα προγράμματα της C αποτελούνται από ένα σύνολο ορισμών συναρτήσεων και μεταβλητών. Η εκτέλεση του προγράμματος αρχίζει πάντα από τη συνάρτηση main η οποία πρέπει να έχει οποσδήποτε οριστεί. Το παρακάτω είναι ένα απλό πρόγραμμα σε C:

    /* Τύπωσε hello, world */
    #include <stdio.h>
    
    int
    main()
    {
    	printf("hello, world\n");
    	return (0);
    }
    

    Σε σχέση με την Pascal παρατηρούμε πως:

    Οι συναρτήσεις ορίζονται με βάση το όνομά τους, τον τύπο του αποτελέσματος που επιστρέφουν και τα ονόματα και τους τύπους των ορισμάτων τους. Η τιμή που θα επιστρέψει η συνάρτηση δίδεται ως παράμετρος στην εντολή return. Η παρακάτω συνάρτηση επιστρέφει το τετράγωνο ενός ακεραίου:
    int
    sqr(int n)
    {
    	return (n * n);
    }
    
    Η παρακάτω συνάρτηση επιστρέφει το άθροισμα δύο αριθμών:
    int
    sum2(int a, int b)
    {
    	return (a + b);
    }
    

    Ο προεπεξεργαστής

    Ένα στοιχείο το οποίο (σωστά μάλλον) απουσιάζει από την Pascal είναι ο προεπεξεργαστής. Το πρόγραμμα της C πριν το μεταγλωτιστή περνά από τον προεπεξεργαστή ο οποίο και εκτελεί ορισμένες απλές λεκτικές αλλαγές. Συγκεκριμένα επιτρέπει:

    Βασικοί τύποι

    Οι ορισμοί τύπων στη C σε παράθεση με τους αντίστοιχους της Pascal είναι:
    Pascal C
    i: Integer int i;
    c: Char char c;
    r: Real double r;
    b: Boolean int b;
    a: array [0..9] of integer int a[10];
    k: Packed array [0..49] of char char k[50];
    Οι λογικές τιμές αληθές και ψευδές παριστάνονται με ακέραιους διάφορους του 0 (π.χ. 1) και το 0 αντίστοιχα.

    Τελεστές

    Δομές ελέγχου

    Η C σε αντιστοιχία με την Pascal υποστηρίζει τις παρακάτω δομές ελέγχου:
    Pascal C
    BEGIN {
    END }
    IF έκφραση THEN εντολή1 ELSE εντολή2 if (έκφραση) εντολή1 else εντολή2
    WHILE έκφραση DO εντολή while (έκφραση) εντολή
    REPEAT εντολή UNTIL έκφραση do εντολή while (!έκφραση)
    FOR μεταβλητή := αρχή TO τέλος DO εντολή for (μεταβλητή = αρχή; μεταβλητή <= τέλος; μεταβλητή++) εντολή
    CASE έκφραση OF
    σταθερά1: 
    	εντολή1;
    σταθερά2: 
    	εντολή2 
    END
    
    switch (έκφραση) {
    case σταθερά1: 
    	εντολή1; 
    	break;
    case σταθερά2: 
    	εντολή2; 
    	break; 
    }
    
    Ακόμα η C υποστηρίζει τις παρακάτω εντολές ελέγχου:
    break;
    Τερματισμός της εκτέλεσης του εσώτερου while, do, ή for.
    continue;
    Επανεκτέλεση του εσώτερου while, do, ή for από την αρχή του βρόχου.
    Σε όλες τις περιπτώσεις μια εντολή μπορεί να αντικατασταθεί από περισσότερες με την χρήση των { }.

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

    Η C σε αντιστοιχία με την Pascal υποστηρίζει τις παρακάτω εντολές εισόδου εξόδου:
    Pascal C
    WRITE(IntValue) printf("%d", IntValue);
    WRITELN(IntValue) printf("%d\n", IntValue);
    WRITELN(RealValue) printf("%g\n", RealValue);
    WRITELN(StringValue) printf("%s\n", StringValue);
    WRITELN(Int1, Int2) printf("%d %d\n", Int1, Int2);
    READ(IntValue) scanf("%d ", &IntValue);
    Γενικά ο τρόπος χρήσης των εντολών είναι printf και scanf είναι ο εξής:

    Άσκηση

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

    Θέματα ύφους

    Εισαγωγή

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

    Προγραμματισμός στα τμήματα

    Προγραμματισμός στο σύνολο

    Έλεγχος και αποσφαλμάτωση

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

    Εξερεύνηση δυναμικών συστημάτων (1997)

    Ορισμοί

    Επαναληπτικές συναρτήσεις

    Η σύνθεση μιγαδικών συναρτήσεων της μορφής f(z) = z * z δημιουργεί δυναμικά συστήματα. Για παράδειγμα: Η συμπεριφορά της συνάρτησης σε επαναλαμβανόμενες συνθέσεις της εκφράζει τη δυναμική της. Τα σύνολα Mandelbrot και Julia μας δίδουν πληροφορίες για τη δυναμική συμπεριφορά συναρτήσεων της μορφής f(z) = z*z

    Τροχιές

    Το σύνολο Julia

    Το σύνολο Mandelbrot


    Τέλος, ορίζουμε ως σύνολο Mandelbrot το σύνολο των σημείων c για τα οποία το σύνολο Julia της συνάρτησης f(z) = z * z + c είναι "συνδεδεμένο".

    Παράσταση του συνόλου Mandelbrot

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

    Ασκήσεις

    Pascal 07

    1. Να γραφεί πρόγραμμα σε Pascal σύμφωνα με τις παρακάτω προδιαγραφές:
      • Το πρόγραμμα σχεδιάζει το σύνολο Mandelbrot και τις περιοχές προσέγγισης για κάποια καθορισμένη περιοχή του επιπέδου των μιγαδικών και μέγιστο αριθμό επαναλήψεων.
      • Αν το μέτρο της f(z) για το σημείο c αποκτήσει τιμή μεγαλύτερη του 2 μετά από ορισμένες επαναλήψεις τότε το σημείο ζωγραφίζεται με χρώμα ανάλογο του αριθμού των επαναλήψεων.
      • Αρχικές συνταταγμένες δοκιμής είναι -2 + -2i μέχρι 2 + 2i για 50 επαναλήψεις.
    2. Σχεδιάστε το σύνολο με κέντρο το 0.4445568792550437+0.4099331083009843i, ακτίνα 0.1 για 240 επαναλήψεις (προαιρετικά).
    3. Σχεδιάστε το σύνολο με κέντρο το -0.6356170288412094+0.4919204152038624i, ακτίνα 0.075 για 240 επαναλήψεις (προαιρετικά).
    4. Σχεδιάστε το σύνολο με κέντρο το -1.2963551381730362+0.4418516057351966i, ακτίνα 0.175 για 240 επαναλήψεις (προαιρετικά).
    5. Σχεδιάστε το σύνολο με κέντρο το -1.25+0i, ακτίνα 0.153 για 1920 επαναλήψεις (προαιρετικά).
    6. Σχεδιάστε το σύνολο με κέντρο το 1.309375+0i, ακτίνα 0.094 για 2480 επαναλήψεις (προαιρετικά).
    7. Εξερευνήστε το σύνολο σε άλλες περιοχές (προαιρετικά).
    Σημείωση: Όπου ο αριθμός των επαναλήψεων είναι μεγαλύτερος από τον αριθμό των χρωμάτων (GetMaxColor) ο αριθμός αυτός πρέπει να προσαρμόζεται κατάλληλα για να είναι νόμιμο χρώμα με τη χρήση των τελεστών mod ή div. Περισσότερες λεπτομέρειες για τις ασκήσεις

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

    Εργαστήριο αυτοαξιολόγησης 1997

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

    Τμήμα Μαθηματικών

    ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ PASCAL

    (Εργαστήριο αυτοαξιολόγησης)
    Διδάσκων: Διομήδης Σπινέλλης 15 Απριλίου 1997

    Θέμα 1ο:

    Να γραφεί πρόγραμμα σε Pascal το οποίο να ορίζει:

    Θέμα 2ο:

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

    program    test;
    var    x : integer;
    procedure    a(var y : integer);
    begin
        y := y + 4;
        x := x + 12 
    end;
    function    b(x : integer) : integer;
    begin
        b := x * 2;
        x := x div 2
    end;
    procedure    c;
    begin
        x := 8
    end;
    begin
        c; writeln(x);
        x := b(x); writeln(x);
        a(x); writeln(x)
    end.
    

    Θέμα 3ο:

    Να γραφεί πρόγραμμα το οποίο με τη ÷ρήση των δομών CASE, FOR και REPEAT θα διαβάζει ÷αρακτήρες από το ÷ρήστη και θα τυπώνει 10 φορές στην οθόνη την παράστασή τους σύμφωνα με τον κώδικα Morse (Α: .- Β: -... Γ: --. Δ: -.. Ε: .) μέ÷ρι ο ÷ρήστης να δώσει ως είσοδο το ÷αρακτήρα ×. (Το πρόγραμμα να υλοποιηθεί μόνο για τους παραπάνω ÷αρακτήρες).

    Θέμα 4ο:

    Να γραφεί πρόγραμμα το οποίο με τη ÷ρήση της διαδικασίας setpixel(x, y) να σ÷εδιάζει σε οθόνη με διαστάσεις 100*100 εικονοστοι÷εία μια περίοδο της συνάρτησης:

    f(x) = ημ x

    Διάρκεια εξέτασης 1.5 ώρα. Καλή επιτυ÷ία!

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

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

    Τμήμα Μαθηματικών
    ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ

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

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

    Ιουνίου 1997

    Θέμα 1ο:

    Να γραφεί πρόγραμμα σε Pascal το οποίο να ορίζει:

    Θέμα 2ο:

    Τι θα τυπώσει το παρακάτω πρόγραμμα αν στη γραμμή σημειωμένη με **** αντικαταστήσετε τις τιμές των χαρακτήρων που τίθενται στις μεταβλητές με τους τέσσερις πρώτους χαρακτήρες του επωνύμου σας; Για παράδειγμα αν σας λένε "Μαρία Αστέρη" οι γραμμή θα είναι:

      a := 'A'; b := 'S'; c := 'T'; d:= 'E';
    
     program test;
     var a, b, c, d : char;
     
     procedure p(var x : char; y : char);
     var c : char;
     begin
         x := '2';
         y := '3';
         c := '4';
         d := '5';
     end;
     begin
         a := 'S'; b := 'P'; c := 'I'; d:= 'N';  { **** }
         p(a, b);
         writeln(a, b, c, d)
     end.
    

    Θέμα 3ο:

    Να γραφεί πρόγραμμα σε Pascal το οποίο θα διαβάζει βαθμούς γραπτών από το χρήστη μέχρι αυτός να δώσει ως είσοδο τον αριθμό -1. Στη συνέχεια το πρόγραμμα θα τυπώνει στην οθόνη και θα γράφει και σε αρχείο κειμένου (TEXT) τον αριθμό των γραπτών που συγκέντρωσαν κάθε βαθμό (0-10), τον αντίστοιχο βαθμό, καθώς και το μέσο όρο όλων των βαθμών.

    Θέμα 4ο:

    Να γραφεί πρόγραμμα σε Pascal το οποίο με τη χρήση της διαδικασίας setpixel(x, y) να σχεδιάζει σε οθόνη με διαστάσεις 1000*1000 εικονοστοιχεία τις τιμές της συνάρτησης:

    f(x) = x2 + 5

    για το x να παίρνει τιμές από το -2 έως το 2. Η συνάρτηση f καθώς και οι συναρτήσεις μετασχηματισμού από συντεταγμένες κόσμου σε συντεταγμένες οθόνης ή/και αντίστροφα να οριστούν ως συναρτήσεις της Pascal. Θεωρήστε ότι το σύστημά σας δουλεύει μόνιμα σε ρυθμό γραφικών (δε χρειάζετε να καλέσετε άλλες διαδικασίες).
    Διάρκεια εξέτασης 2 ώρες Καλή επιτυχία!

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

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

    Τμήμα Μαθηματικών
    ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ

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

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

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

    Θέμα 1ο:

    Να γραφεί πρόγραμμα σε Pascal το οποίο να ορίζει (με τη χρήση εγγραφών):

    Θέμα 2ο:

    Τι θα τυπώσει το παρακάτω πρόγραμμα αν στη γραμμή σημειωμένη με **** αντικαταστήσετε τις τιμές των χαρακτήρων που τίθενται στις μεταβλητές με τους τέσσερις πρώτους χαρακτήρες του επωνύμου σας; Για παράδειγμα αν σας λένε "Γιώργο Ατσίδα" οι γραμμή θα είναι:

      a := 'A'; b := 'T'; c := 'S'; d:= 'I';
    
     program test;
     var a, b, c, d : char;
     
     procedure p(x : char;var y : char);
     var a, d : char;
     begin
         x := '2';
         y := '3';
         c := '4';
         d := '5';
     end;
     begin
         a := 'S'; b := 'P'; c := 'I'; d:= 'N';  { **** }
         p(a, b);
         writeln(a, b, c, d)
     end.
    
    

    Θέμα 3ο:

    Να γραφεί πρόγραμμα σε Pascal το οποίο θα διαβάζει ένα αρχείο χαρακτήρων ((FILE OF CHAR) και στη συνέχεια θα τυπώνει τον αριθμό των χαρακτήρων που διάβασε καθώς και τη συχνότητα εμφάνισης για κάθε έναν από τους χαρακτήρες.

    Θέμα 4ο:

    Να γραφεί πρόγραμμα σε Pascal το οποίο με τη χρήση της διαδικασίας setpixel(x, y) να σχεδιάζει σε οθόνη με διαστάσεις 200*100 εικονοστοιχεία τις τιμές της συνάρτησης:

    f(x) = x3 + x

    για το x να παίρνει τιμές από το 0 έως το 10. Η συνάρτηση f καθώς και οι συναρτήσεις μετασχηματισμού από συντεταγμένες κόσμου σε συντεταγμένες οθόνης ή/και αντίστροφα να οριστούν ως συναρτήσεις της Pascal. Θεωρήστε ότι το σύστημά σας δουλεύει μόνιμα σε ρυθμό γραφικών (δε χρειάζεται να καλέσετε άλλες διαδικασίες).
    Διάρκεια εξέτασης 2 ώρες Καλή επιτυχία!

    Εργαστήριο αυτοαξιολόγησης 1998

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

    Τμήμα Μαθηματικών

    ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΣΕ PASCAL

    (Εργαστήριο αυτοαξιολόγησης)
    Διδάσκων: Διομήδης Σπινέλλης 24 Μαρτίου 1998

    Θέμα 1ο:

    Να γραφεί πρόγραμμα σε Pascal το οποίο να διαβάζει από το χρήστη δύο ημερομηνίες (μέρα μήνα, μήνα, έτος) Η1, Η2 (Η1 < Η2, έτος > 1900) και να τυπώνει τον αριθμό ημερών ανάμεσα στις Η1 και Η2. Παρατηρήσεις:

    Θέμα 2ο:

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

    program    test;
    var    x : integer;
    procedure    a(var y : integer);
    begin
        y := y + 4;
        x := x + 12 
    end;
    function    b(x : integer) : integer;
    begin
        b := x * 2;
        x := x div 2
    end;
    procedure    c;
    begin
        x := 8
    end;
    begin
        c; writeln(x);
        x := b(x); writeln(x);
        a(x); writeln(x)
    end.
    

    Διάρκεια εξέτασης 1.5 ώρα. Καλή επιτυ÷ία!

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

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

    Τμήμα Μαθηματικών
    ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ

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

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

    Ιουνίου 1998

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

    Ένα πρόγραμμα Pascal περιέχει τους ορισμούς και τις δηλώσεις που ακολουθούν:

    const
    	pi = 3.1415;
    var
    	i, j : integer;
    	a, b : real;
    	p, q : boolean;
    	c, d : char;
    

    Για όσες από τις παρακάτω εντολές θεωρείτε εσφαλμένες τεκμηριώστε με μια φράση την άποψή σας:
    1. c := succ(d)
    2. d := d + 1
    3. i := ord(c) + ord(d)
    4. a := b / pi
    5. i := j / 2
    1. p := i = j
    2. q := q and (ord(c) = 'w')
    3. 'c' := d
    4. if q then writeln(a,b)
    5. while i + 1 do writeln(i)

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

    Tι θα τυπώσει το παρακάτω πρόγραμμα αν στη γραμμή σημειωμένη με **** αντικαταστήσετε τις τιμές των χαρακτήρων που τίθενται στις μεταβλητές με τους πέντε πρώτους χαρακτήρες του επωνύμου σας; Για παράδειγμα αν σας λένε "Μαρία Ατσίδα" οι γραμμή θα είναι:

     a := 'A'; b := 'T'; c := 'S'; d:= 'I'; e:= 'D';
    

    Τεκμηριώστε περιληπτικά την απάντησή σας.

     program test;
     var a, b, c, d, e, f : char;
     function p(d : char; var y : char): char;
     var b : char;
     begin
         c := '2';     b := '3';
         d := '4';     y := '5';
         p := d;
     end;
     begin
         a:='S'; b:='P'; c:='I'; d:='N'; e:='E'; {****}
         writeln(a, b, c, d, e);
         f := p(a, e);
         writeln(a, b, c, d, e, f)
     end.
    

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

    Τα στοιχεία των ποδοσφαιριστών μιας ομάδας του MUNDIAL 98 φυλάσσονται σε αρχείο χαρακτήρων (FILE OF CHAR) με την παρακάτω γραμμογράφηση:

    όνομα, ύψος, ηλικία, επιτυχημένα τέρματα.

    Παράδειγμα:

    Ronaldo 1.82 21 77

    Να γραφεί πρόγραμμα σε Pascal το οποίο διαβάζει από το αρχείο τα στοιχεία 22 ποδοσφαιριστών και θα τα φυλάει σε πίνακα εγγραφών. Στη συνέχεια τυπώνει: α) για κάθε ποδοσφαιριστή τα πλήρη στοιχεία του καθώς και τόσα θαυμαστικά (!) όσα και τα επιτυχημένα του τέρματα, β) τα ονόματα και την ηλικία των ποδοσφαιριστών με ηλικία μεγαλύτερη των 30 ετών και γ) το συνολικό αριθμό και το μέσο όρο των επιτυχημένων τερμάτων της ομάδας. Τα θαυμαστικά που αντιστοιχούν στα τέρματα να τυπώνονται από ξεχωριστή διαδικασία.

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

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

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

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

    Τμήμα Μαθηματικών

    ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ

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

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

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

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

    Γράψτε ένα πρόγραμμα σε Pascal το οποίο να ζωγραφίζει σε οθόνη με διαστάσεις 100 * 100 εικονοστοιχεία έναν κύκλο. Για την εμφάνιση ενός εικονοστοιχείου αρκεί η κλήση της συνάρτησης setpixel(x, y).

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

    Γράψτε ένα πρόγραμμα σε Pascal το οποίο διαβάζει από το χρήστη 100 ονόματα και αντίστοιχους βαθμούς (0-10) και στη συνέχεια τυπώνει τα ονόματα με τους βαθμούς αυξημένους ή μειωμένους κατά 1 ανάλογα με το αν ο μέσος όρος των αρχικών βαθμών ήταν αντίστοιχα μικρότερος ή μεγαλύτερος του 5. Οι βαθμοί 0 και 10 να παραμένουν ίδιοι μετά από αντίστοιχη μείωση ή αύξηση (δηλαδή σε καμία περίπτωση να μην τυπώνεται -1 ή 11).

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

    Tι θα τυπώσει το παρακάτω πρόγραμμα αν του δοθούν ως είσοδος οι αριθμοί από το 1Ψ5; Εξηγήστε.

    
    program TestFold;
    
    const
            maxindex = 5;
    
    type
            realmap = function(x : real; y : real) : real;
            mylist = array [1..maxindex] of real;
    
    var
            i : integer;
            l : mylist;
    
    function fold(f : realmap; a : real; v : mylist) : real;
    var
            i : integer;
            result : real;
    begin
            result := a;
            for i := 1 to maxindex do
                    result := f(v[i], result);
            fold := result;
    end;
    
    function prod(x : real; y : real) : real;
    begin
            prod := x * y
    end;
    
    begin
            for i := 1 to maxindex do
                    readln(l[i]);
            writeln(fold(prod, 1, l))
    end.
    
    

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

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