Hướng dẫn làm Bài tập 1 về Kiểu FILE - Phạm Đăng Long

Chương trình 1:

 

Tạo ra tệp SNT-BYTE.DAT trên đĩa, gồm các số nguyên tố loại nhỏ kiểu Byte, tức là trong khoảng 0 đến 255.

{Không cần phải uses crt vì chương trình này không dùng đến bàn phím và màn hình}

 

var f : file of byte;
    n : byte;
function LaSNT(n:word):boolean;
var k:word;
begin
  if (n=2) or (n=3) then LaSNT:=true
  else
    if (n mod 2=0) or (n<=1) then LaSNT:=false
    else
      begin
        k:=3;
        while (n mod k>0) and (k<=sqrt(n)) do k:=k+2;
        if n mod k=0 then LaSNT:=false
        else LaSNT:=true
      end;
end;
BEGIN
  assign(f,'snt-byte.dat');
  rewrite(f);
  for n:=2 to 255 do
    if LaSNT(n) then write(f,n);
  close(f);
END.

Chương trình 2.

Xuất ra bảng số nguyên tố nhỏ hơn 255, lấy từ Tệp SNT-BYTE.DAT đã có sẵn trên đĩa, tức là sau khi chạy chương trình 1.

 

Uses crt;
var f : file of byte;
  n : byte;
BEGIN
  Clrscr;
  assign(f,'snt-byte.dat');
  reset(f);
  while not(EOF(f)) do {EOF(f) là đầu đọc/ghi đang áp vào dấu hiệu chấm hết tệp}
    begin
      read(f,n);
      write(n,’, ’);
    end;
  close(f);
END.

 

Chương trình 1 cải tiến, đề phòng tệp mà mình định tạo ra đã có rồi, thì thận trọng hỏi lại xem có viết đè đi hay không theo ý muốn của người sử dụng:


Uses crt; {Chương trình này không dùng đến bàn phím và màn hình}
var f : file of byte;
  n : byte;
Function LaSNT(n:byte):boolean;
---- chép lại như cũ ----
BEGIN
assign(f,'snt-byte.dat');
{$I-}
Reset(f);
If IOResult=0 then {Mã lỗi = 0 tức là mở được tệp, tức là tệp đã tồn tại rồi}
  Begin
    Writeln(‘Tệp SNT-Byte.dat đã tồn tại. Có tạo mới đè tệp cũ đi không?-(C/K)’);
    if readkey in [‘K’,’k’] then exit;
  End;
{$I+}
  rewrite(f);
  for n:=2 to 255 do
    if LaSNT(n) then write(f,n);
  close(f);
END.

 

Chương trình  2 cải tiến, đề phòng tệp mà mình định tạo ra không có trên đĩa, do chưa tạo ra hoặc la đã bị xóa hay hỏng do virus phá hỏng, cần báo lỗi và thoát:


Uses crt;
var f : file of byte;
  n : byte;
BEGIN
  Clrscr;
  assign(f,'snt-byte.dat'); {Để thí nghiệm, thay chữ dat bằng chữ txt xem nhé!}
  {$I-}
  reset(f);
  if IOResult<>0 then {Mã lỗi <> 0 tức là tệp có lỗi...’}
    begin
      Writeln(‘Tệp không mở được. Gõ một phím để thoát!’);
      Readkey;
      exit;
    end;
  {$I+}
  while not(EOF(f)) do
    begin
      read(f,n);
      write(n,’, ’);
    end;
  close(f);
END.

 

Chương trình 3.

 

Viết ra số nguyên tố thứ k, nhập từ bàn phím. {Để đơn giản không kiểm tra lỗi tệp}


Uses crt;
var f   : file of byte;
  n   : byte;
  k   : integer; {Khai bao kieu lon hon de de so sanh}
BEGIN
  Clrscr;
  assign(f,'snt-byte.dat');
  reset(f);
  Repeat
    Write(‘Ban xem số nguyên tố thứ mấy? ‘);
    Readln(k); {Neu ta khai bao k kieu byte, ti khi k=257, may se tu cho k=2}
    If (k<1) or (k>filesize(f)) then
      Begin
        Writeln(‘Khong duoc!’);
        continue;
      end;
    Seek(f,k-1);
    {STT các phần tử của tệp tính từ 0, nên để đến SNT thứ k phải seek(f,k-1)}
    read(f,n);
    writeln(‘So nguyen to thu ‘,k,’ la ‘,n);
    writeln(‘Co tiep tục khong?-(C/K) ‘);
  until (readkey=’K’) or (readkey=’k’);
  close(f);
END.

 

Chương trình 4.

 

Sử dụng tệp số nguyên tố SNT-BYTE.DAT đã có sẵn trên đĩa để giản ước phân số m/n. {Để đơn giản không kiểm tra lỗi tệp}

 

Thuật toán:

Như mình đã học số học là: Nếu tử số và mẫu số cùng chia hết cho thừa số nguyên tố thì cùng chia cho thừ số đó. Cứ làm mãi như vậy với một số nguyên tố đến khi không cùng chia hết cho nó nữa thì lại xét đến số nguyên tố tiếp theo. “Cuộc hội ngộ nào rồi cũng đến hồi kết thúc!”. Công việc sẽ dừng khi số nguyên tố mang ra thử lại lớn hơn tử số hoăc mẫu số. Tóm lại thuật toán như sau:

 

Bước 1. Nhập tử số và mẫu số. Mở tệp SNT-BYTE.DAT ra để đọc dữ liệu từ đầu.
Bước 2. Đọc ra số nguyên tố p. (Chú ý là đọc một cái là đầu đọc tự đọng nhích sang phần tử tiếp).
Bước 3. Chừng nào tử số và mẫu số cùng chia hết cho p thì còn lấy tử số và mẫu số chia cho p.
Bước 4. Nếu tử số và mẫu số còn lớn hơn p thì quay về Bước 2, trái lại hiển hiên là thực hiện bước 5.
Bước 5. Viết đáp số: tử số mới / mẫu số mới và hết nếu không muốn làm tiếp nữa.


Uses crt;
var f   : file of byte;
  m,n,p : byte;
BEGIN
  Clrscr;
  assign(f,'snt-byte.dat');
Repeat
  Write(‘Nhập tử số và mẫu số = ‘);
  Readln(m,n);
  reset(f); {Mở để đọc từ đầu tệp}
  repeat
    read(f,p);
    while (m mod p=0) and (n mod p=0) do
       begin
         m:=m div p;
         n:=n div p;
       end;
    until (m<p) or (n<p);
    writeln(‘Dap so: ‘,m,’/‘,n);
    writeln(‘Có tiếp tục không?-(C/K) ‘);
  until (readkey=’K’) or (readkey=’k’);
  close(f);
END.

 

Chương trình 5.

 

Sử dụng tệp số nguyên tố SNT-BYTE.DAT đã có sẵn trên đĩa để rút gọn căn bậc hai của m. {Để đơn giản không kiểm tra lỗi tệp}

 

Thuật toán:

Như mình đã học số học là: Nếu số trong căn chia hết cho bình phương của một số nguyên tố thì có thể đưa ra ngoài căn số nguyên tố đó, để lại trong căn số mới nhỏ đi… . Cứ làm mãi như vậy với một số nguyên tố đến khi không cùng chia hết cho nó nữa thì lại xét đến số nguyên tố tiếp theo. “Cuộc hội ngộ nào rồi cũng đến hồi kết thúc!”. Công việc sẽ dừng khi số nguyên tố mang ra thử lại lớn hơn tử số hoăc mẫu số. Tóm lại thuật toán như sau:

 

Bước 1. Nhập tử số và mẫu số. Mở tệp SNT-BYTE.DAT ra để đọc dữ liệu từ đầu.
Bước 2. Đọc ra số nguyên tố p. (Chú ý là đọc một cái là đầu đọc tự đọng nhích sang phần tử tiếp).
Bước 3. Chừng nào tử số và mẫu số cùng chia hết cho p thì còn lấy tử số và mẫu số chia cho p.
Bước 4. Nếu tử số và mẫu số còn lớn hơn p thì quay về Bước 2, trái lại hiển hiên là thực hiện bước 5.
Bước 5. Viết đáp số: tử số mới / mẫu số mới và hết nếu không muốn làm tiếp nữa.


Uses crt;
var f     : file of byte;
  T,N,p : byte; {T là trong, N là ngoài}
BEGIN
  Clrscr;
  assign(f,'snt-byte.dat');
  Repeat
    Write(‘Nhập số trong căn = ‘);
    Readln(T);
    reset(f); {Mở để đọc từ đầu tệp}
    repeat
      read(f,p);
      while (T mod (p*p)=0) do
        begin
          N:=N*p;
          T:=T div (p*p);
        end;
    until (sqrt(T)<p);
    writeln(‘Dap so: ‘,N,#251,n); {#251 là dấu căn}
    writeln(‘Có tiếp tục không?-(C/K) ‘);
  until (readkey=’K’) or (readkey=’k’);
  close(f);
END.

 

Nhiệm vụ còn lại của bạn là phối hợp các chương trình nêu trên lại thành một chương trình duy nhất nhờ một Thu tục Menu thích hợp. Ngoài ra, bạn phải mở rộng phạm vi của tệp số nguyên tố trên thành SNT-WORD.DAT hay SNT-LONG.DAT để chứa được các số nguyên tố trong khoảng 0..65535 hay 0..2147483647. Đồng thời đưa vào thêm các bài toán mới, chẳng hạn như: Phân tích một số tụ nhiên thành thừa số nguyên tố,…

 

Sau khi cố gắng bắt máy giải quyết bài toán này, bạn có thể tham khảo mã nguồn của tôi, với cỡ số nguyên tố thuộc kiểu word: SNT.RAR. (Trong này đã chứa cả mã file exe và pas). Nhớ là phải tự mình rèn luyện đã nhé!

Thông tin du học

Thư viện khoa học

© 2009, Trường Đại Học Tổng Hợp Hà Nội - Khối Phổ Thông Chuyên Toán (Khối A0)