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.

Bài đăng phổ biến