//
Tài liệu chuyên Tin 10 – Chương II

A.Các khái niệm


I / Giới thiệu về ngôn ngữ PASCAL


PASCAL là một trong những ngôn ngữ lập trình cấp cao được giáo sư Niklaus Wirth ở trường Đại học Zurich ( Thuỵ sĩ ) thiết kế và công bố vào năm 1971 . ( Bản tóm tắt chỉ có 29 trang ! ) Sau được sửa đổi trong năm 1972 và ngày càng đựơc chuẩn hoá , đến nay trở thành ngôn ngữ phổ cập trong dạy lập trình cũng như được ứng dụng rộng rãi trên các máy vi tính .

Ngôn ngữ Pascal nhanh chóng có ảnh hưởng sâu rộng và chiếm được cảm tình của những người lập trình vì nhiều nguyên nhân ; trong đó có nguyên nhân đáng kể là tính cấu trúc chặt chẽ và khoa học . Tính cấu trúc của ngôn ngữ này thể hiện trên 3 mặt :

1) Tổ chức dữ liệu có tính cấu trúc .
2) Xây dựng được đầy đủ các cấu trúc điều khiển để thực hiện giải thuật
3) Tạo cho chương trình khả năng cấu trúc .

Vì vậy khi lập trình , cần cố gắng khai thác hết sức mạnh của ngôn ngữ này về phương diện cấu trúc , nhằm đạt tới các bài giải toán có hiệu suất cao.


II / Những khái niệm cần thiết


1 ) Các Kí tự

Các kí tự trong ngôn ngữ Pascal gồm :
+ 26 chữ cái la tinh hoa : A, B,… Z ( mã số từ 65 tới 90 trong bảng mã ASC I I )
+ 26 chữ cái la tinh thường a,b… z ( mã số 97 –> 122 )
+ Kí tự gạch nối : _ ( mã số 95 )
+ 10 kí tự chữ số : 0,1,2,…,9 (mã số 48 –> 57 )

+ Cộng ‘+’ , trừ ‘- ‘ , nhân ‘*’ , chia ‘ / ’, bằng nhau ‘ = ‘ , lớn hơn ‘ > ‘ , nhỏ hơn ’ < ‘
dấu mở ngoặc ‘(‘ hoặc dấu đóng ngoặc ‘)’
+ Các kí tự đặc biệt khác :
‘.’ , ‘;’ , ‘:’ , ‘[‘ , ‘ ]’ , ‘{‘ , ‘}’ , ‘? ‘ , ‘! ‘ ,‘ \ ‘ , ‘&’ , ‘%’ , ‘#’ , ‘$’
+ Kí tự dấu cách (còn gọi là dấu trống – có mã số 32 ) Tạo 1 khoảng cách bằng độ rộng chứa 1 kí tự , dấu cách dùng để phân cách 2 từ .

2) Các từ khoá

Là các từ riêng của Pascan đã được xác định ngữ nghĩa trước , người lập trình phải tuân theo ngữ nghĩa này , không được dùng từ khoá vào các định nghĩa khác

Danh sách các từ khoá :
Program , Begin , End, Procedure , Function , Unit , Implementation , Interface …
Uses ,Const, Type , Var , Label , Array , String ,Record , Set of … , File of …
If … then … Else … , Case … of ,
For … to … do , For … downto … do , While … do , Repeat … until
With , goto , Exit, Halt ,Forward ,And , or, xor ,not, in , div , mod , SHL ,SHR

3 ) Tên

Là dãy các kí tự chữ cái hoặc chữ số và dấu gạch nối dùng để xác định các đại lượng khác nhau trong chương trình .
Qui định đặt tên :
+ Chiều dài tối đa 127 kí tự .
+ Không được đặt kí tự chữ số làm kí tự đầu của tên .
+ Không được đặt tên trùng với từ khoá .
Nên đặt tên có tính gợi nhớ để dễ theo dõi và hiệu chỉnh chương trình , không nên đặt tên quá dài và trùng với các tên chuẩn nêu dươí đây

4) Tên chuẩn

Tên chuẩn là những tên được Pascal đặt trước và định nghĩa sẵn .
Danh sách các tên chuẩn
Boolean , Char , Integer , Real , Byte , Text …
False , True , MaxInt ,
Abs , Chr , Cos , Sin , Arctan , Eof , Eoln
Exp , Ln , Odd , Ord ,
Round , Trunc , Sqr , Sqrt , Pred , Succ,
Dispose , New , Close,Get , Put , Read , Readln , Write , Writeln , Reset , ReWrite


B-Các kiểu dữ liệu đơn giản và phép toán tương ứng


I / Kiểu số nguyên


Từ khoá Phạm vi Số byte nhớ
Integer -32768 .. 32767 2 Byte
Byte 0 .. 255 1 Byte
Word 0 .. 65535 2 Byte
ShortInt -128 .. 127 1 Byte
LongInt -2147483648.. 2147483647 4 Byte

Những qui định về kiểu số nguyên :
+ Không gán trị vượt quá phạm vi của kiểu .
+ Các chữ số phải viết liền nhau
+ Số âm : phải đặt dấu trừ ngay sát chữ số đầu tiên của số
+ Không được sử dụng dấu chấm thập phân .
+ Để viết số dưới dạng cơ số 16 ( dạng Hexa ) đặt dấu $ sát chữ số đầu .
Các phép toán ( operater ) :

a) Phép toán số học

Cộng : + Cho kết quả là số nguyên
Trừ : – Cho kết quả là số nguyên
Nhân : * Cho kết quả là số nguyên
Chia : / Cho kết quả là số thực
Div : Cho thương nguyên của phép chia
Mod : Dư nguyên của phép chia .

b) Phép toán quan hệ

= ( bằng )
> ( lớn hơn )
< ( nhỏ hơn ) >= ( Không nhỏ thua )
<= ( Không lớn hơn )
<> ( Khác )
Kết quả của các phép toán quan hệ là Kiểu Boolean ( Có 2 giá trị : True, False)


II / Kiểu thực


Kiểu Phạm vi Số chữ số có nghĩa Số Byte
Single 1.5E-45 .. 3.4E+38 7-8 4
Real 2.9E-39 .. 1.7E+38 11-12 6
Double 5.0E-324 .. 1.7E+308 15-16 8
Extended 3.4E-4932 .. 1.1E+4932 19-20 10
Comp -9.2E+18 .. 9.2E+18 19-20 8

+ Trong 4 kiểu trên , phạm vi được hiểu như là trị tuyệt đối của phạm vi .
+ Cách viết số ở cột phạm vi là cách viết chữ số kiểu động ,
1.5E-45 = 1.5 * 10 -45 ; 3.4E+38 = 3.4 * 10 38
+ Kiểu số thực với mode thường dùng là Real . Còn các kiểu còn lại phải dùng mode 8087 ( Đầu chương trình phải có hưóng biên dịch {$N+}. ) Các phép toán trên kiểu số thực : Cũng có các phép toán như kiểu nguyên ; nhưng không có phép DIV và MOD và kết quả của mọi phép toán trên Real là Real ; kết quả của mọi phép toán trên Extended là Extended


III / Kiểu Boolean


Kiểu Boolean chỉ có 2 giá trị : True và False . ( trong đó False < True ) Một giá trị kiểu Boolean chiếm 1 Byte bộ nhớ . Các phép toán lôgic trên kiểu Boolean : Phép AND True False True True True False True False Phép OR True False True True False False False False Phép XOR True False True False True False True False Phép NOT X = True –> Not ( x ) = False
X = False –> Not ( x) = True


