//
you're reading...
100 bài tập Pascal cơ bản, Bài tập huấn luyện, Chủ đề mảng (array), Dùng cho cấp THCS, Dùng cho cấp THPT, Giáo trình Tin học cơ bản

Chương 5: Bài tập mẫu

Bài tập 5.1:      Viết chương trình tìm giá trị lớn nhất của một mảng chứa các số nguyên gồm N phần tử.


Ý tưởng:


– Cho số lớn nhất là số đầu tiên: Max:=a[1].
– Duyệt qua các phần tử a[i], với i chạy từ 2 tới N: Nếu a[i]>Max thì thay Max:=a[i];

Uses Crt;
Const MaxPhanTu = 50;
Type Mang = ARRAY[1..MaxPhanTu] Of Integer;
Var     
    A:Mang;
    N,i,Max:Integer;

Begin
    {Nhập mảng}
    Write(‘Nhap N=’); 
    Readln(N);
    For i:=1 To N Do
        Begin
            Write(‘A[‘,i,’]=’); 
            Readln(A[i]);
        End;

    {Tìm phần tử lớn nhất}
    Max:=A[1];
    For i:=2 To N Do
    If Max<A[i] Then Max:=A[i];
    
    {In kết quả ra màn hình}
    Writeln(‘Phan tu lon nhat cua mang: ’, Max);
    Readln;
End.

Bài tập 5.2:      Viết chương trình tính tổng bình phương của các số âm trong một mảng gồm N phần tử.

Ý tưởng:

Duyệt qua tất cả các phần tử A[i] trong mảng: Nếu A[i]2 vào biến S.

Uses Crt;

Type Mang = ARRAY[1..50] Of Integer;

Var      A:Mang;

N,i,S:Integer;

Begin

{Nhập mảng}

Write(‘Nhap N=’); Readln(N);

For i:=1 To N Do

Begin

Write(‘A[‘,i,’]=’); Readln(A[i]);

End;

{Tính tổng}

S:=0;

For i:=1 To N Do

If A[i]

{In kết quả ra màn hình}

Writeln(‘S= ’, S);

Readln;

End.

Bài tập 5.3: Viết chương trình nhập vào một mảng gồm N số nguyên. Sắp xếp lại mảng theo thứ tự tăng dần và in kết quả ra màn hình.

Ý tưởng:

Cho biến i chạy từ 1 đến N-1, đồng thời cho biến j chạy từ i+1 đến N: Nếu A[i]>A[j] thì đổi chổ A[i], A[j].

Uses Crt;

Type Mang = ARRAY[1..50] Of Integer;

Var      A:Mang;

N,i,j,Tam:Integer;

Begin

{Nhập mảng}

Write(‘Nhap N=’); Readln(N);

For i:=1 To N Do

Begin

Write(‘A[‘,i,’]=’); Readln(A[i]);

End;

{Sắp xếp}

For i:=1 To N-1 Do

For j:=i+1 To N Do

If A[i]>A[j] Then

Begin

Tam:=A[i]; A[i]:=A[j]; A[j]:=Tam;

End;

{In kết quả ra màn hình}

Writeln(‘Ket qua sau khi sap xep:’);

For i:=1 To N Do Write(A[i]:5);

Readln;

End.

Bài tập 5.4: Viết chương trình nhập vào một mảng A gồm N số nguyên và nhập thêm vào một số nguyên X. Hãy kiểm tra xem phần tử X có trong mảng A hay không?

Ý tưởng:

Dùng thuật toán tìm kiếm tuần tự. So sánh x với từng phần tử của mảng A. Thuật toán dừng lại khi x=A[i] hoặc i>N.

Nếu x=A[i] thì vị trí cần tìm là i, ngược lại thì kết quả tìm là 0 (không tìm thấy).

Uses Crt;

Type Mang = ARRAY[1..50] Of Integer;

Var      A:Mang;

N,i,x:Integer;

Function TimKiem(x, N: Integer; A:Mang):Integer;

Var i:Integer;

Begin

I:=1;

While (I <= N) and (X<>A[I]) do I:=I+1;

If I <= N Then Timkiem:=I  Else Timkiem:=0;

End;

Begin

{Nhập mảng}

Write(‘Nhap N=’); Readln(N);

For i:=1 To N Do

Begin

Write(‘A[‘,i,’]=’); Readln(A[i]);

End;

Write(‘Nhap X=’); Readln(x);

{Kết quả tìm kiếm}

If TimKiem(X,N,A)<>0 Then

