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

Bài giảng Tin học đại cương

92 318 0

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

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 92
Dung lượng 1,15 MB

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

Nội dung

Thế hệ thứ nhất (1945 đến 1955) máy tính dùng đèn điện tử: Trong các năm 40 và đầu những năm 50 phần cứng máy tính được phát triển trong các dự án nghiên cứu, các dự án này đã xây dựng phần cứng mỗi cái một loại và nhấn mạnh vào sự nghiên cứu. Trong giai đoạn này các máy chủ yếu được xây dựng dựa trên đèn điện tử, chiếc máy tính điện tử đầu tiên là máy ENIAC (Electronic Numberical Intergrator And Calculator) do John Mauchley và J.Presper Eckert thiết kế. Nó bao gồm 18.000 đèn điện tử, 1.500 rơ-le, nặng 30 tấn, tiêu thụ công suất là 140 KW, nó được lập trình bằng cách thiết đặt 6.000 switch. Thế hệ thứ hai (1955 đến 1965) máy tính dùng Transitor: Transitor được sáng chế ra tại phòng thí nghiệm Bell năm 1948. Các máy tính dùng đèn điện tử trong thời kỳ này đã trở nên lỗi thời, máy tính Transitor ra đời. Máy tính xây dựng dựa trên Transitor nên đã nhỏ gọn hơn. Chiếc máy tính Transitor đầu tiên là máy TX- 0 . Thế hệ thứ ba (1965 đến 1980) máy tính dùng Mạch tích hợp (IC): Công nghệ vi điện tử phát triển đã tạo ra mạch tích hợp cho phép đặt hàng chục Transitor vào trong mọt vỏ chung (chip) làm cho các nhà soản xuất có thể chế tạo ra các máy tính nhỏ hơn, nhanh hơn và giá thành hạ hơn. Thế hệ thứ tƣ (từ 1980) máy tính dùng triể

Trang 1

MỤC LỤC

CHƯƠNG 1 TỔNG QUAN VỀ MÁY TÍNH ĐIỆN TỬ 3

1.1 Thông tin 3

1.1.1 Khái niệm 3

1.1.2 Đơn vị đo thông tin 3

1.1.3 Mã hóa và xử lý thông tin 4

1.2 Tin học và công nghệ thông tin 5

1.3 Lịch sử ra đời và khuynh hướng phát triển kỹ thuật máy tính 5

1.4 Tổng quan về máy tính và các thiết bị ngoại vi 6

1.4.1 Đơn vị xử lý trung tâm (Central Processing Unit - CPU) 6

1.4.2 Bộ nhớ chính (Memory) 7

1.4.3 Các thiết bị ngoại vi 7

1.5 Phần mềm, phần cứng 7

CHƯƠNG 2 HỆ ĐẾM, BIỂU DIỄN THÔNG TIN 8

2.1 Các hệ đếm, các phép tính cơ bản 8

2.1.1 Khái niệm hệ đếm 8

2.1.2 Các phép tính trong hệ nhị phân 8

2.2 Chuyển đổi giữa các hệ đếm 9

CHƯƠNG 3 LẬP TRÌNH CƠ BẢN 12

3.1 Thuật toán 12

3.1.1 Khái niệm 12

3.1.2 Các đặc trưng của thuật toán 12

3.1.3 Biểu diễn thuật toán 13

3.2 Các khái niệm cơ bản 14

3.2.1 Tập các ký hiệu của ngôn ngữ C 14

3.2.2 Các từ khóa 14

3.2.3 Tên gọi 15

3.2.4 Chú thích 15

3.2.5 Câu lệnh 16

3.3 Cấu trúc tổng quát một chương trình 16

3.4 Các kiểu dữ liệu cơ sở 17

3.4.1 Các kiểu số 18

3.4.2 Các kiểu ký tự 19

3.5 Biến 19

3.6 Hằng 21

3.7 Toán tử 22

3.7.1 Toán tử số học 22

3.7.2 Toán tử gán 23

3.7.3 Toán tử tăng giảm 23

3.7.4 Toán tử quan hệ 23

3.7.5 Toán tử logic 24

3.8 Biểu thức 24

3.9 Các lệnh trong ngôn ngữ C 26

3.9.1 Lệnh nhập/xuất 26

3.9.2 Lệnh phức (khối lệnh) 28

3.9.3 Lệnh rẽ nhánh 29

3.9.4 Lệnh lặp 37

CHƯƠNG 4 LẬP TRÌNH VỚI DỮ LIỆU CÓ CẤU TRÚC 49

4.1 Mảng một chiều 49

4.1.1 Định nghĩa và khai báo 49

4.1.2 Các thao tác trên mảng một chiều 52

Trang 2

4.2 Mảng nhiều chiều 54

4.2.1 Định nghĩa và khai báo 54

4.2.2 Các thao tác trên mảng nhiều chiều 55

4.3 Chuỗi ký tự 56

4.3.1 Định nghĩa và khai báo 56

4.3.2 Các thao tác trên chuỗi ký tự 57

CHƯƠNG 5 LẬP TRÌNH MODULE 70

5.1 Phương pháp lập trình module 70

5.2 Xây dựng hàm 71

5.2.1 Quy tắc xây dựng hàm 71

5.2.1.2 Xác định tên và trình tự các đối số 72

5.2.1.3 Tiêu đề hàm 72

5.2.2 Lời gọi hàm 73

5.2.3 Biến toàn cục, biến cục bộ 74

5.2.4 Truyền đối số cho hàm 77

5.2.5 Xác định kiểu trả về cho hàm 78

5.3 Phân tích một số chương trình và giải một số bài toán bằng phương pháp lập trình module 80

5.3.1 Xác định số ngày của một tháng trong năm 80

5.3.2 Thực hiện các phép tính +, -, *, / 81

5.3.3 Giải phương trình bậc 1 82

5.3.4 Xuất ra màn hình các số trong đoạn và 10 câu “AAAAAAAAA” 83

5.3.5 Nhập vào N số nguyên, xác định tổng và số nhỏ nhất 84

5.3.6 Vẽ hình chữ nhật đặc các ký tự 85

5.3.7 Nhập vào một dãy các số nguyên dương (kết thúc khi nhập vào số âm) và tính tích của chúng 86

5.3.8 Nhập vào dãy các số nguyên dương 3 chữ số cho đến khi tổng của chúng lớn hơn M cho trước, xuất ra tổng và số lượng số nhập vào 87

5.3.9 Tìm bội số chung nhỏ nhất của hai số nguyên dương 87

5.3.10 Đổi số từ hệ 10 sang hệ b 88

5.3.11 Tính tổng 88

Trang 3

CHƯƠNG 1 TỔNG QUAN VỀ MÁY TÍNH ĐIỆN TỬ

1.1 Thông tin

1.1.1 Khái niệm

Trong cuộc sống, người ta có nhu cầu đọc báo, xem truyền hinh, giao tiếp với người khác để có thông tin Thông tin là sự hiểu biết của con người về một sự kiện, một hiện tượng nào đó thu nhận qua nghiên cứu, trao đổi, nhận xét, học tập, truyền thụ, cảm nhận

Con người hiểu được thông tin qua lời nói, chữ viết, qua các dạng biểu diễn thông tin khác và diễn tả thông tin thành ngôn ngữ để truyền đạt cho nhau Thông tin được chuyển tải qua các môi trường vật lý khác nhau như ánh sáng, sóng âm, sóng điện

từ, … Thông tin được ghi trên các phương tiện hữu hình như các văn bản trên giấy, băng ghi âm hay phim ảnh,

1.1.2 Đơn vị đo thông tin

Mỗi sự vật, hiện tượng đều hàm chứa một lượng thông tin Muốn biết một đối tượng nào đó ta phải biết đủ lượng thông tin về nó

