Bài tập và thực hành 3
1. Mục đích, yêu cầu
- Nâng cao kĩ năng sử dụng một số câu lệnh và một số kiểu dữ liệu thông qua việc tìm hiểu, chạy thử các chương trình có sẵn;
- Biết giải một số bài toán tính toán, tìm kiếm đơn giản trên máy tính.
2. Nội dung
Bài 1.
Tạo mảng A gồm n (n \(\leq\) 100) số nguyên, mỗi số có trị tuyệt đối không vượt quá 300. Tính tổng các phần tử của mảng là bội số của một số nguyên dương k cho trước.
a) Hãy tìm hiểu và chạy thử chương trình sau đây:
program Sum1;
uses crt;
const nmax=100;
type MyArray=array[1..nmax] of integer;
var A: MyArray;
s,n,i,k: integer;
begin
clrscr;
randomize;
write('Nhap n =');
readln(n); {Tao ngau nhien mang gom n so nguyen}
for i:= 1 to n do
A[i]:= random(301)- random(301);
for i:= 1 to n do
write(A[i]:5); {in ra mang vua tao}
writeln;
write('Nhap k = ');
readln(k);
s:=0;
for i:=1 to n do
if A[i] mod k = 0 then s:=s+A[i];
writeln('Tong can tinh la: ',s);
readln
end.
Chú ý:
Hàm chuẩn random(n) cho giá trị là số nguyên ngẫu nhiên trong khoảng từ 0 đến n - 1, còn thủ tục randomize khởi tạo cơ chế sinh số ngẫu nhiên.
Gợi ý làm bài:
Sau khi nhập chương trình và cho chương trình chạy và nhập dữ liệu, ta có kết quả như hình 1 dưới đây:
Hình 1.
Trong hình ở trên, số phần tử cần nhập vào là 50. Khi đó, mảng được tạo ra một cách ngẫu nhiên gồm 50 số nguyên có giá trị tuyệt đối không vượt quá 300. Tiếp đến ta nhập vào số k = 9. Ta nhận thấy ràng, trong 50 số được tạo ra thì chỉ các số 45 và 99 là chia hết cho 9 và tổng của chúng bằng 144.
Tương tự như trên, nếu ta nhập n= 99, k= 10 thì kết quả cho như ở hình 2 dưới đây:
Hình 2.
Chúng ta cũng dễ dàng nhận ra rằng, các sổ: -10, -110, -30, 40 và -30 là bội cùa 10 và tổng của chúng bằng -140.
b) Hãy đưa các câu lệnh sau đây vào những vị trí cần thiết nhằm sửa đổi chương trình trong câu a để có được chương trình đưa ra số các số dương và số các số âm trong mảng.
posi, neg: integer;
posi:= 0; neg:= 0;
if A[i]>0 then posi:= posi+1
else if A[i]<0 then neg:= neg+1;
writeln(posi:4,neg:4);
Gợi ý làm bài:
Chương trình để in ra số các số dương và số các số âm trong mảng A như sau:
program Sum1;
uses crt,
const nmax=100;
type Myarray= array[1..nmax] of integer;
var A: MyArray;
n, i: integer; posi, neg: integer;
Begin
clrscr; randomize;
write('Nhap n=') ;
readln(n); {Tao ngau nhien mang gom n so nguyen}
for i:=1 to n
do A[i]:=random(300)-random(300);
for i:= 1 to n do
write(A[i]:5); {in ra mang vua tao}
writeln;
posi:= 0; neg:= 0;
for i:= 1 to n do
if A[i]>0 then posi:= posi + 1 else if A[i]
readln
End.
Khi chạy chương trình, nhập số phần tử của mảng, ví dụ, n= 10 thì kết quả của chương trình sẽ như hình 3 sau đây:
Hình 3. Kết quả chương trình in ra số các số dương và số các số âm trong mảng A
và kết quả như ở hình 3 ở trên thì người sử dụng nhiều khi rất khó nhìn thấy số các số dương và số các số âm. Bời vậy, chúng ta cần đưa vào lệnh in dòng chú thích:
writeln('So cac so duong la: ', posi: 4) ;
writeln( 'So cac so am la: ', neg: 4);
Khi đó, chương trình in ra số các số dương và số các số âm trong mảng A là:
program Sum1b2;
uses crt;
const nmax= 100;
type Myarray- array[1..Nmax] of integer;
var A: MyArray;
n, i: integer;
posi, neg: integer;
Begin
clrscr; randomize;
write ( ’ Nhap n=' );
readln(n); {Tao ngau nhien mang gom n so nguyen}
for i:=1 to n do
A [ i ]: =random (301) -random (301);
for i:=1 to n do (A[i] : 5); {in ra mang vua tao}
writeln;
posi:= 0; neg:= 0; or i:= 1 to n do
if A[i]>0 then posi:= posi + 1
else if A[i]' , posi:4);
writeln('So cac so am la : ', neg:4);
readln
End.
Khi chạy chương trình, nhập số phần tử của mảng, ví dụ, n= 50 thì chương trình sẽ đưa ra thông báo: So cac so duong la: 24 So cac so am la: 26
Kết quả của chương trình sẽ như hình 4 dưới đây:
Hình 4. Kết quả chương trình in ra số các số dương và số các số âm trong mảng A
Bài 2.
Viết chương trình tìm phần tử có giá trị lớn nhất của mảng và đưa ra màn hình chỉ số và giá trị của phần tử tìm được. Nếu có nhiều phần tử có cùng giá trị lớn nhất thì đưa ra phần tử có chỉ số nhỏ nhất.
a) Hãy tìm hiểu chương trình sau đây:
program MaxElement;
const Nmax= 100;
type MyArray = array[1..Nmax] of integer;
var A: MyArray;
n,i,j: integer;
begin
write('Nhap so luong phan tu cua day so, N = '); readln(N);
for i:=1 to N do
begin
write('Phan tu thu ',i,' = ');
readln(A[i]);
end;
j:= 1;
for i:= 2 to n do if A[i] > A[j] then j:= i;
write ('Chi so: ',j, ' Gia tri: ',A[j]:4);
readln
end.
b) Chỉnh sửa chương trình trên để đưa ra chỉ số của các phần tử có cùng giá trị lớn nhất.
Gợi ý làm bài:
Sau khi nhập chương trình và cho chương trình chạy và nhập số lượng phần tử của dãy số với n= 10 với giá trị các phần tử như sau:
Phần tử thứ nhất= 5;
Phần tử thứ hai= 9;
Phần tử thứ ba= 4;
Phần tử thứ tư= 8;
Phần tử thứ năm= 6;
Phần tử thứ sáu= 2;
Phần tử thứ bảy= 7;
Phần tử thứ tám= 1;
Phần tử thứ chín= 3;
Phần tử thứ mười= 8;
thì chương trình in ra thông báo: 'Chi so: 2 Gia tri: 9 ' nghĩa là phần tử ở chỉ số 2 có giá trị 9 là phần tử lớn nhất mảng. Khi đó, ta có kết quả như hình 5 dưới đây:
Hình 5.
Nhưng khi nhập các phần tử vào mảng mà có nhiều phần tử có cùng giá trị lớn nhất thì kết quả của chương trình số in ra chỉ số nhỏ nhất cùa phần tử lớn nhất. Chẳng hạn, nhập vào 9 phần tử với giá trị các phần tử được nhập vào mảng như sau:
Phần tử thứ nhất= 9;
Phần tử thứ hai= 5;
Phần tử thứ ba= 4;
Phần tử thứ tư= 9;
Phần tử thứ năm= 3;
Phần từ thứ sáu= 9;
Phần tử thứ bảy= 9;
Phần tử thứ tám= 6;
Phần tử thứ chín= 7;
Khi đó chương trình sẽ đưa ra thông báo: "Chi so: 1 Gia tri: 9" như hình 6 dưới đây:
Hình 6.
Với kết quả của chương trình hiện ra như ở hình 6 thì chỉ số nhỏ nhất của phần tử lớn nhất bằng 9) là 1.
Lưu ý: Trong chương trình chúng ta nên đưa vào khai báo chuẩn uses crt; và lệnh xóa màn hình clrscr; để mỗi lần chạy chương trình các kết quả trước đó bị xóa:
Khi đó chương trình sẽ là:
Program MaxElement;
uses crt;
const Nmax= 100;
type Myarray = array[1ắ.Nmax] of integer;
var i: MyArray;
r, i, j: integer;
Begin
Clrscr ;
wiite('Nhap so luong phan tu cua day so, N= ');
readln(N);
for i:= 1 to N do
begin
write('Phan tu thu ', i,'=');
readln(A[i]);
end;
j : = 1 ;
for i:= 1 to n do if A[i]>A[j] then j:= i;
write('Chi so: ',j,'Gia tri: ',A[j]: 4);
readln
End.
b) Chỉnh sửa chương trình để đưa ra chỉ số của các phần tử có cùng giá trị lớn nhất, bằng cách ta đưa vào chương trình biến mảng dem. Chương trình như sau:
Program MaxElement.2 ;
const Nmax= 100;
type Myarray = array[1..Nmax] of integer;
var A: Myarray;
dem: array[1..Nmax] of integer;
n, k, i, j: integer;
Begin
write('Nhap so luong phan tu cua day so, N= ' );
readln(N); for ỉ:= 1 to n do
begin
write('Phan tu thu i ,' = ');
readln(A[i]); end; j : = 1; k: = 0 ;
for i:= 2 to n do if A[i] > A[j] then j:= i; dem[k]:= j;
for i:= 1 to n do if a[i] = a[j] then
begin
k: = k + 1 , dem[k]:= i;
end;
writeln('Gia tri lon nhat la: A[j]:4);
writeln('Chi so ung voi gia tri lon nhat la: '));
for i:= 1 to k do write('dem[i]);
writeln;
readln;
End.
Khi cho chương trình chạy và nhập số lượng phần tử của dãy số với n= 5. Giả sử, giá trị các phần tử được nhập vào như sau:
Phần tử thứ nhất= 4;
Phần tử thứ hai= 7;
Phần tử thứ ba= 9;
Phần tử thứ tư= 5;
Phần tử thứ năm= 9;
Khi đó chương trình sẽ đưa ra thông báo:
Gia tri lon nhat la: 9 Chi so ung voi gia tri lon nhat la:
3 5
Kết quả của chương trình như hình 7 dưới đây:
Hình 7.
1. Mục đích, yêu cầu
- Nâng cao kĩ năng sử dụng một số câu lệnh và một số kiểu dữ liệu thông qua việc tìm hiểu, chạy thử các chương trình có sẵn;
- Biết giải một số bài toán tính toán, tìm kiếm đơn giản trên máy tính.
2. Nội dung
Bài 1.
Tạo mảng A gồm n (n \(\leq\) 100) số nguyên, mỗi số có trị tuyệt đối không vượt quá 300. Tính tổng các phần tử của mảng là bội số của một số nguyên dương k cho trước.
a) Hãy tìm hiểu và chạy thử chương trình sau đây:
program Sum1;
uses crt;
const nmax=100;
type MyArray=array[1..nmax] of integer;
var A: MyArray;
s,n,i,k: integer;
begin
clrscr;
randomize;
write('Nhap n =');
readln(n); {Tao ngau nhien mang gom n so nguyen}
for i:= 1 to n do
A[i]:= random(301)- random(301);
for i:= 1 to n do
write(A[i]:5); {in ra mang vua tao}
writeln;
write('Nhap k = ');
readln(k);
s:=0;
for i:=1 to n do
if A[i] mod k = 0 then s:=s+A[i];
writeln('Tong can tinh la: ',s);
readln
end.
Chú ý:
Hàm chuẩn random(n) cho giá trị là số nguyên ngẫu nhiên trong khoảng từ 0 đến n - 1, còn thủ tục randomize khởi tạo cơ chế sinh số ngẫu nhiên.
Gợi ý làm bài:
Sau khi nhập chương trình và cho chương trình chạy và nhập dữ liệu, ta có kết quả như hình 1 dưới đây:
Hình 1.
Trong hình ở trên, số phần tử cần nhập vào là 50. Khi đó, mảng được tạo ra một cách ngẫu nhiên gồm 50 số nguyên có giá trị tuyệt đối không vượt quá 300. Tiếp đến ta nhập vào số k = 9. Ta nhận thấy ràng, trong 50 số được tạo ra thì chỉ các số 45 và 99 là chia hết cho 9 và tổng của chúng bằng 144.
Tương tự như trên, nếu ta nhập n= 99, k= 10 thì kết quả cho như ở hình 2 dưới đây:
Hình 2.
Chúng ta cũng dễ dàng nhận ra rằng, các sổ: -10, -110, -30, 40 và -30 là bội cùa 10 và tổng của chúng bằng -140.
b) Hãy đưa các câu lệnh sau đây vào những vị trí cần thiết nhằm sửa đổi chương trình trong câu a để có được chương trình đưa ra số các số dương và số các số âm trong mảng.
posi, neg: integer;
posi:= 0; neg:= 0;
if A[i]>0 then posi:= posi+1
else if A[i]<0 then neg:= neg+1;
writeln(posi:4,neg:4);
Gợi ý làm bài:
Chương trình để in ra số các số dương và số các số âm trong mảng A như sau:
program Sum1;
uses crt,
const nmax=100;
type Myarray= array[1..nmax] of integer;
var A: MyArray;
n, i: integer; posi, neg: integer;
Begin
clrscr; randomize;
write('Nhap n=') ;
readln(n); {Tao ngau nhien mang gom n so nguyen}
for i:=1 to n
do A[i]:=random(300)-random(300);
for i:= 1 to n do
write(A[i]:5); {in ra mang vua tao}
writeln;
posi:= 0; neg:= 0;
for i:= 1 to n do
if A[i]>0 then posi:= posi + 1 else if A[i]
readln
End.
Khi chạy chương trình, nhập số phần tử của mảng, ví dụ, n= 10 thì kết quả của chương trình sẽ như hình 3 sau đây:
Hình 3. Kết quả chương trình in ra số các số dương và số các số âm trong mảng A
và kết quả như ở hình 3 ở trên thì người sử dụng nhiều khi rất khó nhìn thấy số các số dương và số các số âm. Bời vậy, chúng ta cần đưa vào lệnh in dòng chú thích:
writeln('So cac so duong la: ', posi: 4) ;
writeln( 'So cac so am la: ', neg: 4);
Khi đó, chương trình in ra số các số dương và số các số âm trong mảng A là:
program Sum1b2;
uses crt;
const nmax= 100;
type Myarray- array[1..Nmax] of integer;
var A: MyArray;
n, i: integer;
posi, neg: integer;
Begin
clrscr; randomize;
write ( ’ Nhap n=' );
readln(n); {Tao ngau nhien mang gom n so nguyen}
for i:=1 to n do
A [ i ]: =random (301) -random (301);
for i:=1 to n do (A[i] : 5); {in ra mang vua tao}
writeln;
posi:= 0; neg:= 0; or i:= 1 to n do
if A[i]>0 then posi:= posi + 1
else if A[i]' , posi:4);
writeln('So cac so am la : ', neg:4);
readln
End.
Khi chạy chương trình, nhập số phần tử của mảng, ví dụ, n= 50 thì chương trình sẽ đưa ra thông báo: So cac so duong la: 24 So cac so am la: 26
Kết quả của chương trình sẽ như hình 4 dưới đây:
Hình 4. Kết quả chương trình in ra số các số dương và số các số âm trong mảng A
Bài 2.
Viết chương trình tìm phần tử có giá trị lớn nhất của mảng và đưa ra màn hình chỉ số và giá trị của phần tử tìm được. Nếu có nhiều phần tử có cùng giá trị lớn nhất thì đưa ra phần tử có chỉ số nhỏ nhất.
a) Hãy tìm hiểu chương trình sau đây:
program MaxElement;
const Nmax= 100;
type MyArray = array[1..Nmax] of integer;
var A: MyArray;
n,i,j: integer;
begin
write('Nhap so luong phan tu cua day so, N = '); readln(N);
for i:=1 to N do
begin
write('Phan tu thu ',i,' = ');
readln(A[i]);
end;
j:= 1;
for i:= 2 to n do if A[i] > A[j] then j:= i;
write ('Chi so: ',j, ' Gia tri: ',A[j]:4);
readln
end.
b) Chỉnh sửa chương trình trên để đưa ra chỉ số của các phần tử có cùng giá trị lớn nhất.
Gợi ý làm bài:
Sau khi nhập chương trình và cho chương trình chạy và nhập số lượng phần tử của dãy số với n= 10 với giá trị các phần tử như sau:
Phần tử thứ nhất= 5;
Phần tử thứ hai= 9;
Phần tử thứ ba= 4;
Phần tử thứ tư= 8;
Phần tử thứ năm= 6;
Phần tử thứ sáu= 2;
Phần tử thứ bảy= 7;
Phần tử thứ tám= 1;
Phần tử thứ chín= 3;
Phần tử thứ mười= 8;
thì chương trình in ra thông báo: 'Chi so: 2 Gia tri: 9 ' nghĩa là phần tử ở chỉ số 2 có giá trị 9 là phần tử lớn nhất mảng. Khi đó, ta có kết quả như hình 5 dưới đây:
Hình 5.
Nhưng khi nhập các phần tử vào mảng mà có nhiều phần tử có cùng giá trị lớn nhất thì kết quả của chương trình số in ra chỉ số nhỏ nhất cùa phần tử lớn nhất. Chẳng hạn, nhập vào 9 phần tử với giá trị các phần tử được nhập vào mảng như sau:
Phần tử thứ nhất= 9;
Phần tử thứ hai= 5;
Phần tử thứ ba= 4;
Phần tử thứ tư= 9;
Phần tử thứ năm= 3;
Phần từ thứ sáu= 9;
Phần tử thứ bảy= 9;
Phần tử thứ tám= 6;
Phần tử thứ chín= 7;
Khi đó chương trình sẽ đưa ra thông báo: "Chi so: 1 Gia tri: 9" như hình 6 dưới đây:
Hình 6.
Với kết quả của chương trình hiện ra như ở hình 6 thì chỉ số nhỏ nhất của phần tử lớn nhất bằng 9) là 1.
Lưu ý: Trong chương trình chúng ta nên đưa vào khai báo chuẩn uses crt; và lệnh xóa màn hình clrscr; để mỗi lần chạy chương trình các kết quả trước đó bị xóa:
Khi đó chương trình sẽ là:
Program MaxElement;
uses crt;
const Nmax= 100;
type Myarray = array[1ắ.Nmax] of integer;
var i: MyArray;
r, i, j: integer;
Begin
Clrscr ;
wiite('Nhap so luong phan tu cua day so, N= ');
readln(N);
for i:= 1 to N do
begin
write('Phan tu thu ', i,'=');
readln(A[i]);
end;
j : = 1 ;
for i:= 1 to n do if A[i]>A[j] then j:= i;
write('Chi so: ',j,'Gia tri: ',A[j]: 4);
readln
End.
b) Chỉnh sửa chương trình để đưa ra chỉ số của các phần tử có cùng giá trị lớn nhất, bằng cách ta đưa vào chương trình biến mảng dem. Chương trình như sau:
Program MaxElement.2 ;
const Nmax= 100;
type Myarray = array[1..Nmax] of integer;
var A: Myarray;
dem: array[1..Nmax] of integer;
n, k, i, j: integer;
Begin
write('Nhap so luong phan tu cua day so, N= ' );
readln(N); for ỉ:= 1 to n do
begin
write('Phan tu thu i ,' = ');
readln(A[i]); end; j : = 1; k: = 0 ;
for i:= 2 to n do if A[i] > A[j] then j:= i; dem[k]:= j;
for i:= 1 to n do if a[i] = a[j] then
begin
k: = k + 1 , dem[k]:= i;
end;
writeln('Gia tri lon nhat la: A[j]:4);
writeln('Chi so ung voi gia tri lon nhat la: '));
for i:= 1 to k do write('dem[i]);
writeln;
readln;
End.
Khi cho chương trình chạy và nhập số lượng phần tử của dãy số với n= 5. Giả sử, giá trị các phần tử được nhập vào như sau:
Phần tử thứ nhất= 4;
Phần tử thứ hai= 7;
Phần tử thứ ba= 9;
Phần tử thứ tư= 5;
Phần tử thứ năm= 9;
Khi đó chương trình sẽ đưa ra thông báo:
Gia tri lon nhat la: 9 Chi so ung voi gia tri lon nhat la:
3 5
Kết quả của chương trình như hình 7 dưới đây:
Hình 7.