Trong ví dụ sau, ta có thể đọc một tệp mà người dùng nhập vào, ví dụ như c:/test/first.pas trong Windows hay home/user/first.pas trên Linux: Chương trình đọc tệp văn bản Program ReadFile[r]
Trang 1Motaz Abdel Azeem - Bùi Việt Dũng
Bắt đầu lập trình với Object Pascal
Phần 1: Pascal cơ bản
- Hướng dẫn học Pascal và tạo giao diện Turbo Vision
- Hướng dẫn sử dụng Lazarus Pascal
- Nhiều thủ tục, hàm mới chưa được nhiều sách giới thiệu
Trang 2Giới thiệu
Tác giả bản tiếng Anh: Motaz Abdel Azeem
Người Su-đăng, học Đại học tại Đại học Khoa học Công nghệ Su-đăng vào năm 1999 và bắt đầuhọc Pascal và Delphi tại đó Anh hiện giờ là lập trình viên
Bản quyền
Bản tiếng Anh
Bản tiếng Việt
This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Việt Nam License
To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/vn/
Trang 3{ you can add units after this };
{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
begin
End
Chúng ta có thể lưu chương trình bằng cách chọn File/Save trên menu chính, và ta có thể đặt têncho nó, ví dụ, first.lpi
Sau đó ta có thể viết vài câu lệnh giữa hai từ khóa begin và end.:
Writeln('Đây là Free Pascal và Lazarus');
{ you can add units after this };
{$IFDEF WINDOWS}{$R first.rc}{$ENDIF}
Bây giờ nhấn F9 hoặc nhấn nút để chạy chương trình
Khi chạy chương trình, ta nhận được những dòng sau:
Đây là Free Pascal và Lazarus
Nhấn phím Enter để kết thúc
Trang 4Nếu ta sử dụng Linux, ta sẽ thấy một file (tệp) mới trong trong thư mục chương trình được gọi(first), và trong Windows ta sẽ có một tệp tên là first.exe Những file này có thể tự chạy bằng một
cú nhấp đôi File này cũng có thể sao chép đến một máy tính khác mà vẫn chạy được không cầnLazarus IDE
Trong chương trình trước đổi dòng này
Writeln('Đây là Free Pascal và Lazarus');
Biến chứa dữ liệu Ví dụ, ta nói X = 5 thì X là biến chứa dữ liệu có giá trị 5
Object Pascal là một ngôn ngữ chặt chẽ về kiểu dữ liệu (strongly typed language), có nghĩ là taphải định nghĩa kiểu của biến rõ ràng trước khi khai báo Nếu ta khai báo biến X là số nguyên, tachỉ được gán cho nó giá trị nguyên trong suốt chương trình
Trang 5Ví dụ về sử dụng biến trong chương trình
Ta sẽ thấy 10 được hiển thị khi chạy chương trình
Lưu ý rằng ta cần từ khóa Var, nghĩa là những dòng tiếp theo sẽ khai báo biến
X: integer;
Nó nghĩa là:
1, Tên biến là X
2, Kiểu của nó là integer, chỉ lưu trữ dữ liệu nguyên khi làm phép tính Kiểu nguyên có thể chứa
dữ liệu số âm, dương và số 0
Và lệnh:
X:=5;
Nghĩa là gán cho biến X giá trị 5
Trong ví dụ tiếp theo ta cho thêm biến y
50 là kết quả của công thức x * y
Trong ví dụ sau ta giới thiệu một kiểu dữ liệu gọi là char
var
c: Char;
Trang 6Kiểu này chỉ chứa một kí tự như a, b, c, 1, 2, 3, Nhưng không tính toán được với số.
Trong ví dụ sau giới thiểu một kiểu thực:
Trang 8Tên Giá trị nhỏ nhất Giá trị lớn nhất Dung lượng
Câu điều kiện
Một trong những điều quan trọng nhất của thiết bị thông minh (như máy tính, thiết bị lập trình sẵn( programmable devices)) là quyết định hành động ở mỗi điều kiện khác nhau Chúng ta có thểlàm điều đó bằng câu điều kiện Ví dụ, một số xe hơi tự động đóng cửa khi xe đạt tốc độ 40 km/h.Câu điều kiện trong trường hợp này là:
If tốc độ >=40 and cửa mở, then đóng cửa
Xe hơi, máy giặt hay các thiết bị lập trình sẵn khác đều được điều khiển bằng bảng mạch điện tử,hay những con chip như ARM Một số có thể được lập trình bằng ngôn ngữ lập trình như C hayFree Pascal
Câu điều kiện If
Câu điều kiện If trong Pascal rất dễ Trong chương trình sau, ta có thể điều khiển điều hòa tự độngtắt mở dựa vào nhiệt độ
Chương trình cho máy điều hòa
var
Temp: Single;
begin
Write('Nhập nhiệt độ phòng :');
Trang 9Bạn có thể kiểm tra với các dữ liệu khác nhau
Bạn cũng có thể cải tiến thêm chương trình:
if(ACIsOn = 1) and(Temp < 18) then
Writeln('Tắt điều hòa')
else
if(ACIsOn = 0) and(Temp < 18) then
Writeln('Đừng làm gì, phòng vẫn lạnh')
else
Trang 10if(ACIsOn = 0) and(Temp > 22) then
Writeln('Bật điều hòa')
Chương trình Kiểm tra sức khỏe
Trong ví dụ này, chúng ta yêu cầu người dùng nhập chiều cao theo m và cân nặng theo kg rồi sẽtính cân nặng thích hợp và hiển thị kết quả
If IdealWeight = Weight then
Writeln('Bạn có thân hình lí tưởng')
else
Trang 11If IdealWeight > Weight then
Writeln('Bạn gầy, bạn cần',
Format('%.2f', [IdealWeight - Weight]), ' kg nữa')
else
Writeln('Bạn béo, bạn cần giảm ',
Format('%.2f', [Weight - IdealWeight]), ' kg nữa');
Write('Nhấn Enter để kết thúc');
Readln;
End
Trong ví dụ này, ta có các từ khóa mới:
1, Double: gần giống Single Cả hai đều đều là số thực, nhưng Double chứa được số thực to hơn(và nhỏ hơn) và chi tiết hơn Single cần 4 byte, nhưng Double cần 8 byte
2, Từ khóa or dùng để kiểm tra điều kiện giống như and nhưng chỉ cần một trong hai điều kiệnđúng thì sẽ thực hiện câu lệnh sau then, nếu không có điều kiện nào đúng thì thực hiện câu lệnhsau else
3, Chúng ta cũng sử dụng các từ khóa begin end nhiều hơn ở mỗi câu điều kiện vì sau then và elsechỉ chứa một câu lệnh Begin và end sẽ gom tất cả câu lệnh trong nó thành một câu lệnh Sau endchỉ có dấu chấm phẩy để phân biệt với end cuối cùng Ví dụ hai câu lệnh sau:
Writeln('Giá trị không hợp lệ');
Writeln('Hãy nhập giá trị thực');
Sẽ được chuyển thành 1 câu lệnh nhờ begin end
If (Height < 0.4) or (Height > 2.5) or (Weight < 3) or (Weight > 200) then
Lưu ý:
Chương trình này không đánh giá thực sự chính xác sức khỏe của bạn Bạn có thể tìm các côngthức khác để chẩn đoán sức khỏe tôt hơn Ví dụ này chỉ nhằm luyện tập kĩ năng lập trình củangười mới học
Câu lệnh Case Of
Còn một loại câu điều kiện nữa: đó là câu lệnh Case Of Nó sẽ xét giá trị của biến được ghi ởgiữa Case và of Chương trình hàng ăn này sẽ là một ví dụ điển hình cho việc sử dụng loại câuđiều kiện này
Trang 121: Writeln('Bạn đã chọn gà', ' bạn phải đợi 15 phút');
2: Writeln('Bạn đã chọn cá, bạn phải đợi 12 phút');
3: Writeln('Bạn đã chọn thịt, bạn phải đợi 18 phút');
4: Writeln('Bạn đã chọn sa-lát, bạn phải đợi 5 phút');
5: Writeln('Bạn đã chọn nước cam, bạn phải đợi 2 phút');
6: Writeln('Bạn đã chọn sữa, bạn phải đợi 1 phút');
Trang 13Lệnh Case chỉ sử dụng được cho các biến kiểu nguyên hay chỉ gồm 1 kí tự, còn các kiểu xâu hay
số thực thì lại không dùng được
Chương trình bàn phím
Chương trình này sẽ đọc một chữ nhập từ bàn phím và nói cho người dùng hàng của chữ đó trongbàn phím
var
Trang 15Thay vì phải dùng writeln 12 lần, chúng ta chỉ cần dùng một lần trong câu lệnh lặp.
Chúng ta có thể dùng biến đếm ngược, tức là giá trị biến giảm dần nhờ từ khóa downto thay vì to.For i:= 12 downto 1 do
Chương trình giai thừa
Giai thừa là tích các số từ 1 đến chính nó Ví dụ, 3! = 3*2*1 = 6
var
Trang 16Fac, Num, i: Integer;
Trang 17Write('Nhập lựa chọn của bạn: ');
Trong ví dụ trước, ta sử dụng thêm các kĩ thuật sau:
1, Thêm begin end để chuyển đổi nhiều câu lệnh sang 1 câu lệnh
2, Chúng ta đặt cho biến Total một giá trị ban đầu, rồi cộng dần với các giá trị Price khác nhau ởmỗi vòng lặp
Total:= Total + Price;
Trang 183, Chúng ta cho 2 lựa chọn để kết thúc gọi món là X và x 2 chữ cái này được lưu trữ với giá trịkhác nhau.
Vòng lặp while gần giống với vòng lặp repeat, nhưng nó khác ở các điểm sau:
1, Ở vòng lặp while, điều kiện được kiểm tra trước khi tiếp tục vòng lặp, nhưng repeat kiểm trađiều kiện sau khi vào vòng lặp Nghĩa là repeat sẽ thực hiện vòng lặp đó ít nhất 1 lần, còn whilethì thực hiện ít nhất 0 lần bằng cách nếu điều kiện sai luôn thì không vào vòng lặp
2, Vòng lặp while cần begin end nếu phải lặp đi lặp lại nhiều câu lệnh Repeat until không cần vìchương trình dịch tự biến các câu lệnh giữa repeat until thành một câu lệnh (do có dấu hiệu nhậnbiết rõ ràng)
Trang 19Writeln('Giai thừa của ', Num ,' là ', Fac);
Writeln('Nhấn Enter để kết thúc');
Readln;
end
Vòng lặp while không có biến đếm, vì vậy ta sử dụng tạm biến i để đếm Biến này vừa để xác định
số nhân lên, vừa có tác dụng phá vỡ vòng lặp khi i = 1
Writeln('| Tên : ', Name);
Writeln('| Địa chỉ : ', Address);
Writeln('| Số chúng minh thư nhân dân : ', ID);
Writeln('| Ngày sinh : ', DOB);
Writeln(' -');
Writeln('Nhấn Enter để kết thúc');
Readln;
Trang 20FullName:= YourName + ' '+ Father + ' '+ GrandFather;
Writeln('Tên đây đủ của bạn: ', FullName);
Trang 21Và bạn có thể lấy kí tự đầu tiên của xâu nhờ số kí tự của nó:
Writeln('Chữ cái đầu tiên là ', YourName[1]);
Chữ thứ hai:
Writeln('Chữ cái thứ hai là ', YourName[2]);
Hay chữ cuối cùng
Writeln('Chữ cái cuối cùng là ', YourName[Length(YourName)]);
Bạn cũng có thể hiển thị xâu theo hàng dọc nhờ lệnh for
For i:= 1 to Length(YourName) do
Writeln(YourName[i]);
Hàm Copy
Chúng ta có thể sao chép một phần của xâu nhờ hàm copy Giả sử bạn muốn lấy từ ‘world’ từ xâu
‘hello world’, bạn chỉ cần biết vị trí của nó như ta làm ở ví dụ sau:
Nó được giải thích lần lượt như sau:
Part:= kết quả được gán vào biến này
Line xâu được sử dụng
7 số thứ tự của kí tự bắt đầu sao chép
Writeln(Month, ' is abbreviated as : ', ShortName);
Writeln('Press enter key to close');
Trang 22thể chèn một xâu vào bất cứ vị trí nào, kể cả ở giữa.
Ví dụ, ta chèn xâu Pascal vào dòng chữ ‘Hello world’, kết quả là ‘Hello Pascal World’ thì sử dụngchương trình sau
Thủ tục này xóa một phần của xâu Ta cần biết vị trí và độ dài của xâu bị xóa
Ví dụ, để xóa phần ll trong ‘Hello World’ để xâu trở thành ‘Heo World’, ta sử dụng chương trìnhsau
Trang 23Trong ví dụ trước, ta sử dụng thêm thư viện SysUtils chứa hàm Trim.
Còn 2 hàm nữa, mỗi hàng bỏ dấu cách ở sau hoặc trước xâu, đó là TrimLeft và TrimRight
Line:= 'Kiểm tra hàm StringReplace';
Line2:= StringReplace(Line, ' ', '-', [rfReplaceAll]);
Các tham số của hàm bao gồm:
Line: xâu cần thay đổi
‘ ‘: Kí tự/ xâu con bị thay đổi
‘-’: Kí tự/ xâu con được thay vào
[rfReplaceAll]: Cách thay thế Cách này sẽ thay đổi tất cả kí tự tìm thấy
Chúng ta có thể sử dụng một biến thay vì hai biến nhưng bạn sẽ mất xâu gốc
Trang 24Numbers: array[1 10] of integer;
Chúng ta gọi tên biến bằng số thứ tự của nó Ví dụ, để gán biến đầu tiên cho 30, ta làm như sau:Numbers[1]:=30;
Để gán giá trị cho biến thứ hai, sử dụng lệnh sau:
Trang 25Max:= Marks[1];
Min:= Marks[1];
For i:= 1 to 10 do
begin
// Kiểm tra điểm tạm thời có là cao nhất không?
If Marks[i] > Max then
Max:= Marks[i];
// Kiểm tra điểm tạm thời có là thấp nhất không?
If Marks[i] < Min then
Trong ví dụ trước ta có thêm các lời giải thích
\\ Kiểm tra xem điểm hiện tại có phải là điểm cao nhất không?
Chúng ta bắt đầu dòng giải thích bằng //, và chương trình dịch sẽ bỏ qua dòng đó khi dịch Kĩthuật này giúp người đọc dễ hiểu mã nguồn hơn và giúp ích lớn khi sửa lỗi chương trình
\\ chỉ dùng cho một dòng giải thích ngắn hơn một dòng Nếu lời giải thích dài thì tốt nhất sử dụng{} hay (* *)
Ví dụ:
For i:= 1 to 10 do
begin
{ Kiểm tra xem điểm hiện tại có là cao nhất hay không, nếu đúng thì thay thế vào biến Max }
If Marks[i] > Max then
Max:= Marks[i];
(* Kiểm tra xem điểm hiện tại có là thấp nhất hay không, nếu đúng thì thay thế vào biến Min *)
If Marks[i] < Min then
Min:= Marks[i];
Write('Điểm học sinh thứ ', i, ' : ', Marks[i]);
If Marks[i] >= 40 then
Writeln('Đỗ')
Trang 26Writeln('Trượt');
end;
Chúng ta có thể vô hiệu hóa câu lệnh bằng cách biến chúng thành lời giải thích:
Writeln('Điểm cao nhất là: ', Max);
Ta có thể khai báo mảng có cả biến 0 như trong C
Marks: array[0 9] of Integer;
Nó có 10 biến, nhưng biến đầu tiên được gọi là:
1, Loại xe: String
2, Kích thước động cơ: real
3, Năm sản xuất: integer
Chúng ta gộp chúng lại thành bản ghi Car trong ví dụ sau:
Trang 27Writeln('Kích thước động cơ : ', Car.Engine);
Writeln('Năm sản xuất : ', Car.ModelYear);
Tệp là một thành phần quan trọng của hệ điều hành Các thành phần của hệ điều hành là các tệp,
và các dữ liệu trong như văn bản, ảnh, ứng dụng,
Hệ điều hành kiểm soát các thao tác với tệp như đọc, sửa đổi, và xóa
tệp được chia ra làm nhiều loại, tuy vậy ta chia ra làm hai loại: tự chạy và dữ liệu Ví dụ các ứngdụng như Lazarus là tệp tự chạy, còn các tệp pas là tệp dữ liệu Các loại tệp dữ liệu khác như pdf(sách điện tử), jpg (ảnh),
tệp dữ liệu lại được chia làm 2 loại:
- tệp văn bản: là các văn bản không định dạng đặc biệt có thể sửa đổi bằng các công cụ sẵn có trên
hệ điều hành
- tệp đặc biệt: là các tệp có chứa dữ liệu đặc biệt phải nhờ một chương trình khác để mở Ví dụ,tệp jpg phải nhờ GIMP, Kolour Paint hay MS Paint để mở Khi mở ra, ta sẽ nhận được những thứ
Trang 28không chỉ có chữ tệp doc cũng là văn bản nhưng đã được định dạng để chỉ Microsoft Word mởđược.
Tệp văn bản
Tệp văn bản là dễ hiểu nhất, nhưng ta chỉ ghi vào nó từ trái sang phải, không thể ngược lại Khi
mở tệp ta chỉ có thể đọc, viết hay viết thêm
Trong ví dụ sau, ta có thể đọc một tệp mà người dùng nhập vào, ví dụ như c:/test/first.pas trongWindows hay home/user/first.pas trên Linux:
Reset(F); // Để tệp đọc được thì nó phải có trước
// Nếu tệp chưa có thì không vào vòng lặp
while not Eof(F) do
Trang 294, Reset(F); // Để tệp có thể đọc được thì phải tồn tại
Thủ tục reset mở tệp ở chế độ chỉ đọc và đặt con trỏ ở đầu tệp
Nếu không mở tệp, bạn sẽ nhận một lỗi như access denied
5, Readln(F, Line); // Đọc một dòng từ tệp
Thủ tục Readln sẽ đọc một dòng và gán xâu đó vào biến Line rồi điều chỉnh con trỏ đến dòng tiếptheo Trước khi đọc tiếp, ta phải kiểm tra tệp đã hết chưa bằng hàm eof
6, while not Eof(F) do
Hàm eof sẽ đúng khi tệp đã hết Nó được dùng để thông báo cho chương trình rằng tệp đã đọc hết
và không đọc được nữa
7, CloseFile(F); // Đóng tệp
Khi đọc hay sửa xong, ta phải đóng tệp Nếu không, tệp có thể bị hỏng (không mở được nữa) cũngnhư mọi sửa đổi sẽ không được lưu lại
Trong ví dụ sau ta sẽ tạo một tệp và viết vào nó một vài dòng
Tạo và sửa đổi tệp
Trang 30else // Tệp không tồn tại
Rewrite(F); // Tạo tệp mới để viết vào
Writeln('Nhập dữ liệu theo từng dòng một, ', 'khi xong nhấn % và nhấn Enter');
Rewrite(F); // Tạo tệp mới để viết vào
Thủ tục này sẽ tạo một tệp trống (và mở luôn tệp đó) Nếu tệp đã tồn tại thì nó sẽ bị thay thế
4, Thủ tục writeln(tệp, );
Writeln(F, Line); // Viết vào tệp
Viết vào tệp xâu Line và chuyển con trỏ chuột vào đầu dòng tiếp theo
Thủ tục này cũng đã được hướng dẫn, các bạn chịu khó tìm lại
Viết thêm vào một tệp văn bản
Trong các ví dụ trước, ta chỉ đọc hoặc viết lại các tệp Để bảo vệ một dữ liệu cần duy trì lâu dài, tadùng thủ tục Append
Chương trình thêm văn bản vào tệp
Trang 31Append(F); // Mở tệp để viết thêm
Writeln('Nhập từng dòng bạn viết thêm ', 'xong thì nhấn % rồi nhấn Enter');
Sau khi chạy chương trình, ta có thể mở tệp để xem kết quả
Tệp truy cập ngẫu nhiên
Tệp truy cập ngẫu nhiên là loại tệp đặc biệt giúp ta có thể nhảy đến bất kì bản ghi nào để ghi hayđọc
Có hai loại tệp truy cập ngẫu nhiên: tệp được định dạng và tệp chưa định dạng
Tệp được định dạng
Tệp được định dạng là tệp có cùng kiểu dữ liệu và cùng dung lượng dữ liệu Ví dụ, nếu một tệpchứa một bản ghi kiểu byte, thì bản ghi có dung lượng bằng 1 byte Nếu nó chứa một số thực (kiểuSingle) thì dung lượng mỗi bản ghi là 4 byte
Trong ví dụ sau, chúng tôi sẽ chỉ cho bạn cách sử dụng tệp kiểu byte
Trang 33Trong ví dụ sau, ta sẽ biết cách viết thêm vào tệp mà không xóa dữ liệu cũ.
Chương trình nhập thêm điểm học sinh
Seek(F, FileSize(F)); // Đi đến bản ghi cuối
Writeln('Nhập điểm học sinh, nhập 0 để thoát');
Sau khi chạy chương trình để nhập thêm bản ghi, ta chạy nó lại để xem các sửa đổi
Lưu ý rằng ta dùng lệnh Reset để mở tệp, vì rewrite sẽ xóa mọi dữ liệu trong tệp
Chúng ta cũng gán chế độ mở tệp cho biến FileMode 0 nghĩa là chỉ đọc, 1 nghĩa là chỉ viết, còn 2