Bài 9. Làm việc với dãy số

Nội dung lý thuyết

BÀI 9: LÀM VIỆC VỚI DÃY SỐ

1. Dãy số và biến mảng

- Ví dụ 1. Trong Pascal ta cần nhiều câu lệnh khai báo và nhập dữ liệu dạng sau đây, mỗi câu lệnh tương ứng với điểm của một học sinh:

  • Var Diem_1, Diem_2, Diem_3,… : real;
  • Read(Diem_1); Read(Diem_2), Read(Diem_3); …

​- Nhận xét:

  • Nếu số học sinh trong lớp càng nhiều thì đoạn khai báo và đọc dữ liệu trong chương trình càng dài.
  • Giả sử chúng ta có thể lưu nhiều dữ liệu có liên quan với nhau (như Diem_1, Diem_2, Diem_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 i = 1 đến 50: hãy nhập Diem_i;
    • Với i = 1 đến 50: hãy so sánh Max với Diem_i;

=> Để giúp giải quyết các vấn đề trên, một kiểu dữ liệu được gọi là kiểu mảng.

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

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

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

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

a. Ví dụ về khai báo biến mảng

- Xét ví dụ về 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;
  • var Tuoi: array[21..80] of integer;

=> Với câu lệnh thứ nhất, 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. Với câu lệnh khai báo thứ hai, ta có biến Tuoi gồm 60 phần tử (từ 21 đến 80) có kiểu số nguyên.

b. Khai báo mảng trong Pascal

- Cách khai báo mảng trong ngôn ngữ lập trình Pascal như sau:

Var Tên mảng: array[<chỉ số đầu>..<chỉ số cuối>] of  <kiểu dữ liệu>

- Trong đó: 

  • Var: từ khóa khai báo biến; array: từ khóa khai báo mảng
  • Chỉ số đầu và chỉ số cuối là hai số nguyên hoặc biểu thức 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 Diem_1, Diem_2, Diem_3,... để lưu điểm số của các học sinh, ta khai báo biến mảng Diem như sau:

var Diem: array[1..50] 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(Diem[i]); => để nhập điểm của các học sinh.

- Để so sánh điểm của mỗi học sinh 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:=1 to 50 do if Diem[i]>8.0 then writeln('Gioi');

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

- Hơn nữa, 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í,... Để 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..50] of real;

var DiemVan: array[1..50] of real;

var DiemLy: array[1..50] of real;

hay

var DiemToan, DiemVan, DiemLy: array[1..50] of real;

=> Khi đó, ta cũng có thể xử lí điểm thi của một học sinh cụ thể: 

- Nhận xét:

  • Ví dụ 2 cũng cho thấy rằng, chúng ta gán giá trị, đọc 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 thông qua chỉ số tương ứng của phần tử đó. Chẳng hạn, trong câu lệnh trên Diem[i] là phần tử thứ i của biến mảng Diem.
  • Ta có thể gán giá trị cho các phần tử của mảng bằng câu lệnh gán:
    • A[1]:=5;
    • A[2]:=8;
  • 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]);

3. Tìm giá trị lớn nhất và nhỏ nhất của dãy số

Ví dụ 3. Viết chương trình tìm giá trị lớn nhất và nhỏ nhất của dãy số

- 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: array[1..100] of integer;

- Phần thân chương trình sẽ tương tự dưới đây:

Begin

     clrscr;

     write('Hay nhap do dai cua day so, N = '); readln(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;

     write('So lon nhat la Max = ',Max);

     write('; So nho nhat la Min = ',Min);

     readln;

End.