Giáo trình Tin học đại cương (Bản mới)
Chuyển từ hệ bất kỳ sang hệ thập phân
Giả sử ta có biểu diễn số B theo cơ số H là
B= bn bn-1 bn-2 .b1 b0 .c1 c2 cn.cm
Vì ta đã quen tính toán với hệ cơ số 10 nên ta có thể chuyển đổi trực tiếp theo công thức sau:
B= bnxHn + bn-1xHn-1 + bn-2xHn-2 +.b1xH + b0+ c1xH-1 + c2xH-2 +.+ cmxH-m
(Ta hoàn toàn có thể áp dụng quy tắc đã nêu: chia lấy phần dư, nhân lấy phần nguyên. để tìm biểu diễn của B trong hệ thập phân)
Chuyển từ hệ nhị phân sang bát phân (hoặc thập lục phân)
Qui tắc: Nhóm các Bit thành từng nhóm 3 Bit (4 Bit - cho hệ thập lục phân) bắt đầu từ Bit ngoài cùng bên phải, tính giá trị số học học quy luật giá trị vị trí riêng cho từng nhóm 3 (hay 4) Bit, viết các giá trị này liền nhau.
Ví dụ cho số nhị phân 11110101 chuyển số này sang dạng bát phân và thập lục phân. (11 110 101) -> 365 trong hệ bát phân là số 365
(1111 0101) -> 15 5 -> F5 trong hệ thập lục phân là số F5
Khi cần chuyển ngược lại chúng ta làm theo các bước tương tự
Chuyển đổi hệ thống số dựa trên hệ 8 và hệ 16
Trong phần bài giảng, chúng ta đã làm quen với cách chuyển đổi giữa hệ 2 và hệ 10. Tuy nhiên, ở những trị số lớn và dài thì làm cách trên trở nên rất phức tạp và dễ nhầm lẫn, ví dụ :
101110110101(2) =?(10)
2997(10) = ?(12)
Trong ví dụ thứ nhất ta phải liên tiếp làm nhiều phép nhân và ở ví dụ thứ hai, ta lại thực hiện nhiều phép chia liên tiếp.
Thông qua hệ 8 và hệ 16 để chuyển đổi hệ 2 sang hệ 10
Chia số nhị phân làm thành từng bộ 3 số và 4 số liên tiếp theo thứ tự tương ứng với cách thông qua hệ 8 và hệ 16 và dùng phương pháp nhân với các thừa số bên trên tương ứng rồi cộng lại.
Tóm tắt nội dung tài liệu: Giáo trình Tin học đại cương (Bản mới)
GIÁO TRÌNH TIN HỌC ĐẠI CƯONG MỤC LỤC ĐINH VĂN ĐỆ Chương 1 : ĐIỆN TOÁN CĂN BẢN Lịch sử máy tính Do nhu cầu cần tăng độ chính xác và giảm thời gian tính toán, con người đã quan tâm chế tạo các công cụ tính toán từ xưa: bàn tính tay của người Trung quốc, máy cộng cơ học của nhà toán học Pháp Blaise Pascal (1623 - 1662), máy tính cơ học có thể cộng trừ nhân chia của nhà toán học Đức Gottfried Wilhelmvon Leibniz (1646 - 1716), máy sai phân để tính các đa thức toán học, máy phân giải điều khiển bằng phiếu đục lỗ của Charles Babbage (1792 - 1871) ... Tuy nhiên, máy tính điện tử thực sự hình thành bắt đầu vào thập niên 1950 và đến nay đã trải qua 5 thế hệ được phân loại theo sự tiến bộ về công nghệ điện tử và vi điện tử cũng như các cải tiến về nguyên lý, tính năng và loại hình của nó. Thế hệ 1 (1950 - 1958): Máy tính sử dụng các bóng đèn điện tử chân không, mạch riêng rẽ, vào số liệu bằng phiếu đục lỗ, điều khiển bằng tay. Máy có kích thước rất lớn, tiêu thụ năng lượng nhiều, tốc độ tính chậm khoảng 300 - 3.000 phép tính mỗi giây. Loại máy tính điển hình thế hệ 1 như EDVAC (Mỹ) hay BESM (Liên xô cũ), ... Thế hệ 2 (1958 - 1964): Máy tính dùng bộ xử lý bằng đèn bán dẫn, mạch in. Máy đã có chương trình dịch như Cobol, Fortran và hệ điều hành đơn giản. Kích thước máy còn lớn, tốc độ tính khoảng 10.000 đến 100.000 phép/s. Điển hình như loại IBM-1070 (Mỹ) hay MINSK(LiênXô cũ), ... Thế hệ 3 (1965 - 1974): Máy tính được gắn các bộ xử lý bằng vi mạch điện tử cỡ nhỏ có thể có được tốc độ tính khoảng 100.000 đến 1 triệu phép/s. Máy đã có các hệ điều hành đa chương trình, nhiều người dùng đồng thời hoặc theo kiểu chia thời gian. Kết quả từ máy tính có thể in ra trực tiếp ở máy in. Điển hình như loại IBM 360 (Mỹ) hay EC (Liên Xô cũ), ... Thế hệ 4 (1974 - 1990): Máy tính bắt đầu có các vi mạch đa xử lý có tốc độ tính hàng chục triệu đến hàng tỷ phép/giây. Giai đoạn này hình thành 2 loại máy tính chính : máy tính cá nhân để bàn (Personal Computer - PC) hoặc xách tay (Laptop hoặc Notebook computer) và các loại máy tính chuyên nghiệp thực hiện đa chương trình, đa vi xử lý ... hình thành các hệ thống mạng máy tính (Computer Networks), và các ứng dụng phong phú đa phương tiện. Thế hệ 5 (1990 - nay): Bắt đầu có các nghiên cứu tạo ra các máy tính mô phỏng các hoạt động của não bộ và hành vi con người, có trí khôn nhân tạo với khả năng tự suy diễn phát triển các tình huống nhận được và những hệ quản lý kiến thức cơ sở để giải quyết các bài toán đa dạng. Khái niệm tin học và máy tính Tin học là gì ? Tin học là một ngành khoa học công nghệ nghiên cứu các phương pháp xử lý thông tin một cách tự động dựa trên các phương tiện kỹ thuật mà chủ yếu hiện tại là máy tính điện tử. Máy tính điện tử (Computer) Là một thiết bị điện tử dùng để lưu trữ và xử lý thông tin theo các chương trình định trước do con người định ra Các hệ đếm Hệ đếm là tập hợp các ký hiệu và qui tắc sử dụng tập ký hiệu đó để biểu diễn và xác định các giá trị các số. Mỗi hệ đếm có một số ký số (digits) hữu hạn và tổng số ký số của mỗi hệ đếm được gọi là cơ số (base hay radix), ký hiệu là b. Các hệ đếm phổ biến hiện nay hay dùng là hệ đếm La mã, hệ đếm thập phân, hệ đếm nhị phân, hệ đếm bát phân, hệ đếm thập lục phân. Nhưng trong lĩnh vực kỹ thuật hiện nay phổ biến 4 hệ đếm như sau : Hệ đếm Cơ số Ký số và trị tuyệt đối Hệ nhị phân Hệ bát phân Hệ thập phân Hệ thập lục phân 2 8 10 16 0,1 0,1,2,3,4,5,6,7 0,1,2,3,4,5,6,7,8,9 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F Hệ đếm thập phân (decimal system) Hệ đếm thập phân hay hệ đếm cơ số 10 là một trong những phát minh của người Ả rập cổ, bao gồm 10 ký số theo ký hiệu sau: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Qui tắc tính giá trị của hệ đếm này là mỗi đơn vị ở một hàng bất kỳ có giá trị bằng 10 đơn vị của hàng kế cận bên phải. (Ở đây b = 10). Bất kỳ số nguyên dương trong hệ thập phân được thể hiện như là một tổng các chuỗi các ký số thập phân nhân với 10 lũy thừa, trong đó số mũ lũy thừa được tăng thêm 1 đơn vị kể từ số mũ lũy thừa phía bên phải nó. Số mũ lũy thừa của hàng đơn vị trong hệ thập phân là 0. Ví dụ: Số 5246 có thể được thể hiện như sau: 5246 = 5 x 103 + 2 x 102 + 4 x 101 + 6 x 100 = 5 x 1000 + 2 x 100 + 4 x 10 + 6 x 1 Thể hiện như trên gọi là ký hiệu mở rộng của số nguyên. Vì 5246 = 5000 + 200 + 40 + 6 Như vậy, trong số 5246: ký số 6 trong số nguyên đại diện cho giá trị 6 đơn vị (1s), ký số 4 đại diện cho giá trị 4 chục (10s), ký số 2 đại diện cho giá trị 2 trăm (100s) và ký số 5 đại diện cho giá trị 5 ngàn (1000s). Nghĩa là, số lũy thừa của 10 tăng dần 1 đơn vị từ trái sang phải tương ứng với vị trí ký hiệu số, 100 = 1 101 = 10 102 = 100 103 = 1000 104 = 10000 ... Mỗi ký số ở thứ tự khác nhau trong số sẽ có giá trị khác nhau, ta gọi là giá trị vị trí (place value). Phần phân số trong hệ thập phân sau dấu chấm phân cách (theo qui ước của Mỹ) thể hiện trong ký hiệu mở rộng bởi 10 lũy thừa âm tính từ phải sang trái kể từ dấu chấm phân cách Ví dụ: 254.68 = 2x102 + 5x101 + 4x100 + 6x10-1 + 8x10-2 Tổng quát, hệ đếm cơ số b (b≥2, b là số nguyên dương) mang tính chất sau: · Có b ký số để thể hiện giá trị số. Ký số nhỏ nhất là 0 và lớn nhất là b-1. · Giá trị vị trí thứ n trong một số của hệ đếm bằng cơ số b lũy thừa n : bn Số N(b) trong hệ đếm cơ số (b) thể hiện : N(b) = anan-1an-2a1a0a-1a-2a-m trong đó, số N(b) có n+1 ký số chẵn ở phần nguyên và m ký số lẻ, sẽ có giá trị là: N(b) = an.bn + an-1.bn-1 + an-2.bn-2 + +a1b1 + a0.b0 + a-1.b-1 + a-2.b-2 ++ a-m.b-m Hệ đếm nhị phân Với b = 2, chúng ta có hệ đếm nhị phân. Đây là hệ đếm đơn giản nhất với 2 chữ số là 0 và 1. Mỗi chữ số nhị phân gọi là BIT (viết tắt từ chữ BInary digiT). Hệ nhị phân tương ứng với 2 trạng thái của các linh kiện điện tử trong máy tính - cụ thể: đóng (có điện) ký hiệu là 1 và tắt (không điện) ký hiệu là 0. Vì hệ nhị phân chỉ có 2 trị số là 0 và 1, nên khi muốn diễn tả một số lớn hơn, hoặc các ký tự phức tạp hơn thì cần kết hợp nhiều bit với nhau. Ta có thể chuyển đổi hệ nhị phân theo hệ thập phân quen thuộc. Ví dụ 3.6: Số 11101.11(2) sẽ tương đương với giá trị thập phân là : Số nhị phân: 1 1 1 0 1 1 1 Số vị trí: 4 3 2 1 0 -1 -2 Trị vị trí: 24 23 22 21 20 2-1 2-2 Hệ 10 là: 16 8 4 2 1 0.5 0.25 như vậy: 11101.11(2) = 1x16 + 1x8 + 1x4 + 0x2 + 1x1 + 1x0.5 + 1x0.25 = 29.75 (10) tương tự số 10101 (hệ 2) sang hệ thập phân sẽ là: 10101(2) = 1x24 + 0x23 + 1x22 + 0x21 + 1x20 = 16 + 0 + 4 + 0 + 1 = 21(10) Hệ đếm bát phân (octal number system) Nếu dùng 1 tập hợp 3 bit thì có thể biểu diễn 8 trị số khác nhau: 000, 001, 010, 011, 100, 101, 110, 111. Các trị số này tương đương với 8 trị số trong hệ thập phân là 0, 1, 2, 3, 4, 5, 6, 7. Tập hợp các chữ số này gọi là hệ bát phân, là hệ đếm với b = 8 = 23. Trong hệ bát phân, trị số vị trí là lũy thừa của 8. Ví dụ: 235 . 64(B) = 2x82 + 3x81 + 5x80 + 6x8-1 + 4x8-2 = 157.8125(10) Hệ đếm thập lục phân (hexa-decimal number system) Hệ đếm thập lục phân là hệ cơ số b = 16 = 24 tương đương với tập hợp 4 chữ số nhị phân (4 bit). Khi thể hiện ở dạng hexa-decimal, ta có 16 ký tự gồm 10 chữ số từ 0 đến 9, và 6 chữ in A, B, C, D, E, F để biểu diễn các giá trị số tương ứng là 10, 11, 12, 13, 14, 15. Với hệ thập lục phân, trị vị trí là lũy thừa của 16. Ví dụ: 34F5C(16) = 3X164 + 4x163 + 15x162 + 5x161 + 12x160 = 216294(10) Ghi chú: Một số chương trình qui định viết số hexa phải có chữ H ở cuối chữ số. Ví dụ: Số 15 viết là FH. Bảng qui đổi tương đương 16 chữ số đầu tiên của 4 hệ đếm Hệ 10 Hệ 2 Hệ 8 Hệ 16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 00 01 02 03 04 05 06 07 10 11 12 13 14 15 16 17 0 1 2 3 4 5 6 7 8 9 A B C D E F Chuyển đổi số giữa các hệ đếm Chuyển một số từ hệ cơ số L=10 sang hệ cơ số H: Ta lưu ý rằng các hệ cơ số ta xét đều lấy 1 làm đơn vị, vì vậy một số bất kỳ dù biểu diễn ở hệ cơ số nào thì phần thập phân và phần nguyên đều không đổi. Nghĩa là dù biến đổi sang hệ cơ số nào đi nữa thì phần thập phân cũng chỉ chuyển sang phần thập phân,phần nguyên sang phần nguyên. Giả sử ta có một số có phần thập phân b=k+d trong hệ cơ số L trong đó k là phần nguyên trước dấu phẩy và d là phần thập phân sau dấu phẩy. Ta sẽ chuyển đổi riêng từng phần theo quy tắc sau: - Với phần nguyên: Lấy k chia liên tiếp cho H cho đến khi thương số bằng 0, phép chia thứ i có số dư bi là chữ số trong hệ cơ số H, i = 0,1,2,...,n , khi đó bn bn-1 bn-2... b0 là phần nguyên của số b trong hệ cơ số H. - Với phần thập phân: Lấy phần thập phân của d nhân liên tiếp với H cho đến khi kết quả phép nhân không còn phần thập phân hoặc đạt được độ chính xác ta cần, mỗi lần nhân ta lấy phần nguyên của kết quả là cj là chữ số trong hệ cơ số H, j = 1,2,...,m.Khi đó số.c1c2...cm chính là phần thập phân của số nhị phân cần tìm. (Chúng ta lưu ý là sau mỗi lần nhân ta chỉ lấy phần thập phân để nhân tiếp với H, phần nguyên ở đây được hiểu là phần bên trái dấu chấm thập phân). Ví dụ: Cho số thập phân 14.125 tìm số nhị phân tương ứng. Ta có k = 14, d = 0.125 Chuyển đổi phần nguyên 14 Chia 2 Dư 14 0 7 1 3 1 1 1 0 Chuyển đổi phần thập phân 0.125 Nhân 2 Phần nguyên 0.125 0.25 0 0.5 0 1 1 Vậy 14.125=1110.001 Chuyển đổi 0.2 sang hệ nhị phân: Nhân 2 Phần nguyên 0.2 0.4 0 0.8 0 1 1 Ta thấy rằng số 0.2 trong hệ cơ số 2 là một số thập phân vô hạn tuần hoàn 0.210=0.(0011)2 Chuyển từ hệ bất kỳ sang hệ thập phân Giả sử ta có biểu diễn số B theo cơ số H là B= bn bn-1 bn-2 ...b1 b0 .c1 c2 cn...cm Vì ta đã quen tính toán với hệ cơ số 10 nên ta có thể chuyển đổi trực tiếp theo công thức sau: B= bnxHn + bn-1xHn-1 + bn-2xHn-2 +...b1xH + b0+ c1xH-1 + c2xH-2 +...+ cmxH-m (Ta hoàn toàn có thể áp dụng quy tắc đã nêu: chia lấy phần dư, nhân lấy phần nguyên... để tìm biểu diễn của B trong hệ thập phân) Chuyển từ hệ nhị phân sang bát phân (hoặc thập lục phân) Qui tắc: Nhóm các Bit thành từng nhóm 3 Bit (4 Bit - cho hệ thập lục phân) bắt đầu từ Bit ngoài cùng bên phải, tính giá trị số học học quy luật giá trị vị trí riêng cho từng nhóm 3 (hay 4) Bit, viết các giá trị này liền nhau. Ví dụ cho số nhị phân 11110101 chuyển số này sang dạng bát phân và thập lục phân. (11 110 101) -> 365 trong hệ bát phân là số 365 (1111 0101) -> 15 5 -> F5 trong hệ thập lục phân là số F5 Khi cần chuyển ngược lại chúng ta làm theo các bước tương tự Chuyển đổi hệ thống số dựa trên hệ 8 và hệ 16 Trong phần bài giảng, chúng ta đã làm quen với cách chuyển đổi giữa hệ 2 và hệ 10. Tuy nhiên, ở những trị số lớn và dài thì làm cách trên trở nên rất phức tạp và dễ nhầm lẫn, ví dụ : 101110110101(2) =?(10) 2997(10) = ?(12) Trong ví dụ thứ nhất ta phải liên tiếp làm nhiều phép nhân và ở ví dụ thứ hai, ta lại thực hiện nhiều phép chia liên tiếp. Thông qua hệ 8 và hệ 16 để chuyển đổi hệ 2 sang hệ 10 Chia số nhị phân làm thành từng bộ 3 số và 4 số liên tiếp theo thứ tự tương ứng với cách thông qua hệ 8 và hệ 16 và dùng phương pháp nhân với các thừa số bên trên tương ứng rồi cộng lại. Ví dụ: 101110110101(2) = ? (10) THÔNG QUA HỆ 8: Chia số nhị phân từng bộ 3 số: 83 82 81 80 22 21 20 22 21 20 22 21 20 22 21 20 1 0 1 1 1 0 1 1 0 1 0 1 5 6 6 5 Chú ý: 5 = 1x22 + 0x21 + 1x20 và 6 = 1x22 + 1x21 + 0x20 Kết quả: 101110110101(2) = 5x83 + 6x82 + 6x81 + 5x80 = 5x512 + 6x64 + 6x8 + 5x1 = 2997(10) THÔNG QUA HỆ 16: Chia số nhị phân thành bộ 4 số 162 161 160 23 22 21 20 23 22 21 20 23 22 21 20 1 0 1 1 1 0 1 1 0 1 0 1 11 11 5 Chú ý: 11 = 1x23 + 0x22 + 1x21 + 1x20 và 5 = 0x23 + 1x22 + 0x21 + 1x20 Kết quả: 101110110101 (2) = 11x162 + 11x161 + 5x160 = 11x256 + 11x16 +5x1 = 2997(10) Thông qua hệ 8 và hệ 16 để chuyển hệ 10 sang hệ 2 Cách làm tương tự như trên, nhưng thay phép nhân thành phép chia và lấy các số dư của phép chia ngược từ dưới lên trên để chuyển đổi. Ví dụ: 2997 (10) = ? (2) THÔNG QUA HỆ 8: Chia 8 dư 5 6 6 5 5 Ta có: 5 (hệ 8) = 4 + 1 = 1x22 + 0x21 + 1x20 = 101(2) Tương tự: 6 (hệ 8) = 4+2 = 1x22 + 1x21 + 0x20 = 110(2) Suy ra: 2997(10) = 101 110 110 101(2) THÔNG QUA HỆ 16: Chia 16 dư 5 11 11 11 Ta có : 2997 (10) = BB5(16) B (hệ 16) = 11 = 8 + 2 +1 = 1x23 + 0x22 + 1x21 + 1x20 = 1011 (hệ 2) 5 (hệ 16) = 4 + 1 = 0x23 + 1x22 + 0x21 + 1x20 = 0101 (hệ 2) Suy ra: 2997(10) = BB6(16) = 1011 1011 0101(2) Chuyển hệ 8 sang hệ 16 và ngược lại: Ta có thể dùng hệ 10 hoặc hệ 2 làm trung gian để chuyển đổi hệ 8 sang hệ 16 và ngược lại. Thông thường dùng hệ 2 để trung chuyển có thuận lợi hơn. Ví dụ: 5665(8) = ?(16) Cách làm như sau: Bước 1: Chuyển hệ 8 thành hệ 2: biểu thị từng trị số trong hệ 8 thành từng nhóm 3 số và ghép các nhóm đó lại. 5 (hệ 8) = 4 + 1 + 0 = 1x22 + 0x21 + 1x20 = 101(hệ 2) 6 (hệ 8) = 4 + 2 + 2 = 1x22 + 1x21 + 0x20 = 110 (hệ 2) Vậy 5665(8) = 101 110 110 101(2) Bước 2: Chia dãy số hệ 2 vừa có được thành các bộ 4 số và chuyển các bộ đó sang hệ 16 5665 (8) = 101 110 110 101(2) = 1011 1011 0101(2) Vì: 1011(2) = 1x23 + 0x22 + 1x21 + 1x20 = 8 + 0 + 2 + 1 = 11 = B(16) 0101(2) = 0x23 + 1x22 + 0x21 + 1x20 = 0 + 4 + 0 + 1 = 5(16) Vậy: 5665 (8) = BB5(16) Việc chuyển từ hệ 16 sang hệ 8 ta cũng tiến hành 2 bước như vậy. Các bộ phận cơ bản của máy vi tính Bộ xử lý trung tâm(CPU : Central Processor Unit) Chức năng của CPU CPU là bộ chỉ huy của máy vi tính, có các chức năng sau: - Thực hiện việc nhận lệnh, giải mã lệnh và điều khiển các khối khác thực hiện lệnh. - Thực hiện các phép tính số học, logic và các phép tính khác. - Sinh ra các tín hiệu địa chỉ trên máy. b) Cấu tạo của CPU CPU bao gồm các phần sau: Đơn vị điều khiển (Control unit): Thực hiện việc nhận lệnh, giải mã lệnh và điều khiển các khối khác thực hiện lệnh và sinh ra các tín hiệu địa chỉ trên máy để quản lý bộ nhớ. Đơn vị tính toán số học và logic (Arithmeric - Logic Unit): Bao gồm các vi mạch tính để thực hiện các phép tính số học, logic và các phép tính khác. Thanh ghi (Register) là một cấu trúc gồm 16 bít (hoặc 32 bit) nhớ liền kề nhau được thiết lập ngay trong mạch vi xử lý. Các thanh ghi này được phân thành 4 nhóm theo mục đích sử dụng sau: - Nhóm 1: 4 thanh ghi đa năng kí hiệu là AX,BX,CX,DX được sử dụng cho nhiều mục đích khác nhau. - Nhóm 2: 4 thanh ghi địa chỉ đoạn (Segment) bộ nhớ, thanh ghi CS (Code segment) chứa điạc chỉ đoạn mã lệnh, thanh ghi DS (Data Segment) chứa địa chỉ đoạn dữ liệu, thanh ghi SS (Stack Segment) chứa địa chỉ đoạn ngăn xếp, thanh ghi ES (Extra Segment) chứa địa chỉ đoạn dữ liệu mở rộng. - Nhóm 3: 5 thanh ghi địa chỉ tương đối (offset), thanh ghi IP (Instruction Pointer) trỏ tới ô chứa lệnh trong đoạn CS; thanh ghi SI (Source Index) trỏ tới ô chứa dữ liệu nguồn trong đoạn DS, Thanh ghi DI (Destination Index) trỏ tới ô chứa dữ liệu đích trong đoạn DS, Thanh ghi SP (Stack Pointer) trỏ tới ô chứa dữ liệu trong đoạn ngăn xếp SS và thanh ghi BP (Base Pointer) trỏ tới ô dữ liệu trong đoạn chứa dữ liệu mở rộng ES. - Nhóm 4: 1 thanh ghi cờ (Flag) để ghi các trạng thái (ta gọi là cờ) xảy ra trong các phép toán số học. Bộ nhớ (Memory) Bộ nhớ hay còn gọi là bộ nhớ trong ( bộ nhớ ) chính của máy vi tính. Chức năng của bộ nhớ: Bộ nhớ dùng để chứa các thông tin cần thiết như chương trình, dữ liệu trong quá trình ... u từ khoá DO là in ra giá trị của I. Chi tiết các bước thực hiện của vòng lặp FOR này như sau: Đầu tiên biến I nhận giá trị khởi đầu là 1 (do lệnh gán I:=1), máy kiểm tra giá trị này không vượt quá giá trị cuối là 10 nên cho thực hiện lệnh writeln(I) viết ra giá trị 1. Sau đó biến I được tăng thêm một đơn vị, tức là I:=I+1. Bây giờ I=2, chưa vượt qua giá trị cuối là 10 nên lệnh writeln(I) lại được thực hiện để in ra giá trị của I là 2 lên màn hình. Rồi I lại được tăng lên... giá trị cuối cùng của I để lệnh writeln(I) được thực hiện là I:=10. Quá trình kết thúc khi I nhận giá trị 11 vượt quá giá trị cuối 10. Câu lệnh trên là một ví dụ đơn giản của lệnh tổng quát sau: Dạng lệnh lặp tăng FOR Biến_điều_khiển:=Biểu_thức1 TO Biểu_thức2 DO ; Trong đó Biến_điều_khiển, Biểu_thức1 và Biểu_thức2 phải cùng kiểu dữ liệu và phải là các kiểu vô hướng đếm được (như các kiểu số nguyên, kiểu kí tự...) ý nghĩa của câu lệnh này như sau: Trước tiên Biến_điều_khiển nhận giá trị khởi tạo là Biểu_thức1, máy kiểm tra nếu giá trị đó không vượt quá Biểu_thức2 thì cho thực hiện . Thực hiện xong lệnh này, Biến_điều_khiển được tăng thêm một đơn vị, máy lại kiểm tra với Biểu_thức2 để thực hiện ... Qúa trình tiếp diễn đến khi Biến_điều_khiển nhận giá trị vượt quá Biểu_thức2 thì dừng. Số lần thực hiện lặp đi lặp lại được xác định trước bởi giá trị của Biểu_thức1 và Biểu_thức2 nên câu lệnh trên còn được gọi là lệnh lặp có số lần lặp xác định. Ví dụ áp dụng VD1: Viết chương trình tính tổng của n số tự nhiên đầu tiên S=1+2+...+n theo phương pháp cộng dồn. Phương pháp cộng dồn được thực hiện như sau: ban đầu ta khởi tạo S:=0, rồi lấy S cộng với 1, rồi cộng với 2,... cộng đến n. Như vậy ta sẽ phải sử dụng một vòng lặp FOR với một biến điều khiển I chạy từ Biểu_thức1 là 1 đến Biểu_thức2 là n. Ta sẽ dùng chính giá trị của biến điều khiển này để tính tổng S. Chương trình được viết như sau: Program Tinh_tong; Uses crt; Var i,n:integer; S:real; Begin Write('Cho biet gia tri cua n:'); Readln(n); S:=0; For I:=1 to n do S:=S+i; Writeln(' Tong tinh duoc la S:',S:10:2); Readln; End. VD2: Một người gửi tiền tiết kiệm với số tiền ban đầu là A đồng, thời gian gửi t tháng,lãi suất tháng là p. Hỏi sau t tháng gửi người đó thu được số tiền lãi là bao nhiêu đồng? Phân tích bài toán: Ta biết rằng gửi tiết kiệm thì số tiền thu được sau mỗi tháng sẽ bằng số tiền tháng trước cộng với lãi của tháng đó. Nếu gọi S là số tiền thu được sau mỗi tháng, t là số tháng gửi thì ta có: Ban đầu S0=A t=1 --> S1=S0 +S0*p (gửi 1 tháng) t=2 --> S2= S1 +S1*p (gửi 2 tháng) t=n --> Sn= Sn-1 +Sn-1*p (gửi n tháng) Đây chính là quy luật để thực hiện vòng lặp tính số tiền thu được. Chương trình được viết như sau: Program Tinh_tien_lai; Uses crt; Var i,t:integer; A,P,S:real; Begin Write('Cho biet so tien gui ban dau: '); Readln(A); Write('Cho biet so thang gui: '); Readln(t); Write('Cho biet lai suat theo thang: '); Readln(P); S:=A; For I:=1 to t do S:=S+ S*P; Writeln(' Lai thu duoc la : ',S-A:10:2); Readln; End. Dạng lệnh lặp giảm FOR Biến_điều_khiển:=Biểu_thức1 DOWNTO Biểu_thức2 DO ; ý nghĩa hoàn toàn tương tự như dạng trên, chỉ khác là Biến_điều_khiển nhận giá trị giảm dần chứ không phải tăng dần, và điều kiện kiểm tra là Biến_điều_khiển không nhỏ quá Biểu_thức2. Với dạng này thì câu lệnh FOR trong ví dụ 1 ở trên được viết là: For I:=n downto 1 do S:=S+i; Tổng S sẽ được cộng dồn theo thứ tự từ n đến 1, tức là S=n+(n-1)+...+2+1. Ví dụ: Viết chương trình in ra các kí tự trong bảng mã ASCII theo thứ tự giảm dần. Các kí tự trong bảng mã ASCII có mã giảm dần từ 255 đến 0. Ta dùng hàm CHR(n) để nhận được kí tự. Chương trình được viết như sau: Program In_cac_ki_tu; Uses crt; Var I:integer; Begin Clrscr; For i:=255 downto 0 do write(chr(i):4); Readln; End. Các lưu ý 1) Sau từ khoá DO chỉ được viết một lệnh, do đó nếu cần thực hiện nhiều hơn một lệnh đơn thì phải sử dụng câu lệnh phức hợp 2) Các lệnh lặp có thể lồng nhau, chẳng hạn dạng: FOR I:=1 TO n DO FOR J:=1 TO m DO Khi đó với mỗi giá trị của biến điều khiển của vòng lặp ngoài thì biến điều khiển của vòng lặp trong sẽ chạy hết các giá trị của nó. Tức là với mỗi giá trị của I thì J sẽ chạy từ 1 tới m. Xét ví dụ đoạn chương trình sau: For i:=1 to 2 do For j:=1 to 3 do begin k:=i+j; writeln(k); end; sẽ cho kết quả là: 2 3 4 3 4 5 3) sau từ khoá DO không được tuỳ tiện thay đổi giá trị của Biến_điều_khiển, làm như vậy ta có thể không kiểm soát được giá trị của Biến_điều_khiển và có thể làm rối vòng lặp. Ví dụ: In ra tất cả các chữ số có 3 chữ số mà tổng các chữ số chia hết cho 3. Trong bài toán này mỗi số đều có 3 chữ số, chữ số hàng trăn có thể nhận giá trị từ 1 đến 9, chữ số hàng chục, chữ số hàng đơn vị đều có thể nhận giá trị từ 0 đến 9. để quét hết các chữ số có 3 chữ số ta dùng 3 vòng lặp lồng nhau, sau đó ta kiểm tra đièu kiện nếu tổng các chữ số chia hết cho 3 thì in ra số đó. Chương trình được viết như sau: Program In_cac_so; Uses crt; Var t,c,v:integer; Begin Clrscr; For t:=1 to 9 do For c:=0 to 9 do For v:=0 to 9 do If (t+c+v) mod 3 = 0 then writeln(t,c,v); Readln; End. Lệnh lặp có số bước lặp không xác định Ở trên ta đã xét lệnh lặp có số bước lặp xác định, tức là số lần thực hiện công việc lặp đi lặp lại là được định trước. Nhưng trong khi lập trình có những bài toán yêu cầu thực hiện một công việc nào đó mà số lần lặp là không thể xác định trước được, mà phụ thuộc vào một biểu thức điều kiện nào đó. Có hai dạng lệnh lặp với số bước lặp không xác định. Lệnh lặp với điều kiện trước Dạng lệnh: WHILE DO ; Ý nghĩa: Khi gặp câu lệnh này, trước tiên máy sẽ kiểm tra . Nếu có giá trị đúng (TRUE) thì được thực hiện. Thực hiện xong lệnh này máy sẽ quay lại kiểm tra để thực hiện ... quá trình tiếp diễn đến khi sai thì dừng. Ví dụ: VD1: Một người gửi tiết kiệm không kì hạn với số tiền ban đầu là A đồng Hỏi sau bao nhiêu tháng người đó thu được số tiền là B đồng, biết rằng lãi suất là 1.8%? Phân tích bài toán: Ta biết rằng gửi tiết kiệm không kì hạn thì số tiền thu được sau mỗi tháng sẽ bằng số tiền tháng trước cộng với lãi của tháng đó. Nếu gọi S là số tiền thu được sau mỗi tháng, t là số tháng gửi, ls là lãi suất thì ta có: nếu t=0 --> S0=A (gửi 0 tháng) nếu t=1 --> S1=S0 +S0*ls (gửi 1 tháng) nếu t=2 --> S2= S1 +S1*ls (gửi 2 tháng) . Đây chính là quy luật để thực hiện vòng lặp tính số tiền thu được. Như vậy ta phải so sánh số tiền thu được S sau mỗi tháng với số tiền cần đạt B: nếu S đạt hoặc vượt B thì ta có kết luận của bài toán. đây cũng là điều kiện dừng vòng lặp. Ta sẽ sử dụng một biến đếm t để đếm số lần thực hiện lặp, cũng chính là số tháng gửi. Chương trình được viết như sau: Program Gui_tiet_kiem; Const ls=0.018; Var A,B,S:real; t:integer; Begin Clrscr; Write('Cho biet so tien gui ban dau:'); Readln(A); Write('Cho biet so tien can dat :'); Readln(B); S:=A; t:=0; WHILE S<B DO begin S:=S+S*ls; t:=t+1; end; Writeln(' Ban can gui it nhat la ', t, ' thang'); Readln; End. VD2: Ta có thể viết lại chương trình tính tổng S=1+2+...+n sử dụng lệnh lặp WHILE...DO...như sau: Program Tinh_tong1; Var i,n:integer; S:real; Begin Write('Cho biet gia tri cua n:'); Readln(n); S:=0; i:=1; While i<= n do begin S:=S+i; i:=i+1; end; Writeln(' Tong tinh duoc la S:',S:10:2); End. Như vậy ta có thể dùng lệnh lặp có số bước lặp không xác định để thay cho lệnh lặp có số bước lặp xác định. Tuy nhiên khi đó biến điều khiển vòng lặp không tự động thay đổi mà ta phải đưa nó vào thân vòng lặp (biến i trong VD trên). Lệnh lặp với điều kiện sau Dạng lệnh: REPEAT UNTIL ; Ý nghĩa: Khi gặp câu lệnh này, trước tiên máy sẽ cho thực hiện , sau đó kiểm tra . Nếu có giá trị sai (FALSE) thì quay lại thực hiện . Thực hiện xong lệnh này máy sẽ lại kiểm tra để thực hiện ... quá trình tiếp diễn đến khi đúng thì dừng. Ví dụ: Lấy lại VD gửi tiết kiệm ở trên. Bây giờ ta sẽ viết lại chương trình sử dụng dạng lệnh lặp với điều kiện sau. Chương trình chỉ cần thay đổi một chút ở lệnh lặp. Program Gui_tiet_kiem; Const ls=0.018; Var A,B,S:real; t:integer; Begin Write('Cho biet so tien gui ban dau:'); Readln(A); Write('Cho biet so tien can dat :'); Readln(B); S:=A; t:=0; REPEAT S:=S+S*ls; t:=t+1; UNTILS>=B; Writeln(' Ban can gui it nhat la ', t, ' thang'); Readln; End. Ta thấy rằng trong phần thân của vòng lặp các lệnh đặt giữa REPEAT và UNTIL không cần sử dụng câu lệnh phức hợp begin...end; Bạn đọc có thể sử dụng lệnh này để viết lại chương trình tính tổng ở trên. Các lưu ý khi sử dụng các lệnh lặp WHILE và REPEAT 1) Trong thân vòng lặp phải có ít nhất một lệnh làm thay đổi giá trị của biểu thức điều kiện nhằm dừng vòng lặp. Nếu điều kiện luôn được thoả mãn thì lệnh có thể rơi vào vòng lập vô tận. Khi đó chỉ còn cách là tắt máy hoặc dừng chương trình. Xem ví dụ sau: I:=1; WHILE I<2 DO write('Stop!'); Vòng lặp này sẽ chạy vô tận vì trong thân vòng lặp sau từ khoá DO chỉ có một lệnh in ra xâu chữ 'Stop!', không có lệnh nào làm thay đổi giá trị của I. Tức là với I được khởi tạo ban đầu là 1 luôn nhỏ hơn 2, điều kiện luôn thoả mãn. 2) Trong lệnh lặp với điều kiện trước WHILE thì thân vòng lặp (sau từ khoá DO) phải sử dụng câu lệnh phức hợp begin... end; còn trong lệnh lặp với điều kiện sau thì không cần. 3) Trong lệnh lặp với điều kiện trước, máy luôn kiểm tra điều kiện trước khi thực hiện lệnh, do đó nếu điều kiện sai ngay từ đầu thì lệnh không được thực hiện lần nào. Còn trong lệnh lặp với điều kiện sau, máy luôn thực hiện lệnh một lần rồi mới kiểm tra điều kiện, dù ban đầu điều kiện có thể đúng. Nhớ rằng trong lệnh lặp với điều kiện sau lệnh được quay lại thực hiện chỉ khi điều kiện sai. 4) Các lệnh lặp có thể viết lồng nhau 5) Người ta thường dùng các lệnh lặp có số bước lặp không xác định để quay vòng thực hiện nhiều lần cả một công việc nào đó hoặc cả chương trình, cho phép tạo sự tương tác giữa người sử dụng và máy. Xem ví dụ mẫu sau: Program VD; Var tieptuc:char; { các biến của chương trình } Begin Repeat .. { đoạn chương trình thực hiện công việc và thay đổi điều kiện kiểm tra} write(' Ban co tiep tuc nua hay khong (C/K)'); readln(tieptuc); UNTIL (tieptuc='k') or (tieptuc='K'); End; Lệnh nhảy vô điều kiện GOTO Lệnh GOTO cho phép chương trình nhảy vô điều kiện tới một vị trí nào đó thông qua tên nhãn. Nhãn là một số nguyên hoặc một tên được khai báo trong phần LABEL ở đầu chương trình. Trong chương trình nhãn được đặt vào vị trí phù hợp kèm theo mộ dấu hai chấm (:). Xem ví dụ sau: Program VDNHAN; Uses crt; Label N1,N2; Var a,b,s:real; Begin a:=1; b:=2; N1: a:=a+1; if a<5 then GOTO N1; N2: s:=a+b; if s<10 then GOTO N2; writeln('a=', a, 'b=',b); readln; End. Thường người ta ít dùng lệnh GOTO trong chương trình PASCAL vì nó sẽ phá vỡ tính có cấu trúc của chương trình PASCAL. Nếu có thể, ta nên tránh dùng lệnh này. Thực hành chương 5 Câu 1: Viết chương trình nhập vào chiều dài và chiều rộng của một hình chữ nhật sau đó tính và in ra diện tích hình chữ nhật này. Câu 2: Nhập vào 2 số nguyên sau đó in ra số lớn nhất và số nhỏ nhất. Câu 3: Nhập vào 3 số nguyên sau đó in ra số lớn nhất và số nhỏ nhất. Câu 4: Viết chương trình nhập vào bán kính của hình tròn. Tính và in ra chu vi, diện tích của hình tròn đó. Câu 5: Diện tích biết trước của một hình tròn được nhập vào từ bàn phím. Tính và in ra bán kính của hình tròn đó. Câu 6: Nhập vào số nguyên x, tính và in ra S = 1 + x + x3/3 + x5/5. Câu 7: Viết chương trình tính tổng số nguyên n. Câu 8: Viết chương trình tìm mã ASCII của ký tự. Câu 9: Viết chương trình tìm ký tự khi biết mã ASCII. Câu 10: Viết chương trình đổi chữ hoa sang chữ thường. Câu 11: Viết chương trình đổi chữ thường sang chữ hoa. Câu 12: Viết chương trình nhập vào điểm 3 môn Toán, Lý, Hóa của một học sinh sau đó tính và in ra điểm trung bình và xếp hạng của học sinh đó. Câu 13: Nhập vào một số nguyên n in ra các số lẽ từ 0 đến n. Câu 14: Nhập vào một số kiểm tra xem đó có phải là số nguyên tố. Câu 15: Nhập vào một số nguyên dương n với 1 ≤ n ≤ 7. Tùy theo n=1, 2, 3, , 7 hãy in tương ứng các từ Sunday, Monday, Tuesday, , Saturday ra màn hình. Câu 16: Nhập vào một số tiền M nguyên dương. Đổi số tiền này ra các tờ giấy bạc 10.000Đ, 500Đ, 50Đ, 20Đ và 1Đ. Với giả thiết ưu tiên cho tờ có mệnh giá lớn hơn, hãy in ra xem đổi được bao nhiêu mỗi loại. Câu 17: Cước phí bưu điện trong nước được tính theo qui định như sau: Nếu trọng lượng thư trong khoảng định mức 100 gam đầu thì cước phí trung bình là 300 đồng cho mỗi gam. Nếu trọng lượng thư vượt định mức không quá 30 gam thì cước phí trung bình cho mỗi gam vượt định mức là 200 đồng; Trường hợp trọng lượng thư vượt quá 130 gam thì tính trung bình 120 đồng cho mỗi gam vượt quá 130 gam. Viết chương trình tính cước phí phải trả khi nhập vào trọng lượng của bức thư. Câu 18: Tính tiền điện phải trả khi biết số Kwh tiêu thụ và các thức tính theo qui định như sau: 100 Kwh định mức đầu tiên có đơn giá trung bình là 455 đ/Kwh. Các Kwh thứ 101 đến 150 có đơn giá trung bình là 591 đ/Kwh. Các Kwh thứ 151 đến 200 có đơn giá trung bình là 818 đ/Kwh. Các Kwh thứ 201 trở đi có đơn giá trung bình 1000 đ/Kwh. Câu 19: Tính tiền thuê phòng khi biết số ngày thuê và loại phòng (một trong 3 loại A,B hoặc C) với qui định như sau: Loại A: 250000 đ/ngày Loại B: 200000 đ/ngày Loại C: 150000 đ/ngày Nếu thuê quá 12 ngày thì phần trăm được giảm trên tổng số tiền (tính theo giá qui định) là: 10% cho phòng loại A, 8% cho phòng loại B hay C. Câu 20: Tính tiền trả cho một cuộc gọi điện thoại khi biết số phút gọi và hình thức gọi (liên lạc hay hỏi thông tin). Qui định chi tiết như sau: Liên lạc: 3 phút đầu tiên: 750đ (không gọi hết vẫn tính 3 phút) mỗi phút sau đó: 200 đ/phút. Hỏi thông tin: 5 phút đầu: 3000đ (không gọi hết vẫn tính 5 phút) mỗi phút sau đó 800 đ/phút. Câu 21: Nhập vào trọng lượng một bưu phẩm và tính cước phí của bưu phẩm đó, biết rằng: Nếu bưu phẩm có trungrọng lượng nhỏ hơn 20kg, cước phí là 20.000đ cho một bưu phẩm. Nếu bưu phẩm có trọng lượng từ 20kg trở lên (nhưng không vượt quá 50kg), mỗi kg bưu phẩm trên 20kg có cước phí trung bình là 1.200 đ/kg. Nếu bưu phẩm có trọng lượng từ 50kg trở lên, mỗi kg bưu phẩm trên 50kg có cước phí trung bình là 1.000 đ/kg. Câu 22: Tính tiền đi xe taxi khi biết số km đã đi: 1000m (tức 1km) đầu tiên giá 5000đ; từ km thứ 2 đến km thứ 5 giá trung bình là 4500 đ/km; từ km thứ 6 trở đi, giá trung bình mỗi km là 3500. Đi hơn 120 sẽ được giảm 10% trên tổng số tiền tính theo qui định. Câu 23: Tính tiền thuê một quyển sách nếu biết số ngày thuê ( không được vượt quá 30 ngày) và đối tượng thuê (sinh viên học sinh hay đối tượng khác). Các qui định về giá cả được cho như sau: Nếu mượn trong 7 ngày: Đối tượng sinh viên học sinh: 1500đ, đối tượng khác: 3000đ Nếu mượn hơn 7 ngày, mỗi ngày trả thêm: 500đ với đối tượng sinh viên học sinh, 700 với đối tượng khác. TÀI LIỆU THAM KHẢO 1. Phan Thị Hà – Nguyễn Tiến Hùng. Bài giảng Tin Học Đại Cương. 2. Đỗ Thị Mơ – Dương Xuân Thành – Nguyễn Thị Thủy – Ngô Tuấn Anh. Giáo trình Tin Học Đại Cương. 3. Đỗ Thanh Liên Ngân – Hồ Văn Tú. Giáo trình Tin Học Căn Bản.
File đính kèm:
- giao_trinh_tin_hoc_dai_cuong_ban_moi.doc