Top Banner
Trang 1 CHƯƠNG TRÌNH CON 1. Lợi ích của dùng chương trình con (CTC) - Chương trình có nhiều phân đoạn mỗi phân đoạn thực hiện một chức năng nào đó {khi đó ta sử dụng CTC để làm các phân đoạn trên} - Trong chương trình, có những đoạn cần phải lập đi, lập lại nhiều lần ở những chỗ khác nhau. Để tránh phải viết lại các đoạn đó người ta thường phân chương trình ra thành nhiều CTC - Một tiện lợi khác của việc sử dụng CTC là ta có thể dễ dàng kiểm tra tính đúng đắn của nó trước khi ráp nối vào chương trình chính. Do đó việc xác định sai sót và tiến hành điều chỉnh trong chương trình sẽ thuận lợi hơn. CTC là một đoạn chương trình thực hiện trọn vẹn hay một chức năng nào đó. Trong Pascal, có 2 dạng CTC: - Hàm (Function) - Thủ tục (Procedure) 2. Khai báo CTC - Nhắc lại cấu trúc của một chương trình PROGRAM Tên_chương_trình; {Tên chương trình} USES ...; {Khai báo thư viện} CONST ...; {Khai báo hằng} TYPE ...; {Khai báo kiểu} VAR ...; {Khai báo biến} Khai báo CTC BEGIN {Chương trình chính} <các lệnh>; END. Như vậy phần khai báo CTC nằm ở phần cuối của phần khai báo. a. Khai báo và lời gọi thủ tục
16

Tài liệu BD HSG: Chương trình con trong Pascal

Dec 07, 2015

Download

Documents

dovannho

Tài liệu biên soạn để bồi dưỡng HSG môn Tin học cấp THCS
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 1

CHƯƠNG TRÌNH CON

1. Lợi ích của dùng chương trình con (CTC)

- Chương trình có nhiều phân đoạn mỗi phân đoạn thực hiện một chức năng nào đó {khi đó ta sử dụng CTC để làm các phân đoạn trên}

- Trong chương trình, có những đoạn cần phải lập đi, lập lại nhiều lần ở những chỗ khác nhau. Để tránh phải viết lại các đoạn đó người ta thường phân chương trình ra thành nhiều CTC

- Một tiện lợi khác của việc sử dụng CTC là ta có thể dễ dàng kiểm tra tính đúng đắn của nó trước khi ráp nối vào chương trình chính. Do đó việc xác định sai sót và tiến hành điều chỉnh trong chương trình sẽ thuận lợi hơn.

CTC là một đoạn chương trình thực hiện trọn vẹn hay một chức năng nào đó.

Trong Pascal, có 2 dạng CTC:

- Hàm (Function)

- Thủ tục (Procedure)

2. Khai báo CTC

- Nhắc lại cấu trúc của một chương trình

PROGRAM Tên_chương_trình; {Tên chương trình}

USES ...; {Khai báo thư viện}

CONST ...; {Khai báo hằng}

TYPE ...; {Khai báo kiểu}

VAR ...; {Khai báo biến}

Khai báo CTC

BEGIN {Chương trình chính}

<các lệnh>;

END.

Như vậy phần khai báo CTC nằm ở phần cuối của phần khai báo.

a. Khai báo và lời gọi thủ tục

Page 2: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 2

- Khai báo:

PROCEDURE <tên thủ tục>(Danh sách các tham số);

[Khai báo Const, Type, Var]

BEGIN

<các câu lệnh>;

END;

Ví dụ:

Procedure inso(n:integer);

var i:inteher;

Begin

for i:=1 to n do

write(i:5);

end;

- Lời gọi thủ tục

<tên thủ tục>(danh sách các tham số thực);

Ví dụ:

inso(6);

b. Khai báo và lời gọi hàm

- Khai báo

FUNCTION <tên hàm>(Danh sách các tham số):<Kiểu dữ liệu>;

[Khai báo Const, Type, Var]

BEGIN

<các lệnh trong thân hàm>;

<tên hàm>:=<Giá trị>;

END;

Chú ý: luôn có phép gán tên hàm cho giá trị để hàm trả về giá trị khi được gọi

Ví dụ: Tính tổng của 2 số x và y

Function Tong(x,y:Longint): Longint;

var s: Longint;

begin

s:=x+y;

Tong:=s;

end;

Page 3: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 3

- Lời gọi hàm

