Thứ Hai, 30 tháng 4, 2012

[Pascal vui] Tìm số lớn và nhỏ nhất trong 3 số

Đề bài: Nhập vào 3 số a, b, c. Hãy tìm số lớn nhất và số bé nhất trong 3 số đó. 
Đây là 1 bài toán rất dễ nhưng sẽ trở nên khá khó nếu kèm theo điều kiện không được dùng kiểu mảng, chỉ được dùng tối đa 3 câu lệnh điều kiện hoặc nếu không dúng if - then càng tốt. Bạn có thể thực hiện được bài toán này không?

Dùng if - then:

Var a,b,c : integer;
Begin
Write('Nhap vao 3 so : ');Readln(a,b,c);
If a>b then
Begin
a := a + b;
b := a - b;
a := a - b;
End;
If b>c then
Begin
b := b + c;
c := b - c;
b := b - c;
End;
If a>b then
Begin
a := a + b;
b := a - b;
a := a - b;
End;
Writeln('Min = ',a);
Writeln('Max = ',c);
Readln;
End. 

Không dùng if then (chỉ readln, writeln):

Var a,b,c : Integer;
Begin
Write('Nhap vao 3 so: ');Readln(a,b,c);
Writeln('Min = ',((a+b-abs(a-b))/2+c-abs((a+b-abs(a-b))/2-c))/2:0:0);
Writeln('Max = ',((a+b+abs(a-b))/2+c+abs((a+b+abs(a-b))/2-c))/2:0:0);
Readln;
End. 

[Học Pascal] Chương trình con

Chương trình con ( CTC ) là một chương trình độc lập, xử lý một công việc nhất định nào đó trong chương trình chính, nó có chỉ có thể thực hiện được công việc đã được lập trình khi ở chương trình chính có lời gọi đến nó.

Trong khi lập trình giải 1 bài toán, đôi khi chúng ta gặp phải những đoạn chương trình lặp đi lặp lại nhiều lần ở những phần xử lý khác nhau, để cho tiện lợi và không mất công, chúng ta định nghĩa 1 CTC với công việc được lập trình sẵn, khi cần thiết chỉ việc gọi chương trình con ra để làm việc mà không cần phải lập trình lại phần đã làm ở trên. Việc sử dụng CTC vô cùng tiện lợi và đảm bảo tính chặt chẽ của chương trình, thậm chí nhiều khi nếu không sử dụng CTC thì bài toán sẽ trở nên vô cùng rắc rối, và việc gỡ lỗi trong chương trình trở nên rất nan giải.

Pascal cung cấp cho chúng ta 2 loại CTC là Procedure ( Thủ tục ) và Function ( Hàm ). Đây là hai chương trình con sẽ theo các bạn trong suốt quá trình học. Đây chính là cơ sở để khi các bạn học lên các ngôn ngữ lập trình 32 bit, các bạn sẽ không bị bỡ ngỡ khi lập trình với lớp ( Class ) và Thư viện ( Library ). Hay nói một cách ngắn gọn, đây chính là phần quan trọng nhất trong kỹ thuật lập trình Pascal. Phần này tương đối phức tạp, nên bạn cố gắng tập trung để phân biệt, khi nào nên dùng Thủ thục, khi nào nên dùng Hàm, và các khái niệm liên quan khi tham chiếu các thành phần của các CTC.

Vị trí khai báo và định nghĩa CTC: CTC được khai báo và định nghĩa sau từ khoá VAR của Chương trình chính. Khai báo CTC có dạng sau:

PROCEDURE Tên thủ tục ( Khai báo các tham số hình thức, nếu cần );
Var ' Khai báo biến trong CTC nếu cần thiết
Begin
End; ' Kết thúc CTC bằng END;
FUNCTION Tên hàm ( Khai báo các tham số hình thức, nếu cần ): Kiểu dữ liệu trả về của Hàm;
Var ' Khai báo biến trong CTC nếu cần thiết
Begin
End; ' Kết thúc CTC bằng END;

CTC có cáu trúc giống hệt một chương trình chính, bạn có thể khai báo đầy đủ từ nhãn, hằng, biến, thậm chí bạn có thể định nghĩa một CTC khác trong CTC hiện hành.

Các tham số của CTC chính là các dữ liệu cần thiết nhập vào để xử lý các phép toán trong CTC sử dụng. Các tham số này được gọi là tham số hình thức, bởi nó chỉ mang danh nghĩa là các đối số của chương trình con, chứ về mặt bản chất dữ liệu nó lại mang thông tin của các biến trong chương trình chính. Các tham số này có 2 loại: Tham biến và Tham trị. Các CTC có thể có nhiều loại Tham số hình thức khác nhau về kiểu tham số hay về kiểu dũ liệu của tham số.

Tham biến: Là loại tham số hình thức mà giá trị của nó có thể thay đổi được trong các phép xử lý tính toán của CTC. Có thể dữ liệu nạp vào CTC là A, nhưng sau khi ra khỏi CTC ( kết quả sau khi thực hiện CTC ) nó lại mang kết quả B. Tham biến là tham số hình thức được khai báo ở CTC và bắt buộc phải được khai báo với từ kháo khai báo VAR. Các CTC có thể có nhiều loại tham biến, và cách khai báo các tham biến giống hệt như bạn khai báo biến trong chương trình chính.

Tham trị: Là loại tham số hình thức mà giá trị của nó không thể thay đổi được trong các phép xử lý tính toán của CTC. Dữ liệu nạp vào CTC là A, nhưng sau khi ra khỏi CTC ( kết quả sau khi thực hiện CTC ) nó vẫn phải là A. Chính vì vậy, trong CTC bạn không thể nào thực hiện 1 phép toán làm thay đổi giá trị của tham trị, nếu có máy sẽ báo lỗi.Tham trị là tham số hình thức được khai báo ở CTC và không bắt buộc phải được khai báo với từ kháo khai báo VAR. Các CTC có thể có nhiều loại tham trị, và cách khai báo các tham trị giống hệt như bạn khai báo biến trong chương trình chính.

A) Chương trình con dạng Thủ tục

CTC dạng Thủ tục được sử dụng khi các bạn muốn có một thủ tục nhập dữ liệu hoặc các phép tính toán trả về kiểu dữ liệu thường là " không định kiểu ". Hay nói chính xác hơn đó là một chương trình hoàn chỉnh trả về kết quả nhất định mà người lập trình mong muốn.

Ví dụ: Bạn viết một thủ tục nhập dữ liệu cho chương trình chính tính tổng các số nhỏ hơn số vừa nhập từ bàn phím.

Procedure Nhap ( n: byte);
begin
Write ( ' Nhap so N: = '); Readln ( N );
Writeln;
End;

Hoặc bạn cũng có thể viết luôn thủ tục tính ra kết quả mong muốn luôn bằng Thủ tục sau:

Procedure Nhap ( n: byte);
Var i , Tong : Byte;
begin
Write ( ' Nhap so N: = '); Readln ( N );
Writeln;
For i : = 1 to N do
Tong : = Tong + i ;
Writeln ( ' Tong cac so la : = ' , Tong );
Readln;
End;

B) Chương trình con dạng Hàm

CTC dạng Hàm được sử dụng khi các bạn muốn có một thủ tục nhập dữ liệu hoặc các phép tính toán trả về kiểu dữ liệu thường là xác định. Hay nói chính xác hơn đó là một chương trình hoàn chỉnh trả về kết quả với kiểu dữ liệu nhất định mà Pascal đã định nghĩa hoặc Pascal có thể " hiểu " được ( Đối với kiểu dữ liệu do người lập trình tự định nghĩa )

Ví dụ: Cũng ví dụ trên bạn có thể viết ở dạng Hàm như sau

Function Tong ( n : byte ) : Byte;
Var i , Trung_gian : Byte;
Begin
Write ( ' Nhap so N : = ');Readln ( N );
Writeln;
For i : = 1 to N do
Trung_gian : = Trung_gian + i ;
Tong : = Trung_gian ;
End;

Ở CTC dạng hàm bạn nên chú ý. Hàm chir được hoàn tất khi Tên hàm được gán cho 1 giá trị cuối cùng sau khi thực hiện các phép tính toán. Và trong chương trình chính khi có lời gọi Hàm thì cũng phải có một phép toán gán giá trị để nhận được kết quả của Hàm. VD: Tring ví dụ trên khi vào chương trình chính nếu ta muốn in ra giá trị của Tong hay dùng Tong là một phép tính toán khác thì ta thực hiện phép gán sau khi goi chương trình con là A : = Tong ( so ) (Với so là tham số thực sự cỉa bài toán - tức là biến của chương trình chính ).

C) Một số chú ý khi dùng CTC

Khi sử dụng CTC bạn cần chú ý một số điểu sau đây:
1) Nên sử dụng CTC dạng Hàm hay Thủ tục
2) Tránh việc khai báo các tham số hình thức bừa bãi và không nhất quán
3) Phân biệt rõ ràng 2 khái niêm Tham biến và Tham trị. Để bạn hiểu rõ hơn, bạn hãy chạy đoạn mã và xem kết quả của ví dụ sau.

Uses crt;
Var
a , b : integer;
{----------------------}
Procedure VD ( x : integer; var y: integer );
Begin
inc ( x );
inc ( y );
writeln ( x : 4 , y : 4 );
end;
{---------------------}
Begin
a : = 1 ;
b : = 10 ;
VD ( a , b );
writeln ( a : 4 , b : 4 );
readln;
end.

D) Bài tập luyện tập.

* Bạn hãy viết tất cả các chương trình bạn đã làm ở dạng CTC
** Lập trình ( có sủ dụng CTC ) để:
- Tính Giai thừa 1 số được nhập từ bàn phím
- Tìm USCLN của 2 số nhập từ bàn phím
- Tìm các số FIbonaci nhỏ hơn 1 số cho trước từ bàn phím
- Tìm các số chính phương nhỏ hơn một số nguyên cho trước. 

Code Pascal sưu tầm

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

In ra màn hình pascal phần tử có dạng '3 mũ k cộng 2'

Viết chương trình nhập mảng 1 chiều có N phần tử. In ra màn hình các phần tử có dạng 3k+2 (k=0,1,2,3...).
Ý tưởng: Viết hàm kiểm tra xem phần tử a[i] có dạng 3^k+2 hay không.


uses crt;
var b,j,i,x:integer;
a:array[1..100] of integer;


Function gt(k:integer):longint;
 var j:integer;s:longint;
  begin
s:=1;
     for j:=1 to k do
           s:=s*3;
gt:=s;
end;

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

Function kt(x:integer):boolean;
 var i,j,k:integer;s:longint;
  begin
kt:=false;

s:=1;
k:=0;

 Repeat
  inc(k);
gt(k);

Until gt(k)>=x-2;
if gt(k)=x-2 then kt:=true;
end;

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

begin
 clrscr;
     Write('Nhap so phan tu= ');readln(x);
     For i:=1 to x do begin
      write('a[',i,']= ');
      readln(a[i]);
       end;
 For i:=1 to x do
   if kt(a[i]) then write(a[i],' ');writeln;
   readln
   end.

Bài tập Pascal - Giải bài tập Pascal (cơ bản)

Nhằm đáp ứng nhu cầu hỏi đáp về Pascal của anh em, đây sẽ là khu vực hỏi đáp, giải các bài tập về Pascal. Trước khi đặt câu hỏi, bạn cần lưu ý những điều sau:


- Nội dung câu hỏi phải liên quan tới Pascal.
- Đây là khu vực giải các bài tập cơ bản, các bài tập nâng cao (đệ quy quay lui, quy hoạch động...) không được phép post tại khu vực này (sẽ có mục giải bài tập Pascal nâng cao riêng).

- Nếu được, hãy ân vào biểu tượng  ở phần bên phải của trang web  để ủng hộ website phát triển (nếu chưa ấn).

Thứ Ba, 24 tháng 4, 2012

Thuật toán tìm kiếm 1 số trong mảng 2 chiều (Pascal)


Viết chương trình Pascal tìm một số (phần tử) trong mảng hai chiều. In tổng số lần và vị trí xuất hiện của các phần tử ra màn hình.


Program Tim_so;
   Var
      a:Array[1..4,1..6] Of Integer;
      i,j,so,solan:Integer;
Begin
   Writeln('TIM MOT SO TRONG MANG');
   Writeln('---------------------');
   Writeln;
   For i:=1 To 4 Do
      For j:=1 to 6 Do
         Begin
            Write('-Phan tu A[',i,',',j,']= ');
            Readln(a[i,j]);
         End;
   Writeln;
   Write('-So muon tim: ');
   Readln(so);
   solan:=0;
   For i:=1 To 4 Do
      For j:=1 To 6 Do
         If so=a[i,j] Then
            Begin
               solan:=solan+1;
               Writeln('+Lan: ',solan,' tai hang: ',i,' cot: ',j);
            End;
   Writeln;
   Writeln('+Tong so lan xuat hien la: ',solan);
   For i:=1 To 4 Do
      Begin
         For j:=1 To 6 Do
            Write(a[i,j]:8);
            Writeln;
      End;
   Readln
End.

Xóa các phần tử trùng nhau trong mảng 1 chiều (pascal)

Nhập vào mảng 1 chiều gồm 1 dãy số nguyên N phần tử. Hãy xóa các phần tử trùng nhau trong mảng và in kết quả ra màn hình. Ý tưởng: Duyệt mảng 1 chiều bằng 2 biến, nếu phát phát hiện phần tử nào trùng thì xóa phần tử ấy ra khỏi mảng.


Program Bo_so_trung;
   Const
      Max=100;
   Var
   a:Array[1..Max] Of Integer;
   i,j,k,n:Integer;
Begin
   Writeln('XOA BO CAC SO TRUNG NHAU');
   Writeln('------------------------');
   Writeln;
   Write('-Nhap so phan tu mang: ');
   Readln(n);
   For i:=1 To N Do
      Begin
         Write('-Phan tu A[',i,']= ');
         Readln(a[i]);
      End;
   i:=2;
   While i <= N Do
      Begin
         j:=1;
         While a[j] <> a[i] Do
            j:=j+1;
         If j < i Then
            Begin
               For k:=i to n-1 Do
                  a[k]:= a[k+1];
               n:=n-1;
            End
         Else
            i:=i+1;
      End;
   Writeln;
   Write('-Mang con lai: ');
   For i:=1 to n Do
      Write(a[i]:8);
   Writeln;
   Writeln('   Bam phim <Enter> de ket thuc ');
   Readln
End.

In bảng mã ASCII của các ký tự chữ cái trong pascal

Viết chương trình Pascal in mã ASCII của các ký tự. Khá đơn giản chỉ với 1 lệnh for.

Program Mang_Ky_Tu;
   Var
      a:Array[Char] Of Integer;
      Ch:Char;
Begin
   Writeln('IN MA ASCII CUA CAC KY TU');
   Writeln('------------------------');
   For Ch:='A' To 'Z' Do
      Begin
         a[Ch]:=Ord(Ch);
         Writeln('-Ky tu: ',Ch,' ma ASCII = ',a[ch]);
      End;
   Writeln;
   Writeln('Bam phim <Enter> de ket thuc');
   Readln
End.

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

Xóa 1 phần tử trong mảng 1 chiều

Viết CT nhập từ bàn phím mảng 1 chiều và xóa 1 phần tử của mảng có n phần tử.

var
  n,i,q,k,p:integer;
  a,b:array [1..1000] of integer;
begin
  write('n= ');readln(n);
  for i:=1 to n do
    begin
      write('a[',i,']= ');
      readln(a[i]);
    end;
  write('Xoa pt co vi tri la: ');readln(p);
  q:=0;
  for i:=1 to n do
    if q<>p then
      begin
        inc(q);
        b[q]:=a[i];
      end;
  writeln('Mang sau khi xoa la: ');
  for i:=1 to q do
    write(b[i],' ');
  readln
end.

Nhập thêm 1 phần tử vào mảng 1 chiều

Viết chương trình nhập vào một mảng A gồm N số nguyên và nhập thêm vào một số nguyên X.

var
  n,i,q,k,p,:integer;
  a,b:array [1..1000] of integer;
begin
  write('n= ');readln(n);
  for i:=1 to n do
    begin
      write('a[',i,']= ');
      readln(a[i]);
    end;
  write('-Chen pt va vi tri cua pt do: ');readln(k,p);
  q:=0;
  for i:=1 to n do
    begin
    inc(q);
    if q=p then begin
      b[q]:=k;
      inc(q);
    end;
    b[q]:=a[i];
  end;
  writeln('-Mang sau khi chen la: ');
  for i:=1 to q do
    write(b[i],' ');
  readln
end.

Tìm tổng các số bất kỳ từ dãy 1,2,2,3,3,3,4,4,4,4...

Cho mảng A là dãy số 1,2,2,3,3,3,4,4,4,4,5,5,5,5,5.... Nhập vào số m, n (m<=n<=100000). In ra tổng A[m]+A[m+1]+...+A[n-1]+A[n].

 
program code;
var di:word;
    m,n,i,res:longint;

begin
   writeln('Nhap M: '); readln(m);
   writeln('Nhap N: '); readln(n);
   di:=0;
   i:=0;
   res:=0;
   while i<m do
    begin
      di:=di+1;
      i:=i+di;
    end;
    res:=(i-m+1)*di;
    while i<=n do
     begin
        di:=di+1;
        i:=i+di;
        res:=res+di*di;
     end;
    res:=res-di*(i-n);

   writeln('Ket qua: ',res);
   readln;
end.

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;

Đếm số lần xuất hiện của mỗi chữ cái trong xâu

Viết chương trình nhập vào từ bàn phím một xâu kí tự S và thông báo ra màn hình số lần xuất hiện của mổi chứ cái tiếng Anh trong S ( không phân biệt chữ hoa và chữ thường).

Uses Crt;
Var    St:String;
       dem: Array[‘A’..’Z’] Of Byte;
       i:Byte;
       ch:Char;
Begin
    Write(‘Nhap xau St: ‘); Readln(St);
    {Khởi tạo mảng}
    For ch:=’A’ To ‘Z’ Do dem[ch]:=0;
    {Duyệt xâu}
    For i:=1 To Length(St) Do
        If Upcase(St[i]) IN [‘A’..’Z’] Then              Inc(dem[Upcase(St[i])]);
    {Liệt kê các ký tự ra màn hình}
    For ch:=’A’ To ‘Z’ Do
        If dem[ch]>0 Then Writeln(ch,’ : ’,dem[ch]);
    Readln;
End.



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

Kiểm tra cấp số cộng trong pascal

Nhập dãy số gồm N số nguyên (N<100). Xác định xem đó có phải dãy số có tính chất là cấp số cộng hay không.

uses crt;
  Var
  A:array[1..100] of integer;
  i,n,d: integer;
  CS: boolean;
  BEGIN
  clrscr;
  repeat
  Write(' Nhap vao so nguyen duong N <=100 : ');
  readln(N);
  Until (n>1) and (n<=100);
  For i:=1 to n do
     begin
     repeat
     write('A[',i,'] = ');
     readln(A);
     until abs(A)<=1000;
     end;
     d:=abs(A[2]-A[1]);
     CS:=True;
     For i:=2 to n do
         IF (abs(A-A[i-1])<>d) then  
                                   begin
                                    CS:=False;
                                    break;
                                   end;
     IF CS then writeln('Day la cap so cong ')
           else writeln(' Day ko phai la cap so cong ');
     readln;
  END.

Thứ Tư, 11 tháng 4, 2012

Bài 5: Xâu ký tự (String) trong Pascal

Xâu là gì? Để xử lý các chuỗi văn bản, Pascal đưa ra một kiểu dữ liệu mới gọi là xâu ký tự và được định nghĩa bằng từ khóa STRING. Xâu ký tự là dữ liệu bao gồm một dãy các ký tự trong bảng mã ASSCII.

Cách khai báo:

Var: STRING[độ dài của xâu];

Xâu ký tự trong bộ nhớ nó chiếm số byte bằng số ký tự cực đại được khai báo cộng với byte đầu tiên chứa số ký tự hiện có của xâu. Độ dài tối đa của xâu ký tự là 255.

- Cách nhập/xuất: Cách đọc hay viết kiểu STRING cũng tương tự như các kiểu dữ liệu khác, ta sử dụng các thủ tục READ, hoặc WRITE.
Ví dụ:
Readln(st);
Writeln(st);

- Truy cập từng phần tử của xâu ký tự: tương tự mảng 1 chiều: thông qua tên biến kiểu STRING và chỉ số của nó
Ví dụ:
St := 'Le Thanh Lam';
write(st[4]);
-> Kết quả: cho ra chữ T.

Các thao tác trên xâu ký tự:

1/ Phép cộng xâu:

Ví dụ:
st1:=’Le’; st2:=’Thanh’; St=st1 + st2; 
-> KQ: ‘Le Thanh’

2/ Phép so sánh: 
Hai xâu ký tự có thể so sánh với nhau bằng các phép so sánh =, >, <…
Nguyên tắc so sánh thực hiện như sau, chúng sẽ đem từng ký tự tương ứng với nhau để so sánh, xâu nào có ký tự có số thứ tự trong bảng mã ASCII lớn hơn thì xâu đó lớn hơn.
Hai xâu ký tự được gọi là bằng nhau khi chúng hoàn toàn giống nhau (có độ dài như nhau).
Ví dụ: ‘FILENAME’ = ’FILENAME ‘

3/ Các thủ tục và hàm chuẩn xử lý xâu ký tự
a. Hàm length(st): cho độ dài thực của xâu ký tự
ví dụ: st:=’le thanh’ thì LENGTH(st) cho bằng 8.

b/ Thủ tục DELETE(st, pos, num): xóa num ký tự trong xâu st kể từ vị trí pos
Ví dụ: st= ‘FILENAME’
Delete(st,5,4) lúc đó st cho ra là ‘FILE’

c/ Thủ tục INSERT(obj, st, pos): Thủ tục cho kết quả bằng cách chèn xâu ký tự có tên là Obj vàoxâu st tại vị trí pos, những ký tự đứng sau pos sẽ được dời vềphía sau của xâu ký tự obj.
Ví dụ: obj:= ‘Thanh ‘
st:=’Le Lam’;
INSERT(obj,st,4) lúc đó st=’Le Thanh Lam’;

d/ Thủ tục STR(value, st): Thủ tục này thực hiện việc chuyển đối giá trị kiểu số(value) sang dạng xâu ký tự và gán cho biến st.
Ví dụ: n là một só nguyên có giá trị: n:=150;
STR(n:5,st) sẽ cho kết quả xâu st là: st=’ 150’;

e/ Thủ tục VAL(st, value,code) đối một xâu ký tự st sang dạng số và gán cho biến value, nếu biến đối thành công thì code sẽ nhận giá trị bằng 0. ngược lại thì cho giá trị khác không
Ví dụ: VAL(‘123’,value,code) lúc này code sẽ nhận giá trị bằng 0 và value=123

f/ Hàm COPY(st, pos, num): sao chép trong xâu st, num ký tự tại vị trí pos,
Ví dụ: st=’Le Thanh Lam’
COPY(st,4,5) = ‘Thanh’;

g/ Hàm CONCAT(s1,s2,…,sn): hàm cho ra 1 xâu mới bằng cách nối đuôi các xâu s1,s2,…,sn lại với nhau.
Ví dụ: CONCAT(‘Le ’,’Thanh ‘, ‘Lam’) = ‘Le Thanh Lam’;

h/ Hàm POS(st1,st2): hàm cho tavị trí tìm thấy đầu tiên của xâu s1 trong xâu s2.
Ví dụ: POS(‘Lam’,‘Le Thanh Lam’) = 10;

Sưu tầm và biên tập

Thứ Ba, 10 tháng 4, 2012

Ebook Giải thuật và lập trình – Lê Minh Hoàng

Ebook Giải thuật và lập trình  Lê Minh Hoàng

Nếu bạn là người đam mê tin học, nếu bạn là người muốn khám phá về lập trình, hẳn bạn phải biết đến một cuốn sách tin học rất nổi tiếng ở Việt Nam trong nhiều năm trở lại đây. Từ những học sinh không chuyên đến những thành viên đội tuyển thi quốc tế tin học, có lẽ không một ai chưa từng học qua cuốn sách được biên soạn bởi một thầy giáo trẻ những đầy tài năng của trường Đại học Sư phạm Hà Nội, thầy Lê Minh Hoàng.


Mục lục:

PHẦN 1 – BÀI TOÁN LIỆT KÊ

  • 1-Nhắc lại một số kiến thức đại số tổ hợp
  • 2-Phương pháp sinh
  • 3-Thuật toán quay lui
  • 4-Kỹ thuật nhánh cận

PHẦN 2 – CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

  • 1-Các bước cơ bản khi tiến hành giải các bài toán tin học
  • 2-Phân tích thời gian thực hiện giải thuật
  • 3-Đệ quy và giải thuật đệ quy
  • 4-Cấu trúc dữ liệu biểu diễn danh sách
  • 5-Ngăn xếp và hàng đợi
  • 6-Cây
  • 7-Ký pháp tiền tố, trung tố và hậu tố
  • 8-Sắp xếp
  • 9-Tìm kiếm

PHẦN 3 – QUY HOẠCH ĐỘNG

  • 1-Công thức truy hồi
  • 2-Phương pháp quy hoạch động
  • 3-Một số bài toán quy hoạch động

PHẦN 4 – CÁC THUẬN TOÁN TRÊN ĐỒ THỊ

  • 1-Các khái niệm cơ bản
  • 2-Biểu diễn đồ thị trên máy tính
  • 3-Các thuật toán tìm kiếm trên đồ thị
  • 4-Tính liên thông của đồ thị
  • 5-Vài ứng dụng của các thuật toán tìm kiếm trên đồ thị
  • 6-Chu trình Euler, đường euler, đồ thị euler
  • 7-Chu trình Hamilton, đường đi Hamilton, Đồ thị Hamilton
  • 8-Bài toán đường đi ngắn nhất
  • 9-Bài toán cây khung nhỏ nhất
  • 10-Bài toán luồng cực đại trên mạng
  • 11-Bài toán tìm bộ ghép cực đại trên đồ thị hai phía
  • 12-Bài toán tìm bộ ghép cực đại với trọng số cực tiểu trên đồ thị hai phía – thuật toán Hungari
  • 13-Bài toán tìm bộ ghép cực đại trên đồ thị

Tải về: Ebook Giải thuật và lập trình [pdf]
Hoặc xem online: Ebook giải thuật và lập trình - Upload by Codepascal.blogspot.com

Phân tích một số ra thừa số nguyên tố

Ví dụ: Phân tích 12=2*2*3. Ý tưởng: Thuật toán phân tích một số ra thừa số nguyên tố tương tự như thuật toán kiểm tra số nguyên tố. Điểm khác ở đây là khi kiểm tra số nguyên tố ta phải lần lượt kiểm tra các số nhỏ hơn sqrt(n) (căn bậc hai của n) có phải là ước của n hay không, còn khi phân tích ta chỉ việc chia n cho các số nguyên bắt đầu từ số nguyên tố nhỏ nhất là 2. Khi không chia được nữa thì ta tăng số chia lên 1 đơn vị, quá trình phân tích kết thúc khi n bằng 1.

VAR i,n :INTEGER;
BEGIN
    Write ('Nhap n:');
    Readln(n);
    Write (n,'=');
    i:=2;
    REPEAT
        WHILE n MOD i <> 0 DO
            i:=i+1;
        Write(i);
        n:=n DIV i;
        IF n > 1 THEN
            write ('*');
    UNTIL n = 1;
    readln;
END.

Viết code trực tuyến với Ideone – online mini IDE and debugging tool


Ideone.com là một… pastebin (dùng để lưu trữ text trực tuyến). Tuy nhiên, nó không giống như các pastebin khác trên Internet. Chính xác hơn nó là IDE và công cụ gỡ rối trực tuyến (online mini IDE and debugging tool ).

Ideone là một từ tiếng Ý có nghĩa là ý tưởng tuyệt vời – bởi vì ideone.com là nơi mà những ý tưởng lớn của bạn có thể trở thành hiện thực.
Ideone.com được thiết kế cho hầu hết các lập trình viên (tất nhiên, bạn cũng có thể tải lên một văn bản thông thường). Bạn có thể sử dụng nó để:
  • Chia sẻ code của bạn (rõ ràng rồi – nó là một pastebin, đúng không nào?) một cách rõ ràng
  • Chạy (run) code của bạn trên máy chủ hỗ trợ hơn 40 ngôn ngữ lập trình (tương lai sẽ hỗ trợ thêm nhiều ngôn ngữ hơn)
  • Bạn có thể cung cấp dữ liệu đầu vào (input data) cho chương trình của riêng bạn
  • Ideone.com cũng cung cấp miễn phí ideone API có sẵn như một webservice. Chức năng này cho phép bạn xây dựng các dịch vụ riêng của bạn giống như ideone!
  • Cho phép người dùng đăng nhập Ideone và cung cấp chức năng quản lý code của riêng mỗi người và nhiều chức năng khác nữa.
Tất cả các code có thể truy cập thông qua URL chia sẻ. Các trang lưu code cung cấp thông tin về code và thực thi của nó: bộ nhớ sử dụng, thời gian thực thi, ngôn ngữ và phiên bản trình biên dịch, code, input được tải lên bởi người sử dụng, output được tạo ra bởi chương trình và thông báo lỗi từ các trình biên dịch và gỡ rối.

for every one Viết code trực tuyến với Ideone   online mini IDE and debugging tool
Hỗ trợ hơn 40 ngôn ngữ: hợp ngữ, Pascal, C/C++, C#, Java, PHP,... Chọn ngôn ngữ, gõ hoặc paste code và input rồi nhấn submit

syntax highlight Viết code trực tuyến với Ideone   online mini IDE and debugging tool
Để trình bày code được rõ ràng hơn, bạn click chọn Syntax highlight

share link Viết code trực tuyến với Ideone   online mini IDE and debugging tool
Url để chia sẻ code

run result Viết code trực tuyến với Ideone   online mini IDE and debugging tool
Kết quả chạy một chương trình mẫu bằng ngôn ngữ C++

Một điều chắc chắn rằng bạn sẽ không dùng ideone để viết phần mềm, có nhiều môi trường tuyệt vời hơn để làm điều đó. Trong trường hợp khẩn cấp, cần kiểm thử code, Ideone sẽ là một trợ thủ đắc lực cho bạn. Nếu bạn muốn dùng thường xuyên, bạn có thể tạo một tài khoản và nó sẽ lưu lại các code của bạn, và bạn có thể chỉnh sửa, bỏ các quảng cáo, tăng thời gian chạy lên 15 giây và hơn thế nữa.

Bạn cũng có thể viết và chạy thử code trên điện thoại bằng các ứng dụng được phát triển dựa vào API của ideone (yêu cầu có kết nối internet):

idedroid Viết code trực tuyến với Ideone   online mini IDE and debugging tool
IDEdroid ứng dụng dành cho hệ điều hành Android, bạn có thể sử dụng bất kì ngôn ngữ lập trình nào có trên ideone.

904bc03316677229.jpg Viết code trực tuyến với Ideone   online mini IDE and debugging tool
CodeToGo ứng dụng dành cho các thiết bị iOS (iPhone, iPod Touch, and iPad), chọn ngôn ngữ, viết code và chạy.

Ideone mobile environment chạy trên nền Java ME, một IDE đơn giản cho phép tải code lên ideone.com, thực thi và lấy kết quả về.

Tải về: Mã nguồn | JAR (Rebuild) | JAD (Rebuild)

Theo Kỹ thuật lập trình

Đưa ra xâu đảo theo từ

Viết chương trình nhập vào xâu, đưa ra xâu đảo theo từ. Ví dụ: đi xe đạp -> đạp xe đi.

uses crt;
var s:string;
    x,y,z,t:byte;
begin
  write('Nhap vao mot xau: ');
  readln(s);
  z:=length(s);
  for y:=length(s) downto 1 do
  begin
    if ((s[y]=' ')or(y=1)) then begin for t:=y to z do write(s[t]);z:=y end;
    write(' ');
  end;
  readln;
end.

Bài đăng phổ biến