Một số bài tập về Tệp


CÁC BÀI TẬP VỀ TỆP
BÀI TẬP 1
Nhập một mảng 2 chiều m dòng, n cột từ file BANG­SO.TXT. Cấu trúc file như sau: dòng đầu là 2 số m và n, cách nhau bằng dấu cách, m dòng sau, mỗi dòng n số nguyên.
a)      Hãy in ra những số là số nguyên tố của mảng.
b)      Tìm vị trí phần tử lớn nhất trong mảng.
c)       Sắp xếp mỗi dòng của mảng tăng dần và in ra mảng dạng ma trận.
HƯỚNG DẪN
Ta khai báo một mảng 2 chiều và nhập dữ liệu từ file vào mảng. Quá trình nhập từ file văn bản giống như nhập từ bàn phím, không cần thực hiện kiểm tra dữ liệu.
Để sắp xếp mảng theo yêu cầu, ta thực hiện sắp xếp từng dòng của mảng bằng cách viết một thủ tục sắp xếp (kiểu đổi chỗ cho đơn giản) coi mỗi dòng của mảng như 1 mảng 1 chiều.
Chương trình:
var m,n : in­te­ger;
    a : ar­ray[1..100,1..100] of in­te­ger;
(* Nhập dữ liệu *)
pro­ce­dure nhap;
var f : text;
    i,j : in­te­ger;
be­gin
     as­sign(f,'BANG­SO.TXT'); re­set(f);
     readln(f,m,n);
     for i := 1 to m do
         for j := 1 to n do read(f,a[i,j]);
     close(f);
end;
func­tion ng­to(k : in­te­ger): boolean;
var i : in­te­ger;
be­gin
     ng­to := false;
     if k < 2 then ex­it;
     for i := 2 to round(sqrt(k)) do
         if k mod i = 0 then ex­it;
     ng­to := true;
end;
pro­ce­dure in­ng­to;
var i,j : in­te­ger;
be­gin
     writeln('Cac phan tu nguyen to cua mang:');
     for i := 1 to m do
         for j := 1 to n do
             if ng­to(a[i,j]) then write(a[i,j],' ');
     writeln;
end;
pro­ce­dure tim­max;
var max,i,j,im,jm : in­te­ger;
be­gin
     max := a[1,1]; im := 1; jm := 1; {im, jm lưu toạ độ phần tử đạt max}
     for i := 1 to m do
         for j := 1 to n do
             if max < a[i,j] then be­gin
                max := a[i,j];  {mỗi lần gán max thì gán toạ độ luôn}
                im := i; jm := j;
             end;
     writeln('Phan tu lon nhat bang la A[',im,',',jm,']=',max);
end;
{Thủ tục thực hiện sắp xếp tăng dần dòng thứ k. Các phần từ dòng k có dạng a[k,i]}
pro­ce­dure xep­dong(k: in­te­ger);
var i,j, tg : in­te­ger;
be­gin
     for i := 1 to n do
         for j := i+1 to n do
             if a[k,i] > a[k,j] then be­gin
                tg := a[k,i]; a[k,i] := a[k,j]; a[k,j] := tg;
             end;
end;
pro­ce­dure sapx­ep;
var i,j : in­te­ger;
be­gin
     for i := 1 to m do xep­dong(i); {sắp xếp từng dòng}
     writeln('Mang sau khi sap xep:');
     for i := 1 to m do be­gin                      {in dạng ma trận}
         for j := 1 to n do write(a[i,j] : 5); {in các phần tử trên 1 dòng}
         writeln;                {in hết 1 dòng thì xuống dòng}
     end;
end;
BE­GIN
     nhap;
     in­ng­to;
     tim­max;
     sapx­ep;
END.
BÀI TẬP 2
Nhập 2 số m, n từ bàn phím, sau đó sinh ngẫu nhiên m´n số nguyên ngẫu nhiên có giá trị từ 15 đến 300 để ghi vào file BANG.TXT. Sau đó thực hiện các yêu cầu sau:
a)      In m´n số đã sinh dạng ma trận m dòng, n cột.
b)      In ra các số chính phương.
Yêu cầu: không được dùng mảng 2 chiều để lưu trữ dữ liệu.
HƯỚNG DẪN
Do yêu cầu không được dùng mảng 2 chiều để lưu trữ dữ liệu nên ta sẽ đọc file đến đâu, xử lí đến đấy.
-         Để sinh các số ngẫu nhiên từ a đến b, ta dùng biểu thức a + ran­dom(b-a+1).
-         Để kiểm tra số k có phải là số chính phương không, ta lấy căn bậc 2 của k, làm tròn rồi bình phương. Nếu kết quả bằng k thì k là số chính phương. Tức là kiểm tra sqr(round(sqrt(k))) = k.
Chương trình:
var m,n : in­te­ger;
    f : text;
pro­ce­dure sinh;
var
    i,j : in­te­ger;
be­gin
     write('Nhap vao 2 so m,n: '); readln(m,n);
     as­sign(f,'BANG.TXT'); rewrite(f);
     writeln(f,m,' ',n);
     for i := 1 to m do be­gin
         for j := 1 to n do
             write(f,15 + ran­dom(300-15+1) : 6); {sinh số ngẫu nhiên từ 15 đến 300}
         writeln(f);
     end;
     close(f);
end;
{Hàm chính phương}
func­tion cp(k : in­te­ger) : boolean;
be­gin
     if sqr(round(sqrt(k))) = k then cp := true
     else cp := false;
end;
pro­ce­dure chinh­phuong;
var
    i,j,k : in­te­ger;
be­gin
     as­sign(f,'BANG.TXT'); re­set(f);
     readln(f,m,n);
     writeln('CAC SO CHINH PHUONG CUA BANG:');
     for i := 1 to m do be­gin
         for j := 1 to n do be­gin
             read(f,k);
             if cp(k) then write(k,' '); {vừa đọc vừa xử lí}
         end;
     end;
     close(f);
end;
pro­ce­dure in­bang;
var
    i,j,k : in­te­ger;
be­gin
     as­sign(f,'BANG.TXT'); re­set(f); {mở lại để in dạng ma trận}
     readln(f,m,n);
     writeln(#10,'IN BANG DANG MA TRAN:');
     for i := 1 to m do be­gin
         for j := 1 to n do be­gin
             read(f,k);
             write(k : 6);      {đọc đến đâu in đến đó}
         end;
         writeln;
     end;
     close(f);
end;
BE­GIN
     sinh;
     chinh­phuong;
     in­bang;
END.

Không có nhận xét nào:

Đăng nhận xét