Writeln(‘Vi tri cua X trong mang la:’, TimKiem(X,N,A))

Else Writeln(‘X khong co trong mang.’);

Readln;

End.

Bài tập 5.5: Giả sử mảng A đã được sắp xếp theo thứ tự tăng dần. Viết hàm để kiểm tra xem phần tử X có trong mảng A hay không?

Ý tưởng:

So sánh x với phần tử ở giữa mảng A[giua]. Nếu x=A[giua] thì dừng (vị trí cần tìm là chỉ số của phần tử giữa của mảng). Ngược lại, nếu  x>A[giua] thì tìm ở đoạn sau của mảng [giua+1,cuoi], ngược lại thì tìm ở đoạn đầu của mảng [dau,giua-1].

Sau đây là hàm cài đặt cho thuật toán này:

Function TimKiemNhiPhan(X, N: Integer; A: Mang):Integer;

Var      dau,cuoi,giua:Integer;

Found:Boolean;

Begin

dau:=1; {điểm mút trái của khoảng tìm kiếm}

cuoi:=N; {điểm mút phải của khoảng tìm kiếm}

Found:=False; {chưa tìm thấy}

While (dau <=cuoi) and (Not Found) Do Begin giua:=(dau + cuoi) Div 2; If  X = A[giua] Then Found:=True {đã tìm thấy} Else If X > A[giua] Then dau:=giua+1

Else cuoi:=giua-1;

End;

If Found Then TimKiemNhiPhan:= giua Else TimKiemNhiPhan:=0;

End;

Bài tập 5.6: Viết chương trình tìm ma trận chuyển vị của ma trận A.

Ý tưởng:

Dùng mảng 2 chiều để lưu trữ ma trận. Gọi B là ma trận chuyển vị của ma trận A, ta có: Bij = Aji.

Uses Crt;

Type Mang = ARRAY[1..10,1..10] Of Integer;

Var      A,B:Mang;

m,n,i,j:Integer;

Begin

{Nhập ma trận}

Write(‘Nhap số dòng m=’); Readln(m);

Write(‘Nhap số cột n=’); Readln(n);

For i:=1 To m Do

For j:=1 To n Do

Begin

Write(‘A[‘,i,j,’]=’); Readln(A[i,j]);

End;

{Tìm ma trận chuyển vị}

For i:=1 To m Do

For j:=1 To n Do       B[i,j]:=A[j,i];

{In ma trận chuyển vị ra màn hình}

For i:=1 To m Do

Begin

For j:=1 To n Do       Write(B[i,j]:5);

Writeln;

End;

Readln;

End.

Bài tập 5.7: Cho một mảng 2 chiều A cấp mxn gồm các số nguyên và một số nguyên x. Viết chương trình thực hiện các công việc sau:

a/ Đếm số lần xuất hiện của x trong A và vị trí của chúng.

b/ Tính tổng các phần tử lớn nhất của mỗi dòng.

Uses Crt;

Type Mang = ARRAY[1..10,1..10] Of Integer;

Var      A:Mang;

m,n,i,j,x,dem,S,max:Integer;

Begin

{Nhập ma trận}

Write(‘Nhap số dòng m=’); Readln(m);

Write(‘Nhap số cột n=’); Readln(n);

For i:=1 To m Do

For j:=1 To n Do

Begin

Write(‘A[‘,i,j,’]=’); Readln(A[i,j]);

End;

{Nhập x}

Write(‘Nhap x=’); Readln(x);

{Đếm số lãn xuất hiện của x và vị trí của x}

dem:=0;

Writeln(‘Vi tri cua x trong mang A: ‘);

For i:=1 To m Do

For j:=1 To n Do

If x=A[i,j] Then

Begin

Write(i,j,’ ; ‘);

dem:=dem+1;

End;

Writeln(‘So lan xuat hien cua x trong mang A la: ‘,dem);

{Tính tổng các phần tử lớn nhất của mỗi dòng}

S:=0;

For i:=1 To m Do {duyệt qua từng dòng}

Begin

{Tìm phần tử lớn nhất của dòng thứ i}

Max:=A[i,1];

For j:=2 To n Do       {duyệt từng phần tử của dòng thứ i}

If max<A[i,j] Then max:=A[i,j];

{Cộng max vào biến S}

S:=S+max;

End;

Writeln(‘Tong cac phan tu lon nhat cua moi dong la: ‘,S);

Readln;

End.

Bài tập 5.8: Giải phương trình bằng phương pháp chia nhị phân.

Ý tưởng:

Giả sử cần tìm nghiệm của phương trình f(x)=0 trên đoạn [a,b] với y=f(x) đồng biến và đơn trị trên đoạn [a,b]. Ta giải như sau:

Gọi m là trung điểm của đoạn [a,b]. Nếu f(m)*f(a)

Giả sử f(x) là một đa thức: f(x) = a0 + a1x + a2x2 + … + anxn. Lúc này, ta có thể dùng mảng một chiều để lưu trữ các hệ số ai của đa thức.

Uses Crt;

Type HESO=Array[0..20] Of Real;

Var      a:HESO;

n:Byte;

Min,Max,epsilon:Real;

Procedure NhapDaThuc;

Var i:Byte;

Begin

Write(‘Bac cua da thuc: n= ‘); Readln(n);

Writeln(‘Nhap cac he so cua da thuc:’);

For i:=0 To n Do

Begin

Write(‘a[‘,i,’]=’); Readln(a[i]);

End;

Writeln(‘Nhap doan tim nghiem:[a,b]’);

Write(‘a= ‘); Readln(Min);

Write(‘b= ‘); Readln(Max);

Write(‘Nhap sai so cua phuong trinh: ‘); Readln(epsilon);

End;

{Tính giá trị của đa thức}

Function f(x:Real):Real;

Var      S,tam:Real;

i:Byte;

Begin

S:=a[0]; tam:=1;

For i:=1 To n Do

Begin

tam:=tam*x;

S:=S+a[i]*tam;

End;

f:=S;

End;

Procedure TimNghiem(Min,Max:real);

Var m:Real;

Begin

If f(Min)*f(Max)>0 Then Writeln(‘Phuong trinh vo nghiem.’)

Else If abs(f(Min))

Else If abs(f(Max))

Else

Begin

m:=(Min+Max)/2;

If abs(f(m))<=epsilon Then Writeln(‘Nghiem la x=’,m:0:2)

Else If f(Min)*f(m)

Else TimNghiem(m,Max);

End;

End;

Begin

NhapDaThuc;

TimNghiem(Min,Max);

Readln;

End.

Bài tập 5.9: Viết chương trình nhập vào số tự nhiên N (N lẻ), sau đó điền các số từ 1 đến n2 vào trong một bảng vuông sao cho tổng các hàng ngang, hàng dọc và 2 đường chéo đều bằng nhau (bảng này được gọi là Ma phương).

Ví dụ: Với N=3 và N=5 ta có

Bắc
2 7 6 3 16 9 22 15
9 5 1 20 8 21 14 2
4 3 8 Tây 7 25 13 1 19 Đông
24 12 5 18 6
11 4 17 10 23
Nam

Phuơng pháp:

Xuất phát từ ô bên phải của ô nằm giữa. Đi theo hướng đông bắc để điền các số 1, 2, …

Khi điền số, cần chú ý một số nguyên tắc sau:

– Nếu vượt ra phía ngoài bên phải của bảng thì quay trở lại cột đầu tiên.

– Nếu vượt ra phía ngoài bên trên của bảng thì quay trở lại dòng cuối cùng.

– Nếu số đã điền k chia hết cho N thì số tiếp theo sẽ được viết trên cùng một hàng với k nhưng cách 1 ô về phía bên phải.

Uses Crt;

Var A:Array[1..20,1..20] Of Word;

n,i,j,k:Word;

Begin

Write(‘Nhap N= ‘); Readln(n);

Clrscr;

{Định vị ô xuất phát}

i:=n DIV 2 + 1;

j:=n DIV 2 + 2;

{Điền các số k từ 1 đến n*n}

For k:=1 To n*n Do

Begin

A[i,j]:=k;

If k MOD n=0 Then j:=j+2

Else Begin

{Đi theo hướng đông bắc}

j:=j+1; i:=i-1;

End;

If j>n Then j:=j MOD n;

If i=0 Then i:=n;

End;

{In kết quả ra màn hình}

For i:=1 To n Do

Begin

For j:=1 To n Do write(a[i,j]:4);

Writeln;

End;

Readln;

End.

Bài tập 5.10: Viết chương trình nhập vào 2 mảng số nguyên A, B đại diện cho 2 tập hợp (không thể có 2 phần tử trùng nhau trong một tập hợp). Trong quá trình nhập, phải kiểm tra: nếu phần tử vừa nhập vào đã có trong mảng thì không bổ sung vào mảng. In ra màn hình các phần tử là giao của 2 tập hợp A, B.

Ý tưởng:

Duyệt qua tất cả các phần tử aiÎA. Nếu aiÎB thì viết ai ra màn hình.

