Tải bản đầy đủ (.doc) (24 trang)

CÁC BÀI TẬP VỀ BIẾN VÀ KIỂU DỮ LIỆU

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (238.02 KB, 24 trang )

Hướng dẫn ôn tập Lập trình Pascal cơ bản
CÁC BÀI TẬP VỀ BIẾN VÀ KIỂU DỮ LIỆU
BT_02_13
Nhập vào 3 cạnh a, b, c của tam giác ABC.
a) Tính diện tích tam giác.
b) Tính độ dài các đường cao
c) Tính độ dài các đường trung tuyến
d) Tính bán kính đường tròn ngoại tiếp.
HƯỚNG DẪN
a) Tính diện tích theo công thức Hê-rông:
)cp)(bp)(ap(pS
−−−=
với
)cba(
2
1
p
++=
b) Tính đường cao ứng với cạnh a theo công thức:
a
S2
hah
2
1
S
aa
=⇒=
c) Tính độ dài đường trung tuyến ứng với cạnh a theo công thức:
2
ac2b2
m


4
ac2b2
m
222
a
222
2
a
−+
=⇒
−+
=
d) Tính bán kính đường tròn ngoại tiếp theo công thức:
S4
abc
R
R4
abc
S
=⇒=
Đã có công thức thì lập trình không còn là chuyện lớn. Sau đây là chương trình mẫu, trong
đó các biến có ý nghĩa : a, b, c là các cạnh; ha, hc, hb là các đường cao; ma, mb, mc là các
trung tuyến tương ứng với các cạnh; S, p, R lần lượt là diện tích, nửa chu vi, bán kính đường
tròn ngoại tiếp.
program BT_02_13;
var
a, b, c,
ha,hb,hc,
ma,mb,mc,
S,p,R : real;

