Thứ Năm, 19 tháng 4, 2012

100 đề toán tin dành cho THCS & THPT - Tin học và Nhà trường (có lời giải)

Cuốn tài liệu gồm 100 đề toán tin dành cho cấp tiểu học, THCS và THPT. Các bài tập đều rất hay và đòi hỏi tư duy cao. Cuốn 100 đề Tin học và Nhà trường này thật sự rất hữu ích cho những bạn học chuyên sâu, chuẩn bị thi HSG.


100 đề TIN HOC VÀ NHÀ TRƯỜNG

Download: http://www.mediafire.com/?dqcr38i4xi8669v
Ngoài ra, các bạn có thể xem online tại đây.

Tài liệu từ internet

Tìm các số mà tổng bình phương bằng chính nó

Đề bài: Cho dãy a1, a2, a3....a100 là dãy số nguyên gồm 4 chữ số có nghĩa. Đưa ra màn hình tất cả các số thỏa mãn điều kiện tổng bình phương các chữ số của nó bằng chính nó.


USES crt;
VAR a:ARRAY[1..100] OF INTEGER;
    n,m,i,j,h,k,l:INTEGER;
BEGIN    
    clrscr;
    FOR i:=1 TO 100 DO
    BEGIN
        a[i]:=random(8999)+1000;
    END;  
    writeln('Cac so ma tong binh phuong cac chu so bang no la:');
    FOR i:=1 TO 100 DO
    BEGIN
        m:=a[i] MOD 10;
        n:=a[i] DIV 1000;
        h:=(a[i] DIV 100)-n*10;
        l:=((a[i] MOD 100)-m) DIV 10;
        IF (a[i]= m*m+n*n+h*h+l*l) THEN write(a[i],',');
    END;
    readln      
END.

Thứ Hai, 16 tháng 4, 2012

Tìm bội chung nhỏ nhất của N số (ví dụ: mảng 1 chiều)

Như trong bài viết Tìm UCLN và BCNN đã trình bày cách tìm tuy nhiên chỉ áp dụng với trường hợp 2 số. Bài toán ra là tìm BCNN của mảng 1 chiều, vậy sẽ phải viết chương trình như thế nào?

Bội số chung nhỏ nhất (The Least Common Multiple hay Lowest Common Multiple) của một nhóm các số nguyên, gọi tắt là LCM, là số nhỏ nhất mà có thể chia hết cho tất cả các số đó. Có nhiều giải pháp để tìm LCM của hai số nguyên, một trong những giải pháp dễ dàng nhất là dùng thuật giải Euclid. Cho hai số nguyên a và b, chúng ta có công thức LCM(a, b) = (a x b) / GCD(a, b). Như vậy quá trình tính toán sẽ thông qua các bước sau:
  1. Bước 1. Sử dụng thuật toán Euclid để tìm ước chung lớn nhất GCD (a, b)
  2. Bước 2. Tính giá trị a x b.
  3. Bước 3. Chia kết quả bước 2 cho kết quả bước 1 chúng ta được giá trị LCM cần tìm.
Để tìm LCM của n số chúng ta đầu tiên chọn ra 2 số rồi tính LCM của chúng, sau đó lấy thêm số khác để tính LCM của LCM mới tìm được và số mới chọn ra, cứ như thế cho tới khi nào hết n số. Ví dụ tìm LCM của 2, 3 và 5. Đầu tiên ta tính LCM(2, 3) = 6. Sau đó tìm LCM(6, 5) = 30.

uses crt;
var x, y, i, n, ucln, bcnn: longint;
  a: array[1..100] of integer;
function h_ucln(x,y:integer):integer;
begin
 while x<>y do
  if x>y then
   x:=x-y
  else
   y:=y-x;
 h_ucln:=x;
end;
begin
 clrscr;
 repeat
  write('Nhap N (N>=2): ');
  readln(n);
 until(n>=2);
 for i:=1 to n do
 begin
  write('Phan tu thu ',i,' = ');
  readln(a[i]);
 end;
 ucln:=h_ucln(a[1],a[2]);
 bcnn:=(a[1]*a[2]) div ucln;
 for i:=3 to n do
 begin
  ucln:=h_ucln(bcnn,a[i]);
  bcnn:=(bcnn*a[i]) div ucln;
 end;
 writeln('bcnn la: ',bcnn);
 readln;
end.

Chủ Nhật, 15 tháng 4, 2012

Xóa dấu cách thừa trong xâu (xử lý xâu)

Nhập 1 chuỗi, sau đó bỏ khoảng trắng ở đầu và cuối, khoảng trắng ở giữa 2 từ.

var s:string;
begin
readln(s);
while s[1]=#32 do delete(s,1,1);
while s[length(s)]=#32 do delete(s,length(s),1);
while pos(' ',s)<>0 do delete(s,pos(' ',s),1);
writeln(s);
readln;
end.

Turbo Pascal 7.0 with DOSBox - Turbo Pascal cho win 7

Bạn đang phân vân vì không thể chạy Turbo Pascal trên win 7? Bài viết sau sẽ tư vấn giúp bạn.
Turbo Pascal 7.0 with DOSBox là những phần mềm miễn phí.
Nó tương thích với mọi Windows: XP, Vista, 7 cả 32 bit và 64 bit.
Turbo Pascal 7.0 đã sửa lỗi Runtime Error 200.
Nhỏ gọn nhưng đầy đủ để thực hiện các ví dụ và bài tập trong SGK tin học 11.
Kèm theo thư viện tcvn để lập trình tiếng Việt mã TCVN3.
Loại bỏ tình trạng CPU chiếm 100% khi chạy Turbo Pascal trên Windows 32 bit.

Tải về: Download  Turbo Pascal 7.0 with DOSBox

Hướng dẫn khắc phục lỗi không gõ được các phím \ : ‘ 
 DOSBox tự cách bố trí bàn phím theo Windows tuy nhiên trên một số bàn phím cách bố trí các phím lại không như bình thường, đây là nguyên nhân dẫn đến việc một số máy tính không gõ được các phím nêu trên trong DOSBox. Bạn vào Start – > All Programs -> Turbo Pascal 7.0 with DOSBox -> KeyMapper và thực hiện tuần tự:


 
Chọn phím cần sửa (trong hình là phím \ ).
Click vào nút Del.
Click vào nút Add sau đó bấm phím tương ứng trên bàn phím của bạn.
Click vào nút Save
(Làm lại từ 1 đến 4 với các phím mà bạn không gõ được)
Click vào nút Exit.


In ra 10 dòng dầu của tam giác Pascal

Tam giác Pascal là gì? Quy luật của Tam giác Pascal rất đơn giản : bắt đầu từ hàng thứ ba, mỗi số bên trong là tổng của hai số ngay phía trên nó. Ví dụ : ở hàng 3, số 2 là tổng của 1 và 1 ; hàng 4, số 3 là tổng của 2 và 1 ; hàng 5, số 6 là tổng của 3 và 3. Căn cứ theo quy luật đó, Tam giác Pascal là kéo dài đến vô hạn.
Ví dụ:
                     1
                   2 3 2
                 3 4 5 4 3
               4 5 6 7 6 5 4
             5 6 7 8 9 8 7 6 5

Đoạn code sau sẽ in ra màn hình 10 dòng đầu của tam giác Pascal (được căn giữa).

uses crt;
const n=10;
var i,j:integer;
begin
 for i:=1 to n do
  begin
   for j:=n downto i do
    write('  '); { <- thêm dấu cách }
   for j:=i to 2*i-1 do write(j:2); { <- đặt chỗ trống cho số}
   for j:=2*i-2 downto i do write(j:2); { <- đặt chỗ trống cho số}
   writeln;
  end;
 readln;
end. 

Thứ Bảy, 14 tháng 4, 2012

Các thuật toán sắp xếp trong Pascal: Selection Sort, Insert Sort, Bubble Sort, QuickSort

Sắp xếp là thuật toán căn bản không chỉ trong ngôn ngữ lập trình Pascal mà còn trong nhiều lĩnh vực công nghệ khác. Bài viết sau sẽ để cập đến một số thuật toán sắp xếp bằng ngôn ngữ Pascal.

1. Bubble Sort (Sắp xếp nổi bọt)

Ý tưởng: Giả sử có mảng có n phần tử. Chúng ta sẽ tiến hành duyệt từ cuối lên đầu,so sánh 2 phần tử kề nhau, nếu chúng bị ngược thứ tự thì đổi vị trí, việc duyệt này bắt đầu từ cặp phần tử thứ n-1 và n. Tiếp theo là so sánh cặp phần tử thứ n-2 và n-1,… cho đến khi so sánh và đổi chỗ cặp phần tử thứ nhất và thứ hai. Sau bước này phần tử nhỏ nhất đã được nổi lên vi trí trên cùng (nó giống như hình ảnh của các “bọt” khí nhẹ hơn được nổi lên trên). Tiếp theo tiến hành với các phần tử từ thứ 2 đến thứ n.

Procedure bubblesort(var amang; Ninteger);
begin
        var i,j integer;
        for i=2 to N do
        for j=N down to i do
        if (a[j]  a[j-1])
then
    hoanvi(a[j-1],a[j]);
end;

2. Selection Sort (Sắp xếp chọn)

Ý tưởng: Chọn phần tử nhỏ nhất trong n phần tử ban đầu, đưa phần tử này về vị trí đúng là đầu tiên của dãy hiện hành. Sau đó không quan tâm đến nó nữa, xem dãy hiện hành chỉ còn n-1 phần tử của dãy ban đầu, bắt đầu từ vị trí thứ 2. Lặp lại quá trình trên cho dãy hiện hành đến khi dãy hiện hành chỉ còn 1 phần tử. Dãy ban đầu có n phần tử, vậy tóm tắt ý tưởng thuật toán là thực hiện n-1 lượt việc đưa phần tử nhỏ nhất trong dãy hiện hành về vị trí đúng ở đầu dãy.

Các bước tiến hành như sau:
Bước 1: i=1
Bước 2: Tìm phần tử a[min] nhỏ nhất trong dãy hiện hành từ a[i] đến a[n]
Bước 3: Hoán vị a[min] và a[i]
Bước 4: Nếu i<=n-1 thì i=i+1; Lặp lại bước 2
Ngược lại: Dừng. n-1 phần tử đã nằm đúng vị trí.


Procedure seletionsort(var a:mang; N:byte);
var i,j: byte; min: integer;
begin
        for 1:=1 to N-1 do
        if (a[j] < a[min] then min:=j;
        if (min <> i) then hoanvi (a[min]; a[i];
end;

Procedure hoanvi(var x,y: integer);
var tam:integer
begin
        tam:=x
        x:=y
        y:=tam
end;

3. Insert Sort

Procedure insertionsort(var a:mang, N:byte);
begin
        var pos,i: byte; x:integer;
        for i:=2 to N do
        begin
            x:=a[i]; pos:=i;
{sap xep tang dan}
while (pos>1 and a[pos-1]>x)do
    begin
        a[pos]:= a[pos-1]; dec(pos);
    end;
    a[pos]:= x;
end;
{sap xep giam dan}
while (pos>1)
    begin
        if(a[pos-1] > x)then
    begin
        a[pos]:= a[pos-1]; dec(pos);
    end;
    a[pos]:= x;


4. QuickSort

procedure Quicksort ( Var A: Mang);
     Procedure Sort( Left, Right: Integer);
            Var
                     i, j, k: Integer;
               Begin
                     i:= Left;
                     j:= Right;
                     k:= A[(Left + Right) Div 2];
                     Repeat
                       While A[i] < k Do Inc(i);
                       While k < A[j] Do Dec(j);
                       If i <> j Then
                             Begin
                                     HoanVi(A[i],A[j]);
                                     Inc(i);
                                     Dec(j);
                             end;
                     Until i > j;
                             If Left < j Then Sort(Left,j);
                             If i < Right Then Sort(i,Right);
              end;
   Begin
          Sort(Left; Right);
   End;

Bài đăng phổ biến