Thứ Bảy, 26 tháng 5, 2012

Ngày tháng năm sau ngày được nhập N ngày

Đề bài: Nhập ngày tháng năm. Hãy cho biết ngày tháng năm sau đó N ngày.


var d,m,y,n:integer;
Function      Songay(thang,nam: Integer):Integer;
Var             sn:Integer;
Begin
       Case thang of
                1,3,5,7,8,10,12 : sn:= 31;
                4,9,11             : sn:= 30;
                2:   If  (nam MOD 4 = 0) Then
                           sn:= 29
                      Else
                            sn:= 28;
        End;
        Songay:= sn;
End;
BEGIN
     Writeln('Nhap ngay thang nam');Readln(d,m,y);
     Writeln('Nhap N');Readln(N);
     d:=d+N;
     While d > Songay(m,y) Do
     Begin
         d:= d - Songay(m,y);
         m:= m+1;
         IF m > 12 Then
         Begin
              m:= 1;
              y:= y + 1;
         End;
    End;
Writeln('Ket qua ',d,'/',m,'/',y);
Readln;
END.

In ra tệp các phần tử xuất hiện trong tệp từ k lần trở lên

Nhập một dãy A (mỗi số chỉ xuất 1 lần) có N (< 40) số tự nhiên và 1 số K. Hãy xuất ra các phần tử có số lần xuất hiện trong dãy A từ K lần trở lên.
Dữ liệu nhập: file DAYSO.INP:
- Dòng 1: 2 số n và k cách nhau bởi 1 dấu cách.
- Dòng 2: dãy A.
Dữ liệu ra: file DAYSO.OUT: Xuất các số thỏa điều kiện trên.


uses crt;
var a,b:array[0..100] of integer;
    n,j,i,k:integer;
    f:text;

Procedure docf;
 begin
  assign(f,'C:\DAYSO.INP');
  reset(f);
  i:=0;
     read(f,n);
     readln(f,k);
     While not eof(f) do
      begin
        inc(i);
        read(f,a[i]);
      end;
      close(f);
  end;

Procedure xuly;
 begin
 assign(f,'C:\DAYSO.OUT');
 rewrite(f);
 FillChar(b,SizeOf(b),0);
   For i:=1 to n do inc(b[a[i]]);
   For i:=1 to n do
        if (b[i]<>0) (b[i]>=k) then
           write(f,i,' ');
  close(f);
end;

BEGIN
 clrscr;
 docf;
 xuly;
 readln 
end.

Chú thích: 
- Hàm Fillchar(x,sizeof(x),i): điền lần lượt các byte của dữ liệu này bằng giá trị byte của i (i được coi là chiếm một byte).
Như vậy, đối với mảng kiểu integer hay longint (cả số cũng vậy), máy sẽ điền lần lượt các byte của dữ liệu:
Fillchar 1=00000001 (1 byte= 8 bit -> phải có đủ 8 chữ số cả 0 và 1).
- Sizeof(x): Trả về kích thước của biến trong bộ nhớ.

Tìm các số tổng các các ước của số này bằng số kia và ngược lại

Hai số m,n gọi là bạn của nhau nếu tổng các ước của m bằng n và ngược lại.Tìm tất cả các số là bạn của nahu và nhỏ hơn 10001.


Ý tưởng: Thay vì chạy 2 vòng lặp để xét m và n, ta có thể chỉ cần chạy 1 vòng lặp kiểm tra xem m và uoc(m) có là bạn của nhau không.

PROGRAM timban;
FUNCTION uoc(k:INTEGER):longint;
VAR i,tong:INTEGER;
BEGIN
tong:=0;
FOR i:=1 TO k DIV 2 DO
IF k MOD i =0 THEN tong:=tong+i;
uoc:=tong;
END;
VAR m:longint;
BEGIN
for m:= 1 to 10001 do
   if uoc(uoc(m)) = m then writeln(m, ' va ', uoc(m),' la ban cua nhau');
readln
END.

Thứ Năm, 24 tháng 5, 2012

Kiểm tra số chính phương trong mảng 1 chiều

Trước hết, chúng ta sẽ tìm hiểu khái niệm về số chính phương. Số chính phương là gì? Số chính phương là một số mà tự nó là căn bậc hai của một số tự nhiên khác, hay nói rõ hơn thì số chính phương là bình phương của một số tự nhiên.
Ví dụ: 289 là một số chính phương vì 289 = 17 bình phương.

Thuật toán Pascal dưới đây sẽ giúp tìm số chính phương trong mảng 1 chiều.

  uses crt;
  type ArrInt = array[1..250] of integer;  
  Var n,i,x : integer;
         a: ArrInt;
  BEGIN
   clrscr;
   write('Nhap so phan tu: ');
   readln(n);
   for i:=1 to n do
   begin
     write('Phan tu thu ',i,'= ');
     readln(a[i]);
   end;
   writeln('Cac so chinh phuong co trong mang:');
   for i:=1 to n do
   begin
    x:=trunc(sqrt(a[i]));
     if sqr(x)=a[i] then
       write(a[i]:4);
   end;
   readln;
  END.  

Trong đó lệnh hàm sqrt để lấy căn và hàm trunc để lấy phần nguyên.

Thứ Ba, 22 tháng 5, 2012

Bài tập dãy Fibonaci và số nguyên tố

Dãy FIBONACI là dãy được xác định như sau: F(0) = 0; F(1) = 1 và F(n) = F(n-1) + F(n-2) với n = 2, 3...
Hãy viết chương trình máy tính để nhập từ bàn phím số nguyên dương M (2<M<2000000000), rồi xuất ra màn hình số FIBONACI lớn nhất là nguyên tố và nhỏ hơn M.

Ví dụ: Với M=10 thì các số FIBONACI nhỏ hơn M là: 0, 1, 1, 2, 3, 5, 8. Số 5 là số nguyên tố lớn nhất trong các số FIBONACI nhỏ hơn M. Vậy cần đưa ra màn hình dòng thông báo kết quả: Số cần tìm là: 5.

uses crt;
var j,i,m,a,b,t:longint;

{----------------------}

Function kt(n:longint):boolean;
 var i,d:integer;
  begin
  kt:=false;
  d:=0;
   For i:=1 to n do
    if n mod i=0 then inc(d);
  if d=2 then kt:=true;
 end;

{----------------------}

begin
 clrscr;
 Write('Nhap m= ');
 readln(m);
 a:=0;
 b:=1;
  Repeat
   a:=a+b;
   b:=a+b;
  Until (a>=m) and (b>=m);

   if a<b then begin t:=a;a:=b;b:=t;end;

  Repeat
   a:=a-b;
   b:=b-a;
  Until ( (kt(a)) and (a<m))  or ( (kt(b)) and (b<m) );
If a>b then writeln(a);
 if b>a then writeln(b);

{----------------------}

  readln
 end.

Nội dung ôn thi tin học 11 (Pascal)

Bạn đang chuẩn bị tham dự kỳ thi học sinh giỏi Tin học nhưng không biết bắt đầu từ đâu? Bài viết sau sẽ cung cấp khái quát nội dung ôn tập để bạn vững tâm hơn khi tham dự kỳ thi học sinh giỏi, kỳ thi Olympic, Tin học trẻ...

NỘI DUNG ÔN TẬP LẬP TRÌNH CĂN BẢN VỚI NGÔN NGỮ PASCAL

1. Bài toán và thuật toán
- Các ví dụ về bài toán và thuật toán
- Giải bài toán bằng máy tính

2. Ngôn ngữ lập trình Pascal
- Các thành phần cơ sở của ngôn ngữ Pascal
- Cấu trúc chương trình TP
- Một số kiểu dữ liệu chuẩn
- Khai báo biến
- Phép toán, biểu thức, câu lệnh gán;
- Tổ chức vào / ra đơn giản
- Soạn thảo, dịch, thực hiện và hiệu chỉnh chương trình.
- Tổ chức rẽ nhánh ( Lệnh If … then … else; If … then… )
- Tổ chức rẽ nhánh Case … of
- Tổ chức lặp While… do
- Tổ chức lặp Repeat… Until…
- Tổ chức lặp For … Do…
- Kiểu dữ liệu Chuỗi (String)
- Kiểu dữ liệu mảng ARRAY: Mảng một chiều
- Kiểu dữ liệu mảng ARRAY: Mảng hai chiều
- Chương trình con: Thủ tục và Hàm
- Thủ tục có tham số
- Hàm
- Kiểu dữ bảng ghi.
- Kiểu dữ liệu tập tin File.
- Kiểu dữ liệu tập tin File văn bản.

3. Một số thuật toán:
- Tìm kiếm; Sắp xếp
- Đệ qui; Vét cạn; Quay lui; Tham lam; Qui hoạch động

Tài liệu tham khảo:
- Sách Tin học 10, 11 ( SGK và SGV) – Hồ Sỹ Đàm – NXB Giáo dục
- Tin học 10, 11 – Hòang Kiếm – NXB Giáo dục
- Bài tập Pascal tập T1,T2,T3 - Bùi Việt Hà - NXB Giáo dục
- Bài tập Pascal tập T1, T2 - Nguyễn Quý Khang – NXB Giáo dục
- Giải một bài toán trên máy tính như thế nào? – Hoàng Kiếm – NXB Giáo dục
- Bài tập Tin học chọn lọc – Hoàng Kiếm – NXB Giáo dục
- Cấu trúc dữ liệu – Nguyễn Trung Trực – ĐH Bách khoa TP Hồ Chí Minh
- Một số vấn đề chọn lọc trong môn Tin học T1, T2 – Nguyễn Xuân My – NXB Giáo dục
- Bài tập Qui họach động – Trần Đỗ Hùng – NXB Giáo dục


Sưu tầm

Thứ Năm, 17 tháng 5, 2012

Tổng m số tận cùng của n trong pascal

Nhập vào 1 số tự nhiên n* và nhập vào m, sau đó tính tổng m các số tận cùng của n.
vd: n = 365 m =2 tổng = 5+6=11.

Cách 1: 

uses crt;
var n: longint;
    m,tong,i: integer;
BEGIN
   clrscr;
   write('Nhap n: '); readln(n);
   write('Nhap m: '); readln(m);
   for i:=1 to m do
     begin
        tong:=tong+(n mod 10);
        n:=n div 10;
     end;
   write('Tong ',m,' chu so cuoi cua so vua nhap = ',tong);
   readln;
END.

Cách 2: Sử dụng xâu: Xâu giúp lưu trữ thoải mái hơn kiểu số nguyên, nên ta có thể khái báo N có ở string thay vì Integer. Như vậy, ở những trường hợp lớn (vd N bao gồm 100 chữ số chẳng hạn) thuật toán vẫn có thể hoạt động bình thường.

uses crt;
var n: string;
    m,i,a,tong: integer;
BEGIN
   clrscr;
   write('Nhap so n: '); readln(n);
   write('Nhap m: '); readln(m);
   for i:= length(n) downto length(n)-m+1 do
     begin
         val(n[i],a);
         tong:=tong+a;
     end;
   write(tong);
   readln;
END.

Như vậy, thay vì dùng lệnh mod như khi nhập N vào dưới dạng số nguyên, ta dùng thủ tục val của xâu (biến từ chữ thành số), các bạn có thể xem thêm tại bài Xâu - String.

Thứ Ba, 15 tháng 5, 2012

Liệt kê dãy nhị phân cụm "01" xuất hiện đúng 2 lần

Đề bài: Hãy liệt kê dãy nhị phân độ dài n mà trong đó cụm "01" xuất hiện đúng 2 lần.

uses crt;
var s,n,j,i:integer;
a:Array[1..100] of integer;

{--------------------------}

Procedure print;
var j:integer;
begin
For j:=1 to n do write(a[j],' ');
writeln;
end;

{--------------------------}

Procedure Deq(i:integer);
 var j,k,d:integer;
  begin
   For j:=0 to 1 do
     begin
       d:=0;
       a[i]:=j;
       if i=n then
       For k:=1 to n do
         begin
          if (a[k]=0) and (a[k+1]=1) then inc(d);
          if d=2 then  print
         end
       else Deq(i+1);
      end;
  end;
{--------------------------}
Begin
 clrscr;
 write('Nhap n= ');readln(n);

Deq(1);
readln

end.

Chủ Nhật, 13 tháng 5, 2012

Tính chữ số 0 tận cùng của n!

Đề bài: Nhập vào n (1<=n<=30000), hãy in ra số chữ số 0 cuối cùng của n giai thừa.

Ý tưởng cách tìm: Xét tất cả các số chia hết cho 5. Giả sử mỗi số đó có thể chia hết cho Xi chữ số 5.
Cộng tất cả các Xi đó lại thì ta được số chữ số 0.

Giả sử 25! = 15511210043330985984000000 có 6 chữ số 0 tận cùng.
ta có
5 chia hết cho 1 chữ số 5
10 chia hết cho 1 chữ số 5
15 chia hết cho 1 chữ số 5
20 chia hết cho 1 chữ số 5
25 chia hết cho 2 chữ số 5
-> suy ra tổng là 6 (đúng với kết quả là có 6 chữ số 0).

var
n, i, j, count: longint;
begin
write('Nhap N (N>=1): '); readln(n);
for i:=1 to n do
begin
j:=i;
while j mod 5 = 0 do
begin
j:=j div 5;
count:=count+1;
end;
end;
write(' So chu so 0 cuoi cua ',n,'! la: ',count); readln;
end.

Đổi từ hệ 10 sang hệ 2 (hệ thập phân sang nhị phân)

Nguyên tắc của phương pháp chuyển đổi từ hệ cơ số 10 sang hệ cơ số 2 là lấy số cần chuyển đổi chia cho 2 (kết quả chỉ lấy phần nguyên), sau đó tiếp tục lấy kết quả chia 2 (và cũng chỉ lấy phần nguyên), kết quả số nhị phân thu được là tập hợp các số dư của các phép chia.

Program Doi_thap_phan_ra_nhi_phan;
Var
 He10,N,Y:Word;
   He2,Tam:String;
Begin
 Writeln('DOI SO TU HE THAP PHAN SANG HE NHI PHAN');
   Writeln('         -----------------');
   Writeln;
   Write('-Nhap so nguyen he thap phan: ');
   Readln(He10);
   N:=He10;
   He2:=' ';
   Repeat
    Y:=He10 Mod 2;
      Str(Y, Tam);
      He2:=Tam + He2;
      He10:= He10 Div 2;
   Until He10 = 0;
   Writeln;
   Writeln('+So he 10 la     : ',N);
   Writeln('+Doi sang he 2 la: ',He2);
   Writeln;
   Writeln('      Bam phim <Enter> de ket thuc');
   Readln
End.

Thứ Bảy, 12 tháng 5, 2012

Trắc nghiệm nhanh Pascal (tin học lớp 8)

1. Lệnh lặp For, mỗi lần lặp giá trị của biến đếm thay đổi như thế nào?
a) tăng 1                                   b) tăng 2                                   c) tăng 3                       d) tăng 4

2. Cấu trúc của câu lệnh lặp For:
a) For i:= 1 to n do Câu lệnh;                                     
b) For biến đếm=1 to do Câu lệnh;
c) For biến đếm:=giá trị đầu to giá trị cuối do Câu lệnh;
d) For biến đếm:=giá trị đầu to n do Câu lệnh;

3. Số lần lặp trong câu lệnh sau là: For i:=5 to 27 do ….
a) 20 lần                                   21 lần                                       c) 22 lần                       d) 23 lần

4. Đoạn lệnh sau, mỗi lần lặp giá trị của biến i trong câu lệnh sau thay đổi như thế nào?
       While i<=10 do i:=i+3;
a) tăng 1                                   b) tăng 2                                   c) tăng 3                       d) tăng 4

5. Cấu trúc của câu lệnh lặp While:
a) While i<=n do Câu lệnh;                            
b) While biến đếm do Câu lệnh;
c) While điều kiện do Câu lệnh;          
d) While biến đếm:=giá trị đầu to giá trị cuối do Câu lệnh;

6. Kết quả in ra của đoạn lệnh sau khi thực hiện là:
i:=1; S:=5;
While i<=5 do
Begin
            S:=S+i; i:=i+2;
End;
a) S=13
b) S=14
c) S=15
d) S=16

7. Kết quả in ra của đoạn lệnh sau khi thực hiện là:
For i:=1 to 10 do
     If i mod 2=1 then    
            Write (‘i=’,i, ’ ’);
a) i=1 2 3 4 5 6 7 8 9 10
b) i=0 2 4 6 8 10
c) i=0 1 3 5 7 9
d) i=1 3 5 7 9

8. Đoạn lệnh sau đúng, sai như thế nào?
While n<=0 do;
            Write(‘Nhap lai n:’);
Readn (n);
a) Đúng
b) Sai, sau do không có ;
c) Sai, thiếu Begin end.
d) Câu b và c đúng

Sưu tầm

Xử lý tệp văn bản

Sử dụng ngôn ngữ lập trình pascal viết chương trình xử lý tệp văn bản với các yêu cầu sau:
* Đọc tệp văn bản và in ra màn hình.
* Sữa Tệp văn bản theo quy tắc
* Bỏ các dấu cách không cần thiết
* Trước các dấu . , : ; ! ? không có dấu cách
* Sau các dấu . , : ; ! ? phải có 1 dấu cách
* Đầu mổi câu (sau dấu . ! ) phải viết hoa
* Chương trình có dao diện đẹp và dể sử dụng.

type Set1 = set of char;

procedure ChuanHoa(var s:string);
begin
    while s[1]=' ' do delete(s,1,1);
    while s[length(s)]=' ' do delete(s,length(s),1);
    while pos('  ',s)<>0 do delete(s,pos('  ',s),1);
end;

procedure ChuanHoaLan2(var s:string);
var sSplit,sEnd:Set1;
    i:integer;
begin
     sSplit:=[',', '.', ':', ';', '!', '?'];
     sEnd:=['.', '!', '?'];

     s[1]:=upcase(s[1]);
     for i:=2 to length(s)-1 do
     begin
          if s[i] in sSplit then
          begin
             if s[i-1]=' ' then
             begin
                  delete(s,i-1,1);
                  dec(i);
             end;
             if s[i+1]<>' ' then
                insert(' ',s,i+1);
          end;
          if s[i] in sEnd then
             s[i+2]:=upcase(s[i+2]);
     end;
end;


VAR str:string;
    f,g:text;
BEGIN
     assign(f,'C:\input.txt');{Doc file}
     reset(f);
     while not eof(f) do
           read(f,str);
     close(f);
     ChuanHoa(str);
     ChuanHoaLan2(str);
     writeln(str);
     assign(g,'C:\input.txt');{Sua lai file}
     rewrite(g);
     write(g,str);
     close(g);
     readln;
END.

Thứ Ba, 8 tháng 5, 2012

Phương pháp học, giải bài tập Pascal trong tin học lớp 11

Pascal là ngôn ngữ lập trình bắt buộc, được đưa vào trong chương trình phổ thông và đại học. Tuy nhiên, đối với nhiều người đây vẫn là một môn học khó. Tài liệu: "Phương pháp giải bài tập tin học lớp 11" dưới đây sẽ phần nào giúp các bạn hiểu hơn về Pascal để hoàn thành tốt chương trình học trên lớp cũng như bồi dưỡng, nâng cao khả năng lập trình.

Xem online và download tại: Google Docs hoặc TaiLieu.vn.

Chủ Nhật, 6 tháng 5, 2012

Tệp - Kiểu dữ liệu tệp trong Pascal


Chuyên đề :  KIỂU DỮ LIỆU TỆP

1 Khái niệm về tệp:

Tệp là một dãy các phần tử cùng kiểu được sắp xếp một cách tuần tự. Tệp dữ liệu được lưu trữ ở bộ nhớ ngoài dưới một tên nào đó.
Tệp tập hợp trong nó một số phần tử dữ liệu có cùng cấu trúc giống như mảng nhưng khác mảng là số phần tử của tệp chưa được xác định.

Trong Pascal có 3 loại tệp được sử dụng là:
   1. Tệp có kiểu:
Tệp có kiểu là tệp mà các phần tử của nó có cùng độ dài và cùng kiểu dữ liệu.
   2 Tệp văn bản:
Dùng để lưu trữ dữ liệu dưới dạng các ký tự của bảng mã ASCII, các ký tự này được lưu thành từng dòng, độ dài các dòng có thể khác nhau. Ví dụ 2008 (kiểu word) khi ghi vào tệp văn bản cần 4 Byte (không phải 2 Byte).
   3 Tệp không kiểu:
Tệp không kiểu là một loại tệp không cần quan tâm đến kiểu dữ liệu ghi trên tệp. Dữ liệu ghi vào tệp không cần chuyển đổi.
 Tác dụng lớn nhất của kiểu dữ liệu tệp là ta có thể lưu trữ các dữ liệu nhập vào từ bàn phím và các kết quả xử lý trong bộ nhớ RAM ra tệp để dùng nhiều lần. 

   1. Khai báo:
    * Định nghĩa kiểu tệp với từ khóa FILE OF trong phần mô tả kiểu sau từ TYPE, tiếp theo là khai báo biến tệp trong phần khai báo biến.
Ví dụ 2.6:
Type
      MSN=Array[1..100] of integer; {định nghĩa mảng 100 số nguyên}
      TSN= File of MSN; {định nghĩa tệp TSN có các phần tử là mảng số nguyên}
      TCV=File of String[80]; {định nghĩa tệp TCV có các phần tử là các chuỗi có độ dài 80 ký tự.
Bangdiem= Record
……
           
End;

TBD= File of Bangdiem;

Var:
Tep1: TSN;
Tep2: TCV;
Tep3: TBD;

   * Định nghĩa trực tiếp biến kiểu tệp trong phần khai báo biến
Var
Tep4:File of Array[1..5] of String[80];
Tep5: File of Bangdiem;

   1. Truy nhập vào tệp:
Turbo Pascal có thể xử lý 2 loại tệp là : Tệp truy nhập tuần tự và tệp truy nhập trực tiếp.
     * Tệp truy nhập tuần tự: để truy nhập vào một phần tử nào đó, ta bắt buộc phải đi qua các phần tử trước đó. Nếu muốn thêm các phần tử vào tệp thì có thể thêm vào cuối tệp.
    * Tệp truy nhập trực tiếp: là tệp có thể truy nhập vào phần tử bất kỳ trong tệp. Muốn truy nhập trực tiếp phải dùng thủ tục Seek (số hiệu phần tử).
   * Mở tệp:
Để mở một tệp chuẩn bị lưu trữ dữ liệu, ta sử dụng 2 thủ tục chuẩn sau đây:
ASSIGN(biến tệp, tên tệp);
REWRITE(biến tệp);
Trong đó:
Biến tệp: là tên biến tệp đã khai báo sau từ khóa VAR
Tên tệp: Là tên do ta chọn để ghi dữ liệu vào đĩa.
Ví dụ : ASSIGN(f, ‘a:\baitap.txt’);
REWRITE(f); {khởi tạo tệp rỗng}
Sau 2 thủ tục trên, để tiến hành ghi dữ liệu vào tệp ta lại dùng thủ tục WRITE(…):
Cách viết:
WRITE(biến tệp, các giá trị cần ghi vào tệp);
Cuối cùng, ta phải đóng tệp bằng thủ tục:
CLOSE(biến tệp);

2 Tệp văn bản:

 a. Khai báo tệp văn bản:
 Tệp văn bản được khai báo trực tiếp trong phần khai báo biến:
            Var  Bientep:Text;

 b. Truy nhập vào tệp:
 Truy nhập vào tệp được hiểu là nhập dữ liệu vào tệp, ghi lại dữ liệu trên thiết bị nhớ ngoài, đọc dữ liệu đó ra màn hình hoặc máy in và xử lý nó.
    * Mở tệp mới để ghi:
            Assign(bientep, tentep);
Rewrite(bientep);
    * Mở tệp đã có để ghi thêm:
Assign(bientep, tentep);
Append(bientep);
    * Mở tệp để đọc dữ liệu:
Assign(bientep, tentep);
Reset(bientep);

c. Ghi dữ liệu vào tệp:
Sau khi đã mở tệp chúng ta có thể dùng thủ tục Write hoặc Writeln để ghi dữ liệu vào tệp.
Ví dụ 2.7:
Var T1:Text;
Begin
Assign(T1,’Dulieu.dat’);
            Rewrite(T1);
            Writeln(T1,’Tep van ban’);
            Write(T1,123);
            Write(T1,’ ’,123.45);
            Writeln(T1);
            Close(T1);
   End.

Dữ liệu ghi vào tệp như sau:
Tep van ban
123 1.234500000E+02
Dòng trống

d. Đọc dữ liệu từ tệp văn bản:
            Sau khi tiến hành mở tệp, con trỏ tệp sẽ được đặt tại dòng đầu.Ta dùng thủ tục Read hoặc Readln để đọc dữ liệu từ dòng hiện thời và gán vào biến tương ứng, viết biến đó ra màn hình hoặc máy in.
            Để có thể viết toàn bộ dữ liệu từ một tệp văn bản ra các thiết bị ngoài thì, thì các lệnh đọc viết phải được lặp đi lặp lại từ dòng 1 đến dòng cuối cùng, nghĩa là phải sử dụng một trong 2 vòng lặp:

While not eof(Bientep) do
Begin
             Readln(Bientep, Dong); {biến Dong phải được khai báo trước, kiểu String}
             Write(Dong);
End;
Hoặc:

For i:=1 to filesize(Bientep) do
             Begin
                          Readln(Bientep,Dong);
                          Write(Dong);
             End;

Lưu ý: Muốn lấy lại kiểu của dữ liệu nhập vào tệp văn bản thì mỗi biến phải nhập trên một dòng.
Ví dụ 2.8:
Xây dựng một chương trình đơn giản để quản lý công chức. Dữ liệu nhập bao gồm: Họ tên, Hệ số lương và số con. Dữ liệu xuất ra màn hình bao gồm Họ tên, Hệ số lương, Số con và Lương tháng ( tính theo quy định của nhà nước = heso*540000).
Chương trình đặt ra hai khả năng lựa chọn:
   1. Nếu tệp dữ liệu đã tồn tại thì nhập thêm người
   2. Nếu tệp chưa có thì mở tệp mới
Trong cả 2 trường hợp đều cho biết số người cần nhập. Dữ liệu in ra dưới dạng bảng.

Program Quan_ly_can_bo;
Uses Crt;
Var f:Text; hoten:String[20]; c1, heso:real; c2,i,n,socon:byte;
 Ten:string[12];
Begin
Clrscr;
            Write(‘cho biet ten tep’); readln(ten);
            Assign(f,ten);
            Reset(f);
            If IOResult=0 then
                        Append(f);
            Else     Rewrite(f);
            Write(‘nhap bao nhieu nguoi’); readln(n);
            For i:=1 to n do
                        Begin
                                   Write(‘Hoten’); Readln(hoten);
                                   Write(‘He so’); Readln(heso);
                                   Write(‘So con’); Readln(socon);
                                   Writeln(f,hoten);
                                   Writeln(f,heso:4:2);
                                   Writeln(f,socon);
                        End;
            Close(f);
            Assign(f,ten);
            Reset(f);
            Writeln(‘------------------------------------------------------‘);
            Writeln (‘| Ho va ten | Hs | socon | Luong |’);
            Writeln(‘------------------------------------------------------‘)
            While not eof(f) do
                        Begin
                                   Readln(f,hoten);
                                   Readln(f,heso);
                                   Readln(f,socon);
                                   Writeln(‘|’,ten:19,’|’,heso:4:2,’|’,socon:4,’|’,heso*540000:10:2,’|’);
                        End;
            Readln;
End.

3 Tệp có kiểu:

 a. Đọc và ghi :
 - Ghi lên tệp: Write(bientep,bien1,bien2,…);
             bien1,bien2,…là các biến cùng kiểu với biến tệp.
 - Đọc tệp:  Read(bientep,bien1,bien2,…);
 Chú ý:
             Khác với tệp văn bản, việc ghi và đọc tệp có kiểu không sử dụng các lệnh Writeln hoặc readln nghĩa là tệp có kiểu không ghi dữ liệu thành các dòng. Các phần tử của tệp có kiểu được ghi liên tục trong các ô nhớ và chỉ có ký hiệu kết thúc tệp EOF.
 Khi chúng ta đọc hoặc ghi xong một phần tử thì con trỏ tệp sẽ tự động chuyển đến vị trí kế tiếp.
   1. Truy nhập vào tệp: Seek(bientep,i); i=0,1,2,…
Thủ tục seek sẽ định vị con trỏ tại vị trí thứ i của tệp.
   1. các hàm xử lý tệp:
    * Filesize(bientep) cho biết số phần tử có trong tệp
    * FilePos(bientep) cho biết vị trí hiện thời của con trỏ tệp
    * Eof(Bientep) cho giá trị là True nếu con trỏ tệp ở vị trí cuối tệp, ngược lại cho giá trị False
 
Ví dụ 2.9:
Tạo một tệp lấy tên là TEPCK.DAT để vừa ghi vừa sửa dữ liệu:

Program Tep_co_kieu:
Uses crt;
Var bt:file of byte; i:byte; n:real;
Begin
            Clrscr;
            Assign(bt,’ TEPCK.DAT’);
            Rewrite(bt);
            For i:=0 to 5 do write(bt,i); {ghi vào tệp 5 số nguyên}
            Reset(bt);
            Writeln(‘Du lieu luu tru trong tep TEPCK.DAT’);
            While not eof(BT) do
                        Begin
                                   Read(bt,i); write(i:5);
                        End;
            Writeln;
            Seek(bt,3); {định vị con trỏ tại phần tử thứ 4}
            Textcolor(magenta);
            Read(bt,i);
            Writeln (‘So trong tep o vi trí thu 4:’,i);
            i:=33;
            seek(bt,3);
            write(bt,i);
            seek(bt,3); read(bt,i);
            writeln(‘So moi trong tep o vi tri 4:,i);
            writeln(‘vi tri hien thoi cua con tro:’, filepos(bt));
            readln;
            close(bt);
end.

4 Tệp không kiểu:

 a. Khai báo biến tệp:
 Var Bientep:File;

b. Mở tệp để ghi-đọc:
    * Mở tệp mới để ghi:
Assign(bientep, tentep);
Rewrite(bientep, n);

    * Mở tệp để đọc dữ liệu:
Assign(bientep, tentep);
     Reset(bientep, n);
            Với n là độ lớn tính theo Byte. 

c. Đọc và ghi tệp không định kiểu:
* Đọc tệp không định kiểu:
BlockRead(bientep,biennho,i,j);
    * biennho: là biến đã được khai báo cùng kiểu với các phần tử của tệp, biến nhớ đóng vai trò vùng nhớ đệm để lưu trữ dữ liệu đọc từ phần tử của tệp ra.
    * i: là số phần tử quy định cho mỗi lần đọc.
    * j: là biến kiểu Word, dùng để ghi lại số phần tử thực sự đã được đọc.
    * Ghi tệp không định kiểu:
BlockWrite(bientep,biennho,i);
   1. Truy nhập tệp không định kiểu:
Tệp không kiểu cũng được truy nhập như tệp có kiểu nghĩa là cũng dùng thủ tục Seek(bientep,n) để truy nhập vào phần tử thứ n+1 của tệp.
Lưu ý là với tệp không kiểu, mỗi lần con trỏ dịch chuyển nó sẽ dịch chuyển một số byte đúng bằng số byte đã quy định trong lệnh Rewrite() hoặc Reset()

Ví dụ 2.10
Nhập vào tệp các phần tử là record và sau đó viết chúng ra màn hình. Trong phần khai báo record chọn Hoten là string[15] và Diem thuộc kiểu Real.
Program tep_khong_kieu;
Uses Crt;
Type hs=record
 Hoten:string[15];
             Diem:real;
 End;
Var
             bt:file; k,nguoi:hs; i,j:byte;
begin
            clrscr;
            assign(bt,’tep0kieu.dat’);
            rewrite(bt,22);
            write(‘Nhap bao nhieu nguoi?’);
            readln(n);
            for i:=1 to n do with nguoi do
                        begin
                                   write(‘ Ho va ten:’); readln(hoten);
                                   write(“Diem tong:’); readln(diem);
                                   blockwrite(bt,nguoi,1);
                        end;
            for i:=1 to n-1 do
                        begin
                                   seek(bt,i);
                                   blockread(bt,k,1);
                                   textcolor(red);
                                   with k do writeln(hoten.’ ‘,diem:5:2);
                        end;
            ose(bt);
            Readln;
  End.

CodePascal sưu tầm

Thứ Bảy, 5 tháng 5, 2012

Cho biết tháng đó có nhiêu ngày

Đề: Nhập vào 1 năm, 1 tháng và cho biết tháng đó có bao nhiêu ngày?

uses crt;
var a,b:integer;
     bo:boolean;
begin
write('Nhap nam :');readln(b);
if (b mod 100=0) then bo:=(b mod 400)=0 else
                      bo:=(b mod 4   )=0;
if bo then
             begin
             repeat
             clrscr;
             write('Nhap thang :');readln(a);
             until (a>0) and (a<13);
             case a of
             2:write('Co 29 ngay');
             1,3,5,7,8,10,12:write('Co 31 ngay');
             4,6,9,11:write('Co 30 ngay');
             end;
             end;
if (not bo) then
             begin
             repeat
             clrscr;
             write('Nhap thang :');readln(a);
             until (a>0) and (a<13);
             case a of
             2:write('Co 28 ngay');
             1,3,5,7,8,10,12:write('Co 31 ngay');
             4,6,9,11:write('Co 30 ngay');
             end;
             end;
readln;
end. 

Bài đăng phổ biến