Bài 29 FULL SCREEN cho DOSBOX

Leave a comment

Không biết đặt mục này vào đâu nên cho nó thành một bài.
Nhiều bạn muốn phóng to toàn màn hình cửa sổ Dosbox
Muốn vậy bạn chỉ việc bấm đồng thời hai phím ALT và ENTER, bấm lại ALT-ENTER sẽ trở về như cũ

Bài 28 Runtime Error 200

Leave a comment

Đúng ra là tiếp tục bài mới. Nhưng vì có nhiều bạn dính lỗi 200 nên chúng ta xét qua vấn đề này.
Lỗi 200 -Runtime Error 200- (chia cho Zero) thường gây ra bởi một lỗi trong phiên bản cũ của Turbo Pascal và trình biên dịch Borland Pascal (phiên bản 6 và trước đó). Các lỗi đã được cụ thể trong đơn vị CRT.ASM với các trình biên dịch.

Chúng ta không bàn tới nguyên nhân.

Một giải pháp là biên dịch lại mã nguồn bằng cách sử dụng một phiên bản sau này của Pascal

Hoặc bạn cũng có thể cài bản vá lỗi. Ví dụ PatchCRT by Kennedy Software.

Cá nhân chúng tôi khuyên bạn nên cài bản mới của Turbo Pascal.

Bài 27 Một Số Hàm Số

Leave a comment

Trước khi tiếp tục, chúng ta “ngó qua” một số Hàm số của Pascal
Dưới đây là một số hàm được Pascal thiết kế sẵn. Người sử dụng có thể gọi và sử dụng chúng mà không cần phải khai báo unit qua câu khai báo USES

 

Hàm

Ý nghĩa

Kiểu đối số

Kiểu trả về

Ví dụ

ABS(x) Trị tuyệt đối x Số nguyên, số thực Giống đối số Abs(-2) ð 2
SQR(x) Bình phương x Số nguyên, số thực Giống đối số Sqr(2) ð 4
SQRT(x) Căn bậc hai x Số nguyên, số thực Số thực Sqrt(9) ð 3
EXP(x) Hàm ex Số nguyên, số thực Số thực Exp(3) ð
LN(x) Hàm Số nguyên, số thực Số thực Ln(2) ð
SIN(x) Hàm lượng giác Số nguyên, số thực Số thực Sin(PI) ð 0
COS(x) Hàm lượng giác Số nguyên, số thực Số thực Cos(PI) ð 1
ARCTAN(x) Hàm lượng giác Số nguyên, số thực Số thực Arctan(1) ð
SUCC(x) Succ(x) ï x + 1 Số nguyên Số nguyên  
PRED(x) Pred(x) ï x -1 Số nguyên Số nguyên  
ROUND(x) Làm tròn Số thực Số nguyên Round(8.6) ð 9
TRUNC(x) Làm tròn Số thực Số nguyên Trunc(8.6) ð 8
ORD(x) Lấy mã ASCII Ký tự Số nguyên Ord(‘a’) ð 97
CHR(x) ký tự ï mã ASCII Số nguyên Ký tự Chr(65) ð ‘A’
ODD(x) Kiểm chẳn lẽ Số nguyên Logic Odd(5) ð True

Bài 26 Cấu trúc rẽ nhánh và lựa chọn phần 3

Leave a comment

Chúng ta tiếp tục phân tích vài ví dụ đơn giản.

program Re_Nhanh;

var
i: Integer;

begin
Writeln(‘Nhap vao mot so’);
Readln(i);
if i > 5 then
Writeln(‘So ban nhap vao lon hon 5’);
end.

Có một ký hiệu “lạ” là “>“. Thật ra cũng chẳng lạ lùng gì, tuy nhiên chúng ta chưa bàn tới nên cứ cho nó là lạ vậy. Đây là một trong những operators hay sử dụng trong cấu trúc rẽ nhánh

> Lớn hơn
< Nhỏ hơn
>= Lớn hơn hoặc bằng
<= Nhỏ hơn hoặc bằng
= Bằng
<> Không bằng

Trong chương trình trên, sau khi người sử dụng nhập một số từ bàn phím nó sẽ được gán vào biến i. Tiếp theo ta sẽ so sánh biến i với 5 bằng dấu >
Nếu muốn ta có thể phất triển thêm dựa trên cấu trúc IF…ELSE

program Re_Nhanh2;

var
i: Integer;

begin
Writeln(‘Nhap vao mot so’);
Readln(i);
if i > 5 then
Writeln(‘So lon hon 5’)
else
Writeln(‘So khong lon hon 5’);
end.

Lưu ý là ta trả lời “So khong lon hon 5” chứ không phải là “So nho hon 5” vì trường hợp sô bằng 5 cũng sẽ rẽ nhánh ELSE

Giả sử bạn muốn tìm số lớn hơn 5 nhung nhỏ hơn 20 thì sao. Hoặc bạn muốn tìm số nhỏ hơn 5 hoặc lớn hơn 20. Ta cần sử dụng AND hoặc OR

program Re_Nhanh3;

var
i: Integer;

begin
Writeln(‘Nhap mot so’);
Readln(i);
if (i > 5) and (i < 20) then
Writeln('So năm trong khoang 5-20');
end.

Bài 25 Cấu trúc rẽ nhánh và lựa chọn phần 2

Leave a comment

Phần trước là tổng hợp lại lý thuyết. Chúng ta sẽ xét vài ví dụ trong phần này

1/Giả sử ta cần rẽ nhánh với câu hỏi đơn giản sau
-Chia số a cho số b
-NẾU b khác không thì TRẢ LỜI KẾT QUẢ
-Nếu b = 0 thì KHÔNG LÀM GÌ CẢ

Rõ ràng ta sẽ cần lệnh IF
Đây là ví dụ

program Chia_Hai_So;
Var a,b: Integer;
Begin
Write( ‘Nhập a: ’); Readln(a);
Write( ‘Nhập b: ‘); Readln(b);
If b <> 0 then
Write( ‘Thương hai số vừa nhập: ’,a/b:5:2);
Readln;
End.

Phát triển chương trình trên thêm một bước, thay vì KHÔNG LÀM GÌ CẢ, ta sẽ trả lời người dùng là không thể chia cho một số 0. Ta cần phải sử dụng cấu trúc IF…ELSE

program Chia_Hai_So2;
Var a,b: Integer;
Begin
Write( ‘Nhập a: ’); Readln(a);
Write( ‘Nhập b: ‘); Readln(b);
If b <>0 then
Write( ‘Thương hai số vừa nhập: ’,a/b:5:2);
Else
Write( ‘Không thể chia cho 0’ );
Readln;
End.

2/Một bài toán khác: Viết chương trình nhập vào một tháng, sau đó in lên màn hình tháng đó có bao nhiêu ngày. Có lẽ bạn cũng sẽ đoán ra la ta cần sử dụng cấu trúc lựa chọn CASE. Lưu ý, bài toán này vẫn có thể sử dụng IF…ELSE, ví dụ tháng chẵn mà nhỏ hơn 7 thì sao, tháng chẵn lớn hơn 7 thì sao….Tuy nhiên ở đây chúng ta sẽ dùng CASE. Điều này cũng cho ta thấy, cùng một bài toán có thể có rất nhiều lời giải khác nhau, bạn không cần cứng nhắc theo một kiểu, cứ mặc sức “sáng tạo”

program Ngay_Thang;
Var T: Integer;
Begin
Write( ‘Nhập vào một tháng: ’); Readln(T);
CASE T OF
1, 3, 5, 7, 8, 10, 12: Write( ‘Tháng có 31 ngày.’);
4, 6, 9, 11: Write( ‘Tháng có 30 ngày.’);
2: Write( ‘Tháng có 28 (nhuần 29) ngày.’);
End;
Readln;
End.

Bài 24 Cấu trúc rẽ nhánh và lựa chọn

Leave a comment

Phần 24 này chúng ta sẽ thảo luận về cấu trúc rẽ nhánh và lựa chọn

Cấu trúc rẽ nhánh có lẽ phải gọi là “trái tim” của Lập trình nói chung. Trừ những chương trình quá đơn giản chỉ có ý nghĩa học tập, những chương trình đích thực đều phải có cấu trúc rẽ nhánh.

CẤU TRÚC RẼ NHÁNH

1.Dạng Không Đầy Đủ
Cú pháp: IF Điều kiện THEN Công việc;
Nếu điều kiện là đúng thì thực hiện công việc (ngược lại là điều kiện sai thì không thực thi công việc).

2.Dạng Đầy Đủ
Cú pháp: IF Điều kiện THEN Công việc 1
ELSE Công việc 2;
Nếu điều kiện là đúng thì thực hiện công việc 1, ngược lại là điều kiện sai thì thực thi công việc 2. Chú ý trước ELSE không có dấu ; (chấm phẩy).

CẤU TRÚC LỰA CHỌN
1.Dạng Không Đầy Đủ
Cú pháp: CASE biến OF
Hằng 1a, 1b,…, 1x: Công việc 1;
Hằng 2a, 2b,…, 2x: Công việc 2;

