ĐH KỸ THUẬT
-
pl
\
1
J"_
■■
ỨJ'JÌJ
M
><;•I.•••yís•'•Aỉ«s-
ilJ J j'J l]
r ijü j'jij - j j ij ij 7 ]J/\j'j
HỌC QUỐC (ỈIA
HN
IKUN«TÁM
tiiổm;tin- HIUVIÈN
Ỉ) Ạ I
004/42
V-GO
1234567890
NHÀ XUẤT BẢN GIÁO DỤC
T S TRẦN VĂN CHỈNH
TIN HỌC ỨNG DỤNG
TRONG TÍNH TOÁN
■
NHÀ XUẨT
■
b ả n g iá o d ụ c
- 2001
LỜI NÓI ĐẦU
Giáo íììiììì ”Tin hạc ứng dụng trong tính to á n ” dìiỉìg ìàm ĩcìị ỉiệu
ịịìảỉìg d ạ \ \'í) Ịỉọc ỉậ p cho si fill viêỉì các Ii^áiiỉĩ k ĩ tìỉitậỊ cilng n h ư ỉàm íài
Ịiệit ỉliam klìáo ch o các k ĩ su' rờ cck' càn bộ k ĩ thuật. N ộ i dung 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 niệm người â ọ c d ã có kiểu tỉìức c ơ bắn vé ỉập trình hằng
ngón figữ P a sca l nén giáo trìíiỉì tiùy được chia làm hai phấ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 ng ữ P a sca l và
phầ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ụng 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. Sau tuổi pliầiì iỉhư vậy LỈểii có ví dụ bằng s ổ và
có chương tl 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 ro n g quá trìiiỉỉ hiứii ỉioụ/ì chúỉig tôi đ ã í ô gắng 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 giáo t r ì n h
được hiêii soạn íi'Ofig Dĩộĩ Ỉỉìcn <^iaii iìgắìỉ iìêìì không 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Ả
TIN HỌC ỨNG DỤNG TRONG TÍNH TOÁN
Phần I
NGÔN NGỮ LẬP
TRÌNH PASCAL
u
Chương 1
Dữ LIỆU
CÓ CÂU TRÚC
*
§1. Kiểu record
Trong thực tế có những đối tượng được mò tả bởi nhiều tham số, ví dụ
như cuốn sách, con người, địa chỉ V. V. D o đó Turbo Pascal cung cấp cho ta
một kiểu dừ liệu gọi ià bản ghi (record). Record là một kiểu dữ liệu gồm
nhiều thành phần, mỗi thành phần được gọi là một trường của record.
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 = record
<íên trường l>:;
:;
V í dụ:
end;
var :;
type
dia_chi = record
so_nha: integer;
pho: string[50];
thanh_pho: string[20];
end;
Chương ì . Dữìiàii có cấii trúc
v ar
D ạng 2:
a, b: dia_chi;
var = recorđ
:;
:;
end;
V í dụ:
var
date: record
day: 1. . 31;
month; 1. . 12;
year: integer;
end;
Các record CÓ ihể lồng nhau. Đ ể thâm nhập vào một trường của record ta
phải dùng tên biến kiểu record, sau đó đặt đấu
" rồi đến tên trường của
record đó. V í dụ ta viết:
var t:dia_chi;
begin
writeln('Cho so n h a ');
readln(t. so_nha);
writeln('Cho p h o ');
readln(t. pho);
wríteln('Cho thanh pho');
readln(t. thanh_pho);
end.
Việc thâm nhập các trường của record tương đối phức tạp và có phần tẻ
ahạt vì phải dùng nhiều lần tên biến cùng các tên ưường. Đ ể đơn giản
Borland Pascal đưa ra lệnh with..đo. Lúc này ví dụ trên được viết iại thành:
var t:dia_chi;
begin
with t do
.
TIN HOC ỨNG DỤNG TRONG TÍNH TOÁN
begin
writelni’Cho so n h a ');
readIn(so_nha);
writelnCCho p h o ');
readln(pho);
writelnCCho thanh pho'):
readln(thanh_pho);
end;
;nd.
Sau day la mot vi du v6 record:
Chương trình ỉ . I
program ban_ghi; {vi du ve ban g h i}
uses crt;
const n=3;{3 hoc sinh}
m=3;{ 3 mon thi}
type t=record
hoten;string[30];
diem :array[l. . m] o f integer;
end;
var h s;a rra y [l.. n] o f t;
i,
j, k:integer;
dtb:real;
begin
clrscr;
gotoxy(35, 1);
writeinCNHAP BANG DIEM');
writeln;
Chương Ị. Di7 liệu có cđií trúc
wrileln(Tt
Ho va ten
D iem thi’);
for i:= l to n do
with hs[i] đo
begin
write(i:2);
g o to x y (ỉ2 , 3+i);
readln(hoten);
for k := l to m do
begin
gotoxy(31+3*k, 3+i);
readln(diem[k]);
end;
end;
readln;
cirscr;
gotoxy(32, 1);
writeln(’D A N H SACH HOC SINH KHA');
writein;
writelnCTt
Ho va ten
writeln;
j:=0;
for i:= l to n do
with hs[i] do
begin
dtb;=0;
for k := i to m do
dtb:= dtb+diem[k];
dtb:=dtb/m;
if dtb>7. 5 then
8
Diem trung binh');
TIN HỌC VÀ ỬNG DỤNG TRONG TÍNH TOÁN
begin
j:= j+ l;
write(j:2);
gotoxy(12, 4+j);
writeln(hoten);
gotoxy(38, 4+j);
writeln(dtb:4;2);
end;
end;
readln;
end.
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:
type
khoa = ( dien, dien_tu, co_khi);
diem = ( 0. . 10);
sinh_vien = record
ho_ten: string[30];
nam: byte;
case sv„khoa: khoa o f
dien: ( mach, vitinh, anhvan: diem);
Chươ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.
§2. Tập tin text
Máy tính có thể giao tiếp với các thiết bị khác như modem, m áy in, ổ
đĩa. Mặc dù các thiết bị này có đâc tính khác nhau nhưng Borland Pascal
đề ra các phương pháp chuẩn để giao tiếp giữa chương trình và các thiết bị
trên. Giải pháp cho vấn đề đó là dữ liệu kiểu tập tin. File là cửa ngõ mà
thông qua đó máy tính liên lạc với thế giới bên ngoài.
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:
ỈO
TIN HỌC VÀ ỨNG DỤNG TRONG TÍNH TOÁN
var x; text;
hay
var x: file o f char;
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à:
Tên tập ĩiìĩ
M6 td
input
output
aix
auxiliary(com 1)
yes
yes
n
console and keyboard
yes
yes
jrn
printer(lpt I )
no
yes
com l
communication port 1
yes
yes
com2
communication port 2
yes
yes
b tl
line printer 1
no
yes
l)t2
line printer 2
no
yes
bt3
line printer 3
no
yes
rul
bit bucket
yes
yes
rul
standart input and output
yes
yes
- 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ụ:
11
Chươ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ị cho 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ó).
Chương trình ỉ . 2
program tao_van_ban;
var tap_tin: text;
begin
assign(tap„tin, 'thi_du. txt’);
rewrite(tap_ún);
writeln(tap_tin, 'Mot vi du ve tap tin' );
writeln(tap_tin, 'Chuong trinh minh hoa ca 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
close. 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.
12
TÍN HỌC VÀ ỪNG DỤNG TRONG TÍNH TOÁN
Để đọc nội đung tập tin vản bản ta dùng lệnh read hay readln.
Chương trĩnh I. 3
pro»gram doc_van_ban;
uses crt;
var tap_tin: text;
l;en_tt: slring[14];
dong: string[80];
begin
cLrscr;
w díeln('D oc noi dung tap tin);
wTÌte('Cho ten tap tin');
re;adln(ten„tt);
assign(tap_tin, ten_tt);
re;set(tap_tin);
w h ile not eof(tap_tin) đo
begin
readln(tap_tin, dong);
writeln(dong);
end;
ckose(tap_tin);
end.
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ụng 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 of íự độ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 clo se. Khi đóng, các dữ liệu còn trong bộ nhớ sẽ được ghi lên tập tin.
13
Chươ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');
close(tf);
Đ ôi khi ta cần thêm số hiệu dòng vào một vãn bản. Chương trình
sau là một ví dụ chuẩn thường dùng để đọc và viết ra tập tin văn bản:
C h ư ơ n g trìn h ỉ . 4
program sao_chep;
const ten = 'Sao chep tap tin';
type string 132 = string[132
var infile, outfileitext;
line: integer;
procedure m o_file;
var tenfile:string[14];
begin
write(Tap tin nhap');
•readln(tenfiie);
assign(infiie, tenfile);^
14
TIN HỌC VÀ ỬNG DỤNG TRONG TÍNH TOẢN
reset(infiie);
write(Tap tin xuat');
readln(ienfile);
assign(outfile, tenfile);
rewrite(outfile);
end;
procedure xu_li_dong(var s:stringl32);
begin
line:= line + 1;
write(outfile, line:5,
end;
procedure xu_li_file;
var s:stringl32;
begin
while not eof(infile) do
begin
readln(infiie, s);
xu Ji„don g(s);
writeln(ouifile, s);
end;
end;
begin
line:= 0;
writein;
mo_file;
xu_li_file;
15
Chươ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
- mở tệp ngoài bằng ỉệnh reset
- đọc nội dung tệp bằng lệnh read hay readln
- đóng tệp sau khi đọc
Cụ thể các lệnh là:
" assign(f, ’nam e’)
- resel(f);
- read(f, X, y . . . );
- close(f);
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 giá 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’);
16
TIN HOC VA ONG DUNG TRONG TINH TOAN
read(f, a, bj;
writeln( ‘a =
a, ’b =
b);
close(f);
Giả sử đã có tập tin w. dat đã có trên đĩa với các số ỉiệu ghi theo thứ tự
sau; 0.544; 78.430; 24.1; 10.5. Cần đọc các giá trị này vào và tính tổng của
chúng. Mỗi phần tử của tệp f 1 được gán cho biến tên là s trong chương trình.
Tổng của chúng đật trong biến sum.
Chương trình 1. 5
program doc_tep;
uses crt;
var fl.'text;
sum, sireal;
begin
clrscr;
su m ;- 0. 0;
a ssig n (fl, 'w. dat');
reset(fl);
while not e o f ( f l) do
begin
while not e o ln (fl) do
begin
rea d (fl, s);
sum:= sum + s;
end;
readln(fl);
end;
writeinCTong bang:
sum:5:2);
Chươ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.
Việ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;
_______________________ Chương trình 1. ó_____________________
program ghi_tep;
uses crt;
const n=5;
a=2. 1;
b = l. 9;
var fh text;
X, y, s:real;
i:integer;
begin
a s s ig n (f l, 'c. res');
18
‘
TIN HỌC VÀ ỨNG DỤNG TRONG TÍNH TOÁN
re w rite (fi);
w riteln(fl, File chua ket qua cua chuong trinh ghi tep’);
writeỉn(U);
w riteln(fl, 'Bang gia tri X y
w riteln(fl, 'x
y
s’);
s'):
for i:=l to n do
begin
x:= a*ị;
y:= b*i + a;
s;= x*x - 5*y*y*y + 3;
w riteln(fl, x :8 :2 ,'
y:7:2, '
s:10:2);
end;
vvritelnCKet thuc chuong trinh’);
clo se(fl);
end.
§4. Files of byte
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 of byte;
procedure mo_tap_tin:
19
C/ uf cy u g I . D i ( l i e n CO c a n I n i c
var ten_tap_tin: string[10];
begin
writeCCho ten tap tin can mo');
readln(ten_tap„tin);
assign(infile, ten„tap_tin);
reset(infile);
write('Cho ten tap tin xuat');
readln(ten_tap_tin);
assign(outfile, ten_tap_tin);
rewrite(outfile);
end;
procedure xu_Ii_tap_tin;
var onebyte: byte;
begin
while not eof(infile) do
begin
read(infile, onebyte);
write(outfile, onebyte);
end;
end;
begin
writelnCCopy tap tin bat ki');
writeln;
mo_tap_tin;
xu ji_tap _tin :
close(infile);
close(outfile);
end.
20
TIN 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.
__ ____________________ Chương trình ỉ. 8_______________________
program qly;
uses crt;
type
kieunv = record
hoten:string[30];
ngsinh; string[8];
muclg: string[20];
namlg:string[4];
ngngu: record
anh:stríng;
nga: string;
phap:string;
ducrslring;
end;
end;
var chon;inieger;
21
- Xem thêm -