Bài tập về mảng 1 chiều trong Pascal. Cho 1 dãy số gồm n phần tử n aj1) then begin b:= aj1 ; aj1:=aj; aj:=b; end; {sắp xếp các phần tử giảm dần về giá trị} for i=1 to n then begin write( ai); writeln; end; {in ra theo chiều dọc mảng} end. hết nếu muốn in theo chiều ngang for i=1 to n then begin write( ai); write( ); { dấu cách giữa 2 giấu } end; có gì sai sót thì bạn sửa nhe như khai báo các biến ấy có thể thiếu. cái này học hồi 11 nên không nhớ rõ lắm 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 toá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 toá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 N1) 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 voøng lặp từ 0 đến N1 để 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 toång S là 0. o Sử dụng một vòng lặp (từ 0 đến N1 để 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(……) 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 = array1..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( Ai ); 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 For i :=0 to N do Write( Ai: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 + Ai ; 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. Bài toá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(Ai mod 5=0) S := S+Ai; 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 N1do 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; Begin S:=0; For i:=0 to Ndo If ( LaSoNT( Ai ) ) then S :=S+ Ai; TongSoNT :=S; End; Bài toá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 toá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). Hai hàm này được sử dụng kết quả của bài toá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ử Ai, nếu Ai = 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 Ai 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 ( Ai = 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); Var i :Integer; Begin For i:=0 to N do Writeln( Ai , ===> , DemPtuX( A, N, Ai ) ); 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 Ai chưa xuất hiện trước nó, thì in ra số lần xuất hiện của Ai Nếu Ai có xuất hiện trước nó, thì không in ra số lần xuất hiện của Ai nữa, vì đã in ra số lần xuất hiện của phần tử có giá trị bằng Ai 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. Bài toá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 N1 để 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 thoá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 (Ai = x) then Begin Flag:=True; 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 (Ai = x) then Begin Ai := 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 If(Ai = x) then { Tim thay x ==> thay the thanh y } Ai := 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. 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( (Ai1+Ai) mod 10 = 0) then Begin k := (Ai1+Ai); Ai1 := k; Ai := k; End; End; Bài toá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 = ANi1 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 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 < j mà Ai > Aj thì hoá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(Ai ANi +1) Then Flag :=False; { Cham dut kiem tra, ket qua qua trinh : khong doi xung } KtraDoiXung :=Flag; End; { 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(Ai < Ai1) Then Flag :=False; { Cham dut kiem tra, ket qua qua trinh : khong tang } KtraMangTang :=Flag; End; { 3. Thu tuc sap xep mang tang } Function SxepMangTang (A:Mang20; N:Integer ):Integer; Var i ,j,k :Integer; Begin For i :=1 to N do For j :=1 to N do If ( (i Aj) ) then Begin k := Ai; { Tien hanh hoan doi gia tri Ai, Aj } Ai := Aj; { cho nhau thong qua bien tam k } Aj := k; End; 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: + Kiểm tra mảng A chỉ chứa toà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 Aj) and (Ai>0) and (Aj>0)) or ((i 0) do Begin Du := So mod 2 ; So := So div 2 ; S := S 10 + Du; End; Dec2Bin:= S ; End; { 2. Than chuong trinh chinh dap ung yeu cau bai toan } BEGIN clrscr; write( Nhap so N = ); readln(N ); writeln( Dang nhi phan cua N la , Dec2Bin(N) ); readln; END. Bài toán số 2.2: Viết các hàm USCLN(a, b) và BSCNN(a, b). Hướng dẫn: Khai báo hàm USCLN có: Tên hàm: USCLN Kiểu dữ liệu trả về: integer Tham số: 2 tham trị là int a, int b Giá trị trả về: chính là giá trị ước số chung lớn nhất của a và b. Xử lý tìm USCLN, BSCNN: Dựa trên ví dụ đã có ở phần trước. Nội dung hàm: Function USCLN( a, b : Integer) : Integer; Var Sodu:integer; Begin While (b 0) do Begin Sodu:= a mod b; a := b; b := Sodu; End; USCLN := a; End; {Tuong tu ham BSCNN(a, b : Integer)} Function BSCNN( a, b : Integer) : Integer; Var k :integer; Begin For k := a to ab do { Lap voi moi i co gia tri tu a den 1} If ((k mod a = 0) and ( k mod b = 0)) then { Kiem tra a, b cung chia het cho k? } Break; { break de thoat, luu giu lai gia tri cua k.} BSCNN:= k; End; Bài toán số 2.3: Viết hàm kiểm tra số N có phải là số nguyên tố hay không? Hướng dẫn: Khai báo hàm kiểm tra số nguyên tố có: Tên hàm: KiemtraSNT Dữ liệu trả về: int, ( 0 nếu không phải là số nguyên tố, là 1 nếu là số nguyên tố ) Tham số: tham trị là int N, số cần kiểm tra. Xử lý kiểm tra: Dựa trên ví dụ đã có ở phần trước. Nội dung hàm: Function KiemtraSNT( N : Integer ) : Boolean; Var flag : Boolean; i : Integer; Begin flag := True; { Khoi gan gia tri dung cho ktrSNT} For i := 2 to N1 do { Lap voi moi i co gia tri tu 2 den N1} If ( N mod i = 0 ) then { Kiem tra xem N co’ chia het cho i hay khong} flag:=false; { Neu dung thi khong con la so nguyen to nua} KiemtraSNT:=flag; End; Cải tiến, không sử dụng biến phụ: Function KiemtraSN( N : Integer ) : Integer; Var i :integer; Begin For i := 2 to N1 do { Lap voi moi i co gia tri tu 2 den N1} If ( N mod i = 0 ) then { Kiem tra xem N co’ chia het cho i hay khong} Writeln(N khongla SNT) { Neu dung thi khong con la so nguyen to nua} Else Writeln(N la SNT); { N la SNT} End; Bài toán số 2.4: Viết chương trình thực hiện lần lượt các công việc sau: Lập thủ tục nhập ba số thực dương a , b , c từ bàn phím . Lập thủ tục kiểm tra xem ba số trên có lập thành ba cạnh của tam giác hay không ? Viết hàm tính diện tích của tam giác . Viết hoàn thiện chương trình chính. Chương trình Program Tam_Giac; Uses crt; Var a,b,c : Integer; { 1. Thu tuc nhap} Procedure NhapABC (Var a, b, c : Integer); Begin Write( Nhap a: ); Readln( a ); Write( Nhap b: ); Readln( b ); Write( Nhap c: ); Readln( c ); End; { 2. Ham tinh dien tich} Function Dientich( a, b, c:Integer ) : Real; Var dt,p : Real; Begin p := (a+b+c)2; dt := sqrt(p (pa)(pb)(pc)); Dientich := dt; End; { 3. Thu tuc kiem tra va In kqua tinh dien tich (neu la tam giac) } Procedure KiemTra_InDienTich ( a,b,c:Integer); Begin If ((a+b>c) and (b+c>a) and (a+c>b)) then Writeln( Ba canh tren tao thanh tam giac.dien tich, Dientich(a,b,c) ) Else Writeln(Ba canh tren khongtao thanh tam giac); End; { 3. Than chuong trinh chinh } BEGIN NhapABC(a,b,c); KiemTra_InDienTich (a,b,c); END. Bài toán số 2.5: Viết chương trình hoàn chỉnh thực hiện phân tích ra N ra thành các thừa số nguyên tố. Ví dụ: N = 1260 = 2 . 2 . 3 . 3 . 5 . 7 Hướng dẫn: Viết hàm nhập số N. Lưu ý, hàm nhập cần truyền tham số N theo dạng tham biến để lưu lại giá trị đã nhập vào. Viết hàm phân tích số N ra các thừa số nguyên tố và in các thừa số đó ra màn hình với ý tưởng thuật toán: o Chia N cho số nguyên tố u (nhỏ nhất là 2). o Trong khi N còn chia hết cho u thì tiến hành phân tích N với u là thừa số. Giảm N đi u lần. o Nếu N không chia hết cho u, thi tăng u lên 1. o Quá trình lặp lại với u từng bước tăng lên 1 nếu N không chia hết cho u. N từng bước giảm xuống u lần nếu N chia hết cho u. o Quá trình lặp lại đến một mức u tăng lên và N giảm xuống để N = u, khi đó giá trị mới của N sẽ là 1. Chương trình: Program Phan_Tich_Thua_So; Uses crt; Var N : integer; { 1. Thu tuc nhap so N. } Procedure NhapSoN( var NN : Integer ); Begin NN := 0; {Gan khoi dau bang 0 de vao vong lap, vong lap dung khi nhap khac 0} While ( N = 0 ) do Begin Write( Nhap N= ); Readln(NN ); End; End; { 2. Thu tuc phan tich N ra thanh cac thua so nguyen to } Procedure PhantichSoN ( Var N1 : Integer ); Var u,dem:Integer; Begin If ( N1 > 1 ) Then Begin u := 2; dem := 0; While ( N1 > 1 ) do If ( N1 mod u = 0 ) Then Begin dem:=dem+1; Writeln( u); N1 := N1 div u; End Else u:=u+1; End Else Writeln( Khong the phan tich duoc ); End; { 3. Than chuong trinh chinh } BEGIN Clrscr; Writeln(Phan tich so N thanh tich cua cac so nguyen to : ); NhapSoN( N ); PhantichSoN( N ); Writeln (Nhan Enter de ket thuc ... ); Readln; END Một số bài tập lập trình Pascal Created by NgoHung Vấn đề 4: Mảng 2 chiều Bài toán số 4.1: Viết chương trình thao tác trên mảng 2 chiều với các công việc sau: + Nhập xuất mảng 2 chiều. + Đếm số lần xuất hiện giá trị 0 trong mảng. + Tìm giá trị lớn nhất trong mảng 2 chiều đã nhập vào. Hướng dẫn: + Khai báo kiểu dữ liệu mảng 2 chiều. Type Mang2C = Array1..10, 1..10 of Real; + Xây dựng thủ tục nhập dữ liệu cho mảng 2 chiều A với kích thước MxN. Lưu ý: các tham số: A (tên mảng), M, N (kích thước của mảng) đều được truyền theo dạng tham biến để lưu lại giá trị đã nhập sau khi thoát khỏi thủ tục. Quá trình nhập dữ liệu cho mảng A, được thực hiện nhờ 2 vòng lặp lồng nhau: vòng lặp i, lặp cho chỉ số dòng; vòng lặp j, lặp cho chỉ số cột. Tại mỗi bước lặp, tiến hành đọc giá trị cho phần tử Ai,j. + Xây dựng thủ tục xuất dữ liệu mảng. Sử dụng 2 vòng lặp lồng nhau: vòng lặp i, lặp cho chỉ số dòng; vòng lặp j, lặp cho chỉ số cột. Tại mỗi bước lặp, tiến hành xuất giá trị Ai,j. Tại cuối mỗi bước lặp dòng, tiến hành xuống dòng sau khi đã in các phần tử. + Quá trình đếm phần tử 0 trong mảng cũng như tìm giá trị lớn nhất trong mảng làg quá trình duyệt qua tất cả các phần tử Ai,j. Sử dụng 2 vòng lặp lồng nhau: vòng lặp i cho chỉ số dòng; vòng lặp j cho chỉ số cột. Tại mỗi bước lặp, tiến hành kiểm tra giá trị Ai,j và thực hiện thao tác tùy theo yêu cầu của bài toán: Đếm hay So sánh và tìm Max. Source code chương trình PROGRAM Mang_2C; Uses CRT; Type Mang2C = Array1..10, 1..10 of Real; Var A: Array2C; N, M: Integer; { 1. Thu tục nhap mang 2 chieu } Procedure NhapMang2C( Var A : Mang2C; Var M,N : Integer); Var i, j: Integer; Begin Repeat Write(‘Nhap so hang N, so cot M: ‘); Readln(N, M); Until ( N>0 ) and ( N0 ) and ( M Max) Then Max := Ai,j; TimPtuMax : = Max; End; { 5. Than chuong trinh chinh } BEGIN Writeln( ‘Nhap mang 2 chieu:’); NhapMang2C (A, M, N ); Writeln( ‘Mang da nhap la:’); XuatMang2C (A, M, N ); Writeln( ‘So lan xuat hien 0 trong mang :’, DemPtu0 ( A, M, N) ); Writeln( ‘Gia tri lon nhat trong mang :’, TimPtuMax( A, M, N) ); Readln; END. Bài toán số 4.2: Viết chương trình thao tác trên mảng 2 chiều với các công việc sau: + Nhập xuất mảng 2 chiều. + Tính tổng các phần tử theo từng dòng của mảng. + Tìm dòng có tổng giá trị lớn nhất. Hướng dẫn: + Đối với mỗi vòng lặp theo dòng, tiến hành tính tổng cho các phần tử trên dòng. Áp dụng như tính tổng cho mảng một chiều. + Vừa tính tổng vừa tiến hành so sánh và lưu lại giá trị lớn nhất. Source code các hàm xây dựng { 1. Thu tuc tinh in tong cac phan tu tren dong cua mang 2 chieu } Procedure TongCacDong( A : Mang2C; M,N : Integer); Var i, j: Integer; S : Real; Begin For i:=1 to M do Begin S := 0; For j :=1 to N do S := S + Ai, j; Writeln( ‘Tong dong ‘, i ,’ la ‘, S); End; End; { 2. Thu tuc tim tong lon nhat cua cac phan tu tren dong cua mang 2 chieu } Function MaxTgDong(A:Mang2C; M,N:Integer) : Real; Var i, j, k: Integer; Value , S : Real; Begin For i:=1 to M do Begin S := 0; For j :=1 to N do S := S + Ai, j; If (S > Value) Then Begin Value := S; K := i; End; End; MaxTgDong := Value; End; { 3. Than chuong trinh chinh } BEGIN { Nhung ham nhap xuat da de cap o Bai so 4.1, xem chi tiet o tren } Writeln( ‘Nhap mang 2 chieu:’); NhapMang2C (A, M, N ); Writeln( ‘Mang da nhap la:’); XuatMang2C (A, M, N ); Writeln( ‘Tong cac phan tu theo dong la:’ ); TongCacDong( A , M, N ); Writeln( ‘Gia tri lon nhat cua cac tong:’, MaxTgDong ( A, M, N) ); Readln; END. Bài toán số 4.3: Viết chương trình thao tác trên ma trận vuông với các yêu cầu: + Nhập xuất ma trận vuông. + Tính tổng các phần tử trên đường chéo chính. + Kiểm tra tính đối xứng của ma trận vuông qua dường chéo chính. Hướng dẫn: + Ma trận vuông là mảng 2 chiều nhưng có kích thước dòng bằng kích thước cột. Tức là, M=N, khi dó kích thước của ma trận là NxN. + Đường chéo chính là các phần tử Ai, j có i = j ( hay Ai, i ). Source code các hàm xây dựng Quá trinh định nghĩa dữ liệu mảng có thể sử dụng lại bài 4.1. { 1. Thu tục nhap mang 2 chieu } Procedure NhapMtran( Var A : Mang2C; Var N : Integer); Var i, j: Integer; Begin Repeat Write(‘Nhap kich thuoc N: ‘); Readln( N ); Until ( N>0 ) and ( N Tinh tong cong don i vao S for i:=1 to n do Lap voi moi i co gia tri tu 1 den N if ( i % 5 == 0) Kiem tra i co’ phai la 5, 10, 15… hay khong S := S + i; Dung ==>Tinh tong cong don i vao S Bài toán số 1.2: Kiểm tra số N có phải là số nguyên tố hay không. Ví dụ: N = 19 Kết quả là: 19 la so nguyen to N = 33 Kết quả là: 33 khong phai la so nguyen to Yêu cầu: Input: N, là số tự nhiên bất kỳ. Output: Trả lời “N la so nguyen to” hoặc “N khong phai la so nguyen to” tùy theo N. Lưu ý: Số nguyên tố là số chỉ có thể chia hết cho 1 và chính nó ( N ). Ngược lại, N là không phải là số nguyên ==> N chia hết cho một số trong khoảng từ 2 đến (N1). Hướng dẫn: Bài toán được thực hiện qua 3 bước cụ thể như sau: Thông báo nhập liệu, và nhập dữ liệu vào cho N Tiến hành kiểm tra N có phải là số nguyên tố hay không: Xuất câu trả lời “N la so nguyen to” hoặc “N khong phai la so nguyen to” tùy theo giá trị của biến Chương trình: Program SNT; Uses crt; Var n , i :Integer; Khai bao bien su dung BEGIN Write(‘Nhap vao mot so:’); Thong bao nhap lieu Readln(n); Nhap gtri N, (voi N la lay dc bien N) i := round( sqrt(n) ); If( n mod i 0) then Xuat cau tra loi cuoi cung Writeln(‘ N la so nguyen to’) Else Writeln(‘ N khong la so nguyen to’); Readln; END. Bài toán số 1.3: Tìm USCLN(a, b) va BSCNN(a, b) Ví dụ: USCLN(18, 24) = 6 và BSCNN(18, 24) = 72 Yêu cầu: Input: a, b là 2 số tự nhiên. Output: USCLN và BSCNN của a và b Một số lưu ý: Nếu i là ước số của a và b thì a và b đồng thời chia hết cho i Luôn luôn có tối thiểu một USCLN của a và b là 1. Nếu i là USCLN thì i là ước số nhỏ hơn cả a lẫn b và gần a, b nhất. Như vậy, nếu sử dụng một vòng lặp để kiểm tra a,b có đồng thời chia hết cho i hay không thì i là USCLN khi: + i là USC (a, b cùng chia hết cho i) cuối cùng nếu i lặp từ 1 đến a (hoặc b). + i là USC (a, b cùng chia hết cho i) đầu tiên nếu lặp từ a (hoặc b) quay về 1. BSCNN(a, b) = a b (USCLN(a, b) Hướng dẫn: Bài toán được thực hiện qua 3 bước cụ thể như sau: Thông báo nhập liệu, và nhập dữ liệu vào cho a và b Tiến hành tính USCLN(a, b): Sử dụng vòng lặp for, lặp từ a lùi về 1. Kiểm tra nếu a, b đều chia hết cho i thì gọi lệnh break để dừng vòng lặp. ==> i là USC đầu tiên gần a, b nhất ==>USCLN Xuất kết quả của USCLN(a, b) , BSCNN (a, b) ra màn hình. Chương trình: Program USCLN; Use crt; Var a , b :integer; Khai bao bien su dung Begin Write(‘Nhap vao so a:’); Thong bao nhap lieu Readln(a); Nhap gtri a (voi a, la lay dc bien a,) Write(‘Nhap vao so b:’); Thong bao nhap lieu Readln(b); Nhap gtri b (voi b, la lay dc bien b,) For i:=a downto 1 do If ((a mod i = 0) and (b mod i = 0)) then Kiem tra a, b co chia het Break; Writeln(‘USCLN (‘,a,’,’,b,’):’, i); Xuat ket qua USCLN(a, b) Writeln(‘BSCNN (‘,a,’,’,b,’):’, ab div i); Xuat ket qua USCLN(a, b) Readln; End. Bài toán số 1.4: Nhập vào một số tự nhiên N. Hãy tính tổng các chữ số của nó. Ví dụ: N = 1682 Tong cac chu so cua N la: 17 ( = 1 + 6 + 8 + 2 ) Yêu cầu: Input: N là số nguyên bất kỳ, N có khả năng là số lớn Output: S, la tổng các chữ số của N Hướng dẫn: Gán tổng S với giá trị ban đầu là 0 Sử dụng để lấy từng chữ số của số tự nhiên N bằng cách: Lặp trong khi mà N còn > 0 thì + Gán k là chữ số cuối cùng của N. + Tiến hành cắt chữ số cuối cùng của N đi bằng việc lấy N chia cho 10. + Cộng dồn S: = S + k Lặp lại cho đến khi N = 0 thì dừng Chương trình: Program tong; Uses crt; Var n , s , k: integer; Khai bao bien su dung Begin Write(‘ Nhap N:’); Thong bao nhap lieu Readln(N ); Nhap gtri cho N S := 0; While ( N 0 ) do Lap trong khi N con ≠ 0 Begin k := N mod 10; Lay chu so hang don vi o cuoi cung N := N div 10; Cat chu so hang don vi da duoc lay ra S := S + k; Tinh tong cong don vao S End; Writeln( ‘Tong cac chu so cua ’,N,’ la :’, S); Xuat ket qua Readln; End. Bài toán số 1.5: Cho 14032003 là một ngày trong năm. Hãy xác định xem thử ngày này là này thứ bao nhiêu của năm đó. Ví dụ: Ngày nhập vào 14032003, Kết quả: Ngay thu 73 cua nam 2003 Yêu cầu : Input: 3 số ngay, thang, nam Output: So thu tu cua ngay Hướng dẫn: Khởi gán stt là 0 Với ví dụ trên, tính tổng cộng dồn số ngày của các tháng trước tháng 03 (cụ thể là tháng 01, tháng 02) vào stt. Sử dụng câu lệnh rẽ nhánh case để biết số ngày của các tháng. Bổ sung thêm số ngày của tháng hiện tại (ngay 14) vào stt. Giải quyết bài toán với ngôn ngữ C Khai báo các thư viện sử dụng Định nghĩa hàm main( ) là hàm chính của chương trình có mục tiêu là giải quyết bài toán với 3 bước trên: + Khai báo biến sử dụng: ngay, thang, nam, stt + Thông báo nhập liệu và nhập giá trị cho các biến ngay, thang, nam + Khởi gán stt = 0 + Lặp cộng dồn số ngày của các tháng mà nhỏ hơn thang Sử dụng case để xác định số ngày trong tháng Bổ sung số ngày vào stt + Bổ sung số ngày của tháng hiện tại vào stt + Thông báo kết quả Chương trình: Program ngaythangnam; Uses crt; Var ngay,thang,nam,i,stt:integer; Khai bao bien su dung Begin Write(‘Nhap ngay, thang, nam:’); Thong bao nhap lieu Readln(ngay, thang, nam); Nhap gtri cho ngay, thang, nam stt := 0; For i := 1 to thang do Lap voi cac i nho hon thang da nhap vao) case thang of 1,3,5,7,8,10,12 : stt := stt + 31; 4,6,9,11: stt := stt + 30; 2 : stt := stt + 28; Else stt := stt + ngay; end; Writeln(‘Ngay thu ‘, stt, nam); Xuat ket qua Readln; End . Bài toán ngược: Có số thứ tự của ngày trong năm, hãy xác định nhày đó là ngày nào. Ví dụ: Nhập stt = 84 thì kết quả là 2504. Hướng dẫn: Làm theo chiều ngược lại. Giả sử ban đầu xuất phát với thang là 1. Nếu stt lớn hơn số ngày cua tháng (thang ) thì tiến hành: o thang tăng lên 1 o stt được gán bằng stt trừ đi số ngày của tháng đó. Lặp lại quá trình trên cho đến khi stt nhỏ hơn hoặc bằng số ngày trong tháng Một số bài tập lập trình Pascal Created by NgoHung Vấn đề 5: Kiểu dữ liệu có cấu trúc Bài toán số 5.1: Viết chương trình thao tác trên các điểm trên mặt phẳng (có các thành phần X, Y) : + Nhập thông tin về 3 điểm A, B, C. Tính diện tích của Tam giá ABC. + Nhập danh sách n điểm, và điểm M. Hãy xác định điểm gần điểm M nhất. Hướng dẫn: Viết hàm tính khoảng cách giữa 2 điểm A, B theo công thức: Viết hàm tính diện tích tam giác ABC thông qua chu vi của tam giác: a = KhoangCach(B, C) b = KhoangCach(A, C) c = KhoangCach(A, B) p = ( a+b+c) 2 Viết hàm tìm kiểm trong danh sách điểm nhậm vào, tìm điểm X có khoảng cách từ X đến M là nhỏ nhất. Source code chương trình: { 1. Khai bao cac kieu du lieu va bien can thiet } PROGRAM ThaoTacDiem; Uses CRT; Type KDIEM = RECORD X,Y : Integer; End; KDSDIEM = Array1..50 of KDIEM; Var DS: KDSDIEM; n: Integer; A, B, C, M, X: KDIEM; { 2. Thu tuc nhap 3 diem A, B, C} Procedure NhapABC( Var A, B, C: KDIEM); Begin Write(‘Toa do A(X, Y):’); Readln( A.X, A.Y ); Write(‘Toa do B(X, Y):’); Readln( B.X, B.Y ); Write(‘Toa do C(X, Y):’); Readln( C.X, C.Y ); End; { 3. Thu tuc nhap du lieu cho danh sach diem } Procedure NhapDSDiem( Var dsdiem : KDSDIEM; Var N:Integer); Var i:Integer; Begin Repeat Write(‘Nhap so diem = ‘); Readln(N); Until ( N>0 ) and ( N < 51); For i:=1 to N do Begin Write(‘Toa do X, Y:’); Readln(dsdiemi.X, dsdiemi.Y); End; End; { 4. Ham tinh khoang cach giua 2 diem A, B } Function KhoangCach( A, B: KDIEM) : Real; Begin KhoangCach := Sqrt( Sqr(A.XB.X) + Sqr(A.YB.Y) ); End; { 5. Ham tinh dien tich tam giac A, B, C } Function DienTichABC( A, B, C: KDIEM) : Real; Var ab, bc, ca, p: Real; Begin ab := KhoangCach ( A, B ); bc := KhoangCach ( B, C ); ca := KhoangCach ( C, A ); p := (ab + bc + ca) 2; DienTichABC := Sqrt( p (pab) (pbc) (pca) ); End; { 6. Xac dinh diem gan M nhat trong danh sach n diem } Function DiemGanMnhat(ds : KDSDIEM; n:Integer;M:KDIEM): KDIEM; Var kcMin, kc: Real; X: KDIEM; I : Integer; Begin KcMin := KhoangCach(M, ds1); For i:=1 to N do Begin Kc := KhoangCach(M, dsi); If (kc >= kcMin) Then Begin KcMin := Kc; X := dsi; End; DiemGanMnhat := X; End; { Chương trình chính; } BEGIN Clrscr; NhapABC( A, B, C ); Writeln(‘Diem tich tam giac ABC= ‘, DienTichABC(A, B, C):6:2); NhapDSDiem( ds, N ); Write(‘Toa do M(x, y):’); Readln(M.X, M.Y); X := DiemGanMnhat(ds, N, M); Writeln(‘Diem gan M nhat la (‘, X.x,’ , ’ , X.y,’ ) trong cac diem nhap vao. ’); Readln; END. Bài toán số 5.2: Viết chương trình thao tác trên danh sách sinh viên (có các thông tin Hoten, Maso, Loai, Toan, Ly, DTB) : + Nhập In danh sách sinh viên. + Sắp xếp danh sách sinh viên theo thứ tự tăng dần của điểm trung bình + Tìm điểm toán cao nhất trong danh sách, Số sinh viên có điểm toán = Max, Điểm bình quân môn toán của cả danh sách? Hướng dẫn: Xây dựng thủ tục nhập thông tin của danh sách sinh viên, trong đó sử dụng vòng lặp để nhập các thông tin của từng sinh viên thứ i. Sử dụng Câu lệnh With để truy xuất đến thành phần của cấu trúc KSVIEN. Quá trình sắp xếp bằng thuật toán sắp xếp đổi chổ trực tiếp. Xem bài hướng dẫn 3.4. Thuộc tính so sánh là dssvi.DTB và dssvj.DTB. Không sử dụng phép gán thông thường mà phải sử dụng memcpy để tiến hành copy hai vùng nhớ của các biến. Source code chương trình: { 1. Khai bao cac kieu du lieu va bien can thiet } PROGRAM Quan_Ly_SV; Uses CRT; Type KSVIEN = RECORD Hoten : String18; Maso, Loai: String8; Toan, Ly, DTB: Real; End; KDSSVIEN = Array1..50 of KSVIEN; Var DS: KDSSVIEN; N: Integer; { 2. Thu tuc nhap du lieu cho danh sach sinh vien } Procedure NhapDSSV( Var dssv : KDSSVIEN; Var N:Integer); Var i:Integer; Begin Repeat Write(‘Nhap so sinh vien N= ‘); Readln(N); Until ( N>0) and ( N < 51); For i:=1 to N do With dssvi do Begin Write(‘Nhap ho ten :’); Readln(Hoten); Write(‘Ma so sv :’); Readln(Maso); Write(‘Toan, Ly :’); Readln(Toan, Ly); DTB := (Toan + Ly) 2; If DTB >=9 then Loai:=‘Gioi’ Else if DTB >=7 then Loai:=‘Kha’ Else if DTB >=5 then Loai:=‘Binh’ Else Loai:=‘Kem’; End; End; { 3. Thu tuc sap xep danh sach sinh vien tang dan theo diem trung binh } Procedure SapXepDSSV( Var dssv : KDSSVIEN; N : Integer); Var i, j : Integer; Z : KSVIEN; Begin For i:=1 to N1 do For j:=i+1 to N do If dssvi.DTB < dssvj.DTB Then Begin Z:= dssv i; dssvi:= dssvj; dssvj:=Z; End; End; { 4. Thu tuc in danh sach sinh vien } Procedure InDSSV( Var dssv : KDSSVIEN; N : Integer); Var i : Integer; Begin Writeln(‘In danh sach len man hinh ‘); Writeln(‘STT HO VA TEN MASO, ‘TOAN LY DTBLOAI’); For i:=1 to N do With dssvi do Writeln(i:2, 32, Hoten, 32:19Length(Hoten), Maso:8, Toan:4:1, Ly:4:1, DTB:4:1, Loai:5); End; { 5. Cac bai toan nho lien quan danh sach sinh vien } Procedure CacBaiToan (dssv : KDSSVIEN; N : Integer); Var i , Dem: Integer; TBToan, Max: Real; Begin { Tim diem toan cao nhat} Max:=dssv1.Toan; For i:=1 to N do if Max< dssvi.Toan then Max:=dssvi.Toan; Writeln( ‘Diem Toan cao nhat =’, Max:4:1); { Dem so sv co diem Toan =Max} Dem:=0; For i:=1 to N do if dssvi.Toan =Max then Dem := Dem+1; Writeln(‘Co ‘, Dem, ‘em co diem Toan = ‘, Max:4:1); { Tinh diem binh quan mon Toan cua ca danh sach } TBToan:=0; For i:=1 to N do TBToan := TBToan + dssvi.Toan; TBToan:=TBToanN; Writeln(‘Diem binh quan mon Toan= ‘, TBToan:6:2); End; { Chương trình chính; } BEGIN Clrscr; NhapDSSV( ds, N ); SapXepDSSV( ds, N ); InDSSV( ds, N ); CacBaiToan( ds, N ); Readln; END. Bài toán số 5.3: Viết chương trình thao tác trên dữ liệu ngày giờ (có các thành phần Ngay, Thang, Nam, Gio, Phut, Giay): Nhập vào các thông tin ngày, tháng, năm. Hãy kiểm tra các thông tin về ngày đó có hợp lệ không. Xác địng số phút còn lại trong ngày của một thời điểm nào đó. Xác định số thứ tự ngày hiện tại so với ngày đầu năm.
Bài tập mảng chiều Pascal Cho dãy số gồm n phần tử n a[j-1]) then begin b:= a[j-1] ; a[j-1]:=a[j]; a[j]:=b; end; {sắp xếp phần tử giảm dần giá trị} for i=1 to n then begin write( a[i]); writeln; end; {in theo chiều dọc mảng} end hết muốn in theo chiều ngang for i=1 to n then begin write( a[i]); write(' '); { dấu cách giấu ' } end; có sai sót bạn sửa nhe khai báo biến thiếu học hồi 11 nên không nhớ rõ Một số tập lập trình Pascal Created by NgoHung Vấn đề 3: Mảng chiều Bài tốn số 3.1: Nhập xuất tính tổng phần tử mảng Ví dụ: A: Kết quả: Tong S = 23 Hướng dẫn: Để giải toán cần phải đảm bảo vấn đề: Nhập mảng, xây dựng thành hàm để đóng gói 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ừ đến N-1) nhập cho giá trị Ai mảng Lưu ý: N phải vào truyền theo dạng tham biến (tức &N) Xuất mảng Cơng việc đơn giản sử dụng vòng lặp từ đến N-1 để in giá trị Ai cho mảng Sau đó, Writeln xuống dòng - Hàm tính tổng phần tử cho mảng A o Khai báo khởi tạo toång S o Sử dụng vòng lặp (từ đến N-1 để duyệt qua tất giá trị Ai) để tính cộng dồn giá trị Ai vào tổng S Viết thân chương trình với nội dung dùng để kiểm tra kết thực hàm o A Khai báo mảng A có tối đa 20 phần tử biến N số lượng phần tử 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ị tổng phần tử cách truyền trực tiếp giá trị trả việc tính tổng cho Writeln(……) o Gọi hàm Readln( ) trước kết thúc để dừng lại xem kết Chương trình: { Cac khai bao cho chuong trinh } Program Mang1C; Uses crt; Type Mang20 = array[1 20] of Integer; Var N:Integer; A:Mang20; { 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 Begin Write( 'Nhap phan tu thu ', i,'' ); Readln( A[i] ); End; End; { Thu tuc xuat mang A voi N la so phan tu } Procedure XuatMang1C( Var A : Mang20;Var N :Integer ); Var i:Integer; Begin For i :=0 to N Write( A[i]:2 ); Writeln; End; { Chuong trinh tinh tong cac phan tu mang } Function TongMang1C( A : Mang20; N:Integer):longint; Var i :Integer; S :longint; Begin S := 0; For i:=0 to N S := S + A[i] ; TongMang1C:=S; End; { Than chuong trinh chinh } BEGIN NhapMang1C( A, N ); XuatMang1C( A, N ); Writeln(' Tong cac phan tu mang ', TongMang1C(A, N) ); Readln; END Bài toán tương tự: (1) Tính tổng số nguyên dương chia hết cho Function TongSoChiaHet5( A:Mang20, N:Integer):Integer; Var S,i :Integer; Begin S:=0; For i:=0 to N If(A[i] mod 5=0) S := S+A[i]; TongSoChiaHet5:= S; End; (2) Tính tổng số nguyên tố 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 Else return 1; End; Function TongSoNT(Var A : Mang20, Var N:Integer):Integer; Var S,i:Integer; Begin S:=0; For i:=0 to Ndo If ( LaSoNT( A[i] ) ) then S :=S+ A[i]; TongSoNT :=S; End; Bài toán số 3.2: Đếm số lần xuất giá trị X mảng A Đếm số lần xuất phần tử mảng Ví dụ: A: 5 1 X: Kết quả: So lan xuat hien X la So lan xuat hien cua cac phan tu: ==> ==> ==> ==> ==> 1 ==> …… Hướng dẫn: + Viết hàm đếm số lần xuất củat giá trị X nhập vào, xem X nhà tham số cho việc đếm số lần xuất A + Viết hàm in số lần xuất hiên tất phần tử 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 tố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) Hai hàm sử dụng kết toán 3.1 - Nhập giá trị X cần đếm số xuất - In số lần xuất X A Ý tưởng: o Khởi tạo biến đếm ban đầu o Sử dụng vòng lặp i, lặp từ đến N o Đối với phần tử A[i], A[i] = X tăng biến đếm lên Kết thúc, giá trị biến đếm số lần xuất cử X A o - In số lần xuất phần tử A Các hàm xây dựng: { Dem so phan tu A[i] 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 If ( A[i] = X ) then Count := Count + 1; DemPtuX := Count; End; { Dem so lan xuat hien cua tat ca cac phan tu mang } Procedure InSoLanXHcuaPTu( A:Mang20; N: Integer); Var i :Integer; Begin For i:=0 to N 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 A la:', DemPtuX(A, N, X) ); InSoLanXHcuaPTu ( A, N ); Readln; END Cải tiến: Không in phần tử lặp lại Hướng dẫn: Đối với phần tử, trước in, kiểm tra xem xuất trước hay khơng - Nếu A[i] chưa xuất trước nó, in số lần xuất A[i] Nếu A[i] có xuất trước nó, khơng in số lần xuất A[i] nữa, in số lần xuất phần tử có giá trị A[i] Mở rộng: In phần tử xuất nhiều mảng Bài tốn số 3.3: Tìm kiếm thay Tìm kiếm vị trí xuất x mảng A Thay giá trị Ai x thành y Ví dụ: A: 5 1 X=5 Y=15 Kết quả: Vi tri xuat hien X la Ket qua thay the: 15 15 15 1 Hướng dẫn: Xây dựng hàm tìm kiếm giá trị X mảng A, N phần tử Sử dụng vòng lặp từ đến N-1 để kiểm tra tất giá trị A i, x trả vị trí i tìm thấy Nếu vòng lặp mà khơng tìm thấy trả –1 Xây dựng hàm thay giá trị x y vị trí tìm thấy Tương tự tìm kiếm, tìm thấy tiến hành gán giá trị cho A i y Xây dựng hàm thay tất giá trị x y vị trí tìm thấy Sử dụng vòng lặp duyệt qua tất giá trị A i, Ai x tiến hành gán thành y Các hàm xây dựng: { Ham tim kiem gia tri X 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 Begin If (A[i] = x) then Begin Flag:=True; Break; {Tim thay ==> Tra ve vi tri tim thay } End; End; TimKiem:=Flag; End; { Thay the phan tu X dau tien tim thay 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 If (A[i] = x) then Begin } A[i] := y; { Tim thay x ==> thay the y } Break; { Cham dut qua trinh thay the} End; ThayThe := i; End; { 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 If(A[i] = x) then { Tim thay x ==> thay the y } A[i] := y; End; Source code chương trì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 mang A.', x, k ) Else Writeln( 'Khong tim thay mang A', x ); Write('gia tri y:'); Readln(y); Var i, j: Integer; Ktra : Boolean; Begin Ktra:= True; For i:=1 to N For j:=1 to N If (A[i, j] A[j, i]) then Ktra:=False; If (Kiemtra = True) then Writeln(‘Mang doi xung‘) Else Writeln(‘Mang khong doi xung’); End; { Than chuong trinh chinh } BEGIN { Nhung ham nhap xuat da de cap o Bai so 4.1, xem chi tiet o tren Writeln( ‘Nhap ma tran :’); } NhapMtran (A, N ); Writeln( ‘Ma tran da nhap la:’); XuatMang2C (A, N, N ); Writeln( ‘Tong ptu duong cheo chinh:’, TongDgCheoChinh(A, N) ); KiemtraDoixung ( A , N ); Readln; END Bài tốn số 4.4: Tính tổng hai ma trận A, B cấp NxM Tính ma trận C tổng hai ma trận A B, in ma trận C lên hình Cơng thức tính phần tử ma trận C= A+B: C[i,j ] = A[i, j] + B[i, j] với i=1, , N, j=1, , M Source code hàm xây dựng { Ham tinh tong hai ma tran } Procedure TongHaiMtran( Var A, B, C : Mang2C; N : Integer); Var i, j: Integer; Begin For i:=1 to N For j:=1 to N C[i, j] = A[j, i] + B[j, i]; End; { Than chuong trinh chinh } BEGIN { Nhung ham nhap xuat da de cap o Bai so 4.1, xem chi tiet o tren } Writeln( ‘Nhap ma tran A:’); NhapMtran (A, N ); Writeln( ‘Nhap ma tran B:’); NhapMtran (B, N ); Writeln( ‘Ma tran A da nhap la:’); XuatMang2C (A, N, N ); Writeln( ‘Ma tran B da nhap la:’); XuatMang2C (B, N, N ); TongHaiMtran( A, B, C, N); Writeln( ‘Ma tran Tong C la:’ ); XuatMang2C (B, N, N ); Readln; END Mở rộng: + Sử dụng tương tự để làm phép tốn lại ma trận: Ma trận chuyển vị, tích hai ma trận + Tính định thức ma trận Một số tập lập trình Pascal Created by NgoHung Vấn đề 1: Cấu trúc điều khiển Bài toán số 1.1: Tính tổng số tự nhiên từ đến N S=1+2+…+N Ví dụ : N = 5, Yêu cầu: S = + + + + = 15 Input: N, số tự nhiên Output: S, tổng số từ đến N Hướng dẫn: Bài toán thực qua bước cụ thể sau: - Thông báo nhập liệu, nhập liệu vào cho N - Tiến hành tính tổng S: o Khởi gán giá trị ban đầu cho tổng S o Tiến hành tính tổng, cộng dồn với giá trị i vào S (với i lặp từ N) - Xuất kết tổng S hình Chương trình: Program TinhTong; Uses crt; Var S,i,n:Integer; // Khai bao bien su dung BEGIN Write( ‘ Nhap so n:’ ); Readln( n ); // Thong bao nhap lieu // Nhap gtri N, (voi &N la lay d/c bien N) S: = 0; // Khoi gan gia tri ban dau cho S For i:=1 to n // Lap voi moi i co gia tri tu den N S:=S + i; Writeln( ‘Tong = ’, S); // Tinh tong cong don i vao S // Xuat ket qua tong S man hinh Readln; END Các phiên khác tốn là: ⊕ Tính tổng (với giả sử N số lẻ) ⊕ Tính tổng số tự nhiên lẻ nhỏ N ⊕ Tính tổng số tự nhiên chia hết cho 5, 10, 15, 20, 25, 30….N (N chia hết cho 5) Hướng dẫn: - Điều chỉnh bước lặp cho phù hợp - Trước cộng dồn giá trị i vào tổng S, phải kiểm tra điều kiện giá trị i có thỏa mãn điều kiện tốn hay không Cụ thể là: ⊕ For i:= to n // Lap voi moi i co gia tri tu den N S:= S + i / (i+1); // Tinh tong cong don i/(i+1) vao S (Luu y, truong hop bien S phai duoc khai bao kieu du lieu la so thuc Real ) ⊕ For i:=1 to n // Lap voi moi i co gia tri tu den N if ( i mod == 1) // Kiem tra i co’ phai la so le hay khong S := S + i; ⊕ for i:=1 to n // Dung ==> Tinh tong cong don i vao S // Lap voi moi i co gia tri tu den N if ( i % == 0) // Kiem tra i co’ phai la 5, 10, 15… hay khong S := S + i; // Dung ==>Tinh tong cong don i vao S Bài tốn số 1.2: Kiểm tra số N có phải số ngun tố hay khơng Ví dụ: N = 19 N = 33 Kết là: 19 la so nguyen to Kết là: 33 khong phai la so nguyen to Yêu cầu: Input: N, số tự nhiên Output: Trả lời “N la so nguyen to” “N khong phai la so nguyen to” tùy theo N Lưu ý: Số nguyên tố số chia hết cho ( N ) Ngược lại, N là số nguyên ==> N chia hết cho số khoảng từ đến (N-1) Hướng dẫn: Bài toán thực qua bước cụ thể sau: - Thông báo nhập liệu, nhập liệu vào cho N - Tiến hành kiểm tra N có phải số nguyên tố hay không: Xuất câu trả lời “N la so nguyen to” “N khong phai la so nguyen to” tùy theo giá trị biến Chương trình: Program SNT; Uses crt; Var n , i :Integer; // Khai bao bien su dung BEGIN Write(‘Nhap vao mot so:’); // Thong bao nhap lieu Readln(n); // Nhap gtri N, (voi &N la lay d/c bien N) i := round( sqrt(n) ); If( n mod i 0) then // Xuat cau tra loi cuoi cung Writeln(‘ N la so nguyen to’) Else Writeln(‘ N khong la so nguyen to’); Readln; END Bài tốn số 1.3: Tìm USCLN(a, b) va BSCNN(a, b) Ví dụ: USCLN(18, 24) = Yêu cầu: Input: a, b số tự nhiên Output: USCLN BSCNN a b Một số lưu ý: BSCNN(18, 24) = 72 - Nếu i ước số a b a b đồng thời chia hết cho i - Ln ln có tối thiểu USCLN a b - Nếu i USCLN i ước số nhỏ a lẫn b gần a, b Như vậy, sử dụng vòng lặp để kiểm tra a,b có đồng thời chia hết cho i hay khơng i USCLN khi: + i USC (a, b chia hết cho i) cuối i lặp từ đến a (hoặc b) + i USC (a, b chia hết cho i) lặp từ a (hoặc b) quay - BSCNN(a, b) = a * b / (USCLN(a, b) Hướng dẫn: Bài toán thực qua bước cụ thể sau: - Thông báo nhập liệu, nhập liệu vào cho a b - Tiến hành tính USCLN(a, b): Sử dụng vòng lặp for, lặp từ a lùi Kiểm tra a, b chia hết cho i gọi lệnh break để dừng vòng lặp ==> i USC gần a, b ==>USCLN - Xuất kết USCLN(a, b) , BSCNN (a, b) hình Chương trình: Program USCLN; Use crt; Var a , b :integer; // Khai bao bien su dung Begin Write(‘Nhap vao so a:’); Readln(a); Write(‘Nhap vao so b:’); Readln(b); For i:=a downto // Thong bao nhap lieu // Nhap gtri a (voi &a, la lay d/c bien a,) // Thong bao nhap lieu // Nhap gtri b (voi &b, la lay d/c bien b,) If ((a mod i = 0) and (b mod i = 0)) then // Kiem tra a, b co chia het Break; Writeln(‘USCLN (‘,a,’,’,b,’):’, i); // Xuat ket qua USCLN(a, b) Writeln(‘BSCNN (‘,a,’,’,b,’):’, a*b div i); // Xuat ket qua USCLN(a, b) Readln; End Bài toán số 1.4: Nhập vào số tự nhiên N Hãy tính tổng chữ số Ví dụ: N = 1682 Tong cac chu so cua N la: 17 ( = + + + ) Yêu cầu: Input: N số nguyên bất kỳ, N có khả số lớn Output: S, la tổng chữ số N Hướng dẫn: - Gán tổng S với giá trị ban đầu - Sử dụng để lấy chữ số số tự nhiên N cách: Lặp mà N > + Gán k chữ số cuối N + Tiến hành cắt chữ số cuối N việc lấy N chia cho 10 + Cộng dồn S: = S + k Lặp lại N = dừng Chương trình: Program tong; Uses crt; Var n , s , k: integer; // Khai bao bien su dung Begin Write(‘ Nhap N:’); // Thong bao nhap lieu Readln(N ); // Nhap gtri cho N S := 0; While ( N ) // Lap N ≠ Begin k := N mod 10; // Lay chu so hang don vi o cuoi cung N := N div 10; // Cat chu so hang don vi da duoc lay S := S + k; // Tinh tong cong don vao S End; Writeln( ‘Tong cac chu so cua ’,N,’ la :’, S); // Xuat ket qua Readln; End Bài toán số 1.5: Cho 14/03/2003 ngày năm Hãy xác định xem thử ngày này thứ năm Ví dụ: Ngày nhập vào 14/03/2003, Kết quả: Ngay thu 73 cua nam 2003 Yêu cầu : - Input: số ngay, thang, nam - Output: So thu tu cua Hướng dẫn: - Khởi gán stt - Với ví dụ trên, tính tổng cộng dồn số ngày tháng trước tháng 03 (cụ thể tháng 01, tháng 02) vào stt Sử dụng câu lệnh rẽ nhánh case để biết số ngày tháng - Bổ sung thêm số ngày tháng (ngay 14) vào stt Giải tốn với ngơn ngữ C - Khai báo thư viện sử dụng - Định nghĩa hàm main( ) hàm chương trình có mục tiêu giải toán với bước trên: + Khai báo biến sử dụng: ngay, thang, nam, stt + Thông báo nhập liệu nhập giá trị cho biến ngay, thang, nam + Khởi gán stt = + Lặp cộng dồn số ngày tháng mà nhỏ thang - Sử dụng case để xác định số ngày tháng - Bổ sung số ngày vào stt + Bổ sung số ngày tháng vào stt + Thơng báo kết Chương trình: Program ngaythangnam; Uses crt; Var ngay,thang,nam,i,stt:integer; // Khai bao bien su dung Begin Write(‘Nhap ngay, thang, nam:’); // Thong bao nhap lieu Readln(ngay, thang, nam); // Nhap gtri cho ngay, thang, nam stt := 0; For i := to thang // Lap voi cac i nho hon thang da nhap vao) case thang of 1,3,5,7,8,10,12 : 4,6,9,11: : stt := stt + 31; stt := stt + 30; stt := stt + 28; Else stt := stt + ngay; end; Writeln(‘Ngay thu ‘, stt, nam); // Xuat ket qua Readln; End Bài tốn ngược: Có số thứ tự ngày năm, xác định nhày ngày Ví dụ: Nhập stt = 84 kết 25/04 Hướng dẫn: Làm theo chiều ngược lại - Giả sử ban đầu xuất phát với thang Nếu stt lớn số ngày cua tháng (thang ) tiến hành: o thang tăng lên o stt gán stt trừ số ngày tháng - Lặp lại q trình stt nhỏ số ngày tháng Một số tập lập trình Pascal Created by NgoHung Vấn đề 5: Kiểu liệu có cấu trúc Bài tốn số 5.1: Viết chương trình thao tác điểm mặt phẳng (có thành phần X, Y) : + Nhập thông tin điểm A, B, C Tính diện tích Tam giá ABC + Nhập danh sách n điểm, điểm M Hãy xác định điểm gần điểm M Hướng dẫn: - Viết hàm tính khoảng cách điểm A, B theo công thức: - Viết hàm tính diện tích tam giác ABC thơng qua chu vi tam giác: a = KhoangCach(B, C) b = KhoangCach(A, C) c = KhoangCach(A, B) p = ( a+b+c) / Viết hàm tìm kiểm danh sách điểm nhậm vào, tìm điểm X có khoảng cách từ X đến M nhỏ Source code chương trình: { Khai bao cac kieu du lieu va bien can thiet } PROGRAM ThaoTacDiem; Uses CRT; Type KDIEM = RECORD X,Y : Integer; End; KDSDIEM = Array[1 50] of KDIEM; Var DS: KDSDIEM; n: Integer; A, B, C, M, X: KDIEM; { Thu tuc nhap diem A, B, C} Procedure NhapABC( Var A, B, C: KDIEM); Begin Write(‘Toa A(X, Y):’); Readln( A.X, A.Y ); Write(‘Toa B(X, Y):’); Readln( B.X, B.Y ); Write(‘Toa C(X, Y):’); Readln( C.X, C.Y ); End; { Thu tuc nhap du lieu cho danh sach diem } Procedure NhapDSDiem( Var dsdiem : KDSDIEM; Var N:Integer); Var i:Integer; Begin Repeat Write(‘Nhap so diem = ‘); Readln(N); Until ( N>0 ) and ( N < 51); For i:=1 to N Begin Write(‘Toa X, Y:’); End; Readln(dsdiem[i].X, dsdiem[i].Y); End; { Ham tinh khoang cach giua diem A, B } Function KhoangCach( A, B: KDIEM) : Real; Begin KhoangCach := Sqrt( Sqr(A.X-B.X) + Sqr(A.Y-B.Y) ); End; { Ham tinh dien tich tam giac A, B, C } Function DienTichABC( A, B, C: KDIEM) : Real; Var ab, bc, ca, p: Real; Begin ab := KhoangCach ( A, B ); bc := KhoangCach ( B, C ); ca := KhoangCach ( C, A ); p := (ab + bc + ca) / 2; DienTichABC := Sqrt( p * (p-ab) * (p-bc) * (p-ca) ); End; { Xac dinh diem gan M nhat danh sach n diem } Function DiemGanMnhat(ds : KDSDIEM; n:Integer;M:KDIEM): KDIEM; Var kcMin, kc: Real; X: KDIEM; I : Integer; Begin KcMin := KhoangCach(M, ds[1]); For i:=1 to N Begin Kc := KhoangCach(M, ds[i]); If (kc >= kcMin) Then Begin KcMin := Kc; X := ds[i]; End; DiemGanMnhat := X; End; { Chương trình chính; } BEGIN Clrscr; NhapABC( A, B, C ); Writeln(‘Diem tich tam giac ABC= ‘, DienTichABC(A, B, C):6:2); NhapDSDiem( ds, N ); Write(‘Toa M(x, y):’); Readln(M.X, M.Y); X := DiemGanMnhat(ds, N, M); Writeln(‘Diem gan M nhat la (‘, X.x,’ , ’ , X.y,’ ) cac diem nhap vao ’); Readln; END Bài tốn số 5.2: Viết chương trình thao tác danh sách sinh viên (có thơng tin Hoten, Maso, Loai, Toan, Ly, DTB) : + Nhập / In danh sách sinh viên + Sắp xếp danh sách sinh viên theo thứ tự tăng dần điểm trung bình + Tìm điểm tốn cao danh sách, Số sinh viên có điểm tốn = Max, Điểm bình qn mơn tốn danh sách? Hướng dẫn: Xây dựng thủ tục nhập thông tin danh sách sinh viên, sử dụng vòng lặp để nhập thông tin sinh viên thứ i Sử dụng Câu lệnh With để truy xuất đến thành phần cấu trúc KSVIEN Quá trình xếp thuật toán xếp đổi chổ trực tiếp Xem hướng dẫn 3.4 Thuộc tính so sánh dssv[i].DTB dssv[j].DTB Không sử dụng phép gán thông thường mà phải sử dụng memcpy để tiến hành copy hai vùng nhớ biến Source code chương trình: { Khai bao cac kieu du lieu va bien can thiet } PROGRAM Quan_Ly_SV; Uses CRT; Type KSVIEN = RECORD Hoten : String[18]; Maso, Loai: String[8]; Toan, Ly, DTB: Real; End; KDSSVIEN = Array[1 50] of KSVIEN; Var DS: KDSSVIEN; N: Integer; { Thu tuc nhap du lieu cho danh sach sinh vien } Procedure NhapDSSV( Var dssv : KDSSVIEN; Var N:Integer); Var i:Integer; Begin Repeat Write(‘Nhap so sinh vien N= ‘); Readln(N); Until ( N>0) and ( N < 51); For i:=1 to N With dssv[i] Begin Write(‘Nhap ho ten :’); Readln(Hoten); Write(‘Ma so sv :’); Readln(Maso); Write(‘Toan, Ly :’); Readln(Toan, Ly); DTB := (Toan + Ly) / 2; If DTB >=9 then Loai:=‘Gioi’ Else if DTB >=7 then Loai:=‘Kha’ Else if DTB >=5 then Loai:=‘Binh’ Else Loai:=‘Kem’; End; End; { Thu tuc sap xep danh sach sinh vien tang dan theo diem trung binh } Procedure SapXepDSSV( Var dssv : KDSSVIEN; N : Integer); Var i, j : Integer; Z : KSVIEN; Begin For i:=1 to N-1 For j:=i+1 to N If dssv[i].DTB < dssv[j].DTB Then Begin Z:= dssv [i]; dssv[i]:= dssv[j]; dssv[j]:=Z; End; End; { Thu tuc in danh sach sinh vien } Procedure InDSSV( Var dssv : KDSSVIEN; N : Integer); Var i : Integer; Begin Writeln(‘In danh sach len man hinh ‘); Writeln(‘STT HO VA TEN MA SO', ‘TOAN LY DTB LOAI’); For i:=1 to N With dssv[i] Writeln(i:2, #32, Hoten, #32:19-Length(Hoten), Maso:8, Toan:4:1, Ly:4:1, DTB:4:1, Loai:5); End; { Cac bai toan nho lien quan danh sach sinh vien } Procedure CacBaiToan (dssv : KDSSVIEN; N : Integer); Var i , Dem: Integer; TBToan, Max: Real; Begin { Tim diem toan cao nhat} Max:=dssv[1].Toan; For i:=1 to N if Max< dssv[i].Toan then Max:=dssv[i].Toan; Writeln( ‘Diem Toan cao nhat =’, Max:4:1); { Dem so sv co diem Toan =Max} Dem:=0; For i:=1 to N if dssv[i].Toan =Max then Dem := Dem+1; Writeln(‘Co ‘, Dem, ‘em co diem Toan = ‘, Max:4:1); { Tinh diem binh quan mon Toan cua ca danh sach } TBToan:=0; For i:=1 to N TBToan := TBToan + dssv[i].Toan; TBToan:=TBToan/N; Writeln(‘Diem binh quan mon Toan= ‘, TBToan:6:2); End; { Chương trình chính; } BEGIN Clrscr; NhapDSSV( ds, N ); SapXepDSSV( ds, N ); InDSSV( ds, N ); CacBaiToan( ds, N ); Readln; END Bài tốn số 5.3: Viết chương trình thao tác liệu ngày (có thành phần Ngay, Thang, Nam, Gio, Phut, Giay): Nhập vào thông tin ngày, tháng, năm Hãy kiểm tra thông tin ngày có hợp lệ khơng - Xác địng số phút lại ngày thời điểm Xác định số thứ tự ngày so với ngày đầu năm ... số tập lập trình Pascal Created by NgoHung Vấn đề 4: Mảng chiều Bài toán số 4 .1: Viết chương trình thao tác mảng chiều với công việc sau: + Nhập xuất mảng chiều + Đếm số lần xuất giá trị mảng. .. (A[i -1] +A[i]); A[i -1] := k; A[i] := k; End; End; Bài toá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 mảng có phần tử Ai = AN-i -1 Nếu mảng mảng... mảng chiều nhập vào Hướng dẫn: + Khai báo kiểu liệu mảng chiều Type Mang2C = Array [1 10, 10 ] of Real; + Xây dựng thủ tục nhập liệu cho mảng chiều A với kích thước MxN Lưu ý: tham số: A (tên mảng) ,