Thứ Ba, 6 tháng 3, 2012

Mảng thay vì kiểu bản ghi

Viết ra File HOSO.TXT bao gồm các thông tin của n HS (thông tin bao gồm STT, Tên và Năm vào học) vs n và thông tin hs nhập từ bàn phím, không cần xếp tên HS theo thứ tự ABC. Sau đó in ra Tên màn hình các HS có năm vào học là 2000.
Yêu cầu: Áp dụng các kiến thức về File, Array... Không sử dụng bản ghi

Uses crt;
Const
  max=100;
Var
  F:Text;
  a:array[1..max] of integer;
  ten:array[1..max] of string;
  n,i:integer;
BEGIN
  Clrscr;
  Write('Nhap so hoc sinh:');
  Readln(n);
  Assign(F,'HOSO.TXT');
  Rewrite(F);
  For i:=1 to n do
    Begin
      Writeln('Nhap thong tin ve hoc sinh thu ',i,':');
      Write('Nhap ten cua hoc sinh thu ',i,':');
      Readln(ten[i]);
      Write('Nhap nam vao hoc cua hoc sinh thu ',i,':');
      Readln(a[i]);
      Writeln;
      Writeln(F,'Hoc sinh thu ',i,', ten la:',ten[i],' vao hoc nam:',a[i]);
    End;
  Close(F);
  Writeln('Danh sach cac hoc sinh vao hoc nam 2000:');
  For i:=1 to n do
    If a[i]=2000 then writeln('Hoc sinh thu ',i,', ten la:',ten[i]);
  Write('Done !');
END.

Dãy hạnh phúc

Dãy số tự nhiên a1 , a2 ,a3...  ak được gọi là hạnh phúc nếu nó thoả mãn các điều kiện sau :
- Dãy trên là một dãy giảm dần .
- Với mọi i ( 1<=i <= k ) ai hoặc là số nguyên tố , hoặc phải là ước của một trong các số a1 , a2 , ... , ai
VD : 18 17 13 11 9 7 6 5 3 2 là dãy hạnh phúc
Viết chương trình nhập 1 số tự nhiên N từ bàn phím và in ra màn hình một dãy số hạnh phúc càng dài càng tốt với số hạng đầu tiên là N.

Uses crt;
Const
  max=37;
Var
  a:array[1..max] of longint;
  n,i:longint;
BEGIN
  Clrscr;
  a[1]:=1; a[2]:=1; a[3]:=2;
  For i:=4 to max do
    a[i]:=a[i-1]+a[i-2]+a[i-3];
  Write('Nhap so n:'); readln(n);
  i:=max;
  While a[i]>n do i:=i-1;
  Write(n,'=',a[i]);
  n:=n-a[i];
  While n>0 do
    Begin
      i:=i-1;
      If n>=a[i] then
        Begin
          Write('+',a[i]);
          n:=n-a[i];
        End;
    End;
  Readln;
END.

Tuổi cha tuổi con

Nhập từ bàn phím tuổi cha và con (hiện tại tuổi cha lớn hơn 2 lần tuổi con và tuổi cha hơn tuổi con ít nhất là 25). Đưa ra màn hình câu trả lời cho câu hỏi "Bao nhiêu năm nữa thì tuổi cha gấp đôi tuổi con"?


uses crt;
var tcha,tcon,nam,kq:byte;
begin
write('nhập tuổi con:');readln(tcon);
write('nhập tuổi cha gấp ba lần tuổi con và ít nhất lớn hơn tuổi con 25:');readln(tcha);
repeat
nam:=nam+1;
tcon:=tcon+1:
tcha:=tcha+1;
until tcha=2*tcon;
kq:=nam;
writeln('vậy sau ',kq,' năm thì tuổi cha gấp 2 tuổi con');
readln;
end.

Thứ Hai, 5 tháng 3, 2012

Tìm ước chung lớn nhất và bội chung nhỏ nhất pascal

Ý tưởng: Lấy số lớn hơn trong 2 số trừ đi nhau. Lặp lại thao tác đến khi nào 2 số bằng nhau -> UCLN. Lấy tích của 2 số chia cho UCLN -> BCNN.

Thuật toán tìm Bội chung nhỏ nhất và Ước chung lớn của 2 số trong Pascal:


Cách 1: Dưới đây là thuật toán tìm UCLN bằng cách trừ đi nhau, được trình bày trong SGK tin học 10.

var x,y,UCLN,BCNN:integer;
begin
readln(x,y);
BCNN:=x*y;
While x<>y do If x>y then x:=x-y else y:=y-x;
UCLN:=x;
BCNN:=BCNN div UCLN;
write(UCLN,' ',BCNN);
end.

Cách 2: Thuật toán Euclide: Ngoài cách tìm UCLN như trên. Các bạn có thể sử dụng cách chia lấy dư (mod), chương trình sẽ tối ưu do phải thực hiện ít phép tính hơn.

Ý tưởng: UCLN của 2 số x, y cũng là UCLN của 2 số y và x mod y, vậy ta sẽ đổi x là y, y là x mod y cho đến khi y bằng 0. Khi đó UCLN là x.

