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 1MỤ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 24.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 3CHƯƠ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 41.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ở: az, AZ, 09, {, }, [, ], =, +, 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 51.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 6toá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 71.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 8Hệ 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 10Nguyê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 12CHƯƠ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 14Khố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 15interrupt 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 183.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 19phé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 20Cá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 21tê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 22Cá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 23Dò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 24Cá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 254 + - 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 26n=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 27x 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 29so_lon = a;
if (so_lon < b) so_lon = b;
so_lon = a;
Trang 30Bà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 31if (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 32Cả 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 DTB10.0, „K‟ (khá) nếu 6.5 DTB8.0, „T‟ (trung bình) nếu 5.0 DTB6.5, „Y‟ (yếu) nếu 0.0 DTB5.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 34sai
đú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 37Chẳ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 38Lưu đồ hoạt động của while
Trang 39Biể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