Professional Documents
Culture Documents
BΜI TËP
NG«N NG÷ LËP TR×NH PASCAL
Phần cơ sở
Tác giả :
Ngôn ngữ Pascal do giáo sư N. Wirth sáng tác ra năm 1970, là một ngôn
ngữ thuật giải, có tính cấu trúc chặt chẽ, sáng sủa và với mục đích làm công cụ
giảng dạy cho sinh viên. Học Ngôn ngữ lập trình PASCAL, các bạn học sinh, sinh
viên còn học được lối tư duy mạch lạc, rõ ràng.
Hiện nay, đã có rất nhiều tài liệu, giáo trình viết cho ngôn ngữ này nhưng
vẫn chưa tương ứng, phù hợp với yêu cầu, nội dung và thời gian cho sinh viên
trong trường. Sau một thời gian giảng dạy ở khoa Công nghệ thông tin - trường
Đại học sư phạm kỹ thuật Hưng Yên, chúng tôi viết cuốn sách này nhằm cung cấp
tài liệu học tập cho sinh viên phù hợp với chương trình môn học Nhập môn tin
học. Về nội dung, chúng tôi bám sát với chương trình của nhà trường và hệ thống
bài tập cũng được biên soạn theo các chương lý thuyết. Với mỗi chương sẽ được
chia thành 3 phần:
Phần A. Nhắc lại lý thuyết: tóm tắt các kiến thức cơ bản, các ví dụ và các
lưu ý hữu ích, các kinh nghiệm trong khi lập trình
Phần B. Bài tập mẫu có phân tích thuật toán và chương trình minh hoạ
Phần C. Bài tập tự giải: người học thực hiện việc giải các bài tập này
Chúng tôi mong rằng tài liệu này đáp ứng được một phần nào nhu cầu của
học sinh, sinh viên.
Môc lôc
Trang 2
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Trang 3
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
GIẢI THUẬT
Phân tích được định nghĩa và các đặc trưng của giải thuật
Biểu diễn được giải thuật bằng cách liệt kê từng bước và Lưu đồ
khối
Trình bày được một số giải thuật thường gặp
Viết được giải thuật để giải quyết các bài toán theo yêu cầu
1. Định nghĩa
Giải thuật là một hệ thống chặt chẽ và rõ ràng các qui tắc nhằm xác định một
dãy các thao tác trên những đối tượng, sao cho sau một số hữu hạn bước thực
hiện các thao tác ta thu được kết quả mong muốn
2. Các đặc trưng của giải thuật
- Tính kết thúc
- Tính rõ ràng, chặt chẽ
- Tính phổ dụng
- Tính hiệu quả
3. Cách biểu diễn giải thuật
a. Liệt kê từng bước các thao tác
Các động tác cơ bản:
- Bắt đầu
- Thông báo, yêu cầu
- Gán giá trị
- Thực hiện các phép tính số học, logic
- Kiểm tra điều kiện
- Chuyển không điều kiện, chuyển có điều kiện
- Lặp lại
- Kết thúc
b. Lưu đồ khối
Dùng các hính thể hiện các thao tác và các mũi tên chỉ thứ tự thực
Trang 4
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
hiện các thao tác thành một sơ đồ biểu diễn giải thuật:
1/ Nút giới hạn: được biểu diễn bởi hình ôvan có ghi chữ bên trong như :
Các nút trên còn được gọi là nút đầu và nút cuối của lưu đồ.
2/ Nút thao tác: là một hình chữ nhật có ghi các lệnh cần thực hiện. Ví dụ:
3/ Nút điều kiện: thường là một hình thoi có ghi điều kiện cần kiểm tra. Trong các
cung nối với nút nầy có 2 cung ra chỉ hướng đi theo 2 trường hợp: điều kiện đúng
và điều kiện sai. Ví dụ:
4/ Cung: là các đường nối từ nút nầy đến nút khác của lưu đồ.
Hoạt động của thuật toán theo lưu đồ được bắt đầu từ nút đầu tiên. Sau khi
thực hiện các thao tác hoặc kiểm tra điều kiện ở mỗi nút thì bộ xử lý sẽ theo một
cung để đến nút khác. Quá trình thực hiện thuật toán dừng khi gặp nút kết thúc
hay nút cuối.
4. Một số giải thuật thường gặp
a) Hoán vị hai giá trị X,Y
Bước 1. Dùng một giái trị trung gian TG và gán TG=X
Bước 2. Gán X=Y
Bước 3. Gán Y = TG
b) Tìm phần tử nhỏ nhất trong dãy X1, X2, …, Xn
Trang 5
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Bài tập 1.
Nêu giải thuật cho chạy một chương trình tên là Bai1.Pas đã ghi trong đĩa
mềm
Giải thuật:
Bước 1. Kiểm tra xem máy bật chưa? Nếu bật thì chuyển sang bước 3
không thì thực hiện bước 2
Bước 2. Bật máy. Chờ khởi động xong hệ điều hành, sang bước 3
Bước 3. Khởi động Turbo Pascal, nếu trong máy không có chương trình
thì sang bước 4
Bước 4. Cho đĩa Turbo Pascal vào (tối thiểu cần có các File Turbo.exe và
Turbo.tpl)
Bước 5. Chọn File rồi mở xem trên đĩa có File Bài1.Pas chưa? Nếu chưa
thì nạp đĩa khác và lặp lại bước 5, nếu rồi thì sang bước 6
Bước 6. Chọn tệp Bài1.pas, ấn Enter nạp chương trình Bai1.pas vào máy
Bước 7. Ấn phím Ctrl + F9 hoặc dùng lệnh Run để chạy chương trình
Bai1.Pas
Bài tập 2
Cho dãy số X1, X2, …, Xn . Trình bày giải thuật sắp xếp lại dãy này theo thứ
tự tăng dần
Giải thuật:
Bước 1. Nhập dãy X1, X2, …, Xn
Viết thuật toán để nhập vào 2 số và tìm số lớn nhất trong 2 số này.
Giải thuật:
Bước 1: Nhập vào 2 số a và b
Bước 2: - Nếu a > b thì Max là A
& Kết thúc
- Trái lại (Không phải a > b) thì Max là B
& Kết thúc
Bài tập 4
Vẽ lưu đồ cho ví dụ trên.
Bài tập 5.
Vẽ lưu đồ thích hợp cho chuỗi lệnh dưới đây:
Giải thuật:
(i) Nhập vào một số num
(i) Hiển thị num
(ii) Kiểm tra num > 0 ?
(iii) Nếu đúng thì gán num = num +1
iv) Kết thúc.
Trang 7
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Bài tập 6
Lưu đồ để tìm tổng số trẻ em nhỏ hơn 18 tuổi trong thành phố
Bài tập 7
Vẽ lưu đồ để nhập vào cạnh đáy & chiều cao của hình tam giác và tính diện
tích của hình tam giác đó
Gợi ý: Diện tích S = 0.5 * cạnh đáy * chiều cao
Trang 8
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Bài tập 8
Công ty Meridian cho người bán hàng 5% hoa hồng nếu hàng tháng họ bán
được ít hơn 10,000 Rs và 10% hoa hồng nếu hàng tháng họ bán được nhiều hơn
hoặc bằng 10,000 Rs. Tính hoa hồng cuối tháng cho một người bán hàng.
Giải thuật:
Trang 9
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Phân tích được các phần tử cơ sở: tập ký tự, từ khoá, tên chuẩn, tên
tự đặt
Phân biệt các kiểu dữ liệu chuẩn, các phép toán
Biểu diễn được các biểu thức trên các kiểu dữ liệu chuẩn
Phân tích được các thành phần trong cấu trúc một chương trình
Pascal
2. Các từ khoá
Các từ khoá (keyword) là các từ dành riêng mà người dùng không được thay
đổi hoặc dùng vào mục đích khác. Các từ khoá bao gồm một số định danh như
Program, Procedure, Function, Type, Var, const… hoặc một số câu lệnh như
for, while, repeat, do, then …
Trang 10
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
- Chỉ được gồm các chữ cái và các chữ số, phải bắt đầu bằng chữ cái
- Không được trùng với từ khoá
Pascal không phân biệt chữ hoa và chữ thường. Dấu cách (space) không
được phép có mặt trong tên (người ta thường dùng dấu gạch dưới (_)để tách các
từ trong tên cho dễ đọc).
Nên đặt tên có tính gợi nhớ để dễ theo dõi hoặc hiệu chỉnh chương trình,
không nên đặt tên quá dài hoặc trùng với các tên chuẩn.
- Kiểu Real: là kiểu số thực 6 bytes, có giá trị tuyệt đối nằm trong khoảng từ
2.9E-39 đến 1.7E+38, với phần định trị gồm 11 đến 12 chữ số có nghĩa
Trong tài liệu này, để thích hợp cho việc trình bày kiểu số nguyên được sử
dụng là: integer hoặc byte; kiểu số thực là: Real
- Kiểu Char: là kiểu ký tự 1 byte, gồm 256 ký tự trong bảng mã ASCII ( từ 0
đến 255)
- Kiểu Boolean: là kiểu logic 1 byte gồm 2 giá trị: True (đúng) và False (sai)
Trang 11
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Trang 12
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
tròn ()
- CÁC VÍ DỤ
Ví dụ 1:
Cho năm tên hợp lệ và năm tên không hợp lệ trong Turbo Pascal
Trang 13
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Trang 14
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Ví dụ 2:
Hãy khai báo biến: a,b là các biến thực, i nhận giá trị nguyên trong khoảng
từ -32768 đến 32767; j1,j2 nhận giá trị nguyên không âm <=65535; k
nhận giá trị nguyên từ 0 đến 255; biến n kiểu nguyên nhận giá trị bằng 10
Var a,b: real;
i: integer;
j1,j2: word;
k: byte;
Const n:integer = 10;
Ví dụ 3: Khai báo hằng kiểu nguyên và hằng kiểu kí tự
Const
x = 10; ch = 'A';
Bài số 1:
Các câu lệnh sau đây câu lệnh nào sai, tại sao?
a) Const x:=555;
b) Var y:integer;
Hướng dẫn:
Câu lệnh ở mục a) sai vì cú pháp khai báo hằng là:
Const tên_hằng = giá_trị;
Bài số 2:
Gải sử có khai báo Var x:integer;
Hãy xem các giá trị nào dưới đây có thể gán cho biến x:
Trang 15
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Hướng dẫn:
Ta biết rằng, phạm vi biểu diễn của kiểu Integer là từ -32768 đến 32767
nên trong các giá trị đó chỉ có giá trị b) 15 thoả mãn và có thÓ g¸n cho biÕn x
Bài số 3:
Biểu diễn các biểu thức sau theo ngôn ngữ Pascal:
x+ y
a) x − z b) (1 + x2) y
2
c) e
+ x−4
Hướng dẫn:
Sử dụng các hàm chuẩn của Pascal và thứ tự ưu tiên của các phép toán
để biểu diễn:
a) (x + y) / (x - z) b) (1 + sqr(x)) * y
c) exp(2) + sqrt(x-4)
Bài số 4:
Viết các biểu thức quan hệ và logic sau theo ngôn ngữ Pascal:
a) a<x<b b) b2 - 4ac <0 c) y < a-c hoặc y < c+b
d) D = 0 và D1 ( 0 hoặc D2 =0
Hướng dẫn:
Sử dụng các hàm chuẩn của Pascal và thứ tự ưu tiên của các phép toán
để biểu diễn:
a) (a < x) and ( x<b)
b) ( sqr(b) - 4*a*c) <0 hoặc (b*b - 4*a*c)<0
c) (y < a-c) Or (y <c+b)
d) (D=0) and (D1 <>0) Or (D2=0)
Trong các câu hỏi dưới đây, hãy chọn một câu trả lời thích hợp nhất:
Câu 1: Tính cấu trúc của ngôn ngữ Pascal được thể hiện :
a) trong việc tổ chức các dữ liệu;
b) trong việc tổ chức các câu lệnh;
c) trong việc tổ chức chương trình;
d) ở cả ba mục a), b), c) ;
Trang 16
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Câu 2: Ðiều gì làm cho Pacal được đánh gía cao và trở thành một trong những
ngôn ngữ thảo chương phổ biến nhất hiện nay ?
a) Nó là ngôn ngữ đầu tiên đưa ra và thể hiện được khái niệm lập trình có
cấu trúc.;
b) Nó là một ngôn ngữ chặt chẽ cả về mặt cú pháp và về mặt dữ dtệu;
c) Nó là ngôn ngữ có văn phạm sáng sủa, dễ hiểu, có khả năng đủ mạnh;
d)Cả ba điều nêu trong các mục a), b), c) ;
Câu 5: Mục nào có các Tên đều đặt đúng quy định của Pascal:
a) x1 , X-2 ;
b) Xx1 , X2;
c) CONST , X_234;
d)X[1], x2 ;
Câu 6: Chọn câu Sai : trong một chương trình Pascal, có thể không có :
a) End;
b) END;
Trang 17
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
c) end.
d) End ! ;
Câu 8: Trong Pascal, lệnh nào có tác dụng xóa màn hình :
a) CLRSSR ;
b) CLRSR;
c) Clrscl;
d) Clrscr ;
Câu 9: Trong Pascal, nếu muốn dùng lệnh xóa màn hình Clrscr thì phải khai báo
thế nào ở ngay sau phần tiêu đề chương trình :
a) Uses CRT ;
b) USES Graph;
c) use CRT ;
d) không khai báo gì cả ;
a) để lưu chương trình lên đĩa, gõ phím F2 hoặc chọn lệnh File / Save ;
b) để mở một tập tin cũ, gõ phím F1;
c) để tìm lỗi cú pháp của chương trình, gõ phím Alt_F9, hay F9 ;
d) để chạy chương trình, gõ phím ^F9 hoặc chọn lệnh Run / Run ;
Bài tập 2:
Trong những tên dưới đây cho biết tên nào là tên chuẩn:
for sin(x) cos not artan tg
x exp end alpha chr sqrt
in Var abs(a) upcase odd inc
Bài tập 3:
Các giá trị sau thuộc kiểu dữ liệu chuẩn nào?
a) 15.0 b)1922 c)'?'
d) Int(15.172) e) 3<7 g)sqrt(16)
h) 12/4 i) 64221 j) -1e10
Bài tập 4:
Trang 18
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Khai báo biến gồm: a,b là các biến thực; i nhận các giá trị nguyên trong
khoảng từ -32768 đến 32676; j1,j2 nhận các giá trị nguyên không âm trong
khoảng từ 0 đến 65535; k nhận các giá trị nguyên từ 0 đến 255
Bài tập 5:
Hãy viết khai báo sau:
a) Các biến thực x,y,z; các biến nguyên m,n,i,j
b) Các biến R1,R2 thuộc loại thực; các biến ký tự a,e,ten
c) 5 biến logic và 3 biến nguyên (tự đặt tên)
d) Các hằng 1993, 32.5, '%'
Bài tập 6:
Cho biết kết quả và kiểu dữ liệu của các biểu thức sau:
a) 8+5.0+4
b) 9/3 + 2 div 3 + 7
c) (10*((45 mod 5) +6))/2
d) (5<=3) And (Not True and (12 Div 3 <=1))
Bài tập 7:
Viết các ngôn ngữ sau theo ngôn ngữ Pascal:
x+ y
a) x − y b) ey+5x c)(1+x2) y
2
x
2
1+ x
2
1+ x
(2 sin 2 x + 3 cos 2 x )tg 5 x
2 2 −2
d)
1+ x
e) 3 +3
g) lnx + e2 h) x + x + x
3 4
i) x
− lg( x + 2) − x − 4
Bµi tËp 8:
Viết các biểu thức quan hệ và logic sau theo ngôn ngữ Pascal:
a) a<x<b b) b2 - 4ac <0
c) y<a-c hoặc y<a+c d) D=0 và D1 <> hoặc D2=0
e) D=0 và D1 = 0 hoặc D2<>0 g) D=0 và D1 = 0 và D2<>0
h) a=0 và b=0
Bài tập 9:
Các câu lệnh sau đây câu lệnh nào sai tại sao?
a) Const x:=555;
Trang 19
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
y = 'HA NOI'
b) Var sin,a,i:integer;
c) Var x,y,then:real;
d) Const a= (5+7=3);
Trang 20
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Trang 21
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Bài số 2:
Viết chương trình in ra màn hình một bài thơ
Hướng dẫn:
Mỗi câu thơ được in trên 1 dòng, do đó nên sử dụng dạng lệnh in Writeln
0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb0210000700000
00000bc02000000000102022253797374656d0005f806000057890000ac5d1100
04ee8339e8011c000c020000040000002d01000004000000020101001c000000f
b02ceff0000000000009001000000000440001254696d6573204e657720526f6d6
16e0000000000000000000000000000000000040000002d010100050000000902
000000020d000000320a2d0000000100040000000000f8061d052000160004000
0002d010000030000000000
Trang 23
Program DTHTron;
Var bkinh, dtich : real;
Begin
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Write(‘Cho b?n k?nh : ’); Readln(bkinh);
dtich:=PI*bkinh*bkinh;
Writeln(‘Dien tich vong tron : ’, Dtich:8:2);
Readln;
End.
Bài tập 5:
Viết chương trình cho máy hỏi tên của một học sinh (nhập tên từ bàn phím)
và đưa ra màn hình dòng chữ: Chao ban <ten>. Ví dụ: nhập tên là Hoa sẽ in ra
màn hình: Chao ban Hoa
Hướng dẫn:
Sử dụng kết hợp thủ tục vào/ra dữ liệu
Chương trình minh hoạ:
0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb02100007000000
0000bc02000000000102022253797374656d0005f806000057890000ac5d110004
ee8339e8011c000c020000040000002d01000004000000020101001c000000fb02
ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0
000000000000000000000000000000000040000002d0101000500000009020000
00020d000000320a2d0000000100040000000000f8061d0520001600040000002d
010000030000000000
Bài tập 6:
Đề bài:
Tính diện tích hình tròn khi biết kích thước của bán kính với hằng số PI
cho trước
Hướng dẫn :
- Bán kính, diện tích hình tròn khai báo là 2 biến kiểu thực tương ứng:
bkinh và dtich
Trang 24
Truong DHSPKT Hung Yen
Khoa CNTT
Program ChuViHCN;
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Var Dai, Rong, Chuvi : integer ;
Begin
Write(‘Nh?p chi?u d?i hinh chu nhat : ’); Readln(Dai);
Write(‘Nh?p chi?u r?ng hinh chu nhat : ’); Readln(Rong);
Chuvi:=2*(dai +rong);
Writeln(‘Chu vi hinh chu nhat la : ’, Chuvi);
Readln;
End.
Bài tập 7:
Đề bài: Tính chu vi hình chữ nhật khi biết kích thước chiều dài và chiều rộng
Chiều dài và chiều rộng của hình chữ nhật khai báo bằng 2 biến nguyên:
dai, rong. Chu vi hình chữ nhật được tính và lưu vào biến chuvi. Kích thước của
2 biến dai, rong được nhận theo 2 cách:
+ Đọc giá trị từ bàn phím và gán cho biến chiều dài và chiều rộng
Bài tập 1:
Viết chương trình in ra màn hình dòng chữ như sau:
Hướng dẫn:
Nhập thêm các dấu cách đứng trước và đứng sau dòng chữ 'Khoa CNTT'
Bài tập 2:
Viết chương trình đưa họ tên, ngày tháng năm sinh của học sinh Nguyen
Thanh Mai, sinh ngày 12/02/1980 vào máy bằng hằng và đưa các dữ liệu đó ra
màn hình.
Hướng dẫn:
- Khai báo hằng theo cú pháp
Trang 25
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Bài tập 3:
Viết chương trình để máy tính nói chuyện với người sử dụng:
- Máy “nói” bằng các câu in ra màn hình
- Người sử dụng “nói” bằng cách đánh từ bàn phím
Nội dung cuộc nói chuyện tuỳ thích
Hướng dẫn:
Khai báo các biến kiểu string để chứa các thông tin của người và máy
Bài tập 4:
Tính và đưa ra màn hình giá trị của biểu thức A sau đây:
Y = ax
Z = loga(x)
Hướng dẫn:
- Trong Pascal để tính luỹ thừa f = ab ta dựa vào các hàm có sẵn bằng
cách biến đổi như sau: f = ab = (elna)b = eb*lna nên f = exp(b*ln(a))
- Và g = logax = ln(x)/ln(a)
Bài tập 5:
Viết chương trình đọc từ bàn phím độ dài 3 cạnh của tam giác ABC rồi tính
diện tích và các đường cao của tam giác
Hướng dẫn:
Dùng công thức Hêrông: S = Sqrt(p(p-a)(p-b)(p-c)) trong đó p là nửa chu vi
Bài tập 6:
Viết chương trình nhập vào số lượng tờ 200, 500, 1000, 2000, 5000 tiền
Việt Nam và tính tổng số tiền
Bài số 7:
Cho tam giác ABC với 3 đỉnh có toạ độ là (x1,y1), (x2,y2), (x3,y3). Tính
chu vi và diện tích tam giác
Bài số 8:
Viết chương trình nhập vào tổng số giây, sau đó đưa ra màn hình dạng
hh:mm:ss (giờ:phút:giây)
Phân tích được cú pháp của câu lệnh rẽ nhánh dạng khuyết, dạng
đủ và đa lựa chọn
Trang 26
M?u 2:
M?u 1:
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Case <bi?u_th?c> Of
Case <bi?u_th?c> Of
h?ng1: <c?ng_vi?c1>;
h?ng1: <c?ng_vi?c1>; So sánh được điểm giống và khác nhau của 2 dạng lệnh rẽ nhánh
h?ng2: <c?ng_vi?c2>;
h?ng2: <c?ng_vi?c2>;
Sử dụng thành thạo các............................
câu lệnh rẽ nhánh để thể hiện giải thuật
............................
h?ng N: <c?ng vi?c n>;
h?ng N: <c?ng vi?c Vậnn>;dụng được để viết các chương trình theo yêu cầu
Else <c?ng_vi?c n+1>;
End;
End;
A/ NHẮC LẠI LÝ THUYẾT
1. Câu lệnh rẽ nhánh IF
Câu lệnh IF dùng để rẽ nhánh dựa vào việc kiểm tra một giá trị kiểu
Boolean.
- Cú pháp khai báo có 2 dạng :
+ Dạng khuyết:
IF <điều_kiện> THEN <công_việc>;
+ Dạng đủ:
IF <điều_kiện> THEN <công_việc1>
ELSE <công_việc2>
trong đó điều kiện là biểu thức Boolean, còn công_việc có thể là một
hay nhiều câu lệnh ( nằm trong khối Begin ... end)
- Ví dụ minh họa:
Tìm số lớn nhất trong hai số a,b:
If a>b then max:=a else max:=b;
- Lưu ý:
+ Trước else không có dấu chấm phẩy (;)
+ Trong trường hợp có nhiều câu lệnh If lồng nhau thì Else sẽ gắn với If
không có Else gần nhất
2. Câu lệnh Case:
- Cú pháp khai báo:
- Ví dụ minh hoạ:
+ VÝ dô 1:
Case so of
1: begin
Writeln(‘So 1’);
Writeln(‘La so dau tien’);
end;
Trang 27
PROGRAM Max_min; Tim so lon nhat va so nho nhat c?a hai so
Var a, b, Max, Min : Real;
Bài
Begin tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Program Sap_xep;
Write(‘
Var Nhap a va b :’);
so1,so2,tam:Integer; Readln(a,b);
IfBegin
a < b then 2: Writeln(‘So 2’);
End;XEP 2 SO NGUYEN');
Writeln('SAP
begin
Writeln('-------------------');
Max:=
+ Ví b;
dụ 2: Min:= a;
Write('-Nhap
end so thu nhat: '); Readln(so1);
Casesoch
Write('-Nhap thuof hai : '); Readln(so2);
else tr??c else kh?ng c? d?u ;
If so1 > so2 Then ‘0’ ..’9’: Writeln(‘ Ch la mot chu so ‘);
beginBegin
Max:= a; tam:=so1;
‘A’:
Min:= b;
Writeln(‘ Chu cai A ‘);
end; ‘B’,’C’: Writeln(‘ch la mot trong 2 chu cai B,C’);
so1:=so2;
in ra man hinh so2:=tam;
giaElse
tri max va min Writeln(‘ ch khong phai la chu so hay chu
Writeln(‘ End;
So lon nhat la: ‘ , Max:6:2); 2 so thap phan
cai A,B, C ‘);
Writeln;
Writeln(‘ SoEnd;nho nhat la: ‘ , Min:6:2);
Writeln('Ban vua nhap cac so sau');
Readln;
- MộtWriteln(so1:10);
số lưu ý:
End. Writeln(so2:10);
+ Biểu thức phải là các kiểu vô hướng đếm được (là các kiểu dữ liệu cơ
Readln
bản đã học trừ kiểu real, kể cả kiểu liệt kê hoặc đoạn con sẽ học sau)
End.
+ C¸c hằng phải cùng kiểu (tương thích) với kiểu của biểu thức
B/ BÀI TẬP MẪU
Bài số 1:
ViÕt chương trình nhập vào hai số a và b, tìm và in ra mµn h×nh số nhỏ
nhất và số lớn nhất của chúng (Mở rộng tìm max, min của 3 số, 4 số)
Híng dÉn: Ðể tìm số lớn nhất của hai số a và b, ta so s¸nh gi¸ trÞ 2 sè a,b
Chương trình minh hoạ:
Bài tập 2:
Viết chương trình sắp xếp 2 số nguyên theo thứ tự tăng dần
Chương trình minh hoạ:
Bài số 3:
Viết chương trình nhập vào 3 số a,b,c bất kỳ và kiểm tra xem 3 số đó có
Trang 28
Program Tien_dien;
Program Tam_giac; T?nh ti?n ?i?n
UsesString[18];
Var Bài Ho_ten:
tập Pascal crt; cơ sở
phần Biên soạn: Bộ môn CNPM – UTEHY
Varchiso2,
chiso1, a,b,c:real;
Ldtt, Tien : Real;
Begin phải làBEGIN
độ dài ba cạnh của một tam giác hay không. Thông báo ra màn hình :
clrscr;
Write(‘
“ThoảNhap
mãn” ho hayva ten :’);
“Không Readln(Ho_ten);
thoả mãn” trong các trường hợp tương ứng
Writeln('Nhap do dai 3 canh tam giac ');
Write(‘ Nhap ch? s?=th?ng
Write('a tr??c, ch? s? th?ng n?y: ‘);
'); readln(a);
Hướng dẫn:
Readln( chiso1,Write('bchiso2);
= '); readln(b);
-
Ldtt:=chiso2-Ta biết, điều kiện để a,b,c là ba cạnh của một tam giác là mỗi cạnh phải
chiso1;
Write('c = '); readln(c);
dương và60
If Ldtt<= Iftổng hai Tien:=Ldtt*5
(a>0)
then cạnh
And thì lớn hơn
(b>0) cạnh còn lại.
And(c>0)
else - ThểAnd hiện (a+b>c)
nhận xét trênAnd(b+c>a) Andlogic
bằng biểu thức (a+c>b) Then
của Pascal ta có các biểu
ifthức
Ldttsau: Writeln('Thoa
<=160a>0, thenb>0, man: Day
Tien:=60*5+(Ldtt la 3 canh
c>0, a+b>c, b+c>a,- a+c>b
60)*8 cua tam giac ')
Else Writeln('Khong thoa man! ');
else
Chương readln;
trình minh hoạ:
Tien:=60*5 + 100*8 + (Ldtt - 160) * 10;
Bài số END.
4:
Writeln(‘ H? v? t?n l? ‘, Ho_ten);
Writeln(‘NhậpTi?n vào
ph?ihọ tr?tên
l? một chủ hộ, chỉ số điện kế tháng trước (chiso1) và chỉ số
‘ , Tien:10:2);
điện kế tháng này (chiso2), tính tiền điện tháng này cho hộ, biết rằng :
Readln;
End. Mỗi kw trong 60 kw đầu tiên có đơn gía là 5đ,
Từ kw thứ 61 đến kw thứ 160 có đơn giá 8đ,
Từ kw thứ 161 trở lên có đơn gía 10đ.
Híng dÉn:
Ví dụ, ông A có chỉ số điện tháng trước là chiso1=1020 và chỉ số điện tháng
này là chiso2=1070, lượng điện tiêu thụ tính ra là Ldtt= 1070-1020=50, do lượng
điện tiêu thụ < 60 nên số tiền sẽ là:
Tien = 50*5= 250đ.
Nếu chiso2=1150 thì Ldtt = 1150-1020=130, do lượng điện tiêu thụ vượt qúa
60 kw nhưng chưa vượt qúa 160 kw nên tiền điện được tính là:
Tien=60*5 + (130-60) *8 = 860 đ.
Nếu chiso2=1234, thì Ldtt = 1234-1020= 214, do lượng điện tiêu thụ vượt qúa
160 kw nên tiền điện sẽ là:
Tien=60*5 + 100*8 + (214-160)*10= 300+800+54*10= 1640 đ.
Chương trình minh hoạ:
Trang 29
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Bµi tËp 5:
Nhập vào ba hệ số A, B, C, (A <> 0) rồi giải và biện luận phương trình bậc
hai: Ax2 + Bx + C = 0
Hướng dẫn:
- Việc đầu tiên là phải tính Delta : Delta = B2 - 4AC
Sau đó biện luận theo Delta:
+ Nếu Delta<0 : phương trình vô nghiệm
−B
+ Nếu Delta=0 : phương trình có nghiệm kép :
X 1, 2
=
2A
+ Nếu Delta > 0: phương trình có hai nghiệm :
− B + delta − B − delta
X 1
=
2A X 2
=
2A
Chương trình minh hoạ:
0100090000037800000002001c0000000000040000000301080005000000
0b0200000000050000000c022005f806040000002e0118001c000000fb021
000070000000000bc02000000000102022253797374656d0005f80600005
7890000ac5d110004ee8339e8011c000c020000040000002d01000004000
000020101001c000000fb02ceff0000000000009001000000000440001254
696d6573204e657720526f6d616e00000000000000000000000000000000
00040000002d010100050000000902000000020d000000320a2d00000001
00040000000000f8061d0520001600040000002d010000030000000000
Chú ý:
Trong chương trình có ba lệnh IF xét riêng từng trường hợp Delta âm, bằng
không hoặc dương. Chú ý rằng khi Delta=0 thì phải làm hai lệnh:
X1:=-B/(2*A);
Writeln(‘ Có ng. kép X1=X2= ‘ , X1:8:2);
nên hai lệnh này phải được đặt giữa hai từ khóa begin và end để tạo thành một
câu lệnh ghép.
Tương tự, khi Delta>0 thì phải làm năm lệnh, và do đó cả năm lệnh cũng phải
để trong khối begin và end.
Bài tập 6:
Trang 30
PROGRAM Phan_loai;
Var Ho_ten: String[20];
Namsinh,
Bài tập PascalNamnay,
phần cơ sở Tuoi : Integer ; Biên soạn: Bộ môn CNPM – UTEHY
Phanloai : String[14];
Begin Tính điểm trung bình các môn học của một học sinh và đưa ra lời nhận xét
Program Diem_Trung_binh;
Write(‘ Nh?p h? v? t?n: ‘); Readln(Ho_ten);
Const Hướng dẫn:
Write(‘
MucDiem = Nh?p
5; n?m sinh v? n?m nay : ‘); Readln(Namsinh, Namnay);
Tuoi:=Namnay
DiemDat Khai báo
=10; một
- Namsinh; số biến kiểu logic chứa kết quả sau khi so sánh các điểm
môn học
DiemLoai
If Tuoi< với
0 then =2;các tiêu chuẩn
writeln( ‘Nh?p đánh
sai giá‘)
Var else
Chương trình minh hoạ:
Ten:String[24];
begin
Van,Toan,Tongdiem:Real;
Case Tuoi of
Dat,Loai,Hocdeu:Boolean;
Begin 0 Bài
,1tập 7:
: Phanloai:= ‘s? sinh’;
Writeln('TINH DIEM
2 ..9 : Nhập TRUNG
Phanloai:= BINH
‘nhi VA NHAN XET');
?ong’;
vào họ tên và năm sinh của một người, cho biết người này thuộc lứa
Writeln('--------------------------------');
10
tuổi..15
nào:: sơ
Write('-Cho Phanloai:=
sinh,
biet ho nhi ‘thieu
ten:đồng, ni?n’;
thiếu
'); Readln(Ten);niên, thanh niên, trung niên hay người lớn tuổi,
16 ..32
Write('-Cho
biết rằng:: Phanloai:=
biet diem ‘thanh
mon Van nien’;
: '); Readln(Van);
Write('-Cho
33 ..50 : Phanloai:= ‘trung nien’; Readln(Toan);
biet diem mon Toan: ');
Tongdiem:=Van+Toan
else Phanloai:= tuổi từ 0
Sơ sinh có ‘nguoi lonđến 1
tuoi’;
Dat:=(Tongdiem >=DiemDat);
end; h?t Nhi
Loai:=(Van Case đồng : có tuổi
< DiemLoai) từ 2 đến
Or (Toan 9
< DiemLoai)
Writeln(Ho_ten,
Hocdeu:=(Van #32có, tuổi
>MucDiem)
Thiếu niên Tuoi,
Andtừ#32
(Toan
10 đến ,>Phanloai);
Mucdiem)
15
Writeln('+Hoc
end; sinh: ',ten);
Write('+Tong
Readln; Thanhso diem: tuổi từ 16 đến 32
niên có',Tongdiem:5:2);
If Dat And (Not Loai) Then
End. Begin Trung niên có tuổi từ 33 đến 50
Write('
Người lớn Duoc
tuổi cólen lop');
tuổi trên 50.
If hocdeu Then Write(' Hoc deu cac mon')
Hướng dẫn: Else Write(' Hoc chua deu cac mon');
End
Else Ta nhận thấy có rất nhiều kết quả tương ứng với các giá trị khác nhau, do
đó taWrite(' Khong
lựa chọn câu duoc len lop');
lệnh Case ... of
Writeln;
Chương trình
Writeln(' minh <Enter>
Bam phim hoạ: de ket thuc');
Readln
End.
Trang 31
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Trang 32
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
1: i:=i+1;
2: i:=i+2;
3: i:=i+3;
end;
Gía trị sau cùng của i là :
a) 2
b) 3
c) 4
d) 5
Câu 5: Cho N là biến nguyên, sau khi thực hiện các lệnh:
N:= 9;
If N< 0 then writeln(‘ So am‘)
else
Case N mod 2 of
0: Writeln(‘ Chan’);
1: Writeln(‘ Le ‘);
end;
Kết qủa in lên màn hình là:
a) Chan
b) Le
c) So am
d) không in gì cả
Câu 6: Cho hàm số:
Trang 33
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
1: i:=i+1;
2: i:=i+2;
3: i:=i+3;
else i:=2*i;
End;
thì gía trị sau cùng của i là :
a) 10
b) 6
c) 8
d) 9
Câu 8: Cho ch biến ký tự, i biến nguyên, sau khi thực hiện các lệnh:
i:= -15;
ch:='E';
Case i of
0..14 : ch:='D';
15..20: ch:='C';
21..24: ch:='B';
else ch:='A';
End;
thì gía trị sau cùng của ch là :
a) 'A'
b) 'B'
c) 'C'
d) 'E'
Câu 9: Cho ch biến ký tự, i biến nguyên. Ðể gán trị cho biến ch, thì lệnh :
Case i of
0,1,2 : ch:='A';
3..8 : ch:='B';
else ch:='C';
end;
tương đương với nhóm lệnh nào :
a) If i<0 then ch:=’C’ b) if (i >= 0) and (i<= 2) then ch:='A';
else if (i>=3) and (i<=8) then ch:='B'
if i<=2 then ch:=’A’ else
Trang 34
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
else ch:='C';
if i<=8 then ch:=’B’
else ch:=’C’ ;
Câu 10: Khi chạy chương trình :
Var S, i : Integer;
Begin
i := 3; S:= 40;
if ( i > 5 ) then S:= 5 * 3 + ( 5 - i ) * 2
else
if ( i > 2 ) then S:= 5 * i
else S:= 0;
End.
Giá trị sau cùng của S là :
a) 0
b) 19
c) 40
d) 15
II. bµi tËp
Bài tập 1:
ViÕt ch¬ng tr×nh tÝnh vµ in ra mµn h×nh gi¸ trÞ lín nhÊt vµ
nhá nhÊt cña 4 sè
Bài tập 2:
Viết chương trình nhập và kiểm tra xem 3 toạ độ 3 điểm A(xa,ya),
B(xb,yb), C(xc,yc) có phải là 3 đỉnh của một tam giác hay không? Nếu đúng là 3
đỉnh của tam giác thì thông báo đó là tam giác loại gì: vuông, cân hay đều?
Hướng dẫn:
- Tính độ dài các cạnh a,b,c là độ dài của vecto BC, AC, AB
- So sánh các cạnh a,b,c với các tính chất của các loại tam giác
Bµi tËp 3:
Nhập một chữ cái, nếu là chữ thường thì đổi thành chữ hoa, ngược lại, nếu
là chữ hoa thì đổi thành chữ thường. Ví dụ : nhập A in ra a, nhập b thì in ra B.
Bài tập 4:
Trang 35
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Bài tập 5:
Viết chương trình giải bất phương trình bậc nhất: ax + b >0
Bài tập 6:
Nhập các hệ số, giải và biện luận các hệ phương trình sau theo quy tắc Cramer :
Bµi sè 7:
Hướng dẫn: Dùng hàm ex và Lnx, xét ba trường hợp x=0, x>0,
x<0).
B¸i sè 8:
ViÕt ch¬ng tr×nh nhập số thực x và tính:
2
y=
3
x −4
B¸i sè 9:
ViÕt ch¬ng tr×nh nhập x thực và tính y theo công thức :
Bái số 10:
Viết chương trình để máy tính nói chuyện với người:
- Mỏy “nói” bằng các câu trên màn hình
- Người “nói” bằng cách gõ từ bàn phím
Nội dung cuộc trò chuyện:
Trang 36
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Máy hỏi “Bạn có gia đình chưa?”, nếu chưa thì khuyên “bạn hãy bình tĩnh
và thận trọng”, nếu có rồi thì hỏi xem có mấy con. Nếu có số con <=2 thì bảo là
“Được đấy”, nếu trên 2 con thì bảo “Nhiều quá”
Bái số 11:
Viết chương trình nhập họ tên một chủ hộ, định mức điện hàng tháng của
hộ, chỉ số điện kế tháng trước và tháng này. Hãy tính tiền điện cho hộ, biết rằng:
Mỗi kw trong định mức có đơn gía là 5đ,
100 kw đầu tiên trên định mức có đơn giá 8đ,
Từ kw thứ 101 trên định mức trở lên có đơn gía 10đ.
B¸i sè 12:
ViÕt ch¬ng tr×nh nhập Họ tên, Chức vụ (giám đốc, trưởng phòng, phó
phòng hay nhân viên - khi nhập gõ tắt là: GD, TP, PP, NV ) và Mức lương tháng
của một người.Tính:
Phụ cấp lương cho ngưới đó như sau :
PC = 50% Mức lương tháng nếu là GD
= 40% " " " TP
= 30% " " " PP
= 20% " " " NV
Tính Tổng thu nhập tháng theo công thức :
TONGTN = Mức lương + PC
In Họ tên,Chức vụ, Mức lương , Phụ cấp và Tổng thu nhập lên
màn hình .
B¸i sè 13:
ViÕt ch¬ng tr×nh tính tiền thuê máy cho một lớp học như sau :
Nhập GBD ( giờ bắt đầu làm) : 6 <= GBD <= 20
Bái số 14:
Trang 37
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Viết chương trình nhập vào một số nguyên từ 1 đến 10 và in ra màn hình nghĩa
tiếng Anh tương ứng. Ví dụ: nhập vào số 2 thì in ra màn hình: 2 => Two
Bái số 15:
ViÕt ch¬ng tr×nh nhập Họ tên, các điểm Toán, Lý, Hóa ( kiểu nguyên )
cho một người. Tính Tổng điểm ba môn :
TONG = TOAN + LY + HOA và phân loại như sau :
Kém : khi TONG= 0, 1, 2, ...,14
Trung bình : khi TONG= 15, 16, ..., 20
Khá : khi TONG= 21, 22, ..., 26
Giỏi : khi TONG 27
In lên màn hình Họ tên, các điểm TOAN, LY, HOA, TONG và
Phân loại.
B¸i sè 16:
Cũng hỏi như bài 10 nhưng phân loại như sau :
TONG <15 :-Loại Kém
15 <= TONG<21 :-Nếu có một môn bị điểm < 5 : loại Kém, không có môn nào bị
điểm<5 : loại Trung bình.
21<= TONG<27 :-Nếu có một môn bị điểm < 7 : loại Trung bình, không có môn
nào bị điểm < 7 : loại Khá.
TONG >= 27 :-Nếu có một môn bị điểm < 9 : loại Khá, không có môn nào bị
điểm < 9 : loại Giỏi.
B¸i sè 17:
ViÕt ch¬ng tr×nh nhập một tháng, cho biết tháng đó thuộc mùa nào (Xuân,
Hạ, Thu, Ðông), biết rằng tháng 2, 3, 4 là mùa Xuân, tháng 5, 6, 7: mùa Hè, tháng
8, 9, 10: mùa Thu, và tháng 11, 12, 1: mùa Ðông.
B¸i sè 18:
ViÕt ch¬ng tr×nh nhập một ký tự bất kỳ, cho biết ký tự đó thuộc loại
nào: là chữ hoa, là chữ thường, là chữ số hay các ký tự khác.
Bµi tËp 19:
Nhập vào tháng và năm, cho biết tháng đó trong năm đó có bao nhiêu ngày.
Híng dÉn:
Theo dương lịch :
Các tháng 4, 6, 9, và 11: có 30 ngày,
Các tháng 1, 3, 5, 7, 8, 10 và 12: có 31 ngày,
Riêng tháng 2 thì bình thường có 28 ngày, nhưng nếu là năm nhuận thì có 29
Trang 38
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
ngày.
Cách xác định một năm là nhuận như sau:
* hoặc là năm chia hết cho 400 (ví dụ năm 1600, năm 2000).
* hoặc là năm không chia hết cho 100 và chia hết cho 4 ( ví dụ các năm
1988, 1992, 1996 đều là năm nhuận).
Trong chương trình ta dùng một biến lôgic có tên là Nhuan để xác định có phải
là năm nhuận hay không.
Bái số 20:
Viết chương trình đọc ngày, tháng năm, sau đó viết ra màn hình đó là ngày thứ
mấy trong tuần
Hướng dẫn:
Sau đây là một cách tính Ngày trong tuần:
Nếu tháng <3 thì tháng:= tháng +12 và Năm: = Năm –1;
Thứ = ABS (Ngày + 2 tháng + 3 (tháng +1) DIV 5 + năm + năm DIV 4)
MOD 7
trong đó Thứ =0 tương ứng với ngày chủ nhật, 1-> thứ Hai ....
Công thức trên chỉ có giá trị từ ngày 1.3.1900. Điều đó cũng đủ để chúng
ta áp dụng trong thực tế. Nào bạn hãy bắt tay vào viết chương trình và thử xem
ngày bạn ra đời là thứ mấy trong tuần!
Trang 39
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Phân tích được cú pháp của câu lệnh lặp xác định và không xác
định
So sánh được điểm giống và khác nhau giữa các dạng l ệnh
Sử dụng thành thạo các câu lệnh l ặp để thể hiện giải thuật
Vận dụng được để viết các chương trình theo yêu cầu
Trang 40
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Sự khác nhau của lệnh WHILE so với FOR là ở chỗ: trong lệnh FOR, biến i
được tự động gán gía trị ban đầu và sau mỗi bước lặp được tự động tăng lên,
còn trong WHILE thì không, ta phải viết các lệnh đó.
Tất cả các bài toán giải quyết được bằng lệnh FOR thì đều giải quyết được
bằng lệnh WHILE. Ðặc điểm chung của các bài toán dạng này là số lần lặp của
các vòng lặp đã được biết trước.
Lệnh WHILE đặc biệt thích hợp với các vòng lặp có số lần lặp chưa biết trước,
trong khi lệnh FOR không giải quyết được. Ðây chính là điểm mạnh của lệnh
WHILE.
3. C©u lÖnh lÆp kh«ng x¸c ®Þnh víi ®iÒu kiÖn sau
- Cú pháp:
REPEAT
<công_việc>
UNTIL <Ðiềukiện> ;
- Ý nghĩa: Chừng nào Ðiềukiện còn sai thì cứ làm <công_việc>, cho đến khi
Ðiềukiện đúng thì không làm <công_việc> nữa mà chuyển sang lệnh kế tiếp ở
phía dưới.
<công_việc> cũng được gọi là thân của vòng lặp REPEAT, nếu nó gồm
nhiều lệnh thì các lệnh đó không cần phải đặt trong khối begin và end.
- Một số lưu ý:
+ Nếu <Ðiềukiện> không bao giờ đúng thì <công_việc> sẽ phải làm liên tục
không dừng, lúc đó ta có vòng lặp vô hạn. Trong trường hợp này, muốn dừng
chương trình, hãy gõ đồng thời hai phím Ctrl và Pause (^Pause).
+ Ðể tránh các vòng lặp vô hạn, trong thân của lệnh REPEAT cần có ít nhất
một lệnh có tác dụng làm biến đổi các đại lượng tham gia trong <Ðiềukiện> để
đến một lúc nào đó thì <Ðiềukiện> sẽ đúng và do đó vòng lặp sẽ kết thúc.
Các vòng lặp có số lần lặp biết trước đều có thể giải được bằng lệnh
REPEAT. Ðặc biệt, cũng như lệnh WHILE, lệnh REPEAT rất thích hợp với các
vòng lặp có số lần lặp không biết trước
+ Vòng lặp này có thể ví như “tiền trảm hậu tấu” hay “làm trước hỏi sau”
- Ví dụ minh hoạ
Ví dụ 1: Ðảm bảo tính hợp lý của dữ liệu nhập từ bàn phím.
+Khi giải phương trình bậc hai Ax2+Bx+C=0, ta thường giả thiết A<> 0, khi
tính S=N!, ta thường yêu cầu N> 0. Sự hạn chế phạm vi đối với các dữ liệu nhập
sẽ đảm bảo tính hợp lý của chúng và làm giảm bớt các phức tạp khi biện luận.
+ Ðể buộc người sử dụng phải nhập A <> 0, nếu nhập A=0 thì bắt nhập lại
cho tới khi nhập A<> 0 mới thôi, ta dùng cấu trúc :
Trang 42
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Repeat
Write(‘Nhập A khác không : ‘);
Readln(A);
Until A<> 0;
Ðể đảm bảo chắc chắn nhập N thỏa điều kiện 0<N<20, ta dùng cấu trúc :
Repeat
Write(‘ Nhập N (0<N<20) : ‘);
Readln(N);
If (N<=0) or (N>=20) then write(#7);
Until (0<N) and (N<20) ;
Lệnh write( chr(7) ) hay write(#7) có công dụng phát ra tiếng kêu bip để cảnh
báo người dùng đã nhập dữ liệu sai yêu cầu.
Trong trường hợp này ta có thể dùng vòng lặp While, nhưng do đặc điểm
của vòng lặp While kiểm tra kiều kiện trước khi lặp, do đó N phải có giá trị trước
vòng lặp. Vì thế, đối với trường hợp này, việc dùng vòng lặp Repeat sẽ hợp lý
hơn.
Ví dụ 2: Thiết kế để chạy nhiều lần một chương trình.
Trong Turbo Pascal, mỗi lần muốn chạy chương trình ta phải gõ cặp phím
Ctrl và F9 (viết tắt là ^F9), điều này sẽ bất tiện nếu cần chạy chương trình nhiều
lần ứng với các bộ dữ liệu thử khác nhau. Cấu trúc sau đây cho phép ta chạy
chương trình một số lần theo ý muốn:
REPEAT
{ Các lệnh của chương trình}
Write(‘ Tiếp tục nữa không (Y/N) ? :’);
Readln(Traloi); {5}
UNTIL (Traloi =‘N’) or ( Traloi=‘n’);
Ở đây, Traloi là một biến kiểu ký tự (Char);
Sau khi thực hiện xong {các lệnh của chương trình }, nếu muốn chạy tiếp
thì ta gõ phím ‘Y ‘ , nếu muốn dừng thì gõ ‘N’ .
Chú ý : lệnh Readln(Traloi); ở dòng thứ {5} có thể thay bằng:
Traloi:=Readkey;
Hàm Readkey thuộc thư viện CRT cho kết qủa là một ký tự gõ từ bàn phím, nó
khác lệnh Readln(Traloi) ở chỗ là khi nhập ký tự ta không cần phải Enter.
So sánh các lệnh For, While và Repeat
+ Lệnh For dùng cho các vòng lặp có số lần lặp đã biết trước
Trang 43
PROGRAM Tinh_tong1; T?nh t?ng c?c b?nh ph??ng c?c s? t? nhi?n <=N
Var N, i : Integer;
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
S : LongInt;
Begin
+ Lệnh While hay Repeat tổng quát hơn lệnh For, dùng được cho tất cả các
Write(‘ Nh?p N :’); Readln(N);
loại vòng lặp, nhưng thường dùng cho các vòng lặp có số lần lặp chưa biết trước.
S:=0;
+ Lệnh
For i:=1 toWhile
N do và Repeat ;khác nhau ở điểm sau: lệnh While kiểm tra điều kiện
S:=S+i*i
trước, nếu‘,đúng
Writeln(‘S= S); mới thực hiện các lệnh ghi trong thân của nó ( <công_việc> ),
Readln;
còn lệnh Repeat thực hiện <công_việc> rồi mới kiểm tra điều kiện. Vì thế, lệnh
End. Repeat sẽ thực hiện các lệnh ghi trong thân của nó ít nhất được một lần.
+ Ngoài ra, lệnh While kết thúc khi điều kiện sai, lệnh Repeat kết thúc khi
điều kiện đúng.
Bài tập 1:
Viết chương trình tính tổng : S= 12 + 22+ 32+...+ N2
Ch¬ng tr×nh minh ho¹:
Ta có thể dùng vòng lặp While hoặc Repeat để tính tổng này. Khi đó các
đoạn lặp thay thế cho câu lệnh For như sau:
I:=1;
While i<=n do begin
S:=S+i*i;
i:=i+1; {thay đổi giá trị biểu thức điều kiện}
End;
hoặc
i:=1;
Repeat
S:=S+i*i;
I:=i+1;
Until (i>n);
Mở rộng bài toán tính tổng: Tính tổng đan dấu :
S = 12 - 22 + 32 - 42 +...+(-1)N-1 N2
Ta viết:
Trang 44
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
S = 12 + (- 22 ) + 32 + (- 42 ) + ... +(-1)N-1 N2
Nhận thấy, số hạng thứ i của vế phải có gía trị tuyệt đối bằng i2 , mang
dấu cộng nếu i lẻ, mang dấu trừ nếu i chẵn. Nói cách khác, ta sẽ cộng dồn i2 vào
S nếu i lẻ, và cộng dồn (- i2 ) vào S nếu i chẵn. Việc xác định i lẻ hay chẵn dựa
vào hàm Odd(i) hay kết qủa của phép toán i Mod 2. Vậy, các lệnh sẽ dùng là :
S:=0;
For i:=1 To N DO
if i mod 2 <> 0 then S:=S+ i*i else S:= S- i*i ;
Các bạn hãy viết chương trình để tính tổng đan dấu này.
Bµi tËp 2
ViÕt ch¬ng tr×nh tính tích: S= 10! .
Híng dÉn:
Ta viết S=1*2*3*...*10.
Qúa trình thực hiện từ bước 1 đến bước thứ 10 được mô tả bằng câu
lệnh For :
For i:=1 to 10 do S:=S * i ;
Một cách tổng quát, để tính tích: S= 1*2*...*N , trong đó N là một số
nguyên dương bất kỳ, ta dùng hai lệnh:
S:=1;
For i:=1 To N DO S:=S* i ;
- Ch¬ng tr×nh minh ho¹:
Trang 45
PROGRAM Tinh_tong2; T?nh S=N!
Var phần cơ sở
Bài tập Pascal Biên soạn: Bộ môn CNPM – UTEHY
N, i : Integer;
S : LongInt;
Begin
Write(‘Nh?p s? d??ng N : ‘); Readln(N);
S:=1;
For i:=1 to N do S:=S * i ;
Writeln(‘Giai thua = ‘, S);
Readln;
End.
Bµi tËp 3:
Nhập số tự nhiên N, dùng lệnh WHILE tính S=N!:
Ch¬ng tr×nh minh ho¹:
0100090000037800000002001c00000000000400000003010800050000000b0
200000000050000000c022005f806040000002e0118001c000000fb021000070
000000000bc02000000000102022253797374656d0005f806000057890000ac
5d110004ee8339e8011c000c020000040000002d01000004000000020101001
c000000fb02ceff0000000000009001000000000440001254696d6573204e657
720526f6d616e0000000000000000000000000000000000040000002d010100
050000000902000000020d000000320a2d0000000100040000000000f8061d0
520001600040000002d010000030000000000
Bµi tËp 4:
ViÕt ch¬ng tr×nh tìm bội số chung nhỏ nhất của hai số nguyên dương M và N.
Híng dÉn:
Bài toán này có những cách giải khác nhau, dưới đây là một cách đơn
giản. Trước hết, hãy xem cách tìm BSCNN của hai số M=5 và N=9.
Vì N>M nên ta sẽ tìm trong tập các bội số của N : { 9, 18, 27, 36, 45, ...} số nhỏ
nhất chia hết cho M, đó là số 45.
Một cách tổng quát, gọi Max là số lớn nhất của M và N. Ðầu tiên ta gán :
BSCNN:=0;
Sau đó cứ làm lệnh BSCNN:=BSCNN+Max ; cho đến khi BSCNN chia hết
cho cả M và N thì dừng.
Trong chương trình ta dùng lệnh repeat để nhập hai số M, N đảm bảo
Trang 46
PROGRAM BSCNN; T?m BSCNN c?a M v? N
Var M,Program
N, Max, BSCNN : Integer;
In_tam_giac; In tam giac can dac
Begin Usesphần
Bài tập Pascal crt; cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Repeat Var m,i,j:integer;
Write(‘
dương. BEGIN
Nh?p M v? N d??ng :’);
clrscr;
Readln(M, N);minh ho¹:
Ch¬ng tr×nh
Until (M>0) and biet
Write('Cho so dong: '); readln(m);
(N>0);
clrscr;
If N>M then Max:=N else Max:=M;
For i:=1 to m do
BSCNN:=0;begin gotoxy(40-i,i);
Repeat For j:=1 to 2*i-1 do write('*');
BSCNN:=BSCNN
writeln; + Max;
Until (BSCNN
end; mod N=0) and (BSCNN mod M=0) ;
Writeln(‘gotoxy(10,24);
B?i s? chung nh?Writeln('An
nh?t= ‘,mot phim; bai ki de ket thuc!');
BSCNN)
Readln;repeat until keypressed;
readln;
End.
END.
Bµi sè 5
Viết chương trình dưới đây cho phép thực hiện một số lần việc : in tam
giác cân đặc có chiều cao m (0<m<20) :
Trang 47
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Trang 48
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
c) 3
d) 4
Câu 5: Cho S và i biến kiểu nguyên. Khi chạy đoạn chương trình :
S:= 0; i:= 1;
while i<= 6 do
begin
S:= S + i;
i:= i + 2;
end;
Giá trị sau cùng của S là :
a) 6
b) 9
c) 11
d) 0
Câu 6: Khi chạy chương trình :
Var S, i : Integer;
Begin
S:= 0; i:= 1;
Repeat
S:= S + i * i;
i:= i + 1;
Until i > 4 ;
End.
Giá trị sau cùng của S là :
a) 0
b) 14
c) 16
d) 30
Câu 7: Cho i là biến nguyên. Khi chạy đoạn chương trình :
i := 5;
Repeat
i := i + 1;
Until i > 4 ;
Giá trị sau cùng của i là :
Trang 49
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
a) 6
b) 4
c) 5
d) 0
Câu 8: Cho m, n, i là các biến nguyên. Khi chạy đoạn chương trình :
m:=4; n:=5; i:=5;
Repeat
i:=i+1;
Until (i Mod m = 0) and (i Mod n = 0);
Giátrị sau cùng của i là :
a) 20
b) 5
c) 4
d) 0
Câu 9: Cho chương trình :
Var A : Real;
Begin
...
While A = 0 do
begin
write ('nhap A # 0:');
Readln (A);
end;
End.
Ðể lệnh Readln(A) được thực hiện ít nhất một lần, phải điền vào chỗ . . . lệnh
nào trong các lệnh dưới đây ? :
a) A:=0;
b) A:=1;
c) A:=-1;
d) A <> 0;
Câu 10: Giảsử các khai báo biến đều hợp lệ. Ðể tính S = 10!, chọn câu nào :
a) S := 1; i := 1; b) S := 1; i := 1;
while i<= 10 do S := S * i; while i<= 10 do i := i + 1;
i := i + 1; S := S * i;
Trang 50
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
c) S := 0; i := 1; d) S := 1; i := 1;
begin begin
S := S * i; S := S * i;
i := i + 1; i := i + 1;
end; end;
Trang 51
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Bài tập 4:
Viết chương trình nhập số n nguyên đảm bảo sao cho n dương. ( Nếu nhập
n <0 thì chương trình phải bắt nhập laị ), rồi tính :
S1 = 12 + 32 + 52 + 72 + ...+ (2n+1)2
(−1)
n −1
1 1 1
S = − + −... +
2 2 2 2 2
2 4 6 2n
Bµi tËp 5:
ViÕt ch¬ng tr×nh nhập một số nguyên dương n . Tính :
Bµi tËp 7:
ViÕt ch¬ng tr×nh nhập số x thực và số n nguyên lớn hơn 1, tính gần
Trang 52
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Bµi tËp 9:
Cho dãy Fibonaci xác đinh như sau:
F0=0, F1=1, Fn = Fn-1 + Fn-2 , với n >= 2
Trang 53
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Mậu, Kỷ, Canh, Tân, Nhâm, Qúy, và có 12 Chi là: Tý, Sửu, Dần, Mão, Thìn, Tỵ,
Ngọ, Mùi, Thân, Dậu, Tuất , Hợi. Hãy viÕt ch¬ng tr×nh nhập vào một năm
dương lịch cho biết năm âm lịch tương ứng, biết rằng năm 1999 là năm Kỷ Mão.
PROGRAM Tên_Chương_Trình;
LABEL (* Khai báo nhãn *);
…
CONST (* Khai báo hằng *);
…
TYPE (* Mô tả và định nghĩa các kiểu cấu trúc dữ liệu mới của người sử dụng *);
…
VAR (* Khai báo các biến *);
…
(*-------------------------------------Các chương trình con--------------------------------------*)
PROCEDURE Tên_Thủ_Tục( Khai báo các tham số nếu cần);
(*Khai báo: Label, Const, Type, Var và thậm chí cả Procedure và Function*)
…
Begin
… (* Thân chương trình con *)
End;
…
(*------------------------------------------------------------------------------------------------------*)
FUNCTION Tên_Hàm( Khai báo các tham số nếu cần): kiểu_dữ_liệu_của_hàm;
(*Khai báo: Label, Const, Type, Var và thậm chí cả Procedure và Function*)
…
Begin
… (* Thân chương trình con *)
End;
(*------------------------------------Thân chương trình chính------------------------------------*)
BEGIN
…
END.
3) Các đặc trưng của hàm:
Các yếu tố đặc trưng cho một hàm gồm có:
- Tên hàm
- Kiểu dữ liệu của các tham số
- Kiểu dữ liệu của gía trị hàm
Ví dụ :
Trang 55
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
- Hàm Sqrt(x): cho căn hai của x. Tên hàm là Sqrt, tham số x là nguyên hay
thực còn gía trị hàm kiểu thực, ví dụ Sqrt(4)=2.0.
- Hàm Readkey : không có tham số, gía trị hàm kiểu ký tự, hàm nhận một ký tự
được gõ từ bàn phím.
Tóm lại, hàm có thể không có tham số hoặc có một đến nhiều tham số, nhưng
hàm luôn trả về một gía trị duy nhất.
Ví dụ:
For k:=1 to 10 do S := S+ Sqrt(k);
y:= 3* Sqr(2) - Sin(pi/4) ;
Write( Chr(65) );
Chú ý Trong hàm không có khai báo sử dụng thư viện chuẩn (Uses).
4) Kiểu dữ liệu của tham số và gía trị hàm:
- Kiểu dữ liệu của kết qủa của hàm không thể là mảng (array), bản ghi (record),
tập hợp (set) hay tập tin (file).
Khai báo hàm như dưới đây là sai:
Function F( x: Integer) : array[1..10] of Real;
- Kiểu dữ liệu của kết qủa của hàm có thể là các kiểu đơn giản, chuỗi, hay con
trỏ. Nếu là kiểu liệt kê, đoạn con hay chuỗi (trừ kiểu String) thì phải định nghĩa
trước thông qua từ khóa Type.
Ví dụ, các khai báo như sau là sai:
Function F( x: Real) : String[20];
Function F( x: Real) : 1..31;
Mà phải định nghĩa kiểu trước :
Type
Str20= String[20];
Ngay = 1..31;
rồi mới khai báo:
Function F( x: Real) : Str20;
Function F( x: Real) : Ngay;
Tuy nhiên, với kiểu String thì khai báo sau là đúng:
Function F( x: Real) : String;
- Kiểu dữ liệu của tham số trong hàm và thủ tục thì không hạn chế. Nhưng nếu
là kiểu chuỗi (trừ kiểu String) hay kiểu tự xây dựng thì phải được định nghĩa trước
bằng từ khóa Type.
Ví dụ, khai báo sau là sai:
Trang 56
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Phân tích: Giả sử đã có hàm Canba(z) tính căn bậc ba của z, tức là :
Trang 57
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Trang 58
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
- Ví dụ minh hoạ:
Viết CTC tính bình phương của một số
Nếu dùng Function, ta có:
Function Binh_phuong (X:real):Real;
Begin
Binh_phuong:=X*X;
End;
Nếu dùng Procedure, ta có:
Procedure Binh_phuong (X:real; Var Kq:Real);
Begin
Kq:=X*X;
End;
Trong cả 2 trường hợp, ta đều có tham số X là tham trị (cung cấp dữ
liệu đầu vào). Nếu dùng Function thì bản thân tên của hàm đã được dùng
làm biến chứa kết quả tính toán. Còn nếu dùng Procedure thì ta phải dùng 2
tham số, trong đó Kq là tham biến (kết quả thu được) dùng để chứa kết quả.
Sau đây, sử dụng để tính tổng bình phương 2 số: c = a2 + b2 trong hai
trường hợp:
Nếu dùng Function:
C:= Binh_phuong(a) + Binh_phuong(b);
Nếu dùng Procedure với biến trung gian Z :
Binh_phuong(a,z); c:=z; {c = a2 }
Binh_phuong(b,z); c:=c+ z; {c = a2 + b2}
Rõ ràng cách dùng Function có lợi hơn trong trường hợp này vì nó có
thể dùng trực tiếp trong biểu thức tính toán.
6. TẦM TÁC ĐỘNG VÀ TRUYỀN THAM SỐ
- Biến toàn cục và biến địa phương :
+ Các biến được khai báo trong chương trình chính gọi là biến toàn cục
(global Variable), chúng dùng được ở mọi nơi kể từ lúc khai báo cho đến khi kết
thúc chương trình.
+ Các biến được khai báo trong một chương trình con gọi là biến địa phương
(local Variable). Các tham số trị hình thức của chương trình con cũng là biến địa
phương. Các biến địa phương chỉ tồn tại trong thời gian chương trình con đang
thực hiện, khi chương trình con thực hiên xong thì các biến địa phương sẽ bị xóa
khỏi bộ nhớ.
* Phạm vi tác dụng của các khai báo :
Trang 59
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Hình 6.1
Ví dụ 7:
Nhập hai ma trận A, B cấp MxN, tính ma trận hiệu C=A-B, in ba ma trận lên
màn hình. Cho biết ma trận nào gồm toàn số 0.
Phân tích: Có bốn việc chính phải làm:
Nhập hai ma trận A và B. Về bản chất, đây chỉ là một loại công việc nên
có thể viết thành một thủ tục để gọi hai lần.
Tính ma trận C=A-B. Ðây là một việc nhưng chuyên biệt có thể viết thành
một thủ tục để chương trình sáng sủa.
In ba ma trận A, B và C. Về bản chất đây chỉ là một loại công việc nên
có thể viết thành một thủ tục và gọi ba lần.
Kiểm tra xem ma trận nào toàn số 0 ? : Câu trả lời là một gía trị lôgic
đúng hay sai (True hay False), vậy phải viết dạng hàm và gọi ba lần
ứng với các đối số là A, B và C.
Rõ ràng nếu không sử dụng thủ tục và hàm thì chương trình trên sẽ viết rất dài
dòng.
- Tham số và truyền tham số
Trong khai báo ở đầu của chương trình con, các tham số hình thức có từ
khóa Var đứng trước gọi là tham số biến, ngược lại, nếu không có từ khóa Var đi
trước thì gọi là tham số trị.
Ví dụ, trong khai báo hàm tính lũy thừa zk, ta viết :
Function Lt(z : Real ; k: Byte) : Real;
thì z và k đều là các tham số trị hình thức .
Còn theo khai báo của thủ tục Doicho :
Procedure Doicho(Var u, v : Real) ;
Trang 60
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Trang 61
PROGRAM
Bài tập Pascal phần cơVIDU1;
sở Biên soạn: Bộ môn CNPM – UTEHY
Uses crt;
Var A,B,C,D:Integer; Z: real;
B/ BÀI TẬP MẪU
------------------------------------------------
Procedure Tieu_de;
Begin
Bài tập 1:
Writeln('********************************');
Viết
Writeln(' trình đọc
chương MINH HOA từng cặp số nguyên
CHUONG TRINH A,B
CON và C,D
'); sau đó tính tỉ số của
từng cặpWriteln('********************************');
và thông báo kết quả ra màn hình.
End;
Hướng dẫn:
------------------------------------------------
Chương trình
Procedure trên được chia
Nhap_Dl(Var thành các công việc nhỏ:
X,Y:integer);
Var OK:char;
+ In ra một số dòng tiêu đề giúp cho người dùng dễ sử dụng
Begin
Repeat
+ Nhập dữ liệu cho từng cặp số nguyên
Write('Tu so = '); readln(X);
+ Tính tỉ số của từng cặp số
Write('Mau so = '); readln(Y);
Chương trìnhWrite('Co sua so lieu khong (Co/khong) ?');
minh hoạ:
OK:=Readkey;
Writeln;
Until (OK='K') or (OK ='k');
End;
0100090000037800000002001c00000000000400000003010800050000000b020
------------------------------------------------
0000000050000000c022005f806040000002e0118001c000000fb02100007000000
Function Chia(X,Y:integer):Real;
Begin
0000bc02000000000102022253797374656d0005f806000057890000ac5d110004
If Y<>0 then Chia:= X/Y
ee8339e8011c000c020000040000002d01000004000000020101001c000000fb02
Else
ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0
Begin
000000000000000000000000000000000040000002d0101000500000009020000
Writeln(#7,'Khong chia duoc vi mau so = 0 ');
Halt; Thu tuc Halt dung chuong trinh lai
00020d000000320a2d0000000100040000000000f8061d0520001600040000002d
End;
010000030000000000
End;
------------------------------------------------
Bài số 2:
Viết chương trình in ra màn hình dãy các ký tự trên nhiều dòng với các màu
chữ khác nhau
Hướng dẫn:
- Các hình thức in và trình bày từng ký tự là giống nhau
- Thao tác in được sử dụng nhiều lần cho từng loại ký tự
Vì thế, ta viết một thủ tục tự tạo bao gồm các câu lệnh thực hiện các công
việc giống nhau, phần khác nhau sẽ được truyền thông qua tham số hình thức
của thủ tục
Chương trình minh hoạ:
0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb0210000700000
00000bc02000000000102022253797374656d0005f806000057890000ac5d1100
Trang 62
Program
Bài tậpChu_vi_Dien_tich;
Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
PROGRAM
Var Pt_bac2;
d,r,p,s:Integer; tiep:Char;
Uses crt;
(*------------------*)
Var a,b,c,delta,x1,x2:real;
PROCEDURE Chuvi(x,y:Integer);
Procedure
Begin Nhap_he_so;
Begin p:=(x+y)*2;
Write('nhap
End; he so a,b,c:');
Repeat
(*------------------*)
readln(a,b,c);
PROCEDURE Dientich(x,y:Integer);
Bài
Begin tập 3then write(' Moi nhap lai: ');
if a=0
Until
s:=x (a<>0)
* y;chương trình tính diện tích và chu vi hình chữ nhật khi biết độ dài 2
Viết
End;
End;
cạnh
Procedure delta_duong;
(*------------------*)
Begin
BEGINHướng dẫn:
Writeln('Phuong
Repeat trinh co 2 nghiem phan biet ');
Bài toán trên
x1:=(-b+sqrt(delta))/(2*a); bao gồm 2 công việc chính: Tính diện tích và tính chu vi. Vì
Writeln('TINH CHU VI, DIEN TICH HINH CHU NHAT');
x2:=(-b-sqrt(delta))/(2*a);
thế ta chia nhỏ thành
Writeln(' Sucác chương
dung trình con tương ứng. Tham số hình thức của
thu tuc');
Writeln('x1
các chương = ',x1:6:2,
con này'x2 = ',x2:6:2);
Writeln('------------------------------------');
trình là các cạnh
End;Write('-Nhap chieu rong: ');
Chương trình
Procedure minh hoạ:
delta_khong;
Readln(r);
Begin Write('-Nhap chieu dai : ');
Writeln('Phuong
BàiReadln(d);
tập 4 trinh co nghiem kep: ');
writeln('x1
Chuvi(r,d); = ',-b/(2*a):6:2);
= x2
Viết chương trình giải và biện luận phương trình bậc hai ax2 + bx + c = 0
End;Dientich(r,d);
Procedure
Writeln;
(trong delta_am;
đó a<>0) (a,b,c được nhập từ bàn phím)
Begin Writeln('+Chu vi hinh chu nhat= ',p);
writeln('phuong
Writeln('+Dientrinh tich vo
hinhnghiem');
chu nhat= ',s);
End; Writeln;
Hướng dẫn:
BEGIN Write(' Co thuc hien tiep khong ? (c/k) ');
clrscr; Nghiệm của phương trình bậc hai tìm được sẽ phụ thuộc vào dấu của biệt
Readln(tiep);
Nhap_he_so;
số delta.
Until Do đó,
(tiep='k') Orta(tiep='K');
sẽ chia thành các chương trình con tương ứng với các trường
END.delta:=
hợp củab*b delta:- 4*a*c;
if delta>0 then delta_duong
else- ifThủ tục delta_duong:
delta<0 then delta_am biệt số delta>0 phương trình có 2 nghiệm phân biệt
- Thủelse delta_khong;
tục delta_khong: delta = 0, phương trình có nghiệm kép
Readln;
END. - Thủ cụ delta_am: delta<0, phương trình vô nghiệm
Chương trình minh hoạ:
Trang 63
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Bµi tËp 1.
LËp ch¬ng tr×nh tÝnh min/max cña hµm sè trªn ®o¹n [a, b] b»ng
c¸ch dïng thñ tôc vµ hµm. C¸c gi¸ trÞ a vµ b ®a tõ bµn phÝm, t×m
min/max tuú chän.
Bµi tËp 2. LËp thñ tôc ®æi c¸c to¹ ®é t¬ng øng cña hai vÐc t¬ a vµ b.
Bµi tËp 3.
Cho hai ®iÓm A(x1,y1) vµ B(x2,y2). LËp hµm tÝnh ®é dµi ®o¹n
AB, dïng hµm nµy ®Ó tÝnh diÖn tÝch tam gi¸c khi biÕt to¹ ®é.
Bµi tËp 4. Sö dông CTC ®Ó viÕt ch¬ng tr×nh gi¶i ph¬ng tr×nh bËc hai
Bµi tËp 5.
LËp thñ tôc kiÓm tra xem 3 ®iÓm A(xa, ya), B(xb,yb), C(xc,yc) cã
th¼ng hµng kh«ng. LËp ch¬ng tr×nh dïng thñ tôc trªn nhËp to¹ ®é n
®iÓm trªn mÆt ph¼ng (n<=L(X), L(X) lµ bËc cña kh«ng gian X) råi
kiÓm tra xem cã ba ®iÓm nµo th¼ng hµng. §a c¸c ®iÓm nµy ra mµn
h×nh.
Bài tập 6.
Viết chương trình tính tổng:
S= 1! + 2! + 3! + ... +n! (với n<=13)
Trong đó n nhập từ bàn phím
Hướng dẫn:
Viết hàm Giaithua(k) để tính từng số hạng
Bài tập 7.
Viết chương trình vẽ một đường thẳng đứng (bằng ký tự *) có chiều dài 5
tại cột 4 và cho di chuyển đến cột 20
Hướng dẫn:
- Viết thủ tục Insao(x,y) để in ra màn hình dấu “*’ ở tạo độ x,y
- Dùng hàm gotoxy(x,y): di chuyển con trỏ màn hình đến cột x, hàng y
Trang 64
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Trang 65
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Mảng thứ ba tên là B, gồm 4 phần tử cùng kiểu Integer ứng với các chỉ số
‘a’, ‘b’, ‘c’, ‘d’:
B[‘a’], B[‘b’], B[‘c’], B[‘d’]
- Cách 2 : Khai báo qua một kiểu dữ liệu mới, gồm hai bước:
Bước 1: Ðịnh nghĩa kiểu dữ liệu mảng :
TYPE
Tênkiểumảng = Array[m1 . . m2] of Tênkiểudữliệu;
Bước 2: Khai báo biến có kiểu dữ liệu là kiểu mảng:
VAR
Tênmảng : Tênkiểumảng ;
Ví dụ, đối với các mảng A, B và Hten ở trên ta có thể khai báo theo cách 2, như
sau:
Type
Mang1 = array[0..10] of Real;
Mang2 = array[1..5] of String[18];
Mang3 = array[‘a’..’d’] of Integer;
Var
A : Mang1;
Hten: Mang2;
B: Mang3;
+Khai báo mảng có gán trị ban đầu:
Pascal cho phép vừa khai báo mảng vừa gán gía trị ban đầu cho các phần tử
mảng, chẳng hạn như dưới đây:
Const
X : array[1..5] of Integer = (12, 14, 16, 18, 20) ;
Khi đó X là một mảng gồm 5 phần tử cùng kiểu nguyên và có giá trị X[1]=12,
X[2]=14, X[3]=16, X?4]=18, X[5]=20.
Mặc dù từ khóa ở đây là Const song X lại được dùng như là một biến mảng,
tức là các phần tử của X có thể thay đổi gía trị được. Ví dụ, trong chương trình ta
có thể gán:
X[1]:= 2;
X[2]:=5+20;
* Truy xuất các phần tử mảng:
Các xử lý trên mảng được quy về xử lý từng phần tử mảng. Ðể xác định một
phần tử của mảng, ta dùng cách viết :
Trang 66
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Trang 67
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Trang 72
PROGRAM Tong_mt; T?nh t?ng hai ma tr?n
Program Ma_tran1;
Uses Uses
CRT; crt;For i:=1 to m do
BàiVar
tập Pascal
A,phần For
B, Ccơ:sở j:=1 to n do
Array[1..10, 1..10] of Real; Biên soạn: Bộ môn CNPM – UTEHY
Type
i, j , N, M begin
Matran = :Array[1..30,1..30]
Integer; of real;
dữ liệu với các phần tửwrite('A[',i,',',j,']=
của mảng A. ');
Begin Var
readln(a[i,j]);
tập 4:A: matran;
BàiClrscr;
end;
Repeat i,j,m,n:integer;
Viết clrscr;
chương trình nhập vào ma trận A có n hàng, m cột các phần tử là số
BEGIN
Write(‘Nh?p
thực. Đưaclrscr; s?
A rah?ng
màn N,
Writeln('Ma
ma trận s? các
tran
hình, c?t
A nhuM
số :liệu
‘); được
sau: '); Readln(N,
nhập từ bànM);
phím
UntilWrite('So For
( N>0) and i:=1
( to
N<11) m do
and ( M>0) and (M<11);
Chương trình minh hang
hoạ: cua ma tran A, m= '); readln(m);
For i:=1 to Nbegin
Write('So do
cot cua ma tran A, n= '); readln(n);
For j:=1 to MFor
Writeln('Nhapdoj:=1 cactophan
n do tuWrite(A[i,j]:8:1);
cua A: ');
Writeln;
begin
end;
Write(‘Nh?p A[‘ , i, ‘,’ , j , ‘]: )
readln; Readln(A[i,j]);
end; END.
Bài tập 5:
Viết chương trình nhập vào hai ma trận A, B cấp NxM. Tính ma trận C là
tổng của hai ma trận A và B, in ma trận C lên màn hình.
Hướng dẫn:
Công thức tính các phần tử của ma trận C= A+B :
C[i,j ] = A[i, j] + B[i, j] với i=1,..., N, và j=1,..., M
Chương trình minh hoạ:
0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb0210000700000
00000bc02000000000102022253797374656d0005f806000057890000ac5d1100
04ee8339e8011c000c020000040000002d01000004000000020101001c000000fb
02ceff0000000000009001000000000440001254696d6573204e657720526f6d61
6e0000000000000000000000000000000000040000002d0101000500000009020
00000020d000000320a2d0000000100040000000000f8061d0520001600040000
002d010000030000000000
Bài tập 6:
Tìm số lớn nhất (số nhỏ nhất) trong ma trận A:
Hướng dẫn:
Trang 73
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Giả sử A là ma trận N hàng, M cột, và Max là biến chứa số lớn nhất phải
tìm. Khởi đầu ta gán A[1,1] cho Max, sau đó duyệt tất cả các phần tử của ma
trận, nếu phần tử nào lớn hơn Max thì lưu nó vào Max, tức là:
Max:=A[1,1];
For i:=1 to N do
For j:=1 to M do
if Max< A[i, j] then Max:=A[i, j];
Writeln(‘ Số lớn nhất là ’, Max);
Ðếm trong dãy có bao nhiêu số dương, bao nhiêu số âm, bao nhiêu số 0 ? Loại
nào nhiều nhất ?
Bài tập 3:
Viết chương trình nhập một dãy số nguyên x1, x2, ..., xn. In riêng các số chẵn và
các số lẻ, mỗi loại trên một dòng.
Bài tập 4:
Viết chương trình nhập một số nguyên dương N, xây dựng dãy số nguyên x0,
Trang 74
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
x1, ..., xn trong đó xi là số Fibonaci thứ i: x0=1, x1=1, xi =xi-1 + xi-2 với mọi i > 2. In
dãy x lên màn hình.
Bài tập 5:
Viết chương trình nhập một dãy số x1, x2,..., xn. Tính :
Bài tập 6:
Viết chương trình nhập một dãy số bất kỳ x1, x2,..., xn.
Bài tập 7:
Viết chương trình nhập hai dãy số bất kỳ x1, x2,..., xn và y1, y2,..., yn. Xây dựng dãy
thứ ba z1, z2, .., zn là tổng của hai dãy trên (zi= xi + yi), in ba dãy lên màn hình, mỗi
dãy trên một dòng.
Bài tập 8:
Viết chương trình cho hai đa thức :
Pn(x) = anxn + an-1 xn-1 + ...+ a1 x + a0 (an 0 )
Bài tập 9:
Viết chương trình nhập x thực, n nguyên dương và một mảng các hệ số a0,
a1, ..., an , rồi tính gía trị của đa thức :
Ví dụ :
P = 2x4 + 3x3 - 4x2 +7x + 9
= (((2x + 3)x - 4 )x + 7)x + 9 .
Bài tập 10:
Trang 75
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Viết chương trình nhập một dãy số bất kỳ x1, x2,..., xn , cho biết dãy có đối
xứng không?, dãy có lập thành một cấp số cộng không?. Ví dụ dãy 1 3 5 4 5 3 1 là
đối xứng, dãy 1 3 5 7 là một cấp số cộng.
Bài tập 11:
Viết chương trình nhập một dãy số bất kỳ x1, x2,..., xn , cho biết dãy thuộc
loại nào: tăng, giảm hay không tăng, không giảm ?
Tách dãy x thành hai dãy: dãy A gồm các số chẵn, dãy B gồm các số lẻ,
sắp xếp dãy A tăng dần, dãy B giảm dần, in hai dãy A và B trên hai dòng
khác nhau.
Nối hai dãy A và B theo thứ tự đó thành một dãy duy nhất và gán trở lại vào dãy
x, in dãy x.
Ví dụ nhập dãy x={ 5, 7, 0, 2, 1, 6, 4, 9 } thì dãy A={ 0, 2, 4, 6}, dãy B={ 9, 7, 5,
1}, và x={ 0, 2, 4, 6, 9, 7, 5, 1}.
Bài tập 13:
Viết chương trình nhập hai số m, n và hai ma trận Am,n và Bm,n . In các ma
trận A, B, C=A+2B và D=A-B lên màn hình.
Bài tập 14:
Viết chương trình:
Trang 77
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Trang 78
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Khi đó St là biến chuỗi có độ dài tối đa là 17 ký tự, còn biến Diachi có độ dài
tối đa là 255 ký tự.
Cần phân biệt độ dài với độ dài tối đa của biến chuỗi: độ dài tối đa được xác
định ngay khi khai báo là khả năng có thể chứa của biến chuỗi, còn độ dài của
chuỗi là số ký tự đang thực có trong chuỗi.
Nếu gán:
St := ‘Nguyen Thi Mai’;
Diachi := ‘Quan 1, Thanh pho Ho Chi Minh’;
thì biến St có độ dài là 14 ký tự, mặc dù khả năng nó có thể chứa tới 17 ký tự.
Tương tự, biến Diachi có độ dài là 29 ký tự còn độ dài tối đa cho phép là 255.
Khi gán cho biến chuỗi một hằng chuỗi dài hơn độ dài tối đa của nó thì các ký
tự thừa sẽ bị bỏ qua.
Ví du, nếu gán:
St := ‘Quan 1, Thanh pho Ho Chi Minh’;
thì gía trị của biến St sẽ là St=‘Quan 1, Thanh pho’.
Turbo Pascal có sẵn hàm Length(chuỗi) cho ngay độ dài thực của chuỗi mà
không cần phải dùng đến byte 0. Ví dụ :
Length(St)=14.
Chú ý Cũng có thể khai báo chuỗi thông qua việc định nghĩa một kiểu dữ liệu
mới bằng từ khóa Type. Chẳng hạn có thể khai báo chuỗi St nói trên theo cách
sau:
Type
KStr17 = String[17];
Var
St : KStr17 ;
Khi một biến chuỗi được dùng làm đối số của hàm hay thủ tục thì nó cần phải
được khai báo theo cách này ( trừ các biến chuỗi có kiểu String ).
2. Truy nhập vào từng phần tử của chuỗi :
- Giống như mảng, mỗi phần tử của chuỗi được truy nhập thông qua tên chuỗi
và chỉ số của phần tử.
Gọi N =Length(St), khi đó ký tự thứ i (i=1, 2, ..., N) của St được ký hiệu là
St[i].
- Ví dụ, cho :
St :=‘ABC’;
thì N=3 và St[1]=‘A’, St[2]=‘B’, St[3]=‘C’.
Lệnh St[1]:=‘a’; sẽ biến đổi St thành St=‘aBC’.
Trang 79
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Như vậy mỗi ký tự St[i] được dùng như một biến kiểu ký tự, và chuỗi có thể
xem là một mảng các ký tự. Chẳng hạn để in chuỗi ta có thể in từng ký tự như
sau:
For i:=1 to Length(St) do write(St[i]);
Ðiều này cho thấy chuỗi là một kiểu dữ liệu có tính cấu trúc.
Nhưng mặt khác, mỗi chuỗi lại có thể xem là một gía trị duy nhất, vì có thể nhập
và in chuỗi trực tiếp bằng các lệnh:
Readln(St);
Write(St);
Ðặc điểm này cho thấy chuỗi còn là một kiểu dữ liệu có tính đơn giản.
3. Các thao tác trên chuỗi :
+ Phép cộng (nối) chuỗi:
Khi cộng hai chuỗi, ta được một chuỗi mới gồm các ký tự của hai chuỗi
ban đầu ghép lại.Ví dụ :
‘tin’ + ‘hoc’ =‘tinhoc’
‘1234’+ ‘5678’ = ‘12345678’
+ Phép so sánh chuỗi:
Khi so sánh hai chuỗi, ta so sánh từng cặp ký tự của hai chuỗi từ trái qua
phải. Nếu phát hiện ra một cặp ký tự khác nhau thì chuỗi nào chứa ký tự
nhỏ hơn sẽ nhỏ hơn. Ví dụ:
‘Hong’ > ‘Han’ vì ‘o’ > ‘a’
‘thanh’ > ‘thao’ vì ‘n’ > ‘o’
Nếu so sánh hết chiều dài của chuỗi ngắn hơn mà không có cặp nào khác
nhau thì chuỗi ngắn hơn sẽ nhỏ hơn, ví dụ:
‘an’ < ‘anh’
‘chu’ < ‘chung’
Hai chuỗi bằng nhau khi chúng cùng độ dài và các ký tự ở các vị trí tương
ứng thì bằng nhau.
4. Các hàm liên quan đến chuỗi :
+ Hàm Length(St) : cho độ dài của chuỗi St.
Ví dụ: Length(‘ABCD’)=4 vì chuỗi ‘ABCD’ có 4 ký tự.
Chuỗi rỗng có độ dài bằng 0.
+Hàm Pos(S, St):
Cho vị trí đầu tiên tìm thấy chuỗi S trong chuỗi St, nếu không tìm thấy thì
hàm cho kết qủa bằng 0.
Trang 80
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Ví dụ:
Pos(‘Ab’, ‘cdAb3Abm’) = 3,
Pos(‘Ab’, ‘1bA3b’) = 0.
+ Hàm Copy(St, k, m) : cho m ký tự của St tính từ vị trí k.
Ví dụ: Copy (‘ABCDEF’, 4, 2) =‘DE’.
Nếu k> Length(St) thì kết qủa sẽ là một chuỗi rỗng
Nếu m> số ký tự đứng sau kể từ vị trí k thì hàm Copy chỉ lấy các ký tự từ vị
trí k đến hết chiều dài của St, ví dụ :
Copy (‘ABCD’, 3, 10) = ‘CD’
+Hàm Concat( St1, St2, ..., Stn) :
Ghép nối các chuỗi St1, St2, ..., Stn theo thứ tự đó thành một chuỗi duy
nhất. Vậy :
Concat( St1, St2, ..., Stn) = St1+St2+...+Stn.
5. Các thủ tục liên quan đến chuỗi :
+ Thủ tục Delete(St, k, m) :
Xóa m ký tự trong biến chuỗi St bắt đầu từ vị trí thứ k. Ví dụ, sau khi thực
hiện các lệnh:
St:=‘ TurboPascal’;
Delete(St, 1, 5);
thì gía trị của St=‘Pascal’ vì 5 ký tự đầu đã bị xóa.
Nếu k > Length(St) thì không xóa gì cả.
Nếu m > số ký tự đứng sau kể từ vị trí k thì xóa hết từ vị trí k đến cuối
chuỗi.
Ví dụ, sau khi thực hiện ba lệnh :
St:=‘Turbo Pascal’;
Delete(St, 10, 20);
Write(St);
thì in ra chữ Turbo Pas vì St đã bị xóa đi 3 ký tự cuối nên chỉ còn
St=‘Turbo Pas’.
+ Thủ tục Insert(S, St, k) :
Chèn chuỗi S vào biến chuỗi St tại vị trí k. Ví dụ, cho :
St:=‘ABCD’;
Sau khi thực hiện lệnh:
Insert(‘**’, St, 3);
thì St bị biến đổi thành St=‘AB**CD’.
Trang 81
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Nếu k> Length(St) thì S được nối vào cuối của St. Ví dụ, sau khi thực hiện
hai lệnh :
St:=‘XYZ’;
Insert(‘ABC’, St, 6);
thì St=‘XYZABC’.
+ Thủ tục Str(x, St):
Biến đổi số nguyên hay thực x thành kiểu chuỗi và gán cho biến chuỗi St.
Ví dụ, sau khi thực hiện lệnh :
Str(4752, St);
thì kết qủa là St= ‘4752’.
Số x có thể được định dạng như khi in ra màn hình.
Lệnh Str(4752 : 6, St);
cho kết qủa St=‘ 4752’ (trước số 4752 có 2 ký tự trắng) .
Nếu x là biến thực và gía trị của x=34.95 thì lệnh : Str(x:7:3,St);
cho kết qủa St=‘ 34.950’ (trước số 34.950 có 1 ký tự trắng) .
+ Thủ tục Val(St, x, k ):
Biến đổi chuỗi số St thành số nguyên hay thực và gán cho biến nguyên
hay thực x. Số nguyên k dùng để phát hiện lỗi: nếu đổi được thì k=0,
ngược lại, gía trị của k là vị trí có lỗi trong chuỗi St.
Ví dụ, cho ba biến n, k, j kiểu nguyên và biến x kiểu thực, sau khi thực hiện
các lệnh :
St:=‘385’;
Val(St, n, j);
Val(‘12.59’, x, k);
thì n=385, j=0, x=12.59 và k=0.
Nếu gán St := ‘3a7’; và thực hiện lệnh:
Val(St, n, k);
thì gía trị của n không xác định còn k=2 là vị trí của chữ a trong chuỗi St,
tại đó không đổi ra số được.
Trang 82
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
k:=Pos(‘ ‘, St);
end;
Bài tập 3:
Đếm trong chuỗi St có bao nhiêu chữ pascal.
Hướng dẫn:
Vì chữ pascal có 6 ký tự, nên ta so sánh từng cụm 6 ký tự của St với chuỗi
pascal, bắt đầu từ vị trí 1:
Dem:=0;
For i:=1 to Length(St) do
if Copy (St, i, 6) =‘pascal’ then Inc(Dem);
Writeln(‘ Số chữ pascal là ‘ , Dem);
Bài tập 4:
Tìm kiếm và thay thế.
Tìm trong chuỗi St xem có chứa chữ ‘basic’ không, nếu có thì thay bằng
chữ ‘pascal’, nếu không có thì in câu ‘không có’. Ví dụ St=‘ngon ngu basic duoc
dung pho bien’, sau khi thay thế ta được St = ‘ngon ngu pascal duoc dung pho
bien’.
Hướng dẫn:
Ta dùng hàm Pos để tìm xem trong St có chứa chữ ‘basic’ không. Thủ tục
Delete sẽ xóa chuỗi ‘basic’ khỏi St, và thủ tục Insert sẽ chèn chuỗi ‘pascal’ vào St
tại vị trí đang xét:
Bài tập 5
Viết chương trình in ra mã ASCII của các ký tự từ ‘a’..’z’
Hướng dẫn:
Dùng hàm Ord(ch): lấy mã của ký tự ch
Chương trình minh hoạ:
0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb02100007000000
0000bc02000000000102022253797374656d0005f806000057890000ac5d110004
ee8339e8011c000c020000040000002d01000004000000020101001c000000fb02
ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0
000000000000000000000000000000000040000002d0101000500000009020000
00020d000000320a2d0000000100040000000000f8061d0520001600040000002d
0100000300000000000100090000037800000002001c000000000004000000030
Trang 84
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Trang 86
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
m¶ng
Sö dông ®îc kiÓu d÷ liÖu m¶ng ®Ó gi¶i quyÕt c¸c xö lý th-
¬ng gÆp: nhËp m¶ng, in m¶ng; t×m kiÕm, ®æi chç, s¾p
xÕp c¸c phÇn tö; thªm, bít phÇn tö; tÝnh to¸n trªn c¸c phÇn
tö
Trang 87
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Ví dụ 2:
Ta mô tả thời gian là kiểu KDATE có ba trường ngày , tháng, năm như sau:
TYPE
KDATE = RECORD
Ngay : 1..31;
Thang : 1..12;
Nam : Integer;
End;
2. Sử dụng bản ghi :
Kiểu bản ghi sau khi đã được định nghĩa có thể dùng khai báo cho các biến.
Ví dụ :
Var
X, Y, Z : KSVIEN;
Trong đó KSVIEN là bản ghi đã mô tả ở phần trên.
Theo khai báo này, X ,Y và Z là ba biến kiểu bản ghi KSVIEN, mỗi biến đều có
5 trường Hoten, Maso, Toan, Ly và DTB.
Ðể thâm nhập vào một trường của bản ghi ta viết tên biến kiểu bản ghi, sau đó
là dấu chấm ‘.’ và tên trường, tức là :
Tênbiến .Têntrường
Các lệnh dưới đây gán gía trị cho từng trường của biến X :
X.Hoten :=‘Nguyen Van An’;
X.Maso :=‘1973208’;
X.Toan :=8.0;
X.Ly :=7.0;
X.DTB :=(X.Toan+X.Ly)/2;
Ðể nhập dữ liệu cho trường Hoten của biến Y, ta viết:
Write(‘Nhap ho ten sinh vien Y : ‘);
Readln(Y.Hoten);
Ðối với các bản ghi lồng nhau, cách truy xuất đến từng trường cũng tương tự.
- V í d ụ minh ho ạ:
Ví dụ: Cho khai báo biến S kiểu KSACH:
Var S : KSACH ;
Ðể truy nhập đến các trường Ngay, Thang, Nam của Ngay_muon ta viết :
S.Ngay_muon.Têntrường
Chẳng hạn gán :
S.Ngay_muon.Ngay := 2;
S.Ngay_muon.Thang := 9;
S.Ngay_muon.Nam := 1999;
Hai biến bản ghi cùng kiểu có thể gán cho nhau. Lệnh :
Y:=X;
gán gía trị của từng trường của biến X cho trường tương ứng của biến Y. Vậy
lệnh trên tương đương với khối 5 lệnh sau :
begin
Y.Hoten :=X.Hoten;
Y.Maso :=X.Maso;
Y.Toan :=X.Toan;
Y.Ly :=X.Ly;
Y.DTB :=X.DTB;
end;
Các bản ghi có thể so sánh bằng nhau hoặc khác nhau:
- Câu lệnh WITH :
Trang 88
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Khi làm việc với nhiều trường của một biến bản ghi thì cách thâm nhập ở trên tỏ
ra rườm rà vì phải viết nhiều lần tên biến trước tên trường.
Ðể đơn giản cách viết, Pascal đưa ra câu lệnh :
WITH Tênbiến DO LệnhP;
Tên biến thuộc kiểu bản ghi.
Nếu LệnhP có truy xuất đến các trường của Tên biến thì không cần phải viết
Tên biến và dấu chấm trước các tên trường.
Ví dụ, thay vì viết:
X.Hoten:= ‘Nguyen Van An’;
ta có thể viết :
WITH X DO Hoten:= ‘Nguyen Van An’;
Ðể in các trường của biến X lên màn hình, ta viết:
WITH X DO
Begin
Writeln(‘ Họ và tên :’ , Hoten);
Writeln(‘ Mã số sinh viên :’ , Maso);
Writeln(‘ Ðiểm Toán :’ , Toan: 4:1);
Writeln(‘ Ðiểm Lý :’ , Ly: 4:1);
Writeln(‘ Ðiểm trung bình : ‘ , DTB :4:1);
End;
Tất cả các tên trường nằm trong khối begin và end được hiểu là các trường
của biến X (nếu không ghi rõ tên biến nào khác).
Các lệnh sau gán các gía trị cho các trường của biến S kiểu KSACH là một bản
ghi lồng nhau:
WITH S DO
begin
Ma_so_sach:=‘TH-435’;
Ten_doc_gia:=‘Nguyen van Mai’;
Nam_xban :=1999;
Gia_tien:= 15000;
WITH Ngay_muon DO
begin
Ngay:=2;
Thang:=9;
Nam:=1999;
end;
end;
- Mảng các bản ghi :
Trong thực tế, ta thường phải quản lý một danh sách sinh viên của một lớp, một
danh sách các quyển sách trong thư viện. Ví thế mảng các bản ghi được dùng rất
phổ biến.
Khi khai báo :
VAR DS : Array[1..50] of KSVIEN;
hoặc :
TYPE
KMang = Array[1..50] of KSVIEN;
VAR DS: KMang;
thì ta có một mảng DS gồm 50 phần tử DS[1],..., DS[50] cùng kiểu bản ghi
KSVIEN. Mỗi DS[i], i=1,..., 50 là một bản ghi có 5 trường Hoten, Maso, Toan, Ly,
DTB lưu trữ các thông tin về sinh viên thứ i trong danh sách.
Ðể nhập dữ liệu ( Hoten, Maso, Toan, Ly ) rồi tính Ðiểm trung bình cho 50 sinh
viên này, ta dùng vòng lặp For phối hợp với câu lệnh WITH :
Trang 89
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
For i:=1 to 50 do
WITH DS[i] DO
begin
Write(‘Nhap ho ten sinh vien thu ‘,i,’ : ‘); Readln(Hoten);
Write(‘Nhap ma so sinh vien thu ‘,i,’ : ‘); Readln(Maso);
Write(‘Nhap điểm Toan, Ly sinh vien thu ‘,i,’ : ‘);
Readln(Toan, Ly);
DTB:=(Toan + Ly)/2;
end;
Ðể sắp xếp danh sách sinh viên theo trật tự giảm của DTB sao cho người có
DTB cao thì đứng trước, người có DTB thấp thì đứng sau, ta có thể áp dụng
phương pháp sắp xếp mảng, song chỉ lấy trường DTB làm tiêu chuẩn so sánh:
For i:=1 to 49 do
For j:=i+1 to 50 do
If DS[i].DTB < DS[j].DTB then
begin { Ðổi chỗ DS[i] và DS[j] }
Z:=DS[i];
DS[i]:=DS[j];
DS[j]:=Z;
end;
Ở đây Z là biến bản ghi cùng kiểu với các phần tử DS[i].
Khi sắp xếp theo DTB tăng hoặc giảm thì trường DTB được gọi là "khóa"
( key) sắp xếp.
Một cách tương tự, có thể sắp xếp danh sách sinh viên theo khóa là điểm Toan,
hoặc điểm Ly, hoặc Maso, hoặc theo Hoten.
Ðể in danh sách đã sắp xếp lên màn hình, ta dùng lệnh :
For i:=1 to 50 do WITH DS[i] DO
Writeln( i:2, Hoten:25, Maso:9 , Toan:5:1, Ly:5:1, DTB:5:1);
Bài tập 1:
Nhập vào một chuỗi St , cho biết trong St có những chữ hoa nào. Ví dụ St =
‘ABc3BAFdzA’ thì có các chữ hoa là A, B, F.
Ch ư ơng tr ình minh ho ạ:
0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb0210000700000
00000bc02000000000102022253797374656d0005f806000057890000ac5d1100
04ee8339e8011c000c020000040000002d01000004000000020101001c000000fb
02ceff0000000000009001000000000440001254696d6573204e657720526f6d61
6e0000000000000000000000000000000000040000002d0101000500000009020
00000020d000000320a2d0000000100040000000000f8061d0520001600040000
002d010000030000000000
Trang 90
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Bài tập 2.
Viết chương trình nhập một danh sách sinh viên lớp Z gồm họ tên, năm
sinh, điểm thi vào trường (gồm điểm toán, lý, hoá). In danh sách này ra màn hình.
0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb02100007000000
0000bc02000000000102022253797374656d0005f806000057890000ac5d110004
ee8339e8011c000c020000040000002d01000004000000020101001c000000fb02
ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0
000000000000000000000000000000000040000002d0101000500000009020000
00020d000000320a2d0000000100040000000000f8061d0520001600040000002d
010000030000000000
Bài tập 1:
Nhập một chuỗi St, xây dựng ba tập hợp:
Trang 91
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Bµi tập 5
LËp tr×nh ®äc vµo m¸y mét danh s¸ch N sinh viªn vµ ®iÓm thi
m«n tin häc tõ bµn phÝm råi ®a ra mµn h×nh c¸c sinh viªn kh«ng
®¹t(díi ®iÓm 5) kÌm theo ®iÓm. BiÓu mÉu ®a ra cã d¹ng :
Bµi tập 6:
LËp mét ch¬ng tr×nh nhËp tõ bµn phÝm danh s¸ch sinh viªn gåm:
Hä vµ tªn, N¨m sinh. §a ra mµn h×nh hä vµ tªn sinh viªn lín tuæi nhÊt.
Bµi tập 7:
LËp ch¬ng tr×nh nhËp tõ bµn phÝm danh s¸ch sinh viªn bao gåm:
Hä vµ tªn, N¨m sinh, Giíi tÝnh, Quª qu¸n. §a ra mµn h×nh danh s¸ch c¸c
Trang 92
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Bµi tập 9:
Mét tam gi¸c ®ù¬c xem nh mét tËp hîp gåm ba ®iÓm trªn mÆt
ph¼ng. H·y tæ chøc d÷ liÖu kiÓu b¶n ghi ®Ó chøa c¸c to¹ ®é cña tam
gi¸c. LËp ch¬ng tr×nh lµm c¸c c«ng viÖc sau:
a) NhËp mét tam gi¸c tõ bµn phÝm
b) KiÓm tra xem tam gi¸c cã tÝnh chÊt g× trong c¸c tÝnh chÊt
sau:
+ Tam gi¸c ®iÒu
+ Tam gi¸c vu«ng
+ Tam gi¸c cã mét gãc t
Bµi tập 10:
Cho mét danh s¸ch hµng ho¸ gåm tªn mÆt hµng, sè lîng, ®¬n gi¸,
thµnh tiÒn.
LËp ch¬ng tr×nh thùc hiÖn c¸c viªc sau:
a) NhËp d÷ liÖu tõ bµn phÝm, kÕt thóc nhËp khi tªn mÆt
hµng="/" vµ sè mÆt hµng kh«ng vît qu¸ 200.
b) §a ra mµn h×nh tªn vµ sè lîng cña c¸c mÆt hµng cã sè lîng nhá
nhÊt.
c) §äc thªm mét hµng míi (tªn, sè lîng, ®¬n gi¸) chÌn mÆt hµng
nµy vµo dßng thø k, víi k ®äc tï bµn phÝm.
d) TÝnh tæng gi¸ trÞ hµng ho¸ cã trong danh s¸ch.
Trang 93
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
®Õn kh¸m bÖnh, nh©n viªn ®ãn tiÕp ph¶I nhËp th«ng tin bÖnh nh©n
vµo m¸y tÝnh bao gåm c¸c th«ng tin:
Ho_va_ten: String[50]; (hä vµ tªn)
Tuoi : Integer; (Tuæi bªnh nh©n)
Gioi_tinh : String[5]; (Nam/n÷)
Que_quan : String[50]; (Quª qu¸n)
Phong_kham : Integer; (phßng kh¸m sè: 1, 2, 3)
LËp ch¬ng tr×nh lµm c¸c c«ng viÖc sau:
a) NhËp th«ng tin bÖnh nh©n tõ bµn phÝm, kÕt thóc nhËp
khi ho_va_ten ='/'.
b) §a ra mµn h×nh danh s¸ch bÖnh nh©n ®Õn kh¸m (tªn,
tuæi, giíi tÝnh, quª qu¸n) cña c¸c phßng kh¸m 1, 2, 3.
Trang 94