Tải bản đầy đủ (.docx) (46 trang)

Bài tập về mảng 1 chiều trong Pascal

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (290.24 KB, 46 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

Bài tập về mảng 1 chiều trong Pascal.


Cho 1 dãy số gồm n phần tử n<=15. Giá trị từng phần tử là số thực. Thực hiện các chương trình
sau:


a) Nhập từ bàn phím số phần tử và giá trị từng phần tử
b) Tính tổng các phần tử âm của dãy


c) Tính tổng và trung bình cộng của các phần tử chẵn của dãy
d) Tìm phần tử có giá trị lớn nhất của dãy


e) Tìm phần tử có giá trị nhỏ nhất


f) Sắp xếp dãy theo chiều giảm dần về giá trị của từng phần tử
g) In các kết quả trên ra màn hình


program vd1;
var i,n :Byte;


ta, tb, b, c, d :real;
a: array[1..15] of real ;
begin


write(' nhập số lượng phần tử n ='); readln(n);
Writeln('Nhap mang a: ');


for i:=1 to n do
begin


write('a[',i,']= ');
readln(a[i])


end;


ta:=0;


for i:=1 to n do if a[i] <0 then ta= ta + a[i] ; { tính tổng âm}
tc:= 0; t:=1;


for i:=1 to n do if i mod 2 =0 then begin
t= t+1 ;


tc= tc + a[i] ; {tính tổng phần tư chẵn}
end;


ttc = tc/t ; { trung bình phần tử chẵn}
max:= a[1];


for i=2 to n do if max < a[i] then max =a[i] ; { tìm phần tử lớn nhất}
min:= a[1];


for i=2 to n do if min > a[i] then min =a[i] ; { tìm phần tử nhỏ nhất}
for i=2 to n do


for j=n down to i do
if (a[j]> a[j-1])
then begin


b:= a[j-1] ;
a[j-1]:=a[j];
a[j]:=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( a[i]);
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( a[i]);


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

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


<b>Một số bài tập lập trình Pascal</b>


Created by NgoHung
<b>Vấn đề 3: Mảng 1 chiều</b>


<b>Bài tốn số 3.1: Nhập xuất và tính tổng các phần tử trong mảng.</b>


Ví dụ: A: 1 5 6 7 4
Kết quả: Tong S = 23


<b>Hướng dẫn: Để giải quyết bài toán cần phải đảm bảo các vấn đề:</b>


- 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 voø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 toå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ử.


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

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ả.



<b>Chương trình:</b>


<b>{ 1. Cac khai bao cho chuong trinh }</b>


<b>Program Mang1C;</b>


Uses crt;


Type Mang20 = array[1..20] of Integer;
Var N:Integer;


A:Mang20;


<b>{ 2. Thu tuc nhap mang A voi N la so phan tu }</b>


<b>Procedure NhapMang1C(Var A : Mang20 ;Var N:Integer);</b>


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;



<b>{ 3. Thu tuc xuat mang A voi N la so phan tu }</b>


<b>Procedure XuatMang1C( Var A : Mang20;Var N :Integer );</b>


Var i:Integer;
Begin


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

Write( A[i]:2 );
Writeln;


End;


<b>{ 4. Chuong trinh con tinh tong cac phan tu trong mang }</b>


<b>Function TongMang1C( A : Mang20; N:Integer):longint;</b>


Var i :Integer;
S :longint;


Begin
S := 0;


For i:=0 to N do
S := S + A[i] ;


TongMang1C:=S;
End;


<b>{ 5. Than chuong trinh chinh }</b>



<b>BEGIN</b>


NhapMang1C( A, N );
XuatMang1C( A, N );


Writeln(' Tong cac phan tu trong mang ', TongMang1C(A, N) );


Readln;
<b>END.</b>


<b>Bài toán tương tự:</b>


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

<b>Function TongSoChiaHet5( A:Mang20, N:Integer):Integer;</b>


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


<b>Function LaSoNT( Var N:Integer) :Integer;</b>



Var i:Integer;


Begin


For i:=2 to N-1do
If(N mod i = 0) then
return 0


Else


