Αλγόριθμοι, δεδομένα και διαδικασίες
Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr
Προηγούμενα θέματα για σκέψη
-  Συζητήστε πως παρέχονται και υλοποιούνται τα παρακάτω στοιχεία
στα λειτουργικά συστήματα MS-DOS, Unix, και Windows 95:
-  Χρονοπρογραμματισμός
 -  Επικοινωνία μεταξύ διεργασιών
 -  Είσοδος / έξοδος με σταθμοσκόπηση
 -  Είσοδος / έξοδος με διακοπές
 -  Είσοδος / έξοδος ανεξάρτητα από τη συσκευή
 -  Προστασία μεταξύ διεργασιών
 -  Διαχείριση μνήμης με ανταλλαγή
 -  Διαχείριση μνήμης με σελιδοποίηση
 -  Αρχεία
 -  Κατάλογοι και ιεραρχική δομή
 -  Διαχείριση χώρου στα αποθηκευτικά μέσα
 -  Ασφάλεια
 
 
Ορισμός
Αλγόριθμος (algorithm) είναι μια
διαδικασία που επεξεργαζόμενη ορισμένα στοιχεία με
πεπερασμένο αριθμό βημάτων παράγει ένα
συγκεκριμένο επιθυμητό αποτέλεσμα.
Κάθε βήμα της διαδικασίας αποτελείται από μονοσήμαντα εκτελέσιμες πράξεις.
Εύρεση ν!
Παραγοντικό του Ν στο Χ
Πριν: Ν: φυσικός αριθμός 
Μετά: Χ = Ν!
Είσοδος:
   Ν : Φυσικός αριθμός
Εξοδος:
   Χ : Φυσικός αριθμός
Κ : Φυσικός αριθμός
Χ <- 1
Κ <- Ν
Οσο Κ > 0
    Χ <- Χ * Κ
    Κ <- Κ - 1
Τέλος (όσο)
Ψευδοκώδικας
Ο ψευδοκώδικας (pseudocode) επιτρέπει την
περιγραφή των αλγορίθμων.
- Στοιχεία εισόδου, εξόδου και μεταβλητές
 - 
Είσοδος:
πλευρά_α, πλευρά_β, πλευρά_γ : Φυσικός αριθμός
Εξοδος:
εμβαδό : Φυσικός αριθμός
αριθμός_πλακών : Φυσικός αριθμός
συνολικό_βάρος : Πραγματικός αριθμός
είναι_ισοσκελές : Λογική τιμή
 - Προϋποθέσεις και μετά-συνθήκες
 - 
Πριν: Ν Φυσικός αριθμός
Μετά: Χ = Ν!
 - Εκχωρήσεις
 - 
ύψος <- συν(κλίση) * πλευρά
μέσο <- ύψος / 2
 -  Βρόχοι 
 - 
Οσο υπόλοιπο_χρημάτων > 0
   δώσε_χαρτονόμισμα
Τέλος (όσο)
Επανάλαβε
  μείωσε_αέρα
Οσο στροφές_κινητήρα < 900
Για πάντα
  έλεγξε_παραμέτρους_λειτουργίας_εργοστασίου
Τέλος (για πάντα)
 - Αποφάσεις
 - 
Αν ζωές_παίκτη > 0 Τότε
  ξεκίνα_νέο_παιγνίδι
Αλλιώς
  εμφάνισε "Game Over"
Τέλος (Αν)
Αν στροφές > 8700 Τότε
  διάκοψε_την_τροφοδοσία
Τέλος (Αν)
Αν ομάδα ΠΑΟ Τότε
  χρώμα <- πράσινο
Αλλιώς Αν ομάδα Ολυμπιακός Τότε
  χρώμα <- κόκκινο
Αλλιώς Αν ομάδα ΑΕΚ Τότε
  χρώμα <- κίτρινο
Τέλος (Αν)
 
Γλώσσες προγραμματισμού
-  Επιβάλλουν την έκφραση ενός αλγορίθμου με τυπική μορφή.
 -  Χρησιμοποιούνται άμεσα ή έμμεσα από τον υπολογιστή.
 -  Διαφορετικές γλώσσες διαθέτουν διαφορετικά επίπεδα και μέσα έκφρασης.
 
