Giáo trình Tin học đại cương A1 - GS.TSKH. Hoàng Kiếm

284 14 0
Giáo trình Tin học đại cương A1 - GS.TSKH. Hoàng Kiếm

Đ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

Cây viết máy tính - pen-based computer: như phần trước có nói đến, trong các loại máy hệ xách tay có loại nhỏ gọn nhất có thể bỏ vào áo khoác - loại trợ lý kỹ thuật số hay còn gọi là M[r]

(1)(2)

CHƯƠNG 1

TỔNG QUAN VỀ MÁY TÍNH 1 GIỚI THIỆU

Máy tính công cụ xử lý thông tin Về bản, q trình xử lý thơng tin máy tính - q trình xử lý thơng tin người - có bốn giai đoạn chính:

Nhận thơng tin (Receive input): thu nhận thông tin từ giới bên ngồi vào máy tính Thực chất q trình chuyển đổi thơng tin giới thực sang dạng biểu diễn thơng tin máy tính thông qua thiết bị đầu vào

Xử lý thơng tin (process information): biến đổi, phân tích, tổng hợp, tra cứu thông tin ban đầu để có thơng tin mong muốn

Xuất thơng tin (produce output): đưa thông tin kết (đã qua xử lý) trở lại giới bên ngồi Ðây q trình ngược lại với q trình ban đầu, máy tính chuyển đổi thơng tin máy tính sang dạng thơng tin giới thực thông qua thiết bị đầu

Lưu trữ thông tin (store information): ghi nhớ lại thơng tin ghi nhận để đem sử dụng lần xử lý sau

Ðể đáp ứng bốn thao tác máy tính thơng thường gồm bốn phận hợp thành, phận có chức riêng:

(3)

Thiết bị xử lý (đơn vị xử lý trung tâm - CPU )thực thao tác xử lý, tính tốn kết quả, điều hành hoạt động tính tốn máy vi tính Có thể xem CPU não người

Thiết bị xuất (output): thực thao tác gởi thông tin ngồi máy vi tính, thường dùng hình máy tính làm thiết bị xuất chuẩn, thêm số khác máy in…

Thiết bị lưu trữ (storage devices): dùng để lưu giữ thông tin Lưu trữ sơ cấp (primary memory) nhớ máy tính dùng để lưu tập lệnh chương trình, thơng tin liệu sẵn sàng làm việc tùy theo yêu cầu CPU Lưu trữ thứ cấp (secondary storage) cách lưu trữ đơn với mục đích lưu giữ liệu, cách dùng thiết bị lưu trữ đĩa cứng, đĩa mềm, băng từ, CD

2 THÔNG TIN - BIỂU DIỄN VÀ XỬ LÝ THƠNG TIN Khái niệm thơng tin (information) sử dụng thường ngày Con người có nhu cầu đọc báo, nghe đài, xem phim, video, tham quan, du lịch, tham khảo ý kiến người khác, để nhận thêm thông tin Thông tin mang lại cho người hiểu biết, nhận thức tốt đối tượng đời sống xã hội, thiên nhiên, giúp cho họ thực hợp lý công việc cần làm để đạt tới mục đích cách tốt

(4)

Khi tiếp nhận thơng tin, người thường phải xử lý để tạo thơng tin mới, có ích hơn, từ có phản ứng định Người tài xế chăm quan sát người, xe cộ lại đường, độ tốt xấu mặt đường, tính kỹ thuật vị trí xe để định, cần tăng tốc độ hay hãm phanh, cần bẻ lái sang trái hay sang phải nhằm đảm bảo an tồn tối đa cho chuyến xe

Thơng tin phát sinh, lưu trữ, truyền, được tìm kiếm, chép, xử lý, nhân Thơng tin cũng biến dạng, sai lệch bị phá hủy.

Mỗi tế bào sinh dục cá thể sinh vật mang thông tin di truyền định đặc trưng phát triển cá thể Gặp mơi trường khơng thuận lợi, thơng tin di truyền bị biến dạng, sai lệch dẫn đến hình thành cá thể dị dạng Ngược lại, tác động tốt di truyền học chọn giống, ta cấy làm thay đổi thông tin di truyền theo hướng có lợi cho người Thơng tin thể nhiều dạng thức khác sóng ánh sáng, sóng âm, điện từ, ký hiệu viết giấy khắc gỗ, đá, kim loại Về nguyên tắc, cấu trúc vật chất dòng lượng mang thơng tin Chúng gọi vật (giá) mang tin Dữ liệu (data) biểu diễn thông tin thể tín hiệu (signal) vật lý

(5)

Mỗi tín hiệu dùng để thể thơng tin khác Uống chén rượu để mừng ngày gặp mặt, uống chén rượu để giải sầu, để tiễn đưa người thân lên đường xa

Thông tin khái niệm trừu tượng, tồn khách quan, nhớ đối tượng, biến đổi đối tượng áp dụng để điều khiển đối tượng Thông tin làm tăng thêm hiểu biết người, nguồn gốc nhận thức Thông tin đối tượng kiện đối tượng đó, chúng giúp ta nhận biết hiểu đối tượng Thơng tin có liên quan chặt chẽ đến khái niệm độ bất định Mỗi đối tượng chưa xác định hồn tồn có độ bất định Tính bất định chưa cho biết cách xác đầy đủ đối tượng

Ðộ bất định có liên quan chặt chẽ đến khái niệm xác suất -độ đo khả xảy kiện (biến cố) Nếu biến cố không xảy ra, xác suất có giá trị Nếu có biến cố chắn xảy ra, xác suất Ðại lượng xác suất có giá trị đoạn [0,1] Xác suất đối tượng A trú ngụ đâu địa bàn (4 quận huyện) Hà Nội trước có thơng tin bổ sung 1/9, cịn sau 1/5 Xác suất nhỏ độ bất định lớn Thơng tin đo Giả sử kiện tồn số n trạng thái đánh số 1, 2, , n trạng thái i xuất với xác suất Pi (0 < Pi < 1) C Shannon, vào năm 1948, đưa

(6)

thái kiện (đồng xác suất: p1= p2= 1/2) Ðộ

bất định trường hợp log22-1

Trong máy tính, thơng tin biểu diễn hệ đếm nhị phân Tuy dùng hai ký số mà ta gọi bit hệ nhị phân giúp máy tính biểu diễn - xử lý hầu hết loại thông tin mà người sử dụng văn bản, hình ảnh, âm thanh, video,

3 CÁC HỆ ĐẾM VÀ CÁC PHÉP TÍNH 3.1 Khái niệm hệ đếm & hệ đếm nhị phân

Các chữ số hệ đếm chữ số tối thiểu để biểu diễn số hệ đếm

Ví dụ

Hệ thập phân có chữ số bản: 0, 1, 2, 3, 4, 5, 6, 7, 8, Hệ nhị phân có chữ số bản: 0,

Ðặc biệt hệ thập lục phân có chữ số ký hiệu 0,…, 9, A, B, C, D, E, F Nếu số có giá trị lớn số biểu diễn cách tổ hợp chữ số theo công thức sau:

X = anan-1 a1a0 = anb n

+ an-1b n-1

+ + a1b + a0 (*) đó: b số hệ đếm,

a0, a1, a2, , anlà chữ số

X số hệ đếm số b Ví dụ

(7)

3.2 Chuyển đổi hệ đếm  Qui tắc

Ðể chuyển đổi số từ hệ thập phân sang hệ có số b (b  10) ta áp dụng cách làm sau:

Lấy số thập phân chia cho số b phần thương phép chia 0, số đổi phần dư phép chia theo thứ tự ngược lại

Ví dụ

Cho X = 610 nghĩa X = hệ thập phân X

được đổi thành 1102trong hệ nhị phân.

Cách đổi hình sau

 Qui tắc

Ðể chuyển đổi số từ hệ số b hệ thập phân ta sử sụng công thức (*)

(8)

2 10 2

3 11 3

4 100 4

5 101 5

6 110 6

7 111 7

8 1000 8

9 1001 9

10 1010 A

11 1011 B

12 1100 C

13 1101 D

14 1110 E

15 1111 F

 Qui tắc

Ðể chuyển số từ hệ nhị phân hệ thập lục phân ta thực sau:

Nhóm bit từ phải sang trái, sau thay nhóm bit giá trị tương ứng với hệ thập lục phân (tra theo bảng chuyển đổi trên)

Ví dụ: X = 11’10112= 3B16

 Qui tắc

(9)

Ví dụ: X = 3B16= 0011’10112= 11’10112

4 TỔNG QUAN CẤU TRÚC CỦA MÁY TÍNH VÀ CÁC THIẾT BỊ NGOẠI VI

4.1 Đơn vị xử lý trung tâm - CPU nhớ 4.1.1. Cách làm việc CPU

Ðơn vị xử lý trung tâm (Central Processing Unit) - CPU mạch xử lý liệu theo chương trình thiết lập trước Nó mạch tích hợp phức tạp gồm hàng triệu transitor bảng mạch nhỏ Phần lớn người dùng không cần biết đến CPU Một CPU thi hành hàng triệu lệnh giây, để vậy, CPU tiêu biểu phải có nhiều thành phần phức tạp với chức khác hoạt động nhịp nhàng với để hồn thành tập lệnh chương trình Ở xem qua thành phần bên CPU

(10)

Ðơn vị giải mã - Decode unit: thị cho đường truyền đọc lệnh lưu giữ địa nhớ riêng biệt Ðơn vị không định vị nạp lệnh thi hành mà nạp lệnh sau vào hàng chờ sẵn sàng hoạt động

Ðơn vị nối ghép đường truyền - Bus Interface Unit: phận dẫn truyền điều phối thông tin

Những nhà sản xuất vi xử lý phát triển kỹ thuật nhằm tăng tốc độ xử lý cho CPU Và vậy, nhớ ẩn -cache memory nhớ nhỏ tốc độ cao đặt bên trong xử lý nối trực tiếp với mạch xử lý để lưu trữ lệnh chuẩn bị thực hiện, hay lệnh thường xuyên dùng để sẵn sàng cho CPU Bộ nhớ xử lý kiểm sốt, người sử dụng khơng thể thâm nhập được, nhằm phục vụ cho việc tăng tốc độ tính tốn xử lý Loại cache memory nằm thân xử lý thường gọi cache nội hay cache sơ cấp - primary, hay gọi cache L1 (cache level 1) Loại cache memory nằm xử lý thường gọi cache ngoại hay cache thứ cấp - secondary cache, hay gọi cache L2 (cache level 2)

Ðơn vị điều khiển - control unit: có nhiệm vụ thơng dịch lệnh chương trình điều khiển hoạt động xử lý, điều tiết xác xung nhịp đồng hồ hệ thống

Mạch xung nhịp hệ thống - system clock: dùng để đồng thao tác xử lý CPU theo khoảng thời gian không đổi, khoảng thời gian chờ hai xung gọi chu kỳ xung nhịp Tốc độ theo xung nhịp hệ thống tạo xung tín hiệu chuẩn thời gian gọi tốc độ xung nhịp - tốc độ đồng hồ tính triệu đơn vị giây - Mhz

(11)

4.1.2. Lưu trữ sơ cấp: Bộ nhớ máy tính

Cơng việc CPU thi hành mã lệnh chương trình, CPU có khả giải phần liệu Như phần lại liệu đọc vào phải cần chỗ để lưu giữ lại sẵn sàng cho CPU xử lý, RAM hay nhớ nhận nhiệm vụ

Bộ nhớ truy cập ngẫu nhiên - Random Access Memory (RAM): loại thiết bị lưu trữ sơ cấp Chip RAM gồm nhiều mạch điện tử có chức lưu trữ lệnh liệu chương trình cách tạm thời Chính thuật ngữ truy cập ngẫu nhiên cho thấy tính chất loại nhớ Mỗi vị trí lưu trữ RAM truy cập trực tiếp, nhờ thao tác truy tìm cất trữ thực nhanh Nội dung lưu trữ trong RAM không cố định - volatile memory, có nghĩa phải ln có nguồn ni để lưu trữ nội dung thơng tin - điện là tất cả.

(12)

4.1.3. Cách làm việc nhớ

Bộ nhớ (Memory): mạch tích hợp phức tạp gồm hàng triệu tế bào nhớ (storage cell) - tế bào nhớ đơn vị lưu kiện Các thơng tin nhớ tập lệnh chương trình liệu hình ảnh, số phép tính số học hay luận lý có ký tự chữ Mỗi byte nhớ có địa riêng để CPU truy cập đến liệu Bộ nhớ có nhiều loại với đặc điểm cấu trúc tính sử dụng khác nhau, dùng để lưu kiện nhằm phục vụ cho việc xử lý thông tin CPU, loại nằm CPU hay nằm ngồi CPU

Một máy tính cá nhân bình thường ngày thường lắp từ 64 đến 256 megabytes nhớ - nhớ nói đến câu có nghĩa loại nhớ ngồi CPU mà ta thường gọi RAM

Các vi mạch DRAM kết nối với mạch nhỏ gọi RAM, có SIMM (single in - line memory module) - module nhớ hàng chân kép Tùy lượng vi mạch nhớ cấu trúc, SIMM hay DIMM có dung lượng từ MB đến 32 MB hơn; hệ cũ có 30 chân (thường dùng từ máy 486DX trở trước), hệ thông dụng dùng loại 72 chân (từ 486DX máy đại nhất) Đã xuất loại DIMM - SDRAM có tốc độ lý thuyết 10ns (so với RAM EDO 60ns), có số chân 168 chân dùng rộng rãi với số bo mạch chọn lọc Các RAM cắm vào khe quy định sẵn mạch hệ thống

Xét chi tiết nơi nhớ - tế bào nhớ giống hộp thư Một hộp thư đại cho địa lưu giữ byte thông tin

(13)

Khi khởi động máy, CPU tự động (đã qui định trước) đọc thông tin lưu nhớ đọc - ROM thi hành Hầu hết hệ thống máy tính có ROM để lưu kiện để điều khiển hệ thống Các chương trình ROM thường gọi BIOS - hệ thống xuất nhập sở.

Các lệnh cần thực nạp vào nhớ CPU có khả thực chúng

Như vậy, bật máy, CPU đọc thông tin nhớ ROM - thi hành nó, sau đọc đến thông tin đĩa khởi động nạp thông tin hệ điều hành đĩa vào nhớ RAM Các thông tin lưu RAM tế bào nhớ, tức nằm sẵn RAM - CPU thực tác vụ

4.2 Thiết bị nhập 4.2.1. Bàn phím

Ðể thể thư, số, hay ký tự đặc biệt máy tính, người ta dùng bàn phím nối với máy tính, kích hoạt ứng dụng thích hợp gõ phím cần gõ cho từ, câu muốn có Khi bạn gõ - nhấn ký tự bàn phím, hình chữ (giả định trình ứng dụng thích hợp) Các phím mũi tên, Alt, Ctrl, Enter… khơng gửi chữ cho máy mà lệnh đặc biệt

(14)

lưỡng mặt ngôn ngữ học tần suất xuất chữ cái, dựa vào đưa thứ tự cho chữ hay dùng vị trí phím dễ dùng

4.2.2. Thiết bị điểm - Pointing Device

Hàng triệu người dùng máy tính dùng bàn phím để gõ chữ số, để lệnh cho máy, định vị trỏ, họ không dùng bàn phím mà cịn dùng thiết bị đặc biệt thơng dụng khác gọi là: chuột - mouse Con chuột dùng để chuyển dịch ký hiệu hay đối tượng chọn từ nơi sang nơi khác hình Con chuột thường thể thơng qua trỏ hình Khi người sử dụng di chuyển chuột mặt bàn trỏ di chuyển hình

Một chuột có một, hai, hay ba nút nhấn dùng để gởi tín hiệu đến máy tính Nhiều người dùng không quan tâm đến chuột - chẳng sao, ngày nhiều chương trình ứng dụng đặt chuột vào vị trí quan trọng để điều khiển chương trình Cũng nhiều linh kiện khác, chuột có nhiều chủng loại với cấu tạo điểm mạnh yếu khác có chung nhiệm vụ

Con chuột chuẩn: gồm nút nhấn hịn bi dưới, có cấu tạo nhỏ gọn nối máy tính sợi dây, dịch chuyển dễ dàng nhiệm vụ

Con chuột bóng - Trackball: gồm thành phần trên, viên bi lại hướng lên Thường chế tạo to lớn khó di chuyển chuột được, tác vụ di chuyển chuột thực trực tiếp người sử dụng dùng tay lăn viên bi, nút nhấn không thay đổi chức

(15)

Một vài thiết bị đặc biệt khác xem thiết bị điểm, ví dụ như:

Cần điền khiển - Joystick: xem thiết bị tính điểm đặc biệt, giống cần điều khiển máy trị chơi điện tử

Màn hình cảm ứng - Touch Screen: hình thiết kế đặc biệt để cảm nhận điểm ngón tay vật hình

Bàn vẽ - Graphic table: thiết bị đặc dụng dành cho nhà thiết kế hay họa sỹ, bàn vẽ tốt độ nhạy cảm áp lực cao Bàn vẽ chuyển trực tiếp hình ảnh vẽ bàn vẽ thành hình ảnh máy tính 4.2.3. Thiết bị đọc

Một số thiết bị đọc bị giới hạn khả đưa liệu - văn trực tiếp giấy, hay chuyển thơng tin in cho máy tính xử lý Một số thiết bị nhập khác (được gọi thiết bị đọc) chế tạo nhằm đáp ứng cho nhu cầu thực tế này:

(16)

đặc biệt vùng dành riêng cho chúng, thường dùng cho thẻ bán hàng hay thẻ tín dụng Người ta dùng thiết bị nhiều cửa hàng, nơi toán chuyển đổi tiền, nối với thiết bị đầu cuối POS (điểm bán - point of sale) Thiết bị đầu cuối (Terminal) gửi thông tin nhận từ đũa thần đến máy tính (có thể mainframe), máy tính xác định sở liệu cần thiết phù hợp (giá cả, cước thuế, số tiền phải trả cho hàng…) gởi lại thơng tin cho POS Ðó trường hợp ứng dụng, nguyên tắc làm việc tương tự với thẻ tín dụng

Cây viết máy tính - pen-based computer: phần trước có nói đến, loại máy hệ xách tay có loại nhỏ gọn có thể bỏ vào áo khoác - loại trợ lý kỹ thuật số hay cịn gọi Máy thơng tin cá nhân (personal digital assistant - personal comunicatior) dùng viết để đưa liệu vào máy tính, thiết bị Cây viết máy tính - pen-based computer Ðể nhập liệu, người ta viết trực tiếp lên hình phẳng máy tính

Xét trường hợp nhập liệu trực tiếp từ giấy tờ văn nói cịn phương pháp dùng chương trình nhận dạng chữ Chương trình chuyển hình ảnh văn đưa vào máy tính máy quét ảnh thành ký tự chữ cái, độ xác chương trình khoảng 99% với ngơn ngữ có ký tự Latin

4.2.4. Các thiết bị số hóa giới thực

(17)

kỹ thuật số, thể hình ảnh số dùng hình máy tính, thể ảnh giấy dùng máy in… nhiều nhu cầu khoa học khác dùng thiết bị số hóa đặc biệt khác Nói chung "cả giới thực số hóa"

Máy quét ảnh - scanner: thiết bị nhập liệu biến hình ảnh thành thơng tin số hóa đại diện cho Máy quét ảnh có nhiều chủng loại kích cỡ khác nhau, thơng dụng loại máy quét phẳng - flatbed scanner Còn loại máy quét cầm tay - handheld scanner, thay viên bi định vị bóng đèn chân khơng Còn loại khác gọn nhẹ thường đặt hình bàn phím gọi máy qt phụ trợ – shet-fed scanner

Máy ảnh số – digital camera: phương pháp tương tự scanner, máy ảnh số dùng để chụp hình ảnh bên ngồi, thay lưu hình ảnh lên phim lưu ảnh dạng thơng tin số hóa Khác với máy qt ảnh, máy ảnh số không bị giới hạn mặt phẳng hình ảnh, hồn tồn chụp hình ảnh mà máy ảnh thơng thường chụp Ảnh chụp từ máy ảnh số lưu đĩa hay loại thiết bị lưu trữ tùy loại máy Loại máy ảnh kỹ thuật số ngày trở nên rộng rãi hơn, đặc biệt hữu dụng việc chụp hình ảnh nơi mang tính tơn nghiêm không gây tiếng động đáng kể

(18)

các hệ máy vô phong phú, ngày bạn có thể bắt gặp dòng chữ âm kỹ thuật số – digital audio hầu hết thiết bị âm đại máy đĩa CD nhạc, CD video

Thiết bị cảm ứng: Trong ứng dụng khoa học, thiết bị cảm ứng dùng nhiều để đưa kiện bên ngồi vào máy tính dạng số hóa Ðó điều hiển nhiên máy tính xử lý thơng tin dạng số Ứng dụng thông thường thiết bị đong, đo nhiệt kế điện tử, máy dự báo thời tiết, thiết bị kiểm sốt mơi trường, thiết bị kiểm sốt mức độ nhiễm âm lẫn nhiễm khơng khí nhiều ứng dụng khác

4.3 Thiết bị xuất

Máy tính nhận thơng tin, xử lý phải xuất thông tin Như nơi để nhận liệu xuất sau xử lý gọi phận xuất hay thiết bị xuất Hiện người ta thường dùng hai thiết bị xuất chủ yếu hình máy in

4.3.1. Xuất hình

Màn hình máy tính (tạm dịch từ Video Monitor) hay thiết bị đầu cuối hiển thị hình ảnh (video display terminal - VDT) cho ta thấy ký tự mà ta gõ bàn phím thơng điệp từ máy tính Những hệ hình thể chi tiết hình ảnh chữ, số ký hiệu với đủ loại màu sắc khác nhau, thường gọi hình màu, tên gọi để phân biệt loại hình đơn sắc dùng cho hệ máy cũ (loại máy XT)

(19)

cả hiển thị, tất lắp vỏ máy, người ta thường gọi monitor hình.

Màn hình có hai loại là: hình kiểu thiết kế giống tivi dùng bóng đèn tia điện tử cathode CRT (cathode ray tube) hình tinh thể lỏng LCD (liquid crystal display) Tuy LCD loại hình phẳng nhỏ gọn hơn CRT nhiều, giá LCD lại cao so với CRT Các hình CRT ngày cho chất lượng hình ảnh tốt hình LCD Thơng thường người ta dùng LCD cho máy tính dạng xách tay Màn hình CRT gồm bóng đèn hình lớn chứa ba ống phóng điện tử cho ba màu đỏ, xanh xanh dương Ba màu tạo màu khác cần hiển thị Mỗi điểm ảnh ba yếu tố RGB hợp thành tạo màu sắc cần thiết

Màn hình nối kết với máy tính thông qua điều hợp hiển thị - video adapter hay display adapter Nó cịn có tên gọi là cạc hình - display card, video card Bộ điều hợp hiển thị bảng mạch điện tử cắm máy tính khe cắm mở rộng Hình ảnh thơng tin lưu nhớ hình -VRAM Khả điều hợp hiển thị định tốc độ làm tươi hình ảnh, tốc độ hình, độ phân giải, mức độ màu hiển thị Bộ điều hợp hiển thị phân loại theo độ rộng bus liệu nó:

(20)

Kích thước hình gần tivi Thông số dùng để phân loại hình máy tính tivi quy định giống - độ dài đo đường chéo hiển thị Một máy tính để bàn thơng thường có hình thừ 14 đến 15 inch Hình ảnh hiển thị kết hợp nhiều chấm nhỏ - gọi điểm ảnh - pixel Ðộ phân giải hiển thị thông thường 72 điểm inch cho chiều ngang dọc (Ðơn vị tính độ phân giải viết tắt dpi - điểm inch: dots per inch) Ðộ phân giải cao, điểm ảnh sít lại với nhau, hình ảnh mịn đẹp

Cịn cách nói khác kích thước hình, thay nói độ dài đường chéo thực hiển thị, người ta nói mức độ phân giải hiển thị Nếu nói hình 800 x 600 tức chiều ngang gồm 800 điểm, chiều dọc gồm 600 điểm

Yếu tố khác nói khả card hình độ sâu màu hiển thị - color depth Ví dụ như, hình đơn sắc thể bit cho điểm, bit hiển thị màu màu màu (các hình đơn sắc ban đầu thường có màu xám, xanh hay nâu) Nếu điểm có bit màu có khả thể 256 màu - 28 - khả thông thường mà hầu hết tất máy tính thể Loại cao cấp chấp nhận 24 bit màu, tức khoảng 16 triệu màu (16777216 màu - 224), máy vi tính thể 32 bit màu - chấp nhận 4.294.967.296 màu Số màu hiển thị nhiều hình ảnh trung thực sắc nét sống động - chắn đẹp hình ảnh tivi nhiều lần

4.3.2. Xuất giấy

(21)

lưu trữ, in giấy Máy in có nhiều loại chia thành hai nhóm chính: máy in gõ hay máy in không gõ (impact printer or nonimpact printer)

Máy in gõ: máy in theo dòng hay theo ma trận điểm Các máy in kim loại này, có đặc điểm tốc độ in chậm, ồn ào, độ phân giải thấp cho chất lượng in ấn trung bình Máy in dùng đầu kim chạy suốt chiều ngang giấy để ấn kim xuống giấy (qua lớp băng mực) theo tín hiệu điểu khiển, nhiều lần tạo nên in Số đầu kim máy cao độ phân giải đạt cao, loại máy in 9,18 kim khơng cịn sử dụng nữa, thơng dụng máy in loại có lẽ in khổ giấy lớn mà giá máy rẻ nhân thành nhiều giấy than gõ truyền lực Máy in không gõ: loại máy in tên gọi - khơng dùng tác động tạo nên chữ mà kỹ thật đại khác

(22)

-khi có điện áp điều -khiển tác động vào Khi đặt ống dẫn mực đẩy mực khỏi ống hút thêm mực khác vào - máy bơm Một hình thái khác máy in phun máy in phun bong bóng - bubbe jet printer: dùng phần tử nung nóng thay cho tinh thể áp điện, bơm tinh thể đóng mở tần số 5kHz nên cho phép tốc độ in nhanh Loại bị hạn chế tốc độ in, phần tử in phải có thời gian nguội khơng gây nhiều vấn đề phức tạp khác, ưu điểm dùng điện áp thấp từ 24V đến 50V làm cho tiện dụng Do tính chất in phun vậy, nên loại máy dùng với loại giấy, độ nét độ mịn in có chất lượng cao, đơi khó phân biệt với loại máy in laser Loại máy in phun rẻ laser nhiều chi phí in cao

Máy in laser: dùng công nghệ in tĩnh điện (electrostatic -ES) phương pháp in tạo hình ký tự cách tạo điện tích tĩnh điện làm chảy mực lên giấy nhờ trình nung nóng Vậy khác hồn tồn với loại máy in trước dùng đầu in để in, loại máy in tạo sản phẩm thơng qua q trình phức tạp Quá trình in tĩnh điện thực hệ thống tạo hình - image formation system (IFS) có bước: xóa trống nhạy sáng để gạt bỏ hạt mực cịn đó, làm trống trở nên trung hịa điện tích Nạp điện lên bề mặt trống điện áp âm lớn (khoảng 5000V) - sẵn sàng ghi hình Máy in giải mã tín hiệu theo dịng máy tính đưa sang xây dựng đồ bit trang in, dùng chùm tia sáng ghi hình đồ lên mặt trống Mực phun vào mặt trống quay bị hút vào điểm chiếu sáng nhiễm điện tích âm - phương pháp ghi hình đen Cịn mực phun vào điểm không chiếu sáng gọi phương pháp ghi hình trắng, cách hình đen hơn, dày Giấy đưa qua phận nạp điện tích dương trước qua trống để hút điện tích âm hạt mực Sau qua hệ thống ép nhiệt nóng 180o

(23)

cho máy in thơng thường in từ 200-5000 in tùy độ phức tạp hình ảnh

Một kỹ thuật thay tia laser cách ghi hình ảnh dùng nhiều đèn hay dãy nhiều cửa đóng mở nguồn sáng đèn huỳnh quang tinh thể lỏng để chiếu sáng vào mặt trống Ðó loại máy in di-ốt phát quang - light emitting diode printer máy in cửa sập tinh thể lỏng - liquid crystal shutter printer.

Máy in màu: hoạt động dựa nguyên tắc điểm màu li ti xen kẽ tạo nên nhiều màu sắc phong phú Ðể thể màu sắc theo nguyên tắc có nhiều phương pháp phối màu khác

(24)

tính - phương án in màu máy in sách báo giới Những máy in màu dùng trong văn phịng quan hay gia đình thường loại máy in phun màu, máy in thăng hoa màu hay máy in truyền sáp nhiệt. Các loại máy in có giá thấp phù hợp khả tài người, thơng thường từ 300 đến 2000 USD Các hệ máy in phun màu có khả in với độ phân giải 1000 dpi làm cho hình ảnh mịn đẹp gần ảnh thật Còn loại máy in laser màu không phổ biến giá cao, thường trang bị cho công ty thiết kế tạo mẫu

Hiện cịn có máy vẽ - plotter họ máy anh em với máy in phun Do kỹ thuật in phun đời nên ranh giới máy in phun màu khổ lớn máy vẽ khó phân biệt Loại máy in dùng ngơn ngữ in postscript dùng để in vẽ thiết kế, hình ảnh, đồ lớn với khổ giấy A0

thích hợp với nhiều loại giấy Với ngơn ngữ in cao cấp thiết kế phun mực tiên tiến, hình ảnh in từ loại máy in có chất lượng cao

4.3.3. Xuất âm

(25)

Hiển nhiên để âm phát cần phải có thêm hay nhiều loa, ngồi máy tính nối với khuếch đại, lọc âm thanh, micro, đàn điện tử có chuẩn MIDI Những máy tính tiêu biểu có gắn thiết bị CD, với thiết bị này, bạn nghe nhạc, hay xem phim với hình ảnh đẹp âm chuẩn xác vơ hấp dẫn Cịn với chương trình dạy phát âm ngoại ngữ nghe người thật phát âm bên tai bạn

Âm máy tính chia thành hai dạng MIDI Wave Loại âm MIDI dùng để thể âm loại nhạc cụ số hóa (các nhạc cụ điện tử) theo bảng mã qui định sẵn, kích thước tập tin dạng nhỏ dạng Wave với thời gian thể Còn Wave dùng để thể thứ âm mà ta nghe tổng hợp tiếng hát, giọng nói, tiếng mèo kêu, xe máy 4.3.4. Làm việc với máy tính khác

(26)

4.4 Lưu trữ thứ cấp

Máy tính có thiết bị ngoại vi có khả nhận xuất liệu - ổ đĩa máy tính, nơi ghi nhớ thơng tin liệu Những thiết bị gọi thiết bị lưu trữ thứ cấp -secondary starage (thiết bị lưu trữ sơ cấp - primary storage là nhớ máy tính) Khác với thiết bị lưu trữ sơ cấp ngắt điện thứ RAM khơng cịn, thiết bị lưu trữ thứ cấp lưu kiện khơng có nguồn ni, xét lý thuyết, liệu loại tồn vĩnh viễn đọc, ghi, sửa hay xóa lúc hay lúc khác Có hai phương pháp lưu kiện tạo nên hai họ khác dựa từ tính dựa khả ứng dụng quang học

4.4.1. Ðĩa từ tính

Có hai loại chủ yếu đĩa mềm đĩa cứng Ðĩa mềm, hiểu đơn giản loại đĩa dung lượng thấp, nhỏ gọn tháo lắp dễ dàng, nhiều đĩa dùng chung ổ đĩa Hiểu để phân biệt với đĩa cứng loại ổ đĩa thường lắp hẳn bên máy, tháo rời, phức tạp, thân thiết bị hoàn chỉnh đọc ghi với dung lượng lớn

4.4.2. Ðĩa mềm - floopy disk

(27)

gần khơng cịn dùng Ðĩa mềm có tính động cao, bị hạn chế dung lượng nhớ, chương trình chạy đĩa mềm cách khoảng năm, đĩa mềm chủ yếu dùng lưu liệu, tốc độ đọc ghi đĩa mềm thấp - bù lại giá đĩa mềm tương đối rẻ, bạn mua hộp đĩa mềm với giá khoảng 50.000 đồng (10 hay 11 đĩa)

Ðĩa cứng - Hard disk

(28)

năm 1983 dùng phương pháp mã hóa RLL, tốc độ đạt đến khoảng 24MB giây, dạng giao tiếp câm nên điều khiển quan trọng card quản lý Chuẩn IDE (Intelligent Drive Electronic - Intergrated Drive Electronic) gọi ATA (AT Attachment) dùng loại mạch điện tử ổ đĩa thông minh, giao tiếp mức hệ thống Chuẩn nối với máy cáp nguồn chân cáp liệu 40 chân Loại ổ đĩa có tốc độ cao nên dùng hầu hết máy vi tính nay, giá thành rẻ so với loại ổ đĩa cứng khác Chuẩn giao tiếp SCSI (Small Computer System Interface) cấu trúc bus độc lập truyền liệu với tốc độ cao, từ 4Mb/giây đến khoảng 10Mb/giây, ứng dụng với ổ đĩa cứng tạo nên khả lưu trữ cao với tốc độ đọc ghi cao Ðể dùng được, cần có bảng mạch điều hợp SCSI, nhiên card SCSI nối tiếp đến thiết bị theo chuẩn

Ðĩa floptical

Là loại ổ đĩa từ mềm, có hình dáng giống đĩa 3.5 inch, dùng phương pháp định vị quang học để đọc ghi, nên mật độ liệu đĩa cao hơn, dung lượng nhớ lớn Thiết bị không ghi liệu quang học, làm thao tác định vị Tuy nhiên giá thành cao nên dù có khả lưu đến 20MB, loại không phổ dụng

Ổ băng ghi lưu

(29)

Ổ đĩa tháo lắp ZIP

Dùng loại đĩa có kích thước khoảng 3.5 inch, dung lượng lên đến 100Mb đĩa Tốc độ đọc ghi trung bình, kỹ thuật dùng định vị quang học để ghi liệu Nếu dùng với card SCSI, tốc độ không thua ổ cứng IDE

4.4.3. Ðĩa từ quang

Ðĩa từ quang - Magneto optical drive, thường gọi tắt là MO, thiết bị kết hợp từ tính quang học để lưu liệu Ðĩa từ tính, dùng ánh sáng laser làm tác nhân đọc ghi Dung lượng loại 5.25 inch 1.3GB, loại 3.5inch 230MB Công nghệ phù hợp để lưu trữ, theo chuyên gia, bảo đảm liệu 50 năm so với năm ổ đĩa cứng, ổ mềm, băng từ

4.4.4. Ðĩa quang học

(30)

thể đưa vào loại đĩa quang giá rẻ 680MB dùng rộng rãi nay, đồng thời loại đĩa âm đọc hiểu hoạt động ổ đĩa CD máy tính, đầu đọc máy CD âm khơng thể đọc đĩa CD liệu Nói CD-ROM - đọc, dĩ nhiên phải có lần ghi liệu lên đĩa đọc, thao tác theo nguyên tắc khắc đĩa điểm lõm hay không lõm đại diện cho số 0, nguồn phát tia laser công suất lớn Người ta tạo đĩa gốc trước nguyên tắc đầu CD ghi đĩa CD mới, sau âm đĩa gốc tạo trình mạ điện photopolymer Tiến trình nhân thực cách phun polycarbonate - suốt, nhẹ, bền, ổn định, không nhiễm bẩn - nên đĩa CD giữ thông tin gần vĩnh viễn

Như vậy, bạn hiểu chất đĩa CD chép lại bán số dịch vụ tin học thực dạng đĩa gốc, sử dụng phải tuyệt đối cẩn thận khơng có lớp bảo vệ polycarbonate đĩa CD phát hành quy hay đĩa CD nhạc

Khi mà đĩa CD-ROM gần trở nên chuẩn thiếu hầu hết máy tính multimedia lại xuất thành viên họ đĩa quang học mà dự đoán thiết bị lưu trữ chủ đạo kỷ 21 - DVD

(31)

hồng ngoại Quan trọng kỹ thuật DVD cho phép loại đĩa có hai lớp mặt, nên với lớp khoảng 4GB loại đĩa hai lớp hai mặt hồn tồn chứa đến 17GB liệu

4.4.5. Ðường truyền – cổng – thiết bị ngoại vi Trong máy tính thơng thường, CPU nhớ gắn với bo mạch vài linh kiện cần thiết khác Những thông tin chuyển qua lại linh kiện thông qua mạch lưới gọi bus Các bus có 8, 16 hay 32 đường dẫn gọi bus bit, bus 16 bit hay bus 32 bit Hiển nhiên xa lộ đa luồng làm tăng lưu lượng xe chạy qua, bus chấp nhận số bit lớn chuyển tải nhiều thơng tin lúc, làm tăng đáng kể tốc độ hệ thống

(32)

xuất đưa bus ISA mở rộng cho máy AT dùng vi xử lý 80286 - tức máy 286 với bus liệu 16bit Bus gồm hai đoạn khe cắm rời nhau, đoạn 62 chân kiểu dùng cho XT, đoạn bổ sung 36 chân - bổ sung dịch vụ ngắt, đường liệu, đường địa số đường chức điều khiển Loại tương thích với bit Tốc độ truyền loại đạt khoảng 8MB giây (ISA - Industry Standard Architecture)

Bus MCA (Micro Chanel Architecture)

Năm 1987, bus đưa riêng cho loại máy PS/2 IBM, kiểu thiết kế bus 32bit Nó gồm 32 bit liệu, 32 đường địa (có khả địa hóa 4GB nhớ), kênh âm thanh, khả VGA cài sẵn Tốc độ đạt 20MB giây nên đáp ứng cho CPU đến 199MHz Tuy nhiên, loại khơng tương thích với bus AT máy PC nên muốn dùng, người dùng phải thay toàn thiết bị tương thích MCA nên khơng hưởng ứng Do khơng phát triển cuối IBM phải tự hủy bỏ

Bus EISA (Enhanced ISA)

Là loại bus mở rộng AT nâng cao liên minh công ty lớn (AST, Compaq, Epson, Hewlett - Packard, NEC, Olivetti, Tandy, Wyse, Zenith Data System) hợp tác phát triển Nó thiết kế để cạnh tranh với MCA thành cơng thời gian dài Nó hồn tồn tương thích với ISA - 16bit ISA - 8bit XT Bus EISA có tốc độ 33MB giây hoạt động với 8.33MHz EISA cịn có phiên nâng cấp tốc độ lên 132MB giây, loại dùng số server mạng

Local bus

(33)

-Video Electronics Standard Association) Nếu bo mạch 33MHz tốc độ bus đạt 107MB giây, nhiên hầu hết bo mạch có VESA Local Bus ISA

Bus mở rộng PCI

Loại có 32 bit hay 64 bit dựa vào thiết kế Intel xây dựng năm 1992 PCI-Peripheral Component Interface bus, kiểu trung gian bus liệu vi xử lý bus vào chung máy tính, loại bus mở rộng hồn chỉnh nên cho phép nhà sản xuất hồn tồn loại bỏ hẳn loại bus ISA

Thiết bị ngoại vi thiết bị giúp máy tính liên thơng với giới bên ngồi Bàn phím nối liên kết người dùng máy tính để nhập liệu, hình-máy in thể kết xử lý máy tính sau tác vụ gửi cho người dùng, cịn vơ số thiết bị khác máy qt ảnh, máy ảnh số… mà làm quen phần

(34)

CHƯƠNG 2

TỔNG QUAN VỀ GIẢI QUYẾT VẤN ĐỀ BÀI TỐN TRÊN MÁY TÍNH

1 KHÁI NIỆM VẤN ĐỀ-BÀI TỐN

Khi phải suy nghĩ? Có thể thấy phải trả lời câu hỏi giáo viên, làm toán giải vấn đề mua tặng bạn ngày sinh nhật…

Có thể nói, cá nhân cộng đồng xã hội phải liên tục giải vấn đề toán đặt trình tồn phát triển Cuộc sống chuỗi vấn đề mà ta phải nói: “Thơng thường, nhiều người quan niệm vấn đề có nghĩa rộng toán toán loại vấn đề mà để giải phải liên quan nhiều đến tính tốn: tốn vật lý, hóa học, xây dựng, kinh tế… Cho nên từ vấn đề thường dùng với nghĩa rộng toán học”

Nhà toán học cổ Hy Lạp Pitago phân chia vấn đề mà người phải giải thành hai loại:

+ Theorema vấn đề cần khẳng định tính đúng-sai. Chúng ta thường quen với loại vấn đề qua việc chứng minh định lý tốn học, đặc biệt hình học

+ Problema vấn đề cần tìm giải pháp để đạt mục tiêu xác định từ điều kiện ban đầu Các ví dụ minh họa điển hình cho loại tốn tốn dựng hình, tổng hợp hóa chất, tìm đường ngắn nhất, thi cơng cơng trình nhanh nhất, mua sắm tiết kiệm nhất…

(35)

A →B Ở đây:

- A giả thiết, điều kiện ban đầu - B kết luận, mục tiêu cần đạt -là suy luận, giải pháp cần xác định

Theo sơ đồ này, việc cho vấn đề - tốn có nghĩa cho A B Việc giải vấn đề - tốn có ý nghĩa xuất phát từ A dùng số hữu hạn bước suy luận có lý hành động thích hợp để đạt B Để cho việc giải vấn đề - toán xác định phải tập thao tác dùng suy luận hành động, nghĩa điều kiện ràng bược yếu tố “→” sơ đồ nêu Đối với tin học sơ đồ hiểu với nghĩa A Input (thông tin vào), B Output (thông tin ra) →là chương trình tạo thành từ lệnh máy cho phép biến đổi A thành B

Như ta thấy, chương trình cách mã hóa lại thuật toán thuật giải xây dựng để giải vấn đề - toán cho

(36)

Khi người số ngun dương, số thực gì… khơng hiểu tốn chưa nói đến việc tìm cách giải

+ Thông báo điều kiện đặt cho cách giải (→) thường nêu toán vấn đề Đối với toán sách thường hiểu ngầm phép dùng kiến thức tốn học phần giáo trình

Có thể nói: thuật tốn hay thuật giải cung cấp đủ lượng thông tin (không thừa khơng thiếu) để giải vấn đề - tốn Chính lý nêu trên, để giải vấn đề máy tính, việc thiết kế xây dựng thuật giải chủ yếu thực người Từ thông tin phản ánh rõ ràng tiềm ẩn thông báo A, B “→”, với tri thức liên quan có đầu người giải vấn đề - toán kiến tạo nên thuật toán hay thuật giải cần thiết Đây cơng việc có tính trí tuệ cao định thành công việc giải vấn đề - toán đặt

(37)

chất sở tri thức lĩnh vực vấn đề cần giải kết hợp với chương trình suy diễn để tạo sinh thuật toán hay thuật giải cần thiết Những hệ giải vấn đề dựa sở tri thức mở rộng với chương trình “tư duy” mạnh phát triển ứng dụng nhiều lĩnh vực Những hệ thường gọi hệ chuyên gia hay hệ sở tri thức

2 CÁC BƯỚC GIẢI QUYẾT VẤN ĐỀ BÀI TỐN BẰNG MÁY TÍNH

Việc sử dụng máy tính điện tử (MTÐT) để giải vấn đề thường quan niệm cách khơng chuẩn xác, đơn giản việc lập trình túy Thực ra, q trình phức tạp bao gồm nhiều giai đoạn phát triển mà lập trình giai đoạn (thậm chí chưa phần việc quan trọng nhất) Các bước quan trọng tồn q trình liệt kê đây:

 Bước Xác định vấn đề - toán

(38)

Tùy theo nhu cầu cụ thể mà lựa chọn phương pháp thích hợp Việc lựa chọn cần vào khả xử lý tự động mà ta sử dụng

 Bước Xây dựng thuật toán thuật giải

Xây dựng mơ hình chặt chẽ, xác chi tiết hóa phương pháp lựa chọn Xác định rõ ràng liệu vào, cho bước thực trật tự thực bước Nên áp dụng phương pháp thiết kế có cấu trúc, từ thiết kế tổng thể tiến hành làm mịn dần bước

 Bước Cài đặt chương trình

Mơ tả thuật giải chương trình Dựa vào thuật giải xây dựng, quy tắc ngôn ngữ lập trình để soạn thảo chương trình thể giải thuật thiết lập bước

 Bước Hiệu chỉnh chương trình

Ở bước 4, nói chung khơng tránh khỏi sai sót Ở bước cho chương trình chạy thử để phát điều chỉnh sai sót tìm thấy

Có hai loại lỗi:

- Lỗi cú pháp: lỗi không tuân thủ quy tắc viết chương trình ngơn ngữ lập trình cụ thể

- Lỗi ngữ nghĩa: lỗi làm sai lạc ý nghĩa dẫn đến bế tắc chương trình

Lỗi cú pháp thường dễ phát hiệu chỉnh lỗi ngữ nghĩa Cần phải nói rằng, việc hiệu chỉnh chương trình phức tạp, nhiều thời gian công sức Việc xây dựng tốt, phù hợp, đầy đủ liệu để kiểm chứng chương trình quan trọng, giúp phát lỗi ngữ nghĩa chương trình có vấn đề bị bỏ sót

(39)

Cho máy tính thực chương trình Tiến hành phân tích kết thu Việc phân tích kết nhằm khẳng định kết có phù hợp hay khơng Nếu khơng, cần kiểm tra lại tồn bước lần Nói chung, dù thận trọng đến mức sau bước thực nêu không khẳng định kết thực bước đắn tuyệt đối Hơn nữa, bước 5, ta hiệu chỉnh tất lỗi phát Cịn có sai sót khác chương trình với liệu khác phức tạp mà ta chưa có hội để phát trước Do đó, ta khơng thể khẳng định rằng, chương trình tuyệt đối, khơng cịn sai sót Như vậy, việc giải vấn đề cụ thể thực qua hai giai đoạn Giai đoạn đầu giai đoạn quan niệm, gồm bước phân tích, lựa chọn mơ hình, xây dựng thuật giải, cài đặt chương trình Giai đoạn sau khai thác bảo trì chương trình Trong trình sử dụng, nói chung thường có nhu cầu cải tiến, mở rộng chương trình yếu tố tốn ban đầu thay đổi 3 THUẬT TỐN VÀ THUẬT GIẢI