<tên hàm>(danh sách các tham số thực);

Ví dụ:

Tong(4,5);

3. Biến toàn cục và biến cục bộ

- Biến toàn cục (biến công cộng) là biến được khai báo trong chương trình chính. Các biến này có thẻ được dùng ở mọi nơi trong chương trình và tồn tại trong suốt thời gian làm việc của chương trình.

- Biến cục bộ (biến địa phương) là các biến được khai báo trong CTC. Các biến này chỉ được sử dụng trong phạm vi CTC mà nó được khai báo. Sau khi kết thúc CTC các biến này sẽ không còn tồn tại.

Ví dụ:

PROGRAM vidu;

Var a,b,c:integer; {3 biến toàn cục}

PROCEDURE Thutuc(n:Integer);{n là biến cục bộ}

Var i:Integer; {i là biến cục bộ}

Begin

For i:=1 To 10 Do Writeln(i);

End;

BEGIN

a:=5;b:=6;c:=8;

Thutuc( a);

Thutuc( b);

Thutuc( c);

Readln;

END.

– Trong trường họp biến cục bộ trùng tên với biến toàn cục thì máy không bị nhầm lẫn mà sẽ thực hiện trên biến cục bộ. Biến toàn cục không bị ảnh hưởng.

Page 4: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 4

Ví dụ:

PROGRAM vidu;

Var a,b:integer; {3 biến toàn cục}

PROCEDURE Thutuc(a:Integer);{n là biến cục bộ}

Var b:Integer; {i là biến cục bộ}

Begin

b:=a; a:=a+b;

Writeln(‘b= ’,b); //(1)

Writeln(‘a= ’,a); //(2)

End;

BEGIN

a:=5;b:=6;

Thutuc(a);

Writeln(‘b= ’,b); //(3)

Writeln(‘a= ’,a); //(4)

Readln;

END.

Kết quả ra màn hình như sau:

b= 5 //(1)

a= 10 //(2)

b= 6 //(3)

a= 5 //(4)

4. Cách truyền tham số trong chương trình con

- CTC không cần có tham số (sau tên CTC) nếu không dùng đến chúng hoặc dùng trực tiếp biến toàn cục

- Khi truyền tham số các tham số trong lời gọi CTC phải đúng thứ tự và kiểu tương ứng với khi khai báo ctc.

Ví dụ:

Procedure inso(a:integer; ch:char);

begin

{các lệnh của CTC}

end;

Cách gọi CTCT

inso(13,’a’); //lời gọi đúng

inso(‘a’,13); //lời gọi sai vì không đúng kiểu

inso(13); //lời gọi sai vì thiếu tham số

Page 5: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 5

- Tham số hình thức (đối) là các tham số sau tên hàm và thủ tục trong khai báo CTC.

- Tham số thực sự là các tham số sau tên hàm và thủ tục trong lời gọi CTC.

- Tham biến là các tham số được khai báo sau từ khóa Var. Các tham số thực phải là các biến chứ không được là giá trị. Tham biến có thể được thay đổi trong CTC và sau khi ra khỏi CTC nó vẫn giữ giá trị thay đổi đó.

- Tham trị là các tham số được khai báo mà không đứng sau từ khóa Var. Các tham số thực có thể là các giá trị, hằng, biến. Tham trị có thể thay đổi trong CTC nhưng sau khi kết thúc CTC giá trị của nó trở về như ban đầu.

5. Phân biệt cách sử dụng hàm và thủ tục

Hàm khác thủ tục ở chỗ hàm trả về một giá trị cho lệnh gọi thông qua tên hàm còn thủ tục thì không.

* Dùng hàm

- Kết quả của bài toán trả về 1 giá trị duy nhất (kiểu vô hướng, kiểu string hoặc kiểu con trỏ).

- Lời gọi CTC cần nằm trong các biểu thức tính toán.

* Dùng thủ tục

- Kết quả của bài toán không trả về giá trị nào hoặc trả về nhiều giá trị hoặc trả về kiểu dữ liệu có cấu trúc (Array, Record, File)

- Lời gọi CTC không nằm trong các biểu thức tính toán.

Page 6: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 6

Bài tập mẫu

Bài tập 01: Viết chương trình có sử dụng CTC để tìm giá trị lớn nhất (Max) của 2 số thực a, b, c.

Ví dụ:

a=5; b=8; c=6 thì Max là 8

Hướng dẫn: Tìm Max của 3 số thì kết quả trả về một giá trị nên dùng CTC kiểu hàm.

Var a,b,c:Real;

Function Max(x,y,z:Real):Real;

Begin

Max := x;

If Max < y Then Max:=y;

If Max < z Then Max:=z;

End;

Begin

Write(‘Nhap a=’); Readln(a);

Write(‘Nhap b=’); Readln(b);

Write(‘Nhap c=’); Readln(c);

Writeln(‘Max cua 3 so la: ’, Max(a,b,c):0:2);

Readln;

End.

Bài tập 02: Viết chương trình có sử dụng CTC để hoán đổi hai giá trị x,y cho nhau.

Ví dụ:

a=5; b=8. Sau khi hoán đổi thì a=8; b=5

Hướng dẫn: Hoán đổi giá trị của hai số thì kết quả trả về hai giá trị nên dùng CTC kiểu thủ tục.

Var a,b:Longint;

Function Swap(x,y: Longint);

Var Tam: Longint;

Begin

Tam:=x; x:=y; y:=Tam;

Writeln(‘Trong khi hoan doi: x=’, x,‘ y=’,y);

End;

Begin

Page 7: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 7

Write(‘Nhap a=’); Readln(a);

Write(‘Nhap b=’); Readln(b);

Swap(a,b);

Writeln(‘Sau khi hoan doi: a=’, a,‘ b=’,b);

Readln;

End.

Chú ý: - Chương trình trên khi thực hiện thì kết quả trong thủ tục

cho kết quả đúng (đã hoán đổi giá trị của hai số cho nhau) nhưng ra khỏi thủ tục thì kết quả trả lại như ban đầu.

- Nguyên nhân là tham số hình thức x, y của CTC Swap là tham trị nên giá trị không thay đổi khi ra CTC. Ta đổi tham số hình thức x, y thành tham biến như sau: Function Swap(Var x,y: Longint);

Bài tập 03: Viết chương trình có sử dụng CTC để phân tích số nguyên dương N ra thành thừa số nguyên tố.

Ví dụ:

N=100 thì in ra ra 2*2*5*5 vì 100=2*2*5*5

N=13 thì in ra 13 vì 13 là số nguyên tố

Hướng dẫn: Phân tích thừa số nguyên tố thì kết quả trả về là một dãy số nên dùng CTC kiểu thủ tục.

Var n:Longint;

Procedure PHANTICH(n: Longint);

Var i: Longint;

Begin

Write(n,' = ');

i:=2;

While n<>1 Do

Begin

While n MOD i=0 Do

Begin

If n=i Then Writeln(i)

Else Write(i,'*');

n:=n Div i;

Page 8: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 8

End;

i:=i+1;

End;

End;

Begin

Write('Nhap n='); Readln(n);

PHANTICH(n);

Readln;

End.

Bài tập 04: Viết chương trình có sử dụng CTC để nhập vào một dãy gồm N số nguyên, in ra màn hình các số nguyên tố có trong dãy?

Ví dụ:

Nhập vào 10 số nguyên: 8 13 -9 23 19 39 -11 4 7 100

In ra màn hình các số nguyên tố: 13 23 19 7

Hướng dẫn:

- Sử dụng CTC dạng thủ tục để nhập dữ liệu vào cho mảng.

- Sử dụng CTC dạng hàm để kiểm tra một số nguyên có phải số nguyên tố hay không.

- Duyệt từng phần tử của mảng, kiểm tra xem phần tử A[i] có phải số nguyên hay không, nếu là số nguyên tố thì in A[i] ra màn hình.

Var A:Array[1..100] of Longint;

N,i:Longint;

Procedure Nhap_Mang;

Begin

Write('Nhap N: ');Readln(N);

For i:=1 To N Do

Begin

Write('A[',i,']: ');Readln(A[i]);

End;

End;

Page 9: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 9

Function Ngto(x:Longint):Boolean;

Var i:Longint;

Begin

Ngto:=True;

If x<2 Then Ngto:=False;

For i:=2 To x Div 2 Do

If x Mod 2 = 0 Then Ngto:=False;

End;

Begin

Nhap_Mang;

For i:=1 To N Do

If Ngto(A[i]) Then Write(A[i],' ');

Readln;

End.

Bỏ câu lệnh Var i:Longint; trong CTC Ngto rồi chạy chương

trình xem kết quả như thế nào?

Bài tập 05: Viết chương trình có sử dụng CTC để hoán đổi giá trị của hai biến a và b cho nhau.

Var a,b:Longint;

Procedure Swap(Var x,y: Longint);

Var Tam: Longint;

Begin

Tam:=x; x:=y; y:=Tam;

End;

Begin

Write('Nhap a='); Readln(a);

Write('Nhap b='); Readln(b);

Write('Cac so truoc khi hoan doi:');

Writeln('a=',a,'; b=',b);

Swap(a,b);

Write('Cac so sau khi hoan doi:');

Page 10: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 10

Writeln('a=',a,'; b=',b);

Readln;

End.

Bỏ từ khóa Var câu lệnh Swap x,y:Longint; rồi chạy chương

trình xem kết quả như thế nào?

Bài tập 06: Viết chương trình có sử dụng CTC để chuyển đổi một số nguyên N từ hệ thập phân sang hệ nhị phân.

Ví dụ:

30(10)=11110(2)

65(10)=100001(2)

Hướng dẫn:

- Để chuyển số N từ hệ thập phân sang hệ nhị phân ta thực hiện như sau: Lấy N chia cho 2 lấy phần dư, chia xong ta được thương mới, ta thực hiện tương tự với thương mới cho đến khi thương bằng không thì dừng. Ghi các số dư theo thứ tự ngược lại ta được kết quả của phép chuyển đổi. (Xem hình)

- Kết quả là dãy số 0,1 nên ta dùng kiểu String để lưu trữ.

Page 11: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 11

Var n:Longint;

Function DecToBin(x:Longint):String;

Var KQ:String;

du:Longint;

Begin

KQ:='';

While x>0 Do

Begin

du:=x mod 2;

x :=x Div 2;

KQ:=chr(du+48)+KQ;

End;

DecToBin:=KQ;

End;

Begin

Write('Nhap N: ');Readln(N);

Writeln(N, ' = ',DecToBin(N));

Readln;

End.

Bài tập 07: Viết chương trình có sử dụng CTC để tìm ƯSCLN của hai số nguyên dương M và N.

ƯSCLN (M,N) là ước số K lớn nhất mà M và N đều chia hết. Như M=10, N=25 có các ước số chung là 1; 5 thì ƯSCLN là 5.

Ví dụ:

ƯSCLN (10,25)=5 hay ƯSCLN (10,27)=1

Hướng dẫn:

Cách 1: Thử mọi trường i, nếu M và N cùng chia hết i thì K:=i;

Cách 2: Dùng thuật toán Ơ-Clit (Euclid) tìm ƯSCLN(M,N)

Bước 1: Nếu N=0 Thì chuyển sang Bước 3

Bước 2: R :=M Mod N; //Lấy số dư của M chia cho N

Page 12: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 12

M:=N; //M lấy giá trị của N

N:=R; //N lấy giá trị phép dư M Mod N

quay lại Bước 2.

Bước 3: ƯSCLN là M;

Cách 1:

Var M,N,K,i:Longint;

Function UCLN(a, b: Longint): Longint;

Begin

For i:=1 To a Do

If (a Mod i=0) And (b Mod i=0) Then K:=i;

UCLN:=K;

End;

Begin

Write('Nhap M: ');Readln(M);

Write('Nhap N: ');Readln(N);

Writeln('UCLN(',M,';',N,')=',UCLN(M,N));

Readln;

End.

Thực hiện chương trình và nhập hai số với M=200000000 và N=1999999999 rồi xem kết quả như thế nào.

Cách 2: Thay hàm UCLN như sau:

Function UCLN (a, b: Longint): Longint;

Var r:Longint;

Begin

While b > 0 Do

Begin

r:= a Mod b;a:= b;b:= r;

End;

UCLN:= a;

End;

Page 13: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 13

Thực hiện chương trình và nhập hai số với M=200000000 và N=1999999999 rồi xem kết quả như thế nào, so sách với cách 1.

Bài tập tự giải

Bài tập 08: Viết chương trình có sử dụng CTC để nhập vào một dãy gồm N số nguyên, in ra màn hình các số Palindrom có trong dãy?

Ví dụ:

Nhập vào 8 số nguyên: 818 19 23 219 939 211 47 1001

In ra màn hình các số Palindrom: 818 939 1001

Hướng dẫn:

Viết hàm kiểm tra một số có phải là số Palindrom hay không (Chuyển sang String để kiểm tra có phải xâu đối xứng hoặc đảo ngược số cần kiểm tra)

Function Dao_nguoc(x:Longint):Longint;

Var y:Longint;

Begin

y:=0;

While x > 0 Do

Begin

y:=y*10 + x Mod 10;

x:=x Div 10;

End;

Dao_nguoc:=y;

End;

Bài tập 09: Viết chương trình có sử dụng CTC để nhập vào một dãy gồm N số nguyên, in ra màn hình số Palindrom lớn nhất có trong dãy cùng vị trí xuất hiện của chúng?

Ví dụ:

Nhập vào 8 số nguyên: 818 19 23 219 9339 211 47 1001

Page 14: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 14

In ra màn hình các số Palindrom: 9339 tại vị trí 5

Bài tập 10: Viết chương trình có sử dụng CTC để tìm BSCNN của hai số nguyên dương M và N.

BSCNN(M,N) là bội số K nhỏ nhất mà K đều chia hết cho M và N. Như M=10, N=25 thì BSCNN là 50.

Ví dụ:

BSCNN (10,25)=50 hay BSCNN (10,27)=270

Hướng dẫn:

BSCNN(M,N)=M*N Div ƯSCLN(M,N)

Bài tập 11: Viết chương trình có sử dụng CTC để rút gọn phân số (phân số tối giản) của hai số nguyên dương Tu và Mau.

5

2

5:25

5:10

25

10

Mau

Tu

Ví dụ:

Nhập vào Tu=10; Mau=25 thì in ra màn hình 2/5

Hướng dẫn:

),(:

),(:

MauTuUCLNMau

MauTuUCLNTu

Mau

Tu

Bài tập 12: Viết chương trình có sử dụng CTC để nhập vào một dãy gồm N số nguyên, in ra màn hình tổng các chữ số?

Ví dụ:

Nhập vào 8 số nguyên: 88 19 23 21 93 26 47 1001

In ra màn hình 16 10 5 3 12 8 11 2

Hướng dẫn:

Viết hàm tính tổng các chữ số của một số nguyên. Dùng hàm này để in tổng các chữ số của từng số có trong dãy.

Page 15: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 15

Bài tập 13: Viết chương trình có sử dụng CTC để nhập vào một dãy gồm N số nguyên, in ra màn hình các số trong dãy có các chữ số tăng dần?

Ví dụ:

Nhập vào 8 số nguyên: 88 1249 243 251 1234 26 47 1001

In ra màn hình 1249 1234 26 47

Hướng dẫn:

Viết hàm kiểm tra một số có phải là có các chữ số tăng dần không?

Function CS_Tang(x:Longint):Boolean;

Var t,s:Longint;

Begin

s := x Mod 10;

x := x Div 10;

While x > 0 Do

Begin

t := x Mod 10;

x:=x Div 10;

If t >= s Then Exit(False);

s := t;

End;

Exit(True);

End;

Bài tập 14: Viết chương trình có sử dụng CTC để in ra N số Fibonaci đầu tiên.

Hai số Fibonaci đầu tiên đều là 1, số thứ 3 trở đi thì bằng tổng của 2 số trước.

Ví dụ:

N=10 thì in 1 1 2 3 5 8 13 21 34 55

Hướng dẫn:

Ta dùng mảng F[i] để lưu lại số Fibonaci thứ I, ta có

Page 16: Tài liệu BD HSG: Chương trình con trong Pascal

Trang 16

F[1]:=F[2]:=1;

F[i]:=F[i-2]+F[i-1] với i≥3.

Số F[N] là số cần tìm.

Bài tập 15: Viết chương trình có sử dụng CTC để nhập vào một dãy gồm N số nguyên, in ra màn hình số có tổng các chữ số lớn nhất. Nếu có nhiều số cùng có tổng các chữ số lớn nhất thì in tất cả?

Ví dụ:

Nhập vào 8 số nguyên: 88 19 23 21 93 26 47 1861

In ra màn hình 88 1861

Bài tập 16: Viết chương trình có sử dụng CTC để nhập vào một dãy gồm N số nguyên, in ra màn hình số nguyên tố có tổng các chữ số lớn nhất. Nếu có nhiều số nguyên tố cùng có tổng các chữ số lớn nhất thì in tất cả?

Ví dụ:

Nhập vào 8 số nguyên: 88 19 23 21 93 26 37 91

In ra màn hình 19 37 91