Γλώσσα μηχανής
89 D9 
B8 01 00 
83 F9 00 
74 05 
F7 E1 
49 
EB F6
Συμβολική γλώσσα
; Παραγοντικό του BX στο AX
	MOV  CX, BX
        MOV  AX, 1
LOOP:	CMP  CX, 0
	JZ   DONE
	MUL  CX
        DEC  CX
        JMP  LOOP
DONE:
C
/* Παραγοντικό */
int
factorial(int n)
{
	int result;
	int count;
	count = n;
	result = 1;
	while (count > 0) {
		result = result * count;
		count = count - 1;
	}
	return (result);
}
int
factorial(int n)
{
	int result = 1;
	for (; n; n--)
		result *= n;
	return (result);
}
Prolog
factorial(0, 1).
factorial(N, N_Factorial) :-
	N > 0,
	M is N - 1,
	factorial(M, M_Factorial),
	N_Factorial is M_Factorial * N.
Lisp
(define (factorial n)
  (if (= n 1)
    1
    (* n (factorial (- n 1)))))
Visual Basic
' Παραγοντικό του Ν
FUNCTION Factorial(N AS INTEGER) AS INTEGER
	DIM Count AS INTEGER
	DIM Result AS INTEGER
	Count = N
	Result = 1
	WHILE Count > 0
		Result = Result * Count
		Count = Count - 1
	WEND
END FUNCTION
Pascal
(* Παραγοντικό του Ν *)
function factorial(N : Integer) : Integer;
var
  Count, Result : Integer;
begin
     Count := N;
     Result := 1;
     While Count > 0 Do
     begin
           Result := Result * Count;
           Count := Count - 1
     end;
     Factorial := Result
end (* Factorial *);
Java
public int παραγοντικό(int ν) {
	int αποτέλεσμα;
	int μετρητής;
	μετρητής = ν;
	αποτέλεσμα = 1;
	while (μετρητής > 0) {
		αποτέλεσμα = αποτέλεσμα * μετρητής;
		μετρητής = μετρητής - 1;
	}
	return (αποτέλεσμα);
}
Πίνακες
-  Οι πίνακες (arrays) επιτρέπουν τη χρήση πολλών ομοίου τύπου στοιχείων.
 -  Συνήθως το στοιχείο i ενός πίνακα A προσδιορίζεται ως A[i] ή A(i).
 -  Μπορούν να οριστούν και πίνακες πολλαπλών διαστάσεων με στοιχεία
αντίστοιχα προσδιορισμένα ως A[i,j] κ.λπ.
 -  Συνήθως υλοποιούνται με τη διαδοχική φύλαξη των στοιχείων τους στη
μνήμη.
 
Παράδειγμα
(* Άθροισμα στοιχείων του πίνακα n στοιχείων a *)
var
   a : array [1..10] of integer;
   n, i, sum : integer;
begin
     sum := 0;
     for i := 1 to 10 do
     begin
          sum := sum + a[i];
     end;
end.
Εγγραφές
-  Οι εγγραφές (records) επιτρέπουν τον ομαδικό χειρισμό
διαφορετικού τύπου στοιχείων.
 -  Συνήθως το στοιχείο i μιας εγγραφής A προσδιορίζεται ως A.i
 -  Μπορούν να οριστούν και πίνακες που περιέχουν εγγραφές ή εγγραφές
που περιέχουν πίνακες.
 -  Συνήθως υλοποιούνται με τη διαδοχική φύλαξη των στοιχείων τους στη
μνήμη.
 
Παράδειγμα
var point :
  record
     x : integer;			(* Συντεταγμένη x *)
     y : integer;			(* Συντεταγμένη y *)
  end;
var customer :
  record
    name : array [1..50] of char;	(* Όνομα πελάτη *)
    balance : integer;			(* Υπόλοιπο λογαριασμού *)
  end;
begin
     point.x := 1;
     point.y := 4;
end.
Δομές με δείκτη
-  Οι δείκτες (pointers) επιτρέπουν τον εύκολο
ορισμό και χειρισμό σύνθετων δομών.
Τέτοιες δομές μπορεί να είναι 
 -  Συνήθως τα περιεχόμενα ενός δείκτη p εκφράζονται ως *p (C) ή p^ (Pascal).
 -  Οι δείκτες υλοποιούνται ως έμμεσες διευθύνσεις μνήμης.
 
Παράδειγμα
type
  link = ^integer_list;
  integer_list =
    record
      value : integer;
      next  : link;
    end;
Διαδικασίες, συναρτήσεις και τάξεις
-  Οι διαδικασίες (procedures) επιτρέπουν την
οργάνωση των εντολών ενός προγράμματος που εκτελούν μια
συγκεκριμένη λειτουργία σε μια ενότητα.
 -  Οι συναρτήσεις (functions) επιτρέπουν την
οργάνωση των εντολών ενός προγράμματος που υπολογίζουν ένα συγκεκριμένο
αποτέλεσμα σε μια ενότητα.
 -  Οι τάξεις (classes) επιτρέπουν την
οργάνωση των στοιχείων και των εντολών που σχετίζονται με ένα
αντικείμενο σε μια ενότητα.
 
Παράδειγμα συνάρτησης και διαδικασίας σε Pascal
program fun;
(* Παραγοντικό του Ν *)
function factorial(N : Integer) : Integer;
var
  Count, Result : Integer;
begin
     Count := N;
     Result := 1;
     While Count > 0 Do
     begin
           Result := Result * Count;
           Count := Count - 1
     end;
     Factorial := Result
end (* Factorial *);
procedure clear_screen;
const number_of_lines = 24;
var i : integer;
begin
  for i := 0 to number_of_lines do
      writeln('');
end (*clear_screen*);
begin
  clear_screen;
  writeln(factorial(5));
end.
Παράδειγμα τάξης σε Java
class Point extends Object {
   private int x;
   private int y;
   public void MoveTo(int x, int y) {
     this.x = x;
     this.y = y;
  }
  public int GetX() {
    return (x);
  }
}
Αναδρομικές τεχνικές
-  Διαδικασίες, συναρτήσεις και δομές που ορίζονται 
αναδρομικά (recursively)
μπορούν εύκολα να ανιμετωπιστούν με τη χρήση αναδρομικών τεχνικών
προγραμματισμού.
 
Παράδειγμα
program recursive;
(* Αναδρομικός ορισμός δεδομένων *)
type
  link = ^integer_list;
  integer_list =
    record
      value : integer;
      next  : link;
    end;
(* Αναδρομική διαδικασία *)
procedure russian_doll(size : integer);
var i : integer;
begin
   write('[');
   for i := 1 to size do
      write('-');
   writeln(']');
   if size > 1 then
     russian_doll(size - 1);
end (* russina_doll *) ;
(* Αναδρομική συνάρτηση *)
function factorial(n : integer) : integer;
begin
     if n = 0 then
        factorial := 1
     else
         factorial := n * factorial(n - 1)
end (* factorial *);
begin
  writeln(factorial(5));
  russian_doll(10);
end.
Αποτελέσματα
120
[----------]
[---------]
[--------]
[-------]
[------]
[-----]
[----]
[---]
[--]
[-]
Βιβλιογραφία
- Peter Rechenberg.
Εισαγωγή στην Πληροφορική. σ. 112-133
Κλειδάριθμος, 1992.
 
Ασκήσεις
-  Εκφράστε με ψευδοκώδικα τη διαδικασία μιας πρόσφατης συναλλαγής σας
με το Δημόσιο.
 -  Εκφράστε με ψευδοκώδικα τον τρόπο με τον οποίο δίνονται ρέστα
στα καταστήματα.
 -  Βελτιώστε τον κώδικα φυλάσσοντας σε πίνακες τις αξίες και
ποσότητες των νομισμάτων που υπάρχουν στο ταμείο.
 -  Εκφράστε με ψευδοκώδικα τη διαδικασία πολλαπλασιασμού δύο
αριθμών Μ, Ν σε λογ2(MAX(N,M)) βρόχους.
Μπορείτε να χρησιμοποιήσετε πρόσθεση, σύζευξη και ολίσθηση.