SGK Tin Học 8 - Bài 9. LÀM VIỆC VỚI DÃY SỐ

  • Bài 9. LÀM VIỆC VỚI DÃY SỐ trang 1
  • Bài 9. LÀM VIỆC VỚI DÃY SỐ trang 2
  • Bài 9. LÀM VIỆC VỚI DÃY SỐ trang 3
  • Bài 9. LÀM VIỆC VỚI DÃY SỐ trang 4
  • Bài 9. LÀM VIỆC VỚI DÃY SỐ trang 5
  • Bài 9. LÀM VIỆC VỚI DÃY SỐ trang 6
BÀI 9
LÀM VIỆC VỚI DÃY SỐ ■
Dãy số và biến mảng
Ví dụ 1. Đê’ khảo sát mức độ phân hoá giàu nghèo của một địa phương, người ta đã tiến hành thu thập thông tin về thu nhập của từng hộ gia đình trong địa phương đó. cần viết chương trình tính mức thu nhập trung bình của các hộ gia đình trong địa phương và độ lệch giữa mức thu nhập của từng hộ gia đình so với mức thu nhập trung bình.
Rõ ràng việc giải bài toán trên gồm hai bước cơ bản:
Tính thu nhập trung bình bằng cách lấy tổng thu nhập của tất cả các hộ gia đình chia cho tổng số hộ.
Lần lượt lấy thu nhập của từng hộ trừ đi giá trị trung bình ở bước 1 để tính độ lệch giữa mức thu nhập của hộ đó so với mức thu nhập trung bình.
Giả sử số hộ gia đình được khảo sát là 50. Đoạn chương trình sau có thể giúp giải quyết bài toán trên:
Thunhap_TB := 0;
for i := 1 to 50 do begin
write'('Thu nhap cua gia dinh thu ' , i) ; readln(a);
Thunhap_TB := Thunhap_TB + a
end;
Thunhap_TB := Thunhap_TB/50 ;
for i := 1 to 50 do
begin
write ('Thu nhap cua gia dinh thu ',i);
readln(a);
writeln('Do lech so.voi thu nhap TB cua ho ',i, ' la: ', a - Thunhap_TB)
end;
Do tại mỗi thời điểm một biến chỉ lưu được một giá tri duy nhất nên trong đoạn chương trình trên, mỗi khi cần tới thu nhập của hộ gia đình nào ta lại
phải thực hiện câu lệnh readln(a) để nhập mức thu nhập của hộ đó vào biến a. Cần lưu ý thêm, thao tác nhập mức thu nhập của các hộ gia đình từ bàn phím chiếm phần lớn thời gian trong quá trình thực hiện đoạn chương trình trên, mà ta lại phải thực hiện công việc đó hai lần.
Để chỉ phải nhập một lần, ta có thể khai báo nhiều biến, mỗi biến dùng để lưu trữ thu nhập của một hộ gia đình. Ví dụ, trong Pascal ta cần nhiều câu lệnh khai báo và nhập dữ liệu như sau:
Var Thunhap_l, Thunhap_2, Thunhap_3,...: real;
Read(Thunhap_l); Read(Thunhap_2) ; Read(Thunhap_3);...
Chú ý rằng địa phương cần khảo sát có bao nhiêu hộ gia đình thì cần viết đủ chừng ấy khai báo và câu lệnh nhập mức thu nhập - một công việc hoàn toàn không hề thú vị!
Nếu có cách nào để lưu nhiều dữ liệu liên quan với nhau (như Thunhap_l, Thunhap_2, Thunhap_3,... ở trên) bằng một biến duy nhất và đánh "số thứ tự" cho các giá trị đó, ta có thể sử dụng quy luật tăng hay giảm của "số thứ tự" và một vài câu lệnh lặp để xử lí dữ liệu một cách đơn giản hơn, chăng hạn:
Với /' chạy từ 1 đến 50: hãy nhập Thunhap_i',
Với /' chạy từ ỉ đến 50: hãy so sánh Thunhap_TB với Thunhap_i.
Đê’ giúp giải quyết vấn đề trên, hầu hết các ngôn ngữ lập trình đều có một kiểu dữ liệu được gọi là kiểu mảng.
Thunhapl Thunhap_2 Thunhap_3	Thunhapk
Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự, mọi phần tử đều có cùng một kiểu dữ liệu, gọi là kiểu của phần tử. Việc sắp thứ tự được thực hiện bằng cách gán cho mỗi phần tử một chỉ số:
Mảng cỊ>|__	__
Chi sổ tzỊ> 1	2	3	...	k
Hình 40
Trong bài này, chúng ta chỉ xét các mảng có các phần tử kiểu số nguyên hoặc số thực.
Khi khai báo một biến có kiểu dữ liệu là kiểu mảng, biến đó được gọi là biến mảng. Có thể nói rằng, khi sử dụng biến mảng, về thực chất chúng ta sắp thứ tự theo chỉ số các biến có cùng kiểu dưới một tên duy nhất.
Giá trị của biến mảng là một mảng, tức một dãy số (số nguyên, hoặc số thực) có thứ tự, mỗi số là giá trị của biến thành phần tương ứng.
*
Ví dụ về biến mảng
Đê’ làm việc với các dãy số nguyên hay sô' thực, chúng ta phải khai báo biến mảng có kiểu tương ứng trong phần khai báo của chương trình.
Cách khai báo biến mảng trong các ngôn ngữ lập trình có thể khác nhau, nhưng luôn cần chỉ rõ: tên biến mảng, số lượng phần tử, kiểu dữ liệu chung của các phần tử.
Ví dụ, cách khai báo đơn giản một biến mảng trong ngôn ngữ Pascal như sau:
var Chieucao: array[1.. 50] of real;
Với câu lệnh trên, ta đã khai báo một biến có tên Chieucao gồm 50 phần tử, mỗi phần tử là biến có kiểu số thực.
Từ ví dụ trên, có thể thấy cách khai báo mảng trong Pascal như sau:
Tên mảng : array [.. ] of trong đó chỉ số đầu và chỉ sô' cuối là hai số nguyên thoả mãn
chỉ số đầu < chỉ số cuối và kiểu dữ liệu có thể là integer hoặc real.
Ví dụ 2. Tiếp tục với ví dụ 1, thay vì khai báo các biến Thunhap_l, Thunhap_2, Thunhap_3,... để lưu mức thu nhập của các hộ gia đình, ta khai báo biến mảng Thunhap như sau:
var Thunhap; array[1..5O] of real;
Cách khai báo và sử dụng biến mảng như trên có lợi gì?
Trước hết, có thể thay rất nhiều câu lệnh nhập và in dữ liệu ra màn hình bằng một câu lệnh lặp. Chẳng hạn, ta có thể viết
for i:= 1 to 50 do readln (Thunhapti] );
để nhập mức thu nhập của các hộ gia đình. Thay vì phải viết 50 câu lệnh khai báo và 50 câu lệnh nhập, ta chỉ cần viết hai câu lệnh là đủ và kết quả đạt được là như nhau.
Ta còn có thể sử dụng biến mảng một cách rất hiệu quả trong xử lí dữ liệu. Đê’ so sánh mức thu nhập của các hộ gia đình với một giá trị nào đó, ta cũng chỉ cần một câu lệnh lặp, chẳng hạn
for i:=l to 50 do
if Thunhapt i] > Thunhap_TB then
writeln('Ho dan ',i,' thu nhap tren trung' binh') ;
Điều này giúp tiết kiệm rất nhiều thời gian và công sức viết chương trình.
75
Ví dụ 3. Giả sử chúng ta cần viết chương trình nhập điểm từng môn học cho các học sinh trong một lớp và tính toán trên các điểm đó. Vì mỗi học sinh có thể có nhiểu điểm theo từng môn học: điểm Toán, điểm Văn, điểm Lí,... nên để xử lí đồng thời các loại điểm này, ta có thể khai báo nhiều biến mảng:
var DiemToan: array[1..5O] of real; var DiemVan: array[1..5O] of real; var Di'emLi: array[1..5O] of real;
hay
var DiemToan, DiemVan, DiemLi: array[1..5O] of real;
Sau khi một mảng đã được khai báo, chúng ta có thể làm việc với các phần tử của nó như làm việc với một biến thông thường như gán giá trị, đọc giá trị và thực hiện các tính toán với các giá trị đó thông qua tên của biến mảng và chỉ số tương ứng của phần tử. Chẳng hạn, trong các câu lệnh sau A[i] là phần tử thứ / của biến mảng A.
Ta có thể gán giá trị cho các phần tử của mảng A bằng câu lệnh gán:
A[l] := 5;
A [2] := 8+m;
hoặc nhập dữ liệu từ bàn phím bằng câu lệnh lặp:
for i: = 1 to 5 do readln(A[i] );
Tìm giá trị lớn nhất và nhỏ nhất của dãy số
Ví dụ 4. Viết chương trình nhập N số nguyên từ bàn phím và in ra màn hình số nhỏ nhất và số lớn nhất. N cũng được nhập từ bàn phím (xem lại thuật toán trong ví dụ 6, bài 5).
Trước hết ta khai báo biến N để nhập số các số nguyên sẽ được nhập vào. Sau đó khai báo N biến lưu các số được nhập vàọ như là các phần tử của một biến mảng A. Ngoài ra, cần khai báo một biến /■ làm biển đếm cho các lệnh lặp và biến Max để lưu sô' lớn nhất, Min để lưu số nhỏ nhất.
Phần khai báo của chương trình có thể như sau:
program MaxMin;
uses crt;
var i, n, Max, Min: integer;
A: arrayf 1..100] of integer;
Phần thân chương trình sẽ tương tự dưới đây:
begin
clrscr;
write('Hay nhap so phan tu cua day so, N = '); readlri(n); writeln('Nhap cac phan tu cua day so:');
for i := 1 to n do begin
write ( ' a[ ' , i, ' ]	= ' ) ; readln (a[ i] ) ;
end;
Max:= a[ 1] ; Min: =
a[
1] ;
for i: = 2 to
n do
begin
if
Max
<
a[i]
then Max;=
a[i] ;
if
Min
>
a[i]
then Min:=
a[i]
end;
writeln ( 'Phan
tu
Max
la:
',Max);
writeln ( 'Phan
tu
Min
la:
',Min);
readln
end.
Trong chương trình này, chúng ta hãy lưu ý điểm sau: Số tối đa các phần tử của mảng (còn gọi là kích thước của mảng) phải được khai báo băng một số cụ thể (ở đây là 100, mặc dù số các phần tử nhập vào sau này có thể nhỏ hơn nhiều so với 1 00).
GHI NHÓ
Dữ liệu kiểu mảng là một tập hợp hữu hạn các phần tử có thứ tự và mọi phần tử của mảng đều có cùng một kiểu dữ liệu.
Việc gán giá trị, nhập giá trị và tính toán với các giá trị của một phần tử trong biến mảng được thực hiện thông qua chỉ số tương ứng của phần tử đó.
Sử dụng các biến mảng và câu lệnh lặp giúp cho việc viết chương trình được ngắn gọn và dễ dàng hơn.
Câu hoi và bài tập
Hãy nêu các lợi ích của việc sử dụng biến màng trong chương trình.
Các khai báo biến màng sau dây trong Pascal đúng hay sai?
var X: Array[10,13] Of Integer;
var X: Array [5 . .10.5] Of Real;
var X: Array[3.4 . . 4.8] Of Integer;
var X: Array [ 10.. 1] Of Integer;
var X: Array [4.. 10] Of Real;
Phát biểu “Có thể xem biến màng là một biến được tạo tù nhiều biến có cùng kiểu, nhưng chỉ dưới một tên duy nhốt” đúng hay sai?
Câu lệnh khai báo biến màng sau đây máy tính có thực hiện được không?
var N: integer;
A: array[1..N] of real;
Viết chương trình sử dụng biến mảng để nhập tù bòn phím các phần tử của một dãy số. Độ dài của dãy cũng được nhập tù bàn phím.
Viết chương trình sử dụng biến màng để giải quyết bài toán nêu trong ví dụ 1.
Độ lệch chuẩn là một khái niệm rốt quan trọng trong đánh giá dữ liệu thống kê. Già sủ ta có bộ dữ liệu thống kê gồm n phần tủ có giá trị tương ứng là X,, x2, ...,xn. Kí hiệu XTB là giá trị trung bình của Xp x2,..., xn. Khi đó, độ lệch chuẩn của bộ dữ liệu trên được tính theo công thúc sau:
ế (Xi - XTB)2 >•=1	
n
(căn bậc hai của tổng các bình phương độ lệch tùng phần tủ so vối giá trị trung bình chia cho số phần tử).
Hãy viết chương trình tính độ lệch chuẩn của dữ liệu thống kê về mức thu nhập của các hộ gia đình nêu trong vĩ dụ 1.
Lưu ý: Giá trị của độ lệch chuẩn phởn ánh múc độ phân tán của dữ liệu thống kê. Áp dụng cho dữ liệu thống kê về múc thu nhập của các hộ gia đình trong một địa phương nêu trong ví dụ 1, nếu giá trị dộ lệch chuẩn lớn thì mức độ phân hoá giàu nghèo của địa phương càng rõ rệt (độ chênh lệch về mức thu nhập của người giàu và người nghèo lớn).