Hằng na, nb,…, nx: Công việc n;
END;

Ý nghĩa: Trước hết kiểm tra giá trị của biến có bằng một trong các hằng 1a, 1b,…, 1x hay không. Nếu đúng thì thực hiện công việc 1, rồi kết thúc lệnh (thực hiện tiếp các lệnh sau END; nếu có). Nếu không, thì kiểm tra giá trị của biến có bằng một trong các hằng 2a, 2b,…, 2x hay không. Nếu đúng thì thực hiện công việc 2, rồi kết thúc lệnh (thực hiện tiếp các lệnh sau END). Nếu không thì cứ tiếp tục kiểm tra như vậy. Nếu giá trị của biến không bằng bất cứ hằng nào từ 1a đến nx thì câu lệnh CASE kết thúc mà không làm gì cả.

2.Dạng Đầy Đủ
Cú pháp: CASE biến OF
Hằng 1a, 1b,…, 1x: Công việc 1;
Hằng 2a, 2b,…, 2x: Công việc 2;

Hằng na, nb,…, nx: Công việc n;
ELSE

END;
Ý nghĩa: Khác dạng không đầy đủ ở chỗ nếu giá trị của biến không bằng bất cứ hằng nào từ 1a đến nx thì câu lệnh CASE sẽ thực thi công việc N+1.

Bài 23 – Read và Readln

Leave a comment

Chúng ta thảo luận riêng Read và Readln đơn giản vì trong bước đầu lập trình, bạn sẽ sử dụng rất nhiều

Cú pháp:

(1) Readln(Biến_1, biến_2, biến_n);
(2) Read(Biến_1, biến_2, biến_n);

Khi thực hiện lệnh này, máy dừng lại chờ người dùng nhập vào đủ n lần nhập dữ liệu tương ứng với n biến.
Ngoài ra, ta có thể sử dụng thủ tục Readln để dừng chương trình và chờ người dùng ấn một phím bất kỳ để tiếp tục, ký tự được ấn không hiển thị lên màn hình.

Chú ý:

– Các biến trong thủ tục Readln phải thuộc kiểu nguyên, thực, ký tự hoặc xâu ký tự. Do đó, ta không thể nạp từ bàn phím giá trị True hoặc False các biến kiểu Boolean.
– Dữ liệu nhập vào phải tương ứng với kiểu đã khai báo. Phải ấn phím Enter để thực hiện lệnh nhập sau khi gõ xong giá trị cần nhập.

Cái này rất quan trọng, chúng ta thường quen với “hiện đại hóa” ví dụ hỏi năm chúng ta chỉ cần nhập 2012 thôi mà không ENTER
Vì vậy trong bước đầu, nên có dòng hướng dẫn người sử dụng ấn phím ENTER

Ví dụ : Với a, b là hai biến nguyên, x là biến thực. Xét đoạn chương trình sau:

Readln(a, b);
Readln(x);

Nếu ta gõ các phím: 4 454 6.5 87 -> Enter
Kết quả: a nhận giá trị 4, b nhận giá trị 454. Các ký tự còn lại bị bỏ qua và không được xét trong thủ tục Readln(x) tiếp theo. Như vậy, máy dừng lại ở câu lệnh Readln(x) để chờ nhập số liệu cho biến x.

Lúc này nếu nhập tiếp 4 454 6.5 87 -> Enter thì giá trị của x sẽ là 4

Nhìn “na ná” như nhau, tuy nhiên Read khác hẳn Readln. Tuy nhiên chúng ta sẽ bàn tới Read sau.

Bài 22 – Chuỗi và Chuyển đổi kiểu dữ liệu phần 2

Leave a comment

Chúng ta sẽ tiếp tục với vấn đề biến đổi kiểu dữ liệu
Đôi khi chúng ta cần chuyển đổi Từ Integer sang String hay ngược lại.

Trong những trường hợp như vậy ta sử dụng những lệnh sau

Lệnh Str: Lệnh Str sẽ chuyển kiểu Integer sang kiểu String.
Đây là một ví dụ:

program Chuyen_Doi_Kieu;

var
s: String;
i: Integer;

begin
i := 123;
Str(i,s);
end.

Chương trình rất đơn giản, có nhiệm vụ chuyển SỐ 123 thành CHUỖI ‘123’

Lệnh Val: Ngược lại lệnh Val sẽ chuyển String qua Integer
Đây là một ví dụ

program Chuyen_Doi_Kieu2;

var
s: String;
i: Integer;
e: Integer;

begin
s := ‘123’;
Val(s,i,e);
end.

