Mάθημα 8: Προγραμματισμός

8.1 Συναρτήσεις σε μορφή προγραμμάτων

Η συνάρτηση

> f:= x->x^2;

Mπορεί να ορισθεί και με την βοήθεια ενός μικρού προγράμματος:

> F:= proc(x)

> x^2;

> end;

>

Και οι δύο είναι διαδικασίες που κάνουν την ίδια δουλειά:

> f(2); F(2);

> type(f, procedure); type(F,procedure);

>

>

Ανάλογα μπορεί ένα μικρό πρόγραμμα να αντικαταστήσει μιά κλαδωτή συνάρτηση:

> g := x->piecewise( x<=0,-x^2, 0<x and x<=2, 4*x^2-4*x, 4-x^2/2 );

>

>

> G:=proc(x) # η ίδια συνάρτηση ως πρόγραμμα

> if

x <= 0 then -x^2;

elif

0<x and x<=2 then 4*x^2-4*x;

> else

4-x^2/2 ;

fi;

> end;

>

> plot( G, -4..4, discont=true);

>

Οι δύο συναρτήσεις g, G είναι ισοδύναμες. Το πρόγραμμα μπορεί να περιέχει περισσότερα ορίσματα:

>

> k:=proc(p,q)

> p/q;

> end:

> k(3,4); k(11,23); k(10+20*I, 2);

Tα ορίσματα του προγράμματος μπορούν να είναι οποιαδήποτε αντικείμενα ορίζονται στην Maple, αρκεί οι

πράξεις που γίνονται στο πρόγραμμα να έχουν νόημα. Στο επόμενο παραδειγμα, το πρόγραμμα δέχεται μιά

παράσταση ως προς x και κάνει την γραφική της καθώς και την γραφική της παραγώγου της:

>

> myplot2:=proc(y,x,a,b)

> local yp;

> yp:=diff(y,x);

> plot([y,yp],x=a..b);

> end;

>

>

> myplot2(x*cos(x),x,-Pi,Pi); # μιά εφαρμογή της προηγουμένης

Ανάλογα μπορούν να χρησιμοποιούνται σαν ορίσματα λίστες:

> mesos:= proc(X::list) # μέσος όρος μιάς λίστας

> local nX, iX, totX;

> nX:= nops(X); # πόσα μέλη συμπεριλαμβάνει η λίστα

> if nX=0 then ERROR(`your list is empty`); fi;

> totX := add( iX, iX=X)/nX;

> end;

>

Χρήση του προγράμματος:

> myList:= [1.1, 2.2, 3.3, 4.4]; myL2:=[];

> mesos(myList); mesos(myL2);

8.2 Βρόγχοι

Αποτελούνται από εντολές που επαναλαμβάνονται πολλές φορές π.χ το επόμενο πρόγραμμα δίνει το άθροισμα των n-στών δυνάμεων γιά τους πρώτου m ακέραιους:

> sumPowers:=proc(n::integer, m::integer)

> local ntot, i;

> ntot:=0;

> for i from 0 to m do ntot:=ntot+i^n od;

> ntot;

> end;

> sumPowers(5,10); # αθροισμα των 5-των δυνάμεων των 10 πρώτων ακεραίων.

Η ίδια δουλειά μπορεί να γίνει με την εντολή while:

> sumPowers2:= proc(n::integer, m::integer)

> local ntot, i;

> ntot:=0; i:=1;

> while i <= m do ntot:= ntot+i^n; i:=i+1; od;

> ntot;

> end;

>

8.3 Εφαρμογές (βιβλιθήκη προγραμμάτων ευθειών)

Μερικά προγράμματα που λύνουν ασκήσεις της αναλυτικής γεωμετρίας.

> restart; #παράλληλος από σημείο προς ευθεία

> paraToLine:= proc(line::list,point::list)

> local x, newLine;

> x:= line[1]*point[1]+line[2]*point[2];

> newLine:=[line[1],line[2],-x];

> end;

To επόμενο πρόγραμμα υπολογίζει τους συντελεστές της ευθείας της ορθογώνιας σε δοθείσαν που διέρχεται από σημείο:

> orthoToLine:= proc(line::list, point::list)

> local x, newLine;

> x:= -line[2]*point[1]+line[1]*point[2];

> newLine:=[-line[2],line[1],-x];

> end;

To επόμενο υπολογίζει την ευθεία που διέρχεται από δύο σημεία

> line2pts:= proc(p1::list, p2::list)

> local x, a1, a2, newLine::list;

> a1:= p1[1]-p2[1]; a2:=p1[2]-p2[2];

> newLine:=[-a2,a1,1];

> newLine:=paraToLine(newLine,p1);

> end;

>

>

>

8.4 Εφαρμογή (βιβλιοθήκη για κύκλους)

> with(geometry):

Το επόμενο πρόγραμμα ευρίσκει την ακτίνα κύκλου (πραγματική ή φανταστική).

