Bài tập Pascal về xâu và chương trình con

Z

zuni_innashi

[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

BÀI 1: Nhập xâu S và in ra các từ của nó (từ là một dãy các kí tự cách nhau bởi dấu cách). Xâu có bao nhiêu từ là đối xứng ?

Hướng dẫn:
- Bước 1: Bỏ qua các dấu cách cho đến khi gặp 1 kí tự khác cách hoặc hết xâu.
- Bước 2: Ghi các kí tự tiếp theo vào xâu tạm cho đến khi gặp dấu cách hoặc hết xâu, khi đó ta được 1 từ.
- Bước 3: Nếu chưa hết xâu thì quay lại bước 1.
Mỗi khi tìm được 1 từ ta ghi nó ra màn hình, nếu từ đó đối xứng thì tăng biến đếm.

BÀI 2: Một số nguyên là palindrom nếu nó đọc từ trái sang cũng bằng đọc từ phải sang (ví dụ: 121). Nhập một dãy n phần tử nguyên dương, [TEX]5 \leq n \leq 20[/TEX] và các phần tử có 2 đến 4 chữ số. In ra các số là palindrom trong dãy.

Hướng dẫn: Một số là palindrom thì xâu tương ứng của nó là xâu đối xứng. Ta sẽ xây dựng một hàm kiểm tra một số có phải là palindrom ko bằng cách chuyển số đó thành xâu và kiểm tra xâu đó có đối xứng ko.

BÀI 3: Nhập 1 số n [TEX](5 \leq n \leq 10)[/TEX] và n phần tử của dãy A [TEX](1 < [/TEX][TEX]A_i[/TEX] [TEX]< 100)[/TEX] (có kiểm tra dữ liệu khi nhập)
a, In ra các phần tử là số nguyên tố của dãy.
b, TÍnh ước chung lớn nhất của tất cả các phần tử trong dãy.
c, Tính biểu thức: [TEX]S = A_1^1 + A_2^2 + ... + A_n^n[/TEX]
d, Sắp xếp dãy tăng dần và in ra dãy sau sắp xếp.

Hướng dẫn: Ta nên chia thành các chương trình con, mỗi chương trình con thực hiện 1 yêu cầu. Ngoài ra ta cũng viết thêm các hàm kiểm tra nguyên tố, hàm mũ, hàm UCLN để thực hiện các yêu cầu đó.
 
L

lamdetien36

Bài 3 (trên Turbo Pascal không thể chạy được, hay đúng hơn là cái đề này chỉ có thể làm trên Free Pascal, muốn chạy được trên Turbo thì phải xử lý số lớn, khá là phức tạp :) )
Mã:
var
   A: array [1..10] of integer;
   N, i, g: integer;
   S: qword;
function isPrime(k: integer): boolean;
 var
    i, t: integer;
 begin
      t := trunc(sqrt(k));
      for i := 2 to t do
      begin
           if k mod i = 0 then exit(false);
      end;
      isPrime := true;
 end;
function GCD(x, y: integer): integer;
 var
    q: integer;
 begin
      while y <> 0 do
      begin
           q := x mod y;
           x := y;
           y := q;
      end;
      GCD := x;
 end;
function Power(a, n: integer): qword;
 var
    d: qword;
    i: integer;
 begin
      d := 1;
      for i := 1 to n do d := d * a;
      Power := d;
 end;
procedure Sort;
 var
    i, j, t: integer;
 begin
      for i := 1 to N - 1 do
      begin
           for j := i + 1 to N do if A[j] < A[i] then
           begin
                t := A[i];
                A[i] := A[j];
                A[j] := t;
           end;
      end;
 end;
begin
     repeat
           write('Nhap N: ');
           readln(N);
     until N in [5..10];
     for i := 1 to N do
     begin
          repeat
                write('     A[', i : 2, '] = ');
                readln(A[i]);
          until A[i] in [2..100];
     end;

     writeln('Cac So Nguyen To: ');
     for i := 1 to N do
     begin
          if isPrime(A[i]) then writeln('     ', A[i]);
     end;

     g := A[1];
     for i := 2 to N do g := GCD(g, A[i]);
     writeln('UCLN = ', g);

     S := 0;
     for i := 1 to N do S := S + Power(A[i], i);
     writeln('S = ', S);

     Sort;
     writeln('Day Sau Khi Sap Xep: '); write('   ');
     for i := 1 to N do write(A[i], ' ');

     readln
end.
 
S

sonk10

Bài 3 (trên Turbo Pascal không thể chạy được, hay đúng hơn là cái đề này chỉ có thể làm trên Free Pascal, muốn chạy được trên Turbo thì phải xử lý số lớn, khá là phức tạp :) )
Mã:
var
   A: array [1..10] of integer;
   N, i, g: integer;
   S: qword;
function isPrime(k: integer): boolean;
 var
    i, t: integer;
 begin
      t := trunc(sqrt(k));
      for i := 2 to t do
      begin
           if k mod i = 0 then exit(false);
      end;
      isPrime := true;
 end;
function GCD(x, y: integer): integer;
 var
    q: integer;
 begin
      while y <> 0 do
      begin
           q := x mod y;
           x := y;
           y := q;
      end;
      GCD := x;
 end;
function Power(a, n: integer): qword;
 var
    d: qword;
    i: integer;
 begin
      d := 1;
      for i := 1 to n do d := d * a;
      Power := d;
 end;
procedure Sort;
 var
    i, j, t: integer;
 begin
      for i := 1 to N - 1 do
      begin
           for j := i + 1 to N do if A[j] < A[i] then
           begin
                t := A[i];
                A[i] := A[j];
                A[j] := t;
           end;
      end;
 end;
begin
     repeat
           write('Nhap N: ');
           readln(N);
     until N in [5..10];
     for i := 1 to N do
     begin
          repeat
                write('     A[', i : 2, '] = ');
                readln(A[i]);
          until A[i] in [2..100];
     end;

     writeln('Cac So Nguyen To: ');
     for i := 1 to N do
     begin
          if isPrime(A[i]) then writeln('     ', A[i]);
     end;

     g := A[1];
     for i := 2 to N do g := GCD(g, A[i]);
     writeln('UCLN = ', g);

     S := 0;
     for i := 1 to N do S := S + Power(A[i], i);
     writeln('S = ', S);

     Sort;
     writeln('Day Sau Khi Sap Xep: '); write('   ');
     for i := 1 to N do write(A[i], ' ');

     readln
end.
PHP:
Bác lamdetien36 hộ em bài này với
PHP:
Số chung lớn nhất
Cho 2 xâu:
???? X = x1x2..xM. (Với xi là các kí tự số từ ?0? đến ?9?)
???? Y = y1y2..yN.( Với yi là các kí tự số từ ?0? đến ?9?)
(M, N <= 250)
Ta gọi: Z = z1z2..zk là xâu chung của 2 xâu X, Y nếu xâu Z nhận được từ xâu X bằng cách xoá đi một số kí tự và cũng nhận được từ xâu Y bằng cách xoá đi một số kí tự.
Yêu cầu: Tìm một xâu chung của 2 xâu X, Y sao cho xâu nhận được tạo thành một số lớn nhất có thể được.
Dữ liệu vào file: String.inp
Gồm 2 dòng, dòng 1 là xâu X, dòng 2 là xâu Y.
Kết quả ra file: String.out
Gồm 1 dòng duy nhất là số lớn nhất có thể nhận được.
Ví dụ:
String.inp	String.out
19012304
034012	34
 
L

lamdetien36

PHP:
Bác lamdetien36 hộ em bài này với
PHP:
Số chung lớn nhất
Cho 2 xâu:
???? X = x1x2..xM. (Với xi là các kí tự số từ ?0? đến ?9?)
???? Y = y1y2..yN.( Với yi là các kí tự số từ ?0? đến ?9?)
(M, N <= 250)
Ta gọi: Z = z1z2..zk là xâu chung của 2 xâu X, Y nếu xâu Z nhận được từ xâu X bằng cách xoá đi một số kí tự và cũng nhận được từ xâu Y bằng cách xoá đi một số kí tự.
Yêu cầu: Tìm một xâu chung của 2 xâu X, Y sao cho xâu nhận được tạo thành một số lớn nhất có thể được.
Dữ liệu vào file: String.inp
Gồm 2 dòng, dòng 1 là xâu X, dòng 2 là xâu Y.
Kết quả ra file: String.out
Gồm 1 dòng duy nhất là số lớn nhất có thể nhận được.
Ví dụ:
String.inp    String.out
19012304
034012    34
Tui cũng đang bí bài bày, cô BD ra mà thứ 6 này tui phải nộp rồi :(
 
L

lamdetien36

PHP:
Bác lamdetien36 hộ em bài này với
PHP:
Số chung lớn nhất
Cho 2 xâu:
???? X = x1x2..xM. (Với xi là các kí tự số từ ?0? đến ?9?)
???? Y = y1y2..yN.( Với yi là các kí tự số từ ?0? đến ?9?)
(M, N <= 250)
Ta gọi: Z = z1z2..zk là xâu chung của 2 xâu X, Y nếu xâu Z nhận được từ xâu X bằng cách xoá đi một số kí tự và cũng nhận được từ xâu Y bằng cách xoá đi một số kí tự.
Yêu cầu: Tìm một xâu chung của 2 xâu X, Y sao cho xâu nhận được tạo thành một số lớn nhất có thể được.
Dữ liệu vào file: String.inp
Gồm 2 dòng, dòng 1 là xâu X, dòng 2 là xâu Y.
Kết quả ra file: String.out
Gồm 1 dòng duy nhất là số lớn nhất có thể nhận được.
Ví dụ:
String.inp    String.out
19012304
034012    34
Tui biết làm rồi \\:D/

Gọi F[j] là xâu con tạo thành số lớn nhất của 2 xâu X[1 -> i] và Y[1 -> j]
Kết quả là F[M][N]
Cơ sở Quy hoạch động:
F[i, 0] = F[0, j] = ""
Công thức truy hồi:
Nếu X = Y[j] thì F[j] = F[i - 1][j - 1] + X
Nếu X <> Y[j] thì F[j] = Max(F[i - 1][j], F[j - 1])
Chú ý:
Độ dài 2 xâu là 250 ==> cài bằng mảng 2 chiều thông thường sẽ tốn 250^2.255 = 15.10^6 bytes, không nhỏ chút nào, vì vậy bạn nên cài bằng mảng 2 chiều gồm 2 dòng và 250 cột :D
 
M

mythampretty

may mem cho minh hoi ma hoa va giai ma xau la dug ham hay dung thu tuc a.
Ai doc dc thi tra loi gap nha :D
 
Top Bottom