Trong thực tế bạn sẽ sử dụng rất nhiều. Ví dụ bần tính toán với chuỗi năm sinh chẳng hạn.

Bài 21 – Chuỗi và Chuyển đổi kiểu dữ liệu

Leave a comment

Phần 21 này chúng ta sẽ thảo luận về chuỗi

Trước khi định nghĩa chuỗi ta cần hiểu về ký tự
Char – Ký tự: là một kiểu dữ liệu. Kiểu Char dùng để biểu diễn các giá trị là các ký tự thuộc bảng chữ cái: ‘A’, ‘b’, ‘x’,… các con số: 0..9 hoặc các ký tự đặc biệt : ‘!’, ‘@’, ‘#’, ‘$’, ‘%’, ‘&’, ‘*’,…

Từ Char ta có String – Chuỗi: String là kiểu dữ liệu chứa các giá trị là nhóm các ký tự hoặc chỉ một ký tự, kể cả chuỗi rỗng. Độ dài tối đa của một biến kiểu String là 255, tức là nó có thể chứa tối đa một dãy gồm 255 ký tự.

‘Hello’ là một chuỗi
‘vn4000’ là một chuỗi
‘Xin chao cac ban’ cũng là một chuỗi.

Bạn có thể truy cập từng ký tự trong chuỗi bằng cách chỉ ra số thứ tự của ký tự đó trong chuỗi.
Bạn cần sử dụng cập dấu […]. Đây là một ví dụ

program Chuoi_Ky_tu;

var
s: String;
c: Char;

begin
s := ‘Hello’;
c := s[1];{c = ‘H’}
end.

Trong ví dụ trên, biến c sẽ được gán giá trị tại vị trí thứ nhất của chuỗi s, và sẽ có giá trị là ‘H’

Lệnh Length
: Bạn cũng có thể biết được độ dài của chuỗi, hay nói cách khác là có bao nhiêu ký tự trong chuỗi bằng cách sử dụng lệnh Length. Dưới đây là một ví dụ

program Chuoi_Ky_tu2;

var
s: String;
l: Integer;

begin
s := ‘Hello’;
l := Length(s);{l = 5}
end.

Chuỗi ‘Hello’ có tổng cộng 5 ký tự, trong ví dụ trên biến l sẽ có trị bằng chiều dài của chuỗi s, tức là có giá trị bằng 5.

Chuỗi ‘Xin chao ban’ có thể coi như bao gồm nhiều chuỗi. Ví dụ có thể coi ‘Xin chao ban’ như là chuỗi ‘Xin chao’ + ‘ban’, vấn đề là trong lập trình, rất nhiều khi ta cần phải biết vị trí của một chuỗi trong một chuỗi khác. Ví dụ ta cần biết vị trí của chuỗi ‘chao’ trong ‘Xin chao ban’ chẳng hạn

Lệnh Pos: Để tìm vị trí của một chuỗi trong một chuỗi khác, ta sử dụng lệnh Pos. Lệnh Pos có hai tham số,
1-Tham số đầu là chuỗi cần tìm (‘chao’ chẳng hạn)
2-Tham số sau là chuỗi gốc (‘Xin chao ban’)

Đây là một ví dụ.

program Chuoi_Ky_tu3;

var
s: String;
p: Integer;

begin
s := ‘Hello world’;
p := Pos(‘world’,s);
end.

Lệnh Delete: ta sử dụng lệnh Delete để xóa một hoặc nhiều ký tự trong chuỗi. Lệnh Delete có 3 tham số:
1-Chuỗi cần xóa ký tự
2-Vị trí bắt đầu xóa
3-Độ dài cần xóa, nói cách khác số ký tự cần xóa

Đây là một ví dụ:

program Chuoi_Ky_tu4;

var
s: String;

begin
s := ‘Hello’;
Delete(s,1,1);{s = ‘ello’}
end.

Lệnh Copy: Bạn có thể dùng lệnh Copy để sao chép một hay nhiều ký tự trong chuỗi. Lệnh Copy có 3 tham số
1-Chuỗi cần sao chép
2-Vị trí bắt đầu sao chép
3-Số ký tự cần sao chép

Đây là một ví dụ

program Chuoi_Ky_tu5;

var
s, t: String;

begin
s := ‘Hello’;
t := Copy(s,1,3);{t = ‘Hel’}
end.

Chúng ta tạm dừng thảo luận về chuỗi ở đây, những lện khác liên quan đến chuỗi sẽ được đề cập trong các tình huống cụ thể.

Bài 20 – Biến và Hằng

Leave a comment

