1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

17 395 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 17
Dung lượng 106 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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.. Câu: Lập chương trìn

Trang 1

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]);

Trang 2

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;

Trang 3

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

Trang 4

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’)

Trang 5

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:

*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;

Trang 6

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

Trang 7

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 k<n thì k<- F1+F2

F1<- 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 k<n do

Begin

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 K<a[1] thì:

K= F1+F2

F1=F2

F2=K

Trang 8

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 K<a[1] do

Begin

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:

Trang 9

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 <j-i+1 thì:

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:

Trang 10

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ì

Trang 11

Đề: 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

Trang 12

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];

Trang 13

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 k<n thì

Nếu min>=p[i] thì

o Minp[i];

o k:=i;

Nếu max<p[i] thì

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

Trang 14

Đề: 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

Trang 15

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 i<n thì t t*i

i 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 i<n thì e=max(a[i],a[i-1])

d=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ì

Trang 16

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

Ngày đăng: 06/02/2017, 19:36

TỪ KHÓA LIÊN QUAN

w