Bài giảng Môn Tin học lớp 11 - Chương trình con

 UCLN (A1.An) = UCLN( UCLN(A1.An-1) ,An)

 BCNN (A1.An) = BCNN( BCNN(A1.An-1) ,An)}

uses crt;

var

 a,i,n:integer;{a,i,n kiÓu integer}

 u,b:integer;{u,b kiÓu integer (biÕn l­u UCNN,BCNN)}

function ucln(a,b:integer):integer;

 begin

 while a<>b do{Trong khi a<>b th×}

 if a>b then a:=a-b else b:=b-a;{NÕu a>b th× g¸n a=a-b ng­îc l¹i g¸n b=b-a}

 ucln:=a;{G¸n ucln b»ng a}

 end;

 

doc9 trang | Chia sẻ: rimokato | Lượt xem: 1769 | Lượt tải: 2download
Bạn đang xem nội dung tài liệu Bài giảng Môn Tin học lớp 11 - Chương trình con, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
CHƯƠNG TRìNH CON
I. Khái niệm về chương trình con (Sub-program)
 	Trong khi lập trình chúng ta thường gặp những đoạn chương trình lặp đi lặp lại nhiều lần ở những chỗ khác nhau. Để tránh rườm rà những đoạn chương trình này được thay thế bằng các chương trình con tương ứng. Khi cần, ta chỉ cần gọi tên chương trình con đó ra.
 Lý do thứ hai để xây dựng chương trình con: Một vấn đề lớn và phức tạp sẽ tương ứng với một chương trình có thể rất lớn và dài. Do đó việc sửa chữa chương trình sẽ rất khó khăn. Ta có thể phân tích nó thành các vấn đề nhỏ hơn, để dễ kiểm tra, sau đó ghép lại thành một chương trình lớn.
II. PROCEDURE và FUNCTION (Thủ tục và Hàm)
 	Trong Pascal có hal loại CTC :
 	 - PROCEDURE (thủ tục)
 - FUNCTION (hàm)
 Sự khác nhau cơ bản và duy nhất của hai loại CTC này là FUNCTION trả lại một giá trị kết quả vô hướng thông qua tên function và do đó nó có thể sử dụng như một biến, hằng biểu thức. Còn PROCEDURE không trả lại kết quả thông qua tên của biểu thức nên procedure không thể viết trong biểu thức.
 VD : Các PROCEDURE cơ bản của Pascal
 - Writeln
 - Readln
 _ Textcolor
 Các FUNCTION cơ bản
 - Sin(x) : trả về giá trị kiểu thực
 - Chr(i) : trả về giá trị kiểu Char
III. Cấu trúc của một chương trình con
 {Phần khai báo của chương trình chính}
 VAR .....
 CONST ....
 {Các chương trình con}
 PROCEDURE Tên_thủ_tục (Khai báo các tham số, nếu cần);
 {Phần khai báo trong CTC}
 BEGIN
 .....
 END;
 FUNCTION Tên_Hàm (khai báo các tham số nếu cần):kiểu dữ liệu;
 {Phần khai báo trong CTC}
 BEGIN
 .....
 END;
 {Chương trình chính}
 BEGIN
 .....
 END.
IV. Chuyển tham số cho chương trình con
 Có 2 cách chuyển tham số :
 - Tham trị (value parameter)
 - Tham biến (variable parameter)
 VD : PROCEDURE Thidu(i,j:integer; VAR x,y:real);
 Tham trị : i,j
 Tham biến : x,y
 Sự khác nhau giữa tham trị và tham biến :
 - Tham trị có thể là hằng, biến, biểu thức. Còn tham biến chỉ có thể là biến
 - Nếu tham trị là biến thì giá trị nó sẽ không thay đổi sau khi CTC thực hiện. Còn tham biến sẽ thay đổi giá trị nếu trong CTC có lệnh làm thay đổi giá trị của nó
 VD :
 * Hàm SIN (X)
 Trong này X là tham trị và ta có thể viết
 - KQ := SIN (1); X=1
 - KQ := SIN (Y*2); X=Y*2
 - KQ := SIN (X); X=X
 Và sau khi thực hiện giá trị của X vẫn không thay đổi.
 * Hàm DEC (X)
 Trong này X là tham biến, ta chỉ có thể viết
 - DEC (X); X là biến kiểu nguyên
 Không thể viết
 - DEC (5); X là hằng
 - DEC (Y*2); X là biểu thức
 Sau khi gọi hàm giá trị của X sẽ thay đổi (giảm đi 1)
V. FUNCTION và cách lựa chọn
 Trong FUNCTION bắt buộc phải có lệnh gán giá trị cho tên hàm
 Tên_hàm := 
 Chúng ta chỉ nên dùng FUNCTION khi và chỉ khi nó đồng thời thoả các điều kiện sau :
 - Nếu ta muốn nhận lại một và chỉ một kết quả
 - Kết quả đó phải là kiểu vô hướng
 Còn nếu không thoả mãn thì chúng ta nên dùng PROCEDURE
 VD : CTC tính bình phương của một số
 FUNCTION Binh_Phuong (X:real):real;
 BEGIN
 Binh_Phuong := X*X;
 END;
 Nếu dùng procedure
 PROCEDUR Binh_Phuong (X:Real; VAR kq:real);
 BEGIN
 kq := X*X;
 END;
 Khi kiểm tra xem tổng bình phương của a và b có bằng c không :
 - Nếu là FUNCTION ta viết :
 IF Binh_Phuong(a)+Binh_Phuong(b) = Binh_phuong(c) THEN
 - Nếu là PROCEDURE ta viết
 Binh_Phuong (a,kqa);
 Binh_Phuong (b,kqb);
 Binh_Phuong (c,kqc);
 IF kqa+kqb=kqc THEN
 Rõ ràng cách dùng FUNCTION có lợi hơn
VI. Biến toàn cục và biến cục bộ
 1. Biến toàn cục
 Là các biến được khai báo trong chương trình chính. Các biến này đều có tác dụng ở mọi nơi trong chương trình.
 2. Biến cục bộ
 Là các biến được khai báo trong chương trình con. Các biến này chỉ có tác dụng trong chương trình con đó. Khi chương trình con kết thúc, các biến này cũng mất tác dụng theo.
3. Chú ý
 Nếu trong CTC có khai báo biến (hằng) trùng với tên biến (hằng) trong chương trình chính thì chương trình con sẽ ưu tiên xử lý biến (hằng) trong chương trình chính. Và khi thoát khỏi chương trình con đó. Giá trị của biến trong chương trình vẫn giữ nguyên giá trị trước khi gọi CTC.
 VD : CONST I=5;
 PROCEDURE THU;
 VAR I : INTEGER;
 BEGIN
 I := 6;Writeln(I);
 END;
 BEGIN
 Writeln(I);THU;Writeln(I);
 END.
 Trên màn hình sẽ xuất hiện
 5 Giá trị biến toàn cục
 6 Giá trị biến địa phương
 5 Giá trị biến toàn cục
VII. Tính đệ quy của chương trình con
Trong PROCEDURE và FUNCTION có thể có lời gọi chính nó. Tính chất này gọi là đệ quy.
 VD : Tính N! qua định nghĩa
 N! = 1.2.3...(n-1).n
 hoặc định nghĩa theo đệ quy N! 	 = 1 khi N=0
 = (n-1)!.n khi N>=1
 Khi đó hàm GIAI_THUA có thể định nghĩa như sau
 FUNCTION GIAI_THUA (n:integer):integer;
 BEGIN
 IF n=0 THEN GIAI_THUA := 1 ELSE GIAI_THUA := n*GIAI_THUA(n-1);
 END;
Bài tập 1:{ Nhập a,b,c là hệ số của một hàm số bậc 2. Sau đó ta nhập X liên tục, ứng với mỗi giá trị của X, ta in ra giá trị của Y tương ứng.
 Chương trình kết thúc khi ta nhập 0
 Hướng dẫn
 Viết chương trình con tính Y tương ứng X}
uses crt;
var
 a,b,c,x:real;{a,b,c,x kiểu real}
function y(x:real):real;
 begin
 y:=a*x*x+b*x+c;{Tính y theo x}
 end;
begin
 clrscr;{Xoá màn hình}
 write('A, B, C = ');readln(a,b,c);{Nhập a,b,c}
 repeat
 write('X = ');readln(x);{Nhập X}
 if x0 then writeln('Y = ',y(x):0:2);{Nếu x0 thì in ra Y tương ứng}
 until x=0;
end.
Bài tập 2:
{ Nhập N. Sau đó nhập N toạ độ A,B của N đường thẳng. In ra màn hình đường thẳng có độ dài lớn nhất.
 Hướng dẫn
 Viết hàm tính độ dài đoạn thẳng với tham số là 2 toạ độ}
uses crt;
var max,xa,ya,xb,yb:real;{max,xa,ya,xb,yb kiểu real}
 i,n:integer;{i,n kiểu integer}
function dodai(xa,ya,xb,yb:real):real;
 begin
 dodai:=sqrt(sqr(xa-xb)+sqr(ya-yb));{Gán dodai bằng độ dài đoạn AB}
 end;
begin
 clrscr;{Xoá màn hình}
 write('N = ');readln(n);{Nhập N}
 max:=0;{Gán max bằng 0}
 for i:=1 to n do{Cho i chạy từ 1 đến N}
 begin
 write('XA, YA, XB, YB = ');readln(xa,ya,xb,yb);{Đọc toạ độ A,B}
 if max<dodai(xa,ya,xb,yb)then max:=dodai(xa,ya,xb,yb);{Nếu max nhỏ hơn độ dài AV thì cập nhật max}
 end;
 writeln('Do dai doan thang dai nhat : ',max:0:2);{Xuất max}
 readln;
end.
Bài tập 3:
{ Nhập N. Sau đó nhập N số hạng. Tính UCLN và BCNN của N số đó.
 Hướng dẫn
 Viết hàm tính UCLN,BCNN giữa 2 số
 UCLN (A1..An) = UCLN( UCLN(A1..An-1) ,An)
 BCNN (A1..An) = BCNN( BCNN(A1..An-1) ,An)}
uses crt;
var
 a,i,n:integer;{a,i,n kiểu integer}
 u,b:integer;{u,b kiểu integer (biến lưu UCNN,BCNN)}
function ucln(a,b:integer):integer;
 begin
 while ab do{Trong khi ab thì}
 if a>b then a:=a-b else b:=b-a;{Nếu a>b thì gán a=a-b ngược lại gán b=b-a}
 ucln:=a;{Gán ucln bằng a}
 end;
function bcnn(a,b:integer):integer;
 begin
 bcnn:=a*b div ucln(a,b);{Tính bcnn}
 end;
begin
 clrscr;{Xoá màn hình}
 write('N = ');readln(n);{Đọc N}
 write('So thu 1 : ');readln(a);{Đọc phần tử thứ 1 vào a}
 u:=a;b:=a;{Gán u,b bằng a}
 for i:=2 to n do{Cho i chạy từ 2 đến n}
 begin
 write('So thu ',i,' : ');readln(a);{Nhập số thứ i vào a}
 u:=ucln(u,a);{Gán u bằng UCLN của u và a}
 b:=bcnn(b,a);{Gán b bằng BCNN của u và b}
 end;
 writeln('UCLN = ',u);
 writeln('BCNN = ',b);
 readln;
end.
{ Nhập N. In ra màn hình các số nguyên tốtừ 1 đến N
 Hướng dẫn
 Viết hàm NGUYENTO(N) trả về giá trị TRUE nếu N nguyên tố}
uses crt;
var
 i,n:integer;{i,n kiểu integer}
function nt(n:integer):boolean;
 var i:integer;{Khai báo i kiểu integer}
 begin
 for i:=2 to trunc(sqrt(n))do{Cho i chạy từ 2 đến trunc(sqrt(n))}
 if n mod i=0 then begin nt:=false;exit;end;{Nếu n chia hết cho i thì gán nt=false;thoát khỏi CT con bằng exit}
 nt:=true;{Gán nt bằng TRUE}
 end;
begin
 clrscr;{Xoá màn hình}
 write('N = ');readln(n);{Đọc N}
 for i:=2 to n do{Cho i chạy từ 2 đến N}
 if nt(i)then write(i:5);{Nếu i ntố thì xuất I}
 readln;
end.
Bài tập 4:
{ Nhập số N. Sau đó nhập N phần tử. In ra phần tử có số ước là lớn nhất
 Hướng dẫn
 Viết hàm TINH(N) trả về số ước của N
 Lưu ý rằng số 0 có số ước lớn nhất trong tất cả mọi số}
uses crt;
var
 i,n:integer;{i,n kiểu integer}
 a,max,luua:integer;{a,max,luua kiểu integer}
function tinh(n:integer):integer;
 var i,souoc:integer;{Khai báo i,souoc kiểu integer}
 begin
 if n=0 then tinh:=maxint{Nếu N=0 thì}
 else{Ngược lại}
 begin
 souoc:=0;{Gán souoc bằng 0}
 for i:=1 to n do{Cho i chạy từ 1 đến N}
 if n mod i=0 then inc(souoc);{Nếu n chia hết cho i thì tăng souoc}
 tinh:=souoc;{Gán tinh bằng souoc}
 end;
 end;
begin
 clrscr;{Xoá màn hình}
 write('N = ');readln(n);{Đọc N}
 max:=0;{Gán max bằng 0}
 for i:=1 to n do{Cho i chạy từ 1 đến N}
 begin
 write('So thu ',i,' : ');readln(a);{Nhập số thứ i vào a}
 if max<tinh(a)then{nếu max < số ước của a thì}
 begin
 max:=tinh(a);{Cập nhật max}
 luua:=a;{Gán luua bằng a}
 end;
 end;
 writeln('So co nhieu uoc nhat la :',luua);{Xuất luua}
 if luua=0 then write('Co vo so uoc')else writeln('Co ',max,' uoc');{Nếu luua=0 thì xuất có vô số ước ngược lại xuất max}
 readln;
end.
Bài tập 5:
{ Viết chương trình hiện ra Menu sau
 0 - Thoat
 1 - Tinh dien tich hinh chu nhat
 2 - Tinh dien tich hinh tron
 3 - Tinh dien tich hinh thang
 Hay an mot so de chon :
 Sau đó ứng với mỗi số bạn hãy viết thủ tục tính diện tích tương ứng}
uses crt;
var
 ch:char;{ch kiểu char}
procedure hcn;
 var a,b:real;{Khai báo a,b kiểu real}
 begin
 write('A, B = ');readln(a,b);{Đọc a,b}
 writeln('Dien tich hcn la : ',a*b:0:2);{Xuất dt}
 readln;
 end;
procedure htron;
 var r:real;{Khai báo r kiểu real}
 begin
 write('R = ');readln(r);{Đọc r}
 writeln('Dien tich hinh tron : ',r*r*3.14:0:2);{Xuất dt}
 readln;
 end;
procedure hthang;
 var a,b,h:real;{Khai báo a,b,h kiểu real}
 begin
 write('Nhap day lon, day be, chieu cao : ');readln(a,b,h);{Đọc a,b,h}
 writeln('Dien tich hinh thang : ',(a+b)*h/2:0:2);{Xuất dt}
 readln;
 end;
begin
 repeat
 clrscr;{Xoá màn hình}
 writeln('0 - Thoat');
 writeln('1 - Tinh dien tich hcn');
 writeln('2 - Tinh dien tich hinh tron');
 writeln('3 - Tinh dien tich hinh thang');
 write('Hay an mot so de chon :');
 repeat ch:=readkey;until(ch='1')or(ch='2')or(ch='3')or(ch='0');{Nhận ch đến khi nào ch='0'..'3'}
 clrscr;{Xoá màn hình}
 case ch of
 '1':hcn;
 '2':htron;
 '3':hthang;
 end;
 until ch='0';
end.
Bài tập 6:{ Viết thủ tục đệ quy đảo các chữ số của một số.
 VD : Đọc vào số : 12345
 In ra : 54321
 Hướng dẫn
 PROCEDURE dao(n:integer);
 Nếu N>0 thì
 Xuất n mod 10;
 Gọi đệ quy dao(n div 10)}
uses crt;
var
 n:integer;{n kiểu integer}
procedure dao(n:integer);
 begin
 if n>0 then{Nếu n>0 thì}
 begin
 write(n mod 10);{In ra hàng đơn vị của n}
 dao(n div 10);{Gọi thủ tục dao(n div 10)}
 end;
 end;
begin
 clrscr;{Xoá màn hình}
 write('N = ');readln(n);{Đọc N}
 dao(n);
 readln;
end.
Bài tập 7:
{ Dãy số Fibonaci là dãy số F1,F2...Fn được tạo ra với công thức
 F1 = F2 = 1
 Fn = Fn-1 + Fn-2 (n>2)
 Hãy nhập số N. Tính Fn
 Hướng dân
 Viết hàm đệ quy FIBO(N) trả về giá trị Fn}
uses crt;
var
 n:integer;{n kiểu integer}
function fibo(n:longint):longint;
 begin
 if n<3 then fibo:=1{Nếu n<3 thì gán fibo=1}
 else fibo:=fibo(n-1)+fibo(n-2);{Ngược lại gán fibo = ...}
 end;
begin
 clrscr;{Xoá màn hình}
 write('N = ');readln(n);{Đọc N}
 writeln(fibo(n));{Xuất fibo(n)}
 readln;
end.
Bài tập 8:{ Viết thủ tục BCC(x,y,k:byte) in ra màn hình bảng cửu chương k tại vị trí x,y}
uses crt;
procedure bcc(x,y,k:byte);
 var i:byte;{Khai báo i kiểu byte}
 begin
 for i:=1 to 10 do{Cho i chạy từ 1 đến 10}
 begin
 gotoxy(x,y+i-1);{nhảy tới vị trí x,y+i-1}
 write(k,' x ',i,' = ',k*i);{Xuất k x i}
 end;
 end;
begin
 clrscr;
 bcc(5,5,3);
 bcc(20,10,9);
 readln;
end.

File đính kèm:

  • docco ban ve CTC.doc