IV / Kiểu Kí tự : ( Kiểu Char )


Một kí tự chiếm 1 byte bộ nhớ .Mỗi kí tự tương ứng với 1 mã số , ghi trong bảng mã ASC I I (American Standar Code Information Interchange ). Có tất cả 256 kí tự đánh số từ Mã số 0 tới mã số 255 . Vậy kiểu kí tự có 256 giá trị . Các kí tự từ 0 đến 31 là các kí tự điều khiển , không in ra được , chúng dùng để điều khiển quá trình vào , ra các thiết bị ngoại vi
Thí dụ : Kí tự có mã số 13 báo hiệu hết dòng trên màn hình và máy in
Kí tự có mã số 10 chuyển con trỏ màn hình xuống đầu dòng dưới , và chuyển đầu kim in xuống đầu dòng in tiếp theo .
Kí tự có mã số 7 làm phát chuông kêu . ..
Chú ý :
+ Để biểu diễn kí tự , phải đặt kí tự trong dấu nháy . Thí dụ : ‘a’ ‘A’ ‘]’ … hoặc dùng hàm Char thí dụ : Char(97) , Char(65) , Char(93) … hoặc dùng kí hiệu #97 , #65 , #93 …

Sau đây là 1 chương trình nhỏ hiện các kí tự và mã số của chúng lên màn hình :

Uses crt;
     Var i : Byte;
BEGIN
     Clrscr;
     For i:=33 to 255 do Write(i:4,Char(i):2,#32#32);
     Readln;
END.

V / Kiểu Xâu kí tự : ( Kiểu String )


Xâu kí tự là dãy các kí tự đặt giữa 2 dấu nháy đơn . Số kí tự của xâu không quá 255 .
Các phép toán trên xâu kí tự sẽ đề cập ở phần sau .Có thể tạo ra kiểu xâu kí tự có độ dài n ( 1<=n<255) bằng khai báo

Type Tên_Xâu = String[n];
Var Tên_biến : Tên_xâu;


C – Dữ liệu kiểu mảng


Khai báo mảng 1 chiều :
+ Mảng có N phần tử , chỉ số của các phần tử là số nguyên từ 1 đến N
Type Tên_kiểu = Array[1..N] of <Kiểu_phần _tử >;
Var Tên_biến : Tên_kiểu ;
+ Mảng có N phần tử , chỉ số của các phần tử là số nguyên từ -1 đến N-2
Type Tên_kiểu = Array[-1..N-2] of <Kiểu_phần _tử >;
+ Mảng có 10 phần tử , chỉ số của các phần tử là kí tự từ A  đến K
Type Tên_kiểu = Array[ A  .. K] of <Kiểu_phần _tử >;
Khai báo mảng 2 chiều :
+ Mảng có N xN phần tử , chỉ số của các phần tử là cặp số nguyên từ (i,j)
Type Tên_kiểu = Array[1..N,1..N ] of <Kiểu_phần _tử >;
Khai báo mảng 3 chiều :
+ Mảng có N xN xN phần tử , chỉ số của các phần tử là bộ 3 số nguyên từ (i,j,k)
Type Tên_kiểu = Array[1..N,1..N ,1..N ] of <Kiểu_phần _tử >;

Chú ý :

Mỗi phần tử thứ i của mảng 1 chiều ( mảng A với chỉ số nguyên chẳng hạn ) được tương ứng với 1 ô nhớ trong máy Muốn nạp hoặc lấy giá trị ô nhớ đó , phải thông qua phần tử thứ i của mảng tương ứng với ô nhớ ấy kí hiệu là A[i] ,
Mỗi phần tử có chỉ số (i,j) của mảng 2 chiều ( mảng A với chỉ số là cặp số nguyên chẳng hạn được kí hiệu A[i,j] trong đó i là chỉ số hàng ,j là chỉ số cột

Như vậy việc duyệt các giá trị của các phần tử của mảng rất dễ dàng . Song cần lưu ý biến chỉ số của mảng không được vượt ra ngoài phạm vi đã khai báo . Thí dụ Mảng A khai báo có 10 phần tử với chỉ số từ -5 đến 4 thì kí hiệu A[5] là phạm lỗi .
Nhược điểm của kiểu mảng là tốn bộ nhớ do khai báo ban đầu phải lường trước mọi giá trị của dãy nào đó đều được đưa vào mảng , nên kích thước mảng sẽ lớn , nhưng thực tế có thể không dùng hết các phần tử của mảng đã khai báo.


D – Một số hàm thông dụng


1) ABS(x) : giá trị tuyệt đối của x có kiểu như x
2) SQR(x) : Bình phương của x có kiểu như x
3) SQRT(x) : Căn bậc hai của x có kiểu Real
4) Sin(x) : sin của x có kiểu Real
5) Cos(x) : côsin của x có kiểu Real
6) Arctan(x) : a rctg của x có kiểu Real
7) Ln(x) : Loga cơ số e của x có kiểu Real
8) Exp(x) : cho e x
9) Random(n) : Cho một số nguyên ngẫu nhiên từ 0 tới n-1 ( n nguyên )
10) Odd (n) : cho giá trị True nếu n lẻ ; cho giá trị False nếu n chẵn
11) Round(x) : là số nguyên làm tròn của số thực x
12) Trunc(x) : là số nguyên ,bằng phần nguyên của số thực x
13) Int(x) : là số thực , bằng phần nguyên của số thực x
14) Frac(x) : là số thực , bằng phần thập phân của số thực x
Với các kiểu dữ liệu vô hướng đếm được ( Kiểu số nguyên :Integer,Byte, LongInt, ShortInt, Word, Kiểu Lôgic : Boolean, Kiểu kí tự : Char ) có quan hệ thứ tự nên còn được xây dựng các hàm sau đây : ORD , PRED , SUCC
Thí dụ :
ORD(10) = 10 , PRED(10) = 9 , SUCC(10) = 11
ORD(‘B’) = 66 , PRED(‘B’) =‘A’ , SUCC(‘B’) =‘C’
ORD(False) = 0 , ORD(True) = 1 ,
ORD(3*4=12) = 1 , ORD(3*4=11) = 0 ,
PRED(True) = False , SUCC(False) = True
15) INC(x,k) : Tăng số nguyên x lên thêm k đơn vị ( x := x+k )
16) DEC(x,k) : Giảm số nguyên x đi k đơn vị ( x := x-k )


E – Cấu trúc một chương trình dạng đơn giản


Một chương trình TURBO PASCAL có các thành phần sau :

(* Phần khai báo chương trình *)
Program Tên_chương_trình;
Uses Tên _các_ Unit_ cần _thiết ;
Label Tên_nhãn;
Const Tên_hằng = Giá_trị_của_hằng;
Type Tên_kiểu : Kiểu_hằng ;
Var Tên_biến : Kiểu_biến;

(* Phần thân chương trình *)
Procedure Tên_thủ_tục_1(Tên_tham_trị ; Var Tên_tham_biến : Kiểu_tham_biến);
Uses Tên _các_ Unit_ cần _thiết ;
Label Tên_nhãn;
Const Tên_hằng = Giá_trị_của_hằng;
Type Tên_kiểu : Kiểu_hằng ;
Var Tên_biến : Kiểu_biến;
Begin
(* Phần thân của thủ tục 1 gồm các lệnh nào đó *)
End ;
......

