1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Lập trình bằng Turbo Pascal part 3 pptx

28 502 1
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 28
Dung lượng 283,69 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Các ngôn ngữ lập trình nói chung vμ Turbo Pascal nói riêng, đều cho phép người sử dụng có thể định nghĩa các kiểu dữ liệu mới phù hợp với bμi toán của mình.. Chỉ sau khi khai báo kiểu dữ

Trang 1

3- Điểm khác nhau căn bản hơn giữa While vμ Repeat - Until cần nắm vững để vận dụng đúng tình huống lμ như sau Trong cấu trúc Repeat - Until, phần câu lệnh đựơc thực hiện trước rồi mới kiểm tra điều kiện sau Trái lại trong cấu trúc While, điều kiện được kiểm tra trước, nếu đúng mới thực hiện lệnh Do đó nếu dùng Repeat - Until thì phần câu lệnh được thực hiện ít nhất

lμ một lần, còn với While có thể câu lệnh không được thực hiện lần nμo

6.2 Ví dụ minh hoạ

Ví dụ 1: Tổng n số hạng đầu tiên của chuỗi điều hoμ lμ S = 1+1/2

+1/3 + + 1/n Hỏi n nhỏ nhất phải lμ bao nhiêu để S vượt quá một

cho đến khi đạt độ chính xác epsilon cho trước So sánh với kết quả nhận

được khi dùng hμm chuẩn sin(x) của Turbo Pascal

uses crt;

var eps,x,y,s: real;

i, sign: integer;

BEGIN clrscr;

write(' Cho do chinh xac eps= '); readln(eps);

write(' Cho x= '); readln(x);

Trang 2

sign:= -sign;

end;

writeln(' Sin(x) = ',y:1:5);