3.1 Thuật toán

(40)

Giả sử nhận lớp học mới, ban giám hiệu yêu cầu giáo viên chủ nhiệm chọn lớp trưởng theo bước sau:

1 Lập danh sách tất học sinh lớp; 2 Sắp thứ tự danh sách học sinh;

3 Chọn học sinh đứng đầu danh sách để làm lớp trưởng

Khi nhận thông báo này, giáo viên chắn bối rối khơng hiểu danh sách học sinh cần có thơng tin gì? Danh sách cần họ tên, hay cần thêm ngày tháng năm sinh? Có cần thêm điểm trung bình khơng? Yêu cầu lại gây nhiều thắc mắc Cần phải xếp danh sách theo chiều tăng dần giảm dần? Sắp theo tiêu gì? Theo tên, theo ngày tháng năm sinh hay theo điểm trung bình chung Giả sử theo điểm trung bình có hai học sinh điểm trung bình học sinh trước, học sinh sau?

Hướng dẫn vi phạm tính chất "khơng mập mờ" thuật tốn Nghĩa là, có q nhiều thơng tin cịn thiếu để làm cho bước 1, hiểu đúng hiểu theo một nghĩa nhất. Nếu sửa lại chút hướng dẫn trở nên rõ ràng nhiều gọi thuật toán chọn lớp trưởng!

1 Lập danh sách tất học sinh lớp theo hai thông tin: Họ và

Tên; Ðiểm trung bình cuối năm

2 Sắp hạng học sinh theo điểm trung bình theo thứ tự giảm dần (từ điểm

cao đến điểm thấp) Hai học sinh có điểm trung bình có hạng

3 Nếu có học sinh có hạng chọn học sinh làm lớp

trưởng Trường hợp có nhiều học sinh đồng hạng chọn học sinh có điểm mơn Tốn cao làm lớp trưởng Nếu cịn nhiều học sinh đồng hạng có điểm mơn Tốn cao tiến hành bốc thăm

(41)

nhưng không đủ điều kiện để định Cịn chọn lựa có định hoàn toàn xác định điều kiện cụ thể vấn đề Chẳng hạn vấn đề chọn lớp trưởng trên, bước thể lựa chọn có định Tất nhiên, chưa lập danh sách, chưa xếp hạng theo điểm trung bình giáo viên biết chọn lớp trưởng theo cách Nhưng xong danh sách có phương án chọn

Tính "thực thi được" tính chất hiển nhiên. Rõ ràng "thuật toán" tồn bước khơng thể thực thi ta có kết ý muốn? Tuy nhiên, cần phải hiểu "thực thi được" xét điều kiện toán Chẳng hạn, nói "lấy bậc hai số âm" thực thi miền xác định toán là số thực, miền số phức thao tác "lấy bậc hai số âm" hoàn toàn thực thi Tương tự, ta đường cho người xe máy đến bưu điện đường ta đường cụt, đường cấm đường ngược chiều người khơng thể đến bưu điện

(42)

B6 Cộng thêm vào i B7 Quay lại bước B4 B8 Tổng cần tìm S

Ta ý đến bước B4 Ở ta muốn kết thúc thuật toán giá trị i vượt n Thay viết "nếu i lớn n" ta thay điều kiện "nếu i n+1" theo tốn học "i = n+1" suy "i lớn n" Nhưng điều kiện "i=n+1" khơng phải lúc đạt Vì ban đầu i = số lẻ, sau bước, i tăng thêm nên i số lẻ Nếu n số chẵn n+1 số lẻ nên sau số bước định, i n+1 Tuy nhiên, n số lẻ n+1 số chẵn, i số lẻ nên dù có qua bước nữa, i khác n+1 Trong trường hợp đó, thuật tốn bị quẩn

Tính "đúng" tính chất hiển nhiên tính chất khó đạt tới Thực vậy, giải vấn đề - tốn, ta ln ln mong muốn lời giải cho kết lúc đạt Mọi học sinh làm kiểm tra muốn làm có đáp số thực tế, lớp học có số học sinh định có khả đưa lời giải đúng!

 Các đặc trưng khác thuật toán

Bên cạnh ba đặc trưng xác định, hữu hạn đúng, thuật tốn cịn có thêm ba đặc trưng phụ khác:

1 Ðầu vào đầu (input/output): thuật tốn, dù có đơn giản đến phải nhận liệu đầu vào, xử lý cho kết cuối

(43)

giá, chọn lựa cách giải vấn đề - tốn thực tế Có nhiều phương pháp để đánh giá tính hiệu thuật tốn Trong mục chương, ta tìm hiểu tiêu chuẩn dùng rộng rãi độ phức tạp thuật tốn

3 Tính tổng qt (generalliness): thuật tốn có tính tổng qt thuật tốn phải áp dụng cho trường hợp toán áp dụng cho số trường hợp riêng lẻ Chẳng hạn giải phương trình bậc hai sau delta đảm bảo tính chất ln giải với giá trị số thực a, b, c Tuy nhiên, khơng phải thuật tốn đảm bảo tính tổng quát Trong thực tế, có lúc người ta xây dựng thuật toán cho dạng đặc trưng tốn mà thơi

Thuật tốn giải phương trình bậc hai ax2+ bx + c= (a ≠ 0) 1 Yêu cầu cho biết giá trị hệ số a, b, c

2 Nếu a = thì

2.1 u cầu đầu vào khơng đảm bảo 2.2 Kết thúc thuật toán

3 Trường hợp a ≠ thì

(44)

3.3.3 Kết thúc thuật tốn 3.4 Nếu D <

3.4.1 Phương trình vơ nghiệm 3.4.2 Kết thúc thuật tốn

 Thuật tốn tìm hộp có trọng lượng nặng

Vấn đề: Có n hộp có khối lượng khác cân đĩa Hãy cách cân để tìm hộp có trọng lượng nặng nhất Vấn đề thể toán tổng quát: Cho một tập hợp A hữu hạn thứ tự toàn phần A Hãy xây dựng thuật tốn tìm phần tử lớn A Bài tốn tốn học phức tạp thể thực tế lại dễ hiểu, cách giải đơn giản Từ ta dễ dàng suy cách giải tốn tổng qt

1 Nếu có hộp (n = 1) thì

1.1 Hộp hộp nặng 1.2 Kết thúc thuật toán

2 Ngược lại có từ hai hộp trở lên (n > 1) 2.1 Chọn hai hộp đặt lên bàn cân

2.2 Giữ lại hộp nặng hơn, cất hộp nhẹ sang chỗ khác

3 Nếu hộp chưa cân thực bước sau, khơng cịn hộp nữa, sang bước

3.1 Chọn hộp để lên đĩa cân trống 3.2 Giữ lại hộp nặng hơn, cất hộp nhẹ sang chỗ khác

4 Trở lại bước

(45)

 Thuật tốn Euclid tìm ước số chung lớn nhất

Bài toán: Cho hai số nguyên dương a b Tìm ước số chung lớn a b

1 Yêu cầu cho biết giá trị a, b. 2 a0= a

3 b0= b

4 i = 0

5 Nếu aikhác bithì thực thao tác sau, ngược lại qua bước

5.1 Tăng i lên 5.2 Nếu ai-1> bi-1thì

ai= ai-1- bi-1 bi= bi-1 5.3 Ngược lại

bi= bi-1- ai-1 ai= ai-1 6 Trở lại bước 5.

(46)

+ Có toán giải theo cách giải vi phạm thuật toán chấp nhận

Từ nhận định trên, người ta thấy cần phải có đổi cho khái niệm thuật toán Người ta mở rộng hai tiêu chuẩn thuật tốn: tính xác định tính đắn. Việc mở rộng tính xác định thuật toán thể qua giải thuật đệ quy ngẫu nhiên Tính thuật tốn khơng cịn bắt buộc số cách giải toán, cách giải gần Trong thực tiễn, có nhiều trường hợp người ta chấp nhận cách giải thường cho kết tốt (nhưng lúc tốt) phức tạp và hiệu Chẳng hạn giải toán thuật toán tối ưu địi hỏi máy tính thực nhiều năm sẵn lịng chấp nhận giải pháp gần tối ưu mà cần máy tính chạy vài ngày vài

Các cách giải chấp nhận khơng hồn tồn đáp ứng đầy đủ tiêu chuẩn thuật toán thường gọi là các thuật giải Khái niệm mở rộng thuật toán mở rộng cửa cho việc tìm kiếm phương pháp để giải toán đặt

(47)

4.1 Ngôn ngữ tự nhiên

Trong cách biểu diễn thuật tốn theo ngơn ngữ tự nhiên, người ta sử dụng ngôn ngữ thường ngày để liệt kê bước thuật tốn (Các ví dụ thuật tốn mục chương sử dụng ngôn ngữ tự nhiên) Phương pháp biểu diễn không yêu cầu người viết thuật toán người đọc thuật toán phải nắm quy tắc Tuy vậy, cách biểu diễn thường dài dịng, khơng thể rõ cấu trúc thuật tốn, đơi lúc gây hiểu lầm khó hiểu cho người đọc Gần khơng có quy tắc cố định việc thể thuật tốn ngơn ngữ tự nhiên Tuy vậy, để dễ đọc, ta nên viết bước lùi vào bên phải đánh số bước theo quy tắc phân cấp 1, 1.1, 1.1.1, Bạn tham khảo lại ba ví dụ mục chương để hiểu cách biểu diễn thuật tốn theo ngơn ngữ tự nhiên

4.2 Lưu đồ - sơ đồ khối

Lưu đồ hay sơ đồ khối công cụ trực quan để diễn đạt thuật toán Biểu diễn thuật toán lưu đồ giúp người đọc theo dõi phân cấp trường hợp trình xử lý thuật toán Phương pháp lưu đồ thường dùng thuật tốn có tính rắc rối, khó theo dõi trình xử lý

(48)

4.2.2 Thao tác xử lý (process)

Thao tác xử lý biểu diễn hình chữ nhật, bên chứa nội dung xử lý

4.2.3 Ðường (route)

Khi dùng ngôn ngữ tự nhiên, ta ngầm hiểu trình thực từ bước trước đến bước sau (trừ có yêu cầu nhảy sang bước khác) Trong ngôn ngữ lưu đồ, thể bước hình vẽ đặt hình vẽ vị trí nên ta phải có phương pháp để thể trình tự thực thao tác

Hai bước nối cung, cung có mũi tên để hướng thực Chẳng hạn hình dưới, trình tự thực B1, B2, B3

(49)(50)

4.2.4 Ðiểm cuối (terminator)

(51)

4.2.5 Ðiểm nối (connector)

Ðiểm nối dùng để nối phần khác lưu đồ lại với Bên điểm nối, ta đặt ký hiệu để biết liên hệ điểm nối

(52)

Ở ký hiệu thường dùng Trong thực tế, lưu đồ cịn có nhiều ký hiệu khác thường dùng lưu đồ lớn phức tạp Ðối với thuật toán sách này, ta cần sử dụng ký hiệu đủ

4.3 Mã giả

Tuy sơ đồ khối thể rõ trình xử lý phân cấp trường hợp thuật toán lại cồng kềnh Ðể mơ tả thuật tốn nhỏ ta phải dùng không gian lớn Hơn nữa, lưu đồ phân biệt hai thao tác rẽ nhánh (chọn lựa có điều kiện) xử lý mà thực tế, thuật tốn cịn có thêm thao tác lặp (chúng ta tìm hiểu thao tác lặp sau)

Khi thể thuật toán mã giả, ta vay mượn cú pháp ngơn ngữ lập trình để thể thuật tốn Tất nhiên, ngơn ngữ lập trình có thao tác xử lý, rẽ nhánh lặp Dùng mã giả vừa tận dụng khái niệm ngơn ngữ lập trình, vừa giúp người cài đặt dễ dàng nắm bắt nội dung thuật toán Tất nhiên mã giả ta dùng phần ngôn ngữ tự nhiên Một vay mượn cú pháp khái niệm ngôn ngữ lập trình chắn mã giả bị phụ thuộc vào ngơn ngữ lập trình Chính lý này, chưa vội tìm hiểu mã giả (vì chưa biết ngơn ngữ lập trình!) Sau tìm hiểu xong thủ tục - hàm bạn hiểu mã giả gì!

 Một đoạn mã giả thuật tốn giải phương trình bậc hai if Delta > then

Begin

x1=(-b-sqrt(delta))/(2*a)

(53)

xuất kết quả: phương trình có hai nghiệm x1và x2

End else

if delta = then

xuất kết quả: phương trình có nghiệm kép -b/(2*a) else {trường hợp delta < 0}

(54)

CHƯƠNG 3

LẬP TRÌNH CĂN BẢN BẰNG NGƠN NGỮ PASCAL 1 GIỚI THIỆU NGÔN NGỮ PASCAL

Pascal ngơn ngữ lập trình cấp cao giáo sư Niklaus Wirth Trường đại học Kỹ thuật Zurich (Thụy sĩ) thiết kế cơng bố vào năm 1971 Ơng đặt tên cho ngơn ngữ Pascal để tưởng nhớ nhà toán học tiếng người Pháp kỷ 17: Blaise Pascal, người sáng chế máy tính khí nhân loại Qua thời gian sử dụng, Pascal ngày đông đảo người dùng đánh giá cao, trở thành ngơn ngữ lập trình phổ biến

Thành công ngôn ngữ Pascal chỗ: ngơn ngữ đầu tiên đưa thể khái niệm lập trình có cấu trúc Ý tưởng chương trình có cấu trúc xuất phát từ suy nghĩ cho chia toán lớn, phức tạp thành nhiều toán nhỏ, đơn giản Nếu toán nhỏ giải chương trình con, liên kết chương trình lại tạo nên chương trình lớn giải tốn ban đầu

Bằng cách chia chương trình thành chương trình vậy, người thảo chương lập trình để giải riêng lẻ phần một, khối một, tổ chức để nhiều người tham gia, người phụ trách vài khối Ðặc biệt phải thay đổi hay sửa chữa khối điều ảnh hưởng đến khối khác

(55)

hai từ khóa Begin End tạo thành câu lệnh phức tạp gọi câu lệnh ghép Ðến lượt mình, hai hay nhiều lệnh ghép lại nhóm lại để tạo thành câu lệnh ghép phức tạp nữa… Tương tự thế, ngôn ngữ Pascal cho phép xây dựng kiểu liệu phức tạp từ kiểu liệu có

Pascal ngôn ngữ không chặt chẽ mặt cú pháp mà chặt chẽ mặt liệu Mỗi biến, tham gia chương trình ln có kiểu liệu xác định nhận giá trị có kiểu liệu với Ðiều buộc người lập trình phải nắm cú pháp ln ý đến tính tương thích biểu thức mặt kiểu liệu Chính thế, lập trình ngơn ngữ Pascal hội tốt không rèn luyện tư mà cịn rèn luyện tính cẩn thận xác

Ngày nay, ngôn ngữ Pascal dùng để viết chương trình ứng dụng nhiều lĩnh vực Với văn phạm sáng sủa, dễ hiểu, với khả đủ mạnh, Pascal xem ngơn ngữ thích hợp để giảng dạy trường phổ thông đại học

2 CẤU TRÚC CỦA CHƯƠNG TRÌNH PASCAL 2.1 Ví dụ mở đầu

(56)

Chương trình cụ thể sau:

PROGRAM VIDU;

{Tinh dien tich va chu vi hinh chu nhat} Uses CRT;

Var

a, b, S, P: Real; Begin

Clrscr;

Write( ‘Nhap chieu dai: ‘); Readln(a); Write( ‘Nhap chieu rong: ‘); Readln(b);

S:=a*b; P:=2* (a+b);

Writeln (‘Dien tich = ‘, S:8:2); Writeln (‘Chu vi = ‘, P:8:2); Readln;

End.

Giải thích dịng chương trình: + {Tinh dien tich va chu vi hinh chu nhat}

(57)

Khai báo sử dụng thư viện CRT Turbo Pascal + Var

a, b, S, P: Real;

Khai báo bốn biến a, b, S, P có kiểu liệu số thực (Real)

+ Begin

Lệnh bắt đầu chương trình + Clrscr;

Lệnh xóa hình

+ Write(‘Nhap chieu dai: ‘);

Lệnh in lên hình câu ‘Nhap chieu dai: ‘nhằm nhắc người dùng nhập vào số đo chiều dài

+ Readln(a);

Lệnh nhập liệu cho biến a + Write( ‘Nhap chieu rong: ‘);

Lệnh in lên hình câu ‘Nhap chieu rong: ‘nhằm nhắc người dùng nhập vào số đo chiều rộng

+ Readln(b);

(58)

Lệnh in lên hình câu ‘Dien tich= ‘, kế in giá trị của biến S Chỉ thị S:8:2 ấn định dành cột hình để in giá trị S, có hai cột để in phần thập phân

+ Writeln(‘Chu vi = ‘, P:8:2);

Lệnh in lên hình câu ‘Chu vi = ‘, kế in giá trị chu vi P có thảy chữ số, có số phần lẻ

+ Readln;

Lệnh dừng hình để xem kết chạy chương trình + End.

Dấu hiệu kết thúc chương trình

2.2 Cấu trúc chung chương trình Pascal

Chương trình dãy câu lệnh thị cho máy công việc phải thực Một chương trình Pasccal đầy đủ gồm ba phần chính:

+ Phần tiêu đề + Phần khai báo

+ Phần thân chương trình

Program Têntựđặt;{Phần tiêu đề}

{Phần khai báo }

Uses {khai báo sử dụng thư viện chuẩn} Label {khai báo nhãn}

Const {khai báo hằng} Type {khai báo kiểu liệu} Var {khai báo biến}

(59)

Procedure {hàm thủ tục}

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

Begin {Các lệnh} End.

2.2.1. Phần tiêu đề chương trình

Phần khóa Program, sau khoảng trắng tên người dùng tự đặt, cuối kết thúc dấu chấm phẩy ‘;’.

Ví dụ: Program Btap1;

hoặc: Program Giai_pt_bac2;

Phần tiêu đề chiếm dòng, cịn gọi phần đầu chương trình, khơng có được.

2.2.2. Phần khai báo

(60)

Các thủ tục hàm dùng có nhu cầu thiết kế chương trình lớn, phức tạp Đối với toán nhỏ, đơn giản, việc sử dụng chương trình chưa cần thiết Chi tiết phần trình bày kỹ sau

Sau ta điểm qua vài nét khai báo thông dụng

a) Khai báo khai báo biến

Biến đại lượng có giá trị thay đổi được, cịn Hằng đại lượng có giá trị khơng đổi, chúng dùng chương trình để lưu trữ liệu, tham gia vào biểu thức tính tốn q trình xử lý máy Việc khai báo có tác dụng xác định tên kiểu liệu biến hay Biến là thành phần khó thiếu chương trình Để khai báo biến ta dùng từ khóa Var, để khai báo ta dùng từ khóa Const, ví dụ:

Const N=10; Var x, y: Real;

i, k: Integer;

b) Khai báo (định nghĩa) kiểu liệu mới

Ngoài kiểu liệu mà thân ngơn ngữ có sẵn kiểu thực, kiểu nguyên, kiểu ký tự, kiểu lôgic, người dùng tự xây dựng kiểu liệu phục vụ cho chương trình mình, phải mơ tả sau từ khóa TYPE Khi định nghĩa kiểu liệu mới, ta khai báo biến thuộc kiểu liệu Ví dụ, ta định nghĩa kiểu liệu có tên Mang:

Type Mang = Array[1 10] of Real;

Bây khai báo hai biến A B có kiểu liệu kiểu Mang:

(61)

c) Khai báo sử dụng thư viện chuẩn

Turbo Pascal có sẵn số hàm thủ tục chuẩn, chúng phân thành nhóm theo chức mang tên đặc trưng, gọi thư viện hay đơn vị chương trình (Unit), như: Crt, Graph, Dos, Printer Muốn sử dụng hàm hay thủ tục thư viện nào, ta phải khai báo có sử dụng thư viện đó, lời khai báo phải để sau phần tiêu đề chương trình theo cú pháp:

Uses danhsáchthưviện;

Ví dụ: thủ tục Clrscr nằm thư viện CRT, nên chương trình mà có dùng lệnh Clrscr, phải khai báo:

Uses CRT;

Muốn sử dụng hai thư viện CRT GRAPH, ta khai báo: Uses CRT, GRAPH;

2.2.3. Phần thân chương trình

Đây phần chủ yếu chương trình, bắt buộc phải có.

(62)

3 CÁC PHẦN TỬ CƠ BẢN CỦA PASCAL 3.1 Tập ký tự bản

Mỗi ngôn ngữ xây dựng từ tập ký tự Nhiều ký tự nhóm lại với tạo nên từ Nhiều từ liên kết với theo qui tắc ngữ pháp định (gọi văn phạm) tạo nên mệnh đề Trong ngôn ngữ thảo chương, mệnh đề gọi câu lệnh Một tập hợp câu lệnh xếp theo trật tự định nhằm thị cho máy thao tác phải thực tạo thành chương trình Các chương trình soạn thảo người thảo chương lưu trữ đĩa dạng tập tin

Ngôn ngữ Pascal xây dựng ký tự bản, gồm: + Các chữ latinh: A, B, C, ,Z, a, b, c, , z

+ Các chữ số: 0, 1, 2, 3, 4, 5, 6, 7, 8,

+ Các ký hiệu đặc biệt: +, -, *, /, =, <, {,}, [, ], %, $, &, #, + Ký tự gạch nối ‘_’ ký tự trắng ‘‘ (space)

Các chữ Ả rập: , , , không thuộc ký tự Pascal 3.2 Từ khóa (key word )

Có số từ Pascal dành riêng cho việc xây dựng câu lệnh, khai báo, phép tính, gọi từ khóa Việc sử dụng từ khóa địi hỏi phải tuân thủ quy tắc đề ra, đặc biệt người lập trình khơng đặt tên (tên biến, tên hằng, tên hàm, tên thủ tục, ) trùng với từ khóa Dưới danh sách từ khóa Pascal:

absolute, and, array, Begin, case, const, div, do, downto,

else, End, file, for, forward, function, goto, if,

(63)

set, shl, shr, string, then, to, type, unit, until, uses, var, while, with, xor

Các từ khóa viết dạng chữ hoa hay chữ thường hay xen kẽ chữ hoa với chữ thường Ví dụ viết Begin hay Begin hay BEGIN nhau.

3.3 Tên (identifier)

Các biến, hằng, hàm, thủ tục, sử dụng trong chương trình cần phải đặt tên, cịn gọi định danh hay danh hiệu Các tên người thảo chương tự đặt phải đảm bảo quy tắc: tên phải bắt đầu chữ cái, kế chữ cái, chữ số, hay dấu gạch nối ‘_’ Tên không đặt trùng với từ khóa Chiều dài tên tối đa 127 ký tự Thông thường tên nên đặt ngắn gọn có tính gợi nhớ

Dưới ví dụ tên đặt đúng:

+ Delta, X1, X2, i, j , Chuc_vu, Luong, So_luong, Don_gia + Còn tên: 3ABC, In, Chu vi, Ma-so sai vì:

+ 3ABC: bắt đầu số + Chu vi: có chứa ký tự trắng

(64)

Mặc dù người lập trìmh đặt tên trùng với tên chuẩn, song, để đỡ nhầm lẫn, nên tránh điều

4 CÁC KIỂU DỮ LIỆU ĐƠN GIẢN 4.1 Khái niệm

Chức máy điện toán xử lý thông tin Các thông tin nhập lưu trữ nhớ máy dạng khác nhau: số, chữ, hình ảnh, âm thanh, mà thuật ngữ tin học gọi chung liệu Tính đa dạng liệu đòi hỏi phải tổ chức phân phối nhớ thích hợp để lưu trữ xử lý tốt liệu Ngôn ngữ thảo chương chia liệu thành nhóm riêng xây dựng số phép toán tạo nên kiểu liệu khác nhau, kiểu liệu tập hợp giá trị mà biến thuộc kiểu nhận Khi biến khai báo thuộc kiểu liệu máy dành cho biến dung lượng thích hợp nhớ để lưu trữ giá trị thuộc kiểu liệu

Các kiểu liệu ngôn ngữ Pascal chia thành hai loại chính: loại đơn giản loại có cấu trúc.

Mỗi kiểu liệu đơn giản tập giá trị sở có thứ tự Ví dụ kiểu Integer gồm số nguyên nằm phạm vi từ -32768 đến 32767 có thứ tự tự nhiên: -32768< < -1 < < < < 32767 , kiểu lơgic có hai giá trị False, True với quy ước False < True

Các kiểu liệu có cấu trúc xây dựng từ kiểu liệu đơn giản Mỗi kiểu liệu có cấu trúc tập phần tử thuộc kiểu liệu đơn giản tổ chức lại theo quy tắc định

(65)

Các kiểu liệu có cấu trúc gồm có: kiểu mảng, kiểu ghi, kiểu tập hợp kiểu tập tin.

Riêng chuỗi ký tự (STRING) kiểu liệu đặc biệt, vừa có tính đơn giản lại vừa có tính cấu trúc Mỗi chuỗi xem giá trị, xem mảng giá trị kiểu ký tự Vì vậy, việc sử dụng chuỗi có hai mức khác nhau: mức đơn giản mức có cấu trúc

Các kiểu liệu đơn giản phân thành hai loại: đếm (Ordinal type) không đếm Kiểu thực thuộc loại không đếm được, giá trị dày đặc Tất kiểu liệu đơn giản lại: nguyên, ký tự, lôgic, liệt kê đoạn con thuộc loại đếm (còn gọi rời rạc).

Dưới trình bày kỹ bốn kiểu liệu đơn giản chuẩn thông dụng: kiểu nguyên, kiểu thực, kiểu logic, kiểu ký tự Kiểu chuỗi giới thiệu để sử dụng mức đơn giản

4.2 Kiểu số nguyên

4.2.1. Các kiểu số nguyên

Tên kiểu Phạm vi giá trị Số byte

(66)

Ngồi kiểu Integer thơng dụng nhất, số nguyên chia thành bốn kiểu là: Byte, Word, ShortInt LongInt Bảng liệt kê chi tiết tên gọi, phạm vi giá trị độ dài tính theo đơn vị byte kiểu nguyên

Các biến nguyên nhận giá trị số nguyên nằm phạm vi giá trị biến Khi gán cho biến số nguyên nằm phạm vi biến máy báo lỗi: "Const out of range" Ví dụ, cho khai báo:

Var i: Byte; N: Integer;

thì lệnh đưới đúng: i:= 200;

N:= -1500;

còn lệnh bị lỗi: i:= -5;

N:= 50000;

Ðặc biệt gán số thực cho biến nguyên Câu lệnh sau sai:

N:= 12.5;

Khi gặp tình này, máy báo lỗi "Type mismatch". Chú ý

(67)

4.2.2. Các phép toán số học số nguyên + Phép cộng trừ: ký hiệu + - thường lệ

+ Phép nhân: ký hiệu dấu *, ví dụ 4*2 cho kết

+ Phép chia: ký hiệu dấu /, ví dụ 6/4 cho kết 1.5

+ Phép chia lấy phần nguyên: ký hiệu từ khóa DIV + Phép lấy phần dư nguyên phép chia: ký hiệu từ khóa MOD

Ví dụ: 15 DIV cho kết 2. 15 MOD cho kết

Các phép toán cho kết số nguyên, trừ phép chia (/) ln cho kết số thực Vì N biến nguyên, mà gán:

N:= 20/5;

thì máy báo lỗi, vế phải có giá trị kiểu thực (=4.0) phần lẻ khơng

(68)

Ví dụ: tính biểu thức sau:

15 mod (2 +4) * 20 div (10 div 4) + 40 mod ( 5* 3) = 15 mod * 20 div + 40 mod 15

= * 20 div + 10 = 60 div + 10 = 30 + 10 = 40

* Ví dụ sau ứng dụng phép toán div, mod:

+ Ví dụ: Nhập số tiền N đồng, đổi xem bao nhiêu tờ đồng, tờ đồng, tờ đồng cho tổng số tờ Ví dụ N = 43đ = tờ 5đ + tờ 2đ + tờ 1đ Cách tính sau:

Số tờ 5đ = 43 div = Số tiền dư = 43 mod =

Số tờ 2đ = Số tiền dư div = div =1 Số tờ 1đ = Số tiền dư mod = mod = Dưới chương trình cụ thể:

PROGRAM VIDU4_1; {Ðổi tiền}

Var N, st5, st2, st1, sodu: LongInt; Begin

Write(‘Nhap so tien: ’); Readln(N); st5:= N div 5;

(69)

st2:= Sodu div 2; st1:= Sodu mod 2;

Writeln(‘KET QUA DOI TIEN LA: ‘); Writeln(‘So to 5đ= ‘, st5);

Writeln(‘So to 2đ= ‘, st2); Writeln(‘So to 1đ=‘, st1); Readln;

End.

4.2.3. Các phép toán so sánh

Ngơn ngữ Pascal có sáu phép tốn so sánh liệt kê bảng

Ký hiệu Ý nghĩa Ví dụ

= x=y

<> khác x<>y

(70)

Biểu thức 5+2 <> cho kết FALSE

Biểu thức div > 10 div cho kết FALSE 4.2.4. Các phép tốn lơgic số nguyên

Các phép tính NOT, AND, OR, XOR xử lý bít nhị phân xác định sau:

NOT = AND 1=1 OR 1=1 XOR 1=0 NOT = 1 AND 0=0 OR 0=1 XOR 0=1 AND 1=0 OR 1=1 XOR 1=1 AND 0=0 OR 0=0 XOR 0=0 Mỗi số nguyên biểu diễn máy dạng dãy bít nhị phân Số kiểu Integer biểu diễn 16 bit Ví dụ: số số có biểu diễn máy là:

0000 0000 0000 0001 0000 0000 0000 0011

Phép lấy NOT số nguyên đảo tất bít biểu diễn số ngun đó, tức thành 1, cịn thành Ví dụ:

NOT = 1111 1111 1111 1110 NOT = 1111 1111 1111 1100

Phép lấy AND, OR, XOR hai số nguyên tiến hành cách AND, OR, XOR cặp bít tương ứng hai số đó, ví dụ:

(71)

4.2.5. Các phép dịch chuyển số học SHR SHL N SHR k: dịch bít số nguyên N sang phải k bit N SHL k: dịch bít số nguyên N sang trái k bit Có thể chứng minh được:

N SHR k = N div 2k N SHL k = N * 2k Ví dụ:

120 shr = 7, vì:

120 shr = 120 div 24= 120 div 16 = 120 shl = 960, vì:

120 shl = 120 * 23= 120 * = 960

Hai phép toán SHR SHL dùng muốn tăng tốc độ tính tốn số nguyên

4.2.6. Các hàm có đối số nguyên

* Hàm PRED(k): đối số k nguyên, trả số nguyên đứng trước k, tức k-1

Ví dụ: Pred (5) = 4, Pred (-6) = -7

(72)

Ví dụ: Odd(15) = True; Odd(4) = False

+ Ví dụ: Nhập số nguyên N, N chẵn in chữ chẵn, nếu N lẻ in chữ lẻ Chương trình sau:

PROGRAM VIDU4_2; Var

N: Integer; Begin

Write(‘Nhap so N:’); Readln(N); If Odd(N) = TRUE then

Write(N, ‘la so le’) Else

Write(N, ‘la so chan’); Readln;

End.

4.2.7. Các thủ tục có đối số ngun Có hai thủ tục thơng dụng là:

* Thủ tục INC(k): tăng k lên đơn vị Ví dụ, sau thực lệnh:

k:=5; Inc(k);

thì giá trị sau k

Vậy, lệnh Inc(k); tương đương với lệnh k:=k+1; hay k:=Succ(k);

(73)

k:=5; Dec(k);

thì giá trị k

Vậy, lệnh Dec(k); tương đương với lệnh k:=k-1; hay k:=Pred(k);

4.3 Kiểu số thực

4.3.1. Kiểu Real kiểu mở rộng

Kiểu Real kiểu số thực thông dụng dùng để biểu diễn số thực x có trị tuyệt đối |x| nằm khoảng từ 2.9*10-39đến 1.7*10+38 Nếu x > 1.7*10+38thì khơng biểu diễn x máy được, cịn |x| < 2.9*10-39thì x coi

Có hai cách biểu diễn số thực:

* Cách 1: Viết bình thường, dấu phẩy thập phân được thay dấu chấm thập phân.

Ví dụ: 45.0 -256.45 +122.08

* Cách 2: Viết số dạng khoa học:

(74)

Var

x, y: Real;

Ngồi kiểu Real ra, số thực cịn có bốn kiểu mở rộng nữa Single, Double, Extended Comp Bảng sau nêu chi tiết phạm vi giá trị số byte dùng để lưu trữ nhớ kiểu số thực

Tên kiểu Phạm vi giá trị Số byte Real 2.9*10-39 1.7*1038 Single 1.5*10-45 3.4*1038 Double 5.0*10-324 1.7*10308 Extended 3.4*10-4932 1.1*104932 10

Comp -9.2*1018 9.2*1018

+ Chú ý: Turbo Pascal thường làm việc với kiểu Real Muốn dùng bốn kiểu thực lại, phải chuyển sang mode 8087 cách viết thị {$N+} đầu chương trình 4.3.2. Các phép tốn số thực

Có bốn phép tốn số học nhân (*), chia (/), cộng (+) trừ (-) Khi số hạng tham gia tính tốn kiểu thực kết phép tốn số thực

Phép tốn DIV, MOD khơng dùng cho số thực.

Ví dụ: với hai biến x, y kiểu thực lệnh sau bị lỗi biểu thức vế phải khơng hợp lệ:

(75)

Các phép toán so sánh (= , <> , < , <= , > , >= ) dùng cho số hạng thực hay nguyên

4.3.3. Các hàm có đối số nguyên thực

* Hàm ABS(x): tính trị tuyệt đối x: |x| Kiểu liệu kết kiểu với đối số Nếu x nguyên ABS(x) nguyên, x số thực ABS(x) số thực

Ví dụ: Abs(5 - 8) =

* Hàm SQR(x): tính bình phương x: x2 Kiểu liệu kết kiểu với đối số

Ví dụ: Sqr(4.0) = 16.0 Sqr(7 div 3) =

Trong hàm đây, đối số x nguyên hay thực, nhưng giá trị trả luôn kiểu thực:

* Hàm SQRT(x): tính , (x ≥ 0) * Hàm EXP(x): tính ex

* Hàm LN(x): tính lnx, (x > 0)

* Các hàm SIN(x), COS(x), ARCTAN(x): tính sinx, cosx arctgx

(76)

Ví dụ: Trunc(12.55) = 12 Trunc(-2.98) = -2

* Hàm ROUND(x): cho số ngun cách làm trịn x. Ví dụ: Round(12.45) = 12

Round(-2.98) = -3

Chú ý hàm Int(x) hàm Trunc(x) cho phần nguyên x, chúng khác kiểu liệu giá trị trả Int(4.5)= 4.0 Trunc(4.5) = (viết hiểu số ngun, cịn viết 4.0 hiểu số thực)

+ Ví dụ: Viết chương trình nhập số thực x bất kỳ, tính in giá trị y z lên hình theo cơng thức:

Trong Pascal khơng có hàm tính trực tiếp 2xvà Log4(x), nên

ta phải chuyển qua hàm exvà Ln(x) sau: ,

Chương trình cụ thể sau: PROGRAM VIDU4_3; Var

x, y, z: Real; Begin

Write(‘Nhap x: ‘); Readln(x);

(77)

z:= exp( x*Ln(2) ) + Ln(abs(x)+1) / Ln(4);

Writeln(‘y= ‘, y:10:3 ); Writeln(‘z= ‘, z:10:3 ); Readln;

End.

Khi chạy chương trình, nhập x = kết y = 0.250 z = 1.000

4.4. Kiểu ký tự (char)

4.4.1. Ký tự biến kiểu ký tự

tự

ASCII

tự

ASCII

tự

ASCII

32 A 65 a 97

0 48 B 66 b 98

(78)

6 54 H 72 h 104

7 55 I 73 i 105

8 56 J 74 j 106

9 57 K 75 k 107

L 76 l 108

M 77 m 109

N 78 n 110

O 79 o 111

P 80 p 112

Q 81 q 113

R 82 r 114

S 83 s 115

T 84 t 116

U 85 u 117

V 86 v 118

(79)

X 88 x 120

Y 89 y 121

Z 90 z 122

Các ký tự dùng máy tính điện tử liệt kê đầy đủ bảng mã ASCII gồm 256 ký tự khác đánh số thứ tự từ đến 255 Số thứ tự ký tự gọi mã ASCII ký tự Bảng liệt kê phần bảng mã ASCII gồm chữ số chữ kèm theo mã chúng

Trong bảng, ký tự có mã 32 ký tự trắng (space) Tuy có 256 ký tự khác song có 128 ký tự hay dùng, cịn lại ký tự mở rộng Các ký tự có mã từ đến 31 gọi ký tự điều khiển, không in được, dùng để điều khiển thiết bị ngoại vi, chẳng hạn ký tự có mã dùng để tạo tiếng kêu bip, ký tự có mã 13 dùng để chuyển trỏ hình xuống đầu dịng

Mỗi ký tự bảng mã ASCII gọi ký tự, chiếm độ dài byte, viết Pascal phải đặt cặp nháy đơn: ‘0’, ‘1’, ‘A’, ‘B’, ‘$’,

(80)

Khi gán: ch:=‘A’; ch1:=‘$’;

Ký tự ‘A’gọi giá trị biến ch, ‘$’là giá trị biến ch1

+ Nhận xét: Từ bảng mã chữ ta suy ra:

Mã chữ thường = Mã chữ hoa tương ứng + 32 (1) 4.4.2. Các hàm liên quan đến ký tự

* Hàm PRED(ch): cho ký tự đứng trước ký tự ch bảng mã

Ví dụ: Pred(‘B’)=‘A’

* Hàm SUCC(ch): cho ký tự đứng sau ký tự ch bảng mã

Ví dụ: Succ(‘A’)=‘B’

* Hàm UpCase(ch): đổi ký tự ch thành chữ hoa Ví dụ: Upcase( ‘a’) = ‘A’,

Upcase( ‘b’) = ‘B’, Upcase( ‘A’) = ‘A’

* Hàm ORD(ch): cho mã ký tự ch Ví dụ: Ord (‘A’) = 65, Ord (‘a’) = 97

* Hàm CHR(k): đối số k nguyên, 0k< 255, cho ký tự có mã k

Ví dụ: Chr (65)= ‘A’, Chr (97)= ‘a’,

(81)

Có số ký tự khơng có bàn phím, để viết chúng lên hình ta phải dùng lệnh Write hàm CHR Ví dụ:

Lệnh Writeln(Chr(201)); in ký tự: + Lệnh Writeln(Chr(187)); in ký tự: +

Ký tự có mã gọi ký tự BEL (chuông), lệnh: Write(Chr(7)); hay Write(#7); có tác dụng phát tiếng kêu bip

Chú ý

* Turbo Pascal (TP) cho phép viết gọn Chr(k) thành #k k số Ví dụ, hai lệnh sau in lên hình chữ A:

Write(#65); Write(Chr(65));

* Trong TP khơng có hàm đổi chữ hoa chữ thường, làm việc nhờ cơng thức (1) hai hàm Ord Chr:

Chữ thường:= Chr ( Ord(chữ hoa) + 32 ) (1) + Ví dụ: Nhập vào số nguyên k, < k < 255, in ký tự có mã k Chương trình kết thúc nhập vào số 0:

(82)

Write(‘Nhập mã ký tự: ‘); Readln(k); Writeln(‘Ký tự có mã ‘, k, ‘là ‘, Chr(k) ); Until k=0;

Readln; End.

+ Ví dụ: Nhập ký tự, chữ hoa đổi chữ thường, chữ thường đổi chữ hoa

PROGRAM VIDU4_5;

{Ðổi chữ hoa thường ngược lại} Var

ch, ch1: Char; Begin

Write(‘Nhập ký tự:’); Readln(ch); If (ch>=‘A’) and ( ch<=‘Z’) then

ch1:=Chr( Ord (ch)+32) else

ch1:= Upcase(ch); Writeln(ch, ‘đã đổi ra: ‘, ch1); Readln;

End.

4.5 Kiểu lơgic (boolean)

(83)

Các phép tốn lơgic gồm có: NOT, AND, OR XOR Nếu A B hai đại lượng lơgic NOT A, A and B, A or B A xor B đại lượng lơgic có kết cho bảng sau:

A not A

True False

False True

A B A and B A or B A xor B

True True True True False

True False False True True

False True False True True

False False False False False

Cũng từ bảng ta rút nhận xét:

(84)

A:=Not (2*3=5) or (‘A’<‘B’) and not (4/2=2) xor (Sqrt(2)>1); giá trị A= FALSE, thật vậy:

Not (2*3=5) or (‘A’<‘B’) and not (4/2=2) xor (Sqrt(2) >1) = TRUE or TRUE and FALSE xor TRUE

= TRUE or FALSE xor TRUE = TRUE xor TRUE

= FALSE

Biến nhận giá trị TRUE FALSE gọi biến kiểu lôgic Khi khai báo biến kiểu lơgic ta dùng từ khóa Boolean, ví dụ:

Var

A, B: Boolean;

Trong chương trình ta gán: A:= True;

B:=2*2 < 3;

Giá trị biến B False biểu thức 2*2 < sai * Về thứ tự tính tốn, phép so sánh ngang cấp và tính sau tất phép tốn khác.

Ví dụ tính biểu thức:

5+7 div < -7 mod + 5*2 = + < -1 + 10

= 8< = TRUE

(85)

Chẳng hạn, biểu thức sau sai quy cách: N > and N<10

Cần sửa thành: (N > 0) and (N<10)

+ Ví dụ: Nhập vào độ dài ba cạnh a, b, c tam giác, a, b, c ba cạnh tam giác in lên hình câu "khơng phải ba cạnh tam giác", ngược lại, ba cạnh tam giác tính chu vi diện tích tam giác theo cơng thức Hêrông:

, với p nửa chu vi:

Ta biết, điều kiện để a, b, c ba cạnh tam giác cạnh phải dương tổng hai cạnh lớn cạnh cịn lại

Dưới chương trình cụ thể: PROGRAM VIDU4_6;

{Tính diện tích chu vi tam giác theo ba cạnh} Var a, b, c, P, S: Real;

(86)

Else Begin

P:=(a+b+c)/2;

S:= Sqrt( P*(P-a)*(P-b)*(P-c)); Writeln(‘Chu vi = ‘, 2*P:10:2); Writeln(‘Dien tich S= ‘, S:10:2); End;

Readln; End.

Khi chạy chương trình này, để nhập ba cạnh tam giác, bạn gõ ba số cách khoảng trắng enter, chẳng hạn:

Nhap canh cua tam giac: 5

Kết chu vi = 12.00, dien tich = 6.00 Nếu nhập ba cạnh là: máy câu: "Không phải ba cạnh tam giác ! " (vì 2+3 < 6)

4.6 Chuỗi ký tự (string)

* Một dãy ký tự đặt cặp nháy đơn gọi chuỗi Dưới ba chuỗi:

‘NGON NGU PASCAL’ ‘Tin hoc nam 2000’ ‘123456’

Các chuỗi ghép nối với nhờ phép cộng chuỗi Khi cộng (+) hai chuỗi ta chuỗi cách ghép chuỗi sau vào cuối chuỗi đầu

(87)

Các chuỗi so sánh với Việc so sánh hai chuỗi thực cách so sánh cặp ký tự tương ứng từ trái qua phải Khi phát có cặp ký tự khác chuỗi chứa ký tự nhỏ nhỏ

Ví dụ: Biểu thức ‘Anh’< ‘an’ ‘A’< ‘a’ Biểu thức ‘Thong’> ‘Tha’ ‘o’> ‘a’

Nếu nội dung hai chuỗi giống từ đầu đến hết chiều dài chuỗi ngắn chuỗi ngắn nhỏ

Ví dụ: Biểu thức ‘Tha’< ‘Thang’ ‘Tha’ ngắn ‘Thang’

Hai chuỗi chúng dài cặp ký tự vị trí tương ứng giống

Ví dụ: Biểu thức ‘Pascal’= ‘Pascal’ cho kết Biểu thức ‘Pascal’= ‘PAscal’ cho kết sai * Biến nhận giá trị chuỗi gọi biến kiểu chuỗi. Có thể khai báo hai biến chuỗi sau:

Var

Ho_ten: String[20]; St: String;

(88)

5 HẰNG, BIẾN BIỂU THỨC 5.1 Khái niệm biến hằng

Trong phần trước ta biết kiểu liệu có tập giá trị tương ứng Các giá trị kiểu nguyên hay kiểu thực là số, 40 hay 5.72, giá trị kiểu ký tự ký tự ‘A’hay ‘a’, kiểu lơgic có hai giá trị True False,

Q trình xử lý máy tính đòi hỏi giá trị phải lưu trữ nhớ nhớ máy, ô nhớ đặt tên để gọi Khi việc tính tốn hay xử lý liên quan đến giá trị thực gián tiếp thông qua tên ô nhớ chứa giá trị Ví dụ, số 5.72 lưu nhớ có tên x, biểu thức 5.72*2 viết x*2 Việc dùng tên x dễ nhớ tiện nhiều so với việc dùng nhớ số 5.72

Như vậy, ô nhớ đặt tên tên đồng với giá trị Trong chương trình, nhớ có tên giá trị thay đổi khơng Nếu giá trị nhớ thay đổi nhớ là biến, tên ô nhớ tên biến, ngược lại, giá trị ô nhớ khơng thể thay đổi, nhớ hằng, tên ô nhớ tên

Các biến tham gia chương trình phải khai báo Việc khai báo có tác dụng báo trước cho máy dành sẵn nhớ thích hợp nhớ để sẵn sàng chứa liệu

5.2 Khai báo biến khai báo hằng

Biến đại lượng có giá trị thay đổi chương trình Cách khai báo biến sau:

(89)

Tên biến tự đặt, theo quy tắc tên Ví dụ:

Var i, j: Integer; x, y: Real;

Theo khai báo trên, ta có hai biến i j kiểu số nguyên (Integer), hai biến x, y kiểu số thực (Real)

Hằng đại lượng có giá trị khơng đổi chương trình Cách khai báo:

Const Tên_hằng = giátrị;

Tên tự đặt, theo quy tắc tên Ví dụ:

Const N = 10;

SoPi = 3.1416; SoE = 2.718;

Turbo Pascal có sẵn số chuẩn cho phép sử dụng mà khai báo, như: Pi, MaxInt Hằng Pi có giá trị số  , MaxInt = 32767, số Integer lớn Chẳng hạn, dùng lệnh sau:

(90)

Ví dụ: 3*5 div 2+7 mod biểu thức nguyên, có kết là 10

2+sin(pi/2) biểu thức thực, có kết 3.0 Chr(ord(‘a’)-32) biểu thức ký tự, có kết ‘A’ (4+2=6) and (‘B’<>‘b’) biểu thức lôgic, kết là True

‘AB’+’CD’là biểu thức chuỗi, có kết ‘ABCD’ Các thành phần biểu thức cần phải có kiểu liệu phù hợp phép toán thực được, khơng máy báo lỗi Ví dụ, biểu thức sau:

5 + ‘A’là sai cộng số nguyên với ký tự Một biểu thức chứa nhiều phép tốn Thứ tự thực phép toán cho bảng đây:

Cấp ưu tiên Phép toán

1 biểu thức ngoặc đơn ( )

2 Các hàm

3 NOT, - (phép lấy dấu âm)

4 * , /, DIV, MOD, AND

5 Shl, Shr

6 +, - (trư?, OR, XOR

(91)

Việc tính tốn biểu thức dựa theo hai quy tắc:

Quy tắc 1: Phép tốn có cấp ưu tiên nhỏ tính trước, phép tốn có cấp ưu tiên lớn tính sau

Quy tắc 2: Ðối với phép toán đứng liền có cùng cấp ưu tiên, đứng trước tính trước

Ví dụ: Tính biểu thức số học: (4+5)*2 div + sin(pi/6) = * div + 0.5

= 18 div + 0.5 = + 0.5 = 2.5

Ví dụ: Tính biểu thức lơgic:

(2 > div 2) or Not ( 49.25 + < 50) = (2 > 2) or Not ( 51.25 < 50)

= FALSE or Not FALSE = FALSE or TRUE = TRUE

(92)

k:= 20; Clrscr; Writeln(k);

Các lệnh rẽ nhánh lệnh lặp xếp vào loại có cấu trúc, chúng xây dựng từ lệnh đơn giản

Ví dụ:

If k>=0 then Writeln(k) else

Writeln( -k);

Hai hay nhiều lệnh đơn giản gom lại đặt hai từ khóa BEGIN END tạo thành câu lệnh ghép, câu lệnh ghép lệnh có cấu trúc, ví dụ:

Begin

Write(‘nhập k:’); Readln(k);

End;

Từ lệnh đơn giản lệnh có cấu trúc có lại xây dựng lệnh có cấu trúc phức tạp

Ví dụ:

If k>= then Writeln(k) else

Begin

(93)

End;

6.2 Lệnh gán lệnh giải 6.2.1. Câu lệnh gán

Lệnh gán có cú pháp sau: TênBiến:= Biểuthức;

Ý nghĩa: tính tốn biểu thức bên phải, lưu kết tính vào tên biến vế trái

Ví dụ: cho khai báo: Var

A, B: Real; K: Integer; Khi dùng lệnh lệnh:

K:= 10; B:= K* 3+5.5;

thì biến K có giá trị 10, biến B có giá trị 35.5

Nếu thực tiếp lệnh gán: B:= 17/2; giá trị B 8.5

(94)

Yêu cầu lệnh gán thực kiểu liệu biểu thức vế phải phải phù hợp với kiểu liệu biến vế trái, khơng phù hợp dịch (Compile) chương trình, Turbo Pascal thơng báo lỗi: "Error 26: Type mismatch".

Ví dụ, lệnh gán sai vế trái kiểu thực cịn vế phải kiểu chuỗi: A:=‘Pascal’;

Chú ý số nguyên gán cho biến thực, (chẳng hạn lệnh A:=10; ), số thực khơng thể gán cho biến ngun Ví dụ lệnh K:=10/4; sai biến K có kiểu nguyên, vế phải cho kết số thực (=2.5)

Xét thêm ví dụ kiểu liệu khác: Cho khai báo:

Var

Ch: Char; St: String[20]; Khi đó:

Lệnh St:=‘A’; Lệnh St:=‘1234’;

Lệnh Ch:=‘ABCD’; sai vế phải chuỗi Lệnh St:= 100; sai vế phải số

Lệnh Ch:=‘1’;

Lệnh Ch:=St; sai vế phải chuỗi 6.2.2. Lời giải

Lời giải đặt chỗ chương trình viết theo hai cách:

(95)

(* lời giải thích *)

Lời giải thích chuỗi ký tự giải thích mục đích chương trình hay câu lệnh Nó có tác dụng cho người dùng tham khảo nhằm hiểu nhanh mục đích chương trình hay câu lệnh mà không cần phải đọc hết chương trình hay câu lệnh

7 CÁC LỆNH NHẬP XUẤT DỮ LIỆU 7.1 Nhập liệu, thủ tục Readln

Nhập xuất liệu hai khâu quan trọng q trình xử lý thơng tin Hầu chương trình phải giải vấn đề nhập, xuất liệu Có nhập liệu có liệu để tính tốn hay xử lý Có liệu xuất biết kết trình xử lý máy

7.1.1. Nhập liệu kiểu số:

Ðể nhập liệu cho biến nguyên hay thực, ta dùng lệnh: Readln(biến1, biến2, , biếnk);

trong biến1, biến2, , biếnk khai báo có kiểu liệu nguyên hay thực

(96)

10 6.5

4

Trong hai trường hợp ta được: x=10, y=6.5, j=4 Ngoài cách dùng lệnh Readln(x, y, j); ta nhập riêng cho biến ba lệnh sau:

Readln(x); Readln(y); Readln(j);

7.1.2. Nhập liệu kiểu ký tự hay kiểu chuỗi Ta dùng lệnh:

Readln( biến ); Ví dụ, cho khai báo:

Var

Ho_ten: String[18]; Phai: String[3]; Khoi_thi: Char;

Muốn nhập liệu cho ba biến Ho_ten, Phai, Khoi_thi ta phải dùng ba lệnh:

Readln(Ho_ten); Readln(Phai); Readln(Khoi_thi); Khi nhập, ta gõ:

(97)

A

Kết quả, ba biến có giá trị là: Ho_ten = ‘Tran Van Thanh’, Phai= ‘nam’và Khoi_thi=‘A’

Khác với liệu số, ta không nên dùng lệnh Readln để nhập liệu cho hai hay nhiều biến kiểu ký tự hay kiểu chuỗi, có nhầm lẫn khơng kiểm sốt

Ví dụ, khơng dùng lệnh sau:

Readln( Ho_ten, Phai, Khoi_thi);

mà phải dùng ba lệnh Readln, lệnh nhập cho biến nêu

Các ý

a) Dữ liệu nhập phải phù hợp với kiểu biến Nếu khơng phù hợp chương trình dừng thơng báo lỗi Ví dụ gặp lệnh Readln(j); mà ta gõ 4.5 bị lỗi j biến nguyên, 4.5 số thực

b) Lệnh Readln;

(98)

Readln(x, y); Readln(j);

Nếu nhập, ta gõ: 12.5 20.6 10

thì x = 12.5, y = 20.6, cịn số 10 thừa bị xóa ln Biến j lệnh Readln(j) không bị ảnh hưởng Muốn nhập số cho j, ta gõ 9

Với đoạn chương trình: Read(x, y); Readln(j);

Nếu nhập, ta gõ: 12.5 20.6 10

thì x = 12.5, y = 20.6, cịn số 10 thừa khơng bị xóa mà tự động gán cho biến j lệnh Readln(j) tiếp theo, kết j =10 cho dù ta chưa muốn nhập cho j

Vậy, lệnh Read làm sai ý đồ nhập lệnh nhập

Lời khuyên không nên dùng lệnh Read, dùng Readln. 7.2 Câu lệnh xuất liệu

Các liệu in lên hình nhờ lệnh sau: Writeln( bt1, bt2 , , btk );

Write( bt1, bt2 , , btk );

ở đây, bt1, bt2, , btk biểu thức cần phải in giá trị lên hình Trong trường hợp đơn giản, biểu thức biến, hằng, hay hàm

(99)

này in dịng, dài q khổ hình in tiếp dịng

Ví dụ, lệnh Writeln(3*2+9); in lên hình số 15 Nếu i, j biến nguyên thực lệnh sau:

i:=10; j:=15*2;

Writeln(i, j+1, 678); hình hiện: 1031678

Sự khác lệnh Writeln Write chỗ: sau in xong giá trị biểu thức, lệnh Writeln đưa trỏ xuống đầu dòng dưới, lệnh Write khơng Ðiều ảnh hưởng đến lệnh in mà thơi

Ví dụ, thực hai lệnh sau: Writeln(‘lap trinh bang ‘); Writeln(‘ngon ngu Pascal’); kết hình hai dòng:

lap trinh bang ngon ngu Pascal

(100)

Writeln( biểuthức ); in nguyên văn giá trị biểu thức

Ví dụ: Lệnh Writen(‘ket qua x=‘, 4+15); in ra: ket qua x=19

Lệnh Writeln(‘A = ‘, 2*3<5); in ra: A=FALSE biểu thức 2*3< có kết FALSE

Nếu gán: Ho_ten:=‘Tran Van Thanh’; lệnh Writeln(‘Ho va ten: ‘, Ho_ten);

sẽ in lên hình dịng chữ:

Ho va ten: Tran Van Thanh

Cần phân biệt hai đại lượng ‘Ho va ten: ‘và Ho_ten Chúng khác hoàn toàn: ‘Ho va ten: ‘là giá trị chuỗi, tức chuỗi nên in ngun văn lên hình, cịn Ho_ten biến kiểu chuỗi nên in giá trị mà biến chứa

* Ðối với biểu thức kiểu số thực lệnh: Writeln( biểuthức );

sẽ in giá trị biểu thức dạng dấu chấm thập phân di động có thảy 17 ký số, có 10 ký số phần định trị, sau:

(101)

Ví dụ: cho x, y hai biến thực gán x:=100/4; y:=-9/300; hai lệnh sau:

Writeln(‘x= ‘, x); Writeln(‘y= ‘, y); in lên hình:

x = 2.5000000000E+01 y = -3.0000000000E-02 7.2.2. In có định dạng

7.2.2.1 In số thực có định dạng

In số thực theo cách khó đọc Vì số thực thường in có định dạng, giống cách viết số thông thường, lệnh:

Writeln(biểuthức: n: k);

Ở n k số tự nhiên, ấn định dùng n cột để in giá trị biểu thức, có k cột dành cho phần thập phân Nếu số cần in có n chữ số in dồn bên phải thêm ký tự trắng bên trái cho đủ n cột

(102)

Nếu n nhỏ chiều dài số cần in số in với đầy đủ chữ số phần nguyên

Ví dụ: thực lệnh sau: x:=12345.675;

Writeln(‘x=‘,x:0:2); hình hiện:

x=12345.68

Ở máy làm tròn số bỏ số lẻ cuối

7.2.2.2 In kiểu ngun, ký tự, chuỗi lơgic có định dạng Dùng lệnh:

Writeln(biểuthức: n);

trong n số nguyên ấn định số cột dùng để in giá trị biểu thức Nếu n lớn độ dài giá trị cần in giá trị in dồn bên phải, thêm khoảng trắng bên trái cho đủ n cột Nếu n nhỏ độ dài giá trị cần in giá trị in nguyên văn

Ví dụ:

Lệnh Write(5+40:4); in ra: 45 (có ký tự trắng trước số 45)

Lệnh Write(5+40:1); in ra: 45 (in nguyên văn giá trị 45)

Lệnh Write(‘Pascal’:9); in ra: Pascal (có ký tự trắng trước chữ Pascal)

(103)

Các ý

- Nhóm ba lệnh: Write(x); Write(y); Write(j); có tác dụng lệnh: Write(x, y, j);

- Nhóm ba lệnh: Write(x); Write(y); Writeln(j); có tác dụng lệnh: Writeln(x, y, j);

- Lệnh: Writeln; khơng in cả, đơn giản đưa trỏ xuống dịng

+ Ví dụ:

Dưới chương trình cho phép nhập họ tên, mã số sinh viên, in họ tên, mã số sinh viên khung vẽ dấu *, hình chẳng hạn:

********************** * Nguyen Van Tuan * * Ma so: 1972508 *

********************** Chương trình cụ thể sau: PROGRAM VIDU7_1;

(104)

Writeln;

Writeln(‘********************** ’); {in 22 dấu *}

Writeln(‘*’, Ten:19, ‘*’:2);

{in dấu *, in Ten chiếm 19 cột, in tiếp dấu * chiếm 2 cột}

Writeln(‘* Ma so:’, Maso:12, ‘*’:2);

{in * Ma so, in Maso chiếm 12 cột, in tiếp dấu * chiếm cột}

Writeln(‘**********************’); {in 22 dấu *}

Readln; End.

8 CÂU LỆNH RẼ NHÁNH 8.1 Câu lệnh IF

8.1.1. Câu lệnh IF dạng 1 * Cú pháp:

IF Ðiềukiện THEN LệnhP;

(105)

* Ý nghĩa: Tùy theo Ðiềukiện hay sai mà định có làm LệnhP hay khơng Nếu Ðiềukiện làm LệnhP chuyển sang lệnh phía Nếu Ðiềukiện sai khơng làm LệnhP mà chuyển sang lệnh Sơ đồ?cú pháp lệnh IF vẽ hình 8.1

+ Ví dụ 8_1: Nhập vào hai số a b, tìm in lên hình số lớn hai số

Ta dùng biến phụ đặt tên Max để chứa giá trị lớn phải tìm Thuật tốn gồm ba bước:

(106)

- Hoặc Max < b , tức b số lớn nhất, giá trị lớn b gởi vào biến Max

- Hoặc Max >= b, tức giá trị Max lớn nên khơng phải làm

Chương trình cụ thể sau: PROGRAM VIDU8_1; {Tim Max hai so} Var

a, b, max: Real; Begin

Write(‘Nhap a va b:’); Readln(a,b);

Max:=a;

If Max < b then Max:=b;

Writeln(‘So lon nhat la: ‘, Max:6:2); Readln;

End. Nhận xét

* Việc tìm số nhỏ hai số a, b tương tự, ta dùng biến phụ Min chứa giá trị nhỏ nhất, thực lệnh sau:

Min:=a;

If Min > b then Min:=b;

(107)

cũng ký hiệu Max Dưới lệnh để tìm số lớn ba số a, b, c:

Max:=a;

If Max< then Max:=b; {Max số lớn a b} If Max<c then Max:=c; {Max số lớn a, b và c}

+ Ví dụ 8_2: Nhập vào họ tên điểm trung bình (DTB) sinh viên Hãy phân loại sinh viên theo DTB sau:

Loại: Kém DTB<5, Tbình  DTB<7, Khá  DTB<9, Giỏi DTB 

In họ tên, điểm trung bình phân loại sinh viên

Trong chương trình, ta dùng biến phụ đặt tên Loai để lưu trữ phân loại sinh viên Vì có năm loại cần lưu trữ các chuỗi ‘Kem’, ‘Tbinh’, ‘Kha’, ‘Gioi’, nên biến Loai phải có kiểu liệu kiểu chuỗi

(108)

Write(‘Nhap điem trung binh: ’); Readln(DTB);

{phân loại theo DTB}

If DTB< then Loai:=‘Kem’;

If (DTB>= 5) and (DTB<7) then Loai:=‘Tbinh’; If (DTB >= 7) and (DTB< 9) then Loai:=‘Kha’; If DTB >= then Loai:=‘Gioi’;

Writeln(Ho_ten, #32 , DTB:4:1 , #32 , Loai); {#32 là ký tự trắng}

Readln; End.

8.1.2. Câu lệnh IF dạng 2 * Cú pháp:

IF Ðiềukiện THEN LệnhP

ELSE

LệnhQ; * Chú ý:

- Trước từ khóa ELSE khơng có dấu chấm phẩy

- LệnhP LệnhQ lệnh ghép, tức gồm nhiều lệnh đặt khối begin end.

* Ý nghĩa lệnh:

- Tùy theo Ðiềukiện hay sai mà định làm trong hai lệnh: LệnhP LệnhQ

(109)

- Ngược lại, Ðiềukiện sai khơng làm LệnhP mà làm LệnhQ chuyển sang lệnh sau LệnhQ

+ Ví dụ 8_3: Ðể tìm số lớn hai số a b, dùng lệnh:

If a<b then Max:=b else

Max:=a;

(110)

If a < b then Begin

Max:= b; Min:= a; End

else {trước else khơng có dấu;} Begin

Max:= a; Min:= b; End;

Writeln(‘So lon nhat la: ‘, Max:6:2); Writeln(‘So nho nhat la: ‘, Min:6:2); Readln;

End.

8.1.3. Câu lệnh IF lồng

Trong câu lệnh IF, LệnhP LệnhQ, hai, lại là câu lệnh IF ta có cấu trúc IF lồng Chẳng hạn đây hai câu lệnh IF ELSE lồng nhau:

IF Ðiềukiện1 THEN

If Ðiềukiện2 then LệnhP else

LệnhQ ELSE

(111)

+ Ví dụ 8_4: Nhập vào họ tên chủ hộ, số điện kế tháng trước (chiso1) số điện kế tháng (chiso2), tính tiền điện tháng cho hộ, biết rằng:

Mỗi kW 60 kW có đơn giá 5đ, Từ kW thứ 61 đến kW thứ 160 có đơn giá 8đ, Từ kW thứ 161 trở lên có đơn giá 10đ.

Ví dụ, ơng A có số điện tháng trước chiso1=1020 và chỉ số điện tháng chiso2=1070, lượng điện tiêu thụ tính ra Ldtt= 1070-1020=50, lượng điện tiêu thụ < 60 nên số tiền là:

Tien = 50*5= 250đ.

Nếu chiso2=1150 Ldtt = 1150-1020=130, lượng điện tiêu thụ vượt 60 kw chưa vượt 160 kw nên tiền điện tính là:

Tien=60*5 + (130-60) *8 = 860đ.

Nếu chiso2=1234, Ldtt = 1234-1020= 214, lượng điện tiêu thụ vượt 160 kw nên tiền điện là:

Tien=60*5+100*8+(214-160)*10=300+800+54*10= 1640 đ.

(112)

Readln(Ho_ten);

Write(‘Nhap số tháng trước, số tháng này: ‘); Readln(chiso1, chiso2);

Ldtt:=chiso2- chiso1;

If Ldtt<= 60 then Tien:=Ldtt*5 else

if Ldtt <=160 then

Tien:=60*5+(Ldtt - 60)*8 else

Tien:=60*5 + 100*8 + (Ldtt - 160)*10; Writeln(‘Họ tên ‘, Ho_ten);

Writeln(‘Tiền phải trả ‘, Tien:10:2); Readln;

End.

8.2 Câu lệnh CASE

Trong số trường hợp, phải lựa chọn việc nhiều việc cấu trúc IF lồng tỏ rắc rối, khó viết, khó kiểm tra tính đắn Việc dùng cấu trúc CASE khắc phục nhược điểm

(113)

CASE biểuthức OF hằng1: LệnhP1; hằng2: LệnhP2; .

hằngk: LệnhPk; END;

Dạng 1

CASE biểuthức OF hằng1: LệnhP1; hằng2: LệnhP2; .

hằngk: LệnhPk; ELSE LệnhQ; END;

Dạng 2 Chú ý lệnh CASE phải kết thúc END;

* Các yêu cầu

- Kiểu liệu biểuthức nguyên, ký tự, lôgic, kiểu liệt kê hay kiểu đoạn Xin nhấn mạnh rằng: biểuthức không kiểu thực hay kiểu chuỗi, hạn chế lệnh CASE so với lệnh IF

- Các hằng1, hằng2, , hằngk phải có kiểu liệu phù hợp với kiểu liệu biểuthức

(114)

+ v.v

+ Nếu giá trị biểuthức = hằngk thực LệnhPk, chuyển sang lệnh sau End, ngược lại:

a) chuyển sang lệnh sau End (nếu dạng 1) b) thực LệnhQ, chuyển sang lệnh sau End (nếu dạng 2)

Hình 8.4 hình 8.5 sơ đồ lệnh CASE vẽ cho trường hợp k=3

Trong hình vẽ , ta ký hiệu: G giá trị biểuthức

H1, H2, H3 hằng1, hằng2, hằng3

(115)

+ Ví dụ 8_5: Nhập vào họ tên năm sinh người, cho biết người thuộc lứa tuổi nào: sơ sinh, nhi đồng, thiếu niên, niên, trung niên hay người lớn tuổi, biết rằng:

(116)

Namsinh, Namnay, Tuoi: Integer; Phanloai: String[14];

Begin

Write(‘Nhập họ tên: ‘); Readln(Ho_ten);

Write(‘Nhập năm sinh năm nay: ‘); Readln(Namsinh, Namnay);

Tuoi:=Namnay - Namsinh;

If Tuoi< then writeln( ‘Nhập sai’) else

Begin

Case Tuoi OF

0 ,1: Phanloai:= ‘sơ sinh’; 2 9: Phanloai:= ‘nhi đong’; 10 15: Phanloai:= ‘thieu niên’; 16 32: Phanloai:= ‘thanh nien’; 33 50: Phanloai:= ‘trung nien’; else

Phanloai:= ‘nguoi lon tuoi’; End; {hết Case}

Writeln(Ho_ten, #32 , Tuoi, #32 , Phanloai); End;

(117)

Trong ví dụ này, lệnh CASE dựa vào Tuổi để xác định lứa tuổi, kết lưu vào biến Phanloai Ðóng vai trị hằng1 hai số viết cách dấu phẩy, dòng:

0,1: Phanloai:= ‘So sinh’;

có nghĩa Tuổi thực lệnh gán: Phanloai:= ‘So sinh’;

Ðóng vai trị hằng2 tất số nguyên phạm vi từ đến 9, dòng:

2 9: Phanloai:= ‘nhi đong’;

có nghĩa Tuổi số nguyên từ đến thực lệnh gán: Phanloai:= ‘nhi đong’;

+ Ví dụ 8_6: Xây dựng thực đơn cho phép lựa chọn bốn việc: tính tổng, tính hiệu, tính tích tính thương hai số x, y nhập từ bàn phím

Màn hình cần bốn mục sau cho người lựa chọn: A TÍNH TỔNG HAI SỐ

B TÍNH HIỆU HAI SỐ C TÍNH TÍCH HAI SỐ D TÍNH THƯƠNG HAI SỐ

(118)

Chương trình viết sau: PROGRAM VIDU8_6;

{Thực đơn} Uses Crt; Var

x, y: Real; Ch: Char; Begin

Clrscr;

Write('Nhap x va y:'); Readln(x, y);

Gotoxy(10, 3); Write('A TINH TONG HAI SO'); Gotoxy(10, 5); Write('B TINH HIEU HAI SO'); Gotoxy(10, 7); Write('C TINH TICH HAI SO'); Gotoxy(10, 9); Write('D TINH THUONG HAI SO'); Gotoxy(2,11); Write('Chon muc nao (A, B, C, D)?');

Readln(Ch); CASE Ch of

'A', 'a': Writeln('Tong =', x+y:6:2); 'B', 'b': Writeln('Hieu =', x-y:6:2); 'C', 'c': Writeln('Tich =', x*y:6:2); 'D', 'd': If y<>0 then

(119)

Writeln(‘Khong xac dinh !'); ELSE

Writeln('Khong co muc', Ch); END;

Readln; End.

Trong chương trình có sử dụng thủ tục: GOTOXY (m, n) thuộc thư viện CRT, có chức đặt trỏ hình vào tọa độ cột thứ m, dịng thứ n hình Ví dụ lệnh Gotoxy (10, 3); đặt trỏ hình vào tọa độ cột 10, dịng

+ Ví dụ 8_7: Nhập vào tháng năm, cho biết tháng năm có ngày

Theo dương lịch:

Các tháng 4, 6, 9, 11: có 30 ngày,

Các tháng 1, 3, 5, 7, 8, 10 12: có 31 ngày,

Riêng tháng bình thường có 28 ngày, năm nhuận có 29 ngày

Cách xác định năm nhuận sau:

(120)

Var

Thang, Nam, Songay: Integer; Nhuan: Boolean;

Begin

Write(‘Nhập Thang, Nam: ‘); Readln(Thang, Nam);

If (Thang<1) or (Thang>12) then writeln(‘Nhập sai ’)

else Begin

Case Thang OF

4, 6, 9, 11: Songay:=30;

1, 3, 5, 7, 8, 10, 12: Songay:=31; 2: Begin

Nhuan:= (Nam mod 400=0) or ((Nam mod 100<>0) and (Nam mod 4=0));

If Nhuan= TRUE then Songay:=29

else

Songay:=28; End;

End; {Hết Case}

(121)

Readln; End.

Trong ví dụ này, Tháng=2 phải làm hai lệnh đặt khối begin end, lệnh ghép:

Begin

Nhuan:= (Nam mod 400=0) or ((Nam mod 100<>0) and (Nam mod 4=0));

If Nhuan=TRUE then Songay:=29 else Songay:=28; End;

* Câu lệnh CASE lồng nhau:

Trong cấu trúc CASE, LệnhP1, LệnhP2, , LệnhPk hay LệnhQ lại lệnh CASE ta có cấu trúc CASE lồng

+ Ví dụ 8_8: Một xí nghiệp tính tiền thưởng hàng tháng cho công nhân theo công thức: Tiền thưởng = Hệ số * 200

Trong Hệ số tính dựa vào kết bình chọn phân loại lao động (loại A, B hay C) nơi làm việc (cơ sở hay sở 2) người tháng, cụ thể sau:

(122)

Ví dụ ông X xếp loại A làm việc sở có hệ số thưởng 2.0, nên tiền thưởng =2.0*200=400

Viết chương trình nhập họ tên, phân loại lao động nơi làm việc cơng nhân, tính tiền thưởng cho người

PROGRAM VIDU8_8;

{Tính tiền thưởng cho cơng nhân} Var

Ho_ten: String[20]; Loai: Char;

Coso: Byte;

Heso, Thuong: Real; Begin

Write(‘Nhập họ tên: ‘); Readln(Ho_ten);

Write(‘Nhập sở làm việc (1,2): ‘); Readln(Coso);

Write(‘Nhập phân loại lao động (A,B,C): ‘); Readln(Loai);

CASE Loai OF ‘A’, ‘a’: Case Coso of

1: Heso:=2.0; 2: Heso:=2.5; End;

(123)

2: Heso:=1.8; End;

‘C’, ‘c’: Heso:=1.0; END; {Hết CASE} Thuong:=Heso*200;

Writeln(‘Họ tên Tiền thưởng ‘); Writeln(Ho_ten , Thuong:8:2 ); Readln;

End.

So sánh lệnh Case với lệnh If

+ Lệnh If lệnh Case câu lệnh rẽ nhánh, cho phép lựa chọn công việc nhiều công việc lựa chọn Nhưng cấu trúc If tổng quát mạnh cấu trúc Case vì lệnh If khơng hạn chế cả, cịn lệnh Case u cầu biểu thức phải thuộc kiểu liệu đếm được: nguyên, ký tự, lôgic, liệt kê hay đoạn con, không kiểu thực hay chuỗi.

+ Lệnh Case thay tương đương lệnh If Ví dụ lệnh Case chương trình nói (Ví dụ 8.9) thay ba lệnh If sau:

(124)

+ Việc sử dụng lệnh Case nhiều trường hợp có tác dụng làm rõ ràng bật bố cục đoạn chương trình, từ dễ đọc, dễ hiểu

Thơng thường, người ta dùng lệnh Case để thay cấu trúc If lồng có nhiều (ba, bốn, ) tình rẽ nhánh điều kiện cho phép

Các bạn viết lại chương trình ví dụ 8_5, 8_6, 8_7, 8_8 thay lệnh Case lệnh If

9 CÂU LỆNH LẶP FOR 9.1 Dạng 1

Cú pháp:

FOR biến:= m1 TO m2 DO LệnhP; + Yêu cầu

biến phải thuộc kiểu liệu đơn giản đếm được, thường là kiểu nguyên, ký tự hay lôgic, kiểu thực hay chuỗi

m1, m2 biểu thức có kiểu liệu với biến. LệnhP lệnh đơn giản, lệnh có cấu trúc, là lệnh ghép gồm nhiều lệnh đặt khối begin end

Hình 9.1 sơ đồ khối lệnh For với b viết tắt biến.

+ Cách thức hoạt động FOR Bước 1: Gán giá trị biến:= m1;

Bước 2: Nếu biến  m2 làm LệnhP, sang bước 3; Nếu biến > m2 khơng làm LệnhP mà chuyển sang lệnh phía

(125)

Quay lại bước

Tóm lại, LệnhP làm làm lại, bắt đầu biến=m1, kết thúc biến=m2+1, thảy m2-m1+1 lần Vì thế, người ta gọi FOR vịng lặp có số lần lặp biết trước

(126)

Bước 3: gán S:=S+3*3; {S=12+22+32} v.v

Bước 10: gán S:=S+10*10; {được S=12+22+32+ +102} Quá trình từ bước đến bước 10 gọi phép cộng dồn vào biến S Tại bước thứ i, lấy giá trị biến S cộng với i2, kết lại gán cho biến S, giá trị biến S tăng thêm lượng i2 Khi i thay đổi từ đến 10 số 12, 22, 32, , 102đều cộng vào S, kết sau bước thứ 10 giá trị S tổng 12+ 22+ 32+ + 102

Tóm lại, lệnh: S:=S + i*i; làm thảy 10 lần, ứng với i=1, 2, , 10 Quá trình diễn đạt lệnh FOR, sau:

For i:=1 To 10 DO S:=S+ i*i;

Một cách tổng quát, để tính tổng: S=12 + 22+ 32+ + N2, N số nguyên dương bất kỳ, ta dùng hai lệnh:

S:=0;

For i:=1 To N DO S:=S+ i*i; Dưới chương trình cụ thể: PROGRAM VIDU9_1;

{Tính tổng bình phương số tự nhiên <=N} Var

N, i: Integer; S: LongInt; Begin

Write(‘Nhập N:’); Readln(N); S:=0;

(127)

Writeln(‘S= ‘, S); Readln;

End.

Mở rộng tốn tính tổng: Tính tổng đan dấu: S = 12- 22+ 32- 42+ +(-1)N-1N2

Ta viết:

S = 12+ (- 22) + 32+ (- 42) + +(-1)N-1N2

Nhận thấy, số hạng thứ i vế phải có giá trị tuyệt đối i2, mang dấu cộng i lẻ, mang dấu trừ i chẵn Nói cách khác, ta cộng dồn i2vào S i lẻ, cộng dồn (- i2 ) vào S i chẵn Việc xác định i lẻ hay chẵn dựa vào hàm Odd(i) hay kết phép toán i Mod Vậy, lệnh dùng là:

S:=0;

For i:=1 To N DO

if i mod <> then S:=S+ i*i else S:= S- i*i;

Các bạn viết chương trình để tính tổng đan dấu + Ví dụ 9_2: Bài tốn tính tích:

(128)

Bước 10: gán S:=S*10; {được S=1*2*3* *10 =10!} Nếu ví dụ 1, ta phải cộng dồn vào biến S ví dụ ta phải nhân dồn vào biến S Tại bước thứ i, lấy giá trị biến S nhân với i, lại gán kết cho biến S Khi i thay đổi từ đến 10 S tích lũy đủ thừa số 1, 2, 3, ,10, giá trị S sau bước thứ 10 1*2*3* *10 =10!

Quá trình thực từ bước đến bước thứ 10 mô tả 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 , N 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; Dưới chương trình cụ thể: PROGRAM VIDU9_2;

{Tính S=N!} Var

N, i: Integer; S: LongInt; Begin

Write(‘Nhập số dương N: ‘); Readln(N); S:=1;

For i:=1 to N S:=S * i; Writeln(‘Giai thua = ‘, S); Readln;

(129)

+ Ví dụ 9_3: Bài tốn tính lũy thừa:

Nhập số tự nhiên N số thực x bất kỳ, tính S= xN

Tương tự tính N!: ta gán S:=1, sau bước lặp, ta nhân dồn x vào S lệnh S:=S*x Sau N bước vậy, S nhân với x N lần Vậy hai lệnh cần dùng là:

S:=1;

For i:=1 to N S:=S*x; Dưới chương trình cụ thể: PROGRAM VIDU9_3;

{Tính S=lũy thừa N x} Var

N, i: Byte; S, x: Real; Begin

(130)

+ Ví dụ 9_4: In bảng chữ từ A đến Z thành bốn cột sau:

KÝ TỰ MÃ KÝ TỰ MÃ

A 65 a 97

B 66 b 98

Yêu cầu in thành trang hình, trang 15 dịng Trong chương trình ta dùng biến Dem để đếm số dòng in, mỗi in xong dịng biến Dem cộng thêm Khi Dem = 15, 30, 45, (tức Dem mod 15=0) phải làm lệnh Readln; lệnh dừng hình ta gõ Enter in tiếp

PROGRAM VIDU9_4; {In bảng chữ cái} Uses Crt;

Var

ch, ch1: Char; Dem: Integer; Begin

Clrscr;

Writeln(‘Ky tu # Ma # Ky tu # Ma’); Dem:=0;

For ch:=‘a’to ‘z’do Begin

ch1:=Upcase(ch);

(131)

If Dem mod 15 = then Begin

Write(‘Enter để xem tiếp‘); Readln;

End; End;

Writeln(‘HET‘); Readln;

End.

Chương trình ví dụ cách dùng biến chạy kiểu ký tự (ch) lệnh FOR, ngồi ra, đóng vai trò LệnhP lệnh ghép, gồm nhiều lệnh đặt khối begin end

9.2 Dạng + Cú pháp

FOR biến:= m2 DOWNTO m1 DO LệnhP; + Cách thức hoạt động FOR dạng

Bước 1: Gán giá trị biến:= m2;

(132)

+ Ví dụ 9_5: Ðể tính S= N!, ta viết: S=N*(N-1)*(N-2)* *2*1

Cách viết cho thấy cách tính: gán S:=1, sau thực việc nhân dồn S:=S* i với i= N, N-1, , 2, 1, tức là:

S:=1;

For i:=N downto S:=S* i;

Tương tự, để tính S=xN, ta dùng FOR dạng 2: S:=1;

For i:=N downto S:=S*x;

(133)

+ Ví dụ 9_6: In chữ theo thứ tự ngược từ Z đến A thành hai dòng:

Z, Y, X, , C, B, A z, y, x, , c, b, a

Chương trình viết sau: PROGRAM VIDU9_6;

{In chữ theo thứ tự đảo ngược từ Z đến A} Var

Ch: Char; Begin

For ch:=‘Z’downto ‘A’do write(ch:3); Writeln;

For ch:=‘z’downto ‘a’do write(ch:3 ); Writeln;

Readln; End.

9.3 Câu lệnh FOR lồng nhau

(134)

Bây tăng: biến1:=Succ(biến1), lại làm lệnh FOR dòng {2}, kết lệnhP làm thêm n2-n1+1 lần

Quá trình tiếp tục biến1=m2+1 dừng Lệnh FOR {1} làm m2-m1+1 lần lệnh FOR {2}, cịn lệnh FOR {2} lại làm n2-n1+1 lần LệnhP Vì lệnhP làm thảy (m2-m1+1)*(n2-n1+1) lần

+ Ví dụ 9_7: In hình chữ nhật đặc đây:

Ta thấy dòng gồm m chữ A, tức chữ A in liên tiếp thảy m lần, việc làm lệnh:

For j:=1 to m write(‘A’);

Lệnh Write in m chữ A dòng In xong, trỏ nằm cuối dịng đó, trước in dịng tiếp theo, cần phải đưa trỏ xuống dòng lệnh:

Writeln;

Tóm lại, muốn in dịng thứ i, cần phải làm hai lệnh: For j:=1 to m write(‘A’);

Writeln;

(135)

Thay In dịng i hai lệnh nói (đặt khối begin end), ta có thuật tốn để in hình chữ nhật đặc là:

For i:=1 to n do Begin

for j:=1 to m write(‘A’); Writeln;

End;

Các bạn viết chương trình cụ thể cho ví dụ này, m n hai số nguyên dương nhập từ bàn phím

9.4 Các ứng dụng khác lệnh FOR

Lệnh For thông dụng, dễ dùng giải nhiều toán khoa học kỹ thuật thực tiễn Dưới xin nêu hai ứng dụng

+ Ví dụ 9_8: Tìm số Fibonaci.

Dãy số Fibonaci {1, 1, 2, 3, 5, 8, 13, 21, } xây dựng sau:

U0=1, U1=1 , Uk=Uk-1+ Uk-2với k= 2, 3, 4,

Gọi U số hạng thứ k, U0 U1 hai số hạng

(136)

Kết Uo=1 U1=2

Bước 2: tính U:=U0+U1và in U Lúc U=3 U3

Ðể chuẩn bị tính U4, ta lại cho U0đóng vai trị U1và U1

đóng vai trị U, tức gán: U0:=U1;

U1:=U;

Kết U0=2 U1=3

.v.v

Tóm lại lệnh phải lặp lặp lại là: U:=U0+U1;

U0:=U1;

U1:=U;

Vì sang bước sau giá trị U bị thay đổi nên bước ta phải in U Chương trình viết sau:

PROGRAM VIDU9_8; {In N+1 số Fibonaci đầu tiên} Var

N, i, U, Uo, U1: Integer; Begin

Write(‘Nhập N:’); Readln(N);

Uo:=1; U1:=1;

(137)

For i:=2 to N do Begin

U:=Uo+U1; Write(U:3); Uo:=U1; U1:=U; End; Readln; End.

+ Ví dụ 9_9: Bài tốn tính tiền lãi gửi ngân hàng:

Nhập tiền vốn ban đầu, số tháng gửi N lãi suất hàng tháng Tính số tiền nhận sau tháng gửi biết tiền lãi hàng tháng gộp vào tiền vốn

Ví dụ, tiền vốn là100, lãi suất tháng 2% Sau tháng gửi có số tiền là:

Số tiền=100 + 100*0.02 = 102 Sau tháng gửi có số tiền là:

Số tiền=102 + 102*0.02 = 104.04

(138)

Var

Tienvon, Laisuat, Sotien: Real; N, i: Byte;

Begin

Write(‘Nhập tiền vốn, lãi suất số tháng gửi: ‘); Readln(Tienvon, Laisuat, N);

For i:=1 to N do Begin

Sotien:= Tienvon + Tienvon*Laisuat;

Writeln(‘Số tiền sau‘, i ,‘tháng=‘, Sotien:8:2); Tienvon:=Sotien;

End; Readln; End.

10 CÂU LỆNH LẶP WHILE VÀ REPEAT 10.1 Câu lệnh While

+ Cú pháp:

WHILE Ðiềukiện DO LệnhP;

+ Ý nghĩa: Chừng Ðiềukiện cịn làm LệnhP, Ðiềukiện sai không làm LệnhP mà chuyển sang lệnh phía

+ Cách thức hoạt động WHILE:

(139)

Lệnh P gọi thân vịng lặp WHILE

Nếu Ðiềukiện khơng sai LệnhP phải làm hồi, lúc ta có vịng lặp vơ hạn Trong trường hợp này, để dừng chương trình, gõ đồng thời hai phím Ctrl Pause (viết tắt ^Pause)

Ðể tránh vịng lặp vơ hạn, thân vịng WHILE cần có lệnh có tác dụng làm biến đổi đại lượng tham gia Ðiềukiện để đến lúc Ðiềukiện sai vịng lặp kết thúc

(140)

Write(‘Nhập N > 0: ‘); Readln(N);

S:=1;

i:=1; {9} While i<= N do

Begin

S:=S*i;

i:=i+1; {13} End;

Writeln(‘Giai thua = ‘, S); Readln;

End.

Khởi đầu biến i gán giá trị (dòng {9}) Trong vòng lặp WHILE, sau lệnh S:=S*i; biến i tăng lên đơn vị lệnh i:=i+1; (dòng {13}) Khi i=N+1 điều kiện i<=N bị sai lúc vịng lặp kết thúc, kết lệnh S:=S*i; thực N lần ứng với i=1, 2, 3, , N

Trong chương trình trên, khơng có dịng lệnh {13}: i:=i+1;

thì i ln ln nên điều kiện i<=N ln ln (vì N  1), vịng lặp vơ hạn

Sự khác lệnh WHILE so với FOR chỗ: lệnh FOR, biến i tự động gán giá trị ban đầu sau bước lặp tự động tăng lên, cịn WHILE khơng, ta phải viết lệnh

(141)

toán dạng số lần lặp vòng lặp biết trước.

Lệnh WHILE đặc biệt thích hợp với vịng lặp có số lần lặp chưa biết trước, lệnh FOR khơng giải Ðây điểm mạnh lệnh WHILE Hãy xem ví dụ sau

+ Ví dụ 10_2: Trở lại tốn tính tiền gửi ngân hàng có tiền lãi hàng tháng gộp vào vốn (ví dụ 9.9) Câu hỏi là: cần gửi tối thiểu tháng để có số tiền S cho trước.

Giả sử tiền vốn 100, lãi suất hàng tháng 2%, số tiền cần có S=108 Ta tính số tiền có sau tháng gửi:

Sau tháng gửi: Số tiền=100+100*0.02 = 102 Sau tháng gửi: Số tiền=102+102*0.02 = 104.04

Sau tháng gửi: Số tiền=104.04+104.04*0.02= 106.1208 Sau tháng gửi: Số tiền=106.1208+106.1208*0.02= 108.2432

Vậy cần gửi N=4 tháng, số tiền có 108.2431 Quá trình lặp kết thúc tới tháng có Số tiền  S Chương trình sau:

(142)

Readln(Tienvon, Laisuat, S); Sotien:=Tienvon;

N:=0; {N số tháng gửi} While Sotien< S do

Begin N:=N+1;

Sotien:= Tienvon + Tienvon*Laisuat; Tienvon:=Sotien;

End;

Writeln(‘Cần gửi‘, N , ‘tháng‘); Writeln(‘Số tiền có = ‘, Sotien:6:2); Readln;

End.

Số lần lặp lệnh: While Sotien < S ta ấn định từ trước mà tùy thuộc vào biểu thức Sotien < S là mau bị sai hay chậm bị sai Số lần lặp hay nhiều phụ thuộc vào giá trị S nhỏ hay lớn vào tốc độ tăng nhanh hay chậm số tiền

10.2 Câu lệnh Repeat + Cú pháp:

REPEAT LệnhP;

UNTIL Ðiềukiện;

(143)

+ Cách thức hoạt động REPEAT:

Bước 1: Làm LệnhP, kiểm tra Ðiềukiện, Ðiềukiện chuyển sang lệnh phía dưới, ngược lại, Ðiềukiện sai quay lại bước

LệnhP gọi thân vòng lặp REPEAT, gồm nhiều lệnh lệnh không cần phải đặt khối Begin End.

(144)

+ Ví dụ 10_3: Ðảm bảo tính hợp lý 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, tính S=N!, ta thường yêu cầu N≥0 Sự hạn chế phạm vi liệu nhập đảm bảo tính hợp lý chúng làm giảm bớt phức tạp biện luận

Ðể buộc người sử dụng phải nhập A0, nhập A=0 bắt nhập lại nhập A0 thôi, ta dùng cấu trúc:

Repeat

Write(‘Nhập A khác không: ‘); Readln(A);

Until A<> 0;

Ðể đảm bảo 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 tiếng kêu bip để cảnh báo người dùng nhập liệu sai yêu cầu

+ Ví dụ 10_4: Tìm bội số chung nhỏ hai số nguyên dương M N.

(145)

Vì N>M nên ta tìm tập bội số N: {9, 18, 27, 36, 45, } số nhỏ chia hết cho M, số 45

Một cách tổng quát, gọi Max số lớn M N Ðầu tiên ta gán:

BSCNN:=0;

Sau làm lệnh BSCNN:=BSCNN+Max; hoài BSCNN chia hết cho M N dừng

Trong chương trình ta dùng lệnh repeat để nhập hai số M, N đảm bảo dương

PROGRAM VIDU10_4; {Tìm BSCNN M N} Var

M, N, Max, BSCNN: Integer; Begin

Repeat

Write(‘Nhập M N dương:’); Readln(M, N);

(146)

Writeln(‘Bội số chung nhỏ nhất= ‘, BSCNN); Readln;

End.

+ Ví dụ 10_5: Thiết kế để chạy nhiều lần chương trình. Trong Turbo Pascal, lần muốn chạy chương trình ta phải gõ cặp phím Ctrl F9 (viết tắt ^F9), điều bất tiện cần chạy chương trình nhiều lần ứng với liệu thử khác Cấu trúc sau cho phép ta chạy chương trình số lần theo ý muốn:

REPEAT

{Các lệnh chương trình}

Write(‘Tiếp tục khơng (Y/N)?’); Readln(Traloi); {5}

UNTIL (Traloi =‘N’) or ( Traloi=‘n’); Ở đây, Traloi biến kiểu ký tự (Char);

Sau thực xong {các lệnh chương trình}, muốn chạy tiếp ta gõ phím Y, muốn dừng gõ N

Chú ý: lệnh Readln(Traloi); dịng thứ {5} thay bằng:

Traloi:=Readkey;

Hàm Readkey thuộc thư viện CRT cho kết ký tự gõ từ bàn phím, khác lệnh Readln(Traloi) chỗ nhập ký tự ta không cần phải Enter

(147)

PROGRAM VIDU10_5; {In tam giác cân đặc} Uses CRT;

Const sao =‘*’; Var

k, j, m: integer; Traloi: Char; Begin

REPEAT {9} Clrscr;

(148)

Begin

Write(chr(32): m-k-1); {in m-k-1 ký tự trắng} for j:=1 to 2*k+1 Write(sao); {in 2k+1 dấu *} Writeln;

End;

For k:=1 to 2*m-1 Write(sao); {in cạnh đáy} Writeln;

Write(‘Tiếp tục không (Y/N)?‘); Readln(Traloi);

UNTIL (Traloi=‘N’) or ( Traloi=‘n’); {28} End.

Chương trình 10.5 ví dụ hai câu lệnh Repeat lồng nhau, điều xảy thân lệnh Repeat lại chứa lệnh Repeat khác: lệnh Repeat thứ nhất, từ dòng {9} đến dòng {28}, chứa lệnh Repeat thứ hai từ dòng {11} đến dòng {15}

10.3 So sánh lệnh For, While Repeat:

+ Lệnh For dùng cho vịng lặp có số lần lặp biết trước

+ Lệnh While hay Repeat tổng quát lệnh For, dùng cho tất loại vòng lặp, thường dùng cho vòng lặp có số lần lặp chưa biết trước

(149)

+ Ngoài ra, lệnh While kết thúc điều kiện sai, lệnh Repeat kết thúc điều kiện

11. KIỂU LIỆT KÊ KIỂU ÐOẠN CON 11.1 Kiểu liệt kê (enumerated type)

11.1.1. Cách khai báo

Ngồi kiểu liệu có sẵn kiểu nguyên,thực, ký

tự, lôgic chuỗi, Turbo Pascal cho phép người thảo

chương tự xây dựng kiểu liệu

Kiểu liệt kê định nghĩa cách sử dụng từ khóa TYPE liệt kê tất giá trị kiểu, theo mẫu sau:

Type

Tênkiểu = (tên1, tên2, , tênN);

trong tên1, tên2, , tênN tên tự đặt theo quy ước đặt tên Ví dụ:

Type

Phai=(nam, nu);

(150)

Trong chương trình, ta gán: Ph1:=nam;

Ph2:=nu; M1:=den; M2:=trang;

Pascal cho phép khai báo trực tiếp biến kiểu liệt kê không cần qua giai đoạn định nghĩa Type cách liệt kê giá trị mà biến nhận

Ví dụ: biến Ph1, Ph2, M1, M2 nói khai báo trực tiếp sau:

Var

Ph1, Ph2: (nam, nu);

M1, M2: ( den, trang, xanh, vang, tim, nau); 11.1.2. Các hàm liên quan đến kiểu liệt kê

+ Hàm ORD(tên): Trả số thứ tự tên kiểu liệt kê Các giá trị liệt kê đánh số thứ tự Ví dụ:

Ord(nam)=0, Ord(xanh)=2

Thông qua hàm Ord, giá trị liệt kê so sánh với theo quy tắc: giá trị có số thứ tự nhỏ nhỏ hơn:

den < trang < xanh< vang< tim< nau

+ Hàm PRED(tên) hàm SUCC(tên): trả giá trị đứng trước sau tên kiểu liệt kê tương ứng Ví dụ:

(151)

+ Hàm Tênkiểu(k): trả giá trị liệt kê có số thứ tự k Tênkiểu, ví dụ:

Phai(0)=nam Ten_mau(2)= xanh

Hàm hàm ngược hàm Ord 11.1.3. Nhập, xuất kiểu liệt kê

Các giá trị liệt kê nhập, xuất trực tiếp lệnh Readln Write Ðây hạn chế kiểu liệt kê, khiến khơng thơng dụng

Khi muốn nhập hay xuất kiểu liệt kê, ta dùng biến trung gian St kiểu chuỗi Chẳng hạn, muốn nhập màu xanh cho biến M1, ta dùng hai lệnh:

Readln(St);

If St=‘xanh’then M1:=xanh;

Tương tự, muốn in màu xanh lên hình, ta dùng lệnh: If M1=xanh then Writeln(‘xanh’);

(152)

VAR

Tênbiến: hằng1 hằng2;

trong đó, hằng1< hằng2 hai thuộc kiểu liệu Kiểu liệu hằng1 hằng2 kiểu ngun, ký tự, lơgic, hay liệt kê

Ví dụ: Type

Chu_Hoa =‘A’ ’Z’; Tuoi= 200; Var

Ch: Chu_hoa; T: Tuoi;

Theo khai báo ch biến kiểu đoạn con, nhận giá trị ký tự từ ‘A’đến ‘Z’, tương tự, biến T nhận giá trị số nguyên từ đến 200

Cũng khai báo hai biến Ch T trực cách sau:

Var

Ch: ‘A’ ’Z’; T: 200;

11.2.2. Tác dụng kiểu đoạn con

Trong nhiều trường hợp, việc khai báo đoạn có tác dụng tiết kiệm nhớ Tùy theo phạm vi hằng1 hằng2 mà Turbo Pascal cấp phát cho biến số byte tối thiểu Trong ví dụ trên, biến Ch hay T chứa byte

(153)

biến T mà gán T:=201; máy báo lỗi "const out of range". Ngoài chạy chương trình mode {$R+}, chương trình dừng biến nhận giá trị vượt khỏi phạm vi

Kiểu liệt kê kiểu đoạn thuộc loại đơn giản đếm

12. KIỂU TẬP HỢP

12.1 Khai báo

Một tập hợp gồm nhiều giá trị có chung kiểu liệu, gọi kiểu Kiểu phải kiểu vô hướng đếm được, tức kiểu byte, ký tự, lôgic hay liệt kê Số phần tử tập hợp tối đa 256 phần tử

Kiểu tập hợp mơ tả từ khóa SET OF, kiểu phần tử

Ví dụ: TYPE

Kky_tu = SET OF Char; Kchu_hoa = SET OF ‘A’ ‘Z’; Kso = SET OF Byte;

(154)

TapH: SET OF ‘A’ ‘Z’; TapS: SET OF Byte;

Chú ý khai báo sai, kiểu khơng thể Integer, đoạn phạm vi đoạn không vượt phạm vi kiểu Byte:

Var

T1: SET OF Integer; T2: SET OF 256; 12.2 Xác định tập hợp

Một tập hợp xác định cách liệt kê phần tử nó, phần tử phân cách dấu phẩy, đặt hai dấu ngoặc vuông

[ ]: tập rỗng

[3 6]: tập số nguyên 4, 3, 5,

[3 6, 9, 12]: tập số nguyên 3, 4, 5, 6, 9, 12

[‘A’ ’C’, ‘X’, ‘Z’]: tập chữ ‘A’, ‘B’, ‘C’, ‘X’, ‘Z’ Các phần tử tập hợp biến hay biểu thức, ví dụ: [3, 5, i+j, 2*j]: tập hợp có phần tử 3, 5, hai phần tử có giá trị i+j 2*j, i, j số nguyên cho i+j 2*j nằm phạm vi từ đến 255

12.3 Các phép tốn + Phép gán

Có thể gán tập hợp cho biến tập hợp kiểu Ví dụ, với biến khai báo trên, gán:

(155)

TapS:=[15 20, 30, 40];

Tập rỗng [ ] gán cho biến tập hợp kiểu được: TapA:=[ ];

TapH:=[ ];

Lệnh gán sai hai vế không kiểu liệu: TapA:=[1 8];

TapS:=[‘1’ ’9’]; + Phép hợp

Hợp hai tập hợp A B, ký hiệu A+B, tập hợp gồm phần tử thuộc tập A thuộc tập B Ví dụ:

[3 5]+[4 6,10, 15]=[ 6, 10, 15] + Phép giao

Giao hai tập hợp A B, ký hiệu A*B, tập hợp gồm phần tử đồng thời thuộc A B

Ví dụ:

[1 10]*[5 15] =[5 10] + Phép hiệu

(156)

Ví dụ:

‘N’IN [‘N’, ‘n’] cho kết TRUE ‘y’IN [‘N’, ‘n’] cho kết FALSE + Các phép so sánh (=, <>, <=, >=)

Cho A B hai tập hợp kiểu, kết phép so sánh A với B TRUE FALSE

+ Phép bằng

A=B phần tử A thuộc B phần tử B thuộc A, trường hợp ngược lại, ta nói A khác B viết A<>B

Ví dụ:

[3,2,4,5]= [2, 5] [‘A’, ‘B’]<>[‘a’,’B’] + Phép nhỏ bằng

A<=B phần tử A thuộc B Ví dụ:

[3 5]<=[3 5] [3 5]<=[1 6]

+ Phép lớn bằng

A>=B phần tử B thuộc A, nói cách khác A>=B B<=A

Ví dụ:

[3 5]>=[3 5]

[‘A’ ’Z’]>=[‘A’ ’D’]

(157)

If (A<=B) and ( A<>B) then writeln (‘A < B’); If (A>=B) and ( A<>B) then writeln (‘A > B’); 12.4 Các ví dụ

+ Ví dụ 12_1

Nhập vào chuỗi St, cho biết St có chữ hoa Ví dụ St= ‘ABc3BAFdzA’thì có chữ hoa A, B, F

PROGRAM VIDU12_1; Var

Taphoa: Set of ‘A’ ’Z’; N, i: byte;

ch: char; St: String; Begin

Write(‘Nhập chuỗi St: ‘); Readln(St);

(158)

Readln; End.

+ Ví dụ 12_2

Nhập N số nguyên phạm vi từ đến 255 In tập số chẵn, lẻ cho biết có số chẵn, số lẻ (các số trùng kể lần) Ví dụ, nhập số: 1, 2, 3, 4, 1, 2, 3, 4, có hai số chẵn và có số lẻ 1, 3,

PROGRAM VIDU12_2; Const

N=10; Var

Tapchan, Taple: Set of byte; N1, N2, i, k: byte;

Begin

Tapchan:=[]; Taple:=[];

For i:=1 to N do Begin

Write(‘Nhap so thu ‘, i, ‘: ‘); Readln(k);

If odd(k)=False then

Tapchan:=Tapchan+[k] else

(159)

writeln(‘Các số chẵn là: ‘); N1:=0;

For i:=0 to (255 div 2) do if 2*i IN Tapchan then

Begin

Write(2*i: 3); N1:=N1+1; End;

Writeln( ‘Có ‘, N1, ‘số chẵn’); Writeln(‘Các số lẻ là: ‘); N2:=0;

For i:=0 to (255 div 2) do if (2*i +1) IN Taple then

Begin

Write(2*i+1: 3); N2:=N2+1; End;

(160)

Xuất phát từ tập số nguyên S=[2 N] ta loại số nguyên tố tất bội số khỏi S, lặp lại trình S thành tập rỗng

Ví dụ: S=[2 15];

Bước 1: - đưa vào tập số nguyên tố, Tapsnt:=[2] - loại bội khỏi S, ta

S=[3,5,7,9,11,13,15 ]

Bước 2: - đưa vào tập số nguyên tố, Tapsnt:=[2,3] - loại bội khỏi S, ta

S=[5,7,11,13 ]

Bước 3: - đưa vào tập số nguyên tố, Tapsnt:=[2,3,5] - loại bội khỏi S, ta

S=[7,11,13]

Bước 4: - đưa vào tập số nguyên tố, Tapsnt:=[2,3,5,7] - loại bội khỏi S,

S=[11,13 ]

Bước 5: - đưa 11 vào tập số nguyên tố, Tapsnt:=[2,3,5,7,11] - loại 11 bội 11 khỏi S, S=[13 ] Bước 6: - đưa 13 vào tập số nguyên tố, Tapsnt:=[2,3,5,7,11,13]

- loại 13 bội 13 khỏi S, S=[ ] Kết Tapsnt = [2,3,5,7,11,13]

Tập S giống sàng để lọc loại số khơng phải số ngun tố Chương trình cụ thể sau:

(161)

N=20; Var

Tapsnt, S: Set of N; snt, i: Integer;

Begin

S:=[2 N]; Tapsnt:=[];

snt:=2; {so nguyen to nho nhat} Writeln(‘Cac so nguyen to la:’); Repeat

{tim snt la so nho nhat S}

While Not (snt IN S) snt:=snt+1; Tapsnt:= Tapsnt+[snt]; {dua vao Tapsnt} Write(snt:4);

{Loại bội snt khỏi S} i:=snt;

(162)

13. KIỂU MẢNG 13.1 Mảng chiều

+ Khái niệm

Mảng tập gồm nhiều phần tử có chung kiểu liệu Mỗi phần tử mảng có đại lượng xác định vị trí tương đối phần tử so với phần tử khác mảng, gọi số Các yếu tố để xác định mảng gồm có:

Tên mảng

Kiểu liệu chung phần tử mảng Kiểu liệu số phạm vi số

Kiểu liệu phần tử mảng kiểu liệu mà biến có Tuy nhiên, kiểu liệu số thì khơng kiểu thực hay kiểu chuỗi, kiểu đếm được: nguyên, ký tự, lôgic, liệt kê hay đoạn

13.1.1. Khai báo mảng chiều

Mảng chiều, gọi dãy, hay đơn giản mảng, khai báo theo hai cách:

* Cách 1: Khai báo trực cách sau Var

Tênmảng: Array[m1 m2] of Tênkiểudữliệu; Ở m1, m2 hai xác định phạm vi số, chúng có chung kiểu liệu, m1 ≤ m2

Ví dụ: Cho khai báo đây: Var

A: Array[0 10] of Real;

(163)

Theo khai báo trên, ta có ba mảng:

+ Mảng thứ tên A, gồm 11 phần tử kiểu Real, ứng với số 0, 1, 2, , 10, là:

A[0], A[1], A[2], , A[10]

+ Mảng thứ hai tên HTen gồm phần tử kiểu liệu String[18] ứng với số từ đến 5:

Hten[1], Hten[2], Hten[3], Hten[4], Hten[5]

+ Mảng thứ ba tên B, gồm phần tử kiểu Integer ứng với số ‘a’, ‘b’, ‘c’, ‘d’:

B[‘a’], B[‘b’], B[‘c’], B[‘d’]

Ðể có hình ảnh mảng, mảng A, ta hình dung có dãy nhà tầng, tên gọi dãy A, gồm 11 phòng liên tiếp giống hệt đánh số thứ tự từ 0,1, 2, , đến 10:

A0 A1 A2 A3 A4 A5 A6 A7 A8 A9

Tương tự, mảng B giống dãy nhà B tầng có bốn phịng đánh số thứ tự chữ a, b, c, d:

Ba Bb Bc Bd

* Cách 2: Khai báo qua kiểu liệu mới, gồm hai

(164)

Ví dụ, mảng A, B Hten ta khai báo theo cách 2, 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;

13.1.2. 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 giá trị ban đầu cho phần tử mảng, chẳng hạn đây:

Const

X: array[1 5] of Integer = (12, 14, 16, 18, 20); Khi X mảng gồm năm phần tử kiểu nguyên có giá trị X[1]=12, X[2]=14, X[3]=16, X[4]=18, X[5]=20

Mặc dù từ khóa Const song X lại dùng biến mảng, tức phần tử X thay đổi giá trị Ví dụ, chương trình ta gán:

X[1]:= 2; X[2]:=5+20;

13.1.3. Truy xuất phần tử mảng

(165)

Tênmảng [chỉ số phần tử] Ví dụ: gán:

A[0]:= 15.8; A[1]:= 2*A[0];

Hten[3]:= ‘Nguyen Thi Loan’; B[‘a’]:=100;

Chỉ số phần tử biến, hằng, hay biểu thức Ví dụ, cho i biến kiểu nguyên, ta dùng lệnh:

i:=6;

A[i]:=100.25;

Hai lệnh tương đương với lệnh: A[6]:=100.25;

Nếu biến i có giá trị lệnh:

A[ i div +1]:= 4.5; tương đương với lệnh: A[4]:=4.5; biểu thức i div +1 có giá trị

Khi nhập liệu cho phần tử mảng, ta dùng câu lệnh For, While hay Repeat

(166)

i:=0;

While i<= 10 begin

Write(‘Nhập phần tử thứ ‘, i, ‘: ‘); Readln(A[i]);

i:=i+1; end;

Tương tự để nhập liệu cho phần tử mảng B, ta viết:

For ch:=‘a’to ‘d’do begin

Write(‘Nhap phần tử thứ ‘, ch, ‘: ‘); Readln(B[ch]);

end;

Ðể in giá trị mảng A lên hình, ta viết: For i:=0 to 10 Write(A[i]:6:2);

Các giá trị mảng A in liên tiếp dòng Còn muốn in phần tử dòng, ta thay lệnh Write Writeln

Tương tự, mảng B in lên hình lệnh: For ch:=‘a’to ‘d’do Write(B[ch]);

Chú ý: Turbo Pascal cho phép gán mảng cho mảng khác.

(167)

có nghĩa lấy giá trị phần tử mảng Y gán cho phần tử tương ứng mảng X Ví dụ, cho khai báo:

Var

X, Y: Array[1 10] of Real; Khi đó, lệnh:

X:= Y;

tương đương với lệnh:

For i:=1 to 10 X[i]:=Y[i];

13.1.4. Các tốn mảng

+ Ví dụ 13_1: Ðếm số lần xuất giá trị x dãy A1, A2, , An

Ví dụ giá trị x=6 xuất lần dãy 6 Ta dùng biến Dem kiểu nguyên để đếm số lần xuất x Ðầu tiên ta gán Dem:=0, sau duyệt phần tử A1, A2,… An, có phần tử x tăng biến Dem lên đơn vị Kết biến Dem có giá trị số phần tử x Hai lệnh thuật tốn là:

Dem:=0;

For i:=1 to N

(168)

là: đếm số phần tử mảng A thỏa mãn điều kiện cho trước Trong lệnh For trên, thay đẳng thức A[i]=x A[i] thỏa điều kiện , ta thuật toán tổng quát hơn:

Dem:=0;

For i:=1 to N

If A[i] thỏa điều kiện then Dem:=Dem+1;

Chương trình sau nhập mảng A có N phần tử, in mảng A lên hình, đếm xem mảng A có số dương:

PROGRAM VIDU13_1; {Ðếm số dương mảng} Type

Kmang = Array[1 20] of Real; Var

A: Kmang;

i, N, Dem: Integer; Begin

Repeat

Write(‘Nhập số phần tử N: ‘); Readln(N);

Until (N>0) and ( N<21); {nhập mảng}

For i:=1 to N do Begin

Write(‘Nhập A[‘, i , ‘]: ‘); Readln( A[i] );

(169)

{In mảng A}

Writeln(‘Mảng A là: ’);

For i:=1 to N Write(A[i]:3:0); Writeln;

{đếm số dương} Dem:=0;

For i:=1 to N do

If A[i]>0 then Dem:=Dem+1; Writeln(‘Số số dương = ‘, Dem ); Readln;

End.

+ Ví dụ 13_2: Tìm số lớn dãy A1, A2, , An. Trong ví dụ 8_1, ta cách tìm số lớn hai số, ba số Có thể mở rộng thuật tốn để tìm số lớn n số:

Gọi Max biến chứa số lớn phải tìm, thì: Bước 1: Gán Max:=A[1];

(170)

Quá trình mô tả hai lệnh: Max:=A[1];

For i:=2 to n

if Max<A[i] then Max:=A[i]; Nhận xét

- Trong lệnh For trên, biến i chạy 2, kết cho i chạy

- Không thiết phải gán giá trị ban đầu cho Max A[1], mà gán cho Max phần tử tùy ý mảng, ví dụ phần tử A[n] chẳng hạn, biến i lệnh For phải chạy

+ Ví dụ 13_3: Bài toán xếp mảng tăng dần (hay giảm dần)

Cho dãy A[1], A[2], , A[n], nói A dãy tăng A[1]  A[2]  A[n], tương tự, A dãy giảm A[1] A[2]  A[n] Dãy đồng A[1]=A[2]= =A[n] trường hợp đặc biệt, vừa dãy tăng, vừa dãy giảm

Ví dụ

Dãy 3 5 6 dãy tăng Dãy 9 5 0 dãy giảm

Dãy 3 6 dãy khơng tăng khơng giảm Bài tốn đặt là: cho dãy A[1], A[2], , A[n] bất kỳ, thực hoán đổi giá trị phần tử mảng A để A lập thành dãy tăng

Ví dụ, cho dãy A có phần tử A[1]=9, A[2]=7, A[3]=5, A[4]=8, A[5]= 2, cần thực hoán đổi để có A[1]=2, A[2]=5, A[3]=7, A[4]=8 A[5]=9

(171)

đơn giản dễ hiểu cho người lập trình, phương pháp lựa chọn trực tiếp (Straight selection sort)

Ý tưởng phương pháp sau:

Bước 1: Tìm số nhỏ phần tử A[1], A[2], , A[n] để vào vị trí A[1]

Bước 2: Tìm số nhỏ phần tử A[2], A[3], , A[n] để vào vị trí thứ hai A[2]

.v.v

Bước n-1: Tìm số nhỏ hai phần tử A[n-1], A[n] để vào vị trí n-1 Sau bước A[n] giá trị lớn

Chẳng hạn, xét dãy A có phần tử: {5,3,4,1}:

Bước 1: Nếu A[1] > A[2] đổi A[1] với A[2], được: {3,5,4,1}

Nếu A[1] > A[3] đổi A[1] với A[3]: khơng đổi Nếu A[1] > A[4] đổi A[1] với A[4], được: {1,5,4,3}

Bước 2: Nếu A[2] > A[3] đổi A[2] với A[3], được: {1,4,5,3}

(172)

For j:=i+1 to

if A[i]>A[j] then Ðổi chỗ A[i] A[j];

Mảng A có phần tử, trường hợp tổng quát mảng A có N phần tử lệnh For thứ có biến i chạy từ đến N-1, lệnh For thứ hai có biến j chạy từ i+1 đến N, tức là:

For i:=1 to N-1 For j:=i+1 to N

if A[i]>A[j] then Ðổi chỗ A[i] A[j];

Việc đổi chỗ giá trị A[i] A[j] tiến hành cách dùng biến Z trung gian kiểu liệu với A[i] A[j] Ðầu tiên gởi tạm giá trị A[i] vào biến Z, sau đưa giá trị A[j] vào A[i], cuối đưa giá trị Z vào A[j], tức phải làm ba lệnh:

Z:=A[i]; A[i]:=A[j]; A[j]:=Z;

Tóm lại, thuật toán xếp dãy A tăng viết sau: For i:=1 to N-1 do

For j:=i+1 to N do if A[i]>A[j] then

Begin {Ðổi chỗ A[i] A[j]} Z:=A[i];

(173)

Trong N số phần tử dãy A Z biến trung gian có kiểu liệu với phần tử mảng A

Chương trình tìm số lớn mảng A dãy A tăng dần:

PROGRAM VIDU13_3;

{Tìm Max dãy A tăng dần} Uses CRT;

Type

Kmang = array[1 20] of Real; Var

i, j, N: Integer; A: Kmang; z, Max: Real; Begin

Clrscr; Repeat

(174)

Max:=A[1]; For i:=1 to N do

if Max< A[i] then Max:=A[i]; Writeln(‘Số lớn là: ‘, Max: 4:1); {sắp xếp dãy tăng}

For i:=1 to N-1 do For j:=i+1 to N do

If A[i]>A[j] then {23} Begin {đổi chỗ A[i] A[j]}

z:=A[i]; A[i]:=A[j]; A[j]:=z; End;

Writeln(‘Dãy tăng là: ‘); For i:=1 to N do

Write(A[i]:3:0); Readln;

End.

Chú ý 1: Muốn dãy A giảm dần chương trình cần thay dòng {23}:

If A[i] > A[j] then dòng:

If A[i] < A[j] then

(175)

Chú ý 2: Sắp xếp phận dãy.

Gọi m h hai số nguyên cho ≤ m < h ≤ N, A[m], A[m+1], , A[h] dãy dãy A Muốn dãy A[m], A[m+1], , A[h] tăng (hay giảm) mà không làm ảnh hưởng đến phần lại dãy A, ta dùng lệnh sau:

For i:= m to h-1 do For j:=i+1 to h do

if A[i]>A[j] then

Begin {Ðổi chỗ A[i] A[j]} Z:=A[i];

A[i]:=A[j]; A[j]:=Z; End;

+ Ví dụ 13_4: Kiểm tra mảng có thỏa tính chất khơng Ta thường gặp tốn kiểm tra xem phần tử mảng A có thỏa mãn điều kiện khơng, ví dụ mảng A có phải dãy tăng khơng, có phải dãy đối xứng khơng, có phải cấp số cộng khơng,

(176)

if A[i] không thỏa điều kiện then Kiemtra:= FALSE; Việc xác định điều kiện tùy tốn cụ thể

Ví dụ: Kiểm tra xem A có phải dãy đối xứng không? Dãy 5 đối xứng

Dãy khơng đối xứng A[3] khác A[5] Như vậy, dãy N phần tử A1, A2, , An đối xứng

A1=An, A2=An-1, , An=A1, tức Ai= An-i+1với i=1, 2, , n

Ðẳng thức: Ai = An-i+1 điều kiện mà phần tử

dãy A phải thỏa để A dãy đối xứng

Giả thiết biến Kiemtra khai báo kiểu Boolean Trong chương trình ta dùng lệnh sau:

Kiemtra:=TRUE; For i:=1 to N do

if A[i]<>A[N-i+1] then Kiemtra:=FALSE; If Kiemtra=TRUE then

writeln(‘Dãy A đối xứng’) else

Writeln(‘Dãy A không đối xứng‘); Trong thuật tốn trên, lệnh For thay lệnh While, tốc độ nhanh song khó hiểu hơn:

Kiemtra:=TRUE; i:=1;

While (i <=N ) and (Kiemtra=TRUE) do if A[i]<>A[N-i+1] then

(177)

If Kiemtra=TRUE then writeln (‘Dãy A đối xứng’) else

writeln(‘Dãy A không đối xứng ‘);

Bạn đọc viết chương trình cho ví dụ Chú ý Câu lệnh:

If Kiemtra=TRUE then writeln(‘Dãy A đối xứng’) else

writeln(‘Dãy A khơng đối xứng ‘); hồn tồn tương đương với lệnh: If Kiemtra then

writeln(‘Dãy A đối xứng’) else

writeln(‘Dãy A khơng đối xứng ‘); + Ví dụ 13_5: Tính giá trị đa thức:

P = ao+ a1x + a2x2+ + anxn

trong số nguyên n, số thực x hệ số a0, a1, , an

(178)

Chương trình viết sau: PROGRAM VIDU13_5; {Tính giá trị đa thức bậc N} Var

i, N: Integer;

A: Array[0 20] of Real; x, P, U: Real;

Begin Repeat

Write(‘Nhập N x: ‘); Readln(N, x);

Until (N>0) and ( N<21);

For i:=0 to N {nhập mảng hệ số} Begin

Write(‘Nhập hệ số A[‘, i, ‘]: ‘); Readln(A[i]);

End; U:=1; P:=A[0];

For i:=1 to N do Begin

U:=U*x; P:=P+A[i]*U; End;

(179)

Readln; End.

13.2. Mảng hai chiều (ma trẬn) 13.2.1. Khai báo mảng hai chiều

Mảng hai chiều, gọi ma trận, mở rộng trực tiếp mảng chiều Ta có hai cách khai báo

+ Cách 1: Khai báo trực tiếp: VAR

Tênmảng: Array[n1 n2 , m1 m2] of Tênkiểudữliệu; n1, n2 có kiểu liệu n1 n2, chúng xác định phạm vi số thứ nhất, gọi số dòng Tương tự m1, m2 có kiểu liệu m1 m2, chúng xác định phạm vi số thứ hai, gọi số cột Giống mảng chiều, kiểu liệu số kiểu đếm được: nguyên, ký tự, lôgic, liệt kê hay đoạn con, không kiểu thực hay chuỗi.

Ví dụ, cho khai báo: Var

(180)

Y[‘b’,1], Y[‘b’,2], Y[‘b’, 3] Y[‘c’,1], Y[‘c’,2], Y[‘c’, 3]

Có thể ví X nhà hai tầng, tầng có ba phịng giống Các tầng đánh số từ đến 2, tầng, phòng đánh số từ đến Tương tự, Y nhà ba tầng, tầng đánh số ‘a’, ‘b’, ‘c’, tầng có ba phòng đánh số 1, 2,

+ Cách 2: Biến mảng khai báo thông qua kiểu mảng định nghĩa trước từ khóa TYPE, tức là:

TYPE

Tênkiểumảng=Array[n1 n2,m1 m2] of Tênkiểudliệu; VAR

Tênmảng: Tênkiểumảng;

Ví dụ: Hai mảng X Y nói khai báo theo hai bước sau:

Type

Kmang1 = array[1 2, 3] of Real;

Kmang2 = array[‘a’ ’c’, 3] of String[15]; Var

X: Kmang1; Y: Kmang2;

Chú ý: - Có thể xem mảng hai chiều mảng chiều mà phần tử lại mảng chiều

Hai mảng X, Y nói khai báo sau: Type

Kmang1 = array[1 2] of array[1 3] of Real;

(181)

Var

X: Kmang1; Y: Kmang2;

Hiểu theo cách X mảng gồm hai phần tử X[1] X[2] mà phần tử lại mảng gồm ba phần tử:

X[1] mảng có ba phần tử kiểu thực X[1][1], X[1][2], X[1][3]

X[2] mảng có ba phần tử kiểu thực X[2][1], X[2][2], X[2][3]

Ðiều tương tự áp dụng cho biến mảng Y Hai cách viết X[i][j] X[i,j] phần tử - Khai báo gán giá trị ban đầu:

Có thể khai báo gán giá trị cho mảng hai chiều, chẳng hạn:

Type

Kmang1 = array[1 2, 3] of Real; Const

X: Kmang1 = ((1.5, 2.5, 3.5), (5.0, 6.5, 7.0));

(182)

Tênbiếnmảng[chỉ số 1, số 2] Ví dụ:

X[1,1]:=12.5; X[2,1]:=X[1,1]+15; Y[‘a’,1]:=‘Tran Thi Mai’;

Ðể nhập liệu cho mảng hai chiều, ta phải dùng hai vòng lặp duyệt theo hai số, chẳng hạn muốn nhập liệu cho mảng X, ta viết:

For i:=1 to do For j:=1 to do

Begin

Write(‘nhập phần tử hàng ‘, i, ‘cột ‘, j , ‘: ‘); Readln(X[i, j]);

End;

Tương tự, lệnh nhập liệu cho mảng Y viết là: For ch:=‘a’to ‘c’do

For j:=1 to do Begin

Write(‘nhập phần tử hàng ‘, ch , ‘cột ‘, j , ‘:‘); Readln(X[ch, j]);

End;

trong ch biến kiểu ký tự, i j biến nguyên Ðể in mảng X lên hình, trình bày giống cách viết ma trận, hàng in dòng, ta dùng lệnh:

(183)

Begin

For j:=1 to write(X[i,j]:3:1); {in hàng thứ i} Writeln; {xuống dòng, chuẩn bị in hàng tiếp theo} End;

13.2.3. Các ví dụ ma trận

Vì ma trận mảng chiều mảng chiều nên nhiều toán mảng mở rộng tự nhiên cho ma trận

+ Ví dụ 13_6: Tính tổng hai ma trận

Nhập vào hai ma trận A, B cấp NxM Tính ma trận C tổng hai ma trận A B, in ma trận C lên hình

Cơng thức tính phần tử ma trận C= A+B: C[i,j ] = A[i, j] + B[i, j] với i=1, , N, j=1, , M Chương trình sau:

PROGRAM VIDU13_6; {Tính tổng hai ma trận} Uses CRT;

Var

(184)

For i:=1 to N do For j:=1 to M do

Begin

Write(‘Nhập A[‘, i, ‘,’, j , ‘]: ‘); Readln(A[i,j]);

End;

{nhập B tính C ln} For i:=1 to N do

For j:=1 to M do Begin

Write(‘Nhập B[‘, i, ‘,’, j , ‘]: ‘); Readln(B[i,j]);

C[i, j]:=A[i, j] + B[i, j]; End;

{In ma trận A lên hình} Writeln(‘Ma tran A la:’); For i:=1 to N do

Begin

For j:=1 to M do

write(A[i, j]:3:0); Writeln;

End;

(185)

For i:=1 to N do Begin

For j:=1 to M do

write(B[i, j]:3:0); Writeln;

End;

{In ma trận C lên hình} Writeln(‘Ma tran C la:’); For i:=1 to N do

Begin

For j:=1 to M do

write(C[i, j]:3:0); Writeln;

End; Readln; End.

(186)

Writeln(‘Số lớn ’, Max);

+ Ví dụ 13_8: Tìm số lớn (hay số nhỏ nhất) hàng (hay cột) ma trận A:

Hàng i ( 1 i N ) ma trận A có dạng: A[i,1], A[i,2], , A[i,M]

Nếu xem i cố định mảng chiều có M phần tử, nên số lớn hàng i tìm lệnh:

Max:=A[i, 1]; For j:=1 to M

if Max< A[i, j] then Max:=A[i, j]; Writeln(‘Sln hàng ‘, i, ‘là: ‘, Max);

Vì có thảy N hàng nên công việc phải làm N lần ứng với i=1, 2, , N, tức là:

For i:=1 to N do

Begin {tìm số lớn hàng i} Max:=A[i, 1];

For j:=1 to M do

if Max< A[i, j] then Max:=A[i, j]; Writeln(‘Sln hàng ‘, i, ‘là: ‘, Max); End;

+ Ví dụ 13_9: Kiểm tra ma trận vng A có đối xứng khơng?

(187)

thì A đối xứng, cịn B khơng đối xứng B[1,2] B[2,1] Chỉ cần có cặp i, j cho A[i,j]<>A[j,i] A ma trận khơng đối xứng

Vậy lệnh kiểm tra tính đối xứng ma trận A là: Kiemtra:= TRUE;

For i:=1 to N do For j:=1 to N do

if A[i, j]<>A[j, i] then Kiemtra:=FALSE; If Kiemtra=TRUE then

writeln(‘Ðối xứng‘) else

writeln(‘Khơng đối xứng‘); Kiemtra biến kiểu lơgic

(188)

Thuật tốn tốt đề nghị là: Kiemtra:= TRUE;

For i:=2 to N do For j:=1 to i-1 do

if A[i, j]<>A[j, i] then Kiemtra:=FALSE; If Kiemtra=TRUE then

writeln(‘Ðối xứng ‘) else

writeln(‘Không đối xứng ‘);

Hai câu lệnh For nhược điểm là: xảy A[i,j]<>A[j, i] rồi, lẽ dừng lại kết luận khơng đối xứng vòng For tiếp tục, i chạy đến N j đến i-1

Sử dụng câu lệnh While khắc phục nhược điểm Chỉ cần xảy A[i,j]<>A[j,i] lần biến Kiemtra gán giá trị FALSE, điều kiện Kiemtra=TRUE bị sai hai vòng lặp kết thúc

Kiemtra:=TRUE; i:=2;

(189)

j:=1;

While ( Kiemtra=TRUE) and ( j<=i-1) do if A[i, j] <> A[j, i] then

Kiemtra:=FALSE else

j:=j+1; i:=i+1; End;

If Kiemtra=TRUE then writeln(‘Ðối xứng‘) else

writeln(‘Không đối xứng‘);

Chương trình thực cơng việc sau:

- Nhập vào ma trận vuông A cấp N in ma trận A lên hình

- Ðếm ma trận A có số - Tìm số lớn A

(190)

i, j , N, Dem: Integer; Max, Min: Real; Kiemtra: Boolean; Begin

Clrscr; Repeat

Write(‘Nhập cấp N: ‘); Readln(N);

Until ( N>0) and ( N<11); For i:=1 to N do

For j:=1 to N do Begin

Write(‘Nhập A[‘, i, ‘,’, j , ‘]: ‘); Readln(A[i,j]);

End;

{In ma trận A lên hình} Writeln(‘Ma tran A la: ’); For i:=1 to N do

Begin

For j:=1 to N do

write(A[i, j]: 3:0); Writeln;

(191)

Dem:=0;

For i:=1 to N do

For j:=1 to N do if A[i, j]=0 then

Inc(Dem); Writeln(‘Có ‘, Dem, ‘số khơng’); {Tìm số lớn ma trận} Max:=A[1,1];

For i:=1 to N do For j:=1 to N do

if Max < A[i,j] then Max:=A[i,j];

Writeln(‘Số lớn ma trận= ‘, Max: 4:1); {Tìm số nhỏ hàng ma trận} For i:=1 to N do

Begin

(192)

Kiemtra:=True; For i:=1 to N do

For j:=1 to i-1 do

if A[i ,j]<>A[j ,i] then Kiemtra:=False; If Kiemtra=True then

Writeln(‘Ðối xứng’) else

Writeln(‘Không đối xứng’); Readln;

End.

14 KIỂU CHUỖI KÝ TỰ 14.1 Khai báo biến chuỗi

Một dãy ký tự đặt cặp nháy đơn gọi chuỗi, hay đơn giản chuỗi Dưới ba chuỗi:

‘Ngon ngu Pascal’ ‘Tin hoc 1998’ ‘12345678’

Chuỗi khơng có ký tự ‘‘(chỉ gồm hai dấu nháy đơn liên tiếp) gọi chuỗi rỗng

Số ký tự có chuỗi gọi độ dài chuỗi Chuỗi ‘ABCD’có độ dài 4, chuỗi ‘Pascal’có độ dài Chuỗi rỗng có độ dài không

(193)

Var

Tênbiếnchuỗi: String[N]; hoặc: Tênbiếnchuỗi: String;

trong N nguyên (0 ≤ N ≤ 255) ấn định số ký tự tối đa mà biến nhận gọi độ dài tối đa biến chuỗi Nếu khơng có thị [N] chuỗi có độ dài tối đa 255 ký tự

Ví dụ, cho khai báo: Var

St: String[17]; Diachi: String;

Khi St biến chuỗi có độ dài tối đa 17 ký tự, cịn biến Diachi có độ dài tối đa 255 ký tự

Cần phân biệt độ dài với độ dài tối đa biến chuỗi: độ dài tối đa xác định khai báo khả chứa biến chuỗi, cịn độ dài chuỗi số ký tự thực có chuỗi

Nếu gán:

St:= ‘Nguyen Thi Mai’;

(194)

Trong nhớ máy, biến chuỗi chiếm số byte độ dài tối đa cộng thêm Byte đầu tiên, gọi byte 0, chứa ký tự có mã độ dài thực chuỗi, byte lại chứa ký tự Cấu trúc biến St nói có dạng:

N g u y e n T h i M a i

Ðộ dài N (=14) biến St ký tự byte (ký hiệu St[0]) liên quan với sau:

N = Ord (St[0]) St[0]= Chr(N)

Turbo Pascal có sẵn hàm Length(chuỗi) cho độ dài thực chuỗi mà không cần phải dùng đến byte Ví dụ:

Length(St)=14

Chú ý Cũng khai báo chuỗi thông qua việc định nghĩa kiểu liệu từ khóa Type Chẳng hạn khai báo chuỗi St nói theo cách sau:

Type

KStr17 = String[17]; Var

St: KStr17;

Khi biến chuỗi dùng làm đối số hàm hay thủ tục cần phải khai báo theo cách (trừ biến chuỗi có kiểu String).

14.2 Truy nhập vào phần tử chuỗi

Giống mảng, phần tử chuỗi truy nhập thông qua tên chuỗi số phần tử

(195)

Ví dụ, cho: St:=‘ABC’;

thì N=3 St[1]=‘A’, St[2]=‘B’, St[3]=‘C’

Lệnh St[1]:=‘a’; biến đổi St thành St=‘aBC’

Như ký tự St[i] dùng biến kiểu ký tự, chuỗi xem mảng ký tự Chẳng hạn để in chuỗi ta in ký tự sau:

For i:=1 to Length(St) write(St[i]);

Ðiều cho thấy chuỗi kiểu liệu có tính cấu trúc

Nhưng mặt khác, chuỗi lại xem giá trị nhất, nhập in chuỗi trực tiếp lệnh:

Readln(St); Write(St);

Ðặc điểm cho thấy chuỗi cịn kiểu liệu có tính đơn giản

14.3 Các thao tác chuỗi + Phép cộng (nối) chuỗi:

(196)

Ví dụ:

‘Hong’> ‘Han’vì ‘o’> ‘a’ ‘thanh’> ‘thao’vì ‘n’> ‘o’

Nếu so sánh hết chiều dài chuỗi ngắn mà khơng có cặp khác chuỗi ngắn nhỏ

Ví dụ:

‘an’< ‘anh’ ‘chu’< ‘chung’

Hai chuỗi chúng độ dài ký tự vị trí tương ứng

14.4 Các hàm liên quan đến chuỗi

+ Hàm Length(St): cho độ dài chuỗi St. Ví dụ

Length(‘ABCD’)=4 chuỗi ‘ABCD’có ký tự Chuỗi rỗng có độ dài

+ Hàm Pos(S, St)

Cho vị trí tìm thấy chuỗi S chuỗi St, khơng tìm thấy hàm cho kết

Ví dụ

Pos(‘Ab’, ‘cdAb3Abm’) = 3, Pos(‘Ab’, ‘1bA3b’) =

+ Hàm Copy(St, k, m): cho m ký tự St tính từ vị trí k. Ví dụ

Copy (‘ABCDEF’, 4, 2) =‘DE’

(197)

Nếu m> số ký tự đứng sau kể từ vị trí k hàm Copy lấy ký tự từ vị trí k đến hết chiều dài St

Ví dụ

Copy (‘ABCD’, 3, 10) = ‘CD’ + Hàm Concat( St1, St2, , Stn):

Ghép nối chuỗi St1, St2, ., Stn theo thứ tự thành chuỗi Vậy:

Concat(St1, St2, , Stn) = St1+St2+ +Stn 14.5 Các thủ tục liên quan đến chuỗi

+ Thủ tục Delete(St, k, m)

Xóa m ký tự biến chuỗi St vị trí thứ k Ví dụ, sau thực lệnh:

St:=‘TurboPascal’; Delete(St, 1, 5);

thì giá trị St=‘Pascal’vì năm ký tự đầu bị xóa Nếu k > Length(St) khơng xóa

Nếu m > số ký tự đứng sau kể từ vị trí k xóa hết từ vị trí k đến cuối chuỗi

(198)

St:=‘ABCD’; Sau thực lệnh:

Insert(‘**’, St, 3);

thì St bị biến đổi thành St=‘AB**CD’

Nếu k> Length(St) S nối vào cuối St Ví dụ, sau thực hai lệnh:

St:=‘XYZ’;

Insert(‘ABC’, St, 6); St=XYZABC’ + Thủ tục Str(x, St)

Biến đổi số nguyên hay thực x thành kiểu chuỗi gán cho biến chuỗi St

Ví dụ, sau thực lệnh: Str(4752, St);

thì kết St= ‘4752’

Số x định dạng in hình Lệnh Str(4752: 6, St);

cho kết St=‘4752’(trước số 4752 có ký tự trắng) Nếu x biến thực giá trị x=34.95 lệnh:

Str(x:7:3, St); cho kết St=‘34.950’(trước số 34.950 có 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 gán cho biến nguyên hay thực x Số nguyên k dùng để phát lỗi: đổi k=0, ngược lại, giá trị k vị trí có lỗi chuỗi St

(199)

St:=‘385’; Val(St, n, j); Val(‘12.59’, x, k); n=385, j=0, x=12.59 k=0

Nếu gán St:= ‘3a7’; thực lệnh: Val(St, n, k);

thì giá trị n khơng xác định cịn k=2 vị trí chữ a chuỗi St, khơng đổi số

14.6 Các ví dụ chuỗi

+ Ví dụ 14_1: Ðổi chuỗi chữ hoa hay chữ thường. Ðể đổi chuỗi St thành chữ hoa, ta đổi ký tự chuỗi chữ hoa, tức là:

For i:=1 to Length(St) St[i]:=Upcase(St[i]);

Tương tự, để đổi chuỗi St thành chữ thường, ta đổi ký tự chuỗi St chữ thường:

For i:=1 to Length(St)

(200)

Muốn xóa hết ký tự trắng đầu chuỗi ta dùng lệnh: While St[1]=#32 Delete(St,1,1);

Diễn giải: chừng ký tự St cịn ký tự trắng xóa ký tự khác trắng

Sở dĩ phải dùng vòng lặp While số ký tự trắng đầu chuỗi khơng biết trước

b) Xóa ký tự trắng cuối chuỗi

Tương tự, muốn xóa tất ký tự trắng cuối chuỗi St, ta dùng lệnh:

While St[ length(St) ]= #32 Delete(St, length(St), 1); Diễn giải: chừng ký tự cuối St cịn khoảng trắng xóa ký tự cuối khác trắng

c) Xóa ký tự trắng thừa hai từ chuỗi

Muốn xóa ký tự trắng thừa để hai từ ký tự trắng ta làm sau: tìm St chỗ có hai ký tự trắng xóa một, lặp lại thao tác St khơng cịn chỗ có hai ký tự trắng liên tiếp Tức là:

k:=Pos(‘‘, St); {‘‘là ký tự trắng} While k >

begin

Delete(St, k, 1); k:=Pos(‘‘, St); end;

+ Ví dụ 14_3: Đếm chuỗi St có chữ pascal. Vì chữ pascal có ký tự, nên ta so sánh cụm ký tự St với chuỗi pascal, vị trí 1:

Ngày đăng: 18/04/2021, 10:31

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan