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

môn phương pháp môn tin học(sp huế)

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 (114.88 KB, 17 trang )

Câu: Viết chương trình bằng phương pháp khử đệ quy tìm ước chung lớn nhất của
hai số:
Bước 1: Input, Output
Bước 2: Ý tưởng:
+ Thuật toán:
B1: Nhập vào hai số a, b.
B2: Nếu b<>0 thì:
Du  a mod b
A  b;
B  du;
Quay lại B2;
B3: Thông báo kết quả UCLN của a, b là a.
Bước 3: Trình bày lời giải:
Var du, a, c: integer;
Begin
Write(‘Nhap 2 so a, b: ‘); readln(a,b);
While b<>0 do
Begin
D:=a mod b;
A:=b;
B:=du;
End;
Writeln(‘UCLN cua a va b: ‘, a);
Readln;
End.
Bước 4: Xây dựng bộ kiểm thử:
TH1: a=15; b=9;
TH2: a=70; b=25;
TH3: a=10; b=7;
Câu: Viết chương trình bằng phương pháp khử đệ quy in ngược một số nguyên
dương n.


Bước 1: Input, Output.
Bước 2: + Ý tưởng:
+ Thuật toán:
B1: Nhập số N, Nếu N <0 quay lại bước 1.
B2: S  ‘’; str(N,S); I length(s);
B3: Nếu i>0 thì in S[i]; I i-1; quay lại B3.
B4: Kết thúc.
Bước 3:
Var n,i:integer; S:string;
Begin
Repeat
Writeln(‘Nhập N: ‘); readln(n);
Until n>0;
S:=’’; str(N,s); i:=length(S);
For i:=length(s) downto 1 do write(s[i]);


Readln;
End.
Bước 4: Xây dựng bộ kiểm thử
TH1: N=123
TH2: N=246840
TH3: N=101214100.
Câu: Lập chương trình kiểm tra 1 số N (nguyên dương) cho trước có phải:
a) Là một số nguyên tố.
b) Là một số hoàn thiện.
c) Là một số thỏa mãn tính chất A nào đó (là một số chính phương)
a) Bước 1: Input, Output
Bước 2: Tìm cách giải
+ Ý tưởng:

+ Thuật toán:
B1: Nhập N
B2: I  2
B3: Nếu I > n thì đến B5
B4: Nếu n mod I <>0 thì I  i+1 và quay lại B3.
B5: Nếu i=n thì xuất n là số nguyên tố ngược lại xuất n không là số
nguyên tố.
Bước 3: Trình bày lời giải
Var I, n:integer
Begin
Write(‘Nhap n: ‘); readln(n);
I:=2;
While n mod I <> 0 do i:=i+1;
If i=n then write(n, ‘la so nguyen to’)
Else write(n,’Khong la so nguyen to’);
Readln;
End.
Bước 4:
+ N=6; N=17
b) Bước 1: Input, Output
Bước 2: + Ý tưởng:
+ Thuật toán:
B1: Nhập n;
B2: I  1; t  0;
B3: Nếu I >= n thì qua B5
B4: Nếu n mod I = 0 thì tt+I, I  i+1 và quay lại B3.
B5: Nếu T=n thì xuất T là số hoàn thiện. Quay lại xuất T không là
số hoàn thiện.
Bước 3: Trình bày lời giải
Var n, T, i: integer;

Begin
Write(‘Nhap n: ‘); readln(n);
T:=0;


For i:=1 to n-1 do
If n mod i=0 then t:=t+1;
If T=n then write(n, ‘la so hoan thien’)
Else write(n,’khong la so hoan thien’);
Readln;
End.
Bước 4: Xây dựng bộ test
N=6; N=12
c)
Bước 1: Input, Output
Bước 2: + Ý tưởng:
+ Thuật toán:
B1: Nhập n;
B2: Nếu sqrt(n)=round(sqrt(n)) thì xuất n là số chính phương.
Ngược lại xuất n không là số chính phương.
Bước 3: Trình bày lời giải
Var n:integer;
Begin
Write(‘Nhap n:’); readln(n);
If sqrt(n) = round(sqrt(n)) then write(n,’la so chinh phuong’)
Else write(n,’khong la so chinh phuong’);
Readln;
End.
Bước 4: N=4, N=10;
Câu: Viết chương trình con (hàm, thủ tục) tính bội số chung nhỏ nhất của 2 số