Đơn vị đo thông tin là bít Một bít tương ứng với một chỉ thị hoặc một thông báo nào đó về sự kiện, có một trong hai trạng thái có số đo khả năng xuất hiện đồng thời là Tắt (Off)/mở (On) hay đúng (True) / Sai (False)

Ví dụ: Một mạch đèn có 2 trạng thái là:

+ Tắt (Off) khi mạch điện qua công tắc là hở

+ Mở (On) khi mạch điện qua công tắc là đóng

Số học nhị phân sử dụng hai ký số là 0 và 1 để biểu diễn các số Vì khả năng sử dụng hai số 0 và 1 là như nhau nên một chỉ thị chỉ gồm một chữ số nhị phân có thể xem như là đơn vị chứa thông tin nhỏ nhất

Bit là chữ viết tắt của Binary digiT Trong tin học, người ta thường sử dụng các đơn vị đo thông tin phổ biến lớn hơn như sau:

Trang 4

1.1.3 Mã hóa và xử lý thông tin

a Mã hóa thông tin

Mã hóa thông tin là quá trình biến đổi thông tin từ dạng biểu diễn thông tin thường sang một dạng khác theo quy ước nhất định Quá trình biến đổi ngược lại của thông tin được gọi là phép giải mã

Ví dụ: Ta có một tập quản lý hồ sơ sinh viên Nếu ta quản lý bằng tên thì xảy ra rất nhiều trường hợp tên bị trùng nhau Nếu ta thêm các yếu tố kèm theo như địa chỉ, ngày sinh, quê quán v.v thì việc quản lý trở nên rất rườm rà, phức tạp mà không loại trừ được khả năng trùng nhau Nếu ta gán cho mỗi sinh viên một mã số ID, ta có thể tìm

ta số liệu về sinh viên tương ứng Như vậy, quá trình gán mã số ID cho mỗi hồ sơ sinh viên gọi là mã hóa, còn quá trình dựa trên mã số ID để xác định thông tin về sinh viên gọi là giải mã

Trong máy tính điện tử (MTĐT), người ta mã hóa thông tin dưới dạng nhị phân dựa vào bảng mã ASCII (American Standard Code for Information Interchange) mở rộng 8 bít Trong đó mã hóa được 256 ký tự có mã từ 0 đến 255 và được chia thành 2 nhóm:

- Nhóm 1: Có mã từ 0 đến 127 dùng để mã hóa các ký tự, ký hiệu cơ sở: az, AZ, 09, {, }, [, ], =, +, và các ký tự điều khiển

- Nhóm 2: Có mã từ 128 đến 255 dùng để mã hóa các ký tự đồ họa và các ký tự đặc biệt của mỗi nước

b Xử lý thông tin

- Để đáp ứng cho các công việc hàng ngày bao gồm nhiều lĩnh vực như nghiên cứu, kinh doanh sản xuất, thương mại…Con người luôn phải thu nhập và xử lý hàng loạt các thông tin từ nhiều nguồn, các hoạt động xử lý bao gồm các quá trình như sau:

+ Thu thập thông tin: Lấy thông tin từ sự vật, hiện tượng thông qua các giác quan và các thiết bị có khả năng thu nhận tin

+ Mã tin: Biểu diễn thông tin bằng chữ viết, chữ số, ngôn ngữ, tiếng nói, âm thanh, hình vẽ, trạng thái điện

+ Truyền tin: Gởi tin từ máy này sang máy khác, từ điểm này sang điểm khác Môi trường truyền tin gọi là kênh liên lạc

+ Trữ tin: Ghi tên lên các vật ký tin

+ Xử lý tin: Tác động lên các tin đã có

+ Xuất tin: Đưa thông tin ra cho người dung dưới các dạng mà con người có thể nhận biết được

- Tin thường có độ nhiễu cao Vì vậy xử lý tin là làm giảm độ nhiễu của tin Chất lượng tin được đánh giá căn cứ trên các phương diện sau: Sự cần thiết, sự chính xác, sự tin cậy và sự kịp thời

Trang 5

1.2 Tin học và công nghệ thông tin

Tin học là ngành khoa học nghiên cứu các phương pháp và quá trình 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à hiện nay phương tiện đó là MTĐT

Các thành tựu mới trong viễn thông cho phép kết nối các máy tính thành mạng máy tính Do vậy, việc phối hợp giữa công cụ xử lý thông tin tự động, kết cấu hạ tầng viễn thông, các chuẩn giao tiếp trong các môi trường của máy với máy và giữa người với máy ngày một phát triển

Khái niệm Công nghệ Thông tin có một nội dung đầy đủ, bao hàm được những lĩnh vực, những nền tảng chủ yếu của khoa học và công nghệ xử lý thông tin dựa trên máy tính Khi nói đến yếu tố công nghệ, người ta muốn nhấn mạnh đến tính quá trình, tính tổ chức và phương pháp xử lý thông tin hướng tới sản phẩm Định nghĩa Công nghệ Thông tin đã được các chuyên gia Việt Nam nghiên cứu, tham khảo từ các định nghĩa của chuyên gia trên thế giới và đã được đa vào Nghị quyết 49/CP của Chính phủ

về phát triển Công nghệ Thông tin của Việt nam từ 1996 như sau:

"Công nghệ Thông tin là tập hợp các phương pháp khoa học, các phương tiện và công cụ kỹ thuật hiện đại - chủ yếu là kỹ thuật máy tính và viễn thông - nhằm tổ chức

và khai thác và sử dụng có hiệu quả nguồn tài nguyên thông tin rất phong phú và tiềm tàng trong mọi lĩnh vực hoạt động của con người và xã hội Công nghệ thông tin được phát triển trên nền tảng phát triển của các công nghệ Tin học -Điện tử -Viễn thông và

Tự động hoá"

Công nghệ Thông tin mang một ý nghĩa rộng rãi hơn, nó vừa là khoa học, vừa là

công nghệ, vừa là kỹ thuật, bao trùm cả tin học, viễn thông và tự động hoá

1.3 Lịch sử ra đời và khuynh hướng phát triển kỹ thuật máy tính

Thế hệ thứ nhất (1945 đến 1955) máy tính dùng đèn điện tử: Trong các năm 40

và đầu những năm 50 phần cứng máy tính được phát triển trong các dự án nghiên cứu, các dự án này đã xây dựng phần cứng mỗi cái một loại và nhấn mạnh vào sự nghiên cứu Trong giai đoạn này các máy chủ yếu được xây dựng dựa trên đèn điện

tử, chiếc máy tính điện tử đầu tiên là máy ENIAC (Electronic Numberical Intergrator And Calculator) do John Mauchley và J.Presper Eckert thiết kế Nó bao gồm 18.000 đèn điện tử, 1.500 rơ-le, nặng 30 tấn, tiêu thụ công suất là 140 KW, nó được lập trình bằng cách thiết đặt 6.000 switch

Thế hệ thứ hai (1955 đến 1965) máy tính dùng Transitor: Transitor được sáng

chế ra tại phòng thí nghiệm Bell năm 1948 Các máy tính dùng đèn điện tử trong thời kỳ này đã trở nên lỗi thời, máy tính Transitor ra đời Máy tính xây dựng dựa trên Transitor nên đã nhỏ gọn hơn Chiếc máy tính Transitor đầu tiên là máy TX- 0

Thế hệ thứ ba (1965 đến 1980) máy tính dùng Mạch tích hợp (IC): Công nghệ

vi điện tử phát triển đã tạo ra mạch tích hợp cho phép đặt hàng chục Transitor vào trong mọt vỏ chung (chip) làm cho các nhà soản xuất có thể chế tạo ra các máy tính nhỏ hơn, nhanh hơn và giá thành hạ hơn

Thế hệ thứ tư (từ 1980) máy tính dùng mạch tích hợp mức cao (VLSI): Những

năm 80, công nghệ vi điện tử đã chế tạo ra các vi mạch điện tử có mức tích hợp rất cao (VLSI Very Large Scale Integrator), trong một chip có thể tích hợp hàng triệu Transitor, do đó các máy tính ngày càng nhỏ hơn, chạy nhanh hơn, khả năng tính

Trang 6

toán lớn hơn, và giá thành rẻ hơn Năm 1980 máy tính cá nhân PC (Personal

Computer) ra đời

1.4 Tổng quan về máy tính và các thiết bị ngoại vi

Bất kỳ một máy tính điện tử nào cũng gồm 3 thành phần chính sau:

 Đơn vị xử lý trung tâm

 Bộ nhớ

 Các thiết bị ngoại vi

Cấu trúc chung của một máy tính điện tử

1.4.1 Đơn vị xử lý trung tâm (Central Processing Unit - CPU)

CPU được coi là bộ não của máy tính, là thiết bị điều khiển mọi hoạt động của máy tính, điểu khiển việc thực thi thiết bị, điều khiển việc tính toán lưu trữ theo yêu cầu của chương trình, được chia làm 3 thành phần chính sau:

+ Khối điều khiển (Control Unit-CU): chịu trách nhiệm điều khiển toàn bộ các hoạt động của hệ thống thông qua các chỉ thị trong chương trình

+ Khối tính toán số học và logic (Arithmetic Logic Unit-ALU): Chịu trách nhiệm thực hiện các phép tính số học (Cộng, trừ, nhân, chia, ), các phép toán Logic (AND,

OR, XOR, NOT) và các phép tính quan hệ (so sánh hơn, nhỏ hơn, bằng nhau, )

+ Các thanh ghi (Registers): Thiết kế bằng các mạch điện tử làm nhiệm vụ bộ nhớ trung gian, bộ nhớ tạm lưu trữ mã lệnh, kết quả tính toán theo yêu cầu của khối điều khiển Các thanh ghi mang chức năng chuyên dụng giúp tăng tốc độ trao đổi thông tin trong máy tính

Trang 7

1.4.2 Bộ nhớ chính (Memory)

Bộ nhớ là thiết bị làm nhiệm vụ lưu trữ tạm thời hoặc lâu dài thông tin, thông tin lưu trữ bao gồm: các dữ liệu từ ngoài đưa vào, các chỉ thị chương trình, các kết quả sau xử

lý Bộ nhớ chia làm hai loại:

Bộ nhớ trong: Chia làm 2 loại:

 RAM (Random Access Memory): Là bộ nhớ truy cập ngẫu nhiên, bộ nhớ này chỉ

lưu trữ tạm thời thông tin trong quá trình xử lý Khi tắt máy, mất điện hoặc khởi động lại thì thông tin trên RAM sẽ mất đi Dung lượng của RAM càng lớn thì tốc độ truy xuất máy tính càng nhanh

 ROM (Read Only Memory): Là bộ nhớ chỉ đọc, do đó nó chỉ đọc thông tin có sẵn

được ghi bởi nhà sản xuất, thông tin trên ROM sẽ không mất đi khi mất điện hoặc tắt máy

Bộ nhớ ngoài: Là thiết bị lưu trữ thông tin với dung lượng lớn, thông tin không mất

đi khi không có điện Có thể di chuyển bộ nhớ ngoài độc lập với máy tính như đĩa cứng, đĩa mềm, đĩa quang, USB,

Phần cứng (hardware) là toàn bộ các thiết bị vật lý của MTĐT Nâng cao tốc độ xử

lý, tăng khả năng lưu trữ, tăng độ tin cậy, giảm năng lượng sử dụng, tăng khả năng ghép nối, là những mục tiêu mà kỹ thuật phần cứng hướng tới

Phần mềm (software) nghiên cứu phương pháp sử dụng công cụ xử lý thông tin tự

động trong các tiến trình xử lý thông tin Phần mềm bao gồm các chương trình có chức năng điều khiển, khai thác phần cứng và để thực hiện các yêu cầu xử lý thông tin Phần mềm cũng bao gồm các phương pháp tổ chức dữ liệu tương ứng với chương trình xử lý thông tin Tìm ra các phương pháp xử lý thông tin có hiệu quả, tổ chức dữ liệu tốt và lập trình thể hiện các phương pháp xử lý đó là vấn đề của phần mềm

Trang 8

Hệ thập phân là hệ cơ số 10 có các chữ số cơ bản là 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Hệ nhị phân là hệ cơ số 2 có các chữ số cơ bản là 0, 1 Mỗi chữ số nhị phân gọi là BIT (Binary digiT) Vì hệ nhị phân chỉ có hai số nên chỉ có hai giá trị 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 thì cần kết hợp nhiều BIT với nhau Ví dụ:

0101 biểu diễn số 5

Hệ bát phân là hệ cơ số 8: Nếu dùng 3 bít có thể biểu diễn 8 trị khác nhau: 000, 001,

010, 011, 100, 101, 110, 111 Các trị này tương ứng với 8 trị 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

Hệ thập lục phân là hệ cơ số 16 có các chữ số cơ bản là 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A,

B, C, D, E, F tương ứng với các số 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 trong hệ thập phân

Trang 9

 Ví dụ 2.3:

1101

× 11

1101 +1101

100111

Chia: Thực hiện phép chia giống như trong hệ thập phân

 Ví dụ 2.4: 1111 : 101 = 11

2.2 Chuyển đổi giữa các hệ đếm

Nguyên tắc 1: Đổi một số thập phân sang hệ cơ số b

 Đổi phần nguyên từ một số thập phân sang hệ cơ

số b:

Để chuyển đổi phần nguyên của một số thập phân

sang hệ cơ số b (b≠10) ta làm như sau: Lấy phần nguyên

số thập phân chia cho cơ số b cho đến khi phần thương

của phép chia bằng không, số đổi được chính là phần dư

của phép chia viết theo thứ tự ngược lại:

 Ví du 2.5: Cho X = 610 nghĩa là X=6 trong hệ thập

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

 Đổi phần thập phân của một số thập phân sang hệ cơ số b:

Để đổi phần thập phân của hệ thập phân sang hệ cơ số b ta làm như sau: Lấy phần thập phân nhân với cơ số b cho đến khi phân thập phân của tích số bằng 0 Kết quả chuyển đổi được là các số phần nguyên trong phép nhân viết ra theo thứ tự tính toán

 Ví dụ 2.6:

Nguyên tắc 2: Đổi một số từ hệ cơ số b về hệ thập phân

Để chuyển đổi một số từ hệ cơ số b về hệ thập phân ta sử dụng công thức (*)

Với b là cơ số đếm; a0, a1, a2, …, an là các chữ số cơ bản; X là số ở hệ đếm cơ số b

 Ví dụ 2.7: Với X = 1102 = 1*22 + 1*21 + 0 = 6

Bảng chuyển đổi giữa hệ nhị phân, thập lục phân và thập phân như sau:

Thập phân Nhị Phân Thập lục phân

1 0 1 1

X b =a n a n-1 …a 1 a 0 = a n b n +a n-1 b n-1 +….+a 1 b 1 +a 0 b 0 (*)

Trang 10

Nguyên tắc 3: Đổi một số từ hệ nhị phân sang hệ thập lục phân

Để đổi một số từ hệ nhị phân sang hệ thập lục phân ta làm như sau: Nhóm lần lượt 4 bit từ phải sang trái, sau đó thay thế các nhóm 4 bít này bằng giá trị tương ứng trong hệ thập lục phân

 Ví dụ 2.8: X = 11‟10112 = 3B16

Nguyên tắc 4: Đổi một số từ hệ thập lục phân sang hệ nhị phân

Để đổi một số từ hệ thập lục phân sang hệ nhị phân ta làm như sau: Mỗi chữ số trong hệ thập lục phân sẽ được biểu diễn dưới dạng 4 bit

 Ví dụ 2.9: X = 3B16 = 1110112

Trang 12

CHƯƠNG 3 LẬP TRÌNH CƠ BẢN

3.1 Thuật toán

3.1.1 Khái niệm

Thuật toán hay giải thuật là một hệ thống chặc chẽ và rõ rang các quy tắc nhằm xác định một dãy các thao tác trên những đối tượng, sao cho sau một số hữu hạn bước thực hiện các thao tác thì cho kết quả

Từ thuật toán (Algorithm) xuất phát từ tên một nhà toán học người Trung Á là Abu Abd - Allah ibn Musa al’Khwarizmi, thường gọi là al‟Khwarizmi Ông là tác

giả một cuốn sách về số học, trong đó ông đã dùng phương pháp mô tả rất rõ ràng, mạch lạc cách giải những bài toán Sau này, phương pháp mô tả cách giải toán của ông

đã được xem là một chuẩn mực và được nhiều nhà toán học khác tuân theo Từ algorithm ra đời dựa theo cách phiên âm tên của ông

3.1.2 Các đặc trưng của thuật toán

Tính có đại lượng vào và ra

Bắt đầu một giải thuật là việc nhận dữ liệu vào (Input) – kết thúc giải thuật là một số kết quả (dữ liệu ra Output)

Tính hiệu quả

Tính hiệu quả của một giải thuật được đánh giá dựa trên các tiêu chuẩn sau:

 Dung lượng bộ cần thiết

 Số lượng phép tính cần thực hiện

 Thời gian cần thiết để chạy

 Dễ hiểu và dễ cài đặt

Trang 13

 Ví dụ 3.1: Thuật toán giải phương trình bậc hai ax 2

3.2.1 Phương trình có hai nghiệm phân biệt x1 và x2

3.2.2 Giá trị của hai nghiệm được tính theo công thức sau:

3.1.3 Biểu diễn thuật toán

Sử dụng các ký hiệu hình khối cơ bản để tạo thành một mô tả mang tính hình thức (cách này rõ ràng hơn so với việc mô tả các bước thực hiện thuật toán)

Nhập, Xuất Bắt đầu

Trang 14

Khối 1: Khối bắt đầu thuật toán, chỉ có duy nhất một đường ra

Khối 2: Khối kết thúc thuật toán, có thể có nhiều đường vào

Khối 3: Thực hiện câu lệnh (có thể là một hoặc nhiều câu lệnh) gồm một đường vào và

một đường ra

Khối 4: Rẽ nhánh, kiểm tra biểu thức điều kiện (biểu thức Boolean), nếu biểu thức

đúng thuật toán sẽ đi theo nhánh Đúng (True), nếu biểu thức sai thuật toán sẽ đi theo nhánh Sai (False)

Khối 5: Các câu lệnh nhập và xuất dữ liệu.

3.2 Các khái niệm cơ bản

3.2.1 Tập các ký hiệu của ngôn ngữ C

Mọi ngôn ngữ lập trình đều được xây dựng từ một bộ ký tự nào đó Các ký tự được nhóm lại theo nhiều cách khác nhau để tạo nên các từ Các từ lại được liên kết với nhau theo một qui tắc nào đó để tạo nên các câu lệnh Một chương trình (CT) bao gồm nhiều câu lệnh và thể hiện một thuật toán để giải một bài toán nào đó Ngôn ngữ C được xây dựng trên bộ ký tự sau:

Dấu cách (space) dùng để tách các từ Ví dụ chữ VIET NAM có 8 ký tự, còn VIETNAM chỉ có 7 ký tự

3.2.2 Các từ khóa

Từ khoá là những từ được sử dụng để khai báo các kiểu dữ liệu, để viết các toán tử

và các câu lệnh Bảng dưới đây liệt kê các từ khoá của TURBO C:

Trang 15

interrupt long near pascal

volatile while

Ý nghĩa và cách sử dụng của mỗi từ khoá sẽ được đề cập sau này, ở đây ta cần chú ý:

 Không được dùng các từ khoá để đặt tên cho các hằng, biến, mảng, hàm

 Từ khoá phải được viết bằng chữ thường Ví dụ: viết từ khoá khai báo kiểu

số nguyên là int chứ không phải là INT

3.2.3 Tên gọi

Tên là một khái niệm rất quan trọng, nó dùng để xác định các đại lượng khác nhau trong một chương trình Chúng ta có tên hằng, tên biến, tên mảng, tên hàm, tên con trỏ, tên tệp, tên cấu trúc, tên nhãn,

Tên được đặt theo qui tắc sau:

 Tên là một dãy các ký tự bao gồm chữ cái, số và gạch nối

 Ký tự đầu tiên của tên phải là chữ hoặc gạch nối; không được bắt đầu bởi các ký tự đặc biệt hoặc chữ số

 Tên không được trùng với từ khoá

 Không được đặt tên với ký tự space,các phép toán

 Độ dài cực đại của tên theo mặc định là 32 và có thể được đặt lại là một trong các giá trị từ 1 tới 32 nhờ chức năng: Option-Compiler-Source-Identifier length khi dùng TURBO C

 Ví dụ 3.2: Các tên đúng : a_1 delta x1 _step GAMA

Các tên sai:

3MN Ký tự đầu tiên là số m#2 Sử dụng ký tự đặc biệt # f(x) Sử dụng các dấu ( )

te ta Sử dụng dấu trắng Y-3 Sử dụng dấu trừ (–) là phép toán

Chú ý:

Trong C có phân biệt chữ hoa và chữ thường (ví dụ tên AB khác với ab); ta thường dùng chữ hoa để đặt tên cho các hằng và dùng chữ thường để đặt tên cho hầu hết cho các đại lượng khác như biến, biến mảng, hàm, cấu trúc Tuy nhiên đây không phải là điều bắt buộc

3.2.4 Chú thích

Các lời bình luận, các lời giải thích có thể đưa vào ở bất kỳ chỗ nào của chương trình để cho chương trình dễ hiểu, dễ đọc hơn mà không làm ảnh hưởng đến các phần khác

Trong một chương trình cần (và luôn luôn cần) viết thêm những lời giải thích để chương trình thêm rõ ràng, thêm dễ hiểu

Chú thích có thể được viết theo 2 cách sau:

 Chú thích trên một dòng được đặt sau “//”

 Chú thích trên nhiều dòng được đặt giữa “/*” và “*/”

Trang 16

 Ví dụ 3.3:

//Nội dung cần ghi chú /* Ghi chú loại này có thể viết trên nhiều dòng */

Trong chương trình C, dấu “;” là ký hiệu kết thúc câu lệnh

3.3 Cấu trúc tổng quát một chương trình

Một chương trình bao gồm một hoặc nhiều hàm Hàm main() là thành phần bắt buộc của chương trình Chương trình bắt đầu thực hiện các câu lệnh đầu tiên của hàm main() và kết thúc khi gặp dấu } cuối cùng của hàm này Khi chương trình làm việc, máy có thể chạy từ hàm này sang hàm khác

Các chương trình C được tổ chức theo mẫu:

Cấu trúc cơ bản của chương trình như sau:

//Khai báo nguyên mẫu hàm

<Kiểu trả về> <tên hàm> (các đối số);

//khai báo biến toàn cục

//Chương trình chính

main()

Trang 17

 Hàm main() có thể đặt sau hoặc xen vào giữa các hàm khác

 Ví dụ 3.4: Chương trình tính x lũy thừa y rỗi in kết quả ra màn hình:

z=pow(x,y); /* hàm tính x luỹ thừa y */

printf("\n x= %8.2lf \n y=%8.2lf \n z=%8.2lf",x,y,z);

}

Một số lưu ý khi viết chương trình:

 Trong C mỗi câu lệnh được kết thúc bằng dấu chấm phẩy (;) Dấu chấm phẩy dùng để ngăn cách các câu lệnh

 Sau các #include, #define không có dấu chấm phẩy Bởi C không xem đó là lệnh

 Khi viết chương trình thông thường ta nên bố trí mỗi câu lệnh chiếm một dòng Các lệnh cùng nhóm thẳng theo chiều dọc

 Nên đặt tên trong chương trình một cách dễ hiểu, mang tính gợi ý đến đối tượng liên quan

 Nên viết dòng chú thích ngay đầu dòng

 Khi sử dụng các hàm chuẩn thì chúng ta phải khai báo sử dụng thư viện của nó ở chỉ thị #include

3.4 Các kiểu dữ liệu cơ sở

Một kiểu dữ liệu là một quy định chung về hình dạng, cấu trúc, giá trị cũng như cách biểu diễn và xử lý LTV phải chọn các kiểu dữ liệu thích hợp để có thể giải tốt bài toán đặt ra Một NNLT chỉ chấp nhận các kiểu dữ liệu tuân theo (hơặc được xây dựng trên) quy định của nó Trong C, các kiểu dữ liệu cơ bản gồm: số nguyên, số thực, ký tự, liệt kê, …

Trang 18

3.4.1 Các kiểu số

Tên các kiểu số trong C được trình bày trong bảng sau:

Kiểu số nguyên Tên kiểu

trong C

Dung lƣợng (byte)

Phạm vi

Nhỏ

Ngắn

Không dấu unsigned char

Dài

Không dấu unsigned int

Lớn

Không dấu unsigned long 4

o Các phép toán số học: +, -, *, % (phép chia giữa hai số nguyên lấy phần dư, chẳng hạn 5 % 3 = 2), / ((a) nếu hai vế của phép chia đều là số nguyên thì / là

Các kiểu dữ liệu cơ bản

Trang 19

phép chia lấy phần nguyên (ví dụ, 5 / 3 = 1), (b) ngược lại, / là phép chia có kết quả là số thực (ví dụ, 5.0 / 3 = 1.66))

o Các phép toán so sánh: <, <=, >, >=, = = (so sánh bằng), != (so sánh khác)

Tràn số và biểu diễn “quay vòng”

Khi giá trị của một số vượt quá chặn trên miền xác định của kiểu số (tràn số) thì xảy ra tình trạng “quay vòng” tính từ chặn dưới của miền xác định

Giả sử ta gán giá trị 32770 cho một biến a kiểu int có miền xác định 32768 32767] Vì 32770 vượt quá chặn trên miền xác định của kiểu int (32767) nên xảy ra tràn số Lúc này, sẽ diễn ra sự “quay vòng”: 32768 (= chặn trên + 1) sẽ trở thành -32768 (chặn dưới), 32769 (= chặn trên + 2) trở thành -32767 (= chặn dưới + 1),32770 trở thành 32766 Do đó, a sẽ có giá trị -32766

Các phép toán trên kiểu ký tự có thể xem là các phép toán trên mã ASCII của các

ký tự, hay là các phép toán trên kiểu số nguyên

3.5 Biến

Một chương trình ứng dụng có thể quản lý nhiều loại dữ liệu Trong trường hợp này, chương trình phải chỉ định bộ nhớ cho mỗi đơn vị dữ liệu Khi chỉ định bộ nhớ, có hai điểm cần lưu ý như sau :

1 Bao nhiêu bộ nhớ sẽ được gán

2 Mỗi đơn vị dữ liệu được lưu trữ ở đâu trong bộ nhớ

Trước đây, các lập trình viên (LTV) phải viết chương trình theo ngôn ngữ máy gồm các mã 1 và 0 Nếu muốn lưu trữ một giá trị tạm thời, vị trí chính xác nơi mà dữ liệu được lưu trữ trong bộ nhớ máy tính phải được chỉ định Vị trí này là một con số cụ thể, gọi là địa chỉ bộ nhớ

Trang 20

Các ngôn ngữ lập trình hiện đại cho phép chúng ta sử dụng các tên tượng trưng gọi là biến (variable), chỉ đến một vùng bộ nhớ nơi mà các giá trị cụ thể được lưu trữ

Kiểu dữ liệu quyết định tổng số bộ nhớ được chỉ định Những tên được gán cho biến giúp chúng ta sử dụng lại dữ liệu khi cần đến

Chúng ta đã quen với cách sử dụng các ký tự đại diện trong một công thức Ví

dụ, diện tích hình chữ nhật được tính bởi :

Diện tích = A = chiều dài x chiều rộng = L x B

Cách tính lãi suất đơn giản được cho như sau:

Tiền lãi = I = Số tiền ban đầu x Thời gian x Tỷ lệ/100 = P x T x R /100

Các ký tự A, L, B, I, P, T, R là các biến và là các ký tự viết tắt đại diện cho các giá trị khác nhau

Xem ví dụ sau đây :

Tính tổng điểm cho 5 sinh viên và hiển thị kết quả Việc tính tổng được thực hiện theo hướng dẫn sau

Hiển thị giá trị tổng của 24, 56, 72, 36 và 82

Khi giá trị tổng được hiển thị, giá trị này không còn được lưu trong bộ nhớ máy tính Giả sử, nếu chúng ta muốn tính điểm trung bình, thì giá trị tổng đó phải được tính một lần nữa

Tốt hơn là chúng ta sẽ lưu kết quả vào bộ nhớ máy tính, và sẽ lấy lại nó khi cần đến

sum = 24 + 56 + 72 + 36 + 82

Ở đây, sum là biến được dùng để chứa tổng của 5 số Khi cần tính điểm trung

bình, có thể thực hiện như sau:

Avg = sum / 5

Trong C, tất cả biến cần phải được khai báo trước khi dùng chúng

 Ví dụ 3.5: Nhập hai số và hiển thị tổng của chúng

BEGIN

DISPLAY „Enter 2 numbers‟

INPUT A, B

C = A + B DISPLAY C END

A, B và C trong đoạn mã trên là các biến Tên biến giúp chúng ta tránh phải nhớ địa chỉ của vị trí bộ nhớ Khi đoạn mã được viết và thực thi, hệ điều hành đảm nhiệm việc cấp không gian nhớ còn trống cho những biến này Hệ điều hành ánh xạ một tên biến đến một vị trí xác định trong bộ nhớ (ô nhớ) Và để tham chiếu tới một giá trị riêng biệt trong bộ nhớ, chúng ta chỉ cần chỉ ra tên của biến Trong ví dụ trên, giá trị của hai biến được nhập từ người dùng và chúng được lưu trữ nơi nào đó trong bộ nhớ Những

vị trí này có thể được truy cập thông qua các tên biến A và B Trong bước kế tiếp, giá trị của hai biến được cộng và kết quả được lưu trong biến thứ 3 là biến C Cuối cùng, giá trị biến C được hiển thị

Cú pháp khai báo biến (trước khi sử dụng):

kiểu_dữ_liệu tên_biến_1 = giá_trị_ban_đầu_1,

Trang 21

tên_biến_2 = giá_trị_ban_đầu_2, …;

Nếu trong khai báo biến ta không dùng “= giá_trị_ban_đầu” thì giá trị ban đầu

của biến là một giá trị ngẫu nhiên (tùy thuộc vào giá trị hiện tại của ô nhớ được cấp phát cho biến)

 Ví dụ 3.6: Một số khai báo biến

int tong_tien, to_trong_tui, to_vua_lay, uscln, a, b;

float dtich_hcn, dtich_hvuong, tong_dtich, cdai, crong, canh;

char xep_loai, chuc_vu;

color mau_nen, mau_chu;

cac_ngay ngay_lam_viec;

Các khai báo biến sai (thừa, thiếu dấu „,‟ hoặc thiếu dấu „;‟) thường gặp:

int tong_tien, ;

float dtich_hcn dtich_hvuong;

char xep_loai, chuc_vu

Một hằng là một giá trị không bao giờ bị thay đổi Ví dụ, 5 là một hằng, mà giá trị toán học luôn là 5 và không thể bị thay đổi bởi bất cứ ai Tương tự, „Black‟ là một

hằng, nó biểu thị cho màu đen Khi đó, 5 được gọi là hằng số (numeric constant),

„Black‟ được gọi là hằng chuỗi (string constant)

Tên khai báo hằng (thường được viết hoa) tuân theo qui tắc đặt tên biến Các hằng được khai báo trước khi sử dụng, theo hai cách sau:

#define tên_hằng giá_trị

hoặc const kiểu_dữ_liệu tên_hằng = giá_trị;

const float EPSILON = 0.000001;

const unsigned int GIAY_TREN_GIO = 3600;

const unsigned int GIAY_TREN_PHÚT = 60;

const char KY_TU = „a‟;

Trang 22

Các khai báo hằng sai:

#define PI 3.1416;

const float PI = 3.1416, EPSILON= 0.000001;

do: a) không có dấu „;‟ sau khai báo hằng bằng từ khóa #define, b) không thể khai báo cùng lúc nhiều hằng

Số 165 (biểu diễn trong hệ 16

là A5, 165 = A*161 + 5; với A

( Chia số nguyên sẽ chặt phần thập phân )

( Cho phần dư của phép chia a cho b )

Có phép toán một ngôi “-”, ví du -(a+b) sẽ đảo giá trị của phép cộng (a+b)

 Ví dụ 3.8:

11/3 = 3

11%3 = 2

-(2+6) = -8

Các phép toán + và - có cùng thứ tự ưu tiên, có thứ tự ưu tiên nhỏ hơn các phép * , / , %

và cả ba phép này lại có thứ tự ưu tiên nhỏ hơn phép trừ một ngôi Các phép toán số học được thực hiện từ trái sang phải

Trang 23

Dòng mã trên gán giá trị 10 cho a, b,và c Tuy nhiên, việc này không thể thực hiện lúc

khai báo biến Ví dụ,

int a = int b = int c= 0;

Câu lệnh trên phát sinh lỗi vì sai cú pháp

3.7.3 Toán tử tăng giảm

C đưa ra hai phép toán một ngôi để tăng và giảm các biến (nguyên và thực) Toán tử tăng là ++ sẽ cộng 1 vào toán hạng của nó, toán tử giảm thì sẽ trừ toán hạng đi 1

 Ví dụ 3.9:

n=5

++n Cho ta n=6

n Cho ta n=4

Ta có thể viết phép toán ++ và trước hoặc sau toán hạng như sau : ++n, n++, n, n

Sự khác nhau của ++n và n++ ở chỗ : trong phép n++ thì tăng sau khi giá trị của nó đã được sử dụng, còn trong phép ++n thì n được tăng trước khi sử dụng Sự khác nhau giữa n và n cũng như vậy

Trang 24

Các phép toán quan hệ có số thứ tự ưu tiên thấp hơn so với các phép toán số học, cho nên biểu thức:

i<n-1 được hiểu là i<(n-1)

Các phép quan hệ có số ưu tiên nhỏ hơn so với ! nhưng lớn hơn so với && và ||,

vì vậy biểu thức như:

Trong C, ta có hai khái niệm về biểu thức:

 Biểu thức gán

 Biểu thức điều kiện

Biểu thức được phân loại theo kiểu giá trị: nguyên và thực Trong các mệnh đề logic, biểu thức được phân thành đúng (giá trị khác 0) và sai (giá trị bằng 0)

Biểu thức thường được dùng trong:

 Vế phải của câu lệnh gán

 Làm tham số thực sự của hàm

 Làm chỉ số

 Trong các toán tử của các cấu trúc điều khiển

Thứ tự ƣu tiên các phép toán

Các phép toán có độ ưu tiên khác nhau, điều này có ý nghĩa trong cùng một biểu thức sẽ có một số phép toán này được thực hiện trước một số phép toán khác

Thứ tự ưu tiên của các phép toán được trình bày trong bảng sau :

2 ! ~ & * - ++ (type ) sizeof Phải qua trái

Trang 25

4 + - Trái qua phải

14 = += -= *= /= %= <<= >>= &= ^= |= Phải qua trái

Chú thích

Các phép toán tên một dòng có cùng thứ tự ưu tiên, các phép toán ở hàng trên có

số ưu tiên cao hơn các số ở hàng dưới

Đối với các phép toán cùng mức ưu tiên thì trình tự tính toán có thể từ trái qua

phải hay ngược lại được chỉ ra trong cột trình tự kết hợp

Chuyển đổi kiểu giá trị

Việc chuyển đổi kiểu giá trị thường diễn ra một cách tự động trong hai trường hợp sau :

Khi gán biểu thức gồm các toán hạng khác kiểu

Khi gán một giá trị kiểu này cho một biến ( hoặc phần tử mảng ) kiểu khác Điều này xảy ra trong toán tử gán, trong việc truyền giá trị các tham số thực sự cho các đối

Ngoài ra, ta có thể chuyển từ một kiểu giá trị sang một kiểu bất kỳ mà ta muốn bằng phép chuyển sau :

(type) <biểu thức>

 Ví dụ 3.11:

(float) (a+b)

Chuyển đổi kiểu trong biểu thức :

Khi hai toán hạng trong một phép toán có kiểu khác nhau thì kiểu thấp hơn sẽ được nâng thành kiểu cao hơn trước khi thực hiện phép toán Kết quả thu được là một giá trị kiểu cao hơn Chẳng hạn :

Giữa int và long thì int chuyển thành long

Giữa int và float thì int chuyển thành float

Giữa float và double thì float chuyển thành double

 Ví dụ 3.12:

1.5*(11/3) = 4.5 1.5*11/3 = 5.5 (11/3)*1.5 = 4.5

Chuyển đổi kiểu thông qua phép gán

Giá trị của vế phải được chuyển sang kiểu vế trái đó là kiểu của kết quả Kiểu int

có thể được được chuyển thành float Kiểu float có thể chuyển thành int do chặt đi phần thập phân Kiểu double chuyển thành float bằng cách làm tròn Kiểu long được chuyển thành int bằng cách cắt bỏ một vài chữ số

 Ví dụ 3.13:

int n;

Trang 26

n=15.6 giá trị của n là 15

Đổi kiểu dạng (type)<biểu thức>

Theo cách này, kiểu của biểu thức được đổi thành kiểu type theo nguyên tắc trên

 Ví dụ 3.14: (int)a : cho một giá trị kiểu int Nếu a là float thì ở đây có sự chuyển

đổi từ float sang int Chú ý rằng bản thân kiểu của a vẫn không bị thay đổi Nói cách khác, a vẫn có kiểu float nhưng (int)a có kiểu int

Đối với hàm toán học của thư viện chuẩn, thì giá trị của đối và giá trị của hàm đều có kiểu double, vì vậy để tính căn bậc hai của một biến nguyên n ta phải dùng phép

ép kiểu để chuyển kiểu int sang double như sau:

sqrt((double)n) Phép ép kiểu có cùng số ưu tiên như các toán tử một ngôi

(int)1.4*10=1*10=10 (int)(1.4*10)=(int)14.0=14

3.9 Các lệnh trong ngôn ngữ C

3.9.1 Lệnh nhập/xuất

Hầu hết mọi CT đều cần dữ liệu đầu vào và đầu ra Thông thường dữ liệu đầu vào được nhập từ bàn phím và dữ liệu đầu ra được xuất lên màn hình Chẳng hạn, trong

CT giải phương trình bậc hai, giá trị các hệ số a, b, c sẽ được nhập vào từ bàn phím

và kết quả nghiệm được xuất ra màn hình Lệnh nhập từ bàn phím là scanf, lệnh xuất ra màn hình là printf, có cú pháp như sau:

scanf (chuỗi định dạng, danh sách địa chỉ các biến);

printf (chuỗi định dạng, danh sách các biểu thức);

Để lấy địa chỉ của biến, ta dùng toán tử “&” trước tên biến

Chuỗi định dạng của câu lệnh nhập (không chứa khoảng trắng và các ký tự phân cách) được cấu thành từ các ký tự chuyển dạng (mỗi ký tự chuyển dạng luôn có ký hiệu „%‟ ở trước) cho trong bảng sau:

Trang 27

x Số nguyên int hệ thập lục phân

s Chuỗi ký tự (không chứa: khoảng trắng, tab, xuống dòng, …)

Các ký tự chuyển dạng trong bảng sau và các ký tự khác (để giúp làm rõ ý nghĩa của dữ liệu xuất) tạo ra chuỗi định dạng cho câu lệnh xuất

d Số nguyên hệ thập phân có dấu

u Số nguyên hệ thập phân không dấu

o Số nguyên hệ bát phân có dấu

c Ký tự

x Số nguyên hệ thập lục phân có dấu (các ký tự trong hệ viết thường)

X Số nguyên hệ thập lục phân có dấu (các ký tự trong hệ viết hoa)

scanf (“%d%f%c", &i, &fp, &c);

printf (“Xuat ra: so nguyen = %d \t, so thuc = %f

\t, ky tu = %c”, i, fp, c);

int a, b;

printf (“a = ? ”); scanf (“%d”, &a);

printf (“b = ? ”); scanf (“%d”, &b);

printf (“%d + %d = %d.\n”, a, b, a+b);

printf (“%d * %d = %d.”, a, b, a*b);

Trang 28

}

Có thể xem lệnh phức là một lệnh duy nhất Từ đây về sau khi viết “lệnh” ta hiểu

đó là lệnh đơn hay lệnh phức; lệnh gán, hay lệnh điều khiển

Sự lồng nhau của các khối lệnh và phạm vi hoạt động của các biến:

Bên trong một khối lệnh lại có thể viết lồng khối lệnh khác Sự lồng nhau theo cách như vậy là không hạn chế

Khi máy bắt đầu làm việc với một khối lệnh thì các biến khai báo bên trong nó mới được hình thành và được cấp phát bộ nhớ Các biến này chỉ tồn tại trong thời gian máy làm việc bên trong khối lệnh và chúng lập tức biến mất ngay sau khi máy ra khỏi khối lệnh Vậy:

Giá trị của một biến khai báo bên trong một khối lệnh không thể đưa ra sử dụng

ở bất kỳ chỗ nào bên ngoài khối lệnh đó

Ở bất kỳ chỗ nào bên ngoài một khối lệnh ta không thể can thiệp đến các biến và các mảng được khai báo bên trong khối lệnh

Nếu bên trong một khối ta dùng một biến có tên là a thì điều này không làm thay đổi giá trị của một biến khác cũng có tên là a (nếu có) được dùng ở đâu đó bên ngoài khối lệnh này

Nếu có một biến đã được khai báo ở ngoài một khối lệnh và không trùng tên với các biến khai báo bên trong khối lệnh này thì biến đó cũng có thể sử dụng cả bên trong cũng như bên ngoài khối lệnh

while

Trang 29

so_lon = a;

if (so_lon < b) so_lon = b;

so_lon = a;

Trang 30

Bài tập: Viết và so sánh các CT tìm số lớn nhất và nhỏ nhất của 4 số a, b, c, d theo hai dạng A, B

 Ví dụ 3.18: CT tìm điểm trung bình lớn nhất của hai học sinh khi biết điểm

Toán, Lý của từng học sinh

 Nhập điểm Toán, Lý của hai học sinh (Toan_1, Ly_1, Toan_2, Ly_2)

 Tính điểm trung bình của hai học sinh (TB_1, TB_2) [xem ví dụ 2.8]

 Xác định điểm trung bình lớn nhất (TB_Lon_Nhat) của TB_1, TB_2 [xem Ví dụ 3.17]

#include …

int main(int argc, char* argv[]) {

float Toan_1, Ly_1, TB_1, Toan_2, Ly_2, TB_2, TB_Lon_Nhat;

printf (“Diem Toan, Ly cua cac hoc sinh”);

scanf (“%f%f%f%f”, &Toan_1, &Ly_1, &Toan_2, &Ly_2);

TB_1 = (Toan_1*HESOTOAN+Ly_1*HESOLY) / (HESOTOAN + HESOLY); TB_2 = (Toan_2*HESOTOAN+Ly_2*HESOLY) / (HESOTOAN + HESOLY); TB_Lon_Nhat = TB_1;

 B: 4 phép so sánh đơn giản

B trong sáng và ngắn gọn hơn A Trong B có

áp dụng chiến lược chia bài toán thành hai bài toán con:

Trang 31

if (TB_Lon_Nhat < TB_2) TB_Lon_Nhat = TB_2;

printf( “Diem trung binh lon nhat = %f”, TB_Lon_Nhat);

getch (); return 0;

}

Từ ví dụ 3.17 và 3.18, ta thấy rằng, để giải quyết một bài toán trong thực tế (thường

phức tạp) cần phải áp dụng chiến lược chia để trị “chia bài toán thành các bài toán con, giải các bài toán con đó, rồi tổng hợp chúng lại” (xem chương 5)

3.9.3.2 Lệnh rẽ nhánh-đôi

 Ví dụ 3.19: Kiểm tra 3 số a, b, c có phải là 3 cạnh của tam giác không?

Bài tập: Cho a, b, c là 3 cạnh của một tam giác Hãy cho biết đó là tam giác gì (thường, vuông, cân, vuông cân hay đều)?

else mặc định được gắn với if (chưa có else) gần nhất Xét 3 đoạn CT được viết bởi

Nếu biểu_thức có giá trị đúng

thì Lệnh_A được thực hiện,

ngược lại (biểu_thức có giá trị

sai) thì Lệnh_B được thực hiện.

if ((a + b > c) && (a + c > b) && (c + b > a))

printf (“3 so %d, %d, %d la 3 canh tam giac.”, a, b, c);

Trang 32

Cả C, D, E đều muốn lệnh “a = a + 1” thực hiện khi a >= 5 Đoạn của C thực hiện

không đúng ý đồ vì else được hiểu với if gần nhất, còn đoạn của D (dùng lệnh phức để

tách else ra khỏi if gần với nó), và E là đúng

Trong nhiều trường hợp các lệnh if lồng nhau có thể được đơn giản hóa bằng phép toán && (và) Chẳng hạn, nên thay if (a < 5) if (a > 1) bằng if ((a < 5) && (a > 1)) Khi phải xét nhiều trường hợp có chung điều kiện, nên dùng các lệnh if lồng nhau

để CT hiệu quả và trong sáng hơn (thấy rõ sự phân cấp các trường hợp)

 Ví dụ 3.20: So sánh 3 đoạn CT F, G, H xác định xếp loại học sinh (Loai) dựa

trên điểm trung bình (DTB) theo quy định: „G‟ (giỏi) nếu 8.0  DTB10.0, „K‟ (khá) nếu 6.5 DTB8.0, „T‟ (trung bình) nếu 5.0 DTB6.5, „Y‟ (yếu) nếu 0.0  DTB5.0

 Số phép so sánh của F lớn hơn của G:

 Để xác định lần lượt xếp loại „Y‟, „T‟, „K‟, „G‟, G cần 1, 2, 3, 3 phép so

Loai = „T‟; else if(DTB<8.0)

Loai = „K‟; else

Trang 33

 Ví dụ 3.21: CT giải phương trình bậc hai ax2 + bx + c = 0, a, b, c là các số thực

#include …

#include "math.h"

int main(int argc, char* argv[])

{

float a, b, c, delta, x1, x2, so_nghiem;

printf (“Nhap cac he so a, b, c \n”);

scanf ( “%f%f%f”, &a, &b, &c);

so_nghiem = 2;

}

if (so_nghiem == 0) printf (“Vo nghiem”);

else printf (“Nghiem cua phuong trinh la: %f, %f.”, x1, x2); getch (); return 0;

Trang 34

sai

đúng đúng

t2  0 đúng x3, 4 =  t2

có_x3, 4 = 1 có_x1, 2 = 0

sai có_x3, 4 = 0

t1  0 hoặc t2  0

t1  0

sai

Xuất “vô nghiệm”

Trang 35

Ý nghĩa: nếu biểu_thức đúng kết quả của lệnh tam phân là giá trị của biểu_thức_1, ngược lại kết quả của lệnh tam phân là giá trị của biểu_thức_2

}

Ý nghĩa

Thực thi Lệnh_i nếu biểu_thức_nguyên có kết quả là giá_trị_i (i =

sai

GT = giá trị N

sai

đúng Lệnh_N;

Lệnh_1;

đúng

Trang 36

Ví dụ 3.22: Tính lương nhân viên dựa vào chức vụ Thuật toán tính lương nhân

viên (Lương) dựa vào chức vụ cv theo bảng dùng cấu trúc rẽ nhiều nhánh

switch (cv)

{

case „G‟: luong = 3; break;

case „T‟: luong = 2; break;

default: luong = 1; break;

}

Trong switch có thể không có default Ví dụ, đoạn CT đổi một chữ số (chu_so) ra

từ tiếng Anh tương ứng:

switch (chu_so)

{

case „0‟: printf (“Zero”); break;

case „1‟: printf (“One”); break;

case „2‟: printf (“Two”); break;

case „3‟: printf (“Three”); break;

case „4‟: printf (“Four”); break;

case „5‟: printf (“Five”); break;

case „6‟: printf (“Six”); break;

case „7‟: printf (“Seven”); break;

case „8‟: printf (“Eight”); break;

case „9‟: printf (“Nine”); break;

}

Bài tập: viết lệnh tính toán +, -, *, / giống máy tính bỏ túi

Trong case có thể không có break Chẳng hạn, nếu không có break ở case „1‟, khi

chạy đoạn CT với chu_so bằng 1 ta có kết quả là One Two Lý do là, sau khi thực hiện printf (“One”); máy tính chuyển xuống thực hiện printf (“Two”); tương ứng với case 2 Tận dụng đặc điểm này, ta có một thể hiện khác của lệnh rẽ nhiều nhánh

Trang 37

Chẳng hạn ta có đoạn lệnh tính số ngày của một tháng trong năm:

if (((nam % 4 == 0) && (nam % 100 != 0)) || (nam % 400 == 0))

so_ngay = 29; // năm nhuần

}

Ý nghĩa Thực thi Lệnh_i nếu biểu_thức_nguyên

có kết quả là gt_ij (j

= 1 mi)

Trang 38

Lưu đồ hoạt động của while

Trang 39

Biểu diễn các cấu trúc lặp bằng các lệnh lặp for, while, do while:

Gọi “Lệnh” là “dãy thao tác cần lặp”, ta có thể biểu diễn các cấu trúc lặp (xác định và không xác định) bằng các lệnh lặp for, while, do while

 Lặp xác định: biết trước số lần lặp

 Lặp không xác định: không biết (khó tính) số lần lặp

Hoạt động của cấu trúc lặp xác-định (trong đó: N là số lần lặp, i là chỉ số của bước lặp hiện tại)

Hoạt động của cấu trúc lặp không xác định

Sai

dãy thao tác cần lặp (phải chứa thao tác biến đổi điều kiện dừng)

Trang 40

 Ví dụ 3.23: Tính tổng giá trị 10 tờ tiền

 Ví dụ 3.24: Tính tổng S = 1 + 3 + 5 + + (2M – 1) với M > 1 cho trước

Trong ví dụ 3.24 ta thấy lệnh i++ Đó là cách viết gọn của lệnh i = i + 1

Ngày đăng: 30/03/2015, 03:10

HÌNH ẢNH LIÊN QUAN

Bảng sau trình bày một số hằng số và hằng ký tự: - Bài giảng Tin học đại cương
Bảng sau trình bày một số hằng số và hằng ký tự: (Trang 22)
Sơ đồ - Bài giảng Tin học đại cương
Sơ đồ (Trang 29)
Sơ đồ - Bài giảng Tin học đại cương
Sơ đồ (Trang 31)
Sơ đồ - Bài giảng Tin học đại cương
Sơ đồ (Trang 35)
Bảng sau trình bày một số kiểu viết tắt các lệnh gán - Bài giảng Tin học đại cương
Bảng sau trình bày một số kiểu viết tắt các lệnh gán (Trang 41)
Hình 4.1 Mảng số nguyên c chứa 12 phần tử - Bài giảng Tin học đại cương
Hình 4.1 Mảng số nguyên c chứa 12 phần tử (Trang 49)
Hình 4.2: Thuật toán tìm phần tử lớn nhất trong một mảng. - Bài giảng Tin học đại cương
Hình 4.2 Thuật toán tìm phần tử lớn nhất trong một mảng (Trang 52)
Hình 4.3: Thuật toán tìm kiếm vị trí của phần tử trong mảng . - Bài giảng Tin học đại cương
Hình 4.3 Thuật toán tìm kiếm vị trí của phần tử trong mảng (Trang 54)
Hình 5.1 Quan hệ ông chủ, công nhân - Bài giảng Tin học đại cương
Hình 5.1 Quan hệ ông chủ, công nhân (Trang 70)
Hình 5.2: Sơ đồ giải bài toán tìm số lớn nhất trong hai số - Bài giảng Tin học đại cương
Hình 5.2 Sơ đồ giải bài toán tìm số lớn nhất trong hai số (Trang 71)
Hình 5.4: Sơ đồ giải bài toán tìm chu vi lớn nhất của chu vi hình chữ nhật, hình vuông - Bài giảng Tin học đại cương
Hình 5.4 Sơ đồ giải bài toán tìm chu vi lớn nhất của chu vi hình chữ nhật, hình vuông (Trang 71)
Hình 5.5.b Sơ đồ hàm tính số ngày của tháng trong năm - Bài giảng Tin học đại cương
Hình 5.5.b Sơ đồ hàm tính số ngày của tháng trong năm (Trang 81)
Hình các số - Bài giảng Tin học đại cương
Hình c ác số (Trang 83)
Hình 5.6 Sơ đồ CT vẽ hình chữ nhật đặc các ký tự - Bài giảng Tin học đại cương
Hình 5.6 Sơ đồ CT vẽ hình chữ nhật đặc các ký tự (Trang 85)
Hình 5.7: Sơ đồ CT tính tổng  1  1 2    n 1 - Bài giảng Tin học đại cương
Hình 5.7 Sơ đồ CT tính tổng 1  1 2    n 1 (Trang 89)

TỪ KHÓA LIÊN QUAN

w