>

>

> radi:= proc(cir::list)

> sqrt( (cir[1]^2+cir[2]^2)/4-cir[3] );

> end;

>

> radi([10,4,14]);

>

To επόμενο δείχνει αν ο κύκλος έχει πραγματική ακτίνα ή όχι:

>

> isReal:= proc(cir::list)

> type( radi(cir), realcons );

> end;

>

> isReal([1,1,3]); isReal([4,2,3]);

>

To επόμενο εξετάζει αν η ακτίνα είναι πραγματική, και αν ναι, σχεδιάζει τον κύκλο

>

> drawCir:= proc( cir::list )

> local c, ct, rad;

> rad:=radi(cir);

> if type(rad, realcons) then

> point(ct,-cir[1]/2,-cir[2]/2);

> circle(c,[ct,rad]);

> draw([ct,c], thickness = [4,2]);

> fi;

> end;

>

> drawCir([4,2,3]);

>

>

>

To επόμενο ευρίσκει τα σημεία τομής ευθείας και κύκλου

> type lineCircle:= proc(line::list, circle::list)

> local x, y, f1, f2, intPnts::list;

> f1:= line[1]*x+line[2]*y+line[3];

> f2:= x^2+y^2+circle[1]*x+circle[2]*y+circle[3];

> intPnts:=[allvalues(solve({f1,f2},{x,y}))];

> end;

> # συγκεκριμένο παράδειγμα

> lineCircle([1,1,1],[-1,1,-16]);

>

H επόμενη συνάρτηση επιστρέφει το πλήθος των σημείων τομής ευθείας και κύκλου:

> nPtsLineCircle:= proc(line::list, circle::list)

> nops(lineCircle(line,circle)); end;

> nPtsLineCircle([1,1,1],[-1,1,-16]);

H επόμενη συνάρτηση επιστρέφει το ι-στο σημείο τομής εφ όσον υπάρχει:

>

> iPtLineCircle := proc(line::list, circle::list, i::integer)

> local nSols, x, y, f1, f2, intPnts::list;

> f1:= line[1]*x+line[2]*y+line[3];

> f2:= x^2+y^2+circle[1]*x+circle[2]*y+circle[3];

> intPnts:=[allvalues(solve({f1,f2},{x,y}))];

> nSols:= nops(intPnts);

> if i<=nSols then subs(intPnts[i], [x,y]); fi;

> end;

> iPtLineCircle([1,1,1],[-1,1,-16],2);

>

H επόμενη συνάρτηση επιστρέφει το κέντρο και την ακτίνα ενός κύκλου:

> centRad:= proc(cir::list)

> local cr::list;

> cr:=[-cir[1]/2, -cir[2]/2, sqrt( (cir[1]^2+cir[2]^2)/4-cir[3] )];

> end;

>

> centRad([-1,1,-16]);

>

>

8.5 Κατασκευή πακέτου προγραμμάτων (package)

Tα προηγούμενα προγράμματα μπορούν να καταχωρηθούν σε ένα πακέτο προγραμμάτων και να χρησιμοποιούνται όπως οποιοδήποτε άλλο πακέτο της Maple. Η διαδικασία κατασκευής πακέτου είναι η εξής:

> restart;

> analytic:= table(); # δηλώνει το όνομα του πακέτου

>

> # ακολουθούν τα προγράμματα του πακέτου

> analytic[paraToLine]:= proc(line::list,point::list)

> local x, newLine;

> x:= line[1]*point[1]+line[2]*point[2];

> newLine:=[line[1],line[2],-x];

> end;

>

> analytic[orthoToLine]:= proc(line::list, point::list)

> local x, newLine;

> x:= -line[2]*point[1]+line[1]*point[2];

> newLine:=[-line[2],line[1],-x];

> end;

>

>

> analytic[line2pts]:= proc(p1::list, p2::list)

> local x, a1, a2, newLine::list;

> a1:= p1[1]-p2[1]; a2:=p1[2]-p2[2];

> newLine:=[-a2,a1,1];

> newLine:=paraToLine(newLine,p1);

> end;

>

> # ακολουθούν και άλλα προγράμματα ... .......

>

> # τέλος το σύνολο των προγραμμάτων αποθηκεύεται σε ένα αρχείο ...

>

> save( analytic, "C:/Program Files/Maple 6/Users/Pamfilos/analytic.m");

> restart;

>

>

>

Αυτή ήταν η διαδικασία κατασκευής και αποθήκευσης του πακέτου analytic. Τώρα για την χρήση της βιβλιοθήκης:

χρειάζεται α) η πληροφορία για το που βρίσκεται το πακέτο:

> libname:= "C:/Program Files/Maple 6/Users/Pamfilos", libname;

>

και β) η εγκαινίαση, όπως με οποιοδήποτε πακέτο της Maple:

> with(analytic):

>

>