Nội dung của Bài 17: Chương trình con và phân loại dưới đây, các em sẽ được tìm hiểu về khái niệm chương trình con, ý nghĩa của chương trình con; cấu trúc của chương trình con và cách phân biệt hai loại chương trình con là hàm và thủ tục. Mời các em cùng theo dõi nội dung chi tiết của bài học.
Để viết chương trình giải các bài toán lớn, phức tạp người lập trình có thể chia thành nhiều bài toán nhỏ, mỗi bài toán là một dãy lệnh mô tả một số thao tác nhất định (gọi là chương trình con). Sau đó ghép nối các chương trình con thành chương trình chính.
Chương trình con là dãy các lệnh mô tả một số thao tác nhất định và có thể được thực hiện từ nhiều vị trí trong chương trình.
Trong nhiều ngôn ngữ lập trình, chương trình con thường gồm hai loại:
sin(x) nhận vào giá trị thực x và trả về giá trị sinx,
sqrt(x) nhận vào giá trị x trả về giá trị căn bậc hai của x,
length(x) nhận vào xâu x và trả về độ dài của xâu x,...
< phần đầu >
[< phần khai báo >]
< phần thân >
Một số lưu ý:
Sự giống nhau và khác nhau giữa hàm và thủ tục
Gợi ý trả lời:
Hàm | Thủ tục |
Đầu hàm bắt đầu bằng từ khóa Function | Đầu thủ tục bắt đầu bằng từ khóa Procedure |
Luôn trả về một giá trị thuộc kiểu xác định thông qua tên hàm (các kiểu dữ liệu đơn giản: integer, real, boolean, char, string). | |
Phải chỉ ra kết quả của hàm thuộc kiểu dữ liệu nào. | |
Trong thân hàm thường có câu lệnh gán giá trị cho tên hàm. |
Chương trình tính tích của hai số nguyên a và b
Function Tich(a, b: integer): integer;
Var Kq: Integer;
Begin
Kq := a*b;
Tich := Kq;
End;
Procedure tt_Tich(a, b: integer);
Var Kq: Integer;
Begin
Kq := a*b;
Write('Tích của' , a, 'và', b, 'là', Kq);
End;
Hãy nhận xét cấu trúc hàm và thủ tục của chương trình tính tích ở trên.
Gợi ý trả lời:
Sau khi học xong Bài 17: Chương trình con và phân loại, các em cần nắm vững những nội dung trọng tâm:
Các em có thể hệ thống lại nội dung kiến thức đã học được thông qua bài kiểm tra Trắc nghiệm Tin học 11 Bài 17 cực hay có đáp án và lời giải chi tiết.
Để khai báo hàm trong Pascal bắt đầu bằng từ khóa
Để khai báo thủ tục trong Pascal bắt đầu bằng từ khóa
Kiểu dữ liệu của hàm
Câu 4-10: Mời các em đăng nhập xem tiếp nội dung và thi thử Online để củng cố kiến thức về bài học này nhé!
Trong quá trình học tập nếu có thắc mắc hay cần trợ giúp gì thì các em hãy comment ở mục Hỏi đáp, Cộng đồng Tin học DapAnHay sẽ hỗ trợ cho các em một cách nhanh chóng!
Chúc các em học tập tốt và luôn đạt thành tích cao trong học tập!
-- Mod Tin Học 11 DapAnHay
Để khai báo hàm trong Pascal bắt đầu bằng từ khóa
Để khai báo thủ tục trong Pascal bắt đầu bằng từ khóa
Kiểu dữ liệu của hàm
Nói về cấu trúc của một chương trình con, khẳng định nào sau đây là không đúng?
Khẳng định nào sau đây là đúng?
Khẳng định nào sau đây là đúng?
Mô tả nào dưới đây về hàm là sai?
Trong các cách sử dụng thủ tục sau, cách nào là phù hợp nhất ?
Hãy chọn phương án ghép đúng. Cho thủ tục sau:
Procedure p ;
Var n : integer ;
Begin
…………
End ;
Phạm vi của biến n là :
Trong các chương trình chuẩn sau đây, chương trình chuẩn nào là thủ tục chuẩn?
Họ và tên
Tiêu đề câu hỏi
Nội dung câu hỏi
Câu trả lời của bạn
const fi='data.inp';
fo='result.txt';
var f1,f2:text;
a:array[0..100]of integer;
dem,i,t:integer;
tbc:real;
begin
assign(f1,fi); reset(f1);
assign(f2,fo); rewrite(f2);
dem:=0;
while not eoln(f1) do
begin
inc(dem);
readln(f1,a[dem]);
end;
{---------------------------------xu-ly--------------------------------}
t:=0;
for i:=1 to dem do
t:=t+a[i];
tbc:=t/dem;
writeln(f2,tbc:4:2);
close(f1);
close(f2);
end.
Câu trả lời của bạn
uses crt;
var i,a,b,c,ucln,bcnn,bcnn1,n:longint;
k:array[1..3]of integer;
{--------------------chuong-trinh-con-tim-ucln----------------------}
function uc(x,y:integer):integer;
begin
while x<>y do
begin
if x>y then x:=x-y
else y:=y-x;
end;
uc:=x;
end;
{-------------------chuong-trinh-chinh----------------------------}
begin
clrscr;
write('a='); readln(a);
write('b='); readln(b);
write('c='); readln(c);
n:=3;
k[1]:=a;
k[2]:=b;
k[3]:=c;
ucln:=uc(k[1],k[2]);
bcnn:=(k[1]*k[2]) div ucln;
for i:=3 to n do
begin
ucln:=uc(bcnn,k[i]);
bcnn:=(bcnn*k[i]) div ucln;
end;
writeln(bcnn);
readln;
end.
Câu trả lời của bạn
uses crt;
var a,dt:real;
begin
clrscr;
repeat
write('nhap do dai canh hinh vuong:'); readln(a);
until a>0;
dt:=a*a;
writeln('Dien tich manh vuon la: ',dt:4:2);
readln;
end.
- Lập thủ tục (Procedure) nhập ba số thực dương a, b, c từ bàn phím.
- Viết hàm (Function) tính diện tích của tam giác?
Chạy chương trình với bộ test sau:
Nhập a = 5
Nhập b= 6
Nhập c=7
Dien tich = 14,70
Câu trả lời của bạn
uses crt;
var a,b,c:real;
dt:real;
{---------------------------chuong-trinh-con-nhap-----------------------------}
procedure nhap(var x,y,z:real);
begin
repeat
write('Nhap a=');readln(x);
write('Nhap b='); readln(y);
write('Nhap c='); readln(z);
until (a>0) and (b>0) and (c>0) and (a+b>c) and (a+c>b) and (b+c>a);
end;
{-----------------chuong-trinh-con-tinh-dien-tich------------------------}
function dientich(var f,g,h:real):real;
var p:real;
begin
p:=(f+g+h)/2;
dientich:=sqrt(p*(p-f)*(p-g)*(p-h));
end;
{--------------------------chuong-trinh-chinh--------------------------}
begin
clrscr;
nhap(a,b,c);
dt:=dientich(a,b,c);
writeln('Dien tich tam giac la: ',dt:4:2);
readln;
end.
Programe Cau1;
Var A=Real;
Begin
Write(‘Nhap A:’); Realn(a);
A = A* A;
Writeln(‘Binh phuong cua a la:’, A);
Readln;
End;
Câu trả lời của bạn
Lỗi 1: Sai từ khóa(Programe)
Lỗi 2: Dùng cú pháp hằng mà lại dùng từ khóa khai báo biến(Var a=real;)
Lỗi 3: Dùng sai từ đọc dữ liệu(Realn)
Lỗi 4: Thiếu dấu : ở cú pháp gán
Lỗi 5: End là từ khóa để kết thúc bài mà lại có dấu;
Câu trả lời của bạn
uses crt;
var a,b,bcnn:integer;
{----------------------chuong-trinh-con----------------------------}
function ucln(var n,m:integer):integer;
var i:integer;
begin
ucln:=1;
for i:=1 to n*m do
if (n mod i=0) and (m mod i=0) then
begin
if ucln<i then ucln:=i;
end;
end;
{---------------------chuong-trinh-chinh--------------------------}
begin
clrscr;
write('Nhap a='); readln(a);
write('Nhap b='); readln(b);
bcnn:=a*b div ucln(a,b);
writeln('Boi chung nho nhat=',bcnn);
readln;
end.
Câu trả lời của bạn
1:
procedure nhap(var a,b,c:real);
begin
Repeat
write('Nhap canh thu nhat:'); readln(a);
write('Nhap canh thu hai:'); readln(b);
write('Nhap canh thu ba:'); readln(c);
Until (a>0) and (b>0) and (c>0) and (a+b>c) and (a+c>b) and (b+c>a);
end;
2:
function max(var x,y:real):real;
begin
max:=x;
if max<y then max:=y;
end;
- in ra 10 số nguyên dương liên tiếp từ 1 đến 10
- in ra 10 số nguyên dương liên tiếp từ 10 đến 1
Câu trả lời của bạn
var
i:integer;
begin
write('cac so nguyen duong tu 1 toi 10;');
for i:=1 to 10 do write(i);
writeln;
write('cac so nguyen duong tu 10 toi 1;');
for i:=10 downto 1 do write(i);
readln
end.
Câu trả lời của bạn
program hotrotinhoc;
var a,b: integer;
function bcnn(x,y: integer): boolean;
var s,t: integer;
begin
while y<>0 do
begin
s:=x mod y;
x:=y;
y:=z;
end;
t:=(x*y) div x;
bcnn:=t;
end;
begin
write('a='); readln(a);
write('b='); readln(b);
write(bcnn(a,b));
readln
end.
Câu trả lời của bạn
uses crt;
var a:array[1..100]of integer;
i,n,k,dem:integer;
begin
clrscr;
write('n='); readln(n);
for i:=1 to n do
begin
write('a[',i,']='); readln(a[i]);
end;
{-----------------xuat------------------}
for i:=1 to n do
write(a[i]:4);
{---------------xu-ly-------------------}
writeln;
write('nhap k='); readln(k);
dem:=0;
for i:=1 to n do
if a[i] mod k=0 then inc(dem);
writeln('so phan tu chia het cho ',k,' trong day la: ',dem);
readln;
end.
a. đếm xem trong dãy có bao nhiêu số chẵn
b. đếm xem trong dãy có bao nhiêu số lẻ
c. tính tổng của các phần tử là số chẵn trong dãy số nguyên
d. tính tổng của các phần tử là số lẻ trong dãy số nguyên
Câu trả lời của bạn
var a:array[1..32000] of integer;
i,chan,le,t,s:integer;
begin
write('nhap n='); readln(n);
for i:=1 to n do
begin
write('a[',i,']='); readln(a[i]);
end;
a, chan:=0;
for i:=1 to n do if a[i] mod 2 = 0 then chan:=chan+1;
writeln('so so chan trong day la:',chan);
b, le:=0;
for i:=1 to n do if a[i] mod 2 = 1 then le:=le+1;
writeln('so so le trong day la:',le);
c, t:=0;
for i:=1 to n do if a[i] mod 2=0 then t:=t+a[i];
write('tong cua ptu chan la:',t);
d, s:=0;
for i:=1 to n do if a[i] mod 2=1 then s:=s+a[i];
write('tong cua ptu le la:',s);
Câu trả lời của bạn
Không cần con.
var
a,b,S:integer;
begin
writeln('Hay nhap a va b:');
readln(a,b);
S:=(a*b)/2;
Writeln('Dien tich bang:', S:10:4);
readln;
end.
bai1.inp | bai2.out |
5 721 34 -10 211 | 5 212 |
Câu trả lời của bạn
program hotrotinhoc;
const fi='bai1.inp';
fo='bai1.out';
var i,n : integer;
f: text;
a: array[1..32000] of integer;
function dn(x: integer): integer;
var s: integer;
begin
dn:=0; s:=0;
while x>0 do
begin
s:=s*10+(x mod 10);
x:= x div 10;
end;
dn:=s;
end;
procedure ip;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]);
close(f);
end;
procedure out;
begin
assign(f,fo);
rewrite(f);
for i:=1 to n do
if dn(a[i])=a[i] then write(f,a[i],' ');
close(f);
end;
begin
ip;
out;
end.
Câu trả lời của bạn
program zoo;
var
i,n,k,d:integer;
a:array[1..32000] of integer;
function hello(x,y:integer):boolean;
begin
hello:=false;
if x mod y = 0 then hello := true
end;
begin
write(' nhap n: '); readln(n);
for i:= 1 to n do
begin
write(' nhap a[',i,'] = '); readln(a[i]);
end;
write(' nhap k = '); readln(k);
d:=0;
for i:= 1 to n do
if hello(a[i],k) = true then d:=d+1;
write(' so luong so chia het cho k la : ',d);
readln;
end.
a) in ra số đối xứng lớn nhất
b) in ra số đảo ngược lớn nhất
c) tìm cắp số có ucln là lớn nhất
d) viết ra số nguyên tố cố tổng các chữ số của nó lớn nhất
bai5.inp | bai5.out |
5 7 9 123 31 | 9 123 9 123 7 |
Câu trả lời của bạn
Nhập mảng phải có nhập số lượng phần tử nữa bạn nhé.
program hotrotinhoc;
const fi='bai5.inp';
fo='bai5.out';
var f: text;
i,j,n,max,max1,max2,max3,max4: longint;
a: array[1..32000] of integer;
function dn(x: integer): integer;
var s: integer;
begin
s:=0; dn:=0;
while x<>0 do
begin
s:=s*10+(x mod 10);
x:=x div 10;
end;
dn:=s;
end;
function nt(x1: integer): boolean;
var j: integer;
begin
nt:=false;
if x1<2 then exit;
for j:=2 to trunc(sqrt(x1)) do
if x1 mod j=0 then exit;
nt:=true;
end;
function tongcs(x2: integer): integer;
var s1: integer;
begin
s1:=0;
while x2<>0 do
begin
s1:=s1+(x2 mod 10);
x2:=x2 div 10;
end;
tongcs:=s1;
end;
function ucln(x3,y: integer) : integer;
var z: integer;
begin
while y<>0 do
begin
z:=x3 mod y;
x3:=y;
y:=z;
end;
ucln:=x3;
end;
procedure ip;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]);
close(f);
end;
procedure out;
begin
assign(f,fo);
rewrite(f);
max:=0; max2:=0; max3:=0;
for i:=1 to n do
begin
if (dn(a[i])=a[i]) and (a[i]>max) then max:=a[i];
if dn(a[i])>max2 then max2:=dn(a[i]);
if (nt(a[i])) and (tongcs(a[i])>max3) then max3:=a[i];
end;
writeln(f,max);
for i:=1 to n do if dn(a[i])=max2 then
writeln(f,a[i]);
max4:=0;
for i:=1 to n do
for j:=i to n do
if (a[i]<>a[j]) and (ucln(a[i],a[j])>max4) then max4:=ucln(a[i],a[j]);
for i:=1 to n do
for j:=i to n do
if ucln(a[i],a[j])=max4 then writeln(f,a[i],' ',a[j]);
write(f,max3);
close(f);
end;
begin
ip;
out;
end.
bai3.inp | bai3.out |
2 5 1 | 2 120 1 |
Câu trả lời của bạn
program hotrotinhoc;
var i,n: integer;
a: array[1..32000] of integer;
function tich(x: integer): integer;
var i,s: integer;
begin
s:=1;
for i:=1 to x do s:=s*i;
tich:=s;
end;
procedure ip;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]);
close(f);
end;
procedure out;
begin
assign(f,fo);
rewrite(f);
for i:=1 to n do
writeln(f,tich(a[i]);
close(f);
end;
begin
ip;
out;
end.
bai2.inp | bai2.out |
6 8 11 1 12 | 2 1 1 6 |
Câu trả lời của bạn
program hotrotinhoc;
const fi='bai2.inp';
fo='bai2.out';
var f: text;
i,n: integer;
a: array[1..32000] of integer;
function ucln(x,y: integer): integer;
var s: integer;
begin
while y<>0 do
begin
s:= x mod y;
x:=y;
y:=s;
end;
ucln:=x;
end;
procedure ip;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]);
close(f);
end;
procedure out;
begin
assign(f,fo);
rewrite(f);
for i:=2 to n do
write(f,ucln(a[1],a[i]),' ');
close(f);
end;
begin
ip;
out;
end.
Câu trả lời của bạn
Viết chương trình con (hàm, thủ tục) tính bội số chung nhỏ nhất của hai số nguyên dương a, b.
Ta nhận thấy rằng, bội số chung nhỏ nhất của hai số nguyên dương a, b có thể được tính theo công thức:
ab/d
trong đó d là ước chung lớn nhất của a và b.
Bởi vậy:
Nên viết hàm để tính bội chung nhỏ nhất của hai số nguyên dương vì chương trình con cần trả ra một giá trị;
– Hàm tính bội chung nhỏ nhất của hai số nguyên dương a, b cần sử dụng hàm tính ước chung lớn nhất của a và b
– Hàm tính ước chung lớn nhất của hai số nguyên dương a, b:
function ucln (a, b: integer): integer;
var r: integer;
begin
while b>0 do begin
r: = a mod b ,a : = b ; b:= r; end; ucln:= a; and;
– Hàm tình bội chung nhỏ nhất của hai số nguyên dương a, b:
lunction bcnn(a, b: integer): integer;
begin
bcnn:= a*b div ucln(a, b);
end;
khi đó, chương trình con tính bội số chung nhỏ nhất của hai số nguyên dương a, b như sau:
program bai4_chuong6;
use crt ;
vai
X y: integer;
function ucln(a, b: integer): integer;
var r: integer;
begin
while b>0 do begin
r:= a mod b; a: = b ,b:= r;
end; ucln:= a;
end;
txnction bcnn(a, b: integer): integer;
begin
bcnn:= a*b div ucln(a, b);
end;
Begin
clrscr;
writeln(‘Nhap vao hai so can tim BCNN’);
write (‘x=’) , readln(x); write (‘y=’) , readln(y);
writeln(‘bcnn cua hai so’,x:4,’va’,y:4,’la’,bcnn(a,b)
readln
End.
Câu trả lời của bạn
Ví dụ chương trình con có nhiều hơn một kết quả ra:
a) Procedure Hoan_đoi(var X, ỵ: integer);
var TG: integer;
begin
TG:= X; x:= y; y:= TG;
end;
b) Procedure Hoan_đoi(x: integer; var y: integer);
var TG: integer;
begin
TG:= x;
X: = y , y:= TG;
end;
Hàm:
Function Tich(a, b: integer): integer;
Var Kq: Integer;
Begin
Kq := a*b;
Tich := Kq;
End;
Thủ tục:
Procedure tt_Tich(a, b: integer);
Var Kq: Integer;
Begin
Kq := a*b;
Write(‘Tích của’ , a, ‘và’, b, ‘là’, Kq);
End;
Hãy nhận xét cấu trúc hàm và thủ tục của chương trình tính tích ở trên.
Câu trả lời của bạn
– Hàm trả về giá trị sau khi thực hiện nên có lệnh gán kết quả cho tên hàm Tích := Kq; và cũng chính vì vậy nên sau khai báo tên hàm có khai báo tên kiểu dữ liệu trả về Tich(a, b: integer): integer;
– Thủ tục không trả về kết quả nên có câu lệnh xuất kết quả ngay trong thủ tục Write(‘Tích của , a, ‘ và ‘, b, ‘ là ‘, Kq);
0 Bình luận
Để lại bình luận
Địa chỉ email của hạn sẽ không được công bố. Các trường bắt buộc được đánh dấu *