Ma trận đề chương trình con trong pascal
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ử A[i, j] có i = j ( hay A[i, 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<11 ); For i:=1 to N do For j:=1 to N do Begin Write(‘Nhập Ptu[‘, i, ‘,’, j , ‘]: ‘); Readln(A[i,j]); End; End; { 2. Thu tục xuat mang 2 chieu } Procedure XuatMtran( A : Mang2C; N : Integer); Var i, j: Integer; Begin For i:=1 to N do Begin For j:=1 to N do Write(A[i, j],’ ‘); Writeln; End; End; { 3. Ham tinh tong tren duong cheo chinh cua ma tran vuong } Function TongDgCheoChinh( A : Mang2C; N : Integer) : Real; Var i, j: Integer; S : Real; Begin S := 0; For i:=1 to N do S := S + A[i, i]; TongDgCheoChinh := S; End; { 3. Ham kiem tra tinh doi xung cua ma tran vuong qua duong cheo chinh } Procedure KiemtraDoixung( A : Mang2C; N : Integer); Var i, j: Integer; Ktra : Boolean; Begin Ktra:= True; For i:=1 to N do For j:=1 to N do 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; { 4. 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. Một số bài tập lập trình PascalVấn đề 2: Chương trình con: Thủ tục và HàmBài toán số 2.1:Viết chương trình chuyển đổi số tự nhiên N cho trước sang hệ cơ số 2 bằng việc xây dựng hàm chuyển đổi. Hướng dẫn: - Xây dựng hàm Dec2Bin( ) chuyển đổi từ số tự nhiên sang số nhị phân. o Sử dụng biến S để lưu giá trị số nhị phân của N. Khởi gán bằng 0. o Tiến hành lặp chuyển đổi cơ số: Lặp trong khi mà N > 0 § SoDu = số dư của N chia cho 2. § N = N chia cho 2. § Bổ sung chữ số SoDu vào số S thành một chữ số o Trả về kết quả cuối cùng của 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 biến N, M o Thông báo nhập, nhập giá trị cho biến N o Gán giá trị M bằng kết quả trả về của hàm Dec2Bin( N ) o In thông báo về kết quả số nhị phân chuyển đổi được (giá trị của M) o Gọi hàm readln trước khi kết thúc chöông trình Chương trình: Program Doi_Co_So; Uses crt; Var N:integer; { 1. Thu tuc chuyen so tu nhien n cho truoc sang ket qua tra ve he co so 2 } Function Dec2Bin ( n:integer ):integer; Var S,So,Du:integer; Begin S := 0; So := n ; While ( So > 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 a*b 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 N-1 do { Lap voi moi i co gia tri tu 2 den N-1} 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 N-1 do { Lap voi moi i co gia tri tu 2 den N-1} 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* (p-a)*(p-b)*(p-c)); 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. |