begin
write('Nhap 3 canh cua tam giac ');
readln(a,b,c);
p := (a+b+c)/2;
S := sqrt(p*(p-a)*(p-b)*(p-c));
R := (a*b*c)/(4*S);
ha := 2*S/a;
hb := 2*S/b;
hc := 2*S/c;
ma := sqrt(2*sqr(b)+2*sqr(c)-sqr(a))/2;
mb := sqrt(2*sqr(a)+2*sqr(c)-sqr(b))/2;
mc := sqrt(2*sqr(a)+2*sqr(b)-sqr(c))/2;
Nguyễn Thanh Tùng - Khoa CNTT, Đại học Sư phạm Hà Nội
1
Hướng dẫn ôn tập Lập trình Pascal cơ bản
writeln('Thong tin ve tam giac: ');
writeln('Dien tich S = ', S:0:5);
writeln('Ban kinh duong tron ngoai tiep R = ', R:0:5);
writeln('Do dai cac duong cao: ');
writeln(' xuong canh a: ha = ', ha:0:5);
writeln(' xuong canh b: hb = ', hb:0:5);
writeln(' xuong canh c: hc = ', hc:0:5);
writeln('Do dai cac duong trung tuyen:');
writeln(' xuong canh a: ma = ', ma:0:5);
writeln(' xuong canh b: mb = ', mb:0:5);
writeln(' xuong canh c: mc = ', mc:0:5);
readln;
end.
BT_02_06:
Nhập 2 số thực x,y, tính rồi in ra màn hình biểu thức:

)yxarctg(
22
e
)ycosx(sinln
+
+

Yêu cầu kết quả viết với độ rộng 8 cột, có 3 chữ số phần thập phân.
HƯỚNG DẪN
Ta sẽ dùng 3 biến x, y, z kiểu real, x,y để lưu 2 số nhập vào, z lưu kết quả biểu thức.
Phần khai báo biến như sau:
var
x,y,z : real;
Phần nhập dữ liệu: ta viết thông báo nhập dữ liệu rồi nhập x,y bằng lệnh readln:
writeln('Nhap 2 so thuc x,y ');
readln(x,y);
Phần tính kết quả: ta dùng lệnh gán giá trị của biểu thức (đã viết ở BT_02_05) cho z:
z := (ln(sqr(sin(x))+sqr(cos(x))))/(exp(arctan(x+y)));
Phần in kết quả: ta viết z ra màn hình bằng lệnh writeln, có dùng khuôn dạng output z:8:3
theo yêu cầu của đề (độ rộng 8, 3 chữ số thập phân).
Nội dung chương trình mẫu:
program BT_02_06;
var
x,y,z : real;
begin
writeln('Nhap 2 so thuc x,y ');
readln(x,y);
z := (ln(sqr(sin(x))+sqr(cos(x))))/(exp(arctan(x+y)))
writeln('Ket qua bieu thuc: ', z:8:3);
readln;

end.
Nguyễn Thanh Tùng - Khoa CNTT, Đại học Sư phạm Hà Nội
2
Hướng dẫn ôn tập Lập trình Pascal cơ bản
BT_02_07:
Lập chương trình tính chu vi và diện tích đường tròn theo bán kính của nó.
HƯỚNG DẪN
Ta cần nhập vào bán kính R của đường tròn rồi tính chu vi và diện tích của nó theo công
thức toán:
R2C
π=

2
RS
π=
. Hằng số π được định nghĩa sẵn trong Pascal với tên chuẩn
là pi.
Ta cần khai báo 3 biến thực R, C và S. Thực hiện việc nhập R rồi tính C, S theo các công
thức trên. Sau đó in ra chúng.
Chương trình mẫu:
program BT_03_07;
var
r,c,s : real;
begin
writeln('Chuong trinh tinh chu vi va dien tich hinh tron.');
write('Nhap vao ban kinh r = ');
readln(r);
c := 2 * pi * r;
s := pi * sqr(r);
writeln('Chu vi C = ',c:0:4);

writeln('Dien tich S = ',s:0:4);
readln;
end.
BT_02_08:
Lập trình tính diện tích hình thang khi cho 2 đáy và đường cao.
HƯỚNG DẪN
Dữ liệu vào lưu trong là 3 biến a, b, h lần lượt là các cạnh và đường cao của hình thang.
Biến s lưu diện tích của hình thang tính theo công thức:
2
h)ba(
+
. Lệnh thực hiện việc tính
là lệnh gán: s := (a+b)*h/2;
Chương trình mẫu:
program BT_02_08;
var
a,b,s,h: real;
begin
writeln('Chuong trinh tinh dien tich hinh thang. ');
write('Nhap 2 canh va duong cao ');
readln(a,b,h);
s := (a+b)*h/2;
writeln('Dien tich la S = ',s:0:5);
readln;
end.
Nguyễn Thanh Tùng - Khoa CNTT, Đại học Sư phạm Hà Nội
3
Hướng dẫn ôn tập Lập trình Pascal cơ bản
CÁC BÀI TẬP VỀ CẤU TRÚC ĐIỀU KHIỂN
VD_03_02

Viết chương trình giải phương trình bậc nhất ax+b=0.
HƯỚNG DẪN
Thuật toán có được theo cách giải trong môn toán:
Nếu a<>0 thì có một nghiệm là x= - b/a,
ngược lại (a=0) thì
nếu b<>0 thì vô nghiệm,
ngược lại (b<>0) thì có mọi số đều là nghiệm.
Rõ ràng là chúng ta có thể dùng lệnh if, và trong trường hợp này <câu lệnh> của if lại là một
lệnh if:
readln(a,b );{ nhập hệ số }
if a=0 then
if b=0 then
writeln('Moi so thuc deu la nghiem')
else
writeln('Phuong trinh vo nghiem')
else
writeln('Phuong trinh co nghiem duy nhat x = ',-b/a:0:5);
Toàn văn chương trình:
program VD_03_02;
var
a,b : real;
begin
writeln('Chuong trinh giai phuong trinh bac nhat ax+b=0 ');
writeln('Nhap hai he so ');
readln(a,b);
if a=0 then
if b=0 then
writeln('Moi so thuc deu la nghiem')
else
writeln('Phuong trinh vo nghiem')

else
writeln('Phuong trinh co nghiem duy nhat x = ',-b/a:0:5);
readln;
end.
VD_03_03
Giải phương trình bậc hai ax
2
+ bx + c = 0;
HƯỚNG DẪN
Ta cũng có thuật toán theo kiến thức môn toán:
ac4bΔ
2
−=
Nếu ∆<0 thì phương trình vô nghiệm.
Nguyễn Thanh Tùng - Khoa CNTT, Đại học Sư phạm Hà Nội
4
Hướng dẫn ôn tập Lập trình Pascal cơ bản
Nếu ∆=0 thì phương trình có nghiệm kép
a
b
x
2
−=
.
Nếu ∆>0 thì phương trình có 2 nghiệm
a
b
x
2
2,1

∆±−
=
.
Toàn văn chương trình:
program VD_03_03;
var
a, b, c, d : real;
x1, x2 : real;
begin
writeln('Chuong trinh giai phuong trinh bac hai a*x*x+b*x+c=0');
write('Nhap he so a,b,c: ');
readln(a,b,c);
d := sqr(b) - 4*a*c ;
if d<0 then
writeln('Phuong trinh vo nghiem.');
if d=0 then
writeln('Phuong trinh co nghiem kep: x = ',-b/(2*a):0:5 );
if d>0 then
begin
x1 := (-b + sqrt(d))/(2*a);
x2 := -b/a - x1 ;
writeln('Phuong trinh co 2 nghiem phan biet:');
writeln('x1 = ',x1:0:5);
writeln('x2 = ',x2:0:5);
end;
readln;
end.
VD_03_06
Tính tổng các số tự nhiên từ 1 đến n với n nhập từ bàn phím.
HƯỚNG DẪN

Trong toán ta có công thức tổng quát:
2
1)n(n
n 2 1 s
n
+
=…++=
nên cách giải quyết đơn giản là thay n vào công thức để tính kết quả.
Tuy nhiên không phải lúc nào ta cũng có công thức tổng quát và tính theo công thức tổng
quát không phải lúc nào cũng hiệu quả nhất nên ta tìm một cách giải quyết khác: Sn có thể
định nghĩa một cách truy hồi như sau:
n; S S
0. s
1-nn
0
+=
=
Từ đó ta có thể tính sn bằng cách cho tăng dần i từ 1 đến n và tính si = si-1+ i. Sau quá trình
đó i=n và ta được sn là kết quả cần tính.
program VD_03_06;
var
n, s, i : integer;
begin
Nguyễn Thanh Tùng - Khoa CNTT, Đại học Sư phạm Hà Nội
5
Hướng dẫn ôn tập Lập trình Pascal cơ bản
writeln('Chuong trinh tinh tong cac so tu 1 den n.');
write('Cho n = ');
readln(n);
s := 0;

for i := 1 to n do
s := s + i;
writeln('Ket qua: ',s);
readln;
end.
VD_03_07: Dãy số Fibônaxi được định nghĩa như sau:



≥∀+=
==
3)n( fff
1f 1,f
2-n1-nn
21
Viết chương trình in ra các số Fibônaxi với từ 1 đến 20.
HƯỚNG DẪN
Ta dễ dàng tìm ra cách tính: cho i chạy từ 3 đến 20 rồi tính fi theo định nghĩa: fi=fi
-
1
+fi
-2
. Đặt biến f0, f1, f2 đại diện cho fi, fi
-1
, fi
-2
ứng với mỗi giá trị của i, thế thì ta có thể
viết đoạn chương trình tính như sau:
f1 := 1;
f2 := 1;

for i := 3 to n do begin
f0 := f1 + f2;
writeln('F',i,' = ',f0);
f2 := f1;
f1 := f0;
end;
Trong đoạn chương trình này, i là biến đếm chạy từ 3 đến n. Câu lệnh f0:=f1+f2; để tính fi
theo công thức truy hồi. Hai câu lệnh tiếp tính giá trị của f1, f2 dùng để tính phần tử tiếp
theo: rõ ràng để tính fi+1 thì f2:=fi-1 (=f1) và f1:=fi(=f0).
Rõ ràng cách tính này đơn giản hơn sử dụng công thức tổng quát rất nhiều:
(





























+
=
nn
n
f
2
51
2
51
5
1
).
Toàn văn chương trình:
program VD_03_07;
const
n = 20;
var
i, f0, f1, f2 : integer;
begin
writeln('Chuong trinh tinh cac so Fibonaxi tu 1 den ',n);
f1 := 1;

f2 := 1;
writeln('F1 = 1');
writeln('F2 = 1');
Nguyễn Thanh Tùng - Khoa CNTT, Đại học Sư phạm Hà Nội
6
Hướng dẫn ôn tập Lập trình Pascal cơ bản
for i := 3 to n do begin
f0 := f1 + f2;
writeln('F',i,' = ',f0);
f2 := f1;
f1 := f0;
end;
readln;
end.
VD_03_08
Tính a
n
với a là số thực và n là số nguyên dương.
HƯỚNG DẪN
Trong chương 2 ta đã biết tính a
b
với a là số thực dương và b bất kỳ theo công thức
ln(a))*(b exp e a
blnab
==
. Tuy nhiên công thức không thể tính khi a≤0. Ta tính bằng cách
khác như sau:
Với n nguyên dương đặt t
n
= a

n
, ta có công thức truy hồi sau:



=
=
.a t t
1 t
1-nn
0
Như vậy cho i chạy từ 1 đến n và tính công thức trên ta sẽ tính t
n
. Cấu trúc for dùng cài đặt
rất thích hợp.
Đoạn chương trình như sau:
t := 1;
for i := 1 to n do t := t * a;
Biến t đại diện cho ti ứng với mỗi i trong lệnh for. Trong câu lệnh t := t * a; biến t ở bên trái
là ti, giá trị t ở bên phải là giá trị trước đó của t, tức là ti
-1
. Câu lệnh viết đúng theo công thức
truy hồi. Xong vòng for i=n và t chính là giá trị tn = an. Ta thông báo kết quả.
Toàn văn chương trình:
program VD_03_08;
var
n,i : integer;
a,t : real;
begin
writeln('Chuong trinh tinh a^n, a thuc, n tu nhien.');

write('Nhap a va n: ');
readln(a,n);
t := 1;
for i := 1 to n do
t := t * a;
writeln('Ket qua : ',t:0:5);
readln;
end.
VD_03_09
Lập trình tính giai thừa của một số nguyên n (do giới hạn lưu trữ số nguyên cho n<8).
Nguyễn Thanh Tùng - Khoa CNTT, Đại học Sư phạm Hà Nội
7
Hướng dẫn ôn tập Lập trình Pascal cơ bản
HƯỚNG DẪN
Giai thừa của n: n! = 1.2…n (tích các số tự nhiên từ 1 đến n). Không có công thức tổng quát
để tính n! nhưng ta có công thức truy hồi sau:



=
=
)!n.(n-n!
!
1
10
Đặt g
n
=n!, theo công thức trên ta có:




=
=
.ngg
1g
1-nn
0
Và như vậy tương tự VD_03_06 và VD_03_08 ta cũng có chương trình tính như sau:
program VD_03_09;
var
n, i, g : integer;
begin
writeln('Chuong trinh tinh n! ');
write('Nhap (n<8): ');
readln(n);
g := 1;
for i := 1 to n do g := g * i;
writeln('Ket qua: ',n,'! = ',g);
readln;
end.
VD_03_10
Tính gần đúng số e theo công thức chuỗi:
n!
1
...
3!
1
2!
1
1!

1
1e
+++++=
với n nguyên nhập từ
bàn phím.
HƯỚNG DẪN
Ta có thể dựa trên chương trình tính giai thừa ở trên để tính một cách tường minh theo công
thức trên. Tuy nhiên cách ấy không ổn vì hàm giai thừa tăng rất nhanh theo n, nếu n quá lớn
thì không thể tính được.
Đặt
n!
1
...
3!
1
2!
1
1!
1
1e
n
+++++=

n!
1
r
n
=
, ta có công thức truy hồi:








+=
==
==

.ree
n
r
n
1
.rr
1.r 1,e
n1-nn
1n
1-nn
00
Và từ đó ta có thể viết đoạn chương trình tính dùng vòng lặp for như sau:
Nguyễn Thanh Tùng - Khoa CNTT, Đại học Sư phạm Hà Nội
8
Hướng dẫn ôn tập Lập trình Pascal cơ bản
e := 1; r := 1;
for i := 1 to n do begin
r := r / i;
e := e + r;
end;

Toàn văn chương trình:
program VD_03_10;
var
n,i : integer;
e,r : real;
begin
writeln('Chuong trinh tinh gan dung e.');
write('Nhap n : ');
readln(n);
e := 1; r := 1;
for i := 1 to n do begin
r := r / i;
e := e + r;
end;
writeln('Ket qua : ',e:0:10);
readln;
end.
VD_03_14:
Lập trình giải bài toán cổ: “Trăm trâu trăm cỏ, trâu đứng ăn 5, trâu nằm ăn 3, lải nhải trâu già
3 con 1 bó. Hỏi bao nhiêu trâu đứng, trâu nằm, trâu già”.
HƯỚNG DẪN
Đặt td là số trâu đứng, tn là số trâu nằm, tg là số trâu già thoả mãn bài toán. Thế thì td, tn, tg
là các số nguyên dương thoả mãn:





=++
=++

100
3
35
100
tg
tntd
tgtntd
Từ phương trình thứ hai ta có 5td≤100 và 3tn≤100, suy ra 1≤ td ≤ 20 và 1≤ tn ≤ 33. Số trâu
già: tg=(100-td-tn) phải chia hết cho 3 (vì số bó cỏ bọn trâu già ăn là số nguyên, bằng tg div
3).
Như vậy ta cần tìm các số td trong khoảng 1..20 và tn trong khoảng 1..33 sao cho: tg =(100 -
td - tn) chia hết cho 3 và 5*td + 3*tn + tg div 3 = 100.
Toàn văn chương trình:
program VD_03_14;
var
td,tn,tg : integer;
begin
writeln('Giai bai toan tram trau tram co.');
for td := 1 to 20 do
for tn := 1 to 33 do begin
tg := 100 - td -tn;
if (tg mod 3=0) and (5*td + 3*tn + (tg div 3)=100) then
Nguyễn Thanh Tùng - Khoa CNTT, Đại học Sư phạm Hà Nội
9

×