- Để tính tổng binh phương các chử số thì ta phải lấy ra được các chử số của số đó. - Cách lấy các chử số trong một số:kết hợp hai toán tử MOD và DIV ta sẽ lần lượt lấy được từng số dư [r]
Trang 1ÔN TẬP 11 VIẾT CHƯƠNG TRÌNH GIẢI BÀI TOÁN SAU
TRONG SÁCH BÀI TẬP TIN 11
PHẦN 1: LÝ THUYẾT
1 CẤU TRÚC RẼ NHÁNH
2 CẤU TRÚC LẶP
PHẦN 2: BÀI TẬP
Bài 1: Bài tập 3.34 : SỐ FIBONAXI)
1 Tìm hiểu đề bài:
Dữ liệu vào: Không có
Dữ liệu ra: Tệp văn bản FIBO.DAT gồm 45 dòng Mỗi dòng là một số Fibonaccy
2 Xây dựng ý tưởng giải thuật:
Sử dụng vòng lặp While… Do
Sơ đồ khối của thuật toán:
Bài 2: Bài tập 5.9 :
3 Tìm hiểu đề bài:
Dữ liệu vào: Số n là số tháng mà đoàn thám hiểm quay lại đảo
Dữ liệu ra: Số thỏ trên đảo sau n tháng
4 Xây dựng ý tưởng giải thuật: Dựa vào tính chất của dãy số Fibonacci
Sử dụng vòng lặp While… Do
Trang 2 Sơ đồ thuật toán:
5 Trình bày lời giải:
Trang 3Bài 3: Bài 5.41:
1 Tìm hiểu đề bài:
- Input: Tệp văn bản DUONGI.TXT
- Output: Khoảng cách của nhóm so với trại
2 Ý tưởng giải thuật:
- Do chỉ cần biết được khoảng cách của nhóm so với trại nên ta gắn vào hướng đi của nhóm theo một hệ trục toạ độ: Gốc là trại, chiều dương trục Ox là hướng Đông, chiều dương trục Oy là hướng Bắc
- Dùng biến tạm h để tính toạ độ của nhóm với quy ước rẽ trái h giảm đi 1, rẽ phải
h tăng lên 1
h
3 Trình bày lời giải:
Trang 4Bài 4: Bài 319(sbt trang 21):
Cho ba số nguyên p, q, r(#0) Kiểm tra ba số này, theo thứ tự nhập vào có tạo thành một cấp
số nhân hay không Viết chương trình thực hiện yêu cầu trên
Bước 1:
Input: bộ ba số p, q, r
Output: kiểm tra xem day p, q, r có là cấp số nhân không
Bước 2:
Sơđồ khối:
Bước 3:viết chương trình
program bai319_bt11;
var p, q, r:integer;
Begin
repeat
writeln('nhap ba so nguyen p, q, r de kiem tra');
readln(p, q, r);
until( q<>0) and( p<>0)and (r<>0);
if q/p=r/q then writeln(p, ' ', q, ' ', r, ': la cap so nhan')
else writeln(p, ' ', q, ' ', r, ': khong phai cap so nhan');
readln;
end
Bước 4
Mở rộng cho hs giải các bài toán tương tự như kiểm tra cấp số cộng không, trong trường hợp lớn hơn 3 số làm thế nào? Xác định số hạng tiếp theo nếu đây là cấp số nhân (số cộng)
Bài 5: Bài 440(sbt trang 45):Hãy lập trình
-Nhập một xâu bất kì từ bàn phím
-Chuẩn hóa xâu theo quy tắc sau:
+xóa các dấu cách ở đầu xâu nếu có;
+xóa các dấu cách ở cuối xâu nếu có;
+thay dãy nhiêu dấu cách liên tiếp bằng một dấu cách
-đưa kết quả đã chuẩn hóa ra màn hình
Begin
q/p=r/q
Thông báo phải Thông báo không phải
End
Nhập p, q, r
Trang 5Bước 1:
Input: nhập một xâu s
Output:Đưa ra xâu s chuẩn
Bước 2:
B1.nhập xâu s;
B2 xóa trong xâu s đi 1 kí tự nếu có hai kí tự trắng liền nhau
B3 kiểm tra kí tự đầu và cuối nếu chúng là kí tự trắng thì xóa
B4.đưa lần lươt s[i] ra màn hình đến hết
B5 kết thúc
Bước 3:viết chương trình
program chuanhoaxau;
var s:string;
i:integer;
Begin
writeln('nhap vao mot xau ');
readln(s);
for i:=1 to length(s) do
write(s[i]);
while pos(' ', s)<>0 do
delete(s, pos(' ', s), 1);
if s[1]=' 'then delete(s, 1, 1);
if s[length(s)]=' ' then delete(s, length(s), 1);
writeln('xau sau khi duoc chuan hoa la ');
for i:=1 to length(s) do
write(s[i]);
readln;
end
Bước 4
Mở rộng cho hs giải các bài toán tương tự như kiểm tra có một từ cần tìm , bổ xung từ vào xâu, xóa một từ trong xâu Đảo xâu
Trang 6Bài 6: Bài 3.34:Tuổi cha hiện nay là B và tuổi con là C (0<C<B, B, C là số nguyên và theo luật hôn
nhân và gia đình B-C>=19) Viết chương trình kiểm tra xem tuổi cha có gấp đôi tuổi con hay không, nếu đúng thì đưa ra màn hình câu thông báo ‘HIEN NAY TUOI CHA GAP ĐOI TUOI CON’, trong trường hợp ngược lại, hãy tính số năm N mà trước đó hoặc sau đó tuổi cha gấp đôi tuổi con và đưa câu thông báo dạng ‘N NĂM TRƯỚC ĐÂY TUỔI CHA GẤP ĐÔI TUỔI CON’ hoặc ‘SAU N NĂM TUỔI CHA SẼ GẤP ĐÔI TUỔI CON’
VÍ DU, với B=59, C=29 thì in ra câu thông báo sẻ là:
SAU 1 NĂM NỮA TUÔI CHA SE GẤP ĐÔI TUỔI CON
B1:input:nhập B, C;
Output: đưa ra màn hình câu thông báo tuổi cha gấp đôi tuổi con, sau N năm tuổi cha gáp đôi tuổi con hoặc trước đó N năm tuổi cha gấp đôi tuổi con
var b, c, n, k:integer;
B2: Ý tưởng:sử dụng câu lệnh if , nếu b=2*c thì thông báo ra màn hình HIỆN NAY TUỎI CHA GẤP ĐÔI TUỔI CON, còn nếu b-2*c>0 thì thông báo “SAU N=b-2*c TUỔI CHA SẺ GẤP ĐÔI TUỔI CON’, còn nếu b-2*c<0 thì thông báo ‘N NĂM TRƯỚC ĐÓ TUỔI CHA GẤP ĐÔI TUỔI CON
B3:SƠ ĐỒ KHỐI:
Begin
NHAP B,
C
B>C>0 B-C>19
N:=B-2*C
Sau N năm t ổi cha s
ẻ g ấp đ ôi tuôi con
N=2*C-B
Tr ư ớc đ ó N N ĂM TU ỔI CHA G ẤP ĐÔI TU ỔI CON
END
Trang 7B4:CHƯƠNG TRÌNH
begin
repeat
writeln('nhap tuoi cha');readln(b);
writeln('nhap tuoi con');readln(c);
if(b-c<19) or(c<0) or (b<c) then
writeln('ban phai nhap lai');
until(c>0) and (c<b) and (b-c>=19);
if b=2*c then writeln('hien tuoi cha gap doi tuoi con')
else
if b>2*c then
writeln('sau', b-2*c, 'nam tuoi cha se gap doi tuoi')
else
k:=2*c-b;
write(2*c-b, 'nam truoc day tuoi cha gap doi tuoi con');
readln;
end
Bài 7: Bài 3.21: Viết đoạn chương trình dùng câu lệnh IF tính:
x + y nếu x > 1 và y > 1
v:= x – y nếu x > 1 và y <= 1
- x + y nếu x <= 1 và y > 0
- x - y nếu x <1 và y <=0
Bài giải:
Bước 1: Xác định Input, Output
- Input: x,y;
- Output: v;
Bước 2: Ý tưởng thuật toán:
B1: Đọc giá trị x, y nhập vào
B2: Xét giá trị x,y
- Tính v:
V := x + y nếu x > 1 và y > 1 Chuyển qua bước 3;
V := x – y nếu x > 1 và y <= 1;Chuyển qua bước 3;
V := - x + y nếu x <= 1 và y > 0;Chuyển qua bước 3;
V := - x - y nếu x <1 và y <=0;Chuyển qua bước 3; B3: In giá trị của v
Bước 3: Chương trình
If (x > 1) and (y > 1) then v:=x + y
Else
If (x > 1) and (y <= 1) then v:=x - y Else
If (x <= 1) and (y <=0 ) then v:=x + y Else v:= - x – y;
Trang 8Writeln(‘ Gia tri cua ham la ‘,v);
Hoặc:
If (x > 1) and (y > 1) then v:=x + y ;
If (x > 1) and (y <= 1) then v:=x + y ;
If (x <= 1) and (y >0) then v:=x + y ;
If (x <= 1) and (y <=0) then v:=x + y ;
Bước 4:Thiết kế bài tập tương tự:
Tính giá trị của y
x – 1 nếu x>=1;
Y= x+ 1 nếu (x>=0) và (x<1)
– x – 1 nếu (x<0)
Bài 8: Bài 3.18:
Bước 1: Xác định Input, Output
Input: m,n,k
Output: Nếu là cấp số cộng thì gấp đôi giá trị mỗi số
Nếu không thì giảm mỗi số một đơn vị
Bước 2: Ý tưởng giải thuật
Kiểm tra điều kiện k+m=n*2?
Nếu điều kiện đúng thì nhân đôi mỗi số, nếu sai thì giảm mỗi số một đơn vị
Sơ đồ khối:
Begin
Nhập m,n,k
m+k=n*2
m:=m*2;
n:=n*2;
k:=k*2;
m:=m-1;
n:=n-1;
k:=k-1;
In m,n,k
End
F
T
Nhập m,n,k
m+k=n*2
Trang 9Bước 3: Chương trình
Var m,n,k:integer;
Begin
Write('Nhap 3 so m,n,k');
Readln(m,n,k);
If m+k=n*2 then
Begin
m:=m*2;
n:=n*2;
k:=k*2;
End
Else
Begin
m:=m-1;
n:=n-1;
k:=k-1;
End;
Write('Gia tri m,n,k sau khi kiem trala:',m:3,n:3,k:3);
Readln;
End
Bước 4:
Bộ test:
3, 4, 7 Không phải là cấp số cộng 2, 3, 6
Bài tập tương tự: Nhập vào 3 số a, b, c, kiểm tra xem có phải a, b, c tạo thành cấp số nhân
không? Nếu là cấp số cộng thì thông báo đồng thời gấp đôi mỗi số Ngược lại thì giảm mỗi
số 2 đơn vị
Bài 9: Bài 4.20
Bước 1: Xác định Input, Output
Input: Nhập xâu bất kì
Output: Chuẩn hóa xâu
Bước 2: Ý tưởng giải thuật
- Dùng lệnh while s[1]=' ' do delete(s,1,1) để xóa các kí tự trắng đầu xâu
- Dùng lệnh while s[length(s)]=' ' do delete(s,length(s),1) để xóa các kí tự trắng cuối xâu
- Dùng lệnh while pos(' ',s)<>0 do delete(s,pos(' ',s),1) để xóa những kí tự trắng liền nhau ở giữa xâu
Trang 10Sơ đồ khối:
Begin
Nhập xâu s
s[1]=#32
delete(s,1,1);
s[length(s)]=#32
delete(s,length(s),1);
Pos(‘ ‘,s)<>0
delete(s,pos(‘ ‘,s),1;
In xâu s
F
T
F
F
T
T
End
Trang 11Bước 3: Chương trình
Var s:string;
Begin
Writeln('Nhap xau bat ki:');
readln(s);
while s[1]=' ' do
delete(s,1,1);
while s[length(s)]=' ' do
delete(s,length(s),1);
while pos(' ',s)<>0 do
delete(s,pos(' ',s),1);
Writeln('xau sau khi chuan hoa: ',s);
Readln;
End
Bước 4:
- Bộ test:
Phan Thị Bình Phan Thị Bình
- Xây dựng bài toán tương đương:
Nhập xâu bất kì, đếm số từ có trong xâu ( từ là tập hợp các kí tự kết thúc bằng dấu cách)
Trang 12Bài 10: Bài 3.40 Nhập vào bàn phím số nguyên dương N (0<N<2*109) Tính và đưa ra màn hình tổng bình phương các chử số của N Ví dụ, với N=125, tổng bình phương các chử
số cảu nó sẽ là 12
+22+52=30
Phân tích bài toán
Bước 1 Tìm hiểu đề bài
- Input: N nguyên dương (0<N<2*109
)
- Output: tổng bình phương các chử số của N
- Tổng bình phương các chử số bằng tổng bình phương của tất cả các chử số có mặt trong số đó
Bước 2 Xây dựng ý tưởng giải thật
- Để tính tổng binh phương các chử số thì ta phải lấy ra được các chử số của số đó
- Cách lấy các chử số trong một số:kết hợp hai toán tử MOD và DIV ta sẽ lần lượt lấy được từng số dư trong từng hàng đơn vị, chục, trăm, nghìn
- Bình phương chúng lên rồi cộng dồn vào biến tổng sẽ cho ta kết quả cần tính
- Sơ đồ khối
Bước 3 Viết chương trình
Var N:longint;
Tong:interger;
Du:byte;
Begin
Repeat
Write (‘ Nhap N= ‘); Readln (N);
If (N≤0) or(N≥2.exp(9*ln(10))) Then write(‘ Nhap lai N ’);
Until (N>0) and (N<2.109)
Begin
Nhập N
Tong:=0
Du:= N mod 10;
Tong:= tong + sqt(du);
N:= N div 10;
Trang 13Tong:=0;
White N>0 do
Begin
Du:= N mod 10;
Tong:=Tong + sqr(du);
N:=N div 10;
End;
Writeln (‘ Tong binh phuong cac so cua ‘,N, ‘ la: ‘, Tong’);
Readln;
End
Chú ý:
- Điều kiện ràng buộc đầu vào của N (N>0) and (N<2.109)
- Điều kiện lặp N>0 chứ không phải là N≥0 Vì khi N=0 thì phải dừng lặp, các câu lệnh dưới không có ý nghĩa nữa
- Kiểu dữ liệu: N là longint (vì 0<N<2*109)., Tong phải là Interger; du là byte (vì du chỉ nhận giá trị từ 0 9)
Bước 4 Nghiên cứu về lời giải
- Xây dựng bộ text
- Mở rộng bài toán: có thể thay vòng lặp While do bằng vòng lặp Repeat until
- Lớp bài toán tương đương
+ Nhập số N nguyên dương và cho biết N có bao nhiêu chử số, tính tổng các chử số đó?
+ Phân tích số thành tích của các thừa số nguyên tố
+ Viết hàm Dao_so(N) để cho ra số nghịch đảo của số đó?
Trang 14Bài 11: Bài 3.16 (Sách bài tập Tin Hoc 11)
Lập trình nhập từ bàn phím hai số nguyên khác nhau m và n, thay số nhỏ hơn bằng hiệu của
số lớn với số bé, thay số lớn hơn bằng tổng của hai số ban đầu Đưa ra các giá trị mới của m
và n ra màn hình
Giải:
* Tìm hiểu đề bài:
In put: m,n
Out put: giá trị mới của m,n
* Ý tưởng giải thuật:
-Bước 1: Nhập vào m, n từ bàn phím
-Bước 2: Nếu m>n thì
Tg:=m;
m:=m+n;
n:=tg-n;
Nếu n>m thi
Tg:=n;
n:= n+m;
m:=tg-m;
-Bước 3: Đưa ra màn hình giá trị mới của m và n
-Bước 4: Kết thúc
Sơ đồ khối:
* Thuật toán:
var m,n,tg:integer;
Be gin Nhập m,n
m>=n
Tg:=n;
n:= m-n;
m:=tg+m
Tg:=m;
m:= n-m;
n:=tg+n
In ra m, n
End
Đ
S
Trang 15begin
write('Nhap vao 2 so m,n:');readln(m,n);
if m>n then
begin
tg:=n;
n:=m-n;
m:=tg+m;
end
else
begin
tg:=m;
m:=n-m;
n:=tg+n;
end;
writeln('gia tri moi cua m la:',m);
writeln('gia tri moi cua n la:',n);
readln;
end