return 1;
End;


<b>Function TongSoNT(Var A : Mang20, Var N:Integer):Integer;</b>


Var S,i:Integer;
Begin


S:=0;


For i:=0 to Ndo


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

S :=S+ A[i];
TongSoNT :=S;
End;


<b>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</b>
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 …….
<b>Hướng dẫn:</b>


+ 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).


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.


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

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.


<b>Các hàm xây dựng:</b>


<b>{ 1. Dem so phan tu A[i] trong mang bang gia tri X }</b>


<b>Function DemPtuX(Var A : Mang20; N, X : Integer) : Integer;</b>


Var i , Count : Integer;
Begin


Count := 0;
For i:=0 to N do


If ( A[i] = X ) then


Count := Count + 1;
DemPtuX := Count;


End;


<b>{ 2. Dem so lan xuat hien cua tat ca cac phan tu trong mang }</b>


<b>Procedure InSoLanXHcuaPTu( A:Mang20; N: Integer);</b>


Var i :Integer;



Begin


For i:=0 to N do


Writeln( A[i] ,' ===> ', DemPtuX( A, N, A[i] ) );
End;


<b>Source code chương trình chính:</b>


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

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;
<b>END .</b>


<b>Cải tiến: Không in ra các phần tử được lặp lại.</b>


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.



<b>Mở rộng: In ra phần tử xuất hiện ít nhất và nhiều nhất trong mảng.</b>


<b>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</b>
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
<b>Hướng dẫn:</b>


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


</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

- 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.
<b>Các hàm xây dựng:</b>


<b>{ 1. Ham tim kiem gia tri X trong mang A voi N phan tu }</b>


<b>Function TimKiem ( A:Mang20; N:Integer; X:Integer ):Boolean;</b>



Var Flag : Boolean;
i:Integer;


Begin


Flag:=False;
For i:=0 to N do
Begin


If (A[i] = x) then
Begin


Flag:=True;


Break; {Tim thay ==> Tra ve vi tri tim thay }


End;
End;


TimKiem:=Flag;
End;


<b>{ 2. Thay the phan tu X dau tien tim thay trong mang bang gia tri Y }</b>


<b>Function ThayThe(Var A:Mang20;Var N, x, y:Integer):Integer;</b>


Var i:Integer;
Begin


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

A[i] := y; { Tim thay x ==> thay the thanh y }


Break; { Cham dut qua trinh thay the}
End;


ThayThe := i;


End;


<b>{ 3. Thay the tat ca cac phan tu co gia tri X tim thay bang gia tri Y }</b>


<b>Procedure ThayTheTatCa (Var A:Mang20; Var N, x,y:Integer);</b>


Var i:Integer;
Begin


For i:=0 to N do


If(A[i] = x) then { Tim thay x ==> thay the thanh y }


A[i] := y;
End;


<b>Source code chương trình chính</b>


<b>BEGIN</b>


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 );


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

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;
<b>END.</b>


<b>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</b>
tử đó bằng tổng của chúng.


Ví dụ: A: 1 19 62 7 8 32 12


<b>Ket qua: 20 20 62 7 40 40 12</b>


<b>Procedure ThayTheBangTong(Var A:Mang20; N:Integer; X, Y:Integer);</b>


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;


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

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
<b>Hướng dẫn:</b>


<b>+ Xây dựng hàm int KtraDoiXung( A, N ) để kiểm tra tính đối xứng của mảng. Ý tưởng:</b>
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 .


<b>+ Xây dựng hàm int KtraMangTang( A, N ) để kiểm tra xem mảng A có phải là mảng</b>
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).


<b>+ Xây dựng hàm Function SxepMangTang( A, N ) để sắp xếp mảng A thành mảng tăng</b>
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à A[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.


<b>Các hàm xây dựng:</b>


<b>{ 1. Ham kiem tra mang doi xung }</b>


<b>Function KtraDoiXung (A:Mang20; N:Integer ) : Boolean;</b>


Var Flag:Boolean;
i :Integer;
Begin


</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

If(A[i] <> A[N-i +1]) Then


Flag :=False; { Cham dut kiem tra, ket qua qua trinh : khong doi xung }
KtraDoiXung :=Flag;


End;



<b>{ 2. Ham kiem tra mang tang }</b>


<b>Function KtraMangTang ( A:Mang20; N :Integer) : Boolean;</b>


Var Flag : Boolean;
i :Integer;


Begin


Flag := True;
For i :=1 to N do


If(A[i] < A[i-1]) Then


Flag :=False; { Cham dut kiem tra, ket qua qua trinh : khong tang }
KtraMangTang :=Flag;


End;


<b>{ 3. Thu tuc sap xep mang tang }</b>


<b>Function SxepMangTang (A:Mang20; N:Integer ):Integer;</b>


Var i ,j,k :Integer;
Begin


For i :=1 to N do


For j :=1 to N do



If ( (i<j) and (A[i] > A[j]) ) then
Begin


k := A[i]; { Tien hanh hoan doi gia tri A[i], A[j] }


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

A[j] := k;
End;


End;


<b>Source code chương trình chính:</b>


<b>BEGIN</b>


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;
<b>END .</b>


</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

+ Kiểm tra mảng A chỉ chứa toàn những số nguyên tố?
<b>+ Kiểm tra mảng giảm dần, Sắp xếp mảng giảm dần.</b>


+ 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.
<b>Function SxepDuongTangAmGiam ( A[]:Mang20, N:Integer );</b>


Var i ,j ,k:Integer;
Begin


For i:=1 to N do
For j:=1 to N do


If ( ( (i<j)and (A[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


<b>Function KtraMangCapSoCong (A:Mang20; N:Integer; k:Integer):Boolean;</b>


Var flag :boolean;


i :Integer;
Begin


for i:=1 to N do


if(A[i] < > A[i-1] + k) then


</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>

KtraMangCapSoCong:=flag; {Ket qua kiem tra la mang cap so cong}
End;


<b>Bài toá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</b>
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ả xoá: 12 2 20 6 5 17
<b>Hướng dẫn:</b>


- 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 xoá một phần tử ở vị trí k trên mảng A (có N phần tử). Ý tưởng
thuật toá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 .


<b>Nội dung các thủ tục chính xây dựng:</b>


<b>{ 1. Thu tuc chen phan tu }</b>


<b>Procedure ChenPhanTu( A:Mang20;Var N : Integer; k, X:Integer);</b>



</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

Begin


For i:=N downto k+ 1 do
A[i] := A[i-1];


A[k] := X;


N:=N+1;
End;


<b>{ 2. Thu tuc xoa phantu }</b>


<b>Procedure XoaPhanTu( A:Mang20; Var N ,k:Integer);</b>


Var i :Integer;
Begin


For i:=k to N-1 do
A[i] := A[i+1];


N:=N-1;
End;


<b>Source code chương trình chính:</b>


<b>BEGIN</b>


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);


Write('Vi tri k,h:'); Readln(k,h);
Writeln('Ket qua chen vao la:');
ChenPhanTu(A, N, k, x);
XuatMang1C(A, N);


</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

XoaPhanTu(A, N, h);
XuatMang1C(A, N);
Readln;


<b>END</b>


<b>Một số bài tập lập trình Pascal</b>


Created by NgoHung
<b>Vấn đề 2: Chương trình con: Thủ tục và Hàm</b>


<b>Bài tố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 </b>
việc xây dựng hàm chuyển đổi.


<b>Hướng dẫn:</b>


- 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)


</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

<b>Program Doi_Co_So;</b>


Uses crt;
Var N:integer;


<b>{ 1. Thu tuc chuyen so tu nhien n cho truoc sang ket qua tra ve he co so 2 }</b>


<b>Function Dec2Bin ( n:integer ):integer;</b>
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;


<b>{ 2. Than chuong trinh chinh dap ung yeu cau bai toan }</b>


<b>BEGIN</b>


clrscr;


write( 'Nhap so N =' ); readln(N );


writeln(' Dang nhi phan cua N la ', Dec2Bin(N) );
readln;


</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

<b>Bài toán số 2.2: Viết các hàm USCLN(a, b) và BSCNN(a, b).</b>


<b>Hướng dẫn: Khai báo hàm USCLN có:</b>


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.
<b>Nội dung hàm:</b>


<b>Function USCLN( a, b : Integer) : Integer;</b>


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)}


<b>Function BSCNN( a, b : Integer) : Integer;</b>



Var k :integer;
Begin


For k := a to a*b do { Lap voi moi i co gia tri tu a den 1}


</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>

Break; { break de thoat, luu giu lai gia tri cua k.}
BSCNN:= k;


End;


<b>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?</b>


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.
<b>Nội dung hàm:</b>


<b>Function KiemtraSNT( N : Integer ) : Boolean;</b>


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;


<b>Cải tiến, không sử dụng biến phụ:</b>


</div>
<span class='text_page_counter'>(22)</span><div class='page_container' data-page=22>

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>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:</b>


- 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 hồn thiện chương trình chính.


<b>Chương trình</b>


<b>Program Tam_Giac;</b>


Uses crt;


Var a,b,c : Integer;


<b>{ 1. Thu tuc nhap}</b>


<b>Procedure NhapABC (Var a, b, c : Integer);</b>


Begin


</div>
<span class='text_page_counter'>(23)</span><div class='page_container' data-page=23>

Write( 'Nhap c:' ); Readln( c );
End;


<b>{ 2. Ham tinh dien tich}</b>


<b>Function Dientich( a, b, c:Integer ) : Real;</b>


Var dt,p : Real;
Begin


p := (a+b+c)/2;



dt := sqrt(p* (p-a)*(p-b)*(p-c));
Dientich := dt;


End;


<b>{ 3. Thu tuc kiem tra va In kqua tinh dien tich (neu la tam giac) }</b>


<b>Procedure KiemTra_InDienTich ( a,b,c:Integer);</b>


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;


<b>{ 3. Than chuong trinh chinh }</b>


<b>BEGIN</b>


NhapABC(a,b,c);


</div>
<span class='text_page_counter'>(24)</span><div class='page_container' data-page=24>

<b>END.</b>


<b>Bài toán số 2.5: Viết chương trình hồn chỉnh thực hiện phân tích ra N ra thành các thừa số </b>
nguyên tố.



Ví dụ: N = 1260 = 2 . 2 . 3 . 3 . 5 . 7


<b>Hướng dẫn:</b>


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


<b>Chương trình:</b>


<b>Program Phan_Tich_Thua_So;</b>


Uses crt;


Var N : integer;
<b>{ 1. Thu tuc nhap so N. }</b>


<b> Procedure NhapSoN( var NN : Integer );</b>


Begin


</div>
<span class='text_page_counter'>(25)</span><div class='page_container' data-page=25>

While ( N = 0 ) do
Begin


Write( 'Nhap N=' ); Readln(NN );
End;


End;


<b> { 2. Thu tuc phan tich N ra thanh cac thua so nguyen to }</b>


<b> Procedure PhantichSoN ( Var N1 : Integer );</b>


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' );


</div>
<span class='text_page_counter'>(26)</span><div class='page_container' data-page=26>

<b>{ 3. Than chuong trinh chinh }</b>


<b> BEGIN</b>


Clrscr;


Writeln('Phan tich so N thanh tich cua cac so nguyen to :' );


NhapSoN( N );
PhantichSoN( N );


Writeln ('Nhan Enter de ket thuc ...' );
Readln;



<b>END</b>


<b>Một số bài tập lập trình Pascal</b>


Created by NgoHung
<b>Vấn đề 4: Mảng 2 chiều</b>


<b>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:</b>


<b>+ Nhập xuất mảng 2 chiều.</b>


+ Đế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.
<b>Hướng dẫn:</b>


+ Khai báo kiểu dữ liệu mảng 2 chiều.


Type Mang2C = Array[1..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.


</div>
<span class='text_page_counter'>(27)</span><div class='page_container' data-page=27>

+ 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ử A[i,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ị A[i,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.


<b>Source code chương trình</b>
PROGRAM Mang_2C;
Uses CRT;


Type Mang2C = Array[1..10, 1..10] of Real;
Var A: Array2C;


N, M: Integer;


<b>{ 1. Thu tục nhap mang 2 chieu }</b>


<b>Procedure NhapMang2C( Var A : Mang2C; Var M,N : Integer);</b>


Var i, j: Integer;
Begin


Repeat


Write(‘Nhap so hang N, so cot M: ‘);
Readln(N, M);


Until ( N>0 ) and ( N<11 ) and ( M>0 ) and ( M<11 );
For i:=1 to M do


For j:=1 to N do
Begin


Write(‘Nhập A[‘, i, ‘,’, j , ‘]: ‘);


Readln(A[i,j]);


End;


End;


<b>{ 2. Thu tục xuat mang 2 chieu }</b>


<b>Procedure XuatMang2C( A : Mang2C; M,N : Integer);</b>


Var i, j: Integer;
Begin


For i:=1 to M do
Begin


For j:=1 to N do


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


End;


End;


<b>{ 3. Ham dem so phan tu 0 co trong mang 2 chieu }</b>


</div>
<span class='text_page_counter'>(28)</span><div class='page_container' data-page=28>

Var i, j, Dem: Integer;
Begin



Dem := 0;
For i:=1 to M do


For j:=1 to N do


If (A[i, j] = 0) Then inc(Dem);
DemPtu0 := Dem;


End;


<b>{ 4. Ham tim gia tri Max trong mang 2 chieu }</b>


<b>Function TimPtuMax( A : Mang2C; M,N : Integer) : Real;</b>


Var i, j: Integer;
Max : Real;
Begin


Max := A[1, 1];
For i:=1 to M do


For j:=1 to N do


If (A[i, j] > Max) Then Max := A[i,j];
TimPtuMax : = Max;


End;


<b>{ 5. Than chuong trinh chinh }</b>



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>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:</b>


</div>
<span class='text_page_counter'>(29)</span><div class='page_container' data-page=29>

+ 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.


<b>Hướng dẫn:</b>


+ Đố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.
<b>Source code các hàm xây dựng</b>


<b>{ 1. Thu tuc tinh & in tong cac phan tu tren dong cua mang 2 chieu }</b>


<b>Procedure TongCacDong( A : Mang2C; M,N : Integer);</b>


Var i, j: Integer;
S : Real;


Begin


For i:=1 to M do
Begin


S := 0;


For j :=1 to N do
S := S + A[i, j];
Writeln( ‘Tong dong ‘, i ,’ la ‘, S);
End;


End;


<b>{ 2. Thu tuc tim tong lon nhat cua cac phan tu tren dong cua mang 2 chieu }</b>


<b>Function MaxTgDong(A:Mang2C; M,N:Integer) : Real;</b>


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 + A[i, j];
If (S > Value) Then



Begin


Value := S;
K := i;
End;
End;


</div>
<span class='text_page_counter'>(30)</span><div class='page_container' data-page=30>

<b>{ 3. Than chuong trinh chinh }</b>


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>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:</b>


<b>+ Nhập xuất ma trận vuông.</b>


+ 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 vng qua dường chéo chính.


<b>Hướng dẫn:</b>


+ Ma trận vng 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] ).


<b>Source code các hàm xây dựng</b>


Quá trinh định nghĩa dữ liệu mảng có thể sử dụng lại bài 4.1.


<b>{ 1. Thu tục nhap mang 2 chieu }</b>


</div>
<span class='text_page_counter'>(31)</span><div class='page_container' data-page=31>

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;


<b>{ 2. Thu tục xuat mang 2 chieu }</b>


<b>Procedure XuatMtran( A : Mang2C; N : Integer);</b>


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;


<b>{ 3. Ham tinh tong tren duong cheo chinh cua ma tran vuong }</b>


<b>Function TongDgCheoChinh( A : Mang2C; N : Integer) : Real;</b>


Var i, j: Integer;


S : Real;
Begin


S := 0;


For i:=1 to N do


S := S + A[i, i];
TongDgCheoChinh := S;
End;


<b>{ 3. Ham kiem tra tinh doi xung cua ma tran vuong qua duong cheo chinh }</b>


<b>Procedure KiemtraDoixung( A : Mang2C; N : Integer);</b>


</div>
<span class='text_page_counter'>(32)</span><div class='page_container' data-page=32>

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;


<b>{ 4. Than chuong trinh chinh }</b>


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 );
<b>Writeln( ‘Tong ptu duong cheo chinh:’, TongDgCheoChinh(A, N) );</b>


<b>KiemtraDoixung ( A , N );</b>


Readln;
END.


<b>Bài tốn số 4.4: Tính tổng của hai ma trận A, B cấp NxM. Tính ma trận C là tổng của hai ma trận A và B, </b>
in ma trận C lên màn hình.


Cơng thức tính các phần tử của ma trận C= A+B:
C[i,j ] = A[i, j] + B[i, j] với i=1,..., N, và j=1,..., M


<b>Source code các hàm xây dựng</b>




<b>{ 1. Ham tinh tong hai ma tran }</b>


<b>Procedure TongHaiMtran( Var A, B, C : Mang2C; N : Integer);</b>



Var i, j: Integer;
Begin


For i:=1 to N do
For j:=1 to N do


</div>
<span class='text_page_counter'>(33)</span><div class='page_container' data-page=33>

<b>{ 2. Than chuong trinh chinh }</b>


<b>BEGIN</b>


{ 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 );
<b>TongHaiMtran( A, B, C, N);</b>


Writeln( ‘Ma tran Tong C la:’ ); XuatMang2C (B, N, N );
Readln;


<b>END.</b>


<b>Mở rộng:</b>


+ Sử dụng tương tự để làm các phép tốn cịn lại trên ma trận: Ma trận chuyển vị, tích hai ma trận.
+ Tính định thức của ma trận.



<b>Một số bài tập lập trình Pascal</b>


Created by NgoHung
<b>Vấn đề 1: Cấu trúc điều khiển</b>


<b>Bài tốn số 1.1: Tính tổng của các số tự nhiên từ 1 đến N.</b>


S = 1 + 2 + … + N


Ví dụ : N = 5, S = 1 + 2 + 3 + 4 + 5 = 15
Yêu cầu: Input: N, là số tự nhiên bất kỳ.


</div>
<span class='text_page_counter'>(34)</span><div class='page_container' data-page=34>

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 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 các giá trị của i vào S (với i
được lặp từ 1 cho đến N)


- Xuất kết quả của tổng S ra màn 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:’ ); // Thong bao nhap lieu


Readln( n ); // 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 do // Lap voi moi i co gia tri tu 1 den N
S:=S + i; // Tinh tong cong don i vao S
Writeln( ‘Tong = ’, S); // Xuat ket qua tong S ra man hinh
Readln;


END.


<b>Các phiên bản khác nhau của bài toán là:</b>


 Tính tổng (với giả sử N là số lẻ)


 Tính tổng các số tự nhiên lẻ nhỏ hơn hoặc bằng N.


</div>
<span class='text_page_counter'>(35)</span><div class='page_container' data-page=35>



Hướng dẫn: - Điều chỉnh bước lặp cho phù hợp.


- Trước khi cộng dồn giá trị của i vào tổng S, phải kiểm tra điều kiện giá trị của i có thỏa mãn điều
kiện bài tốn hay khơng.



Cụ thể là:


 For i:= 1 to n do // Lap voi moi i co gia tri tu 1 den N
S:= S + i / (i+1); // Tinh tong cong don i/(i+1) vao S


(Luu y, truong hop nay bien S phai duoc khai bao kieu du lieu la so thuc Real )


 For i:=1 to n do // Lap voi moi i co gia tri tu 1 den N
if ( i mod 2 == 1) // Kiem tra i co’ phai la so le hay khong


S := S + i; // Dung ==> 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>Bài toán số 1.2: Kiểm tra số N có phải là số ngun tố hay khơng.</b>


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
<b>Yêu cầu: Input: N, là số tự nhiên bất kỳ.</b>


Output: Trả lời “N la so nguyen to”


hoặc “N khong phai la so nguyen to” tùy theo N.
<b>Lưu ý: Số nguyên tố là số chỉ có thể chia hết cho 1 và chính nó ( N ).</b>


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 (N-1).



<b>Hướng dẫn:</b>


Bài toán được thực hiện qua 3 bước cụ thể như sau:


</div>
<span class='text_page_counter'>(36)</span><div class='page_container' data-page=36>

- 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


<b>Chương trình:</b>


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>Bài tốn số 1.3: Tìm USCLN(a, b) va BSCNN(a, b)</b>


Ví dụ: USCLN(18, 24) = 6 và BSCNN(18, 24) = 72
<b>Yêu cầu: Input: a, b là 2 số tự nhiên.</b>


Output: USCLN và BSCNN của a và b


<b>Một số lưu ý:</b>


</div>
<span class='text_page_counter'>(37)</span><div class='page_container' data-page=37>

- 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)


<b>Hướng dẫn:</b>


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.
<b>Chương trình:</b>


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 d/c bien a,)
Write(‘Nhap vao so b:’); // Thong bao nhap lieu


Readln(b); // Nhap gtri b (voi &b, la lay d/c bien b,)


For i:=a downto 1 do


</div>
<span class='text_page_counter'>(38)</span><div class='page_container' data-page=38>

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>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ó.</b>


Ví dụ: N = 1682 Tong cac chu so cua N la: 17 ( = 1 + 6 + 8 + 2 )
<b>Yêu cầu: Input: N là số nguyên bất kỳ, N có khả năng là số lớn</b>


Output: S, la tổng các chữ số của N
<b>Hướng dẫn:</b>


- 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
<b>Chương trình:</b>


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



</div>
<span class='text_page_counter'>(39)</span><div class='page_container' data-page=39>

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>Bài toán số 1.5: Cho 14/03/2003 là một ngày trong năm. Hãy xác định xem thử ngày này là này </b>
thứ bao nhiêu của năm đó.


Ví dụ: Ngày nhập vào 14/03/2003, Kết quả: Ngay thu 73 cua nam 2003
<b>Yêu cầu : - Input: 3 số ngay, thang, nam</b>


- Output: So thu tu cua ngay


<b>Hướng dẫn:</b>


- 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 tố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


</div>
<span class='text_page_counter'>(40)</span><div class='page_container' data-page=40>

+ Khởi gán stt = 0


<i><b>+ Lặp cộng dồn số ngày của các tháng mà nhỏ hơn thang</b></i>
- 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ả


<b>Chương trình:</b>


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;


</div>
<span class='text_page_counter'>(41)</span><div class='page_container' data-page=41>