write(' Sai khac voi ham chuan sin(x) cua TurboPascal

la = ', y-sin(x):0:5);

readln;

END

7 Xây dựng cấu trúc lặp

Phần nμy sẽ trình bμy một số mẫu hình xây dựng các cấu trúc lặp để

xử lí các tình huống hay gặp nhất

7.1 Điều khiển vòng lặp bằng giá trị canh chừng

Ví dụ: Viết chương trình để nhập vμo vμ cộng tích luỹ để tính tổng số tiền bán hμng từng ngμy của một cửa hμng Số lần bán hμng nói chung thay

đổi từng ngμy, không biết trước Vì số tiền bán hμng lμ một số dương nên giá trị 0 không phải lμ một giá trị hợp lệ Ta có thể lấy giá trị nμy lμm dấu hiệu

chấm hết dãy số liệu cần nhập Số 0 lμ giá trị canh chừng để kết thúc công

việc

1- dữ liệu vμo := giá trị đầu tiên ;

2- While dữ liệu vμo <> giá trị canh chừng do

begin

dữ liệu vμo:= giá trị tiếp theo ;

end;

Cụ thể vòng lặp được xây dựng như sau

Write(' cho so tien, 0 – ket thuc ');

Readln(SoTien);

WHILE SoTien <> 0 DO

Begin TongSo:= TongSo + SoTien;

Write(' cho so tien '); Readln(SoTien);

End;

Trang 3

7.2 Điều khiển vòng lặp bằng cờ báo

Một bμi toán thường hay gặp trong xử lí thông tin lμ tìm kiếm Thực chất của việc tìm kiếm lμ lặp lại nhiều lần phép kiểm tra một điều kiện nμo

đó cho đến khi thoả mãn điều kiện tức lμ tìm thấy

Khuôn mẫu chung để thực hiện việc tìm kiếm lμ xây dựng một cấu

trúc lặp điều khiển bằng cờ báo như sau Một biến kiểu boolean được dùng

để đánh dấu sự kiện tìm thấy Nó được gọi lμ cờ báo Trước khi vμo cấu trúc lặp, cờ báo được đặt lμ False Khi tìm thấy, cờ báo được thiết lập lμ True vμ

vòng lặp kết thúc

1- cờ báo:= false;

2- While not cờ báo do

đầu tiên thì kết thúc

Cấu trúc lặp được xây dựng như sau

TimThay:= False;

So:= x;

WHILE not TimThay DO

If Trunc(sqrt(So)) = sqrt(So) then

Goto lμ lệnh nhảy không điều kiện, cho phép nhảy từ bất kì nơi nμo

bên trong chương trình hay chương trình con đến vị trí đã đánh dấu bằng

nhãn Nhãn lμ một tên, như tên biến hoặc lμ một số nguyên

Cách thực hiện như sau

Trang 4

1- Khai báo nhãn: Phải khai báo nhãn tại đầu phần khai báo, trước khi khai báo các hằng

Cú pháp khai báo nhãn: từ khoá Label, danh sách nhãn, dấu chấm phẩy

Danh sách nhãn lμ dãy các tên nhãn, cách nhau dấu phẩy

2- Đánh đấu đích: Trong thân chương trình vị trí đích sẽ nhảy đến

bằng lệnh Goto cần đánh dấu trước

Cú pháp đánh dấu đích bằng tên nhãn: tên nhãn, dấu hai chấm, câu lệnh đích

3- Viết câu lệnh Goto nhãn;

Lưu ý, với lệnh nhảy không điều kiện Goto

- Có thể nhảy từ trong vòng lặp ra ngoμi

- Không cho phép nhảy từ ngoμi vμo trong vòng lặp, từ ngoμi vμo trong chương trình con

Nói chung nên tránh dùng câu lệnh nhảy không điều kiện Goto khi có

thể được vì nó phá vỡ cấu trúc của các lệnh điều khiển, khó theo dõi

if NguyenTo then Write(q,' la so nguyen to ')

else write(q,' khong nguyen to');

end

Trang 5

Để giải bμi toán tìm số nguyên tố lớn nhất nhỏ hơn một số nguyên n nhập vμo từ bμn phím, có thể lμm tương tự Ta lại dùng vòng lặp For để duyệt từ n trở xuống vμ dừng khi tìm thấy số nguyên tố đầu tiên

- Nếu có nhiều vòng lặp lồng nhau thì câu lệnh Break cho phép thoát ra khỏi

một vòng lặp bên trong nhất chứa nó Các vòng lặp bên ngoμi vẫn hoạt động

bình thường

8.3 Lệnh thoát khỏi chương trình con

Exit;

Lệnh kết thúc vμ thoát khỏi chương trình con

- Nếu ở bên trong chương trình con thì lệnh nμy lμm chấm dứt chương trình con (mặc dù chưa đến câu lệnh cuối) vμ trở về chương trình bên ngoμi

Câu hỏi vμ bμi tập

1 Các lỗi hay mắc phải khi viết câu lệnh If, câu lệnh Case lμ gì

2 Nêu các điểm khác nhau giữa câu lệnh If vμ câu lệnh Case Điểm nμo lμ cơ

bản

Trang 6

3 Khi nμo thì dùng vòng lặp For ?

4 Số lần lặp ít nhất có thể của các vòng lặp For, While, Repeat lμ bao nhiêu

2 Viết chương trình in ra thông báo gõ phím loại nμo: dấu phép toán + - * /

< > , dấu chính tả ,: ; ! ? chữ số 0,1 9 chữ cái A Z, a z hay các kí

hiệu khác

3 Lμm bμi 2 nhưng dùng câu lệnh If lồng nhau

4 Nhập một số nguyên N gồm 3 chữ số, in ra mμn hình cách đọc số nμy bằng lời

5 Lập chương trình để tính số ngaỳ trôi qua kể từ đầu năm khi gõ vμo một ngμy bất kì trong năm

6 Biết ngμy hôm nay lμ ngμy thứ mấy Viết chương trình in ra thứ trong tuần

của một ngμy bất kì D, M, Y (1<=D<=31, 1<=M<=12, Y= 2001)

7 Viết chương trình in ra thứ trong tuần của ngμy bất kì d,m,y Thuật toán: thứ = {d+2m+3(m+1) div 5 + y + y div 4 + 1} div 7, với quy ước tháng

1=tháng 13 năm trước, tháng 2= tháng 14 năm trước, các tháng khác giữ nguyên, 0=thứ 7, 1= chủ nhật, 2=thứ hai,v.v

8 Viết chương tình tính cước điện thoại, đầu vμo lμ thời gian bắt đầu cuộc gọi vμ độ dμi (theo phút) Có giảm giá 1/3 nếu ngoμi giờ lμm việc, giảm

giá một nửa nếu từ 21.00 đến 6.00 Giá chuẩn lμ x đ/1 phút

Trang 7

19 In ra mã ASCII của kí tự gõ từ phím Chương trình dừng khi gõ phím số

23 Tìm số n nhỏ nhất để Sn= 1+1/2 +1/3 + + 1/n > a Số a nhập từ bμn

phím

24 Tính gần đúng số π theo công thức

π/4 = 1-1/3 + 1/5 - 1/7 + + (-1) n 1/(2n+1)

a-) Khi cho trước số n

b-) Khi cho trước độ chính xác Epsilon = 10-5 (chuỗi đan dấu nên sai số

< số hạng cuối cùng)

25 Tính gần đúng sin x = x - x 3 /3 + x 5 /5 - x 7 /7 + với sai số Epsilon cho

trước So sánh kết quả vơi hμm chuẩn sin x của Turbo Pascal

Trang 8

Chương 5

Định nghĩa Các kiểu dữ liệu đơn giản

1 Khai báo kiểu dữ liệu mới

Các kiểu chuẩn có sẵn như integer, real, char, boolean lμ các kiểu

thông dụng nhất Vì thế chúng đã được định nghĩa sẵn vμ ta có thể sử dụng

ngay để khai báo các biến như đã thấy

Các kiểu chuẩn có sẵn không thể đáp ứng đầy đủ nhu cầu xử lí các bμi

toán thực tế hết sức phong phú vμ đa dạng Các ngôn ngữ lập trình nói chung

vμ Turbo Pascal nói riêng, đều cho phép người sử dụng có thể định nghĩa các

kiểu dữ liệu mới phù hợp với bμi toán của mình

1.1 Cú pháp chung

Khung cú pháp chung để khai báo kiểu dữ liệu mới lμ:

Type tên kiểu = mô tả kiểu dữ liệu mới ;

Diễn giải: Từ khoá TYPE, tên kiểu dữ liệu mới, dấu bằng, mô tả kiểu

dữ liệu mới, dấu chấm phẩy

Chỉ sau khi khai báo kiểu dữ liệu mới thì mới được sử dụng nó trong

chương trình Nghĩa lμ có thể khai báo các biến có kiểu đó hoặc xây dựng

Trang 9

a,b,c: SoThuc;

GoPhim, Chon: KiTu;

Ví dụ 2: Xét bμi toán giải một hệ phương trình đại số tuyến tính gồm

10 phương trình, 10 ẩn Rõ rμng lμ ta sẽ phải lμm việc với các véc tơ vμ ma trận Cần phải định nghĩa các "kiểu véc tơ gồm 10 thμnh phần" vμ "kiểu ma trận 10 x 10" vì chúng không phải lμ một kiểu chuẩn, đã có sẵn

TYPE

Vecto10 = array [1 10] of real ; Matran10 = array [1 10,1 10] of real ;

Bên trái dấu bằng lμ các tên kiểu mới Bên phải dấu bằng lμ mô tả xây

dựng kiểu đó Kiểu Vecto10 sẽ lμ một dãy 10 số thực liền nhau, kiểu

Matran10 sẽ lμ bộ 100 số thực được xếp thμnh 10 hμng, 10 cột Y nghĩa của

từ khoá Array vμ cách sử dụng nó sẽ được trình bμy chi tiết trong chương nói

về mảng

Sau khi đã định nghĩa các kiểu Vecto10, Matran10 ta khai báo các

biến thuộc kiểu đó như quy định chung:

Phần mô tả kiểu dữ liệu mới trong khai báo kiểu liệt kê có cú pháp như

sau: dấu mở ngoặc, danh sách các tên giá trị, dấu đóng ngoặc

Type tên kiểu = ( danh sách các tên giá trị ) ;

Trang 10

ở đây, mỗi tên giá trị lμ một tên theo đúng quy định đặt tên của Pascal Danh sách gồm các tên giá trị, cách nhau dấu phẩy Lưu ý cặp dấu ngoặc đơn bao

quanh danh sách các giá trị

Sau khi đã khai báo kiểu liệt kê, ta khai báo biến theo đúng quy tắc thông thường

Var tên biến: tên kiểu ;

2.1.2

2.2.1

Ví dụ

TYPE NgayTrongTuan = (CN, Thu2, Thu3, Thu4, Thu5, Thu6,Thu7);

MauCoBan = (Do, Xanh, Vang);

XeMoTo = (Honda, Yamaha, Suzuki, Vespa);

VAR NgayHocToan, NgayHocTin: NgayTrongTuan ;

Xe1, Xe2: XeMoTo ;

Mau1, Mau2: MauCoBan ;

- Có thể kết hợp khai báo biến kiểu liệt kê kèm với mô tả xác định kiểu cùng một lúc như sau:

VAR

NgayHocToan, NgayHocTin: (CN, Thu2, Thu3, Thu4, Thu5,

Thu6, Thu7);

Mau1, Mau2: (Do,Xanh,Vang);

Các biến NgayHocToan, NgayHocTin vμ Mau1, Mau2 cũng vẫn lμ những biến kiểu liệt kê, nhưng ta không đặt tên cho kiểu mμ thôi Việc đặt thêm một tên kiểu mới, dùng từ khoá Type sẽ tiện hơn trong sử dụng vμ lμm

chương trình dễ hiểu hơn

2.2 Tính chất và các phép toán

Thứ tự trong kiểu liệt kê

Kiểu liệt kê lμ kiểu có thứ tự Thứ tự của các giá trị chính lμ thứ tự liệt

kê chúng trong danh sách Giá trị đứng trước trong danh sách thì nhỏ hơn giá trị đứng sau

Ví dụ:

Thu2 < Thu3 cho kết quả lμ True, Xanh < Do cho kết quả False

Trang 11

Ord (CN) = 0; Ord (Thu2) = 1, v.v

Pred: cho giá trị đứng trước trong danh sách,

Pred (Thu2) = CN; Pred (Thu3) = Thu2, v.v

Hμm Pred không xác định khi đối số lμ giá trị đứng đầu danh sách liệt kê

Pred (CN) không xác định, sẽ có lỗi khi chạy chương trình - run time error

Succ: cho giá trị đứng sau trong danh sách

Succ (Thu3) = Thu4; Succ (Thu4) = Thu5, v.v

Hμm Succ không xác định khi đối số lμ giá trị đứng cuối danh sách liệt

kê Succ (Thu7) không xác định, sẽ có lỗi khi chạy chương trình - run

time error

- Đọc vμo vμ viết ra một giá trị kiểu liệt kê

a) Không thể nhập trực tiếp giá trị cho biến kiểu liệt kê từ bμn phím

Nghĩa lμ không thể gán cho biến HomNay giá trị Thu2 bằng cách gõ từ bμn phím xâu kí tự Thu2, dùng cặp câu lệnh nhập liệu quen thuộc:

Write(' Hom nay la thu:');

Readln( HomNay);

Để lμm việc nμy, phải xử lí gián tiếp Chẳng hạn có thể viết:

Write(' Hom nay la thu:'); Readln( St);

If St = 'Thu2' Then HomNay:= Thu2;

b) Không thể in ra trực tiếp một giá trị của kiểu liệt kê giống như đối

với các kiểu dữ liệu khác Nghĩa lμ, nếu biến HomNay có gía trị lμ Thu2 thì không thể viết trực tiếp chữ Thu2 bằng câu lệnh Write(HomNay)

Để lμm việc nμy cần phải xử lí gián tiếp, dùng câu lệnh Case như sau

Trang 12

CASE HomNay OF

CN: Write(' Chu Nhat ');

Thu2: Write(' Thu hai ');

thể ghi riêng ra bên cạnh một danh sách quy ước CN = 0, Thu2 = 1, v.v Tuy

nhiên dùng kiểu liệt kê lμm chương trình dễ hiểu hơn vμ ta không phải nhớ các quy ước trên

