Một số bài tập lập trình Pascal - Ngô Hùng

doc 28 trang ngocly 2680
Bạn đang xem 20 trang mẫu của tài liệu "Một số bài tập lập trình Pascal - Ngô Hùng", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • docmot_so_bai_tap_lap_trinh_pascal_ngo_hung.doc

Nội dung text: Một số bài tập lập trình Pascal - Ngô Hùng

  1. Pascal : Mảng 1 chiều Một số bài tập lập trình Pascal Created by NgoHung Vấn đề 3: Mảng 1 chiều Bài tốn số 3.1: Nhập xuất và tính tổng các phần tử trong mảng. Ví dụ: A: 1 5 6 7 4 Kết quả: Tong S = 23 Hướng dẫn: Để giải quyết bài tốn cần phải đảm bảo các vấn đề: - Nhập mảng, cĩ thể xây dựng thành hàm để đĩng gĩi và sử dụng lại. Các thao tác theo yêu cầu: (1) Nhập số N. (2) Tiến hành lặp (từ 0 đến N-1) và nhập cho các giá trị Ai trong mảng. Lưu ý: N phải được vào truyền theo dạng tham biến (tức là &N) - Xuất mảng. Cơng việc đơn giản là sử dụng vòng lặp từ 0 đến N-1 để in ra các giá trị Ai cho mảng. Sau đĩ, Writeln xuống dịng. - Hàm tính tổng các phần tử cho một mảng A o Khai báo và khởi tạo tổng S là 0. o Sử dụng một vịng lặp (từ 0 đến N-1 để duyệt qua tất cả các giá trị Ai) để tính cộng dồn giá trị của Ai vào tổng S. - Viết thân chương trình chính với nội dung dùng để kiểm tra kết quả thực hiện của hàm. o Khai báo mảng A cĩ tối đa 20 phần tử và biến N chỉ số lượng phần tử của A. o Gọi hàm nhập mảng để nhập mảng A, với N phần tử. o Gọi hàm xuất mảng A, với N phần tử. o In giá trị của tổng các phần tử bằng cách truyền trực tiếp giá trị trả về của việc tính tổng cho Writeln( )
  2. o Gọi hàm Readln( ) trước khi kết thúc để dừng lại xem kết quả. Chương trình: { 1. Cac khai bao cho chuong trinh } Program Mang1C; Uses crt; Type Mang20 = array[1 20] of Integer; Var N:Integer; A:Mang20; { 2. Thu tuc nhap mang A voi N la so phan tu } Procedure NhapMang1C(Var A : Mang20 ;Var N:Integer); Var i: Integer; Begin Write( 'So luong phan tu:' ); Readln( N); For i:=0 to N do Begin Write( 'Nhap phan tu thu ', i,'' ); Readln( A[i] ); End; End; { 3. Thu tuc xuat mang A voi N la so phan tu } Procedure XuatMang1C( Var A : Mang20;Var N :Integer ); Var i:Integer; Begin
  3. For i :=0 to N do Write( A[i]:2 ); Writeln; End; { 4. Chuong trinh con tinh tong cac phan tu trong mang } Function TongMang1C( A : Mang20; N:Integer):longint; Var i :Integer; S :longint; Begin S := 0; For i:=0 to N do S := S + A[i] ; TongMang1C:=S; End; { 5. Than chuong trinh chinh } BEGIN NhapMang1C( A, N ); XuatMang1C( A, N ); Writeln(' Tong cac phan tu trong mang ', TongMang1C(A, N) ); Readln; END.
  4. Bài tốn tương tự: (1) Tính tổng các số nguyên dương chia hết cho 5. Function TongSoChiaHet5( A:Mang20, N:Integer):Integer; Var S,i :Integer; Begin S:=0; For i:=0 to N do If(A[i] mod 5=0) S := S+A[i]; TongSoChiaHet5:= S; End; (2) Tính tổng các số nguyên tố trong mảng Function LaSoNT( Var N:Integer) :Integer; Var i:Integer; Begin For i:=2 to N-1do If(N mod i = 0) then return 0 Else return 1; End; Function TongSoNT(Var A : Mang20, Var N:Integer):Integer; Var S,i:Integer;
  5. Begin S:=0; For i:=0 to Ndo If ( LaSoNT( A[i] ) ) then S :=S+ A[i]; TongSoNT :=S; End; Bài tốn số 3.2: Đếm số lần xuất hiện của giá trị X trong mảng A. Đếm số lần xuất hiện của các phần tử trong mảng. Ví dụ: A: 1 5 6 7 4 1 5 5 1 1 X: 6 Kết quả: So lan xuat hien X la 1 So lan xuat hien cua cac phan tu: 1 ==> 4 5 ==> 3 6 ==> 1 7 ==> 1 4 ==> 1 1 ==> 4 . Hướng dẫn: + Viết hàm đếm số lần xuất hiện củat một giá trị X nào đĩ được nhập vào, và xem như X nhà là tham số cho việc đếm số lần xuất hiện của nĩ trong A + Viết hàm in ra số lần xuất hiên của tất cả các phần tử trong mảng, sử dụng lại hàm đã xây dựng ở trước. + Xây dựng chương trình giải quyết bài tốn trên gồm: - Khai báo mảng A, N phần tử. - Nhập / Xuất mảng A với N phần tử (lưu ý, phải cĩ định nghĩa hàm nhập /xuất mảng).
  6. Hai hàm này được sử dụng kết quả của bài tốn 3.1 - Nhập giá trị X cần đếm số là xuất hiện. - In số lần xuất hiện của X trong A. Ý tưởng: o Khởi tạo biến đếm ban đầu là 0. o Sử dụng vịng lặp i, lặp từ 1 đến N. o Đối với mỗi phần tử A[i], nếu A[i] = X thì tăng biến đếm lên 1 o Kết thúc, giá trị biến đếm là số lần xuất hiện cử X trong A. - In số lần xuất hiện của các phần tử trong A. Các hàm xây dựng: { 1. Dem so phan tu A[i] trong mang bang gia tri X } Function DemPtuX(Var A : Mang20; N, X : Integer) : Integer; Var i , Count : Integer; Begin Count := 0; For i:=0 to N do If ( A[i] = X ) then Count := Count + 1; DemPtuX := Count; End; { 2. Dem so lan xuat hien cua tat ca cac phan tu trong mang } Procedure InSoLanXHcuaPTu( A:Mang20; N: Integer);
  7. Var i :Integer; Begin For i:=0 to N do Writeln( A[i] ,' ===> ', DemPtuX( A, N, A[i] ) ); End; Source code chương trình chính: BEGIN Clrscr; NhapMang1C( A, N ); XuatMang1C( A, N ); Write( 'Gia tri X:' ); Readln( X ); Writeln( 'So lan xuat hien trong A la:', DemPtuX(A, N, X) ); InSoLanXHcuaPTu ( A, N ); Readln; END . Cải tiến: Khơng in ra các phần tử được lặp lại. Hướng dẫn: Đối với mỗi phần tử, trước khi in, kiểm tra xem nĩ xuất hiện trước nĩ hay khơng. - Nếu A[i] chưa xuất hiện trước nĩ, thì in ra số lần xuất hiện của A[i] - Nếu A[i] cĩ xuất hiện trước nĩ, thì khơng in ra số lần xuất hiện của A[i] nữa, vì đã in ra số lần xuất hiện của phần tử cĩ giá trị bằng A[i] rồi. Mở rộng: In ra phần tử xuất hiện ít nhất và nhiều nhất trong mảng.
  8. Bài tốn số 3.3: Tìm kiếm và thay thế. Tìm kiếm vị trí xuất hiện của x trên mảng A. Thay thế những giá trị Ai là x thành y. Ví dụ: A: 1 5 6 7 4 1 5 5 1 1 X=5 Y=15 Kết quả: Vi tri xuat hien X la 1 Ket qua thay the: 1 15 6 7 4 1 15 15 1 1 Hướng dẫn: - Xây dựng hàm tìm kiếm giá trị X trong mảng A, N phần tử. Sử dụng vịng lặp từ 0 đến N-1 để kiểm tra tất cả các giá trị Ai, nếu bằng x thì trả về vị trí i tìm thấy. Nếu thốt vịng lặp mà khơng tìm thấy thì trả về là –1. - Xây dựng hàm thay thế giá trị x bằng y tại vị trí tìm thấy đầu tiên. Tương tự như tìm kiếm, nhưng khi tìm thấy thì tiến hành gán giá trị mới cho Ai là y. - Xây dựng hàm thay thế tất cả các giá trị x bằng y tại mỗi vị trí tìm thấy. Sử dụng vịng lặp duyệt qua tất cả các giá trị của Ai, nếu Ai bằng x thì tiến hành gán thành y. Các hàm xây dựng: { 1. Ham tim kiem gia tri X trong mang A voi N phan tu } Function TimKiem ( A:Mang20; N:Integer; X:Integer ):Boolean; Var Flag : Boolean; i:Integer; Begin Flag:=False; For i:=0 to N do Begin If (A[i] = x) then Begin Flag:=True;
  9. Break; {Tim thay ==> Tra ve vi tri tim thay } End; End; TimKiem:=Flag; End; { 2. Thay the phan tu X dau tien tim thay trong mang bang gia tri Y } Function ThayThe(Var A:Mang20;Var N, x, y:Integer):Integer; Var i:Integer; Begin For i:=0 to N do If (A[i] = x) then Begin A[i] := y; { Tim thay x ==> thay the thanh y } Break; { Cham dut qua trinh thay the} End; ThayThe := i; End; { 3. Thay the tat ca cac phan tu co gia tri X tim thay bang gia tri Y } Procedure ThayTheTatCa (Var A:Mang20; Var N, x,y:Integer); Var i:Integer; Begin For i:=0 to N do
  10. If(A[i] = x) then { Tim thay x ==> thay the thanh y } A[i] := y; End; Source code chương trình chính BEGIN NhapMang1C(A, N); { Ham nhap xuat khong lam lai nua } XuatMang1C(A, N); { Su du let qua o truoc } Write('Gia tri x:'); Readln(x); If (TimKiem(A,N,x)) then Writeln( 'Tim thay tai vi tri trong mang A.', x, k ) Else Writeln( 'Khong tim thay trong mang A', x ); Write('gia tri y:'); Readln(y); ThayThe(A, N, x, y); Writeln('Ket qua thay the ',x, y); XuatMang1C(A, N); ThayTheTatCa(A, N, x, y); Writeln('Ket qua thay the tat ca la:',x, y); XuatMang1C(A, N); Readln; END.
  11. Mở rộng: + Tìm kiếm các cặp 2 phần tử gần nhau cĩ tổng chia hết cho 10. Thay thế các phần tử đĩ bằng tổng của chúng. Ví dụ: A: 1 19 62 7 8 32 12 Ket qua: 20 20 62 7 40 40 12 Procedure ThayTheBangTong(Var A:Mang20; N:Integer; X, Y:Integer); Var i,k:Integer; Begin For i:=0 to N do If( (A[i-1]+A[i]) mod 10 = 0) then Begin k := (A[i-1]+A[i]); A[i-1] := k; A[i] := k; End; End; Bài tốn số 3.4: Kiểm tra mảng cĩ đối xứng hay khơng? Kiểm tra mảng cĩ tăng dần hay khơng? Mảng đối xứng là mảng cĩ phần tử Ai = AN-i-1 Nếu mảng khơng phải là mảng tăng dần, hãy sắp xếp nĩ thành mảng tăng dần. Ví dụ: Mảng A: 1 15 6 7 4 7 6 15 1 Kết quả: Mang A doi xung, Mang A khong phai la mang tang dan Mảng A: 2 5 6 7 14 17 26 26 31 Kết quả: Mang A khong doi xung, Mang A khong phai la mang tang dan
  12. Hướng dẫn: + Xây dựng hàm int KtraDoiXung( A, N ) để kiểm tra tính đối xứng của mảng. Ý tưởng: Giả sử mảng A là mảng đối xứng, sử dụng vịng lặp để tìm kiểm một cặp đối xứng bất kỳ nhưng lại cĩ giá trị khơng bằng nhau, khi đĩ trả về là mảng khơng đối xứng . Ngược lại là khơng tìm thấy nên mảng là mảng đối xứng . + Xây dựng hàm int KtraMangTang( A, N ) để kiểm tra xem mảng A cĩ phải là mảng tăng hay khơng. Mảng tăng là mảng cĩ các phần tử đứng sau khơng nhỏ hơn phần tử đứng trước nĩ. Ý tưởng: Giả sử mảng A là mảng tăng, sử dụng vịng lặp để kiểm tra cĩ tồn tại phần tử nào nhỏ hơn phần tử đứng trước nĩ hay khơng, nếu cĩ thì trả về là mảng khơng khơng phải là mảng tăng (return 0). Ngược lại là khơng tìm thấy nên mảng là mảng tăng (return 1). + Xây dựng hàm Function SxepMangTang( A, N ) để sắp xếp mảng A thành mảng tăng dần. Ý tưởng: Sử dụng 2 vịng lặp lồng nhau để kiểm tra hai phần tử tại vị trí i, j nếu i A[j] thì hốn đổi giá trị của chúng. + Xây dựng chương trình để thể hiện kết quả đánh giá trên. Các hàm xây dựng: { 1. Ham kiem tra mang doi xung } Function KtraDoiXung (A:Mang20; N:Integer ) : Boolean; Var Flag:Boolean; i :Integer; Begin Flag:=True; For i :=1 to N do If(A[i] <> A[N-i +1]) Then Flag :=False; { Cham dut kiem tra, ket qua qua trinh : khong doi xung } KtraDoiXung :=Flag; End;
  13. { 2. Ham kiem tra mang tang } Function KtraMangTang ( A:Mang20; N :Integer) : Boolean; Var Flag : Boolean; i :Integer; Begin Flag := True; For i :=1 to N do If(A[i] A[j]) ) then Begin k := A[i]; { Tien hanh hoan doi gia tri A[i], A[j] } A[i] := A[j]; { cho nhau thong qua bien tam k } A[j] := k; End;
  14. End; Source code chương trình chính: BEGIN Clrscr; NhapMang1C(A, N); { Ham nhap xuat khong nhac lai nua } XuatMang1C(A, N); { Su dung ket qua o truoc } If ( KtraDoiXung (A, N ) ) then Writeln( ' Mang A doi xung.') Else Writeln(' Mang A khong doi xung.'); If ( KtraMangTang (A, N ) ) then Writeln( 'Mang A la mang tang ') Else Begin Writeln( 'Mang A khong phai la mang tang. '); SxepMangTang( A, N ); Writeln( 'Ket qua sap sep:'); XuatMang1C(A, N); End; Readln; END . Mở rộng:
  15. + Kiểm tra mảng A chỉ chứa tồn những số nguyên tố? + Kiểm tra mảng giảm dần, Sắp xếp mảng giảm dần. + Sắp xếp mảng A cĩ các số dương tăng dần, các số âm giảm dần. Function SxepDuongTangAmGiam ( A[]:Mang20, N:Integer ); Var i ,j ,k:Integer; Begin For i:=1 to N do For j:=1 to N do If ( ( (i A[j]) and (A[i]>0) and (A[j]>0)) or ((i<j) and ( A[i] < A[j] ) and ( A[i]<0) and ( A[j]<0))) then Begin k := A[i]; { Tien hanh hoan doi gia tri A[i], A[j]} A[i] := A[j]; { thong qua bien tam k } A[j] := k; End; End; + Kiểm tra mảng A là một chuỗi cấp số cộng cĩ cơng sai k = 5? Ví dụ: 1 6 11 16 21 26 31 Function KtraMangCapSoCong (A:Mang20; N:Integer; k:Integer):Boolean; Var flag :boolean; i :Integer; Begin for i:=1 to N do
  16. if(A[i] A[i-1] + k) then flag:=false; { Cham dut, ket qua: khong phai} KtraMangCapSoCong:=flag; {Ket qua kiem tra la mang cap so cong} End; Bài tốn số 3.5: Viết thủ tục và chương trình chèn phần tử X vào vị trí k trong mảng A, N phần tử. Xố phần tử ở vị trí h trong mảng A. Ví dụ: A : 12 2 3 6 5 17 X = 20 , k = 3 h = 2 Kết quả chèn: 12 2 3 20 6 5 17 Kết quả xố: 12 2 20 6 5 17 Hướng dẫn: - Viết thủ tục chèn một phần tử X vào vị trí k nào đĩ cho mảng A (cĩ N phần tử). Ý tưởng thuật tốn: + Dịch chuyển các phần tử từ vị trí k đến N-1 lùi một vị trí, trở thành các phần tử từ vị trí k+1 đến N. Lưu ý, để tránh trường hợp các phần tử đè lên nhau, giải thuật phải tiến hành di dời các phần tử sau trước .đến các phần tử k sau. + Gán giá trị cho A[k] là x. + Tăng số lượng phần tử của A lên 1, như thế N phải được truyền theo dạng tham biến - Viết thủ tục xố một phần tử ở vị trí k trên mảng A (cĩ N phần tử). Ý tưởng thuật tốn: + Dịch chuyển các phần tử từ vị trí k đến N-1 tiến về trước một vị trí, trở thành các phần tử từ vị trí k-1 đến N-2. + Giảm số lượng phần tử của A xuống 1, như thế N phải được truyền theo dạng tham biến .
  17. Nội dung các thủ tục chính xây dựng: { 1. Thu tuc chen phan tu } Procedure ChenPhanTu( A:Mang20;Var N : Integer; k, X:Integer); Var i :Integer; Begin For i:=N downto k+ 1 do A[i] := A[i-1]; A[k] := X; N:=N+1; End; { 2. Thu tuc xoa phantu } Procedure XoaPhanTu( A:Mang20; Var N ,k:Integer); Var i :Integer; Begin For i:=k to N-1 do A[i] := A[i+1]; N:=N-1; End; Source code chương trình chính: BEGIN NhapMang1C(A, N); { Ham nhap xuat khong lam lai nua } XuatMang1C(A, N); { Su du let qua o truoc }
  18. Write('Gia tri x:'); Readln(x); Write('Vi tri k,h:'); Readln(k,h); Writeln('Ket qua chen vao la:'); ChenPhanTu(A, N, k, x); XuatMang1C(A, N); Writeln('Ket qua xoa phan tu o vi tri la:', h); XoaPhanTu(A, N, h); XuatMang1C(A, N); Readln; END. 71. Xây dựng hàm tính n!. Function Giaithua (n: integer): longint; Begin If n = 0 then Giaithua := 1 Else Giaithua := n * Giaithua (n - 1); End; 72. Xây dựng hàm tính tổng các phần tử cĩ trong mảng 1 chiều gồm n phần tử kiểu số nguyên. Type mang = array [1 20] of integer; Function Tong (a: mang; n: integer): longint; Begin If n = 1 then Tong := a [n] Else Tong := a [n] + Tong (a, n - 1); End; 73. Xây dựng thủ tục xuất ngược mảng 1 chiều gồm n phần tử kiểu số nguyên. Procedure Xuatnguoc (a: mang; n: integer);
  19. Begin If n >= 1 then Begin Write (a [n], ' '); Xuatnguoc (a, n - 1); End; End; 74. Tạo Unit gồm các chương trình con: nhập 2 số nguyên, tính tổng 2 số nguyên, kiểm tra xem số nguyên thứ 1 cĩ chia hết cho số nguyên thứ 2 khơng, hốn vị 2 số nguyên. Sau đĩ viết chương trình để gọi thực hiện Unit này. Unit Songuyen; Interface Procedure Nhap (var a, b: integer); Function Tong (a, b: integer): longint; Function Chiahet (a, b: integer): boolean; Procedure Hoanvi (var a, b: integer); Implementation Procedure Nhap (var a, b: integer); Begin Write ('Nhap 2 so nguyen: '); Readln (a, b); End; Function Tong (a, b: integer): longint; Begin Tong := a + b; End; Function Chiahet (a, b: integer): boolean; Begin If a mod b = 0 then Chiahet := true Else Chiahet := false; End; Procedure Hoanvi (var a, b: integer); Var tam: integer; Begin tam := a;
  20. a := b; b := tam; End; End. Program Sudung_Unit; Uses crt, songuyen; Var a, b: integer; Begin Clrscr; Nhap (a, b); Writeln ('Tong 2 so nay la: ', Tong (a, b); If Chiahet (a, b) = true then Writeln (a, ' chia het cho ', b) Else writeln (a, ' khong chia het co ', b); Writeln ('Truoc khi hoan vi: a = ', a, ' ', 'b = ', b); Hoanvi (a, b); Writeln ('Sau khi hoan vi: a = ', a, ' ', 'b = ', b); Readln; End. 75. Tạo Unit gồm các chương trình con: nhập mảng 1 chiều gồm n phần tử kiểu số nguyên, xuất mảng, thêm 1 phần tử vào đầu, xĩa 1 phần tử ở cuối, kiểm tra mảng cĩ thứ tự tăng dần khơng. Unit Mang1chieu; Interface Type mang = array [1 20] of integer; Procedure Nhap (var a: mang; n: integer); Procedure Xuat (a: mang; n: integer); Procedure Themdau (var a: mang; var n: integer; x: integer); Procedure Xoacuoi (var a: mang; var n: integer); Function Tangdan (n: mang; n: integer): boolean; Implementation Procedure Nhap (var a: mang; n: integer); Var i: integer; Begin For i := 1 to n do Begin
  21. Write ('Nhap a [', i, ']= '); Readln (a [i]); End; End; Procedure Xuat (a: mang; n: integer); Var i: integer; Begin For i := 1 to n do Write (a [i], ' '); End; Procedure Themdau (var a: mang; var n: integer; x: integer); Var i: integer; Begin For i := n downto 1 do a [i + 1] := a [i]; a [1] := x; n := n + 1; End; Procedure Xoacuoi (var a: mang; var n: integer); Begin a [n] := 0; n := n - 1; End; Function Tangdan (a: mang; n: integer): boolean; Var i: integer; Begin i := 1; While (i <= n - 1) and (a [i] <= a [i + 1]) do i := i + 1; If i = n then Tangdan := true Else Tangdan := false; End; End. 76. Xây dựng các chương trình con (khơng đệ quy) sau: a. Tính tổng n số nguyên dương đầu tiên. b. Kiểm tra xem số n cĩ phải là số chính phương khơng? c. In ra n số chính phương đầu tiên. d. Tìm số lớn nhất trong 4 số thực.
  22. e. In ra n phần tử đầu tiên của dãy Fibonaci. f. Đếm xem cĩ bao nhiêu số nguyên tố trong n số nguyên dương đầu tiên. g. Tìm bội số chung nhỏ nhất của 2 số nguyên dương. h. In ra các ước số của số nguyên dương n. Viết chương trình để mình họa các chương trình đã xây dựng. a) Uses crt; Var n: integer; kq: longint; Function Tong (n: integer): longint; Var i: integer; s: longint; Begin s := 0; For i := 1 to n do s := s + i; Tong := s; End; Begin Clrscr; Write ('Nhap n: '); Readln (n); kq := Tong (n); Writeln ('Tong ', n, ' so nguyen duong dau tien la: ', kq); Readln; End. b) Var n: integer; kq: boolean; Function scp (n: integer): boolean; Begin If frac (sqrt (n)) = 0 then scp := true Else scp := false; End; Begin Write ('Nhap n = '); Readln (n); kq := scp (n); Writeln ('So chinh phuong la: ', kq);
  23. Readln; End. c) Var n: integer; Procedure Inscp (n: integer); Var i, d: integer; Begin i := 1; d := 0; Repeat if frac (sqrt (i)) = 0 then Begin Write (i, ' '); d := d + 1; End; i := i + 1; Until d = n; End; Begin Write ('Nhap n = '); Readln (n); Inscp (n); Readln; End. d) Var a, b, c, d: real; Function Max (a, b, c, d: real): real; Var t: real; Begin If n > b then t := a Else t := b; If c > d then t := c Else t := d; Max := t; End; Begin
  24. Write ('Nhap 4 so a, b, c, d: '); Readln (a, b, c, d); Writeln (So lon nhat trong 4 so la: ', Max (a, b, c, d)); Readln; End. e) Var i, n: integer; F, F1, F2: integer; Procedure Fibo (n :integer); Var i: integer; Begin F1 := 1; F2 := 1 For i := 3 to n do Begin F := F1 + F2; F2 := F1; F1 := F; End; End; Begin Write ('Nhap n: '); Readln (n); For i := 1 to n do Write (F, ' '); Readln; End. f) Var n: integer; Function Ngto (n: integer): integer; Var i, d: integer; Begin d := 0; i := 2; While n mod i <> 0 do i := i + 1; If i = n then d := d + 1; Ngto := d; End;
  25. Begin Write ('Nhap n = '); Readln (n); Writeln ('Cac so nguyen to la: ', Ngto (n)); Readln; End. g) Var a, b, kq: integer; Function bsc (a, b: integer): longint; Var t: integer; Begin If (a * b mod a = 0) and (a * b mod b = 0) then t := b Else t := a; bsc := t; End. Begin Write ('Nhap a, b: '); Readln (a, b); kq := bsc (a, b); Writeln ('BSCNN la: ', kq); Readln; End. h) Var n: integer; Procedure US (n: integer); Var i: integer; Begin For i := 1 to n do If n mod i = 0 then write (i, ' ') End; Begin Write ('Nhap n: ')' Readln (n); Writeln ('Cac uoc so cua ', n, ' la: '); US (n); Readln;
  26. End. 77. Xây dựng các chương trình con (đệ quy) sau: a. Tính tổng n số nguyên dương đầu tiên. b. In ra n phần tử đầu tiên của dãy Fibonaci. c. Tìm bộ số chung nhỏ nhất của 2 số nguyên dương. d. Tìm ước số chung lớn nhất của 2 số nguyên dương. e. Xuất mảng 1 chiều. Viết chương trình để minh họa các chương trình đã xây dựng. a) Var a: integer; Function Tong (n: integer): longint; Begin If n = 0 then Tong := 0; Else If n > 0 then Tong := n + Tong (n - 1); End; Begin Write ('Nhap so nguyen duong: '); Readln (n); Writeln ('Tong ', n, ' so nguyen la: ', Tong (n)); Readln; End. b) Var n: integer; Function Fibo (n: integer): integer; Begin If (n = 1) or (n = 2) then Fibo := 1 Else Fibo := Fibo (n - 1) + Fibo (n - 2); End; Procedure Xuat (n :integer); Begin If n = 1 then write (n, ' ') Else Begin Xuat (n - 1); Write (Fibo (n));
  27. End; End; Begin Readln (n); Fibo (n); Readln; End. c) Var a, b: integer; Function BSCNN (a, b: integer): integer; Begin If a = b then BSCNN := a Else If a > b then BSCNN := BSCNN (a * b/a) Else BSCNN := BSCNN (a * b/b); End; Begin Write ('Nhap a, b: '); Readln (a, b); BSCNN (a, b); Readln; End. d) Var a, b: integer; Function USCLN (a, b: integer): integer; Begin If a = b then USCLN := a Else If a > b then USCLN := USCLN (a - b, b) Else USCLN := USCLN (a, b - a); End; Begin Write ('Nhap a, b: '); Readln (a, b); USCLN (a, b); Readln; End.
  28. e) Type mang = array [1 20] of integer; Var n, i: integer; a: mang; Function Xuatmang (i: integer): integer; Begin If i = 1 then Xuatmang := a [1] Else Xuatmang := a [i]; End; Begin Repeat Write ('Nhap phan tu thu: '); Readln (n); Until (n > 0) and (n < 21); For i := 1 to n do Begin Write ('Nhap phan tu thu ', i, ': '); Readln (a [i]); End; Writeln ('Mang vua nhap la: '); For i := 1 to n do Write (Xuatmang (i) : 4); Readln; End. Chúc bạn thành cơng!