nguyên a, b. Hãy cho biết trong trường hợp này viết CTC dưới dạng hàm hay dưới
dạng thủ tục là thuận tiện hơn? Vì sao?
Bước 1: Input: Cho a, b (a, b >0); Output: BCNN(a,b)
Bước 2: +Ý tưởng:
+ Thuật toán:
B1: Nhập a, b; Nếu a, b <0 thì quay lại B1.
B2: m  a; n b;
B3: Nếu n<>0 thì
Du  m mod n;
M  n;
N  du; Quay lại B4.
BCNN  (a*b)/m;
B4: In kết quả và Kích tình
Bước 3:
Var a, b, n:integer;
Function BCNN(a,b:integer):real;
Var m, n, du:integer;
Begin
M:=a;
N:=b;
While n<>0 do


Begin
Du:=m mod n;
M:=n;
N:=du;
End;
Begin
Write(‘Nhap a:’); readln(a);

Write(‘Nhap b: ‘); readln(b);
Write(‘BCNN la:’,BCNN(a,b):10:2);
Readln;
End.
Bước 4: TH1: a=1; b=3; TH2: a=6; b=9; TH3: a=6; b=7
Câu: lập phương trình để loại bỏ một phần tử ra khỏi mảng A gồm n phần tử cho
trước( mỗi phần tử là một số nguyên)
a) Loại bỏ phần tử tại vị trí k
Bước 1: input: {an}, k
Output: dãy{an} sau khi xóa phần tử thứ k.
Bước 2:
• ý tưởng: duyệt phần tử tại vị trí k và đẩy dần các phần tử vị trí sau lên,
vị trí a[k]=a[k+1]
• Thuật toán:
B1: nhập N, dãy A, vị trí k
B2: Nếu k>N thì qua B5
B3: i<- k
B4: Nếu i<= N-1 then
a[i]<- a[i+1];
i<- i+1;
Quay lại B4
N<- N-1, qua B6
B5: Xuất vị trí xóa vượt quá số phần tử.
B6: Xuất dãy sau khi xóa, dừng TT
Bước 3:
Var a: array[1..10] of integer;
n,i:integer;
Begin
Write(‘c’ho biet so phan tu cua day:’);
Readl(n);

For i:= 1 to n do
Begin
Write(‘Nhap a[=’,I,’]=’);
Readln(a[i]);
Writeln;
End;
Write(‘nhap vi tri loai bo:’);
Readln(k);
If k>n then write(‘vi tri xoa vuot qua ptu’)


Else
Begin
For i:=k to n -1 do a[i]:= a[i+1];
n:=n-1;
Writeln(‘day sau khi xoa la:’);
For i:=1 to n do write(a[i]:4);
End;
Readln;
End.
Bước 4: Xây dựng bộ kiểm thử.
b) Loại bỏ phần tử có giá trị bằng x
Bước 1: input, output
Bước 2:
*Ý tưởng.
*Thuật toán:i
B1: Nhập n, dãy a, giá trị cần xóa x
B2: i<- 1
B3: Nếu i<= n thì
Nếu a[i]= x thì

Xóa phần tử a[i] tại vị trí
i<= 1
Ngược lại i<- i+1
Quay lại B3.
B4: Xuất dãy đã xóa, kết thúc thuật toán.
Bước 3:
Var a:array[1..10] of integer;
n, i, x, j: integer;
procedure xoa(n:integer);
var j:integer;
begin
if k:=n then write(‘vi tri xoa lon hon so ptu:’)
else
begin
for i:=k to n-1 do a[j]:= a[j+1];
n:=n-1;
end;
end;
begin
write(‘cho biet so phan tu cua day:’);
readln(n);
for i:=1 to n do
begin
write(‘nhap a[=’,i,’]=’);
readln(a[i]);
writeln;
end;


write(‘nhap vi tri can xoa:’);