2- Có thể sử dụng biến kiểu liệt kê lμm biến điều khiển trong vòng lặp

For, biến lựa chọn trong câu lệnh Case, chỉ số cho các mảng (sẽ trình bμy

trong phần kiểu mảng!)

2.3 Ví dụ minh hoạ

Chương trình sau đây sử dụng biến kiểu liệt kê để in ra thứ tự của các ngμy trong tuần

kiểu đó thì sẽ nhận được kiểu dữ liệu mới lμ kiểu đoạn con

Mỗi kiểu đoạn con được xây dựng dựa trên một kiểu vô hướng đếm

được lμm cơ sở

Trang 13

3.1.1

3.1.2

3.1.3

Cú pháp

Phần mô tả kiểu dữ liệu mới trong khai báo kiểu đoạn con có cú pháp

như sau: cận dưới, dấu chấm, dấu chấm, cận trên

Type tên kiểu = cận dưới cận trên ;

ở đây hai thμnh phần cận dưới vμ cận trên lμ các hằng, cùng thuộc kiểu cơ

sở, thoả mãn điều kiện cận dưới < cận trên

Miền giá trị của kiểu đoạn con xác định như trên sẽ lμ đoạn con từ cận

NgayLamViec = Thu2 Thu6 ;

Các định nghĩa kiểu đoạn con ở trên dựa trên các kiểu cơ sở lμ kiểu chuẩn có sẵn hoặc kiểu đã định nghĩa trước Đó lμ:

- ChuSo, ChuCaiThuong lμ kiểu đoạn con trên cơ sở kiểu kí tự

- Điem lμ kiểu đoạn con trên cơ sở kiểu số nguyên

- NgayLamViec lμ kiểu đoạn con trên cơ sở kiểu liệt kê

NgayTrongTuan đã định nghĩa trong tiết trước Phải hiểu rằng bên trên dòng

khai báo kiểu NgayLamViec đã có dòng khai báo kiểu liệt kê

NgayTrongTuan

Tính chất

Kiểu đoạn con kế thừa các tính chất của kiểu cơ sở Mọi phép toán của kiểu cơ sở áp dụng được cho kiểu đoạn con của nó Điểm khác biệt duy nhất

lμ miền giá trị thu hẹp hơn

Công dụng: kiểu đoạn con lμ một phương tiện nhờ chương trình dịch kiểm tra tính phù hợp của dữ liệu, đảm bảo giá trị của các biến kiểu đoạn con không vượt quá miền đã xác định Nếu trong chương trình có những câu lệnh

vi phạm hiển điềù nμy thì trình biên dịch sẽ báo lỗi Mặt khác, kiểu đoạn con

lμm chương trình chặt chẽ hơn, dễ đọc hơn

Lưu ý rằng kiểu đoạn con không ngăn cản được lỗi dữ liệu không hợp

lệ, vượt ra ngoμi miền giá trị cho phép khi chạy chương trình

Trang 14

3.2 Ví dụ minh hoạ

Chương trình sau đây sẽ báo lỗi khi biên dịch do giá trị biến d vượt ra

ngoμi miền cho phép

Phần mô tả kiểu mới trong khai báo kiểu tập hợp có cú pháp như sau:

từ khoá Set of, tên kiểu cơ sở

Type tên kiểu tập hợp = set of tên kiểu cơ sở ;

ở đây kiểu cơ sở có thể lμ một kiểu vô hướng đếm được bất kì, kể cả kiểu liệt

kê, kiểu đoạn con

Tuy nhiên, Turbo Pascal hạn chế số phần tử có thể của mỗi giá trị kiểu tập hợp lμ 256 Nhiều biến thể khác của Pascal cũng hạn chế số phần tử có

thể của mỗi giá trị của kiểu tập hợp bằng số giá trị của kiểu Char

Trang 15

Sau khi đã khai báo kiểu tập hợp, ta khai báo biến có kiểu tập hợp như thông thường

Var tên biến: tên kiểu tập hợp ;

4.1.2

4.1.3

4.2.1

Ví dụ

TYPE BoKiTu = SET OF Char ;

NgayMonhoc = SET OF NgayTrongTuan;

BangMau = SET OF (Đỏ, Hồng, Xanh, Lơ, Vμng, Tím); VungDiem = SET OF 0 10 ;

VAR NguyenAm, PhuAm : BoKiTu ;

NgayHocToan, NgayHocTin : NgayMonhoc ;

Kem, TrungBinh, Kha, Gioi: VungDiem ;

Một số tính chất

- Một giá trị của dữ liệu kiểu tập hợp được thể hiện bằng cách liệt kê mọi phần tử của tập, cách nhau dấu phẩy, đóng trong hai dấu ngoặc vuông

- Thứ tự liệt kê các phần tử không quan trọng

- Có thể gán gía trị cho biến tập hợp như thông thường

Ví dụ: NgayHocToan:= [ Thu2, Thu5 ] ;

- Hai toán hạng phải cùng kiểu

So sánh bằng nhau: A = B lμ True nếu A vμ B hoμn toμn như nhau

So sánh khác nhau: A <> B chỉ cho kết quả False khi A vμ B hoμn toμn như

Trang 16

Chú ý: Không có so sánh nhỏ hơn, lớn hơn chặt “< , >” đối với kiểu tập

hợp Muốn thể hiện quan hệ "lμ tập con thực sự " ta phải kết hợp hai điều

kiện: (A <= B) And (A <> B)

4.2.2

4.2.3

Phép tìm kiếm "thuộc về"

- Từ khoá In có ý nghĩa như dấu thuộc về “∈”

Ví dụ: Thu2 In NgayHocToan cho kết quả True

Thu2 In NgayHocTin cho kết quả False

Phép Hợp, Giao, Hiệu

- Hai toán hạng phải cùng kiểu

Phép Hợp thể hiện bằng dấu + : A + B lμ A ∪ B theo nghĩa toán học

Phép Giao thể hiện bằng dấu * : A * B lμ A ∩ B theo nghĩa toán học

Phép lấy hiệu thể hiện bằng dấu - : A - B lμ A \ B theo nghĩa toán học

4.3 Ví dụ minh hoạ

Ví dụ 1: Đếm số kí tự lμ nguyên âm, lμ phụ âm trong một dãy kí tự Để

đơn giản ta dùng kí tự số 0 để đánh dấu kết thúc dãy

Dễ thấy rằng cần phải có hai tập hợp chữ cái lμ các nguyên âm vμ các phụ âm để phục vụ cho việc kiểm tra từng kí tự đọc vμo Chương trình cần

phải định nghĩa kiểu dữ liệu TapKiTu vμ hai biến NguyenAm, PhuAm có kiểu lμ tập hợp bộ chữ cái như đã nêu trên

type BoKiTu = Set of Char;

var NguyenAm, PhuAm: TapKiTu;

PhuAm:= ['a' 'z'] - NguyenAm;

Write(' cho day ki tu, ket thuc bang so 0: ');

read(ch);

while ch <> '0' do

begin

if ch in NguyenAm then So_NguyenAm:= So_NguyenAm + 1;

if ch in PhuAm then So_PhuAm:= So_PhuAm + 1;

read(ch);

end;

Writeln('So nguyen am la: ', So_NguyenAm);

Writeln('So phu am la: ', So_PhuAm);

Ngày đăng: 23/07/2014, 21:20

HÌNH ẢNH LIÊN QUAN

Hình ảnh:  Nếu viết mảng theo chiều đứng thμnh một cột vμ bắt đầu từ  d−ới lên thì mỗi phần tử mảng giống nh− lμ các bọt n−ớc nhẹ hơn phải nổi  dần lên, nặng hơn phải chìm dần xuống cho tới đúng múc trọng l−ợng của nó - Lập trình bằng Turbo Pascal part 3 pptx
nh ảnh: Nếu viết mảng theo chiều đứng thμnh một cột vμ bắt đầu từ d−ới lên thì mỗi phần tử mảng giống nh− lμ các bọt n−ớc nhẹ hơn phải nổi dần lên, nặng hơn phải chìm dần xuống cho tới đúng múc trọng l−ợng của nó (Trang 26)

TỪ KHÓA LIÊN QUAN