Các dạng bài tập về chương trình con
Thực chất bất cứ bài tập nào chúng ta đều có thể áp dụng chương trình con để giải. Nhưng chúng ta phải suy nghĩ "áp dụng chương trình con có lợi hơn giải thông thường không? Nếu có lợi hơn thì tại sao không áp dụng" Sau đây ta xét một ví dụ rất gần với chúng ta Lập chương trình tính diện tích của 3 tam giác, in ra màn hình diện tích lớn nhất với độ dài 3 cạnh của các hình được nhập vào từ bàn phím. - Với bài này ta phải nhập 3 lần input là số đo 3 cạnh tam giác cho 6 biến và 3 lần tính diện tích tam giác - Thay vì làm như vậy ta sẽ áp dụng chương trình con 1 Procedure nhập và 1 Function tính diện tích Code Var max,a1,b1,c1,a2,b2,c2,a3,b3,c3:real; { -----biến trong chương trình chính-------} {-----Khai báo chương trình con----------} Procedure nhap(var a,b,c:real); begin Write('nhập số đo 3 cạnh tam giác:'); Readln(a,b,c); end; Function dientich(a,b,c:readl):real; Var p:real; Begin p:=(a+b+c)/2; dientich=sqrt(p*(p-a)*(p-b)*(p-c)); End; {-------------Chương trình chính--------------------} BEGIN {----nhập số đo 3 tam giác------} Nhap(a1,b1,c1); nhap(a2,b2,c2); nhap(a3,b3,c3); {------gọi lại hàm tính diện tích để tính diện tích của tam giác 1 và gán cho max---------} max:=dientich(a1,b1,c1); {-----------gọi lại hàm tính diện tích để tính diện tích của tam giác 2 và so sánh với Max---------------} if dientich(a2,b2,c2) > max then max:=dientich(a2,b2,c2); {------------gọi lại hàm tính diện tích để tính diện tích của tam giác 3 và so sánh với Max----------} if dientich(a3,b3,c3) > max then max:=dientich(a3,b3,c3); Write('dien tich lon nhat=',max); Readln END. MỘT SỐ BÀI TẬP ÁP DỤNG CHƯƠNG TRÌNH CON Bài 1: Lập chương trình tính diện tích tam giác khi biết tọa độ 3 đỉnh A(x1,y1), B(x2,y2). C(x3,y3). Với các tọa độ nguyên được nhập vào từ bàn phím. Hướng dẫn: Để tính diện tích tam giác ta sử dụng công thức Hê-rông Với độ dài 3 cạnh được tính từ tọa độ 3 đỉnh: a=BC, b=AC, c=AB như vậy ta sử dụng 1 hàm tính khoảng cách giữa 2 điểm bất kỳ trong hệ trục tọa độ Function k_cach(x1,y1,x2,y2:integer):real; begin k_cach:=sqrt((sqr(x2-x1)+sqr(y2-y1)); end; Bài 2: Lập chương trình tính tổ hợp chập k của n phần tử c=n!/(k!*(n-k)!). Với k,n nguyên được nhập và từ bàn phím kHướng dẫn: ta sử dụng 1 hàm tính giai thừa Function giaithua(n:integer):real; var tg:real; i:byte; Begin tg:=1; for i:=1 to n do tg:=tg*i; giaithua:=tg; End;
Hướng dẫn: ta sử dụng 1 hàm tính lũy thừa Function luythua(x,k:integer):real; var tg:real; i:byte; Begin tg:=1; for i:=1 to k do tg:=tg*x; luythua:=tg; End; Bài 4: Lập chương trình thực hiện các công việc sau:- Lập thủ tục nhập vào 3 số nguyên a,b,c - Lập thủ tục kiểm tra xem 3 số có phải 3 cạnh tam giác hay không, nếu không phải thì yêu cầu nhập lại - Lập Hàm tính diện tích tam giác - Viết thành chương trình hoàn chỉnh và in ra màn hình diện tích tam giác đó. Hướng dẫn: Chú ý khi lập thủ tục kiểm tra. yêu cầu của bài nếu không phải 3 cạnh tam giác thì nhập lại thì ta phải chú ý ở đây phải sử dụng vòng lặp repeat ... until hoặc While ... do Procedure ktra; Begin While not (a+b>c) and (b+c>a) and (a+c>b) do begin Writeln('Ko la 3 canh tam giac! Moi nhap lai'); nhap; end; Writeln('La 3 canh tam giac'); End;
- tìm ucln của 2 số đầu tiên trong dãy và gán cho 1 biến trung gian (tg) - sử dụng biến trung gian này để tìm ucln với lần lượt các phần tử còn lại. ucln tìm được sẽ gán cho biến trung gian lưu trữ - Ucln của dãy số chính là giá trị cuối cùng mà biến trung gian nhân được code: var n,i,tg:integer ; A:aray[1..100] of integer; Function UCLN(m,n:integer):integer; begin while m<>n do if m>n then m:=m-n else n:=n-m UCLN:=m; end; {----------------------------------- hoặc ta có thể dùng hàm sau Function UCLN(m,n:integer):integer; var so_du:integer; begin while n<>0 do begin so_du:= m mod n; m:=n; n:=so_du; end; UCLN:=m; end; -----------------------------------} BEGIN Write('nhap so phan tu :'); readln(n); for i:=1 to n do begin Write('nhap phan tu thui ',i,'='); readln(a[i]); end; tg:=ucln(a[1],a[2]); for i:=3 to n do tg:=ucln(tg,a[i]); Write('ucln của day=',tg); Readln; END.
Created by NgoHung Vấn đề 2: Chương trình con: Thủ tục và HàmBài toán số 2.1: Viết chương trình chuyển đổi số tự nhiên N cho trước sang hệ cơ số 2 bằng việc xây dựng hàm chuyển đổi. Hướng dẫn: - Xây dựng hàm Dec2Bin( ) chuyển đổi từ số tự nhiên sang số nhị phân. o Sử dụng biến S để lưu giá trị số nhị phân của N. Khởi gán bằng 0. o Tiến hành lặp chuyển đổi cơ số: Lặp trong khi mà N > 0 § SoDu = số dư của N chia cho 2. § N = N chia cho 2. § Bổ sung chữ số SoDu vào số S thành một chữ số o Trả về kết quả cuối cùng của S. - Viết thân chöông trình chính với nội dung dùng để kiểm tra kết quả thực hiện của hàm. o Khai báo biến N, M o Thông báo nhập, nhập giá trị cho biến N o Gán giá trị M bằng kết quả trả về của hàm Dec2Bin( N ) o In thông báo về kết quả số nhị phân chuyển đổi được (giá trị của M) o Gọi hàm readln trước khi kết thúc chöông trình Chương trình: Program Doi_Co_So; Uses crt; Var N:integer; { 1. Thu tuc chuyen so tu nhien n cho truoc sang ket qua tra ve he co so 2 } Function Dec2Bin ( n:integer ):integer; Var S,So,Du:integer; Begin S := 0; So := n ; While ( So > 0) do Begin Du := So mod 2 ; So := So div 2 ; S := S * 10 + Du; End; Dec2Bin:= S ; End; { 2. Than chuong trinh chinh dap ung yeu cau bai toan } BEGIN clrscr; write( 'Nhap so N =' ); readln(N ); writeln(' Dang nhi phan cua N la ', Dec2Bin(N) ); readln; END. Bài toán số 2.2: Viết các hàm USCLN(a, b) và BSCNN(a, b). Hướng dẫn: Khai báo hàm USCLN có: Tên hàm: USCLN Kiểu dữ liệu trả về: integer Tham số: 2 tham trị là int a, int b Giá trị trả về: chính là giá trị ước số chung lớn nhất của a và b. Xử lý tìm USCLN, BSCNN: Dựa trên ví dụ đã có ở phần trước. Nội dung hàm: Function USCLN( a, b : Integer) : Integer; Var Sodu:integer; Begin While (b <> 0) do Begin Sodu:= a mod b; a := b; b := Sodu; End; USCLN := a; End; {Tuong tu ham BSCNN(a, b : Integer)} Function BSCNN( a, b : Integer) : Integer; Var k :integer; Begin For k := a to a*b do { Lap voi moi i co gia tri tu a den 1} If ((k mod a = 0) and ( k mod b = 0)) then { Kiem tra a, b cung chia het cho k? } Break; { break de thoat, luu giu lai gia tri cua k.} BSCNN:= k; End; Bài toán số 2.3: Viết hàm kiểm tra số N có phải là số nguyên tố hay không? Hướng dẫn: Khai báo hàm kiểm tra số nguyên tố có: Tên hàm: KiemtraSNT Dữ liệu trả về: int, ( 0 nếu không phải là số nguyên tố, là 1 nếu là số nguyên tố ) Tham số: tham trị là int N, số cần kiểm tra. Xử lý kiểm tra: Dựa trên ví dụ đã có ở phần trước. Nội dung hàm: Function KiemtraSNT( N : Integer ) : Boolean; Var flag : Boolean; i : Integer; Begin flag := True; { Khoi gan gia tri dung cho ktrSNT} For i := 2 to N-1 do { Lap voi moi i co gia tri tu 2 den N-1} If ( N mod i = 0 ) then { Kiem tra xem N co’ chia het cho i hay khong} flag:=false; { Neu dung thi khong con la so nguyen to nua} KiemtraSNT:=flag; End; Cải tiến, không sử dụng biến phụ: Function KiemtraSN( N : Integer ) : Integer; Var i :integer; Begin For i := 2 to N-1 do { Lap voi moi i co gia tri tu 2 den N-1} If ( N mod i = 0 ) then { Kiem tra xem N co’ chia het cho i hay khong} Writeln('N khongla SNT') { Neu dung thi khong con la so nguyen to nua} Else Writeln('N la SNT'); { N la SNT} End; Bài toán số 2.4: Viết chương trình thực hiện lần lượt các công việc sau: - Lập thủ tục nhập ba số thực dương a , b , c từ bàn phím . - Lập thủ tục kiểm tra xem ba số trên có lập thành ba cạnh của tam giác hay không ? - Viết hàm tính diện tích của tam giác . - Viết hoàn thiện chương trình chính. Chương trình Program Tam_Giac; Uses crt; Var a,b,c : Integer; { 1. Thu tuc nhap} Procedure NhapABC (Var a, b, c : Integer); Begin Write( 'Nhap a:' ); Readln( a ); Write( 'Nhap b:' ); Readln( b ); Write( 'Nhap c:' ); Readln( c ); End; { 2. Ham tinh dien tich} Function Dientich( a, b, c:Integer ) : Real; Var dt,p : Real; Begin p := (a+b+c)/2; dt := sqrt(p* (p-a)*(p-b)*(p-c)); Dientich := dt; End; { 3. Thu tuc kiem tra va In kqua tinh dien tich (neu la tam giac) } Procedure KiemTra_InDienTich ( a,b,c:Integer); Begin If ((a+b>c) and (b+c>a) and (a+c>b)) then Writeln(' Ba canh tren tao thanh tam giac.dien tich', Dientich(a,b,c) ) Else Writeln('Ba canh tren khongtao thanh tam giac'); End; { 3. Than chuong trinh chinh } BEGIN NhapABC(a,b,c); KiemTra_InDienTich (a,b,c); END. Bài toán số 2.5: Viết chương trình hoàn chỉnh thực hiện phân tích ra N ra thành các thừa số nguyên tố. Ví dụ: N = 1260 = 2 . 2 . 3 . 3 . 5 . 7 Hướng dẫn: - Viết hàm nhập số N. Lưu ý, hàm nhập cần truyền tham số N theo dạng tham biến để lưu lại giá trị đã nhập vào. - Viết hàm phân tích số N ra các thừa số nguyên tố và in các thừa số đó ra màn hình với ý tưởng thuật toán: o Chia N cho số nguyên tố u (nhỏ nhất là 2). o Trong khi N còn chia hết cho u thì tiến hành phân tích N với u là thừa số. Giảm N đi u lần. o Nếu N không chia hết cho u, thi tăng u lên 1. o Quá trình lặp lại với § u từng bước tăng lên 1 nếu N không chia hết cho u. § N từng bước giảm xuống u lần nếu N chia hết cho u. o Quá trình lặp lại đến một mức u tăng lên và N giảm xuống để N = u, khi đó giá trị mới của N sẽ là 1. Chương trình: Program Phan_Tich_Thua_So; Uses crt; Var N : integer; { 1. Thu tuc nhap so N. } Procedure NhapSoN( var NN : Integer ); Begin NN := 0; {Gan khoi dau bang 0 de vao vong lap, vong lap dung khi nhap khac 0} While ( N = 0 ) do Begin Write( 'Nhap N=' ); Readln(NN ); End; End; { 2. Thu tuc phan tich N ra thanh cac thua so nguyen to } Procedure PhantichSoN ( Var N1 : Integer ); Var u,dem:Integer; Begin If ( N1 > 1 ) Then Begin u := 2; dem := 0; While ( N1 > 1 ) do If ( N1 mod u = 0 ) Then Begin dem:=dem+1; Writeln( u); N1 := N1 div u; End Else u:=u+1; End Else Writeln(' Khong the phan tich duoc' ); End; { 3. Than chuong trinh chinh } BEGIN Clrscr; Writeln('Phan tich so N thanh tich cua cac so nguyen to :' ); NhapSoN( N ); PhantichSoN( N ); Writeln ('Nhan Enter de ket thuc ...' ); Readln; END. |