TIN HỌC ỨNG DỤNG TRONG TÍNH TOÁNM ô tả kiểu record được bắt đầu bằng từ khoá record, theo sau là đanh sách các phần tử dữ liệu của record mà ta gọi là các trường.. TIN HỌC VÀ ỬNG DỤNG TR
Trang 2T S TRẦN VĂN CHỈNH
TRONG TÍNH TOÁN
NHÀ X UẨT b ả n g i á o d ụ c - 2001
Trang 3LỜI NÓI ĐẦU
Giáo íììiììì ”Tin h ạc ứng dụng trong tính t o á n ” dìiỉìg ìàm ĩcìị ỉiệu
ịịìảỉìg d ạ \ \'í) Ịỉọc ỉậ p ch o si fill viêỉì các Ii^áiiỉĩ k ĩ tìỉitậỊ cilng n h ư ỉàm íài Ịiệit ỉliam klìáo c h o cá c k ĩ su' rờ cck' càn bộ k ĩ thuật N ộ i d u n g của giáo ỉrìtìiì đé c ậ p cỉểiì các h ủ i tocuì íliuo'fig gặp troiỉg k ĩ rhuật.
V ớ i'q u a n n iệm người â ọ c d ã có kiểu tỉìức c ơ bắn vé ỉập trình hằng ngón figữ P a s c a l nén g iá o trìíiỉì tiùy được chia làm hai p h ấn Pỉiầii ỉ trình
b à v m ộ t s ố kiểu thức tro n g Ịập ỉrì/ili nàng cao hằiig ngôn n g ữ P a sc a l và
p h ầ n 2 trìiìỊi h ù y cú c th u ậ t toán d ể giải các bcYỉ toán thưcr/ig gặp M ụ c liên của g iá o tììỉìỉi ỉà ừng d ụ n g tin Ịìọc đ ể tíììh ỉoátì Iiê/t p h ầ n lí tỉĩnyết tìOiìg m ỗ i b à i toán được írìiìỊỉ bày Ịigắỉi gọii, đu í ỉ ể người đ ọ c ỉìắm àượe ĩìỉuậỉ toán giải ỈHU (oán S a u tuổi pliầiì iỉhư vậy LỈểii có ví dụ bằn g s ổ và
có chư ơ ng t l ililí kè m íìieo C á c cliiCơiỉg trìiilì này ctâ dược th ù ìigiỉiệm và clìo kếỉ q u ả đúng.
T r o n g q u á trìiiỉỉ hiứii ỉioụ/ì chúỉig tôi đ ã í ô g ắ n g thê hiện ỉìội cỉiỉiìg
p h ù ỉ ì Ợ p với ycit câ u cíổi m ớ i nội dung ỉĩiàỉig dạy T u y Ị i h i ê n do g iá o t r ì n h
được hiêii soạn íi'Ofig Dĩộĩ Ỉỉìcn <^iaii iìgắìỉ iìêìì kh ô n g thê tránh kh ó i thiếu
sóf Tôi moiỉiỊ cỉưực sự góp V ciìa hạn âọc d ể hoàn ĩỉiỉệìì hơn nữa giáo
trìnỉi nìỉy.
T Á C G IẢ
Trang 4TIN HỌC ỨNG DỤNG TRONG TÍNH TOÁN
M ô tả kiểu record được bắt đầu bằng từ khoá record, theo sau là đanh sách các phần tử dữ liệu của record mà ta gọi là các trường M ỗi m ột trường có tên trường và sau đó là kiểu dữ liệu của trường M ô tả kiểu record bao giờ cũng kết thúc bằng end;
Khai báo record được thực hiện theo hai dạng
D ạ n g 1: type <tên kiểu> = record
<íên trường l> :< k iểu dữ liệu của trường>;
<tên trường 2>:<kiểu dữ liệu của trường>;
end;
var <tên biến>:<tên kiểu>;
so_nha: integer;
pho: string[50];
thanh_pho: string[20];
end;
Trang 5Chương ì D ữ ìià ii có cấii trúc
v a r a, b: d ia_ ch i;
D ạng 2: var <tên biến> = recorđ
<têii trường l>:<kiểu đữ liệu của trường>;
<tên trường 2>:<kiểu dữ liệu của trường>;
with t do
Trang 6TIN HOC ỨNG DỤNG TRONG TÍNH TOÁN
Trang 7Chương Ị Di7 liệu có cđií trúc
w rileln(T t Ho va ten D iem thi’);
Trang 8TIN HỌC VÀ ỬNG DỤNG TRONG TÍNH TOÁN
begin j:= j+ l;
Kiểu record trình bày ờ trên là kiểu record có cấu trúc không thay đổi
Trong thực tế nhiều lúc ta phải dùng record có cấu trúc biến đổi Trước hết
ta xét một ví dụ sau: cần quản lí sinh viên của ba khoa: điện, điện tử, cơ khí M ỗi khoa sinh viên sẽ theo học các m ôn khác nhau Sinh viên khoa điện học các mòn: mạch, vi tính, anh văn Sinh viên khoa điện tử học các môn toán, lí, hoá, pháp văn Sinh viên khoa cơ khí học các môn: hình hoạ, vè Để quản lí tất cả các sinh viên đáng lẽ ta phải lập một record có đầy đủ các khoa, các m ôn học Tuy nhiên như vậy thì record sẽ cồng kềnh và chiếm nhiều bộ nhớ Trong trưdng hợp này ta dùng record có cấu trúc thay đổi như sau:
case sv„khoa: khoa o f
dien: ( mach, vitinh, anhvan: diem);
Trang 9Chương ỉ D ữ ỉìệii c ó cấit trúc
dien„tu:( toan, li, hoa, phapvan: diem);
co_khi;( hinhhoa, ve: diem);
end;
Recorđ có cấu trúc thay đổi nói chung có hai phần:
- Phần cô' định gồm các trường ỉà đặc điểm chung cho mọi sinh viên (trong ví dụ trên là các trường ho„ten, nam) Trong record có cấu trúc thay đổi phần này không bắt buộc phải có Cách viết phần này như ỏ recorđ bình thường.
- Phần thay đổi luồn luôn đặt sau phần cố định và chỉ được phép có
m ột trường thay đổi mà thôi Nói cách khác phần thay đổi luôn luôn được đặt sau cùng và được bắt đầu bằng lệnh case Phần này có thể lại chứa một record có cấu trúc thay đổi khác, nghĩa là ta lại có một trường thay đổi nữa nằm trong trường này Phần thay đổi gồm một trường gọi là trường đánh đấu được đặt lệnh case (sv_khoa trong ví dụ trên) Tương ứng với m ỗi giá trị của trường đánh dấu ta có một biến dạng cùa record với danh sách các trường tương ứng được đặt sau các nhãn của lệnh case và toàn bộ các danh sách này phải được đặt trong dấu ngoặc đơn Ngay cả khi danh sách này rỗng ta vẫn đùng dấu ngoặc đơn Trường đénh dấu phải được m ô tả bằng một kiểu đơn giản Trường này là một phần tử của record và được dùrig như m ọi phần tử của record khi gán và đọc giá trị Tất cả các biến trong phần thay đổi phải khác tên nhau.
Tập tin vẫn bản kiểu text là một kiểu dữ iiệu tập tin đặc biệt trong Borland Pascal Khai*báo một biến tập tin được viết như sau:
Trang 10TIN HỌC VÀ ỨNG DỤNG TRONG TÍNH TOÁN
var x; text;
Dổ)'i với Borland Pascal, X đơn thuần là tập tin của các kí tự Hai khai báo này mặc đù tương tự nhưng không đồng nhất trong Borland Pascal N ói chuig:
- nnuốn đọc vào và in ra từng dòng trong tập tin văn bản ta dùng dạng text
- m uốn đọc và in ra từng kí tự ta dùng k h a i báo file o f char.
• c ó thể dùng file o f real, file o f integer v.v nhưng không được dùng file af file.
- tên các thiết bị tương ứng là:
- muốn làm việc với thiết bị nào ta gọi tôn* thiết bị đó ra bằng lệnh assign
V í ÍỤ assign(x, 'prn') là lệnh chuẩn bị cho in ra m áy in.
- s;au khi gán tên cho biến text file ta m ỏ file để truy xuất bằng lệnh rew ite(f) để ghi lên file (hay thiết bị) và reset(f) để đọc từ file (hay thiết bị) V í dụ:
Trang 11Chương ỉ D ữ lìệii c ỗ cấn trúc
var X, y: text;
assign (x, 'prn');
rewrite(x);{ reset(f) nếu muốn đọc từ file}
writeln(x, 'Day la may in'):
writelnCDay khong phai la may in');
Câu lệnh writeln thứ nhất in ra đòng văn bản Câu lệnh writeln thứ hai đưa kết quả lên màn hình vì không mở biến X Câu lệnh rewrite dùng để mở file
ra, chuẩn bị ch o tác vụ xuất thông tin Khi được dùng với disk file, rewrite tạo m ột tập tin trên đĩa sẵn sàng nhận dữ liệu Trong trường hợp này câu lệnh sẽ xoá tập tin cQ trùng tên trên đĩa (nếu có).
writeln(tap_tin, 'Mot vi du ve tap tin' );
writeln(tap_tin, 'Chuong trinh minh hoa c a c h '):
writeln(tap_tin, 'tao va ghi mot tap tin' );
writeln(tap_tin, 'len dia dang van ban');
close(tap_tin);
end.
Chương trình trên tạo m ột tâp tin tên là thi_du txt trên dĩa v\ tên biến không phải là tên thiết bị nằm trong bảng trên Tên tập tin được gán cho biến có tên là tap_tin Dòng lộnh rewrite dùng để ghi nội dung trong các lệnh writeln vào tập tin trên đĩa Sau đó tập tin được đóng lại bằng lệnh clo se Nếu trong lệnh writeln ta không có biến tap_tin thì nội dung sẽ được đưa lên màn hình.
Trang 12w d íeln ('D oc noi dung tap tin );
wTÌte('Cho ten tap tin');
Trong chương trình ta thấy xuất hiện một lệnh m ới là eof(lap _tin )
C ôns dụn g của nó là xác định vị trí kết thúc tập tin e o f là true khi chương trình đọc xong đòng cu ố i cùng của tập tin văn bản Trong m ọi trường hợp kí hiệu Ctrl-Z có mã ASCII là 26 báo kết thúc tập tin văn bản
E o f íự động thành true khi chương trình đọc thấy kí tự này.
Để tránh mất mát thông tin ta cần đóng tập tin sau khi dùng xong bằng lệnh c lo se Khi đóng, các dữ liệu còn trong bộ nhớ sẽ được ghi lên tập tin.
Trang 13Chương / D ũ Ịiệii có cếii írúc
Các biến tập tin nằm trong bộ nhớ sẽ đươc xoá sạch Muốn cho hệ diổu hành ghi dữ liệu lên tập tin mà không đóng tập tin ta dùng iẹiih flush(tap_tin).
Đ ể thêm dữ liệu vào cuối tập tin vãn bản đã có ta đùng lệnh append ở
vị trí của lệnh reset Append mở tập tin vãn bản giống như lệnh reset nhưng định vỊ ở cuối văn bản để sẵn sàng nhập íiếp Ví dụ để thêm 2 dòng vào tập tin test, txt đã có ta viết:
var tf: text;
assign(tf):
append(tf);
writeln(tf, 'Them dong thu nhat');
writeln(tf, 'Them dong thu hài');
const ten = 'Sao chep tap tin';
type string 132 = string[132
var infile, outfileitext;
Trang 14TIN HỌC VÀ ỬNG DỤNG TRONG TÍNH TOẢN
Trang 15Chương I D ữ Ị ị ệ n có cấìi ĩrúc
close(outfiie);
close(infile);
end.
§3 Dùng tập tín số liệu ngoài chương trình
/ Đ ọc tệp: Đ ọc tệp là đưa nội dung tệp vào bộ nhớ trong của máy tính
Khi đó các biến của chương trình sẽ thâm nhập được vào các dữ liệu này
Đ ể đọc tệp vào bộ nhớ cần thực hiện các bước:
- gán tên file ngoài cho ÍỊÌến tệp bằng lệnh assign
trong đó f là tên biến tệp dùng trong chương trình
name - tên tệp ngoài cần đọc, gồm cả phần m ỏ rộng
X, y là c á c b iế n trong chương trinh tiếp n h ậ n c á c g iá trị đọc
từ tệp ngoài
Lệnh đọc read và reađln được dùng như bình thường.
V í dụ tệp ngoài là b dat có các phần tử kiểu integer là 2 4 6 và ta đọc hai giá trị đầu vào các biến a, b trong chương trình:
var a, biinteger;
assign(f, ’b dat’);
Trang 16TIN HOC VA ONG DUNG TRONG TINH TOAN
Trang 17Chươuỵ ỉ D ữ lịệii có cấn n úc
clo se(fl);
end.
2 Ghi tệp: Ghi tệp là chuyển kết quả từ chương trình ra tập tin tr*n «đĩa
V iệc ghi tệp gồm các bước;
- gán tên tệp ngoài cho biến tệp
- mở têp: nếu tệp đ ã có dùng lệnh reset, nếu m ở tệp hoàn toàn rrái hay ghi lại nội dung tệp cũ thì dùng lệnh rewrite
- đóng tệp
Cụ thể chương trình sẽ có dạng;
- assign(f, ’nam e’);
- rewrite(f); { hay dùng reset(f) Ị
- write((f, X, y );
- close(f)
V í dụ sau ghi dữ liệu từ chương trình íính các biểu thức X = a*i,
y = b*i + a và s = + 5y^ + 3 với a, b, c là các hằng số, i = 1 :5 'ào tệp c.res thành bảng các giá trị X, y, s;
Trang 18TIN HỌC VÀ ỨNG DỤNG TRONG TÍNH TOÁN
File kiểu byte được khai báo như sau:
var X, y: file o f byte Viái khai báo này ta có thể mở rộng tập tin bất kì như một chuỗi các byte Cíhương trình sau nêu một ví dụ về tập tin có cấu trúc:
Chương ninh ỉ 7
program copy_byte;
var infile, outfile:file o f byte;
procedure mo_tap_tin:
Trang 20TIN HỌC VÀ ỨNG DỤNG TRONG TÍNH TOÁN
Trong chương trình này khi xử lí íập tin ta dùng lệnh read và write chứ không dùng readỉn và writeln vì file o f byte chỉ là một dòng trị số có cấu trúc không xác định Ta chỉ có thể dùng readln với dòng vãn bản được kết thúc bằng đấu chấm câu.
§5 File of record
Tập tin trên đĩa có thể chứa bất kì cấu trúc dữ liệu Pascal nào Trong íUực tế nhiều lúc ta cần ghi một lập tin chứa các record lên đĩa Chương trình sau thực hiện nhiệm vụ đó Các record sẽ ở dưới dạng nhị phân và không xem được nội dung.
Trang 21Clurang y Di7 fiéií rrí can truc
n v l, nv2:kieunv;
fo, fi: file o f kieunv;
ítao thuc don}
Trang 22TIN HỌC VÀ ỬNG DỤNG TRONG TÍNH TOÁN
writeln(' Trinh do ngoai ngu: ’);
w rite(’ Anh van ');
Trang 23Chifcfng I Dif H e n co c u i i true
readln(nvl ngngu anh);
writeC Phap van .
readln(nvL ngngu phap);
readin(nvl ngngu nga);
writeC Due van ');
readln(nvl ngngu due);
write(fo, nv 1); {ghi len tap tin j ;
Trang 24TIN HỌC VÀ ỨNG DỤNG TRONG TÍNH TOÁN
writeln(' N gay sinh nvL ngsinh);
vvTÌteỉnC Qua trinh iuong nvL m uclg);
writeln(’ Nam ien luong gan nhat nvl namlg);
writeỉn{' Trinh do ngoai ngu');
writeln(' Phap: n v l ngngu phap);
soh s:= sohs+ l;
b;= a-sohs;
writeln(' Con lai b, ' nguoi trong danh sach');
write (' Tiep tuc?(c/k)');readln(ans);
end; ịliet ke}
Trang 25Cliirang 1 Di7 lieu cd l an fnic
begin
clrscr; writeln; writeln; writeln;
Trang 26TIN HỌC VÀ ỨNG DỤNG TRONG TỈNH TOÁN
writeC Ngay sinh .
writelnC Trinh do ngoai ngu:');
write(' Anh van ');
readỉn(nvl ngngu anh);
readln(nvl ngngu phap);
writeC N ga van .
readln(nvl ngngu nga);
writeC Due van ');
readln(nvl ngngu due):
write(fo, n v l);Ịg h i len lap tin ị
writelnC Da them s o n v ,' nhan vien');
writelnC Tong so nhan vien Irong danh sach l a : b ) ;
writelnC Bam enter de ve menu chinh');
readỉn;
end;
{liuỵ ho so}
Trang 27Chirmig 1 Di7 lien cd c a n tn'ic
assign(fi, 'a:\hsnv dta');
rename(fi, 'a:\hsnv bak’);
assign(fi, 'a:\hsnv bak’);
Trang 28TIN HỌC VÀ ỬNG DỤNG TRONG TÍNH TOÁN
writeC Cho ten nhan vien can huy ');
readln(tench);
if(tench<>' ’) then
begin
w hile not eo f(fi) do
chep lu fi sang fo tru record can h u y }
writelnC Da huy s o h s ,' ho so');
writelnC C on lai trong danh sach ', a , ' ho su nua');
Trang 29Chương I D ữ liệu có L ấii Íríií
for i:=0 to n-1 do begin
seek ifo, i);
read(fo, n v l);
if (n v l hoten = hoten) then begin
{tim đuocỊ {trinh bay va sua I sohs:= filepos(fo); I so h ie u } clrscr;
Trang 30TIN HỌC VẢ ỨNG DỤNG TRONG TÍNH TOÁN
N gay sinh nvi ngsinh);
Qua trinh iuong n v l m uclg);
Nam len luong gan nhat nvl namlg); Trinh do ngoai ngu ');
Anh van: n v l ngngu anh);
Nga van: n v l ngngu nga);
Phap van: n v l ngngu phap);
Due van: \ n v l ngngu due);
Cho du lieu sua d oi’);
Trang 31Chitifng I Dif lien c6 can fnic
readln(nv2 ngngu anh);
if(nv2 ngngu a n h o ' ') then ngngu anh:= nv2 ngngu anh;
readin(nv2 ngngu phap);
if(nv2 ngngu p h a p o ' ') then ngngu phap:== nv2 ngngu phap;
readln(nv2 ngngu nga);
if(nv2 ngngu n g a o ' ') then ngngu nga:-nv2 ngngu nga;
writeC Due van ');
readln(nv2 ngngu due);
if(nv2 ngngu d u c o ' ’) then ngngu duc:=nv2 ngngu due;
seek (fo, sohs-1);
w rite(fo, n v l){ca p nhat};
Trang 32TIN HỌC VÀ ỪNG DỤNG TRONG TÍNH TOÁN
writelnC Bam enter de ve menu chinh');
Trang 33Chương Ị D ữ Ịiệỉi có C í í i ỉ tì iic
Bam enter de ve menu clunh'):
GOOD BYE, SEE YOU LATE’); Bam enter de ihoat khoi chuong trinh');
{than chuong trinh chinh Ị