9. Một file văn bản ghi số liệu của học sinh có dạng sau:
4
Nguyen Van Hung 15 G
Bui Quang Than 14 K
Tran Minh Quang 16 G
Le Van Minh 15 T
Dữ liệu ghi trong file này có ý nghĩa như sau:
- Dòng đầu tiên ghi đúng một số n chỉ số lượng học sinh trong lớp.
- n dòng tiếp theo mỗi dòng ghi dữ liệu của một học sinh.
- Mỗi học sinh được ghi các dữ liệu sau:
Họ và tên: 20 ký tự
Tuổi: 3 ký tự
Xếp loại: 1 ký tự
Hãy viết chương trình nhập dữ liệu học sinh từ file trên và đưa vào các mảng dữ liệu tương ứng, tên file cũng được đọc từ bàn phím.
9. Program BAI09;
Uses crt;
Var f: text; fn: string; {Tên file}
n, i: integer;
ht: array[1..100] of string[20];
t: array[1..100] of string[3];
xl: array[1..100] of char;
Begin
Clrscr;
Write('Tên file cần đọc: '); Readln(fn);
assign(f,fn);
reset(f);
Readln(f,n);
For i:=1 to n do
Readln(f, ht[i], t[i], xl[i]);
close(f); {kiểm tra}
For i:=1 to n do
Writeln(ht[i],t[i]:4,xl[i]:3);
Readln;
End.
10. Làm tương tự bài trên, điểm khác biệt là không có dòng đầu tiên ghi số lượng học sinh. Chương trình phải tự nhận biết và tính được số n đó.
10. Program BAI10;
Uses crt;
Var
f: text;
fn: string; {Tên file}
n, i: integer;
ht: array[1..100] of string[20];
t: array[1..100] of string[3];
xl: array[1..100] of char;
Begin
Clrscr;
Write('Tên file cần đọc: ');Readln(fn);
assign(f,fn);
reset(f);
i:=1;
While not(eof(f)) do
Begin
Readln(f,ht[i],t[i],xl[i]);
inc(i);
End;
n:=i-1;
close(f); {kiểm tra}
For i:=1 to n do
Writeln(ht[i],t[i]:4,xl[i]:3);
Readln;
End.
11. Thực hiện tất cả các thao tác với các dạng file văn bản như trong phần Câu hỏi, ví dụ, bài tập nhưng theo chiều ngược lại, tức là thực hiện các thao tác ghi.
11. 1. Program BAI111;
Uses crt;
Var
f:text;
m,n:integer;
Begin
Clrscr;
m:=10;
n:=4;
assign(f, 'son.inf');
reWrite(f);
Writeln(f, m,' ',n);
close(f);
assign(f, 'son.inf');
reset(f);
Readln(f, m, n);
close(f);
Writeln(m:4, n:4);
Readln;
End.
11. 2. Program BAI11.2;
Uses crt;
Var f:text;
m,n:integer;
Begin
Clrscr;
m:=4;
n:=5;
assign(f, 'sod.inf');
reWrite(f);
Writeln(f, m);
Writeln(f, n);
close(f);
assign(f, 'sod.inf');
reset(f);
Readln(f, m);
Readln(f, n);
close(f);
Writeln(m);
Writeln(n);
Readln;
End.
11. 3. Program BAI11.3;
Uses crt;
Var f:text;
n,i:integer;
a:array[1..100] of integer;
Begin
Clrscr;
Write('Nhập số n: ');Readln(n);
Writeln('Nhập dãy n số : ');
For i:=1 to n do
Begin Write('a[',i:2,'] = ');Readln(a[i]); End;
assign(f,'data.txt');
rewrite(f);
Writeln(f,n);
For i:=1 to n do
Begin Writeln(f,a[i]); End;
close(f);
assign(f, 'data.txt');
reset(f);
Readln(f, n);
For i:=1 to n do Readln(f,a[i]);
close(f);
For i:=1 to n do Writeln(a[i]);
Readln;
End.
11. 4. Program BAI11.4;
Uses crt;
Var f:text;
n,i:integer;
a:array[1..100] of integer;
Begin
Clrscr;
Write('Nhập số n: ');Readln(n);
Writeln('Nhập dãy n số: ');
For i:=1 to n do
Begin Write('a[',i:2,'] = ');Readln(a[i]); End;
assign(f,'data.txt');
rewrite(f);
Writeln(f,n);
For i:=1 to n do
Begin Write(f,a[i],' '); End;
Writeln(f);
close(f);
assign(f,'data.txt');
reset(f);
Readln(f,n);
For i:=1 to n do Read(f,a[i]);
close(f);
For i:=1 to n do Writeln(a[i]);
Readln;
End.
11. 6. Program BAI11.6;
Uses crt;
Var f: text;
n, i: integer;
a: array[1..100] of integer;
Begin
Clrscr;
Write('Nhập số n: '); Readln(n);
Writeln('Nhập một dãy số n: ');
assign(f,'data.txt');
reWrite(f);
i:=1;
Repeat
Write(' a[',i:2,'] = '); Readln(a[i]);
Writeln(f,a[i]);
inc(i);
Until (i>n);
close(f);
assign(f,'data.txt');
reset(f);
While not(seekeoln(f)) do
Begin
Readln(f,a[i]);
Writeln(a[i]);
End;
close(f);
Readln;
End.
11. 9. Program BAICT11.9;
{$R+}
Uses crt;
Var f: text; fn: string; {Tên file}
n, i, l, j: integer;
ht: array[1..100] of string[20];
t: array[1..100] of string[3];
xl: array[1..100] of char;
Begin
Clrscr;
Write('Tên file cần đọc: '); Readln(fn);
Write('Số lượng học sinh: '); Readln(n);
assign(f,fn);
rewrite(f);
Writeln(f,n);
For i:=1 to n do
Begin
Write('Nhập họ và tên: '); Readln(ht[i]);
l:=length(ht[i]);
If (l<20) then
For j:=l+1 to 20 do ht[i]:=ht[i]+' ';
Write('Nhập tuổi: '); Readln(t[i]);
l:=length(t[i]);
If (l<3) then
For j:=l+1 to 3 do t[i]:=' '+t[i];
Write('Nhập xếp loại: '); Readln(xl[i]);
Writeln(f, ht[i], t[i], xl[i]);
End;
close(f);
assign(f, fn);
reset(f);
Readln(f, n);
For i:=1 to n do
Begin
Readln(f, ht[i], t[i], xl[i]);
Writeln(ht[i], t[i]:4, xl[i]:3);
End;
close(f);
Readln;
End.
12. Có thể được hay không thực hiện việc ghi ra file văn bản trên một dòng các biến với kiểu dữ liệu khác nhau. Ví dụ có thể được hay không việc ghi ra file như sau:
Writeln(F, Xau1, So1, Xau2, So2) với Xaux là các biến kiểu string còn Sox là biến kiểu Real.
12. Được.
13. Số liệu được nhập từ một file văn bản INPUT.TXT và có dạng sau:
- Dòng đầu tiên ghi số tự nhiên N (N <20).
- N dòng tiếp theo, mỗi dòng ghi một dãy số, các số cách nhau bởi dấu cách. Số lượng phần tử của các dãy có thể khác nhau.
Viết chương trình nhập số liệu từ file trên, sắp xếp n dãy trên theo thứ tự tăng dần và ghi kết quả ra file OUTPUT.TXT có dạng tương tự như file nhập liệu.
13. Program BAI13;
Uses crt;
Var fin, fou: text;
n, m, i, j, k, kmax: integer;
a: array[1..100] of real;
atg: real;
Begin
Clrscr;
assign(fin, 'input.txt');
reset(fin);
assign(fou, 'output.txt');
reWrite(fou);
Readln(fin, n);
Writeln(fou, n);
For i:=1 to n do
Begin
j:=1; {đọc dòng thứ i của input.txt}
While not(seekeoln(fin)) do
Begin
Read(fin,a[j]);
inc(j);
End;
Readln(fin);
{sắp xếp lại dòng thứ i đó}
m:=j-1;
For j:=1 to m-1 do
Begin
kmax:=j;
For k:=j to m do
If (a[k]>a[kmax]) then kmax:=k;
atg:=a[j];
a[j]:=a[kmax];
a[kmax]:=atg;
End;
{ghi dòng đó ra output.txt}
For j:=1 to m do
Write(fou,a[j]:8:2);
Writeln(fou);
End;
close(fin);
close(fou);
{kiểm tra}
assign(fou,'output.txt');
reset(fou);
Readln(fou,n);
For i:=1 to n do
Begin
While not(seekeoln(fou)) do
Begin
Read(fou,atg);
Write(atg:8:2);
End;
Readln(fou);
Writeln;
Writeln;
End;
close(fou);
Readln;
End.
14. Một danh sách lớp được ghi trong một File văn bản có dạng sau:
Nguyen Van Minh Nam
Nguyen Tung Chau Nu
Tran Quang Thu Nam
Bui Van Ngo Nam
...................................................
Trong đó họ và tên học sinh được ghi trên độ dài 20 ký tự, 3 ký tự tiếp theo sẽ ghi Nam hoặc Nu chỉ giới tính của học sinh đó. Số dòng của file này sẽ bằng số học sinh trong lớp.
Em hãy viết chương trình thực hiện các công việc sau:
Nhập tên File số liệu từ bàn phím, sau đó nhập dữ liệu từ File vào bộ nhớ máy tính.
Thực hiện việc sắp xếp lại danh sách học sinh trong lớp sao cho các bạn Nữ lên trước, các bạn Nam sau.
Nhập tên File kết quả từ bàn phím và ghi danh sách lớp sau khi đã sắp xếp lại ra File đó theo mẫu giống như lúc đọc vào.
14. Program BAI14;
Uses crt;
Var tfin, tfou: string;
fin, fou: text;
n, i, j: integer;
a: array[1..100] of string[23];
atg: string[23];
Begin
Clrscr;
Write('Đọc số liệu từ file:'); Readln(tfin);
assign(fin, tfin);
reset(fin);
i:=1; {đọc file tfin}
While not(seekeof(fin)) do
Begin
Readln(fin,a[i]);
inc(i);
End;
{sắp xếp lại}
n:=i-1;
For i:=1 to n-1 do
If (copy(a[i],21,3)='Nam') then
For j:=i to n do
If (copy(a[j],21,3)>='Nu') then
Begin atg:=a[i]; a[i]:=a[j]; a[j]:=atg; End;
close(fin);
{ghi rafile tfou}
Write('Ghi số liệu ra file: '); Readln(tfou);
assign(fou,tfou);
reWrite(fou);
For i:=1 to n do Writeln(fou, a[i]);
close(fou);
{kiểm t ra}
assign(fou,tfou);
reset(fou);
For i:=1 to n do
Begin Readln(fou,atg); Writeln(atg); End;
close(fou);
Readln;
End.
15. Đầu bài giống bài trên. Hãy viết chương trình để thực hiện các công việc sau:
- Đếm xem trong lớp có bao nhiêu bạn là Nam, bao nhiêu bạn là Nữ.
- Kiểm tra xem lớp có hai bạn nào cùng họ hay không? Nếu có liệt kê tất cả các bạn có chung họ.
15. Program BAI15;
Uses crt;
Var tfin: string; fin: text;
n, i, j, snam, snu: integer;
a: array[1..100] of string[23];
t: boolean;
(*=====================*)
Function ho(hvt:string):string;
Var i: byte;
h: string;
Begin
i:=1;
While (hvt[i]=' ') do inc(i);
h:='';
While (hvt[i]<>' ') do
Begin
h:=h+upcase(hvt[i]);
inc(i);
End;
ho:=h;
End;
(*===================*)
Begin
Clrscr;
Write('Đọc số liệu từ file: '); Readln(tfin);
assign(fin, tfin);
reset(fin);
i:=1; {đọc file tfin}
While not(seekeof(fin)) do
Begin
Readln(fin, a[i]);
inc(i);
End;
close(fin);
{tính số nam, nữ}
n:=i-1;
snam:=0;
snu:=0;
For i:=1 to n do
If (copy(a[i],21,3)='Nam') then snam:=snam+1
Else snu:=snu+1;
Writeln('Số nam: ',snam,'. Số nữ : ',snu,'.');
{Tìm người chung họ}
For i:=1 to n do
Begin
j:=1;
t:=false;
Repeat
If (ho(a[j])=ho(a[i]))and(j<>i) then t:=true;
inc(j);
Until (t)or(j>n);
If t then Writeln(a[i]);
End;
Readln;
End.
16. Đầu bài giống bài trên. Hãy viết chương trình đọc dữ liệu và in kết quả ra File sau khi đã sắp xếp các bạn trong lớp theo trật tự sau: trước tiên sắp xếp theo giới tính, các bạn Nữ trước, Nam sau, sau đó sắp tiếp trong số các bạn cùng giới theo tên theo thứ tự ABC, sau đó sẽ sắp tiếp theo họ. Trong ví dụ của bài trên file kết quả sẽ có dạng
Nguyen Tung Chau Nu
Nguyen Van Minh Nam
Bui Van Ngo Nam
Tran Quang Thu Nam
16. Program BAI16;
Uses crt;
Var tfin, tfou: string;
fin, fou: text;
n, i, j: integer;
a: array[1..100] of string[23];
atg: string[23];
(*======================*)
Function thutu(hvt:string):string;
Var i, j, l, l1: byte;
ten: string[8];
g, tg: char;
Begin
For i:=1 to 23 do hvt[i]:=upcase(hvt[i]);
If (copy(hvt,21,3)='NAM') then g:='b' else g:='a';
ten:=' ';
i:=20;
While (hvt[i]=' ') do dec(i);
j:=1;
While (hvt[i]<>' ') do
Begin
ten[j]:=hvt[i];
dec(i);
inc(j);
End;
l1:=i;
l:=j-1;
For i:=1 to (l div 2) do
Begin tg:=ten[i]; ten[i]:=ten[l-i+1]; ten[l-i+1]:=tg; End;
thutu:=g+ten+copy(hvt,1,l1);
End;
(*=========================*))
Begin
Clrscr;
Write('Đọc số liệu ghi từ file: '); Readln(tfin);
assign(fin, tfin);
reset(fin);
i:=1; {Đọc file tfin}
While not(seekeof(fin)) do
Begin
Readln(fin, a[i]);
inc(i);
End;
n:=i-1;
For i:=1 to n-1 do
For j:=i+1 to n do
If (thutu(a[i])>thutu(a[j])) then {sắp xếp lại}
Begin atg:=a[i];a[i]:=a[j];a[j]:=atg; End;
close(fin);
Write('Ghi số liệu ra file: '); Readln(tfou); {ghi ra file tfou}
assign(fou, tfou);
rewrite(fou);
For i:=1 to n do Writeln(fou, a[i]);
close(fou);
assign(fou,tfou); {kiểm tra}
reset(fou);
For i:=1 to n do
Begin Readln(fou, atg); Writeln(atg); End;
close(fou);
Readln;
End.
17. Cho trước một xâu nhị phân độ dài bất kỳ được đưa vào từ file văn bản INPUT.TXT. Cần biến đổi xâu nhị phân này về dạng toàn số 0. Các phép biến đổi có thể chỉ là một trong các loại sau:
- Biến đổi xâu con 11 thành 00.
- Biến đổi xâu con 010 thành 000.
Hãy chỉ một cách biển đổi xâu đã cho thành xâu có toàn 0. Kết quả thể hiện trong file OUTPUT.TXT như sau:
Dòng đầu tiên của OUTPUT.TXT chứa xâu ban đầu, sau đó mỗi dòng là một xâu tiếp theo sau một phép biến đổi, xâu cuối cùng là xâu toàn 0.
17. Program BAI17;
Uses crt;
Const
st1='11';
st2='010';
Var
fin, fou: text;
l, p: integer;
st: string;
(*====================*)
Procedure ghi1(i:integer);
Begin
st[i]:='0';
st[i+1]:='0';
Writeln(fou, st);
End;
(*==================*)
Procedure ghi2(i:integer);
Begin
st[i+1]:='0';
Writeln(fou, st);
End;
(*==================*)
Begin
Clrscr;
assign(fin, 'input.txt');
reset(fin);
Readln(fin, st);
close(fin);
l:=length(st);
If ((st[l]='1')and(st[l-1]='0'))or((st[1]='1')and(st[2]='0')) then
Writeln('Không thể biến đổi được!')
Else
Begin
assign(fou,'output.txt');
rewrite(fou);
Writeln(fou,st);
If (st[l]='1')and(st[l-1]='1') then ghi1(l-1);
Repeat { biến đổi xâu con '11' }
p:=pos(st1,st);
If (p<>0) then ghi1(p);
Until (p=0);
Repeat {biến đổi xâu con '010' }
p:=pos(st2,st);
If (p<>0) then ghi2(p);
Until (p=0);
close(fou);
{kiểm tra}
assign(fou,'output.txt');
reset(fou);
While not(seekeof(fou)) do
Begin
Readln(fou,st);
Writeln(st);
End;
close(fou);
End;
Readln;
End.
18. Cho một file văn bản BL.PAS trên đó ghi một chương trình Pascal.
Hãy viết chương trình thực hiện các công việc sau:
Kiểm tra xem trong chương trình trên số các từ Begin có bằng số các từ End hay không.
Kiểm tra tính đúng đắn của các chú thích của chương trình: số các ký tự "{" có bằng số các ký tự "}" không.
18. Program BAI18;
Uses crt;
Var f: text;
st: string;
sb, se, sm, sd: string;
b, e, m, d: integer;
(*==================*)
Function dem(s1, s2: string): byte;
Var i, l, p, s: byte;
Begin
l:=length(s2);
For i:=1 to l do s2[i]:=upcase(st[i]);
p:=pos(s1,s2);
s:=0;
While (p<>0) do
Begin
s:=s+1;
l:=length(s2);
s2:=copy(s2,p+1,l-p);
p:=pos(s1,s2);
End;
dem:=s;
End;
(*=============*)
Begin
Clrscr;
assign(f,'bl.pas');
reset(f);
sb:='Begin';
se:='End';
sm:='{';
sd:='}';
b:=0;
e:=0;
m:=0;
d:=0;
While not(seekeof(f)) do
Begin
Readln(f,st);
b:=b+dem(sb,st);
e:=e+dem(se,st);
m:=m+dem(sm,st);
d:=d+dem(sd,st);
End;
close(f);
Writeln(' b = ',b,' e = ',e,' m = ',m,' d = ',d);
If (b=e)then Writeln('Số các từ ''Begin'' bằng số các từ ''end'' .')
Else Writeln(' Số các từ ''Begin'' không bằng số các từ ''end'' .');
If (m=d)then Writeln('Số các dấu ''{'' bằng số các dấu ''}'' .')
Else Writeln('Số các dấu ''{'' không bằng số các dấu ''}'' .');
Readln;
End.
19. Một văn bản có tên BL.PAS chứa một chương trình Pascal hoàn chỉnh. Trong chương trình này trên một dòng có thể chứa nhiều lệnh.
Em hãy viết chương trình in ra file mới có tên BLMOI.PAS chương trình Pascal trên sao cho thỏa mãn điều kiện mỗi lệnh phải nằm trên một hàng.
19. Program BAI19;
Uses crt;
Var fin, fou: text;
st, st1: string;
l, p: byte;
Begin
Clrscr;
assign(fin, 'p4216.pas');
reset(fin);
assign(fou, 'blmoi.pas');
rewrite(fou);
st1:='';
While not(seekeof(fin)) do
Begin
Readln(fin,st);
st1:=st1+' '+st;
Repeat
l:=length(st1);
p:=pos(';', st1);
If (p<>0) then
Begin
st:=copy(st1, 1, p);
Writeln(fou, st);
st1:=copy(st1, p+1, l-p);
End;
Until (p=0);
End;
Writeln(fou, st1);
close(fin);
close(fou);
assign(fou, 'blmoi.pas');
reset(fou);
While not(seekeof(fou)) do
Begin Readln(fou, st); Writeln(st); End;
close(fou);
Readln;
End.
20. Tại một sân ga người ta xét hành lý của hành khách và ghi kết quả vào file có tên KHACH.INF sao cho mỗi hành khách được ghi trên một dòng, mỗi kiện hàng được ghi rõ số cân trên hàng đó. Ví dụ một file như vậy có dạng sau:
4
12 4 5.5 6 2
21
15 5
1 6
File trên có ý nghĩa sau: có tất cả 4 hành khách, hành khách 1 có 5 kiện hàng với số cân tương ứng là 12, 4, 5.5, 6 và 2kg, khách thứ hai có 1 kiện nặng 21 kg....
Hãy viết chương trình thực hiện các công việc sau:
Tính tổng số cân của mỗi hành khách và in kết quả ra file có tên CAN.KQ, mỗi hành khách là một số trên một hàng. Ví dụ với file đầu vào như trên thì kết quả sẽ là:
29.5
21
20
7
Kiểm tra và in ra những khách hàng không đủ tiêu chuẩn đi tàu. Số liệu được ghi ra file có tên HUY.KQ, mỗi dòng ghi số thư tự hành khách không đủ điều kiện. Biết rằng hành khách sẽ không đủ điều kiện đi tầu nếu tổng số trọng lượng hàng hóa lớn hơn 20 kg hoặc có quá 10 kiện hàng. Trong ví dụ trên các hành khách số 1 và 2 là không đủ điều kiện do đó file kết quả sẽ có dạng:
1
2
20. Program BAI20;
Uses crt;
Var fin, fou, fhuy: text;
sum, can: real;
n, i, k: byte;
Begin
Clrscr;
assign(fin, 'KHACH.INF');
reset(fin);
Readln(fin, n);
assign(fou, 'CAN.KQ');
reWrite(fou);
assign(fhuy, 'HUY.KQ');
rewrite(fhuy);
For i:=1 to n do
Begin
sum:=0;
k:=0;
While not(seekeoln(fin)) do
Begin
Read(fin,can);
sum:=sum+can;
k:=k+1;
End;
Writeln(fou, sum);
If (sum>20)or(k>10) then Writeln(fhuy, i);
Readln(fin);
End;
close(fin);
close(fou);
close(fhuy);
assign(fou, 'CAN.KQ');
reset(fou);
Writeln(' File ''CAN.KQ'' :');
While not(seekeof(fou)) do
Begin
Readln(fou, sum);
Writeln(sum:6:2);
End;
close(fou);
assign(fhuy, 'HUY.KQ');
reset(fhuy);
Writeln('File ''HUY.KQ'' :');
While not(seekeof(fhuy)) do
Begin Readln(fhuy,i); Writeln(i); End;
close(fhuy);
Readln;
End.