1. Trang chủ
  2. » Giáo án - Bài giảng

Tai lieu boi duong HSG pascal

196 275 0

Đ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 196
Dung lượng 1,87 MB

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 CÂU LỆNH CÓ CẤU TRÚC I. CÂU LỆNH RẼ NHÁNH 1.1. Lệnh IF Cú pháp: (1) IF B THEN S; (2) IF B THEN S1 ELSE S2; Chú ý: Khi sử dụng câu lệnh IF thì đứng trước từ khoá ELSE không được có dấu chấm phẩy (;). 1.2. Lệnh CASE Cú pháp: Dạng 1 Dạng 2 CASE B OF Const 1: S1; Const 2: S2; ... Const n: Sn; END; CASE B OF Const 1: S1; Const 2: S2; ... Const n: Sn; ELSE Sn+1; END; Trong đó:  B: Biểu thức kiểu vô hướng đếm được như kiểu nguyên, kiểu logic, kiểu ký tự, kiểu liệt kê.  Const i: Hằng thứ i, có thể là một giá trị hằng, các giá trị hằng (phân cách nhau bởi dấu phẩy) hoặc các đoạn hằng (dùng hai dấu chấm để phân cách giữa giá trị đầu và giá trị cuối).  Giá trị của biểu thức và giá trị của tập hằng i (i=1¸n) phải có cùng kiểu. Khi gặp lệnh CASE, chương trình sẽ kiểm tra: Nếu giá trị của biểu thức B nằm trong tập hằng const i thì máy sẽ thực hiện lệnh Si tương ứng. Ngược lại:+ Đối với dạng 1: Không làm gì cả. + Đối với dạng 2: thực hiện lệnh Sn+1.

Trang 1

Giáo trình bài tập Pascal Nguyễn Văn Trọng

TRƯỜNG THCS TÂN HỘI

 GIÁO TRÌNH PASCAL

Trang 2

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Chương 1 CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ LẬP TRÌNH PASCAL

Pascal là một ngôn ngữ lập trình bậc cao do Niklaus Wirth, giáo sư điện toán trường Đại học kỹ thuật Zurich (Thụy Sĩ) đề xuất năm 1970 Ông lấy tên Pascal để kỷ niệm nhà toán học và nhà triết học người Pháp nổi tiếng Blaise Pascal

1 Các tập tin cần thiết khi lập trình với Turbo Pascal

Để lập trình được với Turbo Pascal, tối thiểu cần 2 file sau:

TURBO.EXE: Dùng để soạn thảo và dịch chương trình.

TURBO.TPL: Thư viện chứa các đơn vị chuẩn để chạy với TURBO.EXE.

Ngoài ra, muốn lập trình đồ hoạ thì phải cần thêm các tập tin:

GRAPH.TPU: Thư viện đồ hoạ.

*.BGI: Các file điều khiển các loại màn hình tương ứng khi dùng đồ hoạ.

*.CHR: Các file chứa các font chữ đồ họa.

2 Các bước cơ bản khi lập một chương trình Pascal

Bước 1: Soạn thảo chương trình.

Bước 2: Dịch chương trình (nhấn phím F9), nếu có lỗi thì phải sửa lỗi.

Bước 3: Chạy chương trình (nhấn phím Ctrl-F9).

3 Cấu trúc chung của một chương trình Pascal

{ Phần tiêu đề }

PROGRAM Tên_chương_trình;

{ Phần khai báo }

USES ;

CONST .;

TYPE ;

VAR .;

PROCEDURE .;

FUNCTION ;

{ Phần thân chương trình } BEGIN

END.

Ví dụ 1: Chương trình Pascal đơn giản nhất

BEGIN

Write(‘Hello World!’);

END

Ví dụ 2:

Program Vidu2;

Const PI=3.14;

Var R,S:Real;

Begin R:=10; {Bán kính đường tròn}

S:=R*R*PI; {Diện tích hình tròn}

Writeln(‘Dien tich hinh tron = ‘, S:0:2); { In ra màn hình }

Readln;

End

4 Một số phím chức năng thường dùng

F2: Lưu chương trình đang soạn thảo vào đĩa

F3: Mở file mới hoặc file đã tồn tại trên đĩa để soạn thảo

Alt-F3: Đóng file đang soạn thảo.

Alt-F5: Xem kết quả chạy chương trình.

F8: Chạy từng câu lệnh một trong chương trình

Alt-X: Thoát khỏi Turbo Pascal

Alt-<Số thứ tự của file đang mở>: Dịch chuyển qua lại giữa các file đang mở.

Trang 3

Giáo trình bài tập Pascal Nguyễn Văn Trọng

F10: Vào hệ thống Menu của Pascal

5 Các thao tác cơ bản khi soạn thảo chương trình

5.1 Các phím thông dụng

Insert: Chuyển qua lại giữa chế độ đè và chế độ

chèn

Home: Đưa con trỏ về đầu dòng.

End: Đưa con trỏ về cuối dòng.

Page Up: Đưa con trỏ lên một trang màn hình.

Page Down: Đưa con trỏ xuống một trang màn

hình

Del: Xoá ký tự ngay tại vị trí con trỏ.

Back Space (): Xóa ký tự bên trái con trỏ.

Ctrl-PgUp: Đưa con trỏ về đầu văn bản.

Ctrl-PgDn: Đưa con trỏ về cuối văn bản.

Ctrl-Y: Xóa dòng tại vị trí con trỏ.

5.2 Các thao tác trên khối văn bản

Chọn khối văn bản: Shift + <Các phím ←↑→↓ >

Ctrl-KY: Xoá khối văn bản đang chọn

Ctrl-Insert: Đưa khối văn bản đang chọn vào Clipboard

Shift-Insert: Dán khối văn từ Clipboard xuống vị trí con trỏ.

6 Các thành phần cơ bản của ngôn ngữ Pascal

• Không được đặt trùng tên với từ khoá

• Ký tự đầu tiên của tên không được bắt đầu bởi các ký tự đặc biệt hoặc chữ số

• Không được đặt tên với ký tự space (Khoảng trắng),các phép toán

Ví dụ: Các tên viết như sau là sai

1XYZ Sai vì bắt đầu bằng chữ số

#LONG Sai vì bắt đầu bằng ký tự đặc biệt

FOR Sai vì trùng với từ khoá

KY TU Sai vì có khoảng trắng (space)

LAP-TRINH Sai vì dấu trừ (-) là phép toán

6.3 Dấu chấm phẩy (;)

Dấu chấm phẩy được dùng để ngăn cách giữa các câu lệnh Không nên hiểu dấu chấm phẩy là dấu kết thúc câulệnh

Ví dụ:

FOR i:=1 TO 10 DO Write(i);

Trong câu lệnh trên, lệnh Write(i) được thực hiện 10 lần Nếu hiểu dấu chấm phẩy là kết thúc câu lệnh thì lệnhWrite(i) chỉ thực hiện 1 lần

6.4 Lời giải thích

Các lời bàn luận, lời chú thích có thể đưa vào bất kỳ chỗ nào trong chương trình để cho người đọc dể hiểu màkhông làm ảnh hưởng đến các phần khác trong chương trình Lời giải thích được đặt giữa hai dấu ngoạc { và } hoặcgiữa cụm dấu (* và *)

Ví dụ:

Var a,b,c:Rea; {Khai báo biến}

Delta := b*b – 4*a*c; (* Tính delta để giải phương trình bậc 2 *)

Trang 4

Giáo trình bài tập Pascal Nguyễn Văn Trọng

- miền giá trị: (TRUE, FALSE)

- Các phép toán: phép so sánh (=, <, >) và các phép toán logic: AND, OR, XOR, NOT

Trong Pascal, khi so sánh các giá trị boolean ta tuân theo qui tắc: FALSE < TRUE

Giả sử A và B là hai giá trị kiểu Boolean Kết quả của các phép toán được thể hiện qua bảng dưới đây:

+, -, *, / (phép chia cho ra kết quả là số thực).

Phép chia lấy phần nguyên: DIV (Ví dụ : 34 DIV 5 = 6).

Phép chia lấy số dư: MOD (Ví dụ: 34 MOD 5 = 4).

2.2.2 Các phép toán xử lý bit:

Trên các kiểu ShortInt, Integer, Byte, Word có các phép toán:

• NOT, AND, OR, XOR

Chú ý: Các kiểu số thực Single, Double và Extended yêu cầu phải sử dụng chung với bộ đồng xử lý số hoặc phải biên

dich chương trình với chỉ thị {$N+} để liên kết bộ giả lập số.

3.2 Các phép toán trên kiểu số thực: +, -, *, /

Trang 5

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Chú ý: Trên kiểu số thực không tồn tại các phép toán DIV và MOD.

3.3 Các hàm số học sử dụng cho kiểu số nguyên và số thực:

SQR(x): Trả về x2

SQRT(x): Trả về căn bậc hai của x (x≥0)

ABS(x): Trả về |x|

SIN(x): Trả về sin(x) theo radian

COS(x): Trả về cos(x) theo radian

ARCTAN(x): Trả về arctang(x) theo radian

LN(x): Trả về ln(x)

EXP(x): Trả về ex

TRUNC(x): Trả về số nguyên gần với x nhất

nhưng bé hơn x

INT(x): Trả về phần nguyên của x

FRAC(x): Trả về phần thập phân của x

ROUND(x): Làm tròn số nguyên x

PRED(n): Trả về giá trị đứng trước n

SUCC(n): Trả về giá trị đứng sau n

ODD(n): Cho giá trị TRUE nếu n là số lẻ

INC(n): Tăng n thêm 1 đơn vị (n:=n+1)

DEC(n): Giảm n đi 1 đơn vị (n:=n-1)

4 Kiểu ký tự

- Từ khoá: CHAR

- Kích thước: 1 byte

- Để biểu diễn một ký tự, ta có thể sử dụng một trong số các cách sau đây:

• Đặt ký tự trong cặp dấu nháy đơn Ví dụ 'A', '0'

• Dùng hàm CHR(n) (trong đó n là mã ASCII của ký tự cần biểu diễn) Ví dụ CHR(65) biễu diễn ký tự 'A'

• Dùng ký hiệu #n (trong đó n là mã ASCII của ký tự cần biểu diễn) Ví dụ #65

- Các phép toán: =, >, >=, <, <=,<>

* Các hàm trên kiểu ký tự:

- UPCASE(ch): Trả về ký tự in hoa tương ứng với ký tự ch Ví dụ: UPCASE('a') = 'A'.

- ORD(ch): Trả về số thứ tự trong bảng mã ASCII của ký tự ch Ví dụ ORD('A')=65.

- CHR(n): Trả về ký tự tương ứng trong bảng mã ASCII có số thứ tự là n Ví dụ: CHR(65)='A'.

- PRED(ch): cho ký tự đứng trước ký tự ch Ví dụ: PRED('B')='A'.

- SUCC(ch): cho ký tự đứng sau ký tự ch Ví dụ: SUCC('A')='B'.

II KHAI BÁO HẰNG

- Hằng là một đại lượng có giá trị không thay đổi trong suốt chương trình

Logic = ODD(5); {Logic =TRUE}

Chú ý: Chỉ các hàm chuẩn dưới đây mới được cho phép sử dụng trong một biểu thức hằng:

III KHAI BÁO BIẾN

- Biến là một đại lượng mà giá trị của nó có thể thay đổi trong quá trình thực hiện chương trình

- Cú pháp:

VAR <Tên biến>[,<Tên biến 2>, ] : <Kiểu dữ liệu>;

Ví dụ:

VAR x, y: Real; {Khai báo hai biến x, y có kiểu là Real}

a, b: Integer; {Khai báo hai biến a, b có kiểu integer}

Chú ý: Ta có thể vừa khai báo biến, vừa gán giá trị khởi đầu cho biến bằng cách sử dụng cú pháp như sau:

CONST <Tên biến>: <Kiểu> = <Giá trị>;

Trang 6

Giáo trình bài tập Pascal Nguyễn Văn Trọng

- Ngoài các kiểu dữ liệu do Turbo Pascal cung cấp, ta có thể định nghĩa các kiểu dữ liệu mới dựa trên các kiểu dữ liệu

đã có

- Cú pháp:

TYPE <Tên kiểu> = <Mô tả kiểu>;

VAR <Tên biến>:<Tên kiểu>;

(x+4)*2 = (8+y) biểu thức logic

Trong một biểu thức, thứ tự ưu tiên của các phép toán được liệt kê theo thứ tự sau:

• Lời gọi hàm

• Dấu ngoặc ()

• Phép toán một ngôi (NOT, -)

• Phép toán *, /, DIV, MOD, AND

• Phép toán +, -, OR, XOR

• Phép toán so sánh =, <, >, <=, >=, <>, IN

VI CÂU LỆNH

6.1 Câu lệnh đơn giản

- Câu lệnh gán (:=): <Tên biến>:=<Biểu thức>;

- Các lệnh xuất nhập dữ liệu: READ/READLN, WRITE/WRITELN.

- Lời gọi hàm, thủ tục

6.2 Câu lệnh có cấu trúc

- Câu lệnh ghép: BEGIN END;

- Các cấu trúc điều khiển: IF , CASE , FOR , REPEAT , WHILE

Các thủ tục trên có chức năng như sau:

(1) Sau khi xuất giá trị của các tham số ra màn hình thì con trỏ không xuống dòng

(2) Sau khi xuất giá trị của các tham số ra màn hình thì con trỏ xuống đầu dòng tiếp theo

(3) Xuất ra màn hình một dòng trống

Các tham số có thể là các hằng, biến, biểu thức Nếu có nhiều tham số trong câu lệnh thì các tham số phải đượcphân cách nhau bởi dấu phẩy

Khi sử dụng lệnh WRITE/WRITELN, ta có hai cách viết: không qui cách và có qui cách:

- Viết không qui cách: dữ liệu xuất ra sẽ được canh lề ở phía bên trái Nếu dữ liệu là số thực thì sẽ được in ra dưới

dạng biểu diễn khoa học

Trang 7

Giáo trình bài tập Pascal Nguyễn Văn Trọng

6.3.2 Nhập dữ liệu

Để nhập dữ liệu từ bàn phím vào các biến có kiểu dữ liệu chuẩn (trừ các biến kiểu BOOLEAN), ta sử dụng cú phápsau đây:

READLN(<biến 1> [,<biến 2>, ,<biến n>]);

Chú ý: Khi gặp câu lệnh READLN; (không có tham số), chương trình sẽ dừng lại chờ người sử dụng nhấn phím

ENTER mới chạy tiếp.

6.4 Các hàm và thủ tục thường dùng trong nhập xuất dữ liệu

Hàm KEYPRESSED: Hàm trả về giá trị TRUE nếu như có một phím bất kỳ được nhấn, nếu không hàm cho giá

trị là FALSE

Hàm READKEY: Hàm có chức năng đọc một ký tự từ bộ đệm bàn phím.

Thủ tục GOTOXY(X,Y:Integer): Di chuyển con trỏ đến cột X dòng Y.

Thủ tục CLRSCR: Xoá màn hình và đưa con trỏ về góc trên bên trái màn hình.

Thủ tục CLREOL: Xóa các ký tự từ vị trí con trỏ đến hết dòng.

Thủ tục DELLINE: Xoá dòng tại vị trí con trỏ và dồn các dòng ở phía dưới lên.

Thủ tục TEXTCOLOR(color:Byte): Thiết lập màu cho các ký tự Trong đó color ∈ [0,15].

Thủ tục TEXTBACKGROUND(color:Byte): Thiết lập màu nền cho màn hình.

Write('Nhap vao do dai canh thu nhat: '); Readln(a);

Write('Nhap vao do dai canh thu hai: '); Readln(b);

Write('Nhap vao goc giua hai canh: '); Readln(goc);

Write('Nhap vao n= '); Readln(n);

Write('Nhap vao x= '); Readln(x);

S:=EXP(1/n*LN(x));

Writeln('S = ',S:0:2);

Readln;

End

Bài tập 2.3: Viết chương trình nhập vào 2 số a, b Sau đó hoán đổi giá trị của 2 số đó:

a/ Cho phép dùng biến trung gian

Program Swap;

Var a,b,tam: Integer;

Begin

Trang 8

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Write('Nhap vao a= '); Readln(a);

Write('Nhap vao b= '); Readln(b);

tam:=a; {tam lấy giá trị của a}

a:=b; {a lấy giá trị của b}

b:=tam; {b lấy lại giá trị của tam}

Write('Nhap vao b= '); Readln(b);

a:=a+b; {a lấy tổng giá trị của a+b}

b:=a-b; {b lấy giá trị của a}

a:=a-b; {a lấy lại giá trị của b}

S = p p a p b p c ( − )( − )( − ) với p = 1

2(a+b+c)Bài tập 2.6: Viết chương trình tính khoảng cách từ một điểm I(xi,yi) đến đường thẳng có phương trình D: Ax + By + C

= 0

Gợi ý:

Công thức tính khoảng cách: h =

2 2

.

B A

C y B x

+

+ +

Bài tập 2.7: Viết chương trình tách một số n thành 2 số a, b sao cho tích P=a*b2 đạt cực đại với n được nhập vào từ bànphím

s:=a*b;

writeln(s); readln;

End

Hãy cho biết 2 chương trình trên cho kết quả đúng hay sai? Tại sao?

Bài tập 2.9: Màn hình đồ họa của một máy tính có độ phân giải: 640x480 Biết rằng, mỗi điểm trên màn hình chiếm 1byte Hỏi cần bao nhiêu byte để lưu trữ một vùng có kích thước bằng 1/10 màn hình đồ họa đó?

Có 2 sinh viên viết chương trình giải bài toán này như sau:

s:=a*b DIV 10;

writeln(s); readln;

Trang 9

Giáo trình bài tập Pascal Nguyễn Văn Trọng

End

Hãy cho biết 2 chương trình trên cho kết quả đúng hay sai? Tại sao?

Chương 3 CÁC CÂU LỆNH CÓ CẤU TRÚC

Const n: S n ; END;

CASE B OF Const 1: S 1 ; Const 2: S 2 ;

Const n: S n ; ELSE S n+1 ; END;

Trong đó:

 B: Biểu thức kiểu vô hướng đếm được như kiểu nguyên, kiểu logic, kiểu ký tự, kiểu liệt kê

 Const i: Hằng thứ i, có thể là một giá trị hằng, các giá trị hằng (phân cách nhau bởi dấu phẩy) hoặc các đoạnhằng (dùng hai dấu chấm để phân cách giữa giá trị đầu và giá trị cuối)

 Giá trị của biểu thức và giá trị của tập hằng i (i=1¸n) phải có cùng kiểu

Khi gặp lệnh CASE, chương trình sẽ kiểm tra:

- Nếu giá trị của biểu thức B nằm trong tập hằng const i thì máy sẽ thực hiện lệnh Si tương ứng

- Ngược lại:+ Đối với dạng 1: Không làm gì cả

+ Đối với dạng 2: thực hiện lệnh Sn+1

FOR <biến đếm>:=<giá trị Max> DOWNTO <giá trị Min> DO S;

Sơ đồ thực hiện vòng lặp FOR:

Trang 10

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Chú ý: Khi sử dụng câu lệnh lặp FOR cần chú ý các điểm sau:

Không nên tuỳ tiện thay đổi giá trị của biến đếm bên trong vòng lặp FOR vì làm như vậy có thể sẽ không kiểm soát được biến đếm.

Giá trị Max và Min trong câu lệnh FOR sẽ được xác định ngay khi vào đầu vòng lặp Do đó cho dù trong vòng lặp ta có thay đổi giá trị của nó thì số lần lặp cũng không thay đổi.

5.3.2 Vòng lặp không xác định

Repeat S;

Until B;

While B Do S;

Ý nghĩa:

Dạng REPEAT: Lặp lại công việc S cho đến khi biểu thức B=TRUE thì dừng.

Dạng WHILE: Trong khi biểu thức B=TRUE thì tiếp tục thực hiện công việc S.

Else { Trường hợp a=0 và b ≠ 0 }Writeln('Phuong trinh vo nghiem')

Else { Trường hợp a ≠ 0 }Begin

Trang 11

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Writeln('Phuong trinh co nghiem

1 17: Writeln(Nguoi nay la thieu nien');

18 39: Writeln(Nguoi nay la thanh nien');

40 60: Writeln(Nguoi nay la trung nien');

Else Writeln(Nguoi nay la lao nien');

Write('Nhap vao gia tri cua

N :'); Readln(N);

S:=0; i:=1;

RepeatS:=S+i;

Write('Nhap vao gia tri cua

N :'); Readln(N);

S:=0; i:=1;

While i<=N DoBeginS:=S+i;

i:=i+1;

End;

Writeln('Ket qua la :',S);Readln;

Trang 12

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Bài tập 3.6: Viết chương trình nhập vào các số nguyên cho đến khi nào gặp số 0 thì kết thúc Hãy đếm xem có baonhiêu số chẵn vừa được nhập vào

Ta thấy rằng, mẫu số là các số lẻ có qui luật: 2*i+1 với i=1, ,n Do đó ta dùng i làm biến chạy

Vì tính số Pi với độ chính xác Epsilon nên không biết trước được cụ thể số lần lặp, do đó ta phải dùng vòng lặp

WHILE hoặc REPEAT Có nghĩa là phải lặp cho tới khi t=4/(2*i+1) ≤ Epsilon thì dừng

- Tìm USCLN: Lấy số lớn trừ số nhỏ cho đến khi a=b thì dừng Lúc đó: USCLN=a

- BSCNN(a,b) = a*b DIV USCLN(a,b)

Trang 13

Giáo trình bài tập Pascal Nguyễn Văn Trọng

N là số nguyên tố nếu N không có ước số nào từ 2 → N div 2 Từ định nghĩa này ta đưa ra giải thuật:

- Đếm số ước số của N từ 2 → N div 2 lưu vào biến d

For i:=2 To N div 2 Do

If N MOD i=0 Then d:=d+1;

{Kiểm tra}

If d=0 Then Writeln(N,’ la so nguyen to’)Else Writeln(N,’ khong phai la so nguyen to’);End;

Delta<0: Phương trình vô nghiệm

Delta=0: Phương trình có nghiệm kép: x = -b/(2*a)

Delta>0: Phương trình có 2 nghiệm phân biệt: x1,2 = (-b±SQRT(Delta))/(2*a)

Bài tập 3.13: Viết chương trình nhập vào từ bàn phím: giờ, phút, giây Cọng thêm một số giây cũng được nhập từ bànphím Hãy in ra kết quả sau khi cọng xong

Gợi ý:

- Gọi số giây được cộng thêm là: ss Gán giây:=giây+ss

- Nếu giây≥60 thì: phút:=phút + giây DIV 60 và giây:=giây MOD 60

- Nếu phút≥60 thì: giờ:=giờ + phút DIV 60 và phút:=phút MOD 60

Bài tập 3.14: Viết chương trình tìm Max, Min của 4 số: a, b, c, d

Bài tập 3.15: Viết chương trình nhập vào ngày, tháng, năm Máy sẽ hiện lên ngày, tháng, năm hôm sau

Trang 14

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Bài tập 3.17: Viết chương trình in ra màn hình các số nguyên từ 1 đến 100 sao cho cứ 10 số thì xuống dòng

Gợi ý:

Cho biến i chạy từ 1 → 100 In ra màn hình i và kiểm tra: nếu i MOD 10=0 thì WRITELN

Bài tập 3.18: Viết chương trình in ra màn hình bảng cữu chương

S5 = 1 + sin(x) + sin2(x) + + sinn(x)

Bài tập 3.20: Viết chương trình để tìm lời giải cho bài toán sau:

Trong giỏ vừa thỏ vừa gà,

Một trăm cái cẳng bốn ba cái đầu

Hỏi có mấy gà mấy thỏ?

Bài tập 3.21: Viết chương trình nhập vào một số nguyên dương Hãy thông báo lên màn hình số đó có bao nhiêu chữ

số và tổng các chữ số của số đó

Gợi ý:

Dùng vòng lặp WHILE Trong khi N>0 thì: lấy ra chữ số cuối cùng của N để tính bằng phép toán MOD 10, sau đó

bỏ bớt đi chữ số cuối cùng của N bằng phép toán DIV 10

Bài tập 3.22: Viết chương trình in ra màn hình tất cả các số nguyên tố từ 2 đến N Với N được nhập từ bàn phím

Bài tập 3.23: Viết chương trình phân tích một số ra thừa số nguyên tố Ví dụ: N=100 sẽ in ra màn hình:

I/ Khái niệm: - Khi lập trình để giải các bài toán trên máy tính có thể phân chia chương trình (gọi

là chương trình chính) thành các khối (modul), mỗi khối bao gồm các lệnh giải một bài toán con nào đó Mỗi khối lệnh sẽ được xây dựng thành một chương trình con Sau đó chương trình chính sẽ được xây dựng từ những chương trình con này

- Chương trình con là một dãy lệnh mô tả một số thao tác nhất định và có thể được thực hiện (được gọi) từ nhiều vị trí trong chương trình

Trang 15

Giáo trình bài tập Pascal Nguyễn Văn Trọng

- Lợi ích của việc sử dụng chương trình con:

+ Tránh được việc phải viết lặp đi lặp lại cùng một dãy lệnh nào đó;

+ Hỗ trợ việc thực hiện các chương trình lớn;

+ Phục vụ cho quá trình trửu tượng hoá; mở rộng khả năng ngôn ngữ;

+ Thuận tiện cho việc phát triển, nâng cấp chương trình

II/ Phân loại và cấu trúc của chương trình con:

1 Phân loại:

- Hàm (Function): là chương trình con thực hiện một số thao tác nào đó và trả về một giá trị

qua tên của nó Ví dụ: sin(x), sqrt(x), length(s),

- Thủ tục (Procedure): là chương trình con thực hiện các thao tác nhất định nhưng không trả

về giá trị nào qua tên của nó Ví dụ: writeln, readln, delete, insert,

Kiểu chương

Hàm Function Có khai báo kiểu cho tên hàm, cuối hàm thường có một

lệnh gán giá trị kết quả cho tên hàm Có trả về một giátrị thông qua tên hàm

Chú ý:

- Kiểu cho tên hàm chỉ được cho phép là các kiểu đơn giản đã được Pascal định nghĩa

- Nếu muốn chương trình con trả về kết quả là một kiểu phức tạp hơn, như mảng, thì nên dùngtham số hình thức biến

2 Cấu trúc chương trình con:

- Có cấu trúc tương tự chương trình, nhưng phải có tên và phần đầu dùng để khai báo tên, nếu

là hàm thì phải khai báo kiểu dữ liệu cho giá trị trả về của hàm

+ Các biến được khai báo cho dữ liệu vào/ra được gọi là tham số hình thức

+ Các biến được khai báo để dùng riêng trong chương trình con gọi là biến cục bộ

+ Các biến của chương trình chính được gọi là biến toàn cục

+ Một chương trình con có thể có hoặc không có tham số hình thức, có thể có hoặc không có biến cục bộ - Thực hiện chương trình con: để thực hiện (gọi) một chương trình con, ta cần phải

- Lời gọi thực thi: <tên thủ tục>(<danh sách tham số lúc thực thi>);

- Trong lệnh gọi thủ tục, các tham số hình thức được thay bằng các tham số thực tương ứng là các giá trị cụ thể được gọi là tham số giá trị (tham trị)

IV/ Cách viết và sử dụng hàm:

Function <tên hàm>[(<danh sách tham số>)]:<kiểu dữ liệu trả về>;

[<phần khai báo>]

Trang 16

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Begin

[<các dãy lệnh>]

<tên hàm>:=<biểu thức>;

End;

- Lời gọi thực thi: <tên biến>:=<tên hàm>[(<danh sách tham số lúc thực thi>)];

- Chú ý: kiểu dữ liệu là kiểu dữ liệu của giá trị mà hàm trả về và chỉ có thể là các kiểu: integer,real, char, boolean, string

V/ Tham số và cách truyền tham số:

- Tham số tại nơi gọi: tham số thực

- Tham số tại nơi được gọi: tham số hình thức

Kiểu tham số hình thức Khai báo Giá trị của tham số thực tương ứng

sau khi thực hiện chương trình con

+ Quy tắc 1: số lượng tham số hình thức và số lượng tham số thực phải bằng nhau

+ Quy tắc 2: các tham số hình thức và tham số thực phải tương ứng với nhau theo từng vị trí + Quy tắc 3: các tham số hình thức và tham số thực phải tương ứng với nhau vể kiểu dữ liệu.+ Quy tắc 4: với tham số hình thức được khai báo như là tham trị thì tham số thực tương ứng

có thể là hằng, biến, biểu thức, giá trị trả về từ hàm; với tham số hình thức được khai báo như

là tham biến thì tham số thực tương ứng chỉ có thể là biến

- Các quy tắc cho việc gọi chương trình con trong Pascal: Có 3 trường hợp mà một chương trình con A gọi được chương trình con B:

+ A là cha của B

+ A ngang cấp với B (A và B có chung một cha)

+ A bị bao bởi C, còn B và C ngang cấp

@ CẤU TRÚC CHUNG CỦA MỘT CHƯƠNG TRÌNH CÓ SỬ DỤNG CTC

- Kết quả của bài toán trả về 1 giá trị duy nhất

(kiểu vô hướng, kiểu string hoặc kiểu con trỏ).

- Lời gọi CTC cần nằm trong các biểu thức tính

toán

- Kết quả của bài toán không trả về giá trị nào hoặc trả về nhiều giá trị hoặc trả về kiểu dữ liệu

có cấu trúc (Array, Record, File).

- Lời gọi CTC không nằm trong các biểu thức tínhtoán

Trang 17

Giáo trình bài tập Pascal Nguyễn Văn Trọng

For i:=1 To n Do P:=P*i;

GiaiThua:=P;

End;

Ví dụ 2: Viết chương trình con để tìm điểm đối xứng của điểm (x,y) qua gốc tọa độ

Ý tưởng: Vì bài toán này trả về tọa độ điểm đối xứng (xx,yy) gồm 2 giá trị nên ta dùng thủ tục.

Procedure DoiXung(x,y:Integer; Var xx,yy:Integer);

xx, yy được gọi là tham biến (có từ khóa var đứng trước) vì sau khi ra khỏi CTC giá trị của nó bị thay đổi.

IV BIẾN TOÀN CỤC VÀ BIẾN ĐỊA PHƯƠNG

Biến toàn cục: là các biến được khai báo trong chương trình chính Các biến này có tác dụng ở mọi nơi trong

4.2 Phương pháp thiết kế giải thuật đệ qui

• Tham số hóa bài toán

• Tìm trường hợp suy biến

• Phân tích các trường hợp chung (đưa về các bài toán cùng loại nhưng nhỏ hơn)

Cấu trúc của một thủ tục đệ quy:

- Phần neo: chứa các tác động của hàm hoặc thủ tục với một giá trị ban đầu

- Phần hạ bậc: tác động cần được thực hiện cho giá trị hiện thời của các tham số được định nghĩa bằng các tác động

đã được định nghĩa trước đây

VD: Function GT (n: word): longint;

Trang 18

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Ví dụ: Viết hàm đệ qui để tính n! = 1.2 n

• Tham số hóa: n! = Factorial(n);

• Factorial(0) = 1 (trường hợp suy biến)

• Factorial(n) = n*Factorial(n-1) (trường hợp chung)

Function Factorial(N:integer):Longint;

Begin

If N=0 Then Factorial:=1

Else Factorial:=N*factorial(N-1); { lời gọi đệ qui }

End;

4.3 Giải thuật quay lui

Bài toán:

Hãy xây dựng các bộ giá trị gồm n thành phần (x1, ,xn) từ một tập hữu hạn cho trước sao cho các bộ đó thỏa mãn yêu cầu B cho trước nào đó

Phương pháp chung

Giả sử đã xác định được k-1 phần tử đầu tiên của dãy: x1, ,xk-1 Ta cần xác định phần tử thứ k Phần tử này được xác định theo cách sau:

- Giả sử Tk: tập tất cả các giá trị mà phần tử xk có thể nhận được Vì tập Tk hữu hạn nên ta có thể đặt nk là số phần tử của Tk theo một thứ tự nào đó, tức là ta có thể thành lập một ánh xạ 1-1 từ tập Tk lên tập {1, 2, , nk}

- Xét j∈{1, 2, , nk} Ta nói rằng “j chấp nhận được” nếu ta có thể bổ sung phần tử thứ j trong Tk với tư cách là phần tử xk vào trong dãy x1, ,xk-1 để được dãy x1, ,xk

- Nếu k=n: Bộ (x1, ,xk) thỏa mãn yêu cầu B, do đó bộ này được thu nhận

- Nếu k<n: Ta thực hiện tiếp quá trình trên, tức là phải bổ sung tiếp các phần tử xk+1 vào dãy x1, ,xk

Sau đây là thủ tục đệ qui cho giải thuật quay lui:

Procedure THU(k:Integer);

Var j:Integer;

Begin

For j:=1 To nk Do

If <j chấp nhận được> Then

Begin

<Xác định xk theo j>;

If k=n Then <Ghi nhận một bộ giá trị> Else THU(k+1); {Quay lui}

End;

End;

Ví dụ: Liệt kê các dãy nhị phân có độ dài n

Program DayNhiPhan;

Var b:Array[1 20] Of 0 1; {Dãy nhị phân có độ

dài tối đa là 20}

n:Byte;

Procedure InKetQua;

Var i:Byte;

Begin

For i:=1 To n Do Write(b[i]);

Writeln;

End;

Procedure THU(k:Byte);

Var j:Byte;

Begin

For j:=0 To 1 Do {Tập giá trị của dãy nhị phân}

Begin b[k]:= j;

If k=n Then InKetQua Else THU(k+1); {Quay lui}

End;

End;

Begin Write(‘n = ‘); Readln(n);

THU(1);

Readln;

End

V TẠO THƯ VIỆN (UNIT)

5.1 Cấu trúc của một Unit

UNIT <Tên Unit>; {phải trùng với tên file}

INTERFACE

USES ;

CONST ;

TYPE ;

VAR .;

Procedure <Tên thủ tục>[(Các tham số)];

Function <Tên hàm>[(Các tham số)]:<Kiểu

hàm>;

IMPLEMENTATION

Procedure <Tên thủ tục>[(Các tham số)];

[Các khai báo]

Trang 19

Giáo trình bài tập Pascal Nguyễn Văn Trọng

End;

END

Chú ý:

• Tên của Unit phải trùng với tên file

• Chỉ có những chương trình con được khai báo ở phần INTERFACE mới sử dụng được ở các chương trìnhkhác

• Các thủ tục và hàm được khai báo ở phần INTERFACE thì bắt buộc phải có trong phần IMPLEMENTATION

If a>b Then a:=a-b Else b:=b-a;End;

UCLN:=a;

End;

Function NGUYENTO(n:Word):Boolean;Var d,i:Word;

Begind:=0;

For i:=2 To n DIV 2 Do

If n MOD i=0 Then d:=d+1;

Writeln(m,’ khong phai la so nguyen to!’)Readln;

Trong bảng mã ASCII, số thứ tự của chữ cái hoa nhỏ hơn số thứ tự của chữ cái thường là 32 Vì vậy ta có thể dùng

2 hàm CHR và ORD để chuyển đổi

Trang 20

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Writeln(‘Ky tu hoa la: ‘, LOWCASE(ch));

Write(‘Nhap n=’); Readln(n);

Writeln(‘x mu n = ‘, XMU(x,n):0:2);

Readln;

End

Bài tập 4.5: Viết thủ tục KHUNG(x1,y1,x2,y2:Integer); để vẽ một khung hình chữ nhật có đỉnh trên bên trái là (x1,y1)

và đỉnh dưới bên phải là (x2,y2)

{Vẽ 2 viền dọc của khung}

For j:=y1+1 To y2-1 do Begin

Writeln(n:5,'|',i:2);

n:=n Div i;

End;

i:=i+1;

Trang 21

Giáo trình bài tập Pascal Nguyễn Văn Trọng

VD: For i:=1 to 40 do Writeln (Fibo (i));

Khuyến cáo: Không nên lạm dụng đệ quy để

viết chương trình con vì khi gọi chương trình con

với tham số lớn máy sẽ khởi tạo một loạt biến cục

bộ và chúng chỉ được giải phóng khi thoát khỏi

Function MuN (A,n : Real) : Real;

Begin MuN := Exp (n*LN (A)); End;

Gọi hàm: MuN (3,4) = 81

4.Tính n m :

Function CanN (A,n : Real) : Real;

Begin CanN := Exp (1/n*LN (A)); End;

a:= Abs (a); b:= Abs (b);

If (a=0) and (b<>0) then Begin UCLN:=b;

While b<>0 do Begin

If b=0 then UCLN:=a Else UCLN:=UCLN (b,a mod b);

End;

Lưu ý: Tính BCNN (a,b) theo công thức: BCNN

(a,b) = a*b div UCLN (a,b))

6.Kiểm tra số nguyên tố:

Function SNT (x: Word): Boolean; {Hàm kiểm tra

số nguyên tố theo định lý}

Var p: Integer; f: Boolean;

Begin

If x < 2 then Begin SNT:= False;

Trang 22

Giáo trình bài tập Pascal Nguyễn Văn Trọng

7.Đổi số từ hệ đếm X bất kỳ sang hệ thập phân:

Function HX10 (HX: String; X:Integer): Integer;

Var i,n,cs,e: Integer;

Begin

If H10 = 0 then H10X:= '0' Else

Begin HX:='';

While H10 <> 0 do Begin

cs:= H10 mod X;

Case cs of 10: HX:= 'A' + HX;

A BÀI TẬP VỀ CÂU LỆNH CÓ CẤU TRÚC

Bài 1 Kiểm tra số nguyên tố

Var n,I : integer; ok : boolean;

While (n mod I <> 0) and ( i<= sqrt(n));

If i > sqrt(n) then ok:= trueElse ok:= false;

End;

If ok then write (‘ Đó là số nguyên tố’)Else write (‘ Đó không à số nguyên tố’);Readln;

Until (i>k) or (n mod I = 0) ;

If i > k then write (‘ Đó là số nguyên tố’)Else write (‘ Đó không à số nguyên tố’);Readln;

Trang 23

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Write ('Nhap n:');Readln(n);

Write ('Cac so nguyen to nho hon ',n,' la:');

for i:=2 to trunc(sqrt(n)) do

if n mod i=0 then exit;

writeln('tong la: ',tong);

writeln('tich la: ',tich);

Write('Hãy nhập tên của bạn : '); Readln(St);

FOR i:= 1 TO Length(St) DO

Trang 24

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Writeln('So Tien phai tra trong thang la: ',SoTien);

write ('Nhap so a:= '); readln (a);

write ('Nhap so b:= '); readln (b);

write ('Nhap so c:= '); readln (c);

max:=a; {cái này dạng như chúng ta giả sử a là số lớn nhất :D }

if max<b then max:=b;

if max<c then max:=c;

write ('so lon nhat max:= ',max);

write ('Nhap a:= ');readln (a);

write ('Nhap b:= ');readln (b);

write ('Nhap c:= ');readln (c);

if (a>0) and (b>0) and (c>0) and (a+b>c) and (b+c>a

) and (a+c>b) then

begin

write ('3 cạnh tren tao thanh 1 tam giac');

if (a=b) and (b=c) then write ('Day la tam giac deu');

if (a=b) or (b=c) or (a=c) then weite ('Day la tam giac can');

End.

Bài 12: Nhập vào một số, máy sẻ báo: chẳng hay lẻ, chính phương hay ko?

Var a: integer;

Begin

Write(‘nhap a:’); readln(a);

If a mod 2 = 0 then writeln(a,’la so chan’)

Trang 25

Giáo trình bài tập Pascal Nguyễn Văn Trọng

write(0); {chu so dau tien la 0}

Writeln(‘ Tong so tien lai :’,Y – X);

Writeln(‘so thang gui:’,month);

Write(‘nhap nam hien tai:’); readln(M);

Write(‘nhap thang hien tai:’); readln(N);

Case N of

1,3,5,7,8,10,12: writeln(‘co 31 ngay’);4,6,9,11 : writeln(‘co 30 ngay’);

2 : writeln(cos 29 ngay’)Else

Writeln('So ',i,' co gia tri bang tong lap phuong cac chu so cua no.');

1 2

Trang 26

Giáo trình bài tập Pascal Nguyễn Văn Trọng

- Tổng các chữ số của n bằng bao nhiêu?

- Tìm chữ số đầu tiên của n

- Giả sử trong cách biểu diễn thập phân của n có dạng sau: akak - 1 a2a1a0

Write('Ban hay nhap so thu nhien n:');Readln(n);

if n<0 then Writeln('n phai la so tu nhien.');

Writeln('Tong cac chu so cua ',n,' la:',k,'.');

Writeln('Chu so dau tien cua ',n,' la:',s[1],'.');

Writeln('Tong S la:',m);

Repeat Write('Ban hay nhap so m(m<=so chu so cua n):'); Readln(m);

if m>length(s) then Writeln('m phai <=',length(s), '.' );

Until m<=length(s);

Delete(s,1,length(s)-m);

k:=0;

For i:=1 to length(s) do k:=k+(ord(s[i])-48);

Writeln('Tong ',m,' chu so cuoi cung cua ',n,' la:',k,'.'); Readln;

if x=1 then Writeln('Ket qua la:0') else

begin tinh;

Writeln('Ket qua la:',t:0:10);

end;

end else Writeln('Cac phan tu co mau la 0 nen the chia duoc.');

for i:=2 to n do tong:=tong+1/i;

writeln('Ket qua, S =',tong:7:4);

) 1 (

) 1 ( 5

) 1 ( ) 1 ( 3

) 1 ( ) 1 (

) 1 (

1 2

1 2 5

5 3

3

+ +

+

− +

+ +

− + +

− + +

x x

x x

x x

x

0001 , 0 )

1 ( ) 1 2 (

) 1 (

1 2

1 2

<

+ +

x

Trang 27

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Bài 23.Lập trình đưa ra màn hình các số nguyên tố từ 1 đến 100.

for i:=2 to round(sqrt(a)) do

if (a mod i)=0 then d:=d+1;

write(i:5);

k:=k+1;

if k=13 then begin writeln;

k:=0;

end;

end;

writeln;

writeln('An Phim Bat ky de THOAT! ');

repeat until keypressed;

if x=0 then Writeln('Ban phai nhap x khac 0.');

Until x<>0;

Write('Ket qua la:',tinh(2):0:2);

Readln;

End.

Bài 25 Số hoàn hảo

Nhập từ bàn phím một số tự nhiên N Lập chương trình tìm tất cả các số hoàn hảo có giá trị từ 1 đến N (nếu có).Nếu không có hãy đưa ra thông báo “Không có” (Số hoàn hảo là một số tự nhiên thoả mãn điều kiện: giá trị số đóbằng tổng các ước số thực sự của nó mà không kể chính số đó)

Bài 26: Tính số ngày giữa 2 mốc thời gian bất kỳ:

Yêu cầu nhập vào 6 số: nd, td, yd, nc, tc, yc là ngày tháng năm bắt đầu và ngày tháng năm cuối ( 2000 < yd

< yc) Hãy tính xem giữa hai mốc thời gian đó có bao nhiêu ngày Biết rằng: Tháng 4, 6, 9, 11 có 30 ngày.Tháng 1, 3,

5, 7, 8, 10, 12 có 31 ngày.Tháng 2 nếu năm nhuận có 29 ngày còn nếu không nhuận thì có 28 ngày Bốn năm có mộtnăm nhuận, biết rằng năm 2000 thì năm nhuận

Trang 28

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Writeln('Ban hay nhap ngay thang nam cuoi:');

For i:=yd+1 to yc-1 do

if i mod 4<>0 then n:=n+365 else n:=n+366;

For i:=td to 12 do n:=n+ng(i,yd);

Bài 27: Trên một bàn cờ có n x n ô, hãy lập trình xếp 2n

quân cờ lên bàn cờ sao cho không có quá 2 quân cờ trên 1hàng và trên 1 cột Chỉ cần in ra một cách xếp lên mànhình (dùng dấu ‘*’làm ký hiệu quân cờ )

a.Tìm hai phần tử liên tiếp nhau có tổng bằng n.

b Tính khoảng cách giữa hai vị trí của phần tử lớn nhất và bé nhất đầu tiên trên A.

{Tìm hai phần tử liên tiếp nhau có tổng bằng n}

While (A[i] + A[i+1]) <> n) and (i<= n-1) do Inc(i);

If i>=n then write (‘hai phan tu co chi so la:’,i,’

va’,i+1);

{Tính khoảng cáhc giữa hai vị trí của phần tử lớn nhất

và bé nhất đầu tiên trên A}

Type Mass = array[1 NMax, 0 NMax-1] of real;

Var A: Mass; i, j, N:byte; C: real;

A[i,j]:= A[N-i+1,j];

A[N-j+1,j]:= C;

end;

for i:= 1 to N do begin

for j:= 0 to N-1 do write (A[i,j]:5:2,' '); writeln;

Trang 29

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Bài 5: Sắp xếp một dãy số theo thứ tự từ nhỏ đến lớn

Tiến trình của bài toán:

- Giả sử chuỗi số của ta có n phần tử Lần lượt cho chương trình đọc giá trị của các phần tử nhập được

- Một thủ tục (Procedure) sẽ làm công việc sắp xếp như sau : đầu tiên đưa phần tử thứ nhất so sánh với các phần tử tiếp theo, nếu nó lớn hơn phần tử so sánh thì đem đổi chổ giá trị của hai phần tử với nhau Sau đó tiếp tục đem phần tửthứ 2 so sánh các phần tử tiếp theo theo trình tự như vậy, và cứ như thế cho đến phần tử thứ n - 1

interchange ; Writeln ; Writeln (' Số liệu đã sắp xếp : ') ; Writeln ;

FOR i := 1 TO n DO Writeln ( ‘x[ ‘, i : 3, ‘ ] = ‘, x[i] : 4 : 1 ) ; Readln;

if odd(a[i,j]) then write(a[i,j],' ');

{tong so hang le}

{co bao nhieu gia tri nam trongg 4 6}

L : = 0;

For := 1 to n doFor j :=1 to n div 2 do

If (A[I,j] > = 4) and (A[I,j] <= 6) thenInc(L);

Writeln(so phan tu nam trong khoang 4 6 la’,L);

{tong duong cheo chinh}

Dcc := 0;

For i:=1 to m doFor j:=1 to n doBegin

If i=j then Dcc:=dcc + A[I,j];

Trang 30

Giáo trình bài tập Pascal Nguyễn Văn Trọng

for i:= 1 to N do begin

for j:= 0 to N-1 do write (A[i,j]:5:2,' '); writeln;

Writeln(‘mang do sap xep xong’);

For i := 1 to n do write (A[i]:5:3);

{chen M vao day}

Write(‘nhap gia tri M:’); readln(M);

If M >= A[i] then A[i+1] := MElse

Begin

J :=1;

While M> A[j] do J := j + 1;

For i := n+1 downto j – 1 doA[i] := A[i-1];

{ tinh tong binh phuong cac so am trong day }

If A[i] < 0 then S:= S + sqr(X[i]);

Writeln(‘tong la:’,S:5);

{ Tim so lon nhat}

Max := 1;

if X[i] max then max := X[i];

writeln(‘so lon nhat la:’, max);

{ tim phan tu dau tien chia het cho 10}

Ok:= false;

I := 1;

While (not ok) and (I <=n) do

If X[i] mod 10 = 0 then ok := trueElse

Bài 9:Cho dãy số thực bất kỳ, hãy kiểm tra xem dãy số đã sắp xếp chưa? Nếu sắp xếp rồi thì theo chiều nào? Nếu chưa

thì sắp xếp theo chiều tăng dần

Trang 31

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Write('Ban hay nhap so thu ',i,':');Readln(a[i]);

if (i>1) and (k<>3) then

Writeln('Day chua duoc sap xep.');

Writeln('Sap xep lai theo thu tu tang dan:'); For k:=1 to n-1 do

For i:=1 to n do

if a[k]<a[i] then begin

m:=a[i];a[i]:=a[k];a[k]:=m;

end;

For i:=1 to n do Write(a[i]:0:2,' ');

m:=0;

For k:=1 to i-1 do

if a[i]=a[k] then begin m:=1;break;end;

if m=0 then Write(a[i],' ');

end;

Readln;

End

Bài 11.Viết chương trình nhập vào một ma trận vuông k hàng, k cột Sau đó sắp xếp lại sao cho phần tử có trị tuyệt đối

lớn nhất trong mỗi hàng sẽ nằm trên đường chéo chính

Write('Ban hay nhap so k(hang,cot:');Readln(n);

if n<=0 then Write('Ban phai nhap so>0.');

For i:=2 to n do if abs(a[m,k])<abs(a[i,k]) then m:=i;

i:=a[m,k];a[m,k]:=a[k,k];a[k,k]:=i;

end;

clrscr;

For k:=1 to n do For i:=1 to n do begin

if i=k then Textcolor(14) else Textcolor(7); Gotoxy(i*4,k);Write(a[i,k]);

end;

Readln;

End.

Bài 12 Viết chương trình nhập vào một dãy n số nguyên và in ra màn hình các thông tin sau (Nếu không có số nào

thoả mãn thì đưa ra thông báo không có):

- Số hạng âm lớn nhất của dãy và chỉ số của nó;

- Số hạng dương nhỏ nhất của dãy và chỉ số của nó;

- Số lượng số hạng dương liên tiếp nhiều nhất;

- Số lượng số hạng âm liên tiếp có tổng lớn nhất;

- Số lượng số hạng liên tiếp đan dấu nhiều nhất

uses crt;

Var a:array [1 1000] of longint;

kq:array [1 5] of integer;

i,k,n,d1,d2,d3:integer;

Trang 32

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Begin

clrscr;

Repeat

Write('Ban hay nhap so phan tu cua day:');Readln(n);

if n<=0 then Writeln('Ban phai nhap so lon hon 0.');

Until n>0;

For i:=1 to n do

begin

Write('Ban hay nhap so thu ',i,':');Readln(a[i]);

if ((a[i]>a[kq[1]]) or (kq[1]=0)) and (a[i]<0) then

if (a[i]<0) and (a[i-1]<0) and (i>1) then

begin if d2=0 then d2:=2 else d2:=d2+1;end

else

begin if kq[4]<d2 then kq[4]:=d2;d2:=0;end;

if (a[i]*a[i-1]<0) and (i>1) then

begin if d3=0 then d3:=2 else d3:=d3+1;end

else Writeln('Khong co so am nao trong day.');

if kq[2]<>0 then Writeln('So hang duong nho nhat la so thu ',kq[2],':',a[kq[2]],'.')

else Writeln('Khong co so duong nao trong day.');

if kq[3]<>0 then Writeln('So luong cac so duong lien tiep lon nhat la:',kq[3],'.')

else Writeln('Khong co cac so duong nao lien tiep trong day.');

if kq[4]<>0 then Writeln('So luong cac so am lien tiep lon nhat la:',kq[4],'.')

else Writeln('Khong co cac so am nao lien tiep trong day.');

if kq[5]<>0 then Writeln('So luong cac so dan dau lien tiep lon nhat la:',kq[5],'.')

else Writeln('Khong co cac so dan dau nhau nao lien tiep trong day.');

Write('Ban hay nhap so n:');Readln(n);

if n<=0 then Writeln('Ban phai nhap so lon hon 0.');

Trang 33

Giáo trình bài tập Pascal Nguyễn Văn Trọng

write(b[i,j]:5) writeln;

write('An Phim Bat ky de THOAT! ');

repeat until keypressed;

End.

Bài 15: Nhập vào hai số tự nhiên n và m Hãy in ra chu kỳ của phân số n/m

Ví dụ: 1/7 có chu kỳ là (142857).Còn các phân số hữu hạn thì chu kỳ bằng 0

Repeat Write('Ban hay nhap so tu nhien n:');Readln(n); Write('Ban hay nhap so tu nhien m:');Readln(m);

if n*m<0 then Writeln('Ban phai nhap 2 so tu nhien.');

if m=0 then Writeln('m phai khac 0.');

Until (n*m>=0) and (m<>0);

if n mod m=0 then ck:='0' else tinh(m,n);

Writeln(n,'/',m,' co chu ky = ',ck);

Readln;

End

Bài 16: Cho số tự nhiên n và dãy các số thực a1, a2, an, trong đó hãy xác định số lượng các phần tử kề nhau mà:

a Cả hai số đều dương

b Cả hai số đều cùng dấu đồng thời số đứng trước có giá trị tuyệt đối lớn hơn số đứng sau

c Cả hai số trái dấu nhau

Readln(n);

if n<=0 then Writeln('Ban phai nhap so lon hon 0.'); Until n>0;

For i:=1 to n do begin

Trang 34

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Write('Ban hay nhap so thu ',i,':');Readln(a[i]);

if i>1 then

begin

if (a[i]>0) and (a[i-1]>0) then kq[1]:=kq[1]+1;

if (a[i]*a[i-1]>=0) and (abs(a[i-1])>abs(a[i])) then

Writeln('Co ',kq[3],' cap phan tu ke nhau ma ca hai so trai dau nhau.');

Readln;

End

Bài 17:Tam giác Pascal

Hãy in ra màn hình tam giác Pascal có n dòng và tính xem ở hàng thứ i có bao nhiêu số j (với n, i, j nhập từ bàn phím).uses crt;

if i>1 then a[i,k]:=a[i-1,k-1]+a[i,k-1];

Gotoxy(37-k*6 div 2+i*6,k+1);Write(a[i,k]); end;

Writeln;

if i>14 then begin Textcolor(4);

Writeln('Ban nhap so n hoi lon so voi be rong man hinh cho phep.');

Textcolor(7);

end else Writeln;

Repeat Repeat nhap('Ban hay nhap so i(hang i):',i);

if (i>n) or (i<1) then Writeln('So i phai nam trong khoang tu 1-

Bài 18 Bài toán số nguyên tố tương đương

Hai số tự nhiên được gọi là nguyên tố tương đương nếu chúng có chung các ước số nguyên tố Ví dụ như các số 75 và

15 là nguyên tố tương đương vì cùng có các ước nguyên tố là 3 và 5.

Cho trước hai số tự nhiên M và N Hãy viết chương trình kiểm tra xem các số này có là nguyên tố tương đương với nhau không?

Trang 35

Giáo trình bài tập Pascal Nguyễn Văn Trọng

if (m mod i=0) and (n mod i=0) then

begin

if k=0 then

Writeln('Hai so tren la hai so nguyen to tuong

duong voi nhau vi co cac uoc nguyen to:');

Readln;

End

Bài 19 Số siêu nguyên tố

Số siêu nguyên tố là số nguyên tố mà khi bó đi một số tuỳ ý các chữ số bên phải của nó thì phần còn lại vẫn tạo thành một số nguyên tố Ví dụ: 7333 là số siêu nguyên tố có 4 chữ số vì 733; 73; 7 đều là các số nguyên tố.

Hãy lập chương trình nhập dữ liệu vào là một số nguyên N ( 0 < N < 10 ) và đưa ra kết quả là các số siêu nguyên tố

begin For k:=1 to 6 do

if (i=1) or ((i>1) and (k<>2) and 1)+d[k])) then

begin s[i]:=d[k];

if i=n then begin Writeln(s);

m:=m+1;

end else tim(i+1);

Bài 20 Tìm điểm yên ngựa

Cho bảng số A kích thước m x n Phần tử Aij (nằm ở hàng i, cột j ) được gọi là phần tử yên ngựa nếu nó là phần tử nhỏ nhất trong hàng i đồng thời là phần tử lớn nhất trong cột j ( hoặc là phần tử lớn nhất trong hàng i đồng thời là phần tử nhỏ nhất trong cột j ).Ví dụ trong 2 bảng số sau:

ra các phần tử yên ngựa ( nếu có )

h[i,1]:=1;h[i,2]:=1;

For k:=2 to m do begin

if a[k,i]<a[h[i,1],i] then h[i,1]:=k;

if a[k,i]>a[h[i,2],i] then h[i,2]:=k;

end;

end;

Trang 36

Giáo trình bài tập Pascal Nguyễn Văn Trọng

if a[i,k]<a[i,c[i,1]] then c[i,1]:=k;

if a[i,k]>a[i,c[i,2]] then c[i,2]:=k;

Write('Ban hay nhap so hang:');Readln(n);

Write('Ban hay nhap so cot:');Readln(m);

For k:=1 to n do For i:=1 to m do begin

Write('Ban hay nhap phan tu A[',i,',',k,']:');Readln(a[i,k]);

end; clrscr;

For k:=1 to n do For i:=1 to m do begin

Readln;

End.

Bài 21:Cho một dãy số bất kỳ Hãy kiểm tra xem dãy đó được sắp xếp hay chưa? Nếu sắp xếp rồi thì:

- Trả lời dãy đó được sắp xếp theo chiều tăng hay giảm?

- Chèn một phần tử vào dãy đã sắp xếp đó sao cho thứ tự sắp xếp không thay đổi ( phải chèn trực tiếp, không đượcsắp xếp lại )

Nếu dãy chưa sắp xếp, hãy sắp xếp chúng theo chiều tăng dần

Write('Nhap so thu ',i,':');Readln(a[i]);

if (i>1) and (k=0) then

For i:=1 to n-1 do For k:=i+1 to n do

if a[k]<a[i] then begin

m:=a[i];a[i]:=a[k];a[k]:=m;

end;

Writeln('Sap xep lai theo chieu tang dan:');

For i:=1 to n do Write(a[i],' ');

end;

Trang 37

Giáo trình bài tập Pascal Nguyễn Văn Trọng

type matran=array[1 50,1 50] of integer;

var A:matran; n,i:integer;

procedure nhapmatran(var A:matran;n,m:integer);

while i<=n do begin inc(i);inc(j);

if A[i,j]>max then max:=A[i,j];

write('Nhap vao so n=');readln(n);

nhapmatran(A,n,n);clrscr;xuatmatran(A,n,n); write('Nhap hang can xoa: ');readln(x);

write(' Nhap cot can xoa: ');readln(y);

t:=1; k:=1;

for i:=1 to n do begin for j:=1 to n do

if (i<>x) and (j<>y) then begin A[t,k]:=A[i,j];inc(k); end;

if i<>x then inc(t);

if (k>n-1) and (i<n) then k:=1;

end;

xuatmatran(A,n-1,n-1);

readln;

End.

Trang 38

Giáo trình bài tập Pascal Nguyễn Văn Trọng

Bài 24:Cho dãy số nguyên a 1 , a 2 , an Hãy tìm độ dài đoạn dài nhất các phần tử liên tiếp của dãy trên sao cho

while (A[j]=A[j+1]) and (j<=i) do begin inc(j);inc(d); end;

For i:= 1 to 10 do a[i]:=random(99)+1;

For i:= 1 to 10 do Write('Phan tu thu ',i,' =',a[i];

For i:= 1 to 10 do

Begin Us:=0;

For j:=2 to (i-1) do If (a[i] mod j)<>0 then us:=us+1;

If Us<0> then write('Phan tu thu ',i,'=',a[i],' la so nguyen to');

write('Nhap so luong phan tu: '); readln(so_luong);

{ nhap tung phan tu cua mang }

for i:=1 to so_luong do

begin

write('a[', i, '] = ');

readln(a[i]);

end;

{ tim vi tri cua cac phan tu max, min }

{ gia su phan tu nho nhat va lon nhat deu nam o vi tr

if (a[i]<a[vt_min]) then vt_min:=i;

end;

{ dua ket qua ra man hinh } writeln('Phan tu nho nhat: ', a[vt_min], ' nam o vi tri: ', vt_min);

writeln('Phan tu lon nhat: ', a[vt_max], ' nam o vi tri: ', vt_max);

readln;

END

C BÀI TẬP VỀ XÂU

Bài 1 Đếm số kí tự trong chuổi

Var a: array['A' 'Z'] of Integer;

s: String; i: Integer; c: Char;

Begin

For c:= 'A' to 'Z' do

a[c]:= 0;

Write('Nhap chuoi S: '); Readln(s);

For i:=1 to Length(s) do

Begin c:= Upcase(s[i]);

if ('A' <= c) and (c <= 'Z') then Inc(a[c]);

Trang 39

Giáo trình bài tập Pascal Nguyễn Văn Trọng

{ Loại bỏ những khoảng trắng đầu }

While (l <= r) and (s[l] = ' ') do Inc(l);

{ Loại bỏ những khoảng trắng cuối }

While (r > l) and (s[r] = ' ') do Dec(r);

i := Pos(' ', s);

End;

Delete(s, 1, 1); { Xóa cầm canh đầu }Delete(s, Length(s), 1); {Xóa cầm canh cuối }Writeln('Chuoi da chuan hoa: ', s);

Writeln('Chuoi doi xung');

Exit;

ElseDoixung(st,low +1, upp – 1,ok);

Bài 5:Nhập vào một xâu ký tự bất kỳ Hãy chuẩn hoá xâu đó bằng cách chỉ giữ lại một dấu trống (dấu cách) giữa các

từ (từ được hiểu là một dãy các ký tự liên tiếp không chứa dấu cách)

Trang 40

Giáo trình bài tập Pascal Nguyễn Văn Trọng

if k:=i:=j do write('so lan xuat hien s1 trong s2 la:',k);

while s[length(S)]=#32 do delete(s,length(s),1);

while pos(#32#32,s)>0 do delete(s,pos(#32#32,s),1)

if i-a>max then begin max:=i-a;

Bài 10 : Cho 1 biểu thức ngoặc chưa hoàn chỉnh Hãy thực hiên các bước thêm các dâu ngoặc "(" hoặc ")" để được 1

biểu thức ngoặc đúng sao cho số bước là ít nhất

begin dec(sm);

p:=p+s[i];

end else p:=p+s[i];

for i:= 1 to sm do p:=p+')';

writeln('Result: ',p);

readln;

End.

Ngày đăng: 28/10/2017, 02:35

TỪ KHÓA LIÊN QUAN

w