Lập trình Pascal

Bài 1. Cấu trúc chương trình Pascal

Tóm tắt lý thuyết

Hiển thị

I. Cấu trúc cơ bản chương trình Pascal

Một chương trình Pascal đầy đủ sẽ có dạng sau:

	Program Ten_chuong_trinh; (*Dòng tiêu đề*)
	(* Phần khai báo *)        
	Uses ....;  (*khai báo các Unit*)
	Label .... ; (* khai báo các nhãn *)
	Type .... ; ( * khai báo các kiểu dữ liệu mới *)
	Const ....; (*khai báo các hằng ...  *)
	Var ....;  (* khai báo biến, mảng, bản ghi ...*)
	Procedure.... (* khai báo thủ tục *)
	....
	Function .... (* khai báo hàm *) 
	...
	(* Thân chương trình *)
	BEGIN
	(* Các câu lệnh của chương trình *)
	END. (*Kết thúc chương trình *).

Chú ý:

- Lời giải thích được đặt giữa hai dấu { } hoặc (* *) giúp chương trình dễ hiểu hơn mà không ảnh hưởng đến quá trình làm việc của chương trình (khi dịch, chương trình dịch bỏ qua những chú thích).

- Trong các phần khai báo ở trên thì phần thân chương trình là bắt buộc, các phần khác được khai báo khi cần thiết.

II. Các câu lệnh cơ bản

1. Các lệnh đơn giản

- Clrscr; { Xoá sạch màn hình, đưa con trỏ về ô (1, 1) }

- GoToXY; { Đưa con trỏ đến ô (x, y); x, y là các giá trị nguyên }

- Lệnh gán: dùng để gán giá trị của một biểu thức cho một biến. Lệnh có dạng:biến:=biểu thức;
+ Chức năng của lệnh: Đầu tiên máy sẽ tính giá trị của biểu thức ở vế phải, sau đó sẽ gán giá trị tính được này cho biến ở vế trái.

- Lệnh xuất dữ liệu ra màn hình(Write, Writeln):
Cú pháp có ba dạng sau:
{1} Write(<Danh sách các biểu thức>);
{2} Writeln(Danh sách các biểu thức);
{3} Writeln; {Chỉ có tác dụng đưa con trỏ tới đầu dòng mới tiếp theo}
Trong đó: <Danh sách các biểu thức> có dạng: <Biểu thức 1>, <biểu thức 2>, ....

+ Chức năng của các câu lệnh trên: cho phép chương trình in ra màn hình các dữ liệu, kết quả, hay các thông báo cần thiết.
Dạng 1: lần lượt tính và viết ra màn hình giá trị của các biểu thức tại vị trí hiện hành của con trỏ theo thứ tự viết trong lệnh. Sau lệnh này vị trí con trỏ ở ngay sau giá trị của biểu thức cuối cùng.
Dạng 2 chỉ khác dạng 1 ở chỗ là sau đó con trỏ sẽ ở đầu dòng mới.

- Lệnh nhập dữ liệu:
Cú pháp:
Readln(<Danh sách các biến>); {1}
Readln; {2}
Trong đó: <Danh sách các biến> có dạng: <biến 1>, <biến 2> ...
+ Chức năng:
Dạng 1: khi thực hiện lệnh này, máy tính sẽ tạm dừng để người sử dụng nhập dữ liệu vào từ bàn phím (dữ liệu nhập vào tương ứng với các biến trong danh sách các biến).
Dạng 2: dùng để tạm dừng chương trình, muốn chạy tiếp thì ấn Enter (lệnh này thường được sử dụng khi ta muốn xem kết quả chạy của chương trình xuất hiện trên màn hình).

2. Các câu lệnh có cấu trúc

a). Câu lệnh ghép
Là một nhóm các câu lệnh (hay một khối lệnh) được đặt giữa hai từ khoá Begin và End.
Dạng câu lệnh tổng quát:

	Begin
		<Câu lệnh 1>;
		<Câu lệnh 2>;
		    ...........
		<Câu lệnh n>;
	  End;     {Cuối câu lệnh trước từ khoá End có thể không cần có dấu chấm phảy (;).}

b). Lệnh lựa chọn (hay câu lệnh rẽ nhánh)
lệnh If:
Cú pháp câu lệnh:

	IF <biểu thức logic> THEN  <lệnh 1>
   	     [ ELSE <lệnh 2>; ]
	{ Lệnh trước từ khoá ELSE không có dấu chấm phảy (;); Phần giữa hai dấu [ ] có thể không có.}

+ Chức năng của lệnh: Khi thực hiện lệnh này máy sẽ kiểm tra <biểu thức lôgic>. Nếu nó nhận giá trị TRUE thì thực hiện <lệnh 1>. Trong trường hợp <biểu thức lôgic> nhận giá trị FALSE, máy sẽ thực hiện lệnh sau từ khoá ELSE (lệnh 2) nếu có ELSE, ngược lại không có ELSE thì máy sẽ bỏ qua và thực hiện câu lệnh tiếp theo của chương trình nếu có.
Câu lệnh CASE:
Cấu trúc lệnh:

	CASE <biểu thức> OF
		Tập hằng 1: <lệnh 1>;
		Tập hằng 2: <lệnh 2>;
		.....................
		Tập hằng n: <lệnh n>;
		[ ELSE 
			<lệnh n+1>;  ]
	            END; {of CASE}
	(*    Giá trị của biểu thức và giá trị trong tập hằng phải có cùng kiểu và phải là kiểu vô hướng đếm được như: kiểu nguyên, kiểu logic, kiểu kí tự, kiểu liệt kê)   *)

+ Chức năng của lệnh: Khi thực hiện lệnh này máy sẽ so sánh giá trị của <biểu thức> với các giá trị của tập hằng. Nếu tập hằng i là tập đầu tiên chứa giá trị của <biểu thức> thì máy sẽ thực hiện <lệnh i> (cũng có thể là thực hiện một khối lệnh), sau đó thoát khỏi câu lệnh CASE. Trong trường hợp không có tập hằng nào chứa giá trị của <biểu thức> thì máy sẽ thực hiện <lệnh n+1> (nếu có ELSE) rồi mới thoát khỏi câu lệnh CASE, ngược lại nếu không có ELSE thì máy sẽ thoát ra khỏi câu lệnh CASE ngay.

c). Câu lệnh lặp
♦ Câu lệnh FOR:
Cú pháp lệnh:

	- Dạng tiến:
	FOR biến:=(biểu thức 1) TO (biểu thức 2) DO <lệnh>;
   - Dạng lùi:
	FOR biến:= (biểu thức 1) DOWNTO (biểu thức 2) DO <lệnh>;

+ Hoạt động của vòng lặp FOR dạng tiến:
(1) Đầu tiên biến sẽ nhận giá trị của biểu thức 1.
(2) Kiểm tra điều kiện (biến <= biểu thức 2).
(3) Nếu điều kiện này sai thì máy thoát khỏi vòng lặp FOR để thực hiện lệnh tiếp theo nếu có. Điều kiện đúng thì máy sẽ thực hiện <lệnh>, sau đó biến được tăng lên một giá trị và quay lại bước (2).
+ Hoạt động của vòng lặp FOR dạng lùi:
(1) Đầu tiên biến nhận giá trị của biểu thức 1.
(2) Kiểm tra điều kiện (biến >=biểu thức 2).
(3) Nếu điều kiện sai thì máy thoát ra khỏi vòng lặp này. Điều kiện đúng thì máy thực hiện <lệnh>, sau đó biến được giảm đi một giá trị và quay lại bước (2).

♦ Câu lệnh REPEAT:
Cú pháp lệnh:

    REPEAT
		<lệnh 1>;
		<lệnh 2>;
		...........
		<lệnh n>;
    UNTIL <biểu thức logic>;

+ Hoạt động của vòng lặp Repeat...Until: Máy lần lượt thực hiện các lệnh: <lệnh 1>, <lệnh 2>, ..., <lệnh n>, sau đó kiểm tra <biểu thức logic>. Nếu nó nhận giá trị FALSE thì quay lại đầu vòng lặp và thực hiện tiếp các lệnh trong vòng lặp. Nếu nhận giá trị TRUE thì thoát khỏi vòng lặp. Như vậy, các lệnh nằm giữa Repeat...Until được thực hiện ít nhất một lần.
♦ Câu lệnh While:
Cú pháp lệnh:

	WHILE <biểu thức logic> DO <lệnh>;

+ Hoạt động của vòng lặp While...Do: trước tiên máy kiểm tra <biểu thức logic>. Nếu nó nhận giá trị TRUE thì thực hiện <lệnh> và sau đó quay lại kiểm tra giá trị của <biểu thức logic>, cứ tiếp tục như thế. Nếu nó nhận giá trị FALSE thì thoát khỏi vòng lặp. Trong vòng lặp này có thể lệnh không được thực hiện lần nào nếu biểu thức nhận giá trị FALSE ngay từ đầu.

3. Các lệnh GoTo, Break và Exit
♦ Lệnh nhảy:
Cú pháp lệnh:

	GoTo NHAN;

Trong đó: tên nhãn được khai báo ở đầu chương trình sau từ khoá LABLE.
+ Chức năng của lệnh: Khi gặp lệnh này máy sẽ nhảy tới thực hiện câu lệnh có nhãn là NHAN. Chú ý: Lệnh GoTo chỉ cho phép nhảy từ vị trí này tới vị trí khác trong thân một hàm hay một thủ tục, từ một vị trí trong thân vòng lặp ra ngoài.

♦ Lệnh Break: Trong thân các lệnh chu trình như FOR, WHILE, REPEAT khi gặp lệnh Break thì máy sẽ thoát khỏi chu trình. Nếu có nhiều chu trình lồng nhau, máy sẽ thoát khỏi chu trình trong nhất chứa lệnh Break.
♦ Lệnh Exit: Nếu lệnh Exit thuộc chương trình chính thì sự thực hiện lệnh này sẽ làm chấm dứt chương trình chính. Nếu nó thuộc chương trình con thì sẽ thoát ra khỏi chương trình con trở về chỗ gọi nó.



Câu hỏi, ví dụ, bài tập

Câu 1: Cho chương trình sau:


		Uses Crt;
		Begin
		  Clrscr;
		  Writeln(’xx...x’); {80 chu x}
		End.
		
		

Hỏi sau khi thực hiện chương trình trên, con trỏ màn hình nằm ở vị trí nào?

Trả lời

Câu 2: Có cách nào viết một kí tự 'a' vào góc phải dưới của màn hình hay không?

Trả lời

Câu 3: Cho chương trình sau:


		Uses Crt;
		Var x,y: real;
		Begin
		  Readln(x);
		  y:= 5.56332362;
		  x:= x + y;
		  y:= x - y:
		  x:= x - y;
		End.
		
		

Hỏi sau khi thực hiện chương trình trên, x bằng bao nhiêu?

Trả lời

Câu 4: Cho chương trình sau:


		Uses Crt;
		Var x: integer;
		Begin
		  Readln(x);
		  If x>5 then x:= 5   Else x:= 4;
		  If x>5 then x:= 4 Else x:= 5;
		End.
		
		

Hỏi sau khi thực hiện chương trình trên, x bằng bao nhiêu?

Trả lời

Câu 5: Cho chương trình sau:


		Uses Crt;
		Var i,n,s: integer;
		Begin
		  n:= 100;
		  s:= 0;
		  For i:=1 to n do s:=s+i;
		End.
		
		

Hỏi sau khi thực hiện chương trình trên, i bằng bao nhiêu?

Trả lời

Câu 6: Cho chương trình sau:


		Uses Crt;
		Var i,s: integer;
		Begin
		s:=0;
		i:=100;
		While i<100 do
		   Begin
		           s:=s+i;
		                       inc(i);
		   End;
		End.
		
		

Hỏi sau khi thực hiện chương trình trên, s bằng bao nhiêu?

Trả lời

Câu 7: Cho chương trình sau:


		Uses Crt;
		Var i,s: integer;
		Begin
		s:=0;
		i:=101;
		Repeat
		   s:=s+i;
		   inc(i);
		Until i>100;
		End.
		
		

Hỏi sau khi thực hiện chương trình trên, s bằng bao nhiêu?

Trả lời

Câu 8: Cho bảng vuông gồm 4 số:

a b

c d

thường gọi là một ma trận cấp hai. Số ad-bc được gọi là định thức của ma trận đó. Hãy lập chương trình nhập từ bàn phím một ma trận cấp hai, sau đó tính ra định thức của ma trận.

Yêu cầu các số a, b, c, d được nhập trên màn hình phải nằm đúng vị trí của chúng trong bảng.

Trả lời

Câu 9: Hãy giải bài tập tương tự cho ma trận cấp 3:

a b c

d e f

g h i

với định thức tương ứng được tính theo công thức aei + bfg + cdh - gec - dbi - ahf.

Trả lời

Câu 10: Hãy lập chương trình, tính:

$\sqrt {2 + \sqrt {2 + ... + \sqrt 2 } } $

Với n dấu căn, n nhập từ bàn phím.

Trả lời

Câu 11: Tính tổng:

$\frac{1}{3} + \frac{1}{9} + \frac{1}{{27}} + ...$

với sai số ((\varepsilon)) < 0.000001, tức tính tổng trên cho tới khi số hạng cuối cùng ((\frac{1}{3^n})) < 0.000001.

Trả lời

Câu 12: Tạo một menu trên màn hình dạng như sau:

1- Tính tổng 1 + 2 + ... + 100

2- Tính tích 1.2 ... 30

3- Tính tổng ((\frac{1}{3} + \frac{1}{9} + \frac{1}{27} +...)) với sai số ((\varepsilon)) < 0.000001

để thực hiện các công việc tương ứng.

Trả lời

Câu 13: Nhiệt độ đo theo thang F và thang C liên hệ với nhau bởi công thức: ((t_F =\frac{9}{5} t_C + 32)). Hãy lập bảng so sánh 2 độ đo tương ứng với tC từ 0 đến 100 (((^0C))).

Trả lời

Câu 14: Cho dãy số thực ((a_1, a_2, ..., a_{10})). Hãy tính tổng ((a_1 + a_{2}^{2} + ... + a_{10}^{10})). Dãy số được nhập từ bàn phím, kết quả đưa ra màn hình.

Trả lời

Câu 15: Cho trước số nguyên dương n < 1000. Hãy đưa ra cách đọc số đó. Ví dụ nếu n = 102 thì kết quả là: Mot tram le hai.

Trả lời

Câu 16: Cho số tự nhiên n và dãy số thực ((a_1, a_2, ..., a_n)). Hãy đổi chỗ các phần tử của dãy sao cho các phần tử dương nằm ở đầu dãy, các phần tử âm nằm ở cuối dãy. Đưa kết quả ra màn hình theo thứ tự đó.

Trả lời

Câu 17: Cho thủ tục tính USCLN của hai số nguyên dương:


		Function US(a,b:integer):integer;
		Begin
		While a<>b do
		   if a>b then a:=a-b else if b>a then b:=b-a;
		us:=a;
		End.
		
		

Hãy sử dụng hàm đó tính USCLN của 2 số nguyên dương nhập từ bàn phím.

Trả lời

Câu 18: Cho thủ tục đổi chỗ hai phần tử thứ i và j của dãy số thực ((a_1, a_2, ..., a_n)):


		Procedure doi_cho(i,j:integer);
		Var tg: real;
		Begin
		    tg:=a[i];
		    a[i]:=a[j];
		    a[j]:=tg;
		End.
		
		

Hãy sử dụng thủ tục đó làm lại bài 16.

Trả lời

Câu 19: Cho các số thực s, t.

Hãy tính biểu thức S = g(1.2, s) + g(t, s) - g(2s-1, st) với g(a, b) = $\frac{{{a^2} + {b^2}}}{{{a^2} + 2ab + {b^2} + 4}}$

Dữ liệu ban đầu nhập từ bàn phím. Kết quả đưa ra màn hình.

Trả lời

Câu 20: Cho một dãy các đoạn thẳng (([a_1, b_1], [a_2, b_2], ..., [a_n, b_n])). Hỏi có điểm nào trên trục số thuộc tất cả các đoạn thẳng hay không? Hãy lập chương trình để giải bài toán trên. Dữ liệu nhập vào từ bàn phím.

Trả lời