Procedure Tên_thủ_tục_n (Tên_tham_trị ; Var Tên_tham_biến : Kiểu_tham_biến);
Uses Tên _các_ Unit_ cần _thiết ;
Label Tên_nhãn;
Const Tên_hằng = Giá_trị_của_hằng;
Type Tên_kiểu : Kiểu_hằng ;
Var Tên_biến : Kiểu_biến;
Begin
(* Phần thân của thủ tục n gồm các lệnh nào đó *)
End ;
Function Tên_Hàm(Tên_tham_trị; Var Tên_tham_biến : Kiểu_tham_biến):Kiểu_giá_trị_hàm ;
Uses Tên _các_ Unit_ cần _thiết ;
Label Tên_nhãn;
Const Tên_hằng = Giá_trị_của_hằng;
Type Tên_kiểu : Kiểu_hằng ;
Var Tên_biến : Kiểu_biến;
Begin
(* Phần thân của hàm gồm các lệnh nào đó *)
End ;

BEGIN
   (* Thân của chương trình chính gồm các lệnh , trong đó có cả lệnh gọi thủ tục và hàm *)
END.

Chú ý : Khi khai báo hằng hoặc biến , máy sẽ cấp phát vùng nhớ cho chúng . Giá trị trong vùng nhớ này chính là giá trị của hằng và biến tương ứng .
Thí dụ
Var x : Integer;
ch : Char;
S : String[30];
y : Real;
Nam : Boolean;
thì x được cấp phát vùng nhớ 2 Byte , Ch được cấp phát vùng nhớ 1 Byte , S được cấp phát vùng nhớ 31 Byte , y được cấp phát vùng nhớ 4 Byte ., nam được cấp phát vùng nhớ 1 Byte …


F -Bước đầu sử dụng phần mềm TURBO PASCAL 7.0


TURBO PASCAL là phần mềm nhằm soạn thảo, sửa chữa , biên dịch và chạy chương trình .
Để khởi động TURBO PASCAL 7.0 cần có tối thiểu 2 File
+ Turbo.EXE : 403.655 Kb
+ Turbo.TPL ( Chứa các Unit chuẩn ):48.432 Kb
Tại dấu mời của DOS ( thường là tại thư mục chứa 2 File trên ) gõ TURBO và ấn ENTER thì TURBO được nạp vào bộ nhớ . Trên màn hình xuất hiện Local Menu như sau :

File Edit Search Run Compile Debug Tools Options Window Help


F1 Help F2 Save F3 Open Alt+F9 Compile F9 Make Alt+F10 Local menu

File , Edit, Search , Run , Compile , Debug , Tools , Options , Window , Help gọi là các mục chọn của Local Menu . Đó là các nhóm chức năng của TURBO . Để chọn một chức năng nằm trong mục chọn , ấn và giữ phím ALT đồng thời gõ kí tự chữ trắng trong tên mục chọn
Thí dụ :
ấn và giữ phím Alt đồng thời gõ F để hiện ra menu dọc của mục chọn File như hình sau:

File Edit Search Run Compile Debug Tools Options Window Help
New
Open... F3
Save F2
Save as...
Save all
------------------
Change dir...
Print
Printer setup...
DOS shell
Exit Alt+X

F1 Help  Create a new file in a new Edit window

Các dòng New, Open,Save,Save as , Save all , Change dir , Print, Print Seup ,DOS shell , Exit được gọi là các mục chọn dọc trong Mục chọn File của Local Menu . Đó là từngchức năng riêng của nhóm này .
Để tìm hiểu kỹ càng về từng nhiệm vụ của các mục chọn dọc nằm trong các Menu dọc , tương ứng với các mục chọn của Local Menu , hãy tìm qua sách khác giới thiệu về Môi trường TURBO .
ở đây chúng ta bước đầu chỉ tìm hiểu một số chức năng chính :
ALT_F +NEW Mở một trang văn bản mới để soạn một chương trình mới .
F3 (ALT_F + OPEN) Mở 1 File ( File này đã được ghi vào đĩa bây giờ muốn mở ra để xem lại hoặc sửa đổi , nếu File này chưa có trên đĩa thì phải gõ tên File vào dòng sáng hiện trên màn hình sau đó soạn chương trình mới ).
F2 (ALT_F +SAVE) Lưu chương trình vào File đang mở . Nếu chương trình này là chương trình mới và chưa được đặt tên thì màn hình hiện lên một khung yêu cầu đặt tên File cho chương trình mới này .
ALT_F +SAVE AS Lưu chương trình vào File với tên khác ( phải nhập tên mới vào )
ALT_X (ALT_F +EXIT) Để thoát khỏi soạn thảo chương trình , kết thúc TURBO trở về môi trường cũ .
F9 Để biên dịch chương trình
CTRL_F9 Để chạy toàn bộ chương trình
F7 Lần theo dõi từng dòng lệnh
F8 Lần theo dõi từng dòng lệnh trong chương trình chính .
CTRL_F7 Theo dõi giá trị của các biến khi cho chạy F7 hoặc F8

Trong khi soạn và thử nghiệm và chạy chương trình , có thể dùng nhiều loại cửa số khác nhau trên màn hình . Cửa sổ nào có con trỏ được gọi là cửa sổ hiện hành .
F6 Để chuyển từ cửa sổ này sang cửa sổ kia .
F5 Để phóng to hoặc thu nhỏ cửa sổ hiện hành .
CTRL_F5 Sau đó dùng phím mũi tên (     ) di chuyển cửa sổ hiện hành đến vị trí thích hợp , hoặc dùng SHIFT + phím mũi tên (     ) để thay đổi kích thước cửa sổ , cuối cùng ENTER
Alt_F3 Để đóng cửa sổ soạn thảo hiện hành ( có con trỏ ) .

Trong khi soạn thảo chương trình thường dùng các thao tác sau :

+ Phím ENTER (  ) Đưa con trỏ về đầu dòng tiếp theo
+ Phím mũi tên (     ) Di chuyển con trỏ
+ HOME Đưa con trỏ về đầu dòng
+ END Đưa con trỏ về cuối dòng
+ CTRL_HOME Đưa con trỏ về đầu trang
+ CTRL_ END Đưa con trỏ về cuối trang

+ CTRL_PAGE UP Đi lên 1 trang màn hình văn bản
+ CTRL_ PAGE DOWN Đi xuống 1 trang màn hình văn bản

+ Phím DEL Xoá kí tự tại vị trí con trỏ
+ Phím BACK SPACE Xoá kí tự ngay bên trái vị trí con trỏ
+ Phím SPACE BAR Tạo 1 kí tự trống
+ SHIFT_Phím mũi tên(     ) Đánh dấu khối
+CTRL_INSERT Chép khối đánh dấu vào CLIPBOARD
+SHIFT_INSERT Chép CLIPBOARD vào văn bản hiện thời (tại vị trí con trỏ)
+CTRL_C Chép khối đánh dấu vào văn bản hiện thời (tại vị trí con trỏ)
+CTRL_V Chuyển khối đánh dấu vào vị trí mới trong văn bản hiện thời
+CTRL_DEL Xoá đoạn văn bản đã đánh dấu khối
+CTRL_K + H Xoá hộp sáng trên đoạn văn bản đã đánh dấu

+CTRL_F1 Hiện màn hình giúp đỡ tương ứng với từ tại vị trí con trỏ
+SHIFT_F1 Hiện bảng giúp đỡ sử dụng các lệnh,thủ tục, hàm, toán tử , …


G – Thủ tục vào ra dữ liệu , thủ tục liên quan màn hình


