-Một nhóm câu lệnh đơn giản được đặt giữa hai chữ Begin và End sẽ tạo thành một câu lệnh hợp thành hay một lệnh ghép. -Cú pháp: Begin <Câu lệnh 1> <Câu lệnh 2> ………. <Câu lệnh n> End; -VD: Begin t:=x; x:=y; y:=t; end; II. Câu lệnh lựa chọn 2.1. Câu lệnh If: 2.1.1. Rẽ nhánh dạng khuyết:
Cú pháp: if <Biểu thức Logic> theo <công việc>
Trong đó : + if , then là từ khóa.
+ <Biểu thức logic> là một biểu thức có kiểu logic + <Công việc> là một lệnh đơn hay lệnh ghép
Ý nghĩa : Khi gặp lệnh này máy sẽ được thực hiện như sau:
+ Nếu <Biểu thức logic> nhận giá trị đúng thì máy sẽ thực hiện <Công việc>
+ Nếu <Biểu thức logic> nhận giá trị sai thì máy bỏ qua <Công việc> và thoát ra khỏi câu lệnh
Sơ đồ hoạt động
Ví dụ: Cho hai số nguyên a và b. Viết chương trình tìm giá trị lớn nhất của hai số này:
* Program
Var a,b: Integer Max: Integer Begin Biểu thức Logic Câu lệnh Thoát Sai Đúng
Write (‘mời nhập a=’);Readln(a); Write (‘nhập b=’);Readln(b);
max:=a;
If max < b then max:=b; Write (‘giá trị lớn nhất là:’,max:3); Readln;
End.
2.1.2. Rẽ nhánh dạng đầy đủ:
Cú pháp: If < Biểu thức logic> Then <Công việc1> else <Công việc2>
Trong đó: - Biểu thức logi: là một biểu thức có kiểu logic - If, Then, Else: là các từ khóa
- <Công việc1>, <Công việc2>: là câu lệnh đơn hoặc lệnh ghép
Ý nghĩa: Khi gặp lệnh này máy sẽ thực hiện như sau:
+ Kiểm tra < Biểu thức logic>
+ Nếu < Biểu thức logic> nhận giá trị đúng thì thực hiện <công viêc1) + Nếu < Biểu thức logic> nhận giá trị sai thì thực hiện <công việc2>
Sơ đồ hoạt động:
Ví dụ: Viết chương trình tìm giá trị lớn nhất và nhỏ nhất của 2 số nguyên a,b
Program max_min;
Var a,b,max,min:Integer; Begin
Write (‘nhập a,b’);Readln(a,b) If (a>b) then begin
Max:=a; Min:=b; End Else Begin Max:=b; Min:=a; End; Write(‘max=’,max:3); Write(‘min=’,min:3); Readln; Biểu thức Logic
Công việc 1 Công việc 2
Thoát
Sai Đúng
2.2. Câu lệnh Case..of.. Cú pháp: Case <biểu thức> of Tên hằng 1:<lệnh 1>; Tên hằng 2:<lệnh 2>; …………. Tên hằng n:<lệnh n> Else <câu lệnh n+1>; End;
Ý nghĩa : Khi gặp lệnh này máy sẽ thực hiện như sau:
+ Tính giá trị của biểu thức sau đó so sánh với các hằng.
Nếu kết quả thuộc hằng nào thì thực hiện lệnh tương ứng, còn nếu không trùng bất kỳ hằng nào thì thực hiện lệnh (n+1)
Ví dụ 1 : Viết chương trình nhập vào một điểm kiểm tra từ bàn phím và in ra kết quả xếp
loại : Loại yếu (<5 điểm) TB (5,6 điểm) Khá (7,8 điểm) Giỏi (9,10 điểm) Program tinhdiem; Var diem:Byte Begin
Write(‘nhập điểm :’);readln(điểm); Case điểm of 0..4:write(‘Loại yếu’); 5..6:write(‘Loại TB’); 7..8:write(‘Loại khá’); 9..10:write(‘Loại giỏi’) Else
Writeln(‘nhập điểm sai’); End;
Readln; End.
Ví dụ 2: Viết chương trình cho biết số ngày cho 1 tháng khi biết tháng và năm. Tháng và
năm được nhập từ bàn phím. Program thangnam;
Var Sn,thang,nam:integer; Begin
Write(‘nhập tháng :’);Readln(tháng); Write(‘nhập năm :’);Readln(năm);
Case thang of
1,3,5,7,8,10,12:Sn:=31; 4,6,9,11:Sn:30;
2:if (nam mod 4)=0 then Sn:=28 Else
Sn:=29; End;
Readln; End.
Bài Tập :
1/ Sử dụng cấu trúc case ..of để xác định số n có chia hết cho 4 hay không ? Nếu không thì còn dư bao nhiêu?. với n nhập từ bàn phím.
2/ Viết chương trình giải phương trình bậc 2 : ax2+bx+c=0, bậc 1 : ax+b=0.Với a,b,c nhập vào từ bàn phím.
3/Lập chương trình nhập số n và in ra giá trị că bậc hai n
BÀI 6: CÂU LỆNH LẶP I. Câu lệnh for
1.1. Sự hoạt động của For dạng tiến
Cú pháp :
For <Biến ĐK>:=<Giá trị đầu> to <Giá trị cuối> do <Công việc> Trong đó : + For, to, do: là từ khóa.
+ <giá trị đầu>, <giá trị cuối>, <Biến ĐK> phải cùng một kiểu dữ liệu và là một trong các kiểu số nguyên, logic, ký tự.
Ý nghĩa : Khi gặp lệnh này máy sẽ thực hiện như sau : - Bước 1: Gán <giá trị đầu> cho <Biến ĐK>
<BĐK>:=<giá trị đầu>
- Bước 2: Kiểm tra <BiếnĐK> có bé hơn hoặc bằng <giá trị cuối> hay không. Nếu đúng chuyển sang bước 3. Nếu sai chuyển sang bước 4.
- Bước 3: Thực hiện công việc sau DO sau đó tăng <Biến ĐK> lên một đơn vị rồi quay lại bước 2.
- Bước 4: Thoát khỏi vòng lặp. Sơ đồ hoạt động : Ví dụ : Viết chương trình tính tổng : S=1+2+3+…+n Với n nhập từ bàn phím Program tinhtong; Var I,n,s:integer; Begin Write(‘nhập n =’);Readln(n); S:=0; For i:=1 to n do s:=s+i; Biến ĐK:= GTđầu Biến ĐK<=GTđầu Công việc
Biến ĐK:=Biến ĐK+1 End
Đ
Write(‘tong la :’,s:3:3); Readln;
End.
1.2. Sự hoạt động của vòng lặp For dạng lùi :
Cú pháp :
For <Biến ĐK>:=<Giá trị cuối> downto <Giá trị đầu> do <Công việc> Trong đó : + For, downto, do: là từ khóa
+ <giá trị đầu>, <giá trị cuối>, <Biến ĐK> phải cùng một kiểu dữ liệu và là một trong các kiểu số nguyên, logic, ký tự.
Ý nghĩa : Khi gặp lệnh này máy sẽ thực hiện như sau:
- Bước 1: Gán <giá tri cuối> cho <Biến ĐK> <BiếnĐK>:=<giá trị cuối>
- Bước 2: Kiểm tra <Biến ĐK> có lớn hơn hoặc bằng <giá trị đầu> hay không. Nếu đúng chuyển sang bước 3. Nếu sai chuyển sang bước 4.
- Bước 3: Thực hiện công việc sau DO sau đó giảm <Biến ĐK> xuống một đơn vị rối quay lại bước 2.
- Bước 4: Thoát khỏi vòng lặp. Sơ đồ hoạt động : Ví dụ : Tính tổng sau : S=10+9+8+…+1. Program tinhtong; Var s,i:integer; Begin s:=0;
For i:=10 downto 1 do s:=s+i; Write(‘tổng là :’,s:5:3); Readln; End. Biến ĐK:= GTcuối Biến ĐK>=GTcuối Công việc
Biến ĐK:=Biến ĐK-1 End
Đ
II. Câu lệnh while…do Cú pháp: Cú pháp:
While <Biểu Thức ĐK> do <Công việc> Trong đó: - While, do: là từ khóa.
- <BTĐK> là một biểu thức có kiểu <Logic>
- Công việc có thể là lệnh đơn hay lệnh ghép. Nếu là lệnh ghép phải đặt giữa hai từ khóa Begin ..end
Ý nghĩa: Khi gặp lệnh này máy thực hiện như sau:
- Bước 1: Kiểm tra <Biểu thức Logic>
+ Nếu <BT Logic> có giá trị đúng chuyển sang bước 2. + Nếu <BT Logic> có giá trị sai chuyển sang bước 3. - Bước 2: Thực hiện <Công việc> sau DO rồi chuyển sang bước 1 - Bước 3: Thoát khỏi vòng lặp.
Sơ đồ khối :
Ví dụ: Viết chương trình tính tổng sau : S=1+2+3+…+n.
Program tinhtong; Var I,s,n:integer; Begin Write(‘nhập n=’);Readln(n); s:=0;i:=1; While i<=n do Begin s:=s+i; i:=i+1; end; write(‘tổng là :’,s:5:3); readln; end.
III. Câu lệnh repeat ..until
Cú pháp : Repeat <Câu lệnh> Until <Biểu thức ĐK>
Ý nghĩa: Khi gặp lệnh này máy sẽ thực hiện : - Bước 1: Thực hiện công việc.
- Bước 2: Kiểm tra <Biểu thức ĐK>
- Nếu <Biểu thức ĐK> có giá trị đúng thì chuyển sang bước 3. - Nếu <Biểu thức ĐK> có giá trị sai thì chuyển sang bước 1.
Công việc Biểu thức ĐK
End Đ
- Bước 3: Thoát khỏi vòng lặp. Sơ đồ khối : Ví dụ : Tính tổng S=1+2+3+…+n với n nhập vào từ bàn phím. Program tinhtong; Var I,n,s:integer; Begin Write(‘nhập n=’);Readln(n); s:=0;i:=1; Repeat s:=s+i; i:=i+1; Until i>n; Write(‘tổng là :’,s:5:3); Readln; End. ------ Công việc Biểu thức ĐK End Đ S
BÀI 7: KIỂU DỮ LIỆU CÓ CẤU TRÚC MẢNG( ARRAY) I. Định nghĩa
Là một kiểu dữ liệu có cấu trúc bao gồm một số cố định các phần tử có cùng chung kiểu dữ liệu, cùng tên, chỉ khác nhau về chỉ số. Mảng gồm hai loại
+ Mảng một chiều: là mảng mà các phần tử của nó được bố trí theo kiểu tuyến tính
+ Mảng hai chiều: là mảng mà các phần tử của nó được bố trí theo kiểu
II. Mảng một chiều
2.1. Khai báo mảng một chiều.
Có hai cách để khai báo:
Khai báo gián tiếp: - Cú pháp:
TYPE
Tên mảng=array[Kiểu_chỉ_dẫn] of Kiểu_phần_tử; Var biến mảng:tên mảng;
- Ví dụ:
TYPE
Hocsinh= array[1..50] of record; Var a: hocsinh;
Khai báo trực tiếp: - Cú pháp:
Biến mảng=array[Kiểu_chỉ_dẫn] of Kiểu_phần_tử;
- Ví dụ:
Var a=array[1..50] of integer;
2.2. Cách truy nhập vào các phần tử:
- Cách truy nhập một phần tử vào mảng ta viết như sau:
Biến mảng[chỉ số phần t];
- Ví dụ: a[4]: Truy nhập đến các phần tử có chỉ số là 4
2.3. Nhập xuất dữ liệu cho các phần tử của mảng một chiều
- Ví dụ : Lập chương trình nhập một mảng một chiều gồm n số nguyên, in giá trị của mảng vừa nhập ra màn hình. Program mang; Var A: array[1..15]of integer; I, n:integer; Begin
Write(‘ nhap so phan tu=’);readln(a); For i:=1 to n do
Begin
Write(‘a[‘,I,’]=’);readln(a[i]); End;
Write(‘gia tri mang vua nhap’); For i:=1 to n do
Write(a[i]:4); Readln;
End.
- Sắp xếp giảm dần:
Để sắp xếp một mảng, các phần tử trong mảng cần phải được so sánh với những phần tử còn lại. Cách tốt nhất để sắp xếp một mảng, theo thứ tự giảm dần, là chọn ra giá trị lớn nhất trong mảng và hoán vị nó với phần tử đầu tiên. Một khi điều này được thực hiện xong, giá trị lớn thứ hai trong mảng có thể được hoán vị với phần tử thứ hai của mảng, phần tử đầu tiên của mảng được bỏ qua vì nó đã là phần tử lớn nhất. Tương tự, các phần tử của mảng được loại ra tuần tự đến khi phần tử lớn thứ n được tìm thấy. Trong trường hợp mảng cần sắp xếp theo thứ tự tăng dần giá trị lớn nhất sẽ được hoán vị với phần tử cuối cùng của mảng.
Quan sát ví dụ một dãy số để hiểu được giải thuật. Hình 1 trình bày một mảng số nguyên cần được sắp xếp.
10 40 90 60 70
Hình 1: Mảng num với chỉ số i (5 phần tử)
Để sắp xếp mảng này theo thứ tự giảm dần,
Chúng ta cần tìm phần tử lớn nhất và hoán vị nó vào vị trí phần tử đầu tiên. Xem như đây là lần thực hiện thứ nhất. Để đưa giá trị lớn nhất về vị trí đầu tiên, chúng ta cần so sánh phần tử thứ nhất với các phần tử còn lại. Khi phần tử đang được so sánh lớn hơn phần tử đầu tiên thì hai phần tử này cần phải được hoán vị.
Khởi đầu, ở lần thực hiện đầu tiên, phần tử ở ví trí thứ nhất được so sánh với phần tử ở vị trí thứ hai. Hình 2 biểu diễn sự hoán vị tại vị trí thứ nhất.
40 10 90 60 70
Hình 2: Đảo vị trí phần tử thứ nhất với phần tử thứ hai
Tiếp đó, phần tử thứ nhất được so sánh với phần tử thứ ba. Hình 3 biểu diễn sự hoán vị giữa phần tử thứ nhất và phần tử thứ ba.
90 10 40 60 70
Hình 3 Đảo vị trí phần tử thứ nhất với phần tử thứ ba
Quá trình này được lặp lại cho đến khi phần tử thứ nhất được so sánh với phần tử cuối cùng của mảng. Mảng kết quả sau lần thực hiện đầu tiên được trình bày trong hình 4 bên dưới.
90 40 10 60 70
Hình 4: Mảng sau lần thực hiện đầu tiên
Bỏ qua phần tử đầu tiên, chúng ta cần tìm phần tử lớn thứ hai và hoán vị nó với phần tử
thứ hai của mảng. Hình 5 biểu diễn mảng sau khi được thực hiện lần hai.
90 70 10 60 40 num i:=0 i:=4 i:=0 i:=4 num i:=0 i:=4 num 40 90 10 40 num i:=0 i:=4 num i:=0 i:=4
Phần tử thứ ba phải được hoán vị với phần tử lớn thứ ba của mảng. Hình 6 biểu diễn mảng
sau khi hoán vị phần tử lớn thứ ba.
90 70 60 10 40
Hình 6: Mảng sau lần thực hiện thứ ba
Phần tử thứ tư phải được hoán vị với phần tử lớn thứ tư của mảng. Hình 7 biểu diễn mảng
sau khi hoán vị phần tử lớn thứ tư.
90 70 60 40 10
Hình 7: Mảng sau lần thực hiện thứ tư Hình 7 cũng biểu diễn mảng đã được sắp xếp.
Để lập trình cho bài toán này, chúng ta cần hai vòng lặp, một để tìm phần tử lớn nhất trong mảng và một vòng lặp kia để lặp quá trình thực hiện n lần. Thực chất quá trình phải lặp n-1 lần cho một phần tử của mảng bởi vì phần tử cuối cùng sẽ không còn phần tử nào để so sánh với nó. Vì vậy, chúng ta khai báo hai biến i và j để thao tác với hai vòng lặp for. Vòng lặp
for với chỉ số i được dùng để lặp lại quá trình xác định phần tử lớn nhất trong phần còn lại
của mảng. Vòng lặp for với chỉ số j được dùng để tìm phần tử lớn thứ i của mảng trong các phần tử từ phần tử thứ i+1 đến phần tử cuối cùng của mảng. Theo cách đó, phần tử lớn thứ nhất thứ i trong phần còn lại của mảng sẽ được đưa vào vị trí thứ i.
Đoạn mã lệnh khai báo chỉ số và vòng lặp thực hiện n - 1 lần với i như là chỉ số: i,j:integer;
for i := 1 to n-1 do
Đoạn mã lệnh cho vòng lặp từ phần tử thứ i + 1 đến phần tử thứ n của mảng: begin
For j:=i+1 to n do
Để hoán vị hai phần tử trong mảng chúng ta cần sử dụng một biến tạm. Bởi vì đây là thời điểm một phần tử của mảng được sao chép thành một phần tử khác, giá trị trong phần tử thứ hai sẽ bị mất. Để tránh mất giá trị của phần tử thứ hai, giá trị cần phải được lưu lại trong một biến tạm. Đoạn mã lệnh để hoán vị phần tử thứ i với phần tử lớn nhất trong phần còn lại của mảng là:
if (a[i] < a[j]) then begin tg = a[i]; a[i] = a[j]; a[j] = tg; end; end;
Chỉ số i có thể được dùng để hiển thị các giá trị của mảng như các câu lệnh trình bày bên dưới:
num
i:=0 i:=4
num
For i:=1 to n do
Write(‘mang sau khi sap xep’,a[i]:3);
- Ví dụ : Lập chương trình nhập một mảng một chiều gồm n số nguyên, in giá trị của mảng vừa nhập ra màn hình, sắp xếp mảng vừa nhập ra màn hình. Program sxmang; Var A: array[1..15]of integer; I, n,j,tg:integer; Begin
Write(‘ nhap so phan tu=’);readln(a); For i:=1 to n do
Begin
Write(‘a[‘,I,’]=’);readln(a[i]); End;
Write(‘gia tri mang vua nhap’); For i:=1 to n do
Write(a[i]:4);
for i := 1 to n-1 do For j:=i+1 to n do
if (a[i] < a[j]) then begin
tg = a[i];
a[i] = a[j];
a[j] = tg; end;
Write(‘gia tri mang vua săp xep la:’); For i:=1 to n do
Write(a[i]:4); Readln;
End
- Sắp xếp tăng dần: tương tự như sắp xếp giảm dần III. Mảng hai chiều:
3.1. Khai báo mảng hai chiều.
Có hai cách để khai báo:
Khai báo gián tiếp: - Cú pháp:
TYPE
Tên mảng=array[Kiểu_chỉ_dẫn_dòng, kiểu_chỉ_dẫn_cột] of Kiểu_phần_tử; Var biến mảng:tên mảng;
- Ví dụ:
TYPE
Hocsinh= array[1..50,1..50] of record; Var a: hocsinh;
Khai báo trực tiếp: - Cú pháp:
Biến mảng=array[Kiểu_chỉ_dẫn_dòng, kiểu_chỉ_dẫn_cột] of Kiểu_phần_tử;
- Ví dụ:
Ví dụ trên là mảng hai chiều có tên là A bao gồm gồm 2 hàng, 2 cột có cùng kiểu integer đó là:
A[1,1], A[1,2]; A[2,1],A[2,2];
2.2. Cách truy nhập vào các phần tử:
- Cách truy nhập một phần tử vào mảng ta viết như sau:
Biến mảng[chỉ số phần t];
- Ví dụ: a[2,3]: Truy nhập đến phần tử dòng 2 cột 3
2.3. Nhập xuất dữ liệu cho các phần tử của mảng hai chiều
- Ví dụ : Lập chương trình nhập một mảng hai chiều gồm 2 hàng, 3cột các số nguyên và in
mảng vừa nhập ra màn hình. Program mang; Var A: array[1..2,1..3]of integer; I, j:integer; Begin Write(‘ nhap các phần tử’); For i:=1 to 2 do For j:=1 to 3 do Begin Write(‘a[‘,I,’,’,j,’]=’);readln(a[I,j]); End;
Write(‘gia tri mang vua nhap’); For i:=1 to 2 do Begin For j:=1 to 3 do Write(a[I,j]:4); Readln; End.