<b>Bài tố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.</b>


Ví dụ: Nhập stt = 84 thì kết quả là 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 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 q trình trên cho đến khi stt nhỏ hơn hoặc bằng số ngày trong tháng


<b>Một số bài tập lập trình Pascal</b>


Created by NgoHung


<b>Vấn đề 5: Kiểu dữ liệu có cấu trúc</b>


<b>Bài tố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 </b>
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.
<b>Hướng dẫn:</b>


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


</div>
<span class='text_page_counter'>(42)</span><div class='page_container' data-page=42>

<b>{ 1. Khai bao cac kieu du lieu va bien can thiet }</b>
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;
<b>{ 2. Thu tuc nhap 3 diem A, B, C}</b>


<b>Procedure NhapABC( Var A, B, C: KDIEM);</b>
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;


<b>{ 3. Thu tuc nhap du lieu cho danh sach diem }</b>


<b>Procedure NhapDSDiem( Var dsdiem : KDSDIEM; Var N:Integer);</b>
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(dsdiem[i].X, dsdiem[i].Y);
End;


End;


<b>{ 4. Ham tinh khoang cach giua 2 diem A, B }</b>
<b>Function KhoangCach( A, B: KDIEM) : Real;</b>


Begin


KhoangCach := Sqrt( Sqr(A.X-B.X) + Sqr(A.Y-B.Y) );
End;


<b>{ 5. Ham tinh dien tich tam giac A, B, C }</b>


<b>Function DienTichABC( A, B, C: KDIEM) : Real;</b>
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;


<b>{ 6. Xac dinh diem gan M nhat trong danh sach n diem }</b>


<b>Function DiemGanMnhat(ds : KDSDIEM; n:Integer;M:KDIEM): KDIEM;</b>
Var kcMin, kc: Real;


</div>
<span class='text_page_counter'>(43)</span><div class='page_container' data-page=43>

Begin


KcMin := KhoangCach(M, ds[1]);
For i:=1 to N do


Begin


Kc := KhoangCach(M, ds[i]);
If (kc >= kcMin) Then
Begin


KcMin := Kc;
X := ds[i];
End;


DiemGanMnhat := X;
End;


<b>{ Chương trình chính; }</b>


<b>BEGIN</b>


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;


<b>END.</b>


<b>Bài tố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 </b>
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 tốn = Max, Điểm bình qn
mơn tốn của cả danh sách?


<b>Hướng dẫn:</b>


- 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à dssv[i].DTB và dssv[j].DTB.


</div>
<span class='text_page_counter'>(44)</span><div class='page_container' data-page=44>

<b>Source code chương trình:</b>


<b>{ 1. Khai bao cac kieu du lieu va bien can thiet }</b>
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;


<b>{ 2. Thu tuc nhap du lieu cho danh sach sinh vien }</b>


<b>Procedure NhapDSSV( Var dssv : KDSSVIEN; Var N:Integer);</b>
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 dssv[i] 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;



<b>{ 3. Thu tuc sap xep danh sach sinh vien tang dan theo diem trung binh }</b>
<b>Procedure SapXepDSSV( Var dssv : KDSSVIEN; N : Integer);</b>


Var i, j : Integer;
Z : KSVIEN;
Begin


For i:=1 to N-1 do


For j:=i+1 to N do


If dssv[i].DTB < dssv[j].DTB Then
Begin


Z:= dssv [i];
dssv[i]:= dssv[j];
dssv[j]:=Z;
End;


</div>
<span class='text_page_counter'>(45)</span><div class='page_container' data-page=45>

<b>{ 4. Thu tuc in danh sach sinh vien }</b>


<b>Procedure InDSSV( Var dssv : KDSSVIEN; N : Integer);</b>
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 do


With dssv[i] do


Writeln(i:2, #32, Hoten, #32:19-Length(Hoten),
Maso:8, Toan:4:1, Ly:4:1, DTB:4:1, Loai:5);
End;


<b>{ 5. Cac bai toan nho lien quan danh sach sinh vien }</b>


<b>Procedure CacBaiToan (dssv : KDSSVIEN; N : Integer);</b>
Var i , Dem: Integer;


TBToan, Max: Real;
Begin


{ Tim diem toan cao nhat}
Max:=dssv[1].Toan;


For i:=1 to N do


if Max< dssv[i].Toan then
Max:=dssv[i].Toan;
Writeln( ‘Diem Toan cao nhat =’, Max:4:1);


<i>{ Dem so sv co diem Toan =Max}</i>
Dem:=0;



For i:=1 to N do


if dssv[i].Toan =Max then
Dem := Dem+1;


Writeln(‘Co ‘, Dem, ‘em co diem Toan = ‘, Max:4:1);
<i> { Tinh diem binh quan mon Toan cua ca danh sach }</i>
TBToan:=0;


For i:=1 to N do


TBToan := TBToan + dssv[i].Toan;
TBToan:=TBToan/N;


Writeln(‘Diem binh quan mon Toan= ‘, TBToan:6:2);
End;


<b>{ Chương trình chính; }</b>
<b>BEGIN</b>


Clrscr;


NhapDSSV( ds, N );
SapXepDSSV( ds, N );
InDSSV( ds, N );
CacBaiToan( ds, N );


Readln;
<b>END.</b>



<b>Bài tố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 </b>
phần Ngay, Thang, Nam, Gio, Phut, Giay):


</div>
<span class='text_page_counter'>(46)</span><div class='page_container' data-page=46></div>

<!--links-->
thuat toan ve mang 1 chieu
  • 39
  • 1
  • 16
  • ×