ενισχυτική διδασκαλία Ενότητα 3: «Εισαγωγή στην Αλγοριθμική και στον Προγραμματισμό: loops, subroutines, tables» Χ. Σκουρλάς cskourlas@teiath.gr 2015-16
Επαναλήψεις - Loops, Διαδικασίες - procedures, Συναρτήσεις - functions, Αναδρομή - recursion, Πίνακες - tables Στην ενότητα αυτή θα επαναλάβουμε τις εντολές επανάληψης (loops). Θα μελετήσουμε τα υποπρογράμματα: διαδικασίες, συναρτήσεις Θα δούμε παραδείγματα αναδρομής. Θα μελετήσουμε πίνακες. Χ. Σκουρλάς
Παραδείγματα χρήσης εντολών επανάληψης for, while, repeat
Υπολογίστε το άθροισμα 1+2+3+...+10 χρησιμοποιώντας εντολή for. program upologismos_athroismatos(input, output); var i, N, athroisma: integer; begin N:=10; athroisma:=0; i:=1; for i:= 1 to N do athroisma:= athroisma+i; writeln('athroisma=1+2+3+4+5+ 6+7+8+9+10=', athroisma); readln; end.
Υπολογίστε το άθροισμα 1+2+3+...+10 χρησιμοποιώντας εντολή while. program upologismos_athroismatos(input, output); var i, N, athroisma: integer; begin N:= 10; athroisma:=0; i:=1; while i<=N do athroisma:= athroisma +i; i:= i+1; end; writeln('athroisma=1+2+3+4+5+6+7+ 8+9+10=', athroisma); readln; end.
Υπολογίστε το άθροισμα 1+2+3+...+10 χρησιμοποιώντας εντολή repeat. program upologismos_athroismatos(input, output); var i, N, athroisma: integer; begin N:=10; athroisma:=0; i:=1; repeat athroisma:= athroisma+i; i:= i+1 until i>N; writeln('athroisma=1+2+3+4+5+ 6+7+8+9+10=', athroisma); readln; end.
Αποτελέσματα εκτέλεσης του προγράμματος Τo πρόγραμμα διαβάζει τον αριθμό Ν, χρησιμοποιεί εντολή repeat και υπολογίζει το άθροισμα 1+2+3+...+Ν. program upologismos_athroismatos(input, output); var i, N, athroisma: integer; begin writeln('dwse plhthos diadoxikwn akeraiwn pou tha prostheseis'); readln(N); if (N<1) or (N>10) then writeln('dwse swsta to plhthos') else athroisma:=0; i:=1; repeat athroisma:= athroisma+i; i:= i+1; until i>N; writeln('athroisma =', athroisma); end; readln; End. Αποτελέσματα εκτέλεσης του προγράμματος dwse plhthos diadoxikwn akeraiwn pou tha prostheseis 5 15 (επειδή 1+2+3+4+5=15)
Ακολουθούν παραδείγματα προγραμμάτων που χρησιμοποιούν while, repeat. program upologismos_athroismatos(input, output); var arithmos, athroisma: integer; begin writeln('to programma tha diavazei kai tha prosthetei arithmous'); writeln('dwse arithmo <10 kai >0'); writeln('gia na stamathsei dwse arithmo pou den anhkei sto diasthma [1, 10)'); readln(arithmos); while (arithmos>=1) and (arithmos<10) do athroisma := athroisma+arithmos; writeln('dwse arithmo < 10 kai > 1'); readln(arithmos) end; writeln('athroisma =', athroisma); readln; end. Το πρόγραμμα διαβάζει και προσθέτει αριθμούς μεγαλύτερους από 0 και μικρότερους από 10. Για να σταματήσει το πρόγραμμα πληκτρολογείς είτε αριθμό αρνητικό ή 0 ή αριθμό μεγαλύτερο του 9.
program upologismos_athroismatos(input, output); var arithmos, athroisma: integer; begin writeln('to programma tha diavazei kai tha prosthetei arithmous'); repeat writeln('dwse arithmo < 10 kai > 1'); athroisma := athroisma+arithmos; readln(arithmos); writeln('arithmos=', arithmos); until(arithmos<1)or(arithmos>=10); writeln('athroisma =', athroisma); readln; end. Το πρόγραμμα διαβάζει και προσθέτει αριθμούς μεγαλύτερους από 0 και μικρότερους από 10. Για να σταματήσει το πρόγραμμα πληκτρολογείς είτε αριθμό αρνητικό ή 0 ή αριθμό μεγαλύτερο του 9.
Διαφορά for, while, repeat for i:= 1 to 5 do begin εντολές end;
program diavazw_zeugh(input, output); var i, arithmos1, arithmos2: integer; begin for i:= 1 to 5 do writeln('Dwse 2 akeraious aritmous.'); readln(arithmos1, arithmos2); writeln('oi arithmoi pou edwses einai: ', arithmos1,' , ', arithmos2); end; readln end.
Αλλιώς χρησιμοποίησε while ή repeat. Τότε θα χρειαστείς μία συνθήκη πχ το πρόγραμμα θα σταματάει αν δώσουμε αριθμό 0 μέσα στο ζεύγος. Να πως διαμορφώνονται οι εντολές while, repeat: while (arithmos1 > 0) and (arithmos2 > 0) do begin εντολές end; repeat until (arithmos1 = 0) or (arithmos2 = 0); Ακολουθούν τα δύο προγράμματα. Παρατήρησε ότι πριν από το while χρειάζεται να διαβάσεις το πρώτο ζευγάρι αριθμών ενώ στο repeat δε χρειάζεται!
program diavazw_zeugh(input, output); var arithmos1, arithmos2: integer; begin writeln('Dwse 2 akeraious aritmous.'); writeln('An kapoios einai mhden to programma tha stamathsei'); readln(arithmos1, arithmos2); while (arithmos1 > 0) and (arithmos2 > 0) do writeln('oi arithmoi pou edwses einai: ', arithmos1,' , ', arithmos2); end; readln end.
program diavazw_zeugh(input, output); var arithmos1, arithmos2: integer; begin repeat writeln('Dwse 2 akeraious aritmous.'); writeln('An kapoios einai mhden to programma tha stamathsei'); readln(arithmos1, arithmos2); writeln('oi arithmoi pou edwses einai: ', arithmos1,' , ', arithmos2) until (arithmos1 = 0) or (arithmos2 = 0); readln end.
Υποπρογράμματα: Διαδικασίες και συναρτήσεις Ένα υποπρόγραμμα είναι μία ομάδα εντολών που όλες μαζί κάνουν μία συγκεκριμένη εργασία. Το υποπρόγραμμα είναι τμήμα του προγράμματος και έχει όνομα, αρχή, τέλος. Όταν θέλουμε να εκτελέσουμε τις εντολές του υποπρογράμματος το καλούμε με το όνομά του μέσα από το κύριο πρόγραμμα.
Τα υποπρογράμματα χωρίζονται σε διαδικασίες (procedures) και συναρτήσεις (functions): function athroisma_duo_akeraiwn(a1, a2: integer): integer; begin athroisma_akeraiwn:= a1+a2; end; procedure hello; writeln('Eimaste sti diadikasia'); writeln('Hello world!'); procedure vres_min(a1, a2: integer; var elaxisto: integer); if a1 > a2 then elaxisto:=a2 else elaxisto:=a1;
Παραδείγματα χρήσης διαδικασιών, συναρτήσεων
α) Διαδικασίες χωρίς παραμέτρους (parameters) Οι διαδικασίες χωρίς παραμέτρους καλούνται από το κύριο πρόγραμμα μόνο με το όνομά τους. Δες και το παρακάτω παράδειγμα.
program greetings(input, output); procedure hello; begin writeln('Eimaste sti diadikasia'); writeln('Hello world!'); end; writeln('Eimaste sto kurio programma'); writeln('Kaloume th diadikasia gia na grapsoume to minima '); hello; writeln('Xanagurisame sto kurio programma'); readln; end. Τα αποτελέσματα εκτέλεσης του προγράμματος Eimaste sto kurio programma Kaloume th diadikasia gia na grapsoume to minima Eimaste sti diadikasia Hello world! Xanagurisame sto kurio programma
Οι μεταβλητές του κύριου προγράμματος λέγονται καθολικές (global) επειδή μπορούμε να τις χρησιμοποιήσουμε και στο πρόγραμμα και στα υποπρογράμματα. Δηλαδή μία καθολική μεταβλητή μπορεί να την αλλάξει και το κύριο πρόγραμμα και τα υποπρογράμματα. Η i είναι καθολική μεταβλητή. program greetings(input, output); var i: integer; procedure hello; begin writeln('Eimaste sti diadikasia'); writeln('i=', i); writeln('Hello world!'); end; writeln('Eimaste sto kurio programma'); i:= 10; writeln('Kaloume th diadikasia gia na grapsoume i=10 kai Hello world!'); hello; writeln('Xanagurisame sto kurio programma'); readln; end. Τα αποτελέσματα εκτέλεσης του προγράμματος Eimaste sto kurio programma Kaloume th diadikasia gia na grapsoume i=10 kai Hello world! Eimaste sti diadikasia i=10 Hello world! Xanagurisame sto kurio programma
Τι κάνει το παρακάτω πρόγραμμα; program kurio_programma(input, output); var x, y: integer; procedure diadikasia_ipologismwn; begin writeln('Eimaste sti diadikasia'); x:=y+10; y:=x+y; writeln('x=', x, ' y=', y); end; writeln('Eimaste sto kurio programma'); x:= 10; y:= 20; writeln('Kaloume th diadikasia '); diadikasia_ipologismwn; writeln('Xanagurisame sto kurio programma'); readln; end. Τα αποτελέσματα εκτέλεσης του προγράμματος Eimaste sto kurio programma x= 10 y= 20 Kaloume th diadikasia Eimaste sti diadikasia x= 30 y= 50 Xanagurisame sto kurio programma
Τα αποτελέσματα εκτέλεσης του προγράμματος Dwse vathmous mathimatwn 3 7 10 5 Mesos oros = 6.000...0Ε+000 (δηλαδή = 6) program vathmologia(input, output); var i, athroisma, vathmos: integer; mesos: real; procedure mesos_oros; begin athroisma:=0; writeln('Dwse vathmous mathimatwn'); for i:= 1 to 5 do readln(vathmos); athroisma := athroisma+vathmos; end; mesos:= athroisma/5; mesos_oros; writeln('Mesos oros = ', mesos); readln; end.
Τοπικές μεταβλητές (local variables) είναι οι μεταβλητές του υποπρογράμματος. Τις μεταβλητές αυτές δεν τις βλέπει το κύριο πρόγραμμα. Επομένως, οι τιμές των μεταβλητών αυτών αλλάζουν μόνο στο υποπρόγραμμα.
program mesos_oros_vathmologias(input, output); var am: integer; mesos: real; procedure mesos_oros; var i, athroisma, vathmos: integer; begin athroisma:=0; writeln('Dwse vathmous mathimatwn'); for i:= 1 to 5 do readln(vathmos); athroisma := athroisma+vathmos; end; mesos:= athroisma/5; writeln('Grapse AM spoudasth.'); readln(am); writeln('AM=',am); mesos_oros; writeln('Mesos oros = ', mesos); readln; end. Ο σπουδαστής γράφει τον αριθμό μητρώου του (ΑΜ) και μετά βαθμούς πέντε μαθημάτων του. Το πρόγραμμα υπολογίζει το μέσο όρο των μαθημάτων.
program mesos_oros_vathmologia(input, output); var am: integer; mesos: real; procedure mesos_oros; var i, athroisma, vathmos: integer; begin athroisma:=0; writeln('Dwse vathmous mathimatwn'); for i:= 1 to 5 do readln(vathmos); athroisma := athroisma+vathmos; end; mesos:= athroisma/5; writeln('To programma tha stamathsei an dwseis AM=99999.'); writeln('Grapse AM spoudasth.'); readln(am); while am <> 99999 do writeln('AM=',am); mesos_oros; writeln('Mesos oros = ', mesos); readln end. Το πρόγραμμα διαβάζει κάθε φορά αριθμό μητρώο (ΑΜ) σπουδαστή και μετά βαθμούς πέντε μαθημάτων του. Το πρόγραμμα υπολογίζει το μέσο όρο των μαθημάτων. Μετά διαβάζει το επόμενο ΑΜ και συνεχίζει μέχρι να δώσουμε σαν αριθμό μητρώου 99999.
β) Παράμετροι τιμής (value parameters) Το κύριο πρόγραμμα όταν καλεί το υποπρόγραμμα του δίνει τιμές. Το υποπρόγραμμα χρησιμοποιεί τις τιμές για να εκτελέσει κάποιες εργασίες πχ υπολογισμούς, εκτυπώσεις. Το υποπρόγραμμα δεν επιστρέφει τιμές στο πρόγραμμα.
program mesos_oros_vathmologia(input, output); var am: integer; mesos: real; procedure mesos_oros(kwdikos_spoudasth:integer); var i, athroisma, vathmos: integer; begin athroisma:=0; writeln('Dwse vathmous mathimatwn'); for i:= 1 to 5 do readln(vathmos); athroisma := athroisma+vathmos; end; mesos:= athroisma/5; writeln('AM=', kwdikos_spoudasth); writeln('To programma tha stamathsei an dwseis AM=99999.'); writeln('Grapse AM spoudasth.'); readln(am); while am <> 99999 do mesos_oros(am); writeln('Mesos oros = ', mesos); readln end.
γ) Παράμετροι μεταβλητών (variable parameters) Το κύριο πρόγραμμα όταν καλεί το υποπρόγραμμα του δίνει τα ονόματα καθολικών μεταβλητών που ήδη έχουν τιμή. Το υποπρόγραμμα αποθηκεύει τις τιμές που παίρνει σε δικές του τοπικές μεταβλητές για να εκτελέσει κάποιες εργασίες πχ υπολογισμούς, εκτυπώσεις. Το υποπρόγραμμα επιστρέφει τις τιμές που υπολόγισε στο κύριο πρόγραμμα. Διαφορά των περιπτώσεων β) και γ) για την κλήση υποπρογράμματος από το κύριο. Στην περίπτωση κλήσης με τιμές το υποπρόγραμμα τις αξιοποιεί για να κάνει πράξεις χωρίς να επιστρέψει κάτι στο κύριο πρόγραμμα. Στην περίπτωση που καλείται το υποπρόγραμμα και του «περνάμε» μεταβλητές τότε το υποπρόγραμμα μπορεί να χρησιμοποιήσει τις τιμές, να κάνει υπολογισμούς και στη συνέχεια να στείλει τις τιμές που υπολόγισε στο κύριο πρόγραμμα.
program mesos_oros_vathmologia(input, output); var arithmos1, arithmos2, phliko, ypoloipo: integer; procedure ypologismos(arit1, arit2:integer); begin phliko:= arit1 div arit2; ypoloipo:= arit1 mod arit2; end; writeln('Dwse 2 akeraious aritmous.'); writeln('An kapoios einai mhden i atnhtikos to programma tha stamathsei'); readln(arithmos1, arithmos2); while (arithmos1 > 0) and (arithmos2 > 0)do ypologismos(arithmos1, arithmos2); writeln('ypoloipo = ', ypoloipo); writeln('phliko = ', phliko); readln end. Να γράψετε ένα πρόγραμμα που θα διαβάζει ζευγάρια θετικών ακέραιων αριθμών. Το πρόγραμμα θα καλεί μία διαδικασία (procedure) που θα υπολογίζει το υπόλοιπο και το πηλίκο της διαίρεσης των 2 αριθμών. Το πρόγραμμα θα σταματά αν δώσουμε μηδέν ή αρνητικό αριθμό.
Γράψτε πρόγραμμα που θα διαβάζει ζευγάρια δύο αριθμών Γράψτε πρόγραμμα που θα διαβάζει ζευγάρια δύο αριθμών. Το πρόγραμμα θα διαβάζει το ζευγάρι αριθμών και θα «αποθηκεύει» τους δύο αριθμούς του ζευγαριού σε δύο μεταβλητές με όνομα arithmos1, arithmos2. Μετά θα καλεί μία procedure που θα κάνει εναλλαγή των τιμών των μεταβλητών. Στη συνέχεια θα τυπώνει τις τιμές των μεταβλητών στο τετράγωνο. Το πρόγραμμα θα ρωτάει αν θέλουμε να συνεχίσουμε και αν ναι θα συνεχίζει να διαβάζει κ.λπ. program antallagh(input, output); var arithmos1, arithmos2: integer; ch: char; procedure antallagh_timwn(var arit1, arit2:integer); var temp: integer; begin temp:= arit1; arit1:= arit2; arit2:= temp; arit1:= arit1*arit1; arit2:= arit2*arit2; end; repeat writeln('Dwse 2 akeraious aritmous.'); readln(arithmos1, arithmos2); antallagh_timwn(arithmos1, arithmos2); writeln('arithmos1 = ', arithmos1); writeln('arithmos2 = ', arithmos2); writeln('tha synexiseis; Y/N'); readln(ch) until (ch='N') or (ch= 'n'); readln end.
Συναρτήσεις (functions) Η συνάρτηση είναι ένα πρόγραμμα το οποίο καλείται από το κύριο πρόγραμμα για να κάνει κάποιους υπολογισμούς. Στο τέλος, επιστρέφει μία τιμή στο πρόγραμμα.
Υπολογισμός αθροίσματος ζευγαριών αριθμών program ypologismos_athroismatos_2_thetikwn(input, output); var arit1, arit2, athroisma: integer; function athroisma_akeraiwn(a1, a2: integer): integer; begin athroisma_akeraiwn:= a1+a2; end; writeln('Dwse 2 akeraious aritmous.'); writeln('An kapoios einai mhden i atnhtikos to programma tha stamathsei'); readln(arit1, arit2); while (arit1 > 0) and (arit2 > 0)do athroisma:= athroisma_akeraiwn(arit1, arit2); writeln('athroisma = ', athroisma); readln end.
Υπολογισμός μέσου όρου ζευγαριών αριθμών program ypologismos_mesou_orou_2_thetikwn(input, output); var arit1, arit2: integer; mesos: real; function mesos_oros_akeraiwn(a1, a2: integer): real; begin mesos_oros_akeraiwn:= a1+a2/2; end; writeln('Dwse 2 akeraious aritmous.'); writeln('An kapoios einai mhden i atnhtikos to programma tha stamathsei'); readln(arit1, arit2); while (arit1 > 0) and (arit2 > 0)do mesos:= mesos_oros_akeraiwn(arit1, arit2); writeln('mesos oros = ', mesos); readln end. Το ίδιο πρόγραμμα μπορεί να καλέσει, μία ή πολλές φορές, μια ή πολλές διαδικασίες ή συναρτήσεις.
program programma_me_function_kai_procedure(input, output); var arit1, arit2, min, max: integer; function vres_max(a1, a2: integer): integer; begin if a1 > a2 then vres_max:=a1 else vres_max:=a2; end; procedure vres_min(a1, a2: integer; var elaxisto: integer); elaxisto:=a2 elaxisto:=a1; writeln('Dwse 2 akeraious aritmous.'); writeln('An kapoios einai mhden i atnhtikos to programma tha stamathsei'); readln(arit1, arit2); min:=0; while (arit1 > 0) and (arit2 > 0)do max:= vres_max(arit1, arit2); vres_min(arit1, arit2, min); writeln('elaxisto = ', min, ' megisto = ', max); readln end. Να γράψετε ένα πρόγραμμα που θα διαβάζει ζευγάρια θετικών ακεραίων. Στη συνέχεια θα χρησιμοποιεί μία συνάρτηση για να βρεί τον μεγαλύτερο από αυτούς. Μετά θα χρησιμοποιεί μία διαδικασία για να βρεί το μικρότερο από αυτούς.
begin writeln('Dwse 2 akeraious aritmous.'); writeln('An kapoios einai mhden i atnhtikos to programma tha stamathsei'); readln(arit1, arit2); min:=0; max:=0; while (arit1 > 0) and (arit2 > 0)do vres_min_max(arit1, arit2, max, min); end; readln end. program programma_me_function_kai_procedure(input, output); var arit1, arit2, min, max: integer; function vres_max(a1, a2: integer): integer; begin if a1 > a2 then vres_max:=a1 else vres_max:=a2; end; procedure vres_min(a1, a2: integer; var elaxisto: integer); elaxisto:=a2 elaxisto:=a1; procedure vres_min_max(n1, n2, megisto, elax: integer); writeln('vriskesai stin procedure vres_min_max'); megisto:= vres_max(n1, n2); vres_min(n1, n2, elax); writeln('kalesses function & procedure kai sou gyrisan times'); writeln('megisto = ', megisto,' elaxisto = ', elax);
Αναδρομικές διαδικασίες και συναρτήσεις program paradeigma_anadromis(input, output); var a: integer; procedure antistrofi_arithmou(n: integer); begin write(n:3); If n < a then antistrofi_arithmou (n+1); end; repeat writeln('Dwse thetiko akeraio'); writeln('An dwseis mhden i atnhtiko to programma tha stamathsei'); readln(a); until a>=1; antistrofi_arithmou(1); readln end. Dwse thetiko akeraio An dwseis mhden i atnhtiko to programma tha stamathsei 7 1 2 3 4 5 6 7 7 6 5 4 3 2 1
Να δούμε πως εκτελείται ακριβώς η αναδρομική διαδικασία Να δούμε πως εκτελείται ακριβώς η αναδρομική διαδικασία. Έστω ότι θα δώσουμε α=3 και περιμένουμε να δείξει: 123321. Το πρόγραμμα με την εντολή antistrofi_arithmou(1); καλεί την αναδρομική διαδικασία.
program ypologismos_paragontikou(input, output); var n, p: integer; Υπολογισμός Ν!=1*2*3*...Ν program ypologismos_paragontikou(input, output); var n, p: integer; ch: char; function paragontiko(k: integer): integer; begin If k = 0 then paragontiko:= 1 else paragontiko:= k*paragontiko(k-1); end; repeat writeln('Dwse mh arnhtiko akeraio mikrotero h iso tou 10'); readln(n); until (n >= 0) and (n <= 10); p:= paragontiko(n); writeln(n, '!=', p); writeln('Thes na synexiseis; Y/N'); readln(ch); until (ch='N') or (ch='n'); readln end.
Παραδείγματα χρήσης Πινάκων: Να γραφτεί πρόγραμμα που θα διαβάζει τους βαθμούς του σπουδαστή σε πέντε μαθήματα και θα εμφανίζει το μέσο όρο.
program mesos_oros_5_mathimatwn(input, output); Παραδείγματα χρήσης Πινάκων: Να γραφτεί πρόγραμμα που θα διαβάζει τους βαθμούς του σπουδαστή σε πέντε μαθήματα και θα εμφανίζει το μέσο όρο. program mesos_oros_5_mathimatwn(input, output); var a: array[1..5] of real; k: integer; sum, mesos: real; begin writeln('Dwse vathmous 5 mathimatwn'); sum:=0.0; for k:=1 to 5 do readln(a[k]); sum:= sum+a[k]; end; mesos:= sum/5; writeln('a[', k, ']=', a[k]); writeln('athroisma=', sum, ' mesos oros=', mesos); readln end. Dwse vathmous 5 mathimatwn 1 2 3 4 5 α[1]=1.000000000000000E+000 α[2]=2.000000000000000E+000 α[3]=3.000000000000000E+000 α[4]=4.000000000000000E+000 α[5]=5.000000000000000E+000 αthroisma=1.500000000000000E+001 mesos oros=3.000000000000000E+000
Να γραφτεί πρόγραμμα που θα διαβάζει τα αντίστοιχα στοιχεία δύο πινάκων, θα τα προσθέτει και θα βάζει το αποτέλεσμα σε τρίτο πίνακα. Όλοι οι πίνακες είναι μονοδιάστατοι και έχουν πέντε στοιχεία.
Να γραφτεί πρόγραμμα που θα διαβάζει τα αντίστοιχα στοιχεία δύο πινάκων, θα τα προσθέτει και θα βάζει το αποτέλεσμα σε τρίτο πίνακα. Όλοι οι πίνακες είναι μονοδιάστατοι και έχουν πέντε στοιχεία. program prosthesh_pinakwn(input, output); var a, b, c: array[1..5] of real; k: integer; begin writeln('Dwse stoixeia prwtou pinaka'); for k:=1 to 5 do readln(a[k]); end; writeln('Dwse stoixeia defterou pinaka'); readln(b[k]); writeln('ypologizw ta stoixeia tou tritou pinaka'); c[k]:=a[k]+b[k]; writeln('deixnw ta stoixeia'); writeln('c[', k, ']=', a[k], '+', b[k], '=', c[k]); readln end.
Ερωτήσεις