Uses Crt;

Type Mang=ARRAY[1..50] Of Integer;

Var A,B:Mang;

n,m:Byte;

Function KiemTra(x:Integer; n:Byte; A:Mang):Boolean;

Var i:Byte; Found:Boolean;

Begin

Found:=False;

i:=1;

While (i<=n) AND (not Found) Do

If x=A[i] Then Found:=True Else i:=i+1;

KiemTra:=Found;

End;

Procedure NhapMang(Var n:Byte; Var A:Mang);

Var ch:Char;

x:Integer;

Begin

n:=0;

Repeat

Write(‘x=’); Readln(x);

If not KiemTra(x,n,A) Then

Begin

n:=n+1; A[n]:=x;

End;

Writeln(‘An ESC de ket thuc nhap!’);

ch:=Readkey;

Until ch=#27;

End;

Procedure GiaoAB(n:Byte; A:Mang;m:Byte; B:Mang);

Var i:Byte;

Begin

For i:=1 To n Do

If KiemTra(A[i],m,B) Then Write(A[i]:4);

End;

Begin

Clrscr;

Writeln(‘Nhap mang A: ‘);

NhapMang(n,A);

Writeln(‘Nhap mang B: ‘);

NhapMang(m,B);

Writeln(‘Giao cua 2 mang A&B la: ‘);

GiaoAB(n,A,m,B);

Readln;

End.

Bài tập 5.11: Cho một mảng số nguyên gồm n phần tử. Tìm dãy con gồm m phần tử  (m£n) sao cho dãy con này có tổng lớn nhất. (Dãy con là dãy các phần tử liên tiếp nhau trong mảng).

Uses Crt;

Type Mang=ARRAY[1..50] Of Integer;

Var A:Mang;

n,m,i,j,k:Byte;

S,Max:Integer;

Begin

Write(‘So phan tu cua mang: n= ‘); Readln(n);

For i:=1 To n Do

Begin

Write(‘a[‘,i,’]=’); Readln(a[i]);

End;

Write(‘Nhap so phan tu cua day con: m= ‘); Readln(m);

k:=1; {Vị trí phần tử đầu tiên của dãy con}

{Giả sử m phần tử đầu tiên của mảng A là dãy con có tổng lớn nhất}

Max:=0;

For i:=1 To m Do Max:=Max+A[i];

{Tìm các dãy con khác}

For i:=2 To n-m+1 Do

Begin

{Tính tổng của dãy con thứ i}

S:=0;

For j:=i To i+m-1 Do S:=S+A[j];

If S>Max Then {Nếu dãy con tìm được có tổng lớn hơn dãy con trước}

Begin

Max:=S; {Thay tổng mới}

k:=i;       {Thay vị trí đầu tiên của dãy con mới}

End;

End;

Writeln(‘Day con co tong lon nhat la:’);

For i:=k To k+m-1 Do Write(A[i]:5);

Readln;

End.

Bài tập 5.12: Viết chương trình in ra màn hình tam giác Pascal. Ví dụ, với n=4 sẽ in ra hình sau:

1

1          1

1          2          1

1          3          3          1

1          4          6          4          1

Ý tưởng:

Tam giác Pascal được tạo ra theo qui luật sau:

+ Mỗi dòng đều bắt đầu và kết thúc bởi số 1.

+ Phần tử thứ j ở dòng k nhận được bằng cách cộng 2 phần tử thứ j-1 và j ở dòng thứ k-1.

Uses Crt;

Var Dong:Array[0..20] Of Byte;

n,i,j:Byte;

Begin

Write(‘n= ‘); Readln(n);

Clrscr;

Dong[0]:=1;

Writeln(Dong[0]:4);

{Khoi tao gia tri cua dong}

For i:=1 To n Do Dong[i]:=0;

{Voi moi dong i}

For i:=1 To n Do

Begin

For j:=i DownTo 1 Do

Begin

Dong[j]:=Dong[j-1]+Dong[j];

Write(Dong[j]:4);

End;

Writeln(Dong[i]:4);

End;

Readln;

End.

Advertisements

About pascalteacher

Trang thông tin Toán học và Tin học

Thảo luận

Không có bình luận

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s

Các tác giả

Chuyên mục

Tháng Mười 2016
H B T N S B C
« Th9   Th11 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

NCT Computer

Flickr Photos

Thống kê

  • 254,189 lượt xem

pascalteacher.nct@gmail.com


Trang huấn luyện học sinh giỏi Tin học

%d bloggers like this: