ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 12 : Υποπρογράµµατα 1 ο Φύλλο Εργασιών: Διαδικασίες ΑΠΑΝΤΗΣΕΙΣ 1. Ποιες από τις παρακάτω επικεφαλίδες διαδικασιών δεν είναι σωστές και γιατί; α) procedure BB(P,Q:integer; Q,R:integer) Λάθος. Η µεταβλητή Q δηλώθηκε 2 φορές β) procedure CC(N:integer; Y:real) Σωστό γ) procedure D1,D2(N:integer; X:real) Λάθος στο όνοµα δ) procedure DD(DD, D:integer); Λάθος. Έχει δηλωθεί µεταβλητή DD ίδια µε το όνοµα ε) procedure (X:integer; Y:real) Λάθος. εν υπάρχει όνοµα. στ) procedure T[1]. Λάθος δεν υπάρχουν παράµετροι. 2. Στο παρακάτω πρόγραµµα σε αρκετές από τις γραµµές του υπάρχουν συντακτικά και λογικά λάθη. Να εντοπίσετε αυτές τις γραµµές και να εξηγήσετε ποιο είναι το λάθος σε κάθε µία. 1 program metavlites(input, output); 2 x,y,k:integer; 3 xx,yy:real; 4 5 procedure proc1(a,b:integer; k:real); 6 m:integer; 7 n:real; 8 9 a:=a+b; 10 b:=b*2; 11 n:=k/2; 12 k:= xx/2; 13 14 15 16 m:=1; 17 n:=2.5; 18 read(x); 19 y:=x*4; 20 if y <> 0 then 21 xx:=x/y; 22 else 23 xx:=0.5; 24 proc1(x,y,xx); 25 for k:=1 to x do 26 proc1(x,y,k); 27 writeln(proc1(1,2,yy)); 28 29 case x of 30 1: proc(1,2,xx); 31 2: proc1(1,2); 32 3: proc1(xx,1,2); 33 else 34 proc1(x,y,xx) 35 end 36 end. 1
16,7 : εν δηλώθηκαν οι µεταβλητές m,n 21: ; πριν από else 26: Mεταβολή της µεταβλητής µετρητή της for. Η k δίνεται ως πραγµατική παράµετρος σε παράµετρο µεταβλητής της διαδικασίας proc1 27: η διαδικασία proc1 δίνεται ως παράµετρος σε write 30: κλήση υποπρογράµµατος proc που δεν έχει δηλωθεί 31: κλήση της διαδικασία; proc µε λάθος αριθµό παραµέτρων (2 αντί 3) 32: κλήση της διαδικασίας proc1 µε πραγµατική παράµετρο σταθερά (2) στη θέση παραµέτρου µεταβλητής 3. Να συµπληρώσετε τις τιµές των µεταβλητών παρακάτω σύµφωνα µε την έξοδο του προγράµµατος program parametroi_timis(input, output); m,n : Integer; procedure proc(a,b: Integer); x,y:real; x:= a/2; y:=b/2; writeln('στην proc'); writeln('παράµετροι :':25, ' a=',a:4, ' b=',b:4); writeln('τοπικές µεταβλητές :':25, ' x=',x:2:2, ' y=',y:2:2); a:=2*b; b:=m; writeln('τέλος της proc'); writeln('παράµετροι :':25, ' a=',a:4, ' b=',b:4); writeln('τοπικές µεταβλητές :':25, ' x=',x:2:2, ' b=',y:2:2); { Κύριο πρόγραµµα } m:= 5; n:= 4; writeln('πριν τη proc'); proc(m,n); writeln('μετά τη proc'); end. Πριν τη proc Στην proc παράµετροι : a= 5 b= 4 τοπικές µεταβλητές : x=2.50 b=2.00 2
Τέλος της proc παράµετροι : a= 8 b= 5 τοπικές µεταβλητές : x=2.50 b=2.00 Μετά τη proc 4. Να συµπληρώσετε τις τιµές των µεταβλητών παρακάτω σύµφωνα µε την έξοδο του προγράµµατος program parametroi_metavlitis(input, output); m: Integer; f:boolean; procedure proc(a:integer; k:integer; f:boolean); writeln('στην proc'); writeln('παράµετροι :':25, ' a=',a:2, ' k=',k:2, ' f=',f:5); if f then k:=a+2; a:=k-1; f := false end else k:=a-2; a:=k+1; f:=true writeln('τέλος της proc'); writeln('παράµετροι :':25, ' a=',a:2, ' k=',k:2, ' f=',f:5); { Κύριο πρόγραµµα } m:= 4; f:=true; writeln('πριν τη proc'); proc(5,m,f); writeln('μετά τη proc'); proc(5,m,f); writeln('μετά τη proc'); end. 3
Πριν τη proc καθολικές µεταβλητές : m= 4 f= TRUE Στην proc παράµετροι : a= 5 k= 4 f= TRUE καθολικές µεταβλητές : m= 4 f= TRUE Τέλος της proc παράµετροι : a= 6 k= 7 f=false καθολικές µεταβλητές : m= 7 f=false Μετά τη proc καθολικές µεταβλητές : m= 7 f=false Στην proc παράµετροι : a= 5 k= 7 f=false καθολικές µεταβλητές : m= 7 f=false Τέλος της proc παράµετροι : a= 4 k= 3 f= TRUE καθολικές µεταβλητές : m= 3 f= TRUE Μετά τη proc καθολικές µεταβλητές : m= 3 f= TRUE 5. Να συµπληρώσετε τον παρακάτω πίνακα µε βάση την έξοδο που δίνει το παρακάτω πρόγραµµα program PPP(input, output); const C = 2; G:real; A,B:integer; procedure DDD( Y:integer; C:integer); const A = 10; writeln('στην DDD: ':20, ' A=',A:2, ' B=', B:2, ' C=', C:2, ' G=',G:4:1, ' Y=', Y:2); Y:=C+A-1; C:=Y+A-1; G:=C/2; writeln('τέλος της DDD: ':20, ' A=',A:2, ' B=', B:2, ' C=', C:2, ' G=',G:4:1, ' Y=', Y:2); {DDD} {PPP} A:=3; B:=5; G:=0; writeln('πριν από την DDD: ':20, ' A=',A:2, ' B=', B:2, ' C=', C:2, ' G=',G:4:1); DDD(B,A); writeln('μέτα από την DDD: ':20, ' A=',A:2, ' B=', B:2, ' C=', C:2, ' G=',G:4:1); DDD(A, B+9); writeln('μέτα από την DDD: ':20, ' A=',A:2, ' B=', B:2, ' C=', C:2, ' G=',G:4:1); end. {PPP} 4
Πριν από την DDD: A= 3 B= 5 C= 2 G= 0.0 Στην DDD: A=10 B= 5 C= 3 G= 0.0 Y= 5 Τέλος της DDD: A=10 B=12 C=21 G=10.5 Y=12 Μέτα από την DDD: A= 3 B=12 C= 2 G=10.5 Στην DDD: A=10 B=12 C=21 G=10.5 Y= 3 Τέλος της DDD: A=10 B=12 C=39 G=19.5 Y=30 Μέτα από την DDD: A=30 B=12 C= 2 G=19.5 6. Να γράψετε µε τη γλώσσα Pascal τις παρακάτω διαδικασίες και ένα ολοκληρωµένο πρόγραµµα που θα τις χρησιµοποιεί. α) procedure swap( a,b:integer) που θα προκαλεί εναλλαγή των τιµών δύο µεταβλητών τύπου integer β) procedure max(a,b,c:integer; mx:integer) που θα βρίσκει το µέγιστο µεταξύ τριών ακέραιων και θα "επιστρέφει" το αποτέλεσµα σε µια παράµετρο µεταβλητής γ) procedure min(a,b,c:integer; mn:integer) που θα βρίσκει τον ελάχιστο µεταξύ τριών ακέραιων και θα "επιστρέφει" το αποτέλεσµα σε µια παράµετρο µεταβλητής δ) procedure sort(a,b,c:integer) που θα τυπώνει τρεις ακέραιους ταξινοµηµένους κατά αύξουσα και κατά φθίνουσα σειρά (να χρησιµοποιήσετε τις διαδικασίες.max και min) ε) procedure paragontiko(n:integer, parag:integer) που θα υπολογίζει το n! (δηλαδή το 1*2*3*4* *n) για δοσµένο n. και θα "επιστρέφει" το αποτέλεσµα σε µια παράµετρο µεταβλητής στ) procedure dynami(x,n:integer, dyn:integer) που θα υπολογίζει το x n και θα "επιστρέφει" το αποτέλεσµα σε µια παράµετρο µεταβλητής program task06(input,output); x,y:integer; {ερώτηµα α} procedure swap( a,b:integer); temp:integer; temp:=a; a:=b; b:=temp; {ερωτηµα β} procedure max(a,b,c:integer; mx:integer); mx:=a; if b>mx then mx:=b; if c>mx then mx:=c; {ερωτηµα γ} procedure min(a,b,c:integer; mn:integer); mn:=a; if b<mn then mn:=b; if c<mn then mn:=c; 5
{ερώτηµα δ} procedure sort(a,b,c:integer); mx,mn,med:integer; max(a,b,c,mx); min(a,b,c,mn); med:=a+b+c-mx-mn; writeln(mn,' ',med,' ',mx); writeln(mx,' ',med,' ',mn); {ερωτηµα ε} procedure paragontiko(n:integer; parag:integer); i,j:integer; if n=0 then parag:=1 else i:=1; for j:=2 to n do i:=i*j; parag:=i; {ερώτηµα στ} procedure dynami(x,n:integer; dyn:integer); i,d:integer; d:=1; for i:=1 to n do d:=d*x; dyn:=d; {κυρίως πρόγραµµα} x:=2; y:=3; writeln('x=',x,' y=',y); swap(x,y); writeln('x=',x,' y=',y); max(1,3,1,x); min(1,3,1,x); sort(234,42,123); paragontiko(6,x); dynami(2,10,x); end. 6