Nếu chúng ta viết lại lệnh ghi dữ liệu:

Một phần của tài liệu Các kiểu dữ liệu có cấu trúc (Trang 25 - 30)

Witeln(f,hoten);

Writeln(f,heso:5:2,' ',socon);

nghĩa là ghi riêng dữ liệu kiểu "chữ" trên một dòng còn dữ liệu kiểu "số" trên dòng khác, giữa các số có một khoảng cách, sau ñó dùng lệnh ñọc:

Readln(f,hoten); Readln(f,heso, Socon);

thì lại nhận ñược thông báo lỗi ở dòng Readln(f,heso, Socon); Error 106 : Invalid Numeric Format

nghĩa là các số ghi vào tệp trên cùng một dòng thì cũng không thểñọc chúng như là

các biến. - Chúng ta sa li lnh ghi mt ln na Witeln(f,hoten); Writeln(f,heso:5:2); Writeln(f,socon); Rồi dùng lệnh ñọc Readln(f,Hoten); Readln(f,Heso); Readln(f,socon); sau ñó là lệnh viết

Writeln(Hoten, ' ', Heso:5:2,' ',socon,' ' ,Heso*290000); thì chương trình sẽ không báo lỗi .

ðến ñây có th rút ra kết lun là:

- Muốn lấy lại kiểu của dữ liệu nhập vào tệp văn bản thì mỗi biến phải nhập trên một dòng.

- Với các biến kiểu số ñã ghi riêng rẽ trên một dòng khi gọi ra Pascal sẽ tự ñộng chuyển ñổi từ dạng ký tự thành dạng số và ta có thể ñưa các số này vào các biểu thức tính

- Trong bộ nhớ của máy dữ liệu ñược ghi liên tục trong các ô nhớ, ñể phân biệt các dòng Pascal dùng cặp ký tựñiều khiển CR và LF. Nói cách khác dữ liệu ñược lưu trữ liên tục chứ không phải dưới dạng bảng, khi lấy dữ liệu ra chúng ta cũng lấy liên tục nhưng lại có thể

bố trí trên màn hình sao cho trực quan và dễ theo dõi.

Ví dụ 2.15: xây dựng một chương trình ñơn giản ñể quản lý công chức. Dữ liệu nhập vào bao gồm Họ tên, Hệ số lương và Số con. Dữ liệu xuất ra màn hình bao gồm Họ tên, Hệ số lương, Số con và Lương tháng, Lương tháng ở ñây tính theo quy ñịnh của nhà nước = heso*290000.

Chương trình ñặt ra hai khả năng lựa chọn: a. Nếu tệp dữ liệu ñã tồn tại thì nhập thêm người b. Nếu tệp chưa có thì mở tệp mới

Trong cả hai trường hợp ñều yêu cầu cho biết số người cần nhập. Dữ liệu in ra dưới dạng bảng.

Ví d 2.15

Program Quan_ly_can_bo; Uses crt;

Var f:text; hoten:string[20]; c1,heso:real; c2,i,n,socon:byte; ten:string[12];

Begin clrscr;

Write('Cho biet ten tep '); readln(ten); {$I-} assign(f,ten); reset(f); {$I+} if Ioresult=0 then Append(f) else rewrite(f);

write('Nhap bao nhieu nguoi '); readln(n); for i:= 1 to n do

Begin

Write(' Ho ten ' ); Readln(hoten); Write( ' He so '); readln(heso); Write(' So con ' ); Readln(socon); Writeln(f,hoten);

Writeln(f,heso:4:2); writeln(f,socon); End;

assign(f,ten); reset(f);

writeln(':---:---:---:---:'); writeln('| Ho va ten | Hs | socon| Luong |');

writeln(':---:---:---:---:'); while not eof(f) do

begin

readln(f,hoten); readln(f,heso); readln(f,socon);

writeln('|',hoten:19,'|',heso:4:2,'| ',socon:4,' | ',heso*290000:10:2,' |'); end; (adsbygoogle = window.adsbygoogle || []).push({});

readln; End.

Ví dụ 2.15 có sử dụng ñịnh hướng chương trình dịch {$I+}, {$I-}. Khi ñịnh hướng là {$I+} thì chương trình sẽ kiểm tra lỗi vào ra IO (Input, Output) nếu phát hiện thấy lỗi thì dừng chương trình, ñây là chế ñộ ngầm ñịnh của Pascal. Nếu ñịnh hướng là {$I-} thì việc kiểm tra lỗi vào ra tạm thời không thực hiện, nghĩa là nếu phát hiện thấy lỗi thì tạm treo các

thủ tục vào ra và tìm xem hàm IORESULT cho kết quả là gì. Nếu hàm này cho kết quả bằng

0 thì có nghĩa là việc kiểm tra IO không có gì sai sót và chương trình tiếp tục làm việc. Nếu hàm Ioresult cho kết quả khác 0 thì có nghĩa là việc kiểm tra IO phát hiện thấy lỗi và chương trình cần phải ñược sửa chữa.

Ví dụ 2.16: Tạo tệp văn bản Baitho.txt ñể lưu trữ một bài thơ có n dòng, dòng cuối cùng ghi " Nam 2003". Khi nhập bài thơ cần hỏi trước bài thơ có bao nhiêu dòng.

Ví d 2.16

Program tep_van_ban; Uses crt;

var i,n:integer; f:text; t:string; Begin

clrscr;

assign(f,'baitho.txt');rewrite(f);

writeln('Bai tho gom bao nhieu cau? '); readln(n); writeln('Hay nhap bai tho cua ban');

for i:= 1 to n do begin

end; writeln(f,'Nam ', 2003); close(f); clrscr; gotoxy(15,5); i:=6; clrscr;

writeln('Du lieu viet tu tep baitho.txt '); reset(f);

while not eof(f) do begin readln(f,t); gotoxy(15,i); writeln(t); i:=i+1; end; readln; End.

Ví dụ 2.16 có thể cải tiến theo nhiều cách ñể có ñược một chương trình ñẹp dùng cho việc lưu trữ văn bản, chẳng hạn chúng ta sẽ ñưa vào các chương trình con GHIMOI, GHITHEM và DOC phục vụ việc ghi dữ liệu vào tệp mới, ghi thêm dữ liệu vào tệp ñã có hoặc ñọc từ tệp ra. Trước khi ghi hoặc ñọc cần kiểm tra xem tệp ñã tồn tại chưa, khi nhập văn bản vào tệp không hạn chế số dòng, muốn kết thúc việc nhập thì khi bắt ñầu một dòng mới chỉ cần bấm dấu "*" v.v... (xem ví dụ 2.17)

Ví d 2.17:

Program tep_van_ban; Uses crt;

var i,j,n:integer; f:text; t:string; tl,tl1,tl2:char; ten:string[12]; Procedure Ghimoi(ten:string); Begin clrscr; assign(f,ten); rewrite(f);

writeln('Hay nhap bai tho cua ban'); i:=1;

repeat

write('Cau ',i,' '); readln(t); if t<>'*' then writeln(f,t);

i:=i+1; Until t='*'; close(f); End;

Procedure Ghithem (ten:string); Begin

clrscr; assign(f,ten); append(f);

writeln('Hay bo xung bai tho cua ban'); i:=1;

repeat

write('Cau ',i,' '); readln(t); if t<>'*' then writeln(f,t); i:=i+1; Until t='*'; close(f); end; Procedure Doc(tep:string); Begin clrscr; gotoxy(15,5); i:=6;

writeln('Du lieu viet tu tep ',tep); assign(f,tep);

reset(f); (adsbygoogle = window.adsbygoogle || []).push({});

while not eof(f) do begin readln(f,t); gotoxy(15,i); writeln(t); i:=i+1; end; readln; end;

BEGIN { Thân chương trình mẹ}

Clrscr;

Write('cho biet ten tep '); Readln(ten);

Write('Ban Ghi hay Doc du lieu G/D '); Readln(tl1); If upcase(tl1)='G' then

Begin

write('Ghi tep moi hay ghi them vao tep cu M/C '); Readln(tl2);

If upcase(tl2)='M' then Ghimoi(ten) else Ghithem(ten); End Else Doc(ten); END.

Trong ví dụ 2.17 có sử dụng một biến toàn cục là TEN, kiểu biến là string[12]. Khi lấy

Ten làm tham số thực ñể truyền cho các chương trình con thì cần chú ý ñịnh nghĩa kiểu dữ

liệu trước. Cụ thể nếu chúng ta viết dòng lệnh: Procedure Doc(tep:string);

Dưới dạng mới là

Procedure Doc(tep:string[12]); thì máy sẽ báo lỗi.

2.3 Tp có kiu

Tệp có kiểu là tệp mà mọi phần tửñều có cùng ñộ dài và cùng kiểu. Kiểu các phần tử của tệp có thể là số nguyên, thực, ký tự, chuỗi, mảng hoặc bản ghi. Cách thức khai báo biến kiểu tệp ñã trình bày trong mục II. Sự khác nhau cơ bản giữa tệp có kiểu và tệp văn bản là tệp có kiểu có th va ghi vào va ñọc ra, còn với tệp văn bản chúng ta buộc phải kết thúc ghi bằng lệnh Close(bien_tep) thì mới có thểñọc tệp, còn khi ñang ñọc tệp chúng ta cũng phải kết thúc ñọc và ñóng tệp thì mới có thể ghi thêm dữ liệu vào tệp.

a. ðọc và ghi - Ghi lên tp - Ghi lên tp

Write(bientep, bien1, bien2, ...)

bien1, bien2, ... là các biến cùng kiểu với biến tệp.

Một phần của tài liệu Các kiểu dữ liệu có cấu trúc (Trang 25 - 30)