readln(x);
j:= 1;
while j<=n do
begin
if a[j] = x then
begin
xoa(j);
j:=1;
end
else j:= j+1;
end;
writeln(‘day sau khi xoa:’);
for i:= 1 to n do write(a[i]:4);
readln;
end.
Bước 4: Xây dựng bộ kiểm thử.
Câu: Liệt kê tất cả các số chính phương nhỏ hơn 1 số n cho trước.
Bước 1: input, output.
Bước 2:
*Ý tưởng:
*Thuật toán:
B1: nhập n
B2: Nếu n<0, quay lại B1.
B3: i<- 1
B4: Nếu i>n, qua B5
Ngược lại:
. Nếu sqrt(i)= round(sqrt(i)) thì in I;
. i<- i+1;
B5: Kết thúc thuật toán.
Bước 3:

Var n,i: integer;
Begin
Repeat
Write(‘nhap n:’);
Readln(n);
Until n>0;
For i:=1 to n-1 do
If sqrt(i)= round(sqrt(i)) then write(i);
Readln;
End.
Bước 4: Bộ kiểm thử
Đưa ra 1 vài số n để kiểm tra.
-TH1: n= 15
-TH2: n=26
-TH3: n:=30


Câu: Xây dựng hàm kiểm tra một số n nguyên dương có phải là một số thuộc dãy
Fibonacci hay không? Hàm trả về giá trị TRUE nếu n là số thuộc dãy Fibonacci, còn
không hàm cho giá trị FALSE.
Bước 1: input, output.
Bước 2:
*Ý tưởng:
*Thuật toán:
B1: nhập n
B2: kiemtra:= false; F1<- 1, F2<- 1, k<- 0;
B3: Nếu kF1<- F2
F2<- k
Quay lại B3.

B4: Nếu k<>n thì kiemtra<- F
Ngược lại kiemtra<- T.
Bước 3:
Function kiemtra(n: integer): Boolean;
Var
Begin
F1:=0; F2:=0; k:=0;
While kBegin
K:=F1 + F2;
F1:= F2;
F2:= k;
End;
If k<> n then kiemtra:= False
Else kiemtra:=True;
End;
Bước 4: Xây dựng bộ kiểm thử.
Câu: Hãy xđ một dãy cho trước có phải là dãy Fibonaci không?
Bước 1:
Input: dãy số
Output: dãy có thuộc dãy Fibonaci không?
Bước 2: ý tưởng
Kiểm tra phần tử đầu tiên có thuộc dãy Fibonaci không, nếu không thuộc thì dừng thuật
toán và kết luận dãy không thuộc dãy Fibonaci. Ngược lại, kiểm tra dãy theo tính chất
F(n) = F(n-1) + F(n-2)
Thuật toán:
B1: nhập dãy
B2: F1=0, F2=1, K=0, i=2
B3: nếu KK= F1+F2

F1=F2
F2=K


Quay lại B3
B4: Nếu K <> a[1] thì dãy không thuộc Fibonaci, qua B7
B5: Nếu i<=n và a[i]=a[i-1] +F1 thì:
F1=a[i-1]
i=i+1
quay lại B5
B6: Nếu i>n thì dãy thuộc Fibonaci, ngược lại không thuộc
B7: Dừng thuật toán
Bước 3: chương trình
Var a: array[0..100] of integer;
n,k,F1,F2,i: integer;
begin
write(‘nhap phan tu cua day:’);
readln(n);
for i:= 1 to n do
begin
write(‘nhap phan tu’,i,’=’);
readln(a[i]);
end;
F1:=0; F2:=1; K:=0; i:=2;
While KBegin
K= F1+F2
F1=F2
F2=K
End;

If k=a[1] then
Begin
While(i<=n) and (a[i]=a[i-1]+F1) do
Begin
F1:= a[i-1];
i:=i+1;
end;
if (i>n) then write(‘day thuoc Fibonaci’)
else
write(‘day khong thuoc Fibonaci’);
end
else
write(‘day khong thuoc Fibonaci’);
readln;
end.
Viết chương trình nhập vào một xâu S bất kì. Thông báo lên màn hình xâu con tăng S1
của xâu S có độ dài lớn nhất, trong trường hợp 2 xâu bằng nhau lấy xâu trước.
Giải
Bước 1:


Input: xâu S
Output: xâu con tăng
Bước 2:
ý tưởng:
thuật toán:
B1: nhập vào xâu S
B2: khởi tạo: i=1; max=0; n=(độ dài xâu S)
B3: nếu i>n thì qua B6
B4: j=i

B5: nếu j<n và s[j+1] > s[j] thì:
J=j+1;
Quay lại B5
B6:
Nếu max Max=j-i+1
Luu-i=i
I=j+1
Quay len B3
B7: thông báo S1=copy(s,luu-I,max);
Dừng chương trình
Bước 3: Chương trình
Var s1,s2:string;
N, I, j, max, luu-i: integer;
Begin
Write(‘nhap chuoi:’);
Readln(s);
i:=1;
max:=0;
n:=length(s);
while i<=n do
begin
j:=I;
while (j<n) and (s[j+1]>s[j]) do j:=j+1;
if (max < j-i+1) then
begin
max:=j-i+1;
luu-i:=i;
end;
i:=j+1;

end;
s1:=copy(s,luu-i,max)
write(s1);
readln;
end.
Bước 4: bộ kiểm thử, bộ test
Liệt kê các phần tử của dãy số thỏa mãn các tính chất:


Là một số nguyên tố
Là một số hoàn thiện
Là một số chính phương
Giải
Bước 1:
Input:
Output:
Bước 2: ý tưởng
Thuật toán
B1: nhập n, dãy a;
B2: i=1;
B3: nếu i<=n thì
Nếu sqrt(a[i])=round(sqrt(a[i])) thì in a[i];
i=i+1;
quay lại B3
bước 3: Chương trình
var a: array[0..100] of integer;
i,n: integer;
begin
write(‘nhap n:’); readln(n);
write(‘nhap mang a’);

for i:=1 to n do
begin
write(‘a[‘,i,’]=’);
readln(a[i]);
end;
writeln(‘cac so chinh phuong trong day la’);
for i:= 1 to n do
if sqrt a[i] = round(sqrt(a[i])) then write(a[i]);
readln;
end.
Bước 4: xây dung bộ kiểm
Số hoàn thiện
Bước 1:
Input:
Output:
Bước 2:
Ý tưởng
Thuật toán
B1: nhập n, dãy a
B2: i=1
B3: nếu i>n thì quay xuống B5
B4: t=0; j=1;
Nếu j<=a[i]-1 thì


Đề: Viết chương trình liệt kê các chữ số thỏa mãn điều kiện: Tổng các chữ số hàng trăm
và chữ số hàng bằng chữ số hàng đơn vị, chữ số hàng chục gấp đôi chữ số hàng nghìn.
Bước 1: input, output
Bước 2:
+ Ý tưởng:…

+ Thuật toán:
Bước 1: n1;t0;c0;dv0
Bước 2: Nếu (n+t= dv) và (c=n*2) thì in (1000*n+100*t+10*c+dv)
Bước 3: Nếu dv<9 thì dv dv+1. Quay lại bước 2
Bước 4: Nếu c<9 thì cc+1; dv 0
Bước 5: Nếu t<9 thì t t+1; dv  0; c0
Bước 6: Nếu N<9 thì n n+1; dv0; c0;t0
Bước 7: KTTT
Bước 3: Chương trình
Var n, t, c, dv: integer;
Begin
n:=1; t:=0;c:=0; dv:=0;
for n:=1 to 9 do
for t:=9 to 9 do
for c:=9 to 9 do
for dv:=9 to 9 do
if (n+t=dv) and (c=n*2) then
write(n*100+t*100 +c*10 +dv);
readln;
end.
Bước 4:
Bài: Tìm tất cả các số tự nhiên < 10000 mà tổng các ước của nó bằng chính nó.
Bước 1: input, output
Bước 2:
+ Ý tưởng:…
+ Thuật toán:
Bước 1: i1; j0; s0;
Bước 2: Nếu i>10000 thì đến bước 6;
Bước 3: Nếu j>I div 2 thì chuyển đến bước 5
Bước 4: Nếu I mod j =0 thì