Chúng ta đã tìm hiểu qua hầu như toàn bộ cấu trúc của một chương trình Pascal. Tuy nhiên theo kiểu “cưỡi ngựa xem hoa” là chính, không theo bất cứ một chủ đề nào. Mục đích là để bạn có thể dễ dàng có một cái nhìn tổng quan về Pascal.
Bắt đầu từ phần này, chúng ta sẽ tìm hiểu kỹ hơn về những chủ dề cụ thể.

Phần 20 này sẽ thảo luận về Biến và Hằng

  • Biến là một ô nhớ trong bộ nhớ của máy tính, giá trị của biến có thể thay đổi trong quá trình thực hiện chương trình, biến sẽ được giải phóng (thu hồi ô nhớ) khi chương trình kết thúc.
    Chương trình quản lý biến thông qua tên biến và mỗi biến tương ứng với một kiểu dữ liệu nhất định.
  • Hằng là một đại lượng không đổi trong quá trình thực hiện chương trình. Có hai loại hằng là hằng chuẩn và hằng do người dùng định nghĩa.
  • Một kiểu dữ liệu là một tập hợp các giá trị mà một biến thuộc kiểu đó có thể nhận được và một tập hợp các phép toán có thể áp dụng trên các giá trị đó. Có hai loại kiểu là kiểu chuẩn và kiểu do người dùng định nghĩa.

Tóm lại: Hằng thì cố định. Biến có nhiều giá trị và nhiều kiểu khác nhau, kiểu khác nhau đó gọi là kiểu dữ liệu. Cụ thể về kiểu dữ liệu có rất nhiều trong các tài liệu, ở đây chúng ta sẽ chỉ tóm tắt một vài kiểu dữ liệu mà chúng ta hay sử dụng:

Byte 0 to 255
Word 0 to 65535
ShortInt -128 to 127
Integer -32768 to 32767
LongInt -4228250000 to 4228249000
Real floating point values
Char 1 character
String up to 255 characters
Boolean true or false

Muốn dùng biến trước hết ta cần khai báo biến. Cú pháp khai báo biến như sau

VAR Tên biến>[, Tên biến]: Kiểu;

Phần trong cặp dấu […] có nghĩa là ta có thể khai nhiều biến cùng kiểu. Ví dụ bạn có thể khai báo một biến kiểu Integer tên bien_i như sau

var bien_i: Integer;

Biến cần có giá trị, đương nhiên rồi vì nếu không thì đâu cần “khai sinh” ra nó làm gì?
Để gán một giá trị cho biến, chúng ta dùng dấu “:=.
Đây là một ví dụ khai báo, sau đó gán giá trị cho biến

program Khai_Bien_va_Gan_Gia_Tri;

var
i: Integer;

begin
i := 5;
end.

Đây là một ví dụ khác, trong đó ta khai báo hai biến cùng loại là Integer theo cú pháp trong cặp dấu […] nói trên và một biến khác có kiểu String

program Khai_Bien_va_Gan_Gia_Tri2;

var
i, j: Integer;
s: String;

begin
end.

Khi gán giá trị cho biến, cần lưu ý tới kiểu giá trị. Rất dễ bị lỗi là biến kiểu String, gán giá trị cho biến kiểu String chúng ta cần đặt trong cặp dấu ‘…’
Đây là một ví dụ khai báo và gán giá trị cho 3 kiểu biến khác nhau

program Khai_Bien_va_Gan_Gia_Tri3;

var
i: Integer;
s: String;
b: Boolean;

begin
i := -3;
s := ‘Hello’;
b := True;
end.

Biến kiểu “SỐ” nói chung, ví dụ Integer, Longint…thì ta có thể “tính toán” theo kiểu cộng, trừ, nhân, chia theo nghĩa đen được. Nôm na là 1+1=2 hay 2+2=4
Tuy nhiên biến kiểu String chẳng hạn, ta hoàn toàn có thể đặt dấu “+” giữa 2 String, tuy nhiên ‘1’+’1′ không bằng 2 mà là: ‘1’+’1′ = ’11’. Ví dụ khác, ’11’+’11’ không cho ra 22 mà là ’11’+’11’ = ‘1111’, đây không có “tính toán” theo nghĩa đen

Chúng ta có thể dùng Readln hay ReadKey để “đọc” giá trị từ bàn phím cho biến. Lưu ý là ReadKey chỉ đọc 1 character mà thôi, ví dụ ‘a’, ‘b’ hay ‘1’, ‘2’….

Hằng thực ra cũng như biến mà thôi, chỉ khác một diều là giá trị của Hằng không thay đổi.

Older Entries