Professional Documents
Culture Documents
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
Created by NgoHung
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
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 N-1) và nhập cho các giá trị A i 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.
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 Readln( ) trước khi kết thúc để dừng lại xem kết quả.
Chương trình:
Program Mang1C;
Uses crt;
Var N:Integer;
A:Mang20;
Var i: Integer;
Begin
For i:=0 to N do
Begin
End;
End;
Var i:Integer;
Begin
For i :=0 to N do
Write( A[i]:2 );
Writeln;
End;
Var i :Integer;
S :longint;
Begin
S := 0;
For i:=0 to N do
S := S + A[i] ;
TongMang1C:=S;
End;
BEGIN
NhapMang1C( A, N );
XuatMang1C( A, N );
Readln;
END.
Begin
S:=0;
For i:=0 to N do
S := S+A[i];
TongSoChiaHet5:= S;
End;
Var i:Integer;
Begin
return 0
Else
return 1;
End;
Var S,i:Integer;
Begin
S:=0;
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
1 ==> 4 5 ==> 3
6 ==> 1 7 ==> 1
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:
- 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
o Đối với mỗi phần tử A[i], nếu A[i] = 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.
Begin
Count := 0;
For i:=0 to N do
If ( A[i] = X ) then
Count := Count + 1;
DemPtuX := Count;
End;
{ 2. Dem so lan xuat hien cua tat ca cac phan tu trong mang }
Var i :Integer;
Begin
For i:=0 to N do
End;
BEGIN
Clrscr;
NhapMang1C( A, N );
XuatMang1C( A, N );
InSoLanXHcuaPTu ( A, N );
Readln;
END .
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à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
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 N-1 để kiểm tra tất cả các giá trị A i, 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 A i 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 A i, nếu Ai bằng x thì tiến hành gán
thành y.
i:Integer;
Begin
Flag:=False;
For i:=0 to N do
Begin
If (A[i] = x) then
Begin
Flag:=True;
End;
End;
TimKiem:=Flag;
End;
{ 2. Thay the phan tu X dau tien tim thay trong mang bang gia tri Y }
Var i:Integer;
Begin
For i:=0 to N do
If (A[i] = x) then
Begin
A[i] := y; { Tim thay x ==> thay the thanh y }
End;
ThayThe := i;
End;
{ 3. Thay the tat ca cac phan tu co gia tri X tim thay bang gia tri Y }
Var i:Integer;
Begin
For i:=0 to N do
A[i] := y;
End;
BEGIN
If (TimKiem(A,N,x)) then
Else
XuatMang1C(A, N);
ThayTheTatCa(A, N, 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
Var i,k:Integer;
Begin
For i:=0 to N do
Begin
k := (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 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
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à A[i] > A[j] 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.
Var Flag:Boolean;
i :Integer;
Begin
Flag:=True;
For i :=1 to N do
If(A[i] <> A[N-i +1]) Then
Flag :=False; { Cham dut kiem tra, ket qua qua trinh : khong doi xung }
KtraDoiXung :=Flag;
End;
i :Integer;
Begin
Flag := True;
For i :=1 to N do
Flag :=False; { Cham dut kiem tra, ket qua qua trinh : khong tang }
KtraMangTang :=Flag;
End;
Begin
For i :=1 to N do
For j :=1 to N do
Begin
End;
End;
BEGIN
Clrscr;
Else
Else
Begin
SxepMangTang( A, N );
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.
Var i ,j ,k:Integer;
Begin
For i:=1 to N do
For j:=1 to N do
((i<j) and ( A[i] < A[j] ) and ( A[i]<0) and ( A[j]<0))) then
Begin
A[j] := k;
End;
End;
Ví dụ: 1 6 11 16 21 26 31
i :Integer;
Begin
for i:=1 to N do
End;
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
tử. Xoá 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
Hướng dẫn:
- 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 toá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.
+ 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 .
Var i :Integer;
Begin
A[i] := A[i-1];
A[k] := X;
N:=N+1;
End;
Var i :Integer;
Begin
A[i] := A[i+1];
N:=N-1;
End;
BEGIN
ChenPhanTu(A, N, k, x);
XuatMang1C(A, N);
XuatMang1C(A, N);
Readln;
END
Created by NgoHung
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
N = N chia cho 2.
- 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 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)
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 }
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;
readln;
END.
Bài toán số 2.2: Viết các hàm USCLN(a, b) và BSCNN(a, b).
Giá trị trả về: chính là giá trị ước số chung lớn nhất của a và b.
Var Sodu:integer;
Begin
While (b <> 0) do
Begin
Sodu:= a mod b;
a := b;
b := Sodu;
End;
USCLN := a;
End;
Var k :integer;
Begin
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?
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ố )
i : Integer;
Begin
If ( N mod i = 0 ) then { Kiem tra xem N co’ chia het cho i hay
khong}
KiemtraSNT:=flag;
End;
Begin
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
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 kiểm tra xem ba số trên có lập thành ba cạnh của tam giác hay không ?
Chương trình
Program Tam_Giac;
Uses crt;
Begin
End;
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) }
Begin
Else
End;
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 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 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;
Begin
NN := 0; {Gan khoi dau bang 0 de vao vong lap, vong lap dung khi nhap khac 0}
While ( N = 0 ) do
Begin
End;
End;
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
End;
{ 3. Than chuong trinh chinh }
BEGIN
Clrscr;
NhapSoN( N );
PhantichSoN( N );
Readln;
END
Created by NgoHung
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:
+ Tìm giá trị lớn nhất trong mảng 2 chiều đã nhập vào.
Hướng dẫn:
+ 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ử A[i,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ị A[i,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ử 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.
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;
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;
DemPtu0 := Dem;
End;
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;
BEGIN
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.
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.
{ 1. Thu tuc tinh & in tong cac phan tu tren dong cua mang 2 chieu }
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;
{ 2. Thu tuc tim tong lon nhat cua cac phan tu tren dong cua mang 2 chieu }
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;
MaxTgDong := Value;
End;
BEGIN
{ Nhung ham nhap xuat da de cap o Bai so 4.1, xem chi tiet o tren }
TongCacDong( 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:
+ 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.
Quá trinh định nghĩa dữ liệu mảng có thể sử dụng lại bài 4.1.
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;
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 }
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 }
BEGIN
{ Nhung ham nhap xuat da de cap o Bai so 4.1, xem chi tiet o tren }
KiemtraDoixung ( A , N );
Readln;
END.
Bài toá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,
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
Var i, j: Integer;
Begin
For i:=1 to N do
For j:=1 to N do
C[i, j] = A[j, i] + B[j, i];
End;
BEGIN
{ Nhung ham nhap xuat da de cap o Bai so 4.1, xem chi tiet o tren }
TongHaiMtran( A, B, C, N);
Readln;
END.
Mở rộng:
+ Sử dụng tương tự để làm các phép toán còn lại trên ma trận: Ma trận chuyển vị, tích hai ma trận.
Created by NgoHung
S=1+2+…+N
Ví dụ : N = 5, S = 1 + 2 + 3 + 4 + 5 = 15
Hướng dẫn:
Bài toán được thực hiện qua 3 bước cụ thể như sau:
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)
Chương trình:
Program TinhTong;
Uses crt;
BEGIN
Readln;
END.
Tính tổng các số tự nhiên chia hết cho 5 như 5, 10, 15, 20, 25, 30….N
(N chia hết cho 5)
- 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 toán hay không.
Cụ thể là:
(Luu y, truong hop nay bien S phai duoc khai bao kieu du lieu la so thuc Real )
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).
Hướng dẫn:
Bài toán được thực hiện qua 3 bước cụ thể như sau:
- 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;
BEGIN
i := round( sqrt(n) );
If( n mod i <> 0) then // Xuat cau tra loi cuoi cung
Else
Readln;
END.
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
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:
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.
Chương trình:
Program USCLN;
Use crt;
Begin
Break;
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ó.
Hướng dẫ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
Chương trình:
Program tong;
Uses crt;
Begin
S := 0;
Begin
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 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 14/03/2003, Kết quả: Ngay thu 73 cua nam 2003
Hướng dẫn:
- 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.
- Đị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
+ Lặp cộng dồn số ngày của các tháng mà nhỏ hơn thang
Chương trình:
Program ngaythangnam;
Uses crt;
Begin
stt := 0;
For i := 1 to thang do // Lap voi cac i nho hon thang da nhap vao)
case thang of
Else
end;
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.
- 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 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
Created by NgoHung
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.
For i:=1 to N do
Begin
Write(‘Toa do X, Y:’); Readln(dsdiem[i].X, dsdiem[i].Y);
End;
End;
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) :
+ 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à dssv[i].DTB và 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ớ của các biến.
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;
{ 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 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;
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:=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);
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.