1 ) WRITE ( danh sách tên biến , danh sách tên hằng ); sẽ lần lượt ghi ra trên dòng màn hình các giá trị tương ứng với các biến và các hằng , bắt đầu ghi từ vị trí hiện thời của con trỏ màn hình .
2 ) WRITELN (danh sách tên biến , danh sách tên hằng ); sẽ lần lượt ghi ra trên dòng màn hình các giá trị tương ứng với các biến và các hằng , bắt đầu ghi từ vị trí hiện thời của con trỏ màn hình . Ghi xong , con trỏ màn hình tự động dời xuống đầu dòng tiếp theo của màn hình .
3) WRITELN; Lệnh chuyển con trỏ xuống đầu dòng dưới .
4) READLN(danh sách tên biến); Nhập từ bàn phím lần lượt các giá trị cho các biến được nêu trong danh sách . Sau khi gõ giá trị của biến cuối cùng thì gõ ENTER .Con trỏ trên màn hình tự động chuyển xuống dòng dưới .
5) READLN; Lệnh dừng chờ cho đến khi gõ ENTER mới thi hành lệnh tiếp theo và con trỏ chuyển xuống đầu dòng dưới .
6) Gotoxy(x1,y1) ; Lệnh di chuyển con trỏ màn hình tới vị trí cột x1, dòng y1 .( Trên màn hình ở chế độ ‘ 25 line ‘ trang màn hình có 25 dòng , 80 cột )
7) Textcolor(n); với n là số nguyên từ 0 tới 15 : Đặt chế độ màu cho chữ viết trên màn hình.
8) TextBackGround(n); Đặt chế độ màu cho màn hình .
9) Clrscr ; Xoá sạch trên trang màn hình

Lưu ý 1 :Khi nhập giá trị cho các biến bằng lệnh Readln(ds biến ), máy chưa thực hiện lệnh tiếp theo của chương trình, chỉ khi gõ ENTER máy nạp giá trị vào các vùng nhớ tương ứng với các biến , sau đó mới thực hiện lệnh tiếp theo .

Lưu ý 2 : Để kiểm tra dữ liệu nhập vào có đúng kiểu đã khai báo không , dùng hàm IoResult ( Kiểu Boolean ) theo dõi với chế độ hướng dẫn biên dịch là {$I-} . Sau khi nhập giá trị cho biến (x chẳng hạn ) nếu giá trị của hàm IoResult = 0 thì giá trị nhập cho x là đúng ; ngược lại nếu IoResult <>0 thì nhập sai .

Thí dụ : Đoạn chương trình nhập giá trị cho biến x nguyên dương là :

Uses Crt;
   Var x : Integer;
Begin
     Repeat
     Write(‘Nhap gia tri x = ‘);
     {$I-} Readln(x); {I$+}
Until (IoResult =0) and ( x>0);
     Readln
End.

Bài tập chương II


1 ) Nhập từ bàn phím giá trị 3 cạnh tam giác . Tính diện tích , chiều cao, trung tuyến, bán kính đường tròn nội tiếp, ngoại tiếp tam giác.

2 ) Nhập từ bàn phím 1 số nguyên dương có 4 chữ số . Hiện trên màn hình các chữ số hàng nghìn, hàng trăm, hàng chục , hàng đơn vị của số nguyên này .

3 ) Nhập từ bàn phím số thực x . Sử dụng không quá 4 phép nhân cùng với 4 phép cộng và trừ , tính giá trị của biểu thức sau :
2×4 – 3×3 + 4×2 – 5x + 6

4 ) Nhập từ bàn phím giá trị 2 biến x và y . Không dùng thêm biến thứ 3 , hãy tráo giá trị 2 biến x và y cho nhau .
5 ) Nhập từ bàn phím 4 số thực . Tìm số lớn nhất và số bé nhất .
6 ) Từ bàn phím nhập các hệ số a, b, c của phương trình tổng quát của đường thẳng a x+by+c=0 và toạ độ 2 điểm A(x1,y1) , B(x2,y2) . Thông báo kết quả điểm A , điểm B có thuộc đường thẳng không ? Trong trường hợp A và B cùng không thuộc đường thẳng , hãy thông báo chúng cùng phía so với đường thẳng hay khác phía nhau ?

7 ) Lập trình so sánh giá trị 2 biểu thức :

y1=(a*b*c) (a+b+c)/ 3 và y2 = aa * bb * cc

8 ) Cho tam giác có 3 cạnh là a,b,c . Lập trình tính các góc A,B,C của tam giác ( theo Radian ) và so sánh
y = (a* A + b * B + c * C)/(a+b+c) với z = Pi / 3

9 ) Cho mạch điện như hình vẽ gồm công tắc A mắc nối tiếp với mạch song song có 2 công tắc B và C sau đó nối tiếp với đèn M.

bai tap ch2-9

Nhập chế độ D (đóng mạch) hoặc T (tắt mạch) của 3 công tắc A,B,C. Hiện kết quả đèn M sáng ay không sáng .

10 ) Sử dụng các thủ tục vào ra dữ liệu nhập từ bàn phím , và thủ tục định vị trí con trỏ màn hình hãy vẽ trên màn hình một tam giác gồm các kí tự ‘*’(dấu sao) giữa 2 dấu sao liên tiếp là 1 kí tự dấu
cách như hình dưới đây ( số dòng là h – nhập từ bàn phím )

*
* *
* * *
* * * *
* * * * *
( h = 5 )

11 ) a – Vẽ 1 bàn cờ quốc tế 8 x8 ô như sau ( Không kể viền ) : Lưu ý : Kí tự Char(219) là
Kí tự Char(32) là kí tự trống

bai tap ch2-11

b – Nhập từ bàn phím toạ độ 2 ô là (x1,y1) và (x2,y2) . Hai ô có cùng màu không ? Giả sử quân hậu đứng ở ô (x1,y1) , nó có khống chế được ô (x2,y2) hay không ? Câu hỏi tương tự cho quân mã .

12 ) Lập trình hiện chữ “ Tin học “ bay từ góc trái màn hình về giữa dòng 14 , chữ “ Tuổi trẻ “ bay từ góc phải màn hình về giữa dòng 14
Dừng giữa màn hình dòng chữ “ Tin học và Tuổi trẻ “

13 ) Nhập từ bàn phím toạ độ 3 điểm A,B,C . Có tồn tại tam giác ABC không ? . Trong trường hợp tồn tại tam giác , hãy tính diện tích tam giác đó .

14 ) Nhập từ bàn phím toạ độ 5 điểm A,B,C,D ,E. Tứ giác ABCD có phải là tứ giác lồi hay không ? Điểm E có thuộc miền trong của tứ giác ABCD hay không ?

15 ) Nhập từ bàn phím số nguyên dương n ( n>= 3) . Nhập toạ độ n đỉnh của một đa giác lồi . Tính diện tích đa giác đó .

16 )Cho tập A gồm N điểm trên mặt phẳng toạ độ . Tìm đa giác lồi có các đỉnh thuộc tập A và bao kín tập điểm A .


Bài kiểm tra


Cho một hình hộp chữ nhật có 2 kích thước đáy là a và b và n bưu phẩm hình chữ nhật có các kích thước là (x1,y1) , (x2,y2) .. (xn,yn). Hỏi có thể cho vào hộp những bưu phẩm nào ( nếu chỉ xếp mặt bưu ảnh song song với mặt phẳng đáy , chiều cao của hộp coi như đủ lớn để xếp mọi bưu ảnh chồng lên nhau nếu có thể xếp chúng vào hộp được ) ?


Bài giải chương II


Bài 1


Uses Crt;
Var a,b,c,p,s ,r1,r2,ha,hb,hc,ma,mb,mc : Real;
Ok : Boolean;
BEGIN
Clrscr;
Writeln(‘nhap 3 so : ‘);
Repeat {$i-}
Write(‘a = ‘); Readln(a);
Write(‘b = ‘); Readln(b);
Write(‘c = ‘); Readln(c);{$i+}
Ok := ( Ioresult = 0 ) and (a+b>c) and(a+c>b) and(b+c>a);
Until OK ;
p := (a+b+c)/2;
s := sqrt(p*(p-a)*(p-b)*(p-c));
ha := 2*S/a ;
hb := 2*S/b ;
hc := 2*S/c ;
ma := sqrt((2*( b*b + c*c ) – a*a) / 4 );
mb := sqrt((2*( a*a + c*c ) – b*b ) / 4 );
mc := sqrt((2*( a*a + b*b ) – c*c ) / 4 );
r1 := S/p ;
R2 := a*b*c/(4*S);
Writeln(‘Dien tich la S = ‘,s:10:2);
Writeln(‘Cac duong cao ha = ‘,ha:10:2,’ hb = ‘,hb:10:2,’ hc = ‘,hc:10:2 );
Writeln(‘Cac trung tuyen ma = ‘,ma:10:2,’ mb = ‘,mb:10:2,’ mc = ‘,mc:10:2 );
Writeln(‘Ban kinh duong tron noi tiep r = ‘,r1:10:2);
Writeln(’Ban kinh duong tron ngoai tiep la R = ‘,R2:10:2 );
Readln
END.


Bài 2


Uses Crt;
Var x,n,t,c,d : Integer;
Ok : Boolean;
Begin
Clrscr;
Repeat
Writeln(‘Nhap so nguyen duong co 4 chu so s = ‘);
{$I-} Readln(x); {$I+}
Ok := (IoResult=0) and (x>0) and (x<10000);
Until Ok;
d := x mod 10;
c := (x div 10) mod 10;
t := (x div 100) mod 10;
n := x div 1000;
Writeln(‘Chu so hang nghin = ‘,n);
Writeln(‘Chu so hang tram = ‘,t);
Writeln(‘Chu so hang chuc = ‘,c);
Writeln(‘Chu so don vi = ‘,d);
Readln;
End.


Bài 3


Uses Crt;
Var y,x : Real;
Begin
Clrscr;
Write(‘Nhap so thuc x = ‘);
Repeat
{$I-} readln(x); {$I+}
Until (Ioresult=0);
y := x*(x*(x*(2*x-3)+4)-5)+6;
Writeln(‘ y = ‘,y:10:2);
Readln
End.


Bài 4


Uses Crt;
Var x,y : Integer;
Begin
Clrscr;
Writeln(‘Nhap gia tri 2 bien ‘);
Repeat
Write(‘x = ‘);
{$I-} Readln(x); {$I+}
Until IoResult = 0;
Repeat
Write(‘y = ‘);
{$I-} Readln(y); {$I+}
Until IoResult = 0;
x := x+y;
y := x-y;
x := x-y;
Writeln(‘gia tri moi cua x = ‘,x);
Writeln(‘gia tri moi cua y = ‘,y);
Readln
End.


Bài 5


Uses Crt;
Var a,b,c,d,max,min : Integer;
Begin
Clrscr;
Writeln(‘Ban nhap 4 so: ‘);
Repeat
{$I-} Write(‘a = ‘); readln(a);
Write(‘b = ‘); readln(b);
Write(‘c = ‘); readln(c);
Write(‘d = ‘); readln(d); {$I+}
Until (Ioresult=0);
If a>b then
Begin
Min := b ;
Max := a;
End
Else
Begin
Min := a;
Max := b;
End;
If c<min then min := c;
If d< min then min := d;
If c>max then max := c;
If d>max then max := d;
Writeln(‘so be nhat la : ‘,min);
Writeln(‘so lon nhat la : ‘,max);
Readln
End.


Bài 6


Uses Crt;
Var f1,f2,a,b,c,x1,x2,y1,y2 : Real;
Ok1,Ok2 : Boolean;
Begin
Clrscr;
Writeln(‘Nhập các hệ số a,b,c của đường thẳng : ‘);
Repeat
{$I-} Readln(a,b,c); {$I+}
Until ( IoResult = 0);
Writeln(‘Nhập toạ độ x1,y1 của điểm A : ‘);
Repeat
{$I-} Readln(x1,y1); {$I+}
Until ( IoResult = 0);
Writeln(‘Nhập toạ độ x2,y2 của điểm B : ‘);
Repeat
{$I-} Readln(x2,y2); {$I+}
Until ( IoResult = 0);
f1 := a*x1+b*y1+c;
f2 := a*x2+b*y2+c;
Ok1 := False;
Ok2 := False;
If abs(f1)<0.0001 then
Begin
Writeln(‘ Điểm A thuộc đường thẳng ‘);
Ok1 := True;
End;
If abs(f2)<0.0001 then
Begin
Writeln(‘ Điểm B thuộc đường thẳng ‘);
Ok2 := True;
End;
If not Ok1 and not Ok2 then
If f1*f2 > 0 then
Writeln(‘Hai điểm A và B cùng phía ‘ ) Else
Writeln(‘Hai điểm A và B khác phía ‘ );
Readln
End.


Bài 7


Uses Crt;
Label Continue;
Var a,b,c,y1,y2 : Real;
BEGIN
Continue:
Clrscr;
Repeat
Write(‘Cho biet gia tri cac so duong A,B,C = ‘);
Readln(a,b,c);
Until (IoResult=0) and (a>0) and (b>0) and (c>0);
Y1:=Exp( ((a+b+c)/3)*(Ln(a)+Ln(b)+Ln(c)) );
Y2:=Exp(a*ln(a))*Exp(b*ln(b))*Exp(c*ln(c));
If (y1>y2) then Write(‘Y1 > Y2’)
Else
If (y1=y2) then Write(‘Y1=Y2’)
Else Write(‘Y1<Y2’);
Writeln;
Write(‘ESC de thoat . Phim bat ki de tiep tuc . . .’);
If readkey<>#27 then goto continue;
END.

Chú ý : Trong bài trên sử dụng công thức : a x = e x.ln (a )


Bài 8


