Đến nội dung

Hình ảnh

Tuyển tập bài tập Pascal

pascal

  • Please log in to reply
Chủ đề này có 30 trả lời

#1
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Đây là đề thi tin học trẻ năm nay của tỉnh!

1.Kiểm tra xâu

   Bạn Tí khoe là mình đã làm một đoạn văn toàn "B" tức là mọi từ đều bắt đầu bằng chữ B, các bạn trong lớp muốn kiểm tra xem điều đó có đúng không. Em giúp các bạn bằng cách hãy viết chương trình nhập vào từ bàn phím đoạn Văn của Tí và kiểm tra xem có đúng là toàn "B" hay không.

   Input: "Bup be bang bong" 

             "Buoi chieu mua bay"

             ...........................

   Output:True

               False

              ..........................

2. Điền số vào lưới ô vuông

   Trong giờ giả lao, bạn An thường thấy các bạn rủ nhau chơi:"T.Roa Zero", An chợt nghĩ ra một trò chơi khác nhằm giúp phát triển tư duy cho các bạn. Trò chơi của An được mô tả như sau: An có một tấm bìa trên đó kẻ thành lưới các ô vuông kích thước N*N, đồng thời có rất nhièu các mảnh giấy ô vương nhỏ trên đó ghi các số 0,1,-1. An đó các bạn trong lớp hãy đặt các mảnh giấy ô vuông nhỏ vào các ô trên lưới ô vuông sao cho tổng các số của mọi hình vuông con 2x2 đều bằng 0 và tổng các số của lưới là lớn nhất. Em hãy viết chương trình thực hiện trò chơi bạn An đã đưa ra.

   Input:

           số n(1<=n<=255);

   Output:

           Dòng đầu ghi số nguyên là tổng lớn nhất của lưới;

           N dòng tiếp ghi các giá trị là các số trên các mảnh giấy đã đặt vào, các giá trị cách nhau ít nhất một dấu cách.

   Vd: 

      n=3;

      3

      1  0  1

      0 -1  0

      1  0  1

3. Che mắt mèo

   Trên bàn cờ ô vuông N*N tại mỗi ô vuông có thể xếp hoặc một con mèo, hoặc một quân cờ. Hai con mèo trên bàn cờ sẽ nhìn thấy nhau nếu trên đường thẳng nối chúng theo hàng ngang, hàng dọc hay đường chéo không có quân cờ nào cả.

   Hãy tìm cách xếp mèo và quân cờ như trên sao cho số mèo lớn nhất mà không có con mèo nào nhìn thấy nhau?

   Input:

      nhập vào n(1<=n<=1000);

   Output:

      N dòng đầu, trên mỗi dòng ghi vị trí xếp mèo hay cờ( Nếu là mèo thì ghi M, còn nếu là cờ thì ghi O), các giá trị cách nhau ít nhất một dấu cách.

      Dòng tiếp theo, ghi ra số nguyên dương  là số mèo lớn nhất xếp được trên bàn cờ

   Vd:

     n=3;

     M O M

     O O O

     M O M

     4

 



#2
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3921 Bài viết

Em code lại cái này bằng Pascal coi :)

File gửi kèm  DoanSo.rar   7K   669 Số lần tải


#3
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Em code lại cái này bằng Pascal coi :)

Hihi,đợi ngày mai a ơi, em sắp ngủ rồi! Nhưng bài này thấy thú vị lắm,đêm nằm mơ thuật toán đã :icon6:



#4
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3921 Bài viết

Bài toán:

Lập chương trình (BP Pascal) hiển thị chính giữa màn hình 1 số tự nhiên $x$. Cứ sau khoảng 0,5 giây $x$ sẽ tự thay đổi một cách ngẫu nhiên trong khoảng từ 0 đến 9. Yêu cầu: Trong quá trình chạy chương trình: Nếu từ bàn phím ấn các phím $\uparrow, \downarrow, \rightarrow, \leftarrow$ thì $x$ di chuyển vị trí hiển thị lên, xuống, phải, trái một đơn vị hiển thị.(Trong phạm vi màn hình $24\times 79$). Nếu ấn phím Esc thì kết thúc chương trình.

 

Giống như thế này :D

File gửi kèm  CHAYCHU.rar   3.79K   554 Số lần tải



#5
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Bài toán:

Lập chương trình (BP Pascal) hiển thị chính giữa màn hình 1 số tự nhiên $x$. Cứ sau khoảng 0,5 giây $x$ sẽ tự thay đổi một cách ngẫu nhiên trong khoảng từ 0 đến 9. Yêu cầu: Trong quá trình chạy chương trình: Nếu từ bàn phím ấn các phím $\uparrow, \downarrow, \rightarrow, \leftarrow$ thì $x$ di chuyển vị trí hiển thị lên, xuống, phải, trái một đơn vị hiển thị.(Trong phạm vi màn hình $24\times 79$). Nếu ấn phím Esc thì kết thúc chương trình.

 

Giống như thế này :D

attachicon.gifCHAYCHU.rar

Anh(chú) là thầy ư!!!, ra mấy bài khó quá, em chưa nghĩ ra nữa! :luoi:



#6
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Bài toán:

Lập chương trình (BP Pascal) hiển thị chính giữa màn hình 1 số tự nhiên $x$. Cứ sau khoảng 0,5 giây $x$ sẽ tự thay đổi một cách ngẫu nhiên trong khoảng từ 0 đến 9. Yêu cầu: Trong quá trình chạy chương trình: Nếu từ bàn phím ấn các phím $\uparrow, \downarrow, \rightarrow, \leftarrow$ thì $x$ di chuyển vị trí hiển thị lên, xuống, phải, trái một đơn vị hiển thị.(Trong phạm vi màn hình $24\times 79$). Nếu ấn phím Esc thì kết thúc chương trình.

 

Giống như thế này :D

attachicon.gifCHAYCHU.rar

Em chưa biết làm kiểu control, thầy chỉ e đi!



#7
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3921 Bài viết

Bài toán:

Lập chương trình (BP Pascal) hiển thị chính giữa màn hình 1 số tự nhiên $x$. Cứ sau khoảng 0,5 giây $x$ sẽ tự thay đổi một cách ngẫu nhiên trong khoảng từ 0 đến 9. Yêu cầu: Trong quá trình chạy chương trình: Nếu từ bàn phím ấn các phím $\uparrow, \downarrow, \rightarrow, \leftarrow$ thì $x$ di chuyển vị trí hiển thị lên, xuống, phải, trái một đơn vị hiển thị.(Trong phạm vi màn hình $24\times 79$). Nếu ấn phím Esc thì kết thúc chương trình.

 

Giống như thế này :D

attachicon.gifCHAYCHU.rar

unit crt của Borland Pascal dùng để kiểm soát màn hình, âm thanh, bàn phím,... Có thể dùng một số lệnh thông dụng như

clrscr; {clear screen - Lệnh xóa màn hình}

clreol; {clear end of line - Xóa từ vị trí con trỏ đến hết dòng}

gotoxy(x,y); di chuyển con trỏ đến tọa độ (x,y) của màn hình

textcolor(tên màu); {Đặt màu chữ, màu= White, Black, Red, Green, Blue, Gray, LightRed, ...}

backgroundcolor(tên màu); {Đặt màu nền}

delay(##); {## Tạo độ trễ khi chạy chương trình đơn vị xấp xỉ 0,1 giây}

Tạo trường ngẫu nhiên bằng lệnh Randomize;

hàm ngẫu nhiên random(n); Cho giá trị ngẫu nhiên trong đoạn từ $0$ đến $n-1$

Hàm Keypressed; {Có giá trị logic (kiểu boolean) dùng để phát hiện có phím được ấn}

Hàm Readkey; Đọc ra ký tự được bấm

v.v..

 

Ví dụ để xuất ra từ "Center" chính giữa màn hình (Kích thước mặc định là 80 cột và 25 dòng)

dùng lệnh: gotoxy(38,12); Write('Center');

 

Ngoài ra em đã học qua Procedure hay Function chưa?



#8
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3921 Bài viết

Để thuận tiện cho việc đọc phím, em tạo thêm unit key sau:

Unit Key;
Interface
const
  LeftKey = -75;
  RightKey = -77;
  UpKey = -72;
  DnKey = -80;
  InsKey = -82;
  DelKey = -83;
  HomeKey = -71;
  EndKey = -79;
  PgUpKey = -73;
  PgDnKey = -81;
  F1Key = -59;
  F2Key = -60;
  F3Key = -61;
  F4Key = -62;
  F5Key = -63;
  F6Key = -64;
  F7Key = -65;
  F8Key = -66;
  F9Key = -67;
  F10Key = -68;
  EnterKey = 13;
  BackKey = 8;
  SpaceKey = 32;
  EscKey = 27;
function GetKey:integer;

Implementation
uses Crt;
function GetKey:integer;
  var k:integer;
begin
  k:=Ord(ReadKey);
  if k=0 then k:=-Ord(ReadKey);
  GetKey:=k;
end;
End.

Soạn đoạn code trên, đặt tên file là Key.pas. Xong rồi dịch ra được file Key.tpu
Unit này sẽ cung cấp cho em hàm GetKey; Hàm này đọc giá trị các phím từ bàn phím ra một số nguyên, tương ứng với bảng hằng số ở trên.
 
Ví dụ:

repeat
if keypressed then {nếu có phím được ấn thì ...}
   begin
        ch:=Getkey; {Lấy giá trị phím bấm vào biến ch}
        if ch=Upkey then (hành động 1) 
        {Nếu giá trị là phím mũi tên lên, (hoặc dùng if ch=-72 then nếu em nhớ giá trị của phím mũi tên lên)}
        if ch=Esckey then exit; {Nếu phím được bấm là Esc thì thoát khỏi vòng lặp repeat}
   end;
until false;

Khi dùng unit key em cần phải khai báo uses key; ở đầu chương trình.



#9
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

tks, thầy ,em thử làm xem đã!



#10
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Để thuận tiện cho việc đọc phím, em tạo thêm unit key sau:

Unit Key;
Interface
const
  LeftKey = -75;
  RightKey = -77;
  UpKey = -72;
  DnKey = -80;
  InsKey = -82;
  DelKey = -83;
  HomeKey = -71;
  EndKey = -79;
  PgUpKey = -73;
  PgDnKey = -81;
  F1Key = -59;
  F2Key = -60;
  F3Key = -61;
  F4Key = -62;
  F5Key = -63;
  F6Key = -64;
  F7Key = -65;
  F8Key = -66;
  F9Key = -67;
  F10Key = -68;
  EnterKey = 13;
  BackKey = 8;
  SpaceKey = 32;
  EscKey = 27;
function GetKey:integer;

Implementation
uses Crt;
function GetKey:integer;
  var k:integer;
begin
  k:=Ord(ReadKey);
  if k=0 then k:=-Ord(ReadKey);
  GetKey:=k;
end;
End.

Soạn đoạn code trên, đặt tên file là Key.pas. Xong rồi dịch ra được file Key.tpu
Unit này sẽ cung cấp cho em hàm GetKey; Hàm này đọc giá trị các phím từ bàn phím ra một số nguyên, tương ứng với bảng hằng số ở trên.
 
Ví dụ:

repeat
if keypressed then {nếu có phím được ấn thì ...}
   begin
        ch:=Getkey; {Lấy giá trị phím bấm vào biến ch}
        if ch=Upkey then (hành động 1) 
        {Nếu giá trị là phím mũi tên lên, (hoặc dùng if ch=-72 then nếu em nhớ giá trị của phím mũi tên lên)}
        if ch=Esckey then exit; {Nếu phím được bấm là Esc thì thoát khỏi vòng lặp repeat}
   end;
until false;

Khi dùng unit key em cần phải khai báo uses key; ở đầu chương trình.

tại sao e tạo không được unit z? :excl:



#11
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3921 Bài viết
Em dịch bằng phím F9 là tạo được file key.tpu rồi còn gì. Unit không phải để chạy

#12
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Em dịch bằng phím F9 là tạo được file key.tpu rồi còn gì. Unit không phải để chạy

EM mới chuyển qua dùng freepascal ,nhưng nó báo lỗi khi F9!



#13
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Em dịch bằng phím F9 là tạo được file key.tpu rồi còn gì. Unit không phải để chạy

À, được rồi ,tại em lưu sai tên!



#14
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết
 

Bài toán:

Lập chương trình (BP Pascal) hiển thị chính giữa màn hình 1 số tự nhiên $x$. Cứ sau khoảng 0,5 giây $x$ sẽ tự thay đổi một cách ngẫu nhiên trong khoảng từ 0 đến 9. Yêu cầu: Trong quá trình chạy chương trình: Nếu từ bàn phím ấn các phím $\uparrow, \downarrow, \rightarrow, \leftarrow$ thì $x$ di chuyển vị trí hiển thị lên, xuống, phải, trái một đơn vị hiển thị.(Trong phạm vi màn hình $24\times 79$). Nếu ấn phím Esc thì kết thúc chương trình.

 

Giống như thế này :D

attachicon.gifCHAYCHU.rar

 

uses key,crt;
var x,y,a:integer; b:boolean;ch:integer;
        begin
        clrscr;
        x:=40;
        y:=12;
        b:=true;
        repeat
          gotoxy(x,y);
          a:=random(10);
          write(a);
          delay(500);
          if keypressed then
                begin
                ch:=getkey;
                if (ch=-72)and(y>1) then y:=y-1
                else if (ch=-80)and(y<24) then y:=y+1
                else if (ch=-75)and(x>1) then x:=x-1
                else if (ch=-77)and(x<79) then x:=x+1
                else if (ch=27) then b:=false;
                end;
                clrscr;
        until b=false;
        end.
Hihi, thầy xem đúng chưa ạ!


#15
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Em code lại cái này bằng Pascal coi :)

Hướng dẫn xí cho em đi, thấy mù mịt rồi  :lol:



#16
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3921 Bài viết

 

 

uses key,crt;
var x,y,a:integer; b:boolean;ch:integer;
        begin
        clrscr;
        x:=40;
        y:=12;
        b:=true;
        repeat
          gotoxy(x,y);
          a:=random(10);
          write(a);
          delay(500);
          if keypressed then
                begin
                ch:=getkey;
                if (ch=-72)and(y>1) then y:=y-1
                else if (ch=-80)and(y<24) then y:=y+1
                else if (ch=-75)and(x>1) then x:=x-1
                else if (ch=-77)and(x<79) then x:=x+1
                else if (ch=27) then b:=false;
                end;
                clrscr;
        until b=false;
        end.
Hihi, thầy xem đúng chưa ạ!

 

Em làm tốt lắm, 10 điểm!

Tuy nhiên, chương trình của em chạy không mượt bằng file ví dụ trên kia, em biết tại sao không?

Là do cái Delay đó! Phải nói là Delay là cái procedure dở hơi nhất của Pascal. Nó chỉ làm chậm chương trình, nghĩa là khi lệnh Delay được gọi thì chương trình chết dí luôn tại đó cho đến hết thời gian trễ mới thôi! (lúc đó ta không làm gì được)

Thử tưởng tượng em xây dựng một game xếp hình chẳng hạn, khi đối tượng chuẩn bị rơi xuống (đang Delay) thì các lệnh xoay, dịch chuyển, v.v... chưa đến lượt thực hiện, cho đến khi nó rơi xuống rồi mới có tác dụng! Thế thì chơi làm sao được?

 

Sau rất nhiều thời gian mày mò nghiên cứu giải pháp khắc phục, cuối cùng tôi cũng viết được ra cái Unit MTime này

File gửi kèm  MTIME.rar   667bytes   345 Số lần tải

(Em giải nén ra và copy MTime.tpu vào thư mục BIN của Pascal, code nguồn của MTime tôi không thể share được!)

Với unit MTime, em được cung cấp các lệnh sau:

TimeStart; {Dùng để bắt đầu ghi thời gian}

TimeCurrent là một giá trị kiểu longint dùng để đo quãng thời gian chạy chương trình kể từ khi lệnh TimeStart; được gọi

InTime(x:longint); Là một giá trị logic kiểu boolean trong đó x tương đương với 1/10 giây.

InTime(x); được sử dụng sau khi gọi TimeStart; với ý nghĩa là Trong khoảng thời gian x thì InTime(x) có giá trị true, ngoài khoảng thời gian đó thì InTime(x) có giá trị false

Giá trị logic này rất hay ở chỗ, khi nó đang có hiệu lực thì ta có thể thực hiện bất cứ lệnh gì cho đến khi nó false thì thôi! Cái này Delay không làm được!

 

Ví dụ:

uses Mtime, crt, key;
var ch:integer;
begin
  clrscr;
  TimeStart;
  While InTime(300) do
       begin
       gotoxy(1,10);
       Write('Chuong trinh se ket thuc sau 30 giay nua, an Esc de ket thuc  ', (TimeCurrent div 10):3);
       if keypressed then ch:=getkey;
       if ch=27 then exit;
       end;
 end.


#17
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

 

Em làm tốt lắm, 10 điểm!

Tuy nhiên, chương trình của em chạy không mượt bằng file ví dụ trên kia, em biết tại sao không?

Là do cái Delay đó! Phải nói là Delay là cái procedure dở hơi nhất của Pascal. Nó chỉ làm chậm chương trình, nghĩa là khi lệnh Delay được gọi thì chương trình chết dí luôn tại đó cho đến hết thời gian trễ mới thôi! (lúc đó ta không làm gì được)

Thử tưởng tượng em xây dựng một game xếp hình chẳng hạn, khi đối tượng chuẩn bị rơi xuống (đang Delay) thì các lệnh xoay, dịch chuyển, v.v... chưa đến lượt thực hiện, cho đến khi nó rơi xuống rồi mới có tác dụng! Thế thì chơi làm sao được?

 

Sau rất nhiều thời gian mày mò nghiên cứu giải pháp khắc phục, cuối cùng tôi cũng viết được ra cái Unit MTime này

attachicon.gifMTIME.rar

(Em giải nén ra và copy MTime.tpu vào thư mục BIN của Pascal, code nguồn của MTime tôi không thể share được!)

Với unit MTime, em được cung cấp các lệnh sau:

TimeStart; {Dùng để bắt đầu ghi thời gian}

TimeCurrent là một giá trị kiểu longint dùng để đo quãng thời gian chạy chương trình kể từ khi lệnh TimeStart; được gọi

InTime(x:longint); Là một giá trị logic kiểu boolean trong đó x tương đương với 1/10 giây.

InTime(x); được sử dụng sau khi gọi TimeStart; với ý nghĩa là Trong khoảng thời gian x thì InTime(x) có giá trị true, ngoài khoảng thời gian đó thì InTime(x) có giá trị false

Giá trị logic này rất hay ở chỗ, khi nó đang có hiệu lực thì ta có thể thực hiện bất cứ lệnh gì cho đến khi nó false thì thôi! Cái này Delay không làm được!

 

Ví dụ:

uses Mtime, crt, key;
var ch:integer;
begin
  clrscr;
  TimeStart;
  While InTime(300) do
       begin
       gotoxy(1,10);
       Write('Chuong trinh se ket thuc sau 30 giay nua, an Esc de ket thuc  ', (TimeCurrent div 10):3);
       if keypressed then ch:=getkey;
       if ch=27 then exit;
       end;
 end.

 

  uses mtime,crt,key;
  var x,y,a,ch:integer;
  begin
  clrscr;
  x:=40;
  y:=12;
  while intime(500) do
  begin
          gotoxy(x,y);
          a:=random(10);
          write(a);
          if keypressed then
                begin
                ch:=getkey;
                if (ch=-72)and(y>1) then y:=y-1
                else if (ch=-80)and(y<24) then y:=y+1
                else if (ch=-75)and(x>1) then x:=x-1
                else if (ch=-77)and(x<79) then x:=x+1
                else if (ch=27) then exit;
                end;
                clrscr;
 end;
  readln;
  end. 
 nhanh hơn thiệt, hay quá!!


#18
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3921 Bài viết

Hướng dẫn xí cho em đi, thấy mù mịt rồi  :lol:

Em lĩnh hội rất nhanh, phải nói là em rất giỏi đó!

Về chương trình DoanSo ở trên kia, trước hết em thấy phần nào gặp khó khăn? Người chơi? Hay thuật toán cho Computer?

Dù là người chơi hay computer chơi thì khó khăn nhất đó là phân tích số, so sánh đáp án để TÍNH ĐIỂM. Em tiếp tục suy nghĩ xem làm thế nào để tính điểm đã nhé!



#19
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

cái phân tích khó quá!


Bài viết đã được chỉnh sửa nội dung bởi nghethuat102: 23-07-2014 - 12:21


#20
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Em lĩnh hội rất nhanh, phải nói là em rất giỏi đó!

Về chương trình DoanSo ở trên kia, trước hết em thấy phần nào gặp khó khăn? Người chơi? Hay thuật toán cho Computer?

Dù là người chơi hay computer chơi thì khó khăn nhất đó là phân tích số, so sánh đáp án để TÍNH ĐIỂM. Em tiếp tục suy nghĩ xem làm thế nào để tính điểm đã nhé!

Chỉ em cách làm số 4 chữ số ngẫu nhiên đi thầy?!!







Được gắn nhãn với một hoặc nhiều trong số những từ khóa sau: pascal

1 người đang xem chủ đề

0 thành viên, 1 khách, 0 thành viên ẩn danh