Để mở file đã có trong pascal ta có thể nhấn phím nào trên bản phím

- Để thực hiện chương trình được viết bằng ngôn ngữ lập trình Pascal, ta dùng phần mềm Turbo Pascal (hay Free Pascal) để soạn thảo, sử dụng chương trình dịch để dịch chương trình đó sang ngôn ngữ máy.

- Để sử dụng Turbo pascal, trên máy tính phải có các file chương trình cần thiết, đó là:

+ Turbo.exe: file chạy chương trình

+ Trên môi trường MS_DOS: 

+ Trên môi trường Windows: 

+ Turbo.tpl: file thư viện 

+ Turbo.tph: file hướng dẫn 

1. Khởi động chương trình Turbo Pascal

1.1. Chạy chương trình Turbo Pascal trên môi trường MS_DOS

- Trên màn hình Desktop, chọn My Computer, chọn ổ đĩa C:, chọn thư mục TP, chọn thư mục BIN, nháy đúp chuột vào biểu tượng 

- Trên màn hình Desktop, nháy đúp chuột vào biểu tượng 

1.2. Chạy chương trình Turbo Pascal trên môi trường WINDOWS

- Trên màn hình Desktop, chọn My Computer, chọn ổ đĩa C:, chọn thư mục TP, chọn thư mục BIN, nháy đúp chuột vào biểu tượng 

- Trên màn hình Desktop, nháy đúp chuột vào biểu tượng 

1.3. Màn hình làm việc của Turbo Pascal

Hình 1. Màn hình làm việc của Turbo Pascal

Dòng trên của màn hình được gọi là bảng chọn, mỗi mục trong bảng chọn tương ứng với một nhóm việc ta có thể lựa chọn, hai số trên dòng cuối cùng ngăn cách nhau bằng dấu hai chấm (:) cho ta biết vị trí của con trỏ soạn thảo đang ở dòng nào và cột nào trên màn hình. 

2. Soạn thảo, dịch, thực hiện chương trình

2.1. Soạn thảo chương trình

- Soạn thảo: Gõ nội dung của chương trình gồm phần khai báo và các lệnh trong thân chương trình. Về cơ bản, việc soạn thảo chương trình tương tự như soạn thảo văn bản. Các thao tác tương tự một hệ soạn thảo văn bản. Sau khi gõ xong, lưu chương trình vào đĩa bằng cách nhấn phím F2 (hoặc vào File → Save), nhập tên tệp rồi nhấn phím Enter (phần mở rộng của tệp ngầm định là .pas).

- Một số phím chức năng:

+ Home: Về nhanh đầu dòng.

+ End: Về nhanh cuối dòng.

+ Delete: Xóa chữ tại con trỏ.

+ BackSpace: xoá chữ bên trái con trỏ.

+ Ctrl+Y: Xoá 1 dòng.

+ Alt+Back Space: Phục hồi 1 thao tác (Undo).

+ Shift+ \(\leftarrow,\) \(\uparrow,\) \(\downarrow,\) \(\rightarrow\): Tô khối.

+ Shift+Delete: (Cut) Cắt nội dung chọn vào bộ nhớ.

+ Ctrl+Insert: (Copy) Sao chép nd chọn vào bộ nhớ.

+ Shift+Insert: (Paste) Dán nd trong bộ nhớ ra màn hình tại vị trí con trỏ.

+ Ctrl+K+H: Tắt dấu tô khối.

2.2. Biên dịch chương trình và thực hiện chương trình

- Biên dịch chương trình: Nhấn tổ hợp phím Alt+F9. Nếu chương trình có lỗi cú pháp, phần mềm sẽ hiển thị một thông báo. Cần phải sửa lỗi nếu có, lưu lại chương trình rồi tiến hành biên dịch lại cho tới khi không còn lỗi.

Trong các kỳ thi học sinh giỏi tin học và các giải lập trình thi đấu, Free Pascal vẫn là một trong ngôn ngữ chính thức và đôi khi là ngôn ngữ bắt buộc trong các kỳ thi ở cấp nhỏ (THCS). Bài viết này hướng dẫn cách nhập/xuất dữ liệu với Free Pascal trong các kỳ thi, cũng như trong quá trình làm bài tập hàng ngày của mọi người.

Có hai hình thức nhập xuất dữ liệu chính thường được yêu cầu trong các kỳ thi, bao gồm:

  • Nhập (đọc) dữ liệu từ
    1 2 3
    4
    9 (mặc đình là bàn phím) và xuất (ghi) dữ liệu ra
    1
    2
    3
    0 (mặc định là màn hình)
  • Đọc/ghi dữ liệu từ tập tin văn bản (text file)
Nhập (đọc) dữ liệu từ bàn phím

Đây là chế độ nhập dữ liệu trong hầu hết các hệ thống chấm bài online. Việc nhập dữ liệu được thực hiện bởi hai thủ tục

1
2
3
1 và
1
2
3
2. Khi chạy trên máy tính cá nhân, gặp câu lệnh nhập dữ liệu này, chương trình sẽ dừng lại để ta nhập dữ liệu vào từ bàn phím, bấm
1
2
3
3 để kết thúc một thao tác nhập liệu.

Thông tin thêm: trong chế độ chấm, hệ thống chấm bài sẽ không hoạt động như vậy, nó sẽ chuyển hướng

1
2
3
4 để lấy dữ liệu từ file chứa dữ liệu test thay vì dừng lại chờ nhập dữ liệu bằng tay.

  • Thủ tục
    1
    2
    3
    5 và
    1
    2
    3
    6 đều nhập giá trị ngăn cách nhau với một hoặc nhiểu khoảng trống và gán lần lượt cho các biến trong
    1
    2
    3
    7.
  • Điểm khác nhau giữa Thủ tục
    1
    2
    3
    1 và
    1
    2
    3
    2 là sau khi thực hiện việc nhập liệu, lệnh
    1
    2
    3
    2 sẽ chuyển xuống dòng dưới, bỏ qua các giá trị còn lại trên dòng hiện tại, lệnh
    1
    2
    3
    1 thì không.
  • Trong cả hai trường hợp dùng
    1
    2
    3
    1 hoặc
    1
    2
    3
    2, nếu dòng hiện tại không đủ dữ liệu để gán cho
    1
    2
    3
    7, chúng sẽ tiến hành đọc tiếp ở các dòng tiếp theo.

Xét ví dụ sau:

var a, b, c: int64;
begin
readln(a, b);
readln(c);
writeln(a, ' ', b, ' ', c);
end.

Nếu nhập vào dữ liệu như sau:

1 2 3
4

Thì kết quả sẽ được

var s: string;
begin
readln(s);
writeln(s)
end.
5,
var s: string;
begin
readln(s);
writeln(s)
end.
6 và
var s: string;
begin
readln(s);
writeln(s)
end.
7 (giá trị
var s: string;
begin
readln(s);
writeln(s)
end.
8 bị bỏ qua bởi thủ tục
1
2
3
2 đầu tiên.

Nếu nhập vào dữ liệu như sau:

1
2
3

Thì kết quả sẽ được

var s: string;
begin
readln(s);
writeln(s)
end.
5,
var s: string;
begin
readln(s);
writeln(s)
end.
6 và
Hello Pascal from Thuc
2(thủ tục
1
2
3
2 đầu tiên đọc dữ liệu trên cả hai dòng đầu, do dòng đầu tiên không đủ dữ liệu).

Nhập dữ liệu dạng xâu ký tự (string)

Đối với biến kiểu xâu ký tự, lệnh

1
2
3
1 và
1
2
3
2 luôn đọc cả dòng dữ liệu và gán cho xâu (không tách theo khoảng trống như ví dụ trên).

Xét ví dụ sau:

var s: string;
begin
readln(s);
writeln(s)
end.

Với nhập vào dữ liệu như sau:

Hello Pascal from Thuc

Xâu

Hello Pascal from Thuc
6 sẽ được gán giá trị cả dòng dữ liệu này:
Hello Pascal from Thuc
7.

Nếu nhập hai xâu trên một dòng, xâu thứ nhất sẽ chứa toàn bộ dòng, xâu thứ hai sẽ rỗng.

var s1, s2 : string;
begin
readln(s1, s2);
writeln(s1, ' ---- ', s2)
end.

Với nhập vào dữ liệu như sau:

Hello Pascal from Thuc

Xâu

Hello Pascal from Thuc
6 sẽ được gán giá trị cả dòng dữ liệu này:
Hello Pascal from Thuc
7,
var s1, s2 : string;
begin
readln(s1, s2);
writeln(s1, ' ---- ', s2)
end.
0, chương trình sẽ in ra:

hello Pascal from Thuc ----

Lưu ý: Kiểu dữ liệu string trong Free Pascal mặc định là ShortString, với độ dài tối đa là 255 ký tự. Với ví dụ trên, nếu dòng nhập vào có nhiều hơn 255 ký tự thì 255 ký tự đầu sẽ được gán cho

var s1, s2 : string;
begin
readln(s1, s2);
writeln(s1, ' ---- ', s2)
end.
1, phần còn lại sẽ được gán cho
var s1, s2 : string;
begin
readln(s1, s2);
writeln(s1, ' ---- ', s2)
end.
2 (cũng tối đa 255 ký tự). Để nhập vào xâu ký tự dài hơn 255 ký tự, ta cần sử dụng kiểu dữ liệu AnsiString thay vì String mặc định.

Xuất (ghi) dữ liệu ra màn hình

Tương tự, đây là chế độ xuất dữ liệu trong hầu hết các hệ thống chấm bài online. Việc nhập dữ liệu được thực hiện bởi hai thủ tục

var s1, s2 : string;
begin
readln(s1, s2);
writeln(s1, ' ---- ', s2)
end.
3 và
var s1, s2 : string;
begin
readln(s1, s2);
writeln(s1, ' ---- ', s2)
end.
4.

  • Thủ tục
    var s1, s2 : string;
    begin
    readln(s1, s2);
    writeln(s1, ' ---- ', s2)
    end.
    5 và
    var s1, s2 : string;
    begin
    readln(s1, s2);
    writeln(s1, ' ---- ', s2)
    end.
    6 đều xuất (ghi, in) các giá trị trong
    var s1, s2 : string;
    begin
    readln(s1, s2);
    writeln(s1, ' ---- ', s2)
    end.
    7, không có khoảng trống ở giữa. Ở đây,
    var s1, s2 : string;
    begin
    readln(s1, s2);
    writeln(s1, ' ---- ', s2)
    end.
    7 có thể là danh sách các hằng, các biến, các biểu thức hoặc hỗn hợp giữa chúng.
  • Điểm khác nhau giữa Thủ tục
    var s1, s2 : string;
    begin
    readln(s1, s2);
    writeln(s1, ' ---- ', s2)
    end.
    3 và
    var s1, s2 : string;
    begin
    readln(s1, s2);
    writeln(s1, ' ---- ', s2)
    end.
    4 là sau khi thực hiện việc xuất dữ liệu, lệnh
    var s1, s2 : string;
    begin
    readln(s1, s2);
    writeln(s1, ' ---- ', s2)
    end.
    4 sẽ viết thêm một dấu xuống dòng để chuyển xuống dòng dưới (các lệnh xuất dữ liệu tiếp theo sẽ ghi từ dòng bên dưới dòng hiện tại). Còn với lệnh
    var s1, s2 : string;
    begin
    readln(s1, s2);
    writeln(s1, ' ---- ', s2)
    end.
    3 thì các lệnh xuất dữ liệu tiếp theo sẽ ghi dữ liệu tiếp vào cuối dòng hiện tại.

Xét chương trình sau:

var a, b, c: int64;
begin
a := 2;
b := 3;
writeln('Ket qua: ', a, ' + ', b, ' = ', a+b);
end.

Kết quả thực thi chương trình trên sẽ như sau:

Ket qua: 2 + 3 = 5
Nhập/xuất dữ liệu từ file văn bản

Đây là chế độ nhập dữ liệu thường gặp trong các kỳ thi học sinh giỏi trong chương trình phổ thông, trong đó dữ liệu nhập vào được ghi sẵn trong một file văn bản (text file), các file này có thể được soạn thảo bằng các ứng dụng soạn thảo văn bản như

Hello Pascal from Thuc
3,
Hello Pascal from Thuc
4, và thường có phần mở rộng là
Hello Pascal from Thuc
5, hoặc cũng có thể soạn sảo trực tiếp bằng
Hello Pascal from Thuc
6.

Trong quá trình học và thực hành, hình thức nhập dữ liệu từ file văn bản cũng thường được dùng để tránh việc phải nhập đi nhập lại các dữ liệu đầu vào khi phải chạy thử chương trình nhiều lần lúc lập trình, nhất là với những bài có dữ liệu vào nhiều và phức tạp.

Trước khi làm việc với file, cần đảm bảo chắc chắn bạn nắm rõ mình đang làm việc ở thư mục nào, file dữ liệu được đọc/ghi sẽ nằm ở đâu trên ổ đĩa cứng và file chương trình (

Hello Pascal from Thuc
7) sẽ nằm ở đâu. (Xem phần Chuyển thư mục làm việc trong Free Pascal bên dưới)

Các bước để nhập/xuất dữ liệu từ file văn bản như sau:

1. Khai báo biến file có kiểu là

Hello Pascal from Thuc
8, thông thường ta sẽ cần hai biến, một biến cho file input (để nhập dữ liệu) và một biến cho file output (để xuất dữ liệu)

1 2 3
4
0

2. Gán biến file cho một đường dẫn đến file sẽ đọc/ghi với lệnh

Hello Pascal from Thuc
9. Nếu đường dẫn chỉ gồm tên file thì file này sẽ nắm trong thư mục hiện hành (Xem phần Chuyển thư mục làm việc trong Free Pascal bên dưới).

1 2 3
4
1

3. Mở file để đọc với lệnh

hello Pascal from Thuc ----
0, hoặc mở file để ghi với lệnh
hello Pascal from Thuc ----
1:

1 2 3
4
2

4. Tiến hành đọc/ghi với lệnh

1
2
3
1/
1
2
3
2 và
var s1, s2 : string;
begin
readln(s1, s2);
writeln(s1, ' ---- ', s2)
end.
3/
var s1, s2 : string;
begin
readln(s1, s2);
writeln(s1, ' ---- ', s2)
end.
4 giống như ở trên, chỉ thêm tham số đầu tiên là tên biến file cần đọc/ghi

1 2 3
4
3

Lưu ý:

  • Khi đọc từ file, file cần phải tồn tại nếu không sẽ báo lỗi.
  • Khi ghi file, file trùng tên nếu đã tồn tại sẽ bị ghi đè.

5. Đóng file sau khi đọc/ghi. Thao tác này hết sức quan trọng nhưng lại hay bị quên. Việc quên đóng file sau khi ghi có thể dẫn đến việc dữ liệu file bị thiếu. Để đóng file, ta dùng lệnh

hello Pascal from Thuc ----
6:

1 2 3
4
4

Toàn bộ chương trình như sau:

1 2 3
4
5

Để chạy chương trình, ta tạo file

hello Pascal from Thuc ----
7 ở cạnh file chương trình (
Hello Pascal from Thuc
7) bằng
Hello Pascal from Thuc
3 và gõ vào hai số nguyên nào đó, rồi ghi file lại. Chạy chương trình bằng tổ hợp phím
var a, b, c: int64;
begin
a := 2;
b := 3;
writeln('Ket qua: ', a, ' + ', b, ' = ', a+b);
end.
0, ta sẽ thấy file
var a, b, c: int64;
begin
a := 2;
b := 3;
writeln('Ket qua: ', a, ' + ', b, ' = ', a+b);
end.
1 được tạo ra, mở file này ta sẽ thấy kết quả mà chương trình ghi ra.

File chương trình, file input và file output

Nội dung file

hello Pascal from Thuc ----
7:

Nội dung file

var a, b, c: int64;
begin
a := 2;
b := 3;
writeln('Ket qua: ', a, ' + ', b, ' = ', a+b);
end.
1sau khi chạy chương trình:

Nếu quen thuộc với Free Pascal IDE, các bạn có thể làm soạn thảo trực tiếp file input và xem file output ngay bên trong Free Pascal:

Chuyển thư mục làm việc trong Free Pascal

Khi làm việc với file, và cả khi lưu lại chương trình của mình, các bạn cần nắm rất rõ ta đang làm việc tại thư mục nào của ổ đĩa cứng, và sẽ lưu file chương trình, đọc file input và ghi file output ở thư mục nào.

Vì vậy ngay khi bắt đầu làm việc với

var a, b, c: int64;
begin
a := 2;
b := 3;
writeln('Ket qua: ', a, ' + ', b, ' = ', a+b);
end.
4, hãy kiểm tra chắc chắn bạn đang làm việc tại thư mục mong muốn. Để xem và chuyển thư mục làm việc, ta vào menu File, chọn Change Dir...

Tại cửa sổ Change Directory được mở ra, hãy chọn đến thư mục mong muốn, và bấm chọn

var a, b, c: int64;
begin
a := 2;
b := 3;
writeln('Ket qua: ', a, ' + ', b, ' = ', a+b);
end.
5, sau đó bấm
var a, b, c: int64;
begin
a := 2;
b := 3;
writeln('Ket qua: ', a, ' + ', b, ' = ', a+b);
end.
6.

Thủ thuật chuyển đổi linh hoạt giữa nhập xuất dữ liệu từ bàn phím/màn hình và file văn bản

Trong một số trường hợp chúng ta cần chuyển đổi qua lại giữa việc nhập xuất dữ liệu từ bàn phím/màn hình qua dạng nhập xuất từ file. Một ví dụ điển hình là khi chạy thử nghiệm ở máy tính cá nhân, thông thường ta dùng file để tránh việc nhập đi nhập lại dữ liệu đầu vào qua các lần chạy, còn khi nộp bài lên các hệ thống chấm tự động ta lại phải chuyển về nhập xuất từ

1 2 3
4
9 và
1
2
3
0.

Xem lại các bước ở trên, ngoài các bước chuẩn bị, mở file và đóng file, thì điểm khác biệt chính ở hai cách nhập xuất này là tham số đầu tiên của các thủ tục

1
2
3
1,
1
2
3
2,
var s1, s2 : string;
begin
readln(s1, s2);
writeln(s1, ' ---- ', s2)
end.
3,
var s1, s2 : string;
begin
readln(s1, s2);
writeln(s1, ' ---- ', s2)
end.
4 là tên biến file.

Như vậy khi chuyển từ dạng nhập/xuất bình thường qua nhập/xuất từ file, ta cần thêm tham số tên biến file cho tất cả các lệnh

1
2
3
1/
var s1, s2 : string;
begin
readln(s1, s2);
writeln(s1, ' ---- ', s2)
end.
3. Ngược lại, khi chuyển từ dạng nhập/xuất từ file qua nhập/xuất từ bàn phím/màn hình, ta lại phải xoá tham số này ở tất cả các lệnh
1
2
3
1/
var s1, s2 : string;
begin
readln(s1, s2);
writeln(s1, ' ---- ', s2)
end.
3.

Để tránh việc chuyển qua chuyển lại này, chúng ta có thể dẫn hướng

1 2 3
4
9 và
1
2
3
0 sang file thay vì nhập/xuất từ bàn phím/màn hình bằng cách ghi đè biến
Ket qua: 2 + 3 = 5
9 và
1 2 3
4
00 sẵn có của Pascal như sau:

1 2 3
4
6

Lưu ý là khi dẫn hướng lại stdin và stdout như trên, các lệnh

1
2
3
1,
var s1, s2 : string;
begin
readln(s1, s2);
writeln(s1, ' ---- ', s2)
end.
3 không cần thay đổi nữa (không cần thêm tên biến file vào tham số đầu tiên).

Như vậy, khi muốn chuyển quan chuyển lại giữa 2 kiểu nhập/xuất dữ liệu, ta chỉ cần thêm hoặc xoá (hoặc chuyển thành chú thích) 4 dòng bôi đậm ở trên và không cần sửa đổi gì thêm.