ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΑΛΓΟΡΙΘΜΟΥΣ ΚΑΙ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΠΟΛΙΤΙΣΜΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑΣ Διδάσκουσα Δρ Β. Καβακλή Χειμερινό Εξάμηνο 2001 1 Program cinema (input, output); const N = 10; Παράδειγμα χρήσης πινάκων var tickets: array[1..n] of integer; films: array[1..n] of string[50]; i, sum: integer; average : real; Τυπώνει τα ονόματα sum:=0; των ταινιών που for i:=1 to N do έκοψαν περισσότερα εισιτήρια από τον write(output, Onoma tainias: ); μέσο όρο readln(films[i]); write(output, Arith. Eishthrivn: ); readln(input, tickets[i]); sum := sum + tickets[i]; average := sum / N; writeln(output, Oi parakatv tainies ekoyan eisιthria > meso oro: ); for i:=1 to N do if tickets[i] >= average then writeln(output, films[i]); end. 2 1
Πίνακες ως παράμετροι υποπρογραμμάτων! Ένα στοιχείο ενός πίνακα μπορεί να περαστεί ως πραγματική παράμετρος ενός υποπρογράμματος " π.χ. var pin: array[1..10] of integer; tetragvno: integer; στο κυρίως πρόγραμμα μπορώ να έχω: tetragvno:= sqr(pin[1]);! Ολόκληρος ο πίνακας μπορεί να περαστεί σαν πραγματική παράμετρος υποπρογράμματος " Στην περίπτωση αυτή ο τύπος του πίνακα θα πρέπει να έχει ήδη ορισθεί σε ένα εξωτερικό block που περικλείει το υποπρόγραμμα 3 Program sygkrish_pinakvn (input, output); const N = 10; Παράδειγμα type pinakas = array[1..n] of integer; var pin_1, pin_2: pinakas; i : integer; function athroisma(pin: pinakas): integer; var j, sum: integer; sum:=0; for j:=1 to N do sum:=sum + pin[j]; athroisma := sum; Διαβάζει 2 πίνακες 10 ακεραίων και συγκρίνει τα αθροίσματα των στοιχείων τους writeln(output, Diabase ta stoixeia toy 1oy pinaka ); for i:=1 to N do readln(input, pin_1[i]); writeln(output, Diabase ta stoixeia toy 2oy pinaka ); for i:=1 to N do readln(input, pin_2[i]); if athroisma(pin_1) >= athroisma(pin_2) then writeln(output, 1os Pinakas ) else writeln(output, 2os Pinakas ); end. 4 2
Πίνακες 2 διαστάσεων s 11 s 12... s 180 s 21 s 22... s 280 s 31 s 32... s 380! Μια οθόνη που αποτελείται από 3 γραμμές και 80 θέσεις χαρακτήρων ανά γραμμή, μπορεί να δηλωθεί ως ένας διδιάστατος πίνακας: " var screen: array [1..3, 1..80] of char;! Ο χαρακτήρας j της γραμμής i μπορεί να προσπελαστεί από ένα αναγνωριστικό με δύο υποδείκτες " screen[i][j]; ή screen[i, j];! Το αναγνωριστικό " screen[i]! παριστάνει ένα στοιχείο τύπου array[1..80] of char, δηλ. τη γραμμή i της οθόνης! Η παρακάτω εντολή εκχωρεί τον χαρακτήρα c σε όλες τις 240 θέσεις του πίνακα for i:=1 to 3 do for j:= 1 to 80 do screen[i, j] := c ; 5 Πολυδιάστατοι πίνακες! Οι πολυδιάστατοι πίνακες διευκολύνουν στην σύλληψη και λύση ενός προβλήματος! Μια κλασική εφαρμογή πινάκων είναι η απογραφή υλικού (εμπορευμάτων, επίπλων, κ.τ.λ.) " Παράδειγμα: μια αποθήκη περιέχει 10 τύπους εμπορευμάτων και από κάθε εμπόρευμα περιέχει ορισμένο απόθεμα (αρ. μονάδων). " Στην περίπτωση αυτή μπορούμε να δηλώσουμε: # var stock: array[1..10] of integer; " Η εκχώρηση: # stock[3] := 10; σημαίνει ότι η αποθήκη περιέχει 10 κομμάτια από το είδος 3 " Όταν πουληθεί κάποιο εμπόρευμα, ενημερώνουμε την τιμή του αντίστοιχου αποθέματος # stock[3] := stock[3] 1; 6 3
Παράδειγμα: Αντιπροσωπεία αυτοκινήτων! Έστω ότι μηχανογραφούμε τον έλεγχο αποθεμάτων των αυτοκινήτων ενός εξουσιοδοτημένου αντιπροσώπου αυτοκινήτων της HONDA! Για ευκολότερη κατανόηση του προβλήματος μπορούμε να ορίσουμε: " type model = (JAZZ, CIVIC, SHUTTLE, ACCORD, PRELUDE); " var stock: array[jazz..prelude] of integer;! Η παραπάνω βελτίωση μας επιτρέπει να ονομάζουμε τα διάφορα προϊόντα! Η εκχώρηση " stock[jazz] := 3 ;! Σημαίνει ότι έχουμε 3 αυτοκίνητα μοντέλου JAZZ στην αποθήκη! Η εντολή " writeln(output, stock[civic]);! Εμφανίζει τον αριθμό των αυτοκινήτων μοντέλου CIVIC που υπάρχουν στην αποθήκη JAZZ CIVIC SHUTTLE ACCORD PRELUDE stock 3 5 1 2 0 7 Αντιπροσωπεία αυτοκινήτων (συνέχεια...)! Για να προσομοιώσουμε ορθά την πραγματικότητα θα πρέπει να λάβουμε υπόψη ότι τα αυτοκίνητα έχουν διάφορες χωρητικότητες κινητήρων.! Έτσι πρέπει να προσθέσουμε μια δεύτερη διάσταση στον πίνακά μας: type model = (JAZZ, CIVIC, SHUTTE, ACCORD, PRELUDE); cc = (xilia, xilia_diakosia, xilia_pentakosia, xilia_exakosia, dyo_xiliades, dyo_pentakosia); var stock : array[jazz..prelude, xilia.. dyo_pentakosia] of integer; JAZZ CIVIC SHUTTLE ACCORD PRELUDE H νέα δομή δεδομένων (δισδιάστατος πίνακας) έχει μια θέση για κάθε μοντέλο με 6 διαφορετικές χωρητικότητες κινητήρα. Μπορεί να αποθηκεύσει 30 τύπους αυτοκινήτων 1000 1200 1500 1600 2000 2500 8 4
Αντιπροσωπεία αυτοκινήτων (συνέχεια...)! Το επόμενο βήμα είναι να λάβουμε υπ όψη ότι τα αυτοκίνητα έχουν διάφορα τυποποιημένα χρώματα, προσθέτοντας άλλη μια διάσταση στον πίνακα, ως εξής: type model = (JAZZ, CIVIC, SHUTTE, ACCORD, PRELUDE); cc = (xilia, xilia_diakosia, xilia_pentakosia, xilia_exakosia, dyo_xiliades, dyo_pentakosia); color = (aspro, metaliko_mpez, metaliko_ashmi, mavro); apothiki = array[jazz..prelude, xilia.. dyo_pentakosia, aspro..mavro] of integer; var stock: apothiki;! Προσθέτοντας επιπλέον διαστάσεις στον πίνακα Stock μπορούμε να αποθηκεύουμε πληροφορίες για τα αυτοκίνητα με τον τρόπο που εμείς τα αντιλαμβανόμαστε! Για να βρούμε το απόθεμα των αυτοκινήτων SHUTTLE, με 1500 cc, χρώματος μεταλλικού μπεζ, αρκεί η εντολή: " writeln(stock[shuttle, xilia_pentakosia, metaliko_mpez]); 9 Αντιπροσωπεία αυτοκινήτων (συνέχεια...)! Η παρακάτω συνάρτηση μετράει το πλήθος των αυτοκινήτων που έχουν ορισμένο χρώμα: function orismena (xrvma: color; apothema: apothiki): integer; var car: model; xvrhtikothta: cc; plithos: integer; plithos := 0; for car := JAZZ to PRELUDE do for xvrhtikothta := xilia to dyo_pentakosia do plithos := plithos + apothema[car, xvrhtikothta, xrvma]; orismena := plithos;! Στο κυρίως πρόγραμμα μπορούμε να καλέσουμε την παραπάνω συνάρτηση για να βρούμε πόσα άσπρα αυτοκίνητα υπάρχουν στο stock ως εξής: aspra_aytokinhta := orismena(aspro, stock); όπου aspra_aytokinhta μετaβλητή τύπου integer 10 5
Εγγραφές! Ένας πίνακας αποτελείται από ομοειδή στοιχεία, δηλ. στοιχεία που έχουν όλα τον ίδιο τύπο! Πολύ συχνά ένα αντικείμενο μπορεί να αποτελείται από στοιχεία διαφορετικού τύπου " τα στοιχεία ενός τηλεφωνικού καταλόγου " τα εμπορεύματα μιας αποθήκης! Παράδειγμα: " Για την αναπαράσταση μιας ημερομηνίας θα μπορούσαμε να δηλώσουμε 3 μεταβλητές: # mera : 1..31; # mhnas: 1..12; # etos: 1900..2900 " Για την αναπαράσταση των προσωπικών στοιχείων: # onoma: string[30]; # fylo: (andras, gynaika); # oikogeneiakh_katastash: (agamos, eggamos, diazeygmenos);! Για την αναπαράσταση τέτοιων αντικειμένων χρησιμοποιούμε τον τύπο record (εγγραφή) 11 Δήλωση Εγγραφών! Ο τύπος εγγραφής (record) είναι μια συλλογή από συστατικά διαφόρων τύπων που το καθένα δηλώνεται με ένα όνομα " Τα συστατικά μιας εγγραφής ονομάζονται πεδία (fields) " Το κάθε πεδίο έχει το δικό του όνομα και ανήκει σε ένα τύπο δεδομένων " Ένα πεδίο μπορεί να είναι και μια άλλη εγγραφή! Η δήλωση της εγγραφής γίνεται στην περιοχή των δηλώσεων νέων τύπων ως εξής: type hmeromhnia = record mera: 1..31; mhnas: 1..12; etos: 1900.. 2900; var shmera, avrio: hmeromhnia; 12 6
Προσπέλαση στα πεδία εγγραφής! Η αναφορά σε πεδίο μιας εγγραφής γίνεται με το όνομα της μεταβλητής τύπου record που ακολουθείται από μια τελεία και το όνομα του πεδίου όπως εμφανίζεται στη δήλωση της εγγραφής: " Παραδείγματα: shmera.mera := 4; shmera.mhnas := 12; shmera.etos := 2001;! Με τη χρήση του with " Παράδειγμα: with shmera do mera := 4; mhnas:= 12; etos := 2001; 13 Program student_record (input, output); type prvtoeths_foithths = record am: integer; eponymo: string[20]; onoma: string[20]; polymesa: integer; istoria_politismoy: integer; mme: integer; var foithths: prvtoeths_foithths; mesos_oros: real; write( AM: ); readln(foithths.am); write( EPONYMO: ); readln(foithths.eponymo); write( ONOMA: ); readln(foithths.onoma); write( POLYMESA: ); readln(foithths.polymesa); write( ISTORIA POLITISMOY: ); readln(foithths.istoria_politismoy); write( MME: ); readln(foithths.mme); Παράδειγμα: Διαβάζει τα στοιχεία ενός φοιτητή και τυπώνει το μέσο όρο βαθμολογίας του mesos_oros := (foithths.polymesa + foithths.istoria_politismoy + foithths.mme) / 3; write( O MESOS OROS BATHMOLOGIAS TOY FOITHTH:, foithths.eponymo,, foithths.onoma, EINAI: ); writeln( mesos_oros:5:2); end. 14 7
Ιεραρχική εγγραφή! Εγγραφές με πεδία άλλες εγγραφές ονομάζονται ιεραρχικές εγγραφές! Δήλωση: type mathimata_a_etoys = record polymesa: integer; istoria_politismoy: integer; mme: integer; prvtoeths_ foithths = record am: integer; eponymo: string[20]; onoma: string[20]; bathmoi: mathimata_a_etoys; prvtoeths_ foithths am eponymo onoma mathimata_a_etoys polymesa istoria_politismoy mme var foithths: prvtoeths_foithths;! Προσπέλαση: " foithths.bathmoi.polymesa := 8; " foithths.bathmoi.istoria_politismoy := 10; " foithths.bathmoi.mme := 9; 15 Παράδειγμα: Κατάλογος Φοιτητών! Για να ορίσουμε έναν κατάλογο 150 θέσεων ο οποίος θα περιέχει αριθμό μητρώου, επώνυμο, όνομα και διεύθυνση φοιτητών θα πρέπει να δηλωθούν τα παρακάτω: type foithths = record am: integer; eponymo: string[20]; onoma: string[20]; diefthinsi: string[60]; var foithtes_tpte: array [1..150] of foithths;! Για να γίνει η εμφάνιση στην οθόνη των στοιχείων του 10ου φοιτητή θα πρέπει να γραφτούν οι εντολές: writeln(foithtes_tpte[10].am); writeln(foithtes_tpte[10].eponymo); writeln(foithtes_tpte[10].onoma); writeln(foithtes_tpte[10].dieythinsi); with foithtes_tpte[10] do writeln(am); writeln(eponymo); writeln(onoma); writeln(diefthinsi); 16 8