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 Pascal

Vấn đề 2: Chương trình con: Thủ tục và Hàm

Bà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.