S S+j;
J  j+1;
Quay lại bước 3;
Bước 5: NếuS=i thì in ra màn hình
Bước 6: Nếu ii+1 quay lại bước 2
Bước 7: KTTT


Bước 3: Chương trình
Var i, j, S: integer;
Begin
for i:=2 to 10000 do
begin
for j:=i div 2 to 9 do
if ( i mod j =0) then
S S+j;
end;
If S= i then write(i:5)
readln;
End.
Đề: Cho 2 dãy số nguyên A=(a1,a2,a3….,a), B=(b1,b2,b3….,bn), C=(c1, c2, c3,…., cn)
được xđ như sau:
Ci =ak với i=2k-1,k=1,..n
Bk với i=2k;k=1,..n
Hãy lập trình:
a. Nhập từ bàn phím số nguyên N(2<=N<=20), dãy số nguyên A, B
b. Tạo và đưa ra màn hình dãy C
Bước 1: input, output
Bước 2:
+ Ý tưởng:…

+ Thuật toán:
Bước 1: Nhập N, 2 dãy {An}, {Bn}
Bước 2: i 1; k1;
Bước 3:+ Nếui<2*n thì
Nếu i=2*k-1 thì C[i]A[k]
Ngược lại thì:
C[i]  B[k];
K k+1;
+ ii+1;
+ quay lại bước 3;
Bước 4: Xuất dãy C. KTTT
Bước 3: Chương trình
Var A, B, C:array[1..100] of integer;
n, k:integer;
Begin
Write(‘ Nhap n:’);
Readln(n);
for i:=1 to n do
Begin
Write(‘A
Write(‘A[’, i, ‘]=’);
Readln(B[i]; [’, i, ‘]=’);
Readln(B[i];


End;
k:=1;
for i:=1 to 2*n do
if i=2*k-1 then C[i]:=A[k]
else

begin
C[i]:=B[k];
k:= k+1;
end;
for i:=1 to 2*n do
write(C[i]:5);
readln;
end.
Đề: Cho dãy số nguyên P= (p1, p2,……,pn), 2<=n<=100. Biết rằng không phải mọi phần
tử của P đều bằng nhau. Hãy :
a. Khai báo các biến cần sử dụng
b. Viết đoạn chương trình đổi chỗ hai phần tử lớn nhất và nhỏ nhất cho nhau. Nếu có
phần tử lớn nhất hoặc nhỏ nhất thì đổi chỗ phần tử lớn nhất có chỉ số với phần tử
nhỏ nhất có chỉ số lớn nhất
Vd: p=(4, 3, 3, 4, 5, 6, 8, 6, 8)
N=9
P= (4, 3, 8, 4, 5, 6, 3, 6, 8)
Bước 1: input, output
Bước 2:
+ Ý tưởng:…
+ Thuật toán:
Bước 1: Nhập N, dãy P={p1, p2, ……,pn}
Bước 2: Kiểm tra (n<2) hoặc (n>10) thì nhập lại n, quay lại b1;
Ngược lại, nếu p1=p2=….pn
Bước 3: minp[1]; maxp[1]; i1; k1; l1;
Bước 4:+ Nếu kNếu min>=p[i] thì
o Minp[i];
o k:=i;
Nếu max

o Maxp[i]
o L:=i;
+ i i+1;
+ quay lại b4;
Bước 5: Hoán đổi 2 giá trị p[k] và p[l]
Bước 6: Xuất lại dãy P. KTTT
Bước 3: Chương trình


Đề: Viết chương trình cho biết một số nguyên dương n có bao nhiêu chữ số.
Bước 1: input, output
Bước 2:
+ Ý tưởng:…
+ Thuật toán:
Bước 1: Nhập N
Bước 2: dem 1; nn div 10;
Bước 3:+ Nếu n=0 chuyển sang
Ngược lại:
Dem dem +1;
N n div 10;
+ quay lại bước 3;
Bước 4: Xuất dem. KTTT
Bước 3: Chương trình
Var dem, n:integer;
Begin
Write(‘ Nhap n:’);
Readln(n);
dem:=1;
n:= n div;
if n=0 then write(‘so n co’, dem, ‘chu so’);

while n<>0
begin
dem:=dem+1;
n:= n+1;
end;
write(‘so n co’, dem, ‘chu so’);
readln;
end.
Đề: Viết chương trình liệt kê các chữ số có ba chữ số: Tổng các chữ số của nó bằng một
số a và tích các chữ số b (a, b la số cho trước)
Bước 1: input, output
Bước 2:
+ Ý tưởng:…
+ Thuật toán:
Bước 1: Nhập a, b;
Bước 2: t1; c0, dv0;
Bước 3: Nếu (t+c+dv=a) và (t*c*dv=b) thì in ra t*100+c*10+dv
Bước 4: Nếu dv<9 thì dvdv+1. Quay lại b3
Bước 5: Nếu c<9 thì cc+1;
dvdv+1. quay lại b3
Bước 6: Nếu t<9 thì tt+1;
C0; dv0. quay lại b3
Bước 7: KTTT


Bước 3: Chương trình
Var n, t, c, dv, a, b: integer;
Begin
Write(‘nhap a, b’);
Readln(a,b);

t:=1; c:=0; dv:=0;
for t:=1 to 9 do
for c:=9 to 9 do
for dv:=9 to 9 do
if (t+c+dv=a) and (t*c*dv) then
write(t*100+c*10 +dv);
readln;
end.
Đề: Viết chương trình tính n! bằng phương pháp khử đệ quy.
Ý tưởng:
Thuật toán:
Bước 1: Nhập n
Bước 2: i  1, t  1
Bước 3: Nếu (n=0) thì thông báo giai thừa =0
Bước 4: Nếu ii i+1
quay lại bước 4.
Bước 5: thông báo kết quả n!=t
Dừng tt
Chương trình:
Function gthua(n:integer):longint;
Var i:integer; t:longint;
Begin
If (n=0) then gthua:=0
Else begin
T:=1;
For i:=1 to n do t:=t*I;
End;
Gthua:=t;
End;

Đề: Tìm bội chung nhỏ nhất của một dãy số.
Ý tưởng:
Thuật toán:
Bước 1: Nhập dãy a có n phần tử
Bước 2: Nếu n=1 thì BCNN là a[n], KTTT
Bước 3: i1
Bươc 4: Nếu id=e, qua bước 5.
Ngược lại BCNN của dãy là e, KTTT
Bước 5: Nếu (e mod a[i]=0) and (e mod a[i+1]=0) thì


a[i+1]=e
i=i+1, quay lại bước 4.
Ngược lại e=e+d, quay lại bước 5.
Chương trình:
Var a:array[1..100] of integer;
Begin
Write(‘nhap n:’); readln(n);
For i:=1 to n do
Begin
Write(‘a[‘,i,’]=’); readln(a[i]);
End;
If n=1 then write(‘BCNN la:’,a[n]);
Else
For i:=1 to n-1 do
Begin
If a[i] > a[i+1] then e:=a[i]
Else e:=a[i+1];
While (e mod a[i] <>0) or (e mod a[i+1] <>0) do

Begin
E:=e+d;
A[i+1]:=e;
End;
Write(‘BCNN cua day la:’,e);
End.
Đề: Liệt kê tất cả các dãy nhị phân có độ dài n. (không đệ quy)
Ý tưởng:
Thuật toán:
Bước 1: nhập n
Bước 2: khởi tạo (a[1],a[2],…,a[n]=0), in cấu hình khởi tạo, in
Bước 3: Nếu i>=1 thì
Nếu a[i]=0 thì
-a[i]=1
-in dãy a ra màn hình
-in
Ngược lại
-a[i]=0
-ii-1
Bước 4: KTTT
Chương trình:
program np;
var a:array[1..50] of integer;
i,n,j,t:integer;
begin
write('nhap n:'); readln(n);
for i:=1 to n do


begin

a[i]:=0;
write(a[i]:5);
end;
i:=n;
while (i>=1) do
begin
if a[i]=0 then
begin
a[i]:=1;
writeln;
for t:=1 to n do write(a[t]:5);
i:=n;
end
else
begin
a[i]:=0;
i:=i-1;
end;
end;
readln;
end.



×