Giải và biện luận phương trình ax+b= 0 với a=4.5, b=13.5, và với các cặp a, b tạo bởi a=-1, a=0, a=1, b=0, b=1, b=2.
Ta viết một thủ tục có nhiệm vụ giải và biện luận phương trình ax+b=0 với hai tham số a, b tùy ý, và gọi thực hiện thủ tục này 10 lần ứng với các giá trị cụ thể của a, b cho trong gỉa thiết.
PROGRAM VIDU15_4;
{Giải phương trình AX+B=0 bằng thủ tục}
Uses Crt;
Var
i, j: integer;
Procedure Giaipt(a, b: Real);
Begin
Writeln(‘Giải phương trình: ‘, a:4:1, 'x+’, b:4:1, '=0');
If a<>0 then
Writeln(‘Nghiem x=', -b/a:4:2) else
if b<>0 then
Writeln(‘Vo nghiem') else
Writeln(‘Vo so nghiem');
End;
BEGIN {Thân chương trình chính}
Clrscr;
Writeln(‘KẾT QUẢ GIẢI CÁC P.TRÌNH:’);
Giaipt(4.5, 13.5);
For i:=-1 to 1 do For j:=0 to 2 do
Giaipt (i, j);
Readln;
END.
Khi gọi Giaipt(4.5, 13.5); là ta yêu cầu máy thực hiện thủ tục Giaipt với tham số a=4.5 và b=13.5. Hai vòng lặp For xác định 9 cặp giá trị i, j cụ thể, và cứ mỗi lần nhưvậy lại gọi thực hiện thủ tục Giaipt với tham số a=i, b=j tươngứng:
For i:=-1 to 1 do For j:=0 to 2 do
Giaipt (i, j);
Do tách riêng việc giải phương trình ax+b=0 thành một thủ tục nên số lệnh trong thân chương trình chính giảm đi, nổi bật được thuật toán chính của chương trình.
Ở đây, ta chọn chương trình con Giaipt là thủ tục chứ không phải là hàm vì phương trình ax+b=0 có thể vô nghiệm hoặc vô số nghiệm (khi a=0). Thành ra ta không tìm được một giá trị thích hợp để gán cho tên hàm. Vậy kết quả giải phương trình phải xuất ra ngay trong chương trình con, đó là công việc của thủ tục.
+ Ví dụ 15_5
Nhập vào một mảng A1, A2,...,An, sắp xếp dãy tăng rồi in
Có thể chia bài toán ra thành ba công việc lớn sau:
a- Nhập dãy A1, A2,...,An,
b- Sắp xếp dãy A1, A2,...,An, tăng c- In dãy A1, A2,...,An, lên màn hình
Mỗi công việc a, b, c thuộc về một lĩnh vực riêng nên có thể xây dựng thành các thủ tục độc lập với nhau. Ðể liên kết chúng lại, trong chương trình chính, ta chỉ cần gọi tên các thủ tục này theo thứ tự a, b, c với các tham số thích hợp.
Khi thiết kế thủ tục sắp xếp dãy tăng, có một việc phải làm nhiều lần là đổi chỗ hai phần tử A[i] và A[j] nên cũng có thể xây dựng thành một thủ tục gọi tên là Ðổichỗ, nó lại là chương trình con của thủ tục sắp xếp. Chương trình cụ thể nhưsau:
PROGRAM VIDU15_5;
{Sắp xếp dãy A tăng dần bằng thủ tục}
Uses CRT;
Type
Kmang = Array[1..20] of Real;
Var
N: Integer;
A: Kmang;
Procedure Nhap(Var X: Kmang; N: Integer; ten:
Char);
Var
i: Integer;
Begin
For i:=1 to N do {nhập mảngX}
Begin
Write(‘Nhập‘,ten ,‘[‘,i ,‘]:‘);
Readln(X[i]);
End;
End;
Procedure SapTang(Var X: Kmang; N: Integer);
{Sắp dãy X tăng}
Var
i, j: Integer;
Procedure Doicho(Var u, v: Real);
{hoán vị các giá trị của u và v}
Var
Tam: Real;
Begin
Tam:=u;
u:=v;
v:=Tam;
End; {HếtDoicho}
Begin {Vào Saptang}
For i:=1 to N-1 do For j:=i+1 to N do
If X[i]>X[j] then
Doicho(X[i], X[j]);
End; {HetSaptang}
Procedure Inday(Chugiai: String; X: Kmang; N:
Integer);
{In dãy X lên màn hình}
Var
i: Integer;
Begin
Writeln(Chugiai);
For i:=1 to N do write(X[i]:5:1);
writeln;
End;
BEGIN {chương trình chính}
Clrscr;
Repeat
Write(‘Nhập số phần tử N: ‘);
Readln(N);
Until (N>0) and ( N<21);
Nhap(A, N, ‘A’);
Inday(‘Dãy chưa sắp là: ‘, A, N);
SapTang( A, N);
Inday(‘Dãyđã sắp tăng là: ‘, A, N);
Readln;
END.
Thủ tục Nhap có ba tham số hình thức là X, N và ten, nhiệm vụ của nó là nhập dữ liệu cho mảng X gồm N phần tử.
Tương tự, thủ tục Saptang có nhiệm vụ sắp xếp N phần tử của dãy X thành dãy tăng. Thủ tục Indaysẽ in N phần tử của dãy X sau khiđã in lời giải thích chứa trong tham số chugiai.
Thủ tục Saptang chứa một thủ tục con làDoicho, có nhiệm vụ hoán vị các giá trị của hai biến u, v bất kỳ. Doicholà chương trình con của thủ tục Saptang.
Khi một tham số được khai báo trong chương trình con, nó có thể có hoặc không có từ khóa Varở đằng trước. Ví dụ trong thủ tục Saptang, tham số X đi sau từ khóa Var, còn tham số N thì không. X gọi là tham số biến còn N gọi là tham số trị. Sự khác nhau giữa hai loại tham số này sẽ được trình bày kỹ ở phần sau.