var x,y,UCLN,BCNN,t:integer;
begin
readln(x,y);
BCNN:=x*y;
t:= y mod x;
While t <> 0 do
      Begin
        t:= x MOD y;
        x:= y;
        y:= t;
      End;
ucln:=x;
BCNN:=BCNN div UCLN;
write(UCLN,' ',BCNN);
end.

Cách 3: Tìm UCLN bằng cách dùng đệ quy: Đệ quy được hiểu đơn giản là sự gọi nhiều lần chương trình con trong chương trình. Thực sự, đối với bài toán đơn giản, không ai sử dụng đệ quy vì sẽ làm phức tạp vấn đề và làm chương trình trở nên rắc rối, phải thực hiện nhiều phép tính hơn. Tuy nhiên, nếu bắt buộc phải dùng đệ quy, các bạn có thể tham khảo cách làm dưới đây:

function ucln(x,y:integer):integer;
begin
if x = y then
ucln:=x
else if x > y then
ucln:=ucln(x mod y,y)
else
ucln:=ucln(x, y mod x);
end;
var x,y:integer;
begin
readln(x,y);
write('Ước chung lớn nhất là: ', UCLN(x,y), ' Bội chung nhỏ nhất là: ', (x*y) div UCLN(x,y));
end.

Dãy số Fibonacci và bài toán nuôi thỏ

Dãy số Fibonacci bắt nguồn từ bài toán cổ về việc sinh sản của các cặp thỏ. Bài toán đặt ra như sau:
1) Các con thỏ không bao giờ chết
2) Hai tháng sau khi ra đời, mỗi cặp thỏ mới sẽ sinh ra một cặp thỏ con (một đực, một cái)
3) Khi đã sinh con rồi thì cứ mỗi tháng tiếp theo chúng lại sinh được một cặp con mới
Giả sử từ đầu tháng 1 có một cặp mới ra đời thì đến giữa tháng thứ n sẽ có bao nhiêu cặp.

Ví dụ, n = 5, ta thấy:
Giữa tháng thứ 1: 1 cặp (ab) (cặp ban đầu)
Giữa tháng thứ 2: 1 cặp (ab) (cặp ban đầu vẫn chưa đẻ)
Giữa tháng thứ 3: 2 cặp (AB)(cd) (cặp ban đầu đẻ ra thêm 1 cặp con)
Giữa tháng thứ 4: 3 cặp (AB)(cd)(ef) (cặp ban đầu tiếp tục đẻ)
Giữa tháng thứ 5: 5 cặp (AB)(CD)(ef)(gh)(ik) (cả cặp (AB) và (CD) cùng đẻ)
Bây giờ, ta xét tới việc tính số cặp thỏ ở tháng thứ n: F(n)

Nếu mỗi cặp thỏ ở tháng thứ n – 1 đều sinh ra một cặp thỏ con thì số cặp thỏ ở tháng thứ n sẽ là:
F(n) = 2 * F(n – 1)

Nhưng vấn đề không phải như vậy, trong các cặp thỏ ở tháng thứ n – 1, chỉ có những cặp thỏ đã có ở tháng thứ n – 2 mới sinh con ở tháng thứ n được thôi. Do đó F(n) = F(n – 1) + F(n – 2) (= số cũ + số sinh ra). Vậy có thể tính được F(n) theo công thức sau:
• F(n) = 1 nếu n ≤ 2
• F(n) = F(n – 1) + F(n – 2) nếu n > 2
(Trích: Cấu trúc dữ liệu và giải thuật – Lê Minh Hoàng)

VAR thang,i, tn, tn_1, tn_2:INTEGER;
BEGIN           
    write('Nhap so thang: ');
    readln(thang);
    IF thang>2 THEN
    BEGIN
        tn_2:=1; {Thang dau tien co 1 cap tho}
        tn_1:=1; {Thang thu 2 van co 1 cap tho}
        FOR i:=3 TO thang DO
        BEGIN
            tn:=tn_1 + tn_2;
            tn_2:=tn_1;
            tn_1:=tn;
        END;
    END
    ELSE
        tn:=1;
    writeln('So con tho sau ',thang,' thang la: ',2*tn);
    readln
END.

Lưu ý: hiện nay có một số sai khác về định nghĩa dãy Fibonacci như sau:
• F(n) = 1 nếu n < 2
• F(n) = F(n – 1) + F(n – 2) nếu n >= 2
hoặc theo định nghĩa trên wikipedia:
• F(n) = n nếu n < 2
• F(n) = F(n – 1) + F(n – 2) nếu n >= 2

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

Dếm số ký tự chữ và số

Viết ct nhập vào xâu có cả chữ và số, rồi cho xuất ra có bao nhiêu kí tự chữ và bao nhiêu kí tự số.

var s: string;cs,cc,i: integer;
begin
 write('Nhap mot xau ky tu: ');
 readln(s);
 cs:=0;
 cc:=0;
 for i:=1 to length(s) do
 begin
  if (s[i] in ['0'..'9']) then cs:=cs+1;
  if s[i] in ['A'..'Z'] + ['a'..'z'] then cc:=cc+1;
 end;
 write('So cac ki tu la chu so:',cs:2,'  So cac ki tu la chu cai:',cc:4);
 readln
end.

Bài đăng phổ biến