Αλγόριθμοι, δεδομένα και διαδικασίες

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

Προηγούμενα θέματα για σκέψη

Ορισμός

Αλγόριθμος (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 (αποτέλεσμα);
}

Πίνακες

Παράδειγμα

(* Άθροισμα στοιχείων του πίνακα 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.

Εγγραφές

Παράδειγμα

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.

Δομές με δείκτη

Παράδειγμα

type
  link = ^integer_list;

  integer_list =
    record
      value : integer;
      next  : link;
    end;

Διαδικασίες, συναρτήσεις και τάξεις

Παράδειγμα συνάρτησης και διαδικασίας σε 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);
  }
}

Αναδρομικές τεχνικές

Παράδειγμα

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
[----------]
[---------]
[--------]
[-------]
[------]
[-----]
[----]
[---]
[--]
[-]

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

Ασκήσεις