Uses Crt;
Label Continue;
Var a,b,c,
cos,tg,Ga,Gb,Gc,y : Real;
Ok : Boolean;
BEGIN
Continue:
Clrscr;
Write(‘Cho biet tam giac co 3 canh la a,b,c :=’);
Repeat {$i-}
Write(‘a = ‘); Readln(a);
Write(‘b = ‘); Readln(b);
Write(‘c = ‘); Readln(c);{$i+}
Ok := ( Ioresult = 0 ) and (a+b>c) and(a+c>b) and(b+c>a);
Until OK ;
Cos := (Sqr(b)+sqr(c)-sqr(a))/(2*b*c);
If (cos=0) then Ga:=pi/2
Else
Begin
Tg := Sqrt(1/Sqr(cos)-1);
Ga := Arctan(tg);
If cos<0 then Ga:=pi-Ga;
End;
Cos := (Sqr(a)+sqr(b)-sqr(c))/(2*a*b);
If (cos=0) then Gc:=pi/2
Else
Begin
Tg := Sqrt(1/Sqr(cos)-1);
Gc := Arctan(tg);
If cos<0 then Gc:=pi-Gc;
End;
Gb := Pi – Ga – Gc ;
Writeln(‘A:=’,Ga:5:2);
Writeln(‘B:=’,Gb:5:2);
Writeln(‘C:=’,Gc:5:2);
y:=(a*ga+b*gb+c*gc)/(a+b+c);
If (y>Pi/3) then Write(‘Y>PI/3’)
Else
If (y=Pi/3) then Write(‘Y=Pi/3’)
Else Write(‘Y<Pi/3′);
Write(#10#13,’ESC để thoát – Phím bất kì để tiếp tục . . .’);
If Readkey<>#27 then goto Continue;
END.


Bài 9


Uses Crt;
Var a,b,c : Boolean;
x : Char;
Procedure Nhap(Ten : char;Var ct: Boolean);
Begin
Write(‘Nhap trang thai cong tac ‘,ten,’ : dong(d) , ngat(n) (d/n) ‘);
Repeat {$i-}
Readln(x);{$i+}
until (x=’d’) or (x=’n’);
If x=’d’ then Ct:=True else CT:=False ;
End;
Function Sang: Boolean;
Begin
Sang := (a and b) or (a and c);
End;
Procedure Hien;
Begin
If sang then writeln(‘Den sang ‘)
else write (‘Den khong sang ‘);
End;
BEGIN
Clrscr;
Nhap(‘A’,a);Nhap(‘B’,b);Nhap(‘C’,c);
Hien;
Readln
END.


Bài 10


Uses Crt;
Var h,i,j : Byte;
Begin
Clrscr;
Repeat
Write(‘nhap so dong dau sao “*” ‘);
{$I-} Readln(h); {$I+}
Until (IoResult=0) and (h>0) and (h<=24);
For i:=1 to h do
Begin
For j:=1 to i do
Begin
Gotoxy(41-i+j*2,i);
Write(‘* ‘);
End;
End;
Readln
End.


Bài 11


Uses Crt;
Var k,l,m,n : Byte;
Procedure Ve;
Var i,j : Byte;
Begin
Clrscr;
Writeln(‘Ve ban co quoc te ‘);
For i:=1 to 8 do
Begin
For j:=1 to 8 do
Begin
If i mod 2 =0 then
If j mod 2 = 0 then Textcolor(12) Else Textcolor(15)
Else
If j mod 2 = 0 then Textcolor(15) Else Textcolor(12);
Write(#219#219);
End;
Writeln;
End;
End;

Procedure Nhap;
Begin
Writeln ;Textcolor(15);
Write(‘Nhap toa do o thu nhat : ‘);
Repeat
{$I-} Readln(k,l) {$I+}
Until ( IoResult=0 ) and (k>0) and(k<9) and (l>0) and(l<9);
Write(‘Nhap toa do o thu hai : ‘);
Repeat
{$I-} Readln(m,n) {$I+}
Until ( IoResult=0 ) and (m>0) and(m<9) and (n>0) and(n<9);
End;

Function Cungmau : Boolean;
Begin
If (k+l+m+n) mod 2 =0 then Cungmau := True
Else Cungmau := False;
End;

Function Hau : Boolean;
Begin
If (k=m) or (l=n) or (abs(m-k)=abs(n-l)) then
hau := True Else hau := False;
End;

Function Ma : Boolean;
Begin
If Abs((k-m)*(l-n))=2 then Ma := True Else Ma := False;
End;

Procedure Ketluan;
Begin
If cungmau then Writeln(‘Cung mau ‘) Else writeln(‘Khac mau ‘);
If hau then Writeln(‘2 Hau khong che nhau ‘)
Else writeln(‘2 Hau khong khong che nhau’);
If Ma then Writeln(‘2 Ma khong che nhau ‘)
Else writeln(‘2 Ma khong khong che nhau ‘);
End;

BEGIN
Ve;
Nhap;
Ketluan;
Readln
END.


Bài 12


Uses Crt;
Label Continue,continue1;
Var x,y,Color : Byte;

BEGIN
color:=1;
Textbackground(0); Clrscr;
Textcolor(10);
Gotoxy(28,18);
Write(‘An phim bat ky de thoat . . .’);
Continue:
If (color=15) then color:=1 Else Inc(color);
Textcolor(color);
x:=1;
y:=1;
Continue1:
Gotoxy(2*x,y); Write(‘TIN HOC ‘);
Gotoxy(72-2*x,y); Write(‘TUOI TRE ‘);
Gotoxy(39,y); Write(‘va’);
DELAY(200);
Gotoxy(2*x,y); Write(‘ ‘);
Gotoxy(72-2*x,y); Write(‘ ‘);
Gotoxy(39,y); Write(‘ ‘);
Inc(x);
Inc(y);
If (y<14) then Goto continue1;
Gotoxy(2*x,y); Write(‘TIN HOC ‘);
Gotoxy(72-2*x,y); Write(‘TUOI TRE ‘);
Gotoxy(39,y); Write(‘va’);
If Not keypressed then goto continue;
END.


Bài 13


Uses Crt;
Const Max = 30;
Type Mang = Array[1..Max] of Real;
Var X,Y : mang;
n : Byte;

Function Congtuyen : Boolean;
Var i,j,k : Byte;
Begin
For i:=1 to N do
For j:=1 to N do
For k:=1 to N do
If (i<>j) and (i<>k) and (j<>k) then
If (X[i]-X[j])*(Y[k]-Y[j])=(Y[i]-Y[j])*(X[k]-X[j])
then
Begin Congtuyen := True; Exit; End;
Congtuyen := False;
End;

Procedure Nhap;
Var i : Byte;
Begin
n := 3;
Writeln(‘Nhap toa do 3 dinh cua tam giac : ‘);
For i:=1 to n do
Repeat
Write(‘Toa do ‘,i,’ la : ‘);
{$I-} Readln(X[i],Y[i]);
Until Ioresult=0;
End;

Function Tontai: Boolean ;
Begin
If congtuyen then
Begin
Writeln(‘Khong ton tai tam giac ‘);
Tontai := False;
Readln;
Halt;
End
Else
Begin
Writeln(‘Ton tai tam giac ‘);
Tontai := True;
End;
End;

Function Dientich : Real;
Var i,j : Byte;
p : Real;
Begin
p := 0;
For i:=1 to N do
Begin
j := i+1;
If j=N+1 then j:=1;
p := p+(((X[j]-X[i])*ABS(Y[j]+Y[i]))/2);
End;
Dientich := ABS(p);
End;

BEGIN
Clrscr;
Nhap;
Tontai;
If tontai then Writeln(‘Dien tich tam giac la : ‘,dientich :10:2);
Readln
END.


Bài 14


Uses Crt;
Const Max = 100;
Type Mang = Array[1..Max+1] of Integer;
Var X,Y : mang;
N,sd : Byte;

Procedure Nhap1 (i : integer;Var x0,y0 :integer);
Begin
Write(‘Nhap vao toa do diem ‘,Char(i+64),’ = ‘);
Repeat
{$I-} readln(x0,y0); {$I+}
until (ioresult=0) ;
End;

Procedure Nhap;
Var i : Byte;
Begin
Clrscr;
Repeat
Write(‘Nhap so dinh cua da giac sd = ‘);
{$I-} Readln(sd); {$I+}
Until (IoResult=0) and (sd < Max) and (sd>2);
N := sd+1;
For i:=1 to N do Nhap1(i,x[i],y[i]);
End;

Procedure Hien;
Var i : Integer;
Begin
For i:=1 to N do
Writeln(‘Diem ‘,Char(i+64),'(‘,x[i]:3,’,’,y[i]:3,’)’);
End;

Function Dactrung(i,j,k : Byte) : ShortInt;
Var F : Real;
Begin
{Lap phuong trinh duong thang qua (x[i],y[i]) va (x[j],y[j]) }
F := (y[k]-y[i])*(x[j]-x[i])-(y[j]-y[i])*(x[k]-x[i]);
If F > 0 then dactrung := 1 Else dactrung := -1;
End;

Function Dagiacloi(sd1 : Byte) : Boolean;
Var i,j,k,h : Byte;
t : ShortInt;
Begin
For i:=1 to sd1 do
Begin
j := i+1;
If j=N then j:= 1;
k := j+1;
If k=N then k:= 1;
T := dactrung(i,j,k);
For h := 1 to sd1 do
If (h<>i) and (h<>j) and( h<>k) then
If T*dactrung(i,j,h) < 0 then
Begin
DagiacLoi := False;
Exit;
End;
End;
DagiacLoi := True;
End;

Function Trong : Boolean;
Var i,j,k : Byte;
T : ShortInt;
Begin
For i:=1 to sd do
Begin
j:=i+1;
If j=N then j:=1;
k :=j+1;
If k=N then k:=1;
t := dactrung(i,j,N);
If t*dactrung(i,j,k) < 0 then
Begin
Trong := False;
Exit;
End;
End;
Trong := True;
End;

Procedure Thuchien;
Begin
If Not Dagiacloi(sd) then
Begin
Writeln(‘ Theo thứ tự liên tiếp của đỉnh thì Khong phai da giac loi ‘);
Readln;
Halt;
End
Else
Begin
Writeln(‘Dung la da giac loi ‘);
If not Trong then
Begin
Write(‘Diem ‘,Char(N+64),'(‘,x[N]:3,’,’,y[N]:3,’)’);
Writeln(‘ o ngoai da giac loi da cho ‘);
End
Else
Begin
Write(‘Diem ‘,Char(N+64),'(‘,x[N]:3,’,’,y[N]:3,’)’);
Writeln(‘ o trong da giac loi da cho ‘);
End;
End
End;

BEGIN
Clrscr;
Nhap;
Hien;
Thuchien;
Readln
END.


Tương tự Bài 14 +15+ 16 { Kiểm tra đa giác lồi và tính diện tích của đa giác lồi }


Uses Crt;
Const Max = 20;
Type Toado = Array[1..Max] of Real;
Var X,Y : Toado;
B : Array[1..1000] of Boolean;
ds : Array[1..1000] of Word;
n,top : Word;

Procedure Input;
Var i : Word;
Begin
{ Nhập giá trị các đỉnh của đa giác vào mảng X và Y }
End;

Function CungFia(X1,X2,X3,X4,Y1,Y2,Y3,Y4 : Real) : Boolean;
Var d1,d2 : Real;
Begin
d1 := (Y3-Y1)*(X2-X1)-(X3-X1)*(Y2-Y1);
d2 := (Y4-Y1)*(X2-X1)-(X4-X1)*(Y2-Y1);
cungFia:=d1*d2>=0;
End;

Function DG_Loi(X,Y : Toado): Boolean; { Kiem tra tinh Loi cua da giac }
Var i,j,k,L : Word;
s : Real;
Begin
For i:=1 to n do
Begin
k := i+2;
L := i+1;
If k=n+1 then k := 1;
If L=n+1 then L := 1;
For j:=1 to n do
If (j<>i) and ( Not CungFia(x[i],x[L],x[j],x[k],y[i],y[L],y[j],y[k])) then
Begin
Write(‘Da Giac Khong Loi’);{Theo thứ tự liên tiếp các đỉnh đã nhập}
DG_Loi := False; Halt;
End;
End;
Writeln(‘Da Giac Loi’);
DG_Loi := True;
End;

Procedure Dientich(X,Y : Toado);
Var s,Min : Real;
i,j : Byte;
Begin
Min := 100000; { Tịnh tiến đa giác dọc trục tung , để đa giác nằm hoàn toàn phía trên ox}
For i:=1 to n do
If Y[i]<Min then Min := Y[i];
If Min<0 then
For i:=1 to n do Y[i] := Y[i] – Min;
S := 0;
For i:=1 to n do
Begin
j := i+1;
If j=n+1 then j := 1;
S := S+((x[j]-x[i])*abs(y[j]+y[i]))/2;
End;
S := Abs(S);
Writeln(s:6:2);
End;

Procedure Work1;
Begin
If DG_Loi(X,Y) then Dientich(X,Y);
End;

Function Timk : Byte; { Tim diem tiep theo cua duong bao quanh }
Var i,L,k : Byte;
Ok : Boolean;
Begin
Timk:=0;
For k:=1 to n do
If B[k]=False then
Begin
L := (k+1) mod n;
Ok := False;
For i:=1 to n do
If not cungFia(x[k],x[ds[top]],x[i],x[L],y[k],y[ds[top]],y[i],y[L]) then
Begin
Ok:=true;
Break;
End;
If Ok=False then
Begin
Timk := k;
exit;
End;
End;
End;

Procedure Work2; { Tìm đường đa giác lồi chứa tập điẻm đã cho }
Var i,j,k,L,T : Word;
Min : Real;
Begin
Min := 100000;
For i:=1 to n do
If x[i]<min then
Begin
Min := x[i];
T := i;
End;
B[t] := True;
Top := 0;
Inc(Top);
Ds[Top] := t;
Repeat
T := Timk;
Inc(Top);
Ds[Top] := T;
B[t] := True;
Until T=0;
Dec(Top);
For i:=1 to Top do Write(DS[i]:4);
End;

BEGIN
Input;
Work1;
Work2;
END.


{ Bài kiểm tra ( Nhiều bưu ảnh cho vào 1 phong bì ) }


Cách làm 1

Uses Crt;
Const sa = 3;
e = 0.01;
Type ktcd = Array[1..sa] of Real;
Ok = Array[1..sa] of Boolean;
Var a,b : Real;
c,d : ktcd;
Kq : Ok;

Procedure Trao(Var x,y : Real);
Var p : Real;
Begin
p := x; x := y; y := p;
End;

Procedure Nhap;
Var i : Byte;
Begin
Clrscr;
Write(‘Nhap 2 kich thuoc a,b cua phong bi : ‘);
Repeat
{$I-} Readln(a,b); {$I+}
Until ( Ioresult = 0 ) and ( a>0 ) and (b>0);
If a>b then Trao(a,b);
Writeln;
For i:=1 to sa do
Begin
Write(‘Nhap 2 kich thuoc c,d cua buu anh ‘,i,’ : ‘);
Repeat
{$I-} Readln(c[i],d[i]); {$I+}
Until ( Ioresult = 0 ) and ( c[i]>0 ) and (d[i]>0);
If c[i]>d[i] then trao(c[i],d[i]);
End;
End;

Procedure Hien;
Var i : Byte;
Begin
Writeln(‘Phong bi (‘,a:5:2,b:5:2,’)’);
For i:=1 to sa do
Writeln(‘Buu anh ‘,i:2,'(‘,c[i]:5:2,d[i]:5:2,’)’);
End;

Procedure Khoitri;
Begin
FillChar(Kq,Sizeof(Kq),False);
End;

Function Kt1(x,y : Real) : Boolean;
Begin
If (x<=a) and (y<=b) then Kt1 := True Else Kt1 := False;
End;

Procedure Thu1;
Var i : Byte;
Begin
For i:=1 to sa do
If Kt1(c[i],d[i]) then kq[i] := True;
End;

Procedure HienKq;
Var i ,dem : Byte;
Begin
Writeln(‘Số hiệu các bưu ảnh cho được vào trong phong bì là : ‘);
For i:=1 to sa do
If Kq[i] then
Begin
Write(i:4);
Inc(dem);
End;
Writeln(‘Tổng số có ‘ ,dem,’ bưu ảnh cho được vào trong phong bì ‘);
End;

Function Duoc(i : Byte;m,n : Real) : Boolean;
Var xc,yc,xd,yd,k : Real;
Begin
k := d[i]/c[i];
xc := n + k*m;
yc := n*k;
yd := m+yc;
xd := xc – n;
If (xc <= b) and (yc <=a) and (xd <= b) and (yd <=a) then
Duoc := True Else Duoc := False;
End;

Procedure Kt2(i : Byte);
Var m,n,k : Real;
co : Boolean;
Begin
m := e;
While (m<=a) and ( c[i]>= m) do
Begin
n := sqrt(sqr(c[i])-sqr(m));
k := d[i]/c[i];
If duoc(i,m,n) then
Begin
kq[i] := true;
Exit;
End;
m := m+e;
End;
End;

Procedure Thu2;
Var i : Byte;
Begin
For i:=1 to sa do kt2(i);
End;

BEGIN
Nhap;
Hien;
Thu1;
Thu2;
Hienkq;
END.


Cách làm 2 :


Uses Crt;
Const Max = 20;
Fi = ‘Phbi_anh.txt’;
Type M1 = Array[1..Max] of Real;
Var x,y : M1;
F : Text;
N : Byte;
A,B : Real;

Procedure Loi;
Begin
Writeln(‘Loi File ‘);
Readln;
Halt;
End;

Procedure Traococ(Var x,y : Real);
Var phu : Real;
Begin
phu := x; x := y; y := phu;
End;

Procedure Nhap;
Var i : Byte;
Begin
Assign(F,Fi);
{$I-} Reset(F); {$I+}
If IoResult<>0 then Loi;
Readln(F,N);
i := 1;
While not Eof(F) do
Begin
Readln(F,X[i],Y[i]);
If X[i]>Y[i] then Traococ(X[i],Y[i]);
Inc(i);
End;
a := x[i-1]; b := y[i-1];
If i <> N+2 then Loi;
Close(F);
End;

Procedure Hien;
Var i : Byte;
Begin
Writeln(‘So buu anh la ‘,N);
Writeln(‘Kich thuoc đáy hộp : ‘,'(‘,x[N+1]:4:2,’,’,y[N+1]:4:2,’)’);
Writeln(‘Kich thuoc cac b anh : ‘);
For i:=1 to N do Writeln(‘(‘,x[i]:4:2,’,’,y[i]:4:2,’)’);
End;

Function Duoc(c,d : Real) : Boolean;
Var k,L,m : Real;
Begin
If (c<=a) and (d<=b) then duoc := True Else
Begin
m := (Sqrt(Sqr(c)+sqr(d)))/2;
k := Sqr((b/2)-sqrt(sqr(m)-sqr(a)/4));
L := Sqr((a/2)-sqrt(sqr(m)-sqr(b)/4));
m := Sqrt(sqr(k)+sqr(L));
If c<m then duoc := True Else duoc := False;
End;
End;

Procedure HienKQ;
Var i : Byte;
Begin
Writeln(‘Kich thuoc cac b anh dat duoc trong hộp la : ‘);
For i:=1 to N do
If duoc(x[i],y[i]) then Writeln(‘(‘,x[i]:4:2,’,’,y[i]:4:2,’)’);
End;

BEGIN
Nhap;
Hien;
HienKq;
END.

Cơ sở của cách làm trên là :

Xét bưu ảnh có kích thước c x d . Nếu c<=a , d<=b thì rõ ràng bưu ảnh trong đáy hộp

Trong trường hợp chiều dài bưu ảnh > chiều dài đáy hộp ( d > b)

Trong trường hợp chiều dài bưu ảnh > chiều dài đáy hộp ( d > b)
Quay đường tròn đường kính = đường chéo bưu ảnh OH=R = SQRT( Sqr(OH)+Sqr(HK)) –> tính AH
Tương tự tìm AM . Từ đó Tính MH .
Điều kiện cần và đủ để bưu ảnh nằm trong hộp là chiều rộng của nó <= MH


Bài Kiểm tra


Sắp xếp là một công việc tính toán hay phải làm nhất . Xét bài toán sắp xếp cụ thể sau đây : Cần sắp xếp không giảm các phần tử của mảng , mà các giá trị của các phần tử chỉ là 1,2,3 .Việc sắp xếp được thực hiện bằng một dãy các thao tác đổi chỗ . Một thao tác đổi chỗ xác định bởi 2 phần tử ở vị trí p , q của mảng là đổi vị trí của chúng cho nhau .

Lập chương trình tính số ít nhất các thao tác đổi chỗ để sắp xếp dãy thành một dãy không giảm .

Hiện trên màn hình số ít nhất các thao tác này và tất cả các thao tác thực hiện ( mỗi thao tác là 2 số p và q tương ứng )

Hạn chế : Số phần tử của mảng là N <=1000 .

Uses Crt;
Const Max = 1000;
Var A : Array[1..max] of Byte;
Phai,Trai : Array[1..Max] of Word;
N,T2,T3,sp : Word;

Procedure Nhap;
{ Nhập giá trị của N và các phần tử của Mảng A(N) từ bàn phím hoặc ngẫu nhiên }

Procedure Khoitao;
Var i : Word;
Begin
T2 := 1;
For i:=1 to N do
If A[i]=1 then Inc(T2) Else If A[i]=2 then Inc(T3);
T3 := T2+T3;
End;

Function Tim1_B2 : Word; { Tim so 1 trong bang 2 }
Var i,j : Word;
Begin
For i:=T2 to T3-1 do
If A[i]=1 then Begin Tim1_B2:=i; Exit; End;
Tim1_B2:=0;
End;

Function Tim1_B3 : Word; { Tim so 1 trong bang 3 }
Var i,j : Word;
Begin
For i:=T3 to N do
If A[i]=1 then Begin Tim1_B3:=i; Exit; End;
Tim1_B3:=0;
End;

Procedure Doi(i,j,gt : Word);
Begin
A[j] := A[i]; A[i] := gt;
Inc(sp);
Phai[sp]:= i; Trai[sp]:= j;
End;

Procedure Lam1;
Var i,x,y : Word;
Begin
For i:=1 to T2-1 do
Begin
x := Tim1_B2;
y := Tim1_B3;
If A[i]=2 then
Begin
If (x>0) then Doi(i,x,1);
If ((y>0) and (x=0)) then Doi(i,y,1);
End Else
If A[i]=3 then
Begin
If (y>0) then Doi(i,y,1);
If ((y=0) and (x>0)) then Doi(i,x,1);
End;
End;
End;

Function Tim3_B2 : Word;{ Tim so 2 trong bang 3 }
Var i : Word;

Begin
For i:=T3 to N do
If A[i]=2 then
Begin
Tim3_B2:=i;
Exit;
End;
Tim3_B2:=0;
End;

Procedure Lam2; { Chuyen so 3 tu bang 2 ve bang 3 }
Var x,i : Word;
Begin
For i:=T2 to T3-1 do
If A[i] = 3 then
Begin
x:=Tim3_B2;
If x>0 then Doi(i,x,3);
End;
End;

Procedure Hien;
Var i : Word;
Begin
For i:=1 to sp Do Writeln(Phai[i],’ ‘,Trai[i]);
End;

BEGIN
Clrscr;
Nhap;
Khoitao;
Lam1;
Lam2;
Hien;
Readln
END.

Đã đóng bình luận.

Các tác giả

Categories

Tháng Tám 2017
H B T N S B C
« Th7    
 123456
78910111213
14151617181920
21222324252627
28293031  

NCT Computer

Flickr Photos

Thống kê

  • 157,295 lượt xem

pascalteacher.nct@gmail.com


Trang huấn luyện học sinh giỏi Tin học

%d bloggers like this: