ΚΕΦΑΛΑΙΟ 11
ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ (while-do, repeat-until, for-do)
------------------------------------------------------------------------------------------------------------------------------------------------
χρησιμοπόιήστε για το περιβάλλον: http://www.tutorialspoint.com/compile_pascal_online.php
Επίσης οι ασκήσεις που έχουν “πέσει” τα προηγούμε χρόνια στις πανελλαδικές βρίσκονται εδώ: http://okiriostonipologiston.blogspot.gr/2014/02/10-11.html
Η κάθε άσκηση μπορεί (και πρέπει) να λυθεί και με τις τρεις δομές επανάληψης
Αποτέλεσμα της εκτέλεσης του προγράμματος:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Αποτέλεσμα της εκτέλεσης του προγράμματος: @$@$@$@$@$
Αποτέλεσμα της εκτέλεσης του προγράμματος: ##### $$$$$
Αποτέλεσμα της εκτέλεσης του προγράμματος:
Πόσες φορές θέλεις να εμφανιστεί ο χαρακτήρας &; 5 {ο χρήστη πληκτρολογεί μία τιμή}
&&&&&
Αποτέλεσμα της εκτέλεσης του προγράμματος:
Ποιος χαρακτήρας θέλεις να εμφανιστεί; % {ο χρήστη πληκτρολογεί μία τιμή}
Πόσες φορές θέλεις να εμφανιστεί;_ 8 {ο χρήστη πληκτρολογεί μία τιμή}
%%%%%%%% {εμφανίζεται η τιμή του προγράμματος}
Program epanalipseis_me_while_do;
Var
xaraktiras : char;
epanalipseis : integer;
Begin
write('Ποιός χαρακτήρας θες να εμφανιστεί; ');
readln(xaraktiras);
write('Πόσες φορές θέλεις να εμφανιστεί; ');
readln(epanalipseis);
while epanalipseis > 0 do
begin
write(xaraktiras);
epanalipseis := epanalipseis - 1;
end; {while}
writeln;
End. {κυρίως προγράμματος}
Program epanalipseis_me_repeat_until;
Var
xaraktiras : char;
epanalipseis : integer;
Begin
write('Ποιός χαρακτήρας θες να εμφανιστεί; ');
readln(xaraktiras);
write('Πόσες φορές θέλεις να εμφανιστεί; ');
readln(epanalipseis);
repeat
write(xaraktiras);
epanalipseis := epanalipseis - 1;
until epanalipseis <= 0; {της rereat}
writeln;
End. {του κυρίως προγράμματος}
Program epanalipseis_me_for_do;
Var
xaraktiras : char;
a, epanalipseis : integer;
Begin
write('Ποιός χαρακτήρας θες να εμφανιστεί; ');
readln(xaraktiras);
write('Πόσες φορές θέλεις να εμφανιστεί; ');
readln(epanalipseis);
for a := 1 to epanalipseis do
begin
write(xaraktiras);
end; {της for}
writeln;
End. {του κυρίως προγράμματος}
Αποτέλεσμα της εκτέλεσης του προγράμματος: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20
Program epanalipseis_me_repeat_until;
Var
a : integer;
Begin
a := 1;
repeat
write(a);
write(‘, ’);
a := a + 1;
until a > 20; {της rereat}
writeln;
End. {του κυρίως προγράμματος}
Δώσε μου αριθμό των μαθητών της τάξης: α {ο χρήστη πληκτρολογεί μία τιμή}
Δώσε τον βαθμό του 1ου μαθητή: {ο χρήστη πληκτρολογεί μία τιμή}
Δώσε τον βαθμό του 2ου μαθητή: {ο χρήστη πληκτρολογεί μία τιμή}
…
Δώσε τον βαθμό του Νου μαθητή: {ο χρήστη πληκτρολογεί μία τιμή}
Ο μέσος όρος της τάξης είναι: {εμφανίζεται η τιμή του προγράμματος}
Δώσε μου τον αριθμό: α {ο χρήστη πληκτρολογεί μία τιμή}
Δώσε μου τον αριθμό: α {ο χρήστη πληκτρολογεί μία τιμή}
…
Έδωσες Ν αριθμούς και το άθροισμα τους είναι: Χ {εμφανίζεται η τιμή του προγράμματος}
Program epanalipseis_mexri_to_50;
Var
sum, ar, plithos : integer;
Begin
sum := 0;
plithos := 0;
write(‘Δώσε μου έναν αριθμό ‘);
readln(ar);
while sum =< 50 do
begin
sum := sum + ar;
plithos := plithos + 1;
write(‘Δώσε μου άλλον αριθμό ‘);
readln(ar);
end; {της while}
write(‘Το πλήθος των αριθμών είναι: ‘, plithos);
End. {του προγράμματος}
Υπόδειξη: το πρώτο πράγμα που πρέπει να σκεφετείτε είναι ποιά από τα παραπάνω θα υπολογισθούν μέσα στη δομή επανάληψης και ποιά εκτός.
Program askisi_ola_ta_lefta;
Var
n, a, arithmos, athroisma, mo, mikroteros : integer;
megaliteros, plithos_thetikon, plithos_arnitikon : integer;
pososto_arnitikon, plithos : integer;
Begin
athroisma := 0; mo := 0;
plithos_thetikon := 0; pososto_arnitikon := 0;
megaliteros := -99999;
mikroteros := 999999;
plithos := 0; plithos_arnitikon := 0;
write(‘Δώσε μου έναν αριθμό N, όπου Ν > 0 και Ν <= 20‘);
readln(n);
while (n > 20) or (n <= 0) do
begin
write(‘Δώσε μου έναν αριθμό N, όπου Ν > 0 και Ν <= 20‘);
readln(n);
end;
for a := 1 to n do
begin
writeln(‘Δώσε μου έναν αριθμό ‘);
readln(arithmos);
athroisma := athroisma + arithmos;
plithos := plithos + 1; {μήπως αυτό ταυτίζεται με το n?}
if arithmos > 0 then
plithos_thetikon := plithos_thetikon + 1
else
if arithmos < 0 then {θα αρκούσε ένα απλό else?}
plithos_arnitikon := plithos_arnitikon + 1;
if mikroteros > arithmos then
mikroteros := arithmos;
if megaliteros < arithmos then
megaliteros := arithmos;
end; {της for }
mo := athroisma div n; {ή mo := ahtroisma div plithos;
pososto_arnitikon := 100 * plithos_arnitikon div n;
writeln(‘Το άθροισμα είναι: ‘, athroisma);
writeln(‘Ο μέσος όρος είναι: ‘, mo);
writeln(‘Ο μικρότερος είναι: ‘, mikroteros);
writeln(‘Ο μεγαλύτερος είναι: ‘, megaliteros);
writeln(‘Το πλήθος των θετικών είναι: ‘, plithos_thetikon);
writeln(‘Το ποσοστό των αρνητικών είναι: ‘, pososto_arnitikon, ‘ %’);
End.
Program epanalipseis_me_repeat_until;
Var
pin, a : integer;
Begin
a := 1;
write('Δώσε το pin_');
readln(pin);
while (pin <> 2342) and (a <3) do
begin
write('Λάθος pin, ξαναπροσπάθησε, δώσε pin_' );
readln(pin);
a := a + 1;
end; {της while}
if a < 3 then
write('Καλώς ήρθες ')
else
write('Η συσκευή έχει κλειδώσει ');
writeln;
End. {του κυρίως προγράμματος}
arithmos:=0;
telos:=false;
while not telos do
begin
arithmos:=arithmos+2;
if arithmos > 100 then
telos:=true;
end;
Δώσε μου τον αριθμό του οποίου τη δύναμη θέλεις να υπολογίσεις: 2 {ο χρήστη πληκτρολογεί μία
τιμή}
Δώσε μου τη τιμή της δύναμης: 3 {ο χρήστη πληκτρολογεί μία τιμή}
Η 3η δύναμη του 2 είναι: 2*2*2 = 8 {εμφανίζεται η τιμή του προγράμματος}
Δώσε μου τον αριθμό του οποίου θέλεις να υπολογίσεις τη προπαίδεια: 5 {ο χρήστη
πληκτρολογεί μία τιμή}
5 Χ 1 = 5
… {εμφανίζεται η τιμή του προγράμματος}
5 Χ 9 = 45
5 Χ 10 = 50
Δώσε μου τον πρώτο χαρακτήρα: α {ο χρήστη πληκτρολογεί μία τιμή}
Δώσε μου τον δεύτερο χαρακτήρα: ε {ο χρήστη πληκτρολογεί μία τιμή}
Μεταξύ του α και του ε μεσολαβούν οι β, γ, δ {εμφανίζεται η τιμή του προγράμματος}
Δώσε μου τον 1ο αριθμό: 6 {ο χρήστη πληκτρολογεί μία τιμή}
Δώσε μου τον 2ο αριθμό: 17 {ο χρήστη πληκτρολογεί μία τιμή}
…
Δώσε μου τον Νοστό αριθμό: 12 {ο χρήστη πληκτρολογεί μία τιμή}
Ο μέσος όρος των Ν αριθμών είναι : Χ {εμφανίζεται η τιμή του προγράμματος}
Δώσε μου δύο αριθμούς: 10 25
Δώσε μου τον τελεστή της πράξης ή Τ για τέλος του προγράμματος: +
Το αποτέλεσμα είναι: 35
Δώσε μου δύο αριθμούς: 7 2
Δώσε μου τον τελεστή της πράξης ή Τ για τέλος του προγράμματος: Τ
Τέλος προγράμματος
* *******
*** *****
***** ***
******* *
***** ***
*** *****
* *******
α:=4
β:=-3
Εφόσον β<=0 επανάλαβε
β:=β+1
α:=α+β-1
Τέλος
Εμφάνισε α
Εμφάνισε β
------------------------------------------------------------------------------------------------------------------------------------
Τις παρακάτω ασκήσεις τις βρήκα στο στέκι των πληροφορικών. Δυστυχώς δεν συγκράτησα το όνομα της συναδέλφου για να κάνω αναφορά…
read(a, b);
while (a >= b) and (a div 10 < 1) do
begin
a := a * a;
if (a div b > 2) then
b := b + 1
else
a := a + 1
end
write(a, b);
a := 6;
b := 11;
REPEAT
c := (a + b) div 2;
if (c > a) then
begin
a := c – a;
b := b – c
end
else
begin
a := 3 + a – c;
b := c – b
end;
posotita := c + a * b
UNTIL (posotita < 0)
write(a, b, c);
a := 6;
b := 11;
FOR i:=1 TO 5 DO
BEGIN
a := a + 1;
b := b – 1;
writeln(a, b);
END;
a := 6;
b := 11;
FOR i:=5 DOWNTO 1 DO
BEGIN
a := a + 1;
b := b – 1;
writeln(a, b);
END;
FOR letter:=’A’ to ‘Z’ DO
writeln(letter);
arithmos := 1;
while arithmos < 6 do
begin
writeln(arithmos);
arithmos := arithmos + 1;
end;
X := 0;
REPEAT
Y := X DIV 2;
Z := X DIV 3;
IF (Z>0) THEN
A := Z
ELSE
A := Y;
writeln(X, Y, Z, A);
X := X + 1;
UNTIL (X>10)
Υπερωρίες (ώρες) | Χρήματα (€) ανά υπερωρία |
1 έως 3 | 7 |
4 έως 6 | 9 |
Πάνω από 7 | 10 |
Γράψτε αλγόριθμο που διαβάζει τις υπερωριακές ώρες του περασμένου μήνα για κάθε υπάλληλο της εταιρίας και εμφανίζει πόσα χρήματα δικαιούται. Να κάνετε και το αντίστοιχο λογικό διάγραμμα.
α. το πλήθος των εργατών μιας εταιρίας
β. πόσες είναι οι υποχρεωτικές ώρες εργασίας (κάθε επιπλέον ώρα είναι υπερωρία)
γ. την ωριαία αμοιβή
δ. την επιπλέον αμοιβή για κάθε υπερωριακή ώρα
ε. τις ώρες εργασία κάθε εργάτη το μήνα που πέρασε
Το πρόγραμμα στη συνέχεια υπολογίζει και εμφανίζει τα χρήματα που πήρε ο κάθε εργάτης τον περασμένο μήνα, καθώς και το σύνολο των χρημάτων που πήραν όλοι οι εργάτες. Να υλοποιήσετε και το αντίστοιχο λογικό διάγραμμα.
Θέματα Πανελλαδικών
Program Thema_C_2011;
Const
pagio = 3;
Var
onoma : String;
mo, xrewsi, sinoliki_xrewsi : Real;
GB, a : Integer;
Begin
for a := 1 to 50 do
begin
write('Δώσε το όνομα του υπαλλήλου ');
readln(onoma);
write('Δώσε τον όγκο των GB ');
readln(GB);
case GB of
0..2 : xrewsi := pagio + GB*10;
3..6 : xrewsi := pagio + 2*10 + (GB-2)*2.5;
else
xrewsi := pagio + 2*10 + 4*2.5 + (GB-6)*1.5;
end; {της case}
writeln('Ο υπάλληλος ', onoma, ' όνομα θα χρειωθεί: ', xrewsi:10:2);
sinoliki_xrewsi := sinoliki_xrewsi + xrewsi;
end; {της for }
mo := sinoliki_xrewsi / 50;
writeln('O μέσος όρος της χρέωσης είναι: ', mo:10:2);
End.