- Đối với các kiểu dữ liệu cơ sở (real, integer, byte, char, Boolean), đã được pascal định nghĩa nên khi khai báo biến ta có thể dùng trực tiếp các kiểu dữ lệu này ngay. Còn các kiểu dữ liệu khác ta phải định nghĩa ra, mô tả ra một cách tường trình trong phần khai báo của chương trình sau từ khóa TYPE. Sau đó sẽ khai báo các biến thuộc kiểu dữ liệu mới mô tả.
- Cú pháp: type
Tên kiểu= mô tả xây dựng kiểu Sau đó khai báo biến với kiểu dữ liệu này - Vd: TYPE
color = (red,blue,green);
Var c:color; IV. Biểu thức
- Bao gồm một tập các toán tử tác động lên một tập các số hạng để thực hiện một công thức toán học
Vd: 3+ PI * sin(x);
- Các loại biểu thức bao gồm:
+ Biểu thức số học: là biểu thức cho kết quả giá trị số
+ Biểu thức logic: là biểu thức cho kết quả giá trị logic(đúng hoặc sai)
+ Biểu thức quan hệ: là biểu thức chỉ chứa các phép toán quan hệ và cho kết quả giá trị logic
+ Biểu thức xâu ký tự: là biểu thức cho kết quả hằng xâu ký tự - VD: (3-4*(2+5))/8
V. Câu lệnh
Câu lệnh được chia ra làm hai loại:
- Câu lệnh đơn giản gồm có: + Lệnh gán(:=) + Lời gọi procedure + Lệnh nhảy: go to
Begin… End; + Câu lệnh lựa chọn If…then…else…… Case….of….. + Các vòng lặp: For….to……do Repeat….write…. While….do…. + Câu lệnh with….. VI. Lệnh gán
- Phép gán được dung để gán giá trị của một biểu thức, một hằng vào một biến phép gán được ký hiệu là (: =)
- Cú pháp: <Biến>:=<Biến thức>
- VD: x:=6: Có nghĩa là biến x nhận giá trị bằng 6 Y:=18+y+SQRT(x);
------
BÀI 4: LỆNH NHẬP VÀ XUẤT DỮ LIỆU I. Lệnh in dữ liệu ra màn hình
-Để viết tư liệu ra màn hình ta sử dụng các thủ tục sau: + Write(gt1,gt2,…,gtn); (1)
+ Writeln(gt1,gt2,…,gtn); (2) + Writeln(3)
Trong đó: gt, gt2,…,gtn là các giá trị cần viết ra màn hình. Nó có thể là giá trị của hằng, biến hay biểu thức.
-Ý nghĩa: +Câu lệnh (1) viết các giá trị theo thứ tự ra màn hình và con trỏ ở sau giá trị cuối cùng khi viết xong.
+Câu lệnh (2) được thực hiện giống câu lệnh (1) chỉ khác khi viết xong con trỏ nhảy xuống đầu dòng tiếp theo
+Câu lệnh (3) không viết gì cả mà chỉ thực hiện di chuyển con trỏ xuống đầu dòng tiếp theo -VD: + Write (5); => 5 + Writeln (5); => 5 + Write (5) ; => 5 7 + Write (7) ; + Writeln (5); => 5 + Writeln (7); 7 II. Lệnh nhập - Để nhập dữ liệu từ bàn phím ta sử dụng các thủ tục sau : Read (b1,b2,…,bn);(1) Readln(b1,b2,…,bn);(2) Readln;(3)
+ Trong đó : b1, b2, …, bn là các biến vì chỉ là biến mà thôi. - Ý nghĩa :
+ Câu lệnh (1) cho phép nhập dữ liệu từ bàn phím vào các biến tương ứng. Con trỏ ở vị trí cuối cùng khi nhập xong.
+ Câu lệnh (2) thực hiện giống câu lệnh (1) chỉ khác con trỏ nhảy xuống đầu dòng tiếp theo khi nhập xong.
+ Câu lệnh (3) ngừng thực hiện chương trình cho đến khi ấn phím Enter.
III. Lệnh nhập xuất
Để nêu rõ giái trị được nhập người ta thường đưa ra các thông báo khi nhập giá trị đó và sử dụng kết hợp giữa Write, Readln như sau:
Write(‘nhập đáy lớn a =’); readln(a); Write(‘nhập đáy bé b=’); readln (b);
VD1: Viết chương trình tính diện tích hình thang với đáy lớn a, đáy bé b, chiếu cao h nhập
từ bàn phím.
Program hinhthang; Var a,b,s,h:real; Begin
Write(‘nhập đáy lớn a =’);readln(a); Write(‘nhập đáy bé b=’);readln (b); Write(‘nhập chiều cao h =’);Readln(h);
Write(‘dien tich la S =’,s:3:1); Readln;
End.
VD2:Tính diện tích hình tam giác với 3 số a, b, c tương ứng với 3 canh tam giác.
Var a,b,c,s,p:real; Begin
Write (‘nhập a,b,c =’);readln(a,b,c); p:=(a+b+c);
s:=sqrt (p(p-a)(p-b)(p-c)); write(‘diện tích tam giác là S=’,s:3:1); readln;
end.
BÀI 5: CÁC LỆNH CÓ CẤU TRÚC
I. Câu lệnh ghép
-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