- Các từ khóa: Tin học Đại cương, Tin Đại cương, Lập trình cấu trúc, Ngôn. ngữ lập trình, Ngôn ngữ lập trình C, Kỹ thuật lập trình, Thuật toán, Lập trình C, Sơ đồ khối, Ngôn ngữ C[r]
(1)1
Nguyễn Hiếu Cường – Nguyễn ðức Dư – Hồng Văn Thơng
GIÁO TRÌNH
TIN HỌC ðẠI CƯƠNG
(2)2
MỤC LỤC
LỜI NÓI ðẦU
PHẦN
ðẠI CƯƠNG VỀ TIN HỌC
CHƯƠNG – NHỮNG KHÁI NIỆM CƠ BẢN VỀ TIN HỌC
1.1 ðối tượng nghiên cứu Tin học
1.2 Thông tin xử lý thông tin
1.3 Hệđếm biểu diễn thơng tin máy tính
1.4 Nguyên lý hệ xử lý thơng tin tựđộng
1.5 Cấu trúc máy tính 10
1.6 Một sốứng dụng Tin học 12
CHƯƠNG – HỆðIỀU HÀNH 14
2.1 Hệñiều hành MS-DOS 14
2.2 Hệñiều hành Windows 16
CHƯƠNG – THUẬT TOÁN 21
3.1 Khái niệm 21
3.2 Một số phương pháp biểu diễn thuật toán 21
3.3 Các cấu trúc thuật toán 23
3.4 Một số thuật tốn giải số tốn đơn giản 27
PHẦN 32
NGƠN NGỮ LẬP TRÌNH C 32
CHƯƠNG - MỘT SỐ KHÁI NIỆM MỞðẦU 34
1.1 Tập ký tự 34
1.2 Từ khóa 34
1.3 Tên 35
1.4 Một số khái niệm 35
1.5 Một số chương trình đơn giản 38
1.6 Một số quy tắc cần nhớ viết chương trình 39
1.7 Cách thực chương trình máy tính 40
BÀI TẬP CHƯƠNG 41
CHƯƠNG - CÁC KIỂU DỮ LIỆU 42
2.1 Các kiểu liệu 42
2.2 Hằng 43
2.3 Biến 45
2.4 Mảng 46
2.5 Các phép toán kiểu 48
2.6 Nhập xuất liệu 52
2.7 Một số hàm thường dùng 56
BÀI TẬP CHƯƠNG 57
CHƯƠNG - CÁC LỆNH ðIỀU KHIỂN 58
3.1 Nhắc lại khái niệm câu lệnh khối lệnh 58
3.2 Lệnh if 58
3.3 Lệnh for 61
3.4 Lệnh while 63
3.5 Lệnh - while 65
3.6 Lệnh break 66
3.7 Lệnh continue 66
BÀI TẬP CHƯƠNG 68
CHƯƠNG - HÀM VÀ TỔ CHỨC CHƯƠNG TRÌNH 70
4.1 Tổ chức chương trình thành hàm 70
(3)3
4.3 ðệ quy 79
BÀI TẬP CHƯƠNG 83
CHƯƠNG - CẤU TRÚC 84
5.1 ðịnh nghĩa cấu trúc khai báo biến cấu trúc 84
5.2 Kết hợp ñịnh nghĩa cấu trúc khai báo biến cấu trúc 84
5.3 Sử dụng typedef ñểñịnh nghĩa kiểu liệu cấu trúc 85
5.4 Truy cập thành phần cấu trúc 86
5.5 Ví dụ minh hoạ 86
BÀI TẬP CHƯƠNG 89
PHỤ LỤC - BẢNG MÃ ASCII 91
PHỤ LỤC 93
(4)3
LỜI NÓI ðẦU
Tin học đại cương một mơn học quan trọng chương trình giáo dục đại cương ở bậc đại học Tại hầu hết trường ñại học cao đẳng nước ta hiện nay, mơn học bắt buộc ñối với mọi sinh viên Về mặt nội dung, mức độ ở trường có thể khác nhau, song yêu cầu ngày nâng cao cả về lý thuyết lẫn thực hành
Cuốn Giáo trình Tin học đại cương được biên soạn theo khung chương trình của Bộ Giáo dục ðào tạo dành cho sinh viên ngành kỹ thuật Cấu trúc của giáo trình gồm phần: phần gồm chương trình bày những kiến thức tổng quan về
Tin học, phần trình bày kỹ thuật lập trình căn bản bằng ngơn ngữ C, phần có nhiều ví dụ mẫu tập để sinh viên rèn luyện kỹ năng lập trình máy
Khi biên soạn, chúng tơi đã tham khảo giáo trình tài liệu giảng dạy mơn học của một số trường ñại học ñể cuốn sách vừa ñạt yêu cầu cao về nội dung vừa thích hợp với đơng đảo sinh viên ngành kỹ thuật Chúng tơi cũng thừa hưởng được những kinh nghiệm q có được q trình giảng dạy mơn học của đồng nghiệp tại Trường ðại học Giao thông vận tải
Rất mong nhận được ý kiến đóng góp của độc giả để chất lượng giáo trình ngày tốt hơn
Mọi ý kiến đóng góp xin gửi về: Bộ môn Công nghệ phần mềm, Khoa Công nghệ thông tin, Trường ðại học Giao thông vận tải, Láng Thượng, ðống ða, Hà Nội
(5)4
PHẦN
(6)5
CHƯƠNG – NHỮNG KHÁI NIỆM CƠ BẢN VỀ TIN HỌC
1.1 ðối tượng nghiên cứu của Tin học
Tin học ngành khoa học nghiên cứu cấu trúc, tính chất q trình xử lý thơng tin cách tự ñộng dựa phương tiện kỹ thuật Tin học ngành khoa học trẻ, hình thành phát triển thập kỷ qua ðặc biệt từñầu năm 80 kỷ
trước, với phát triển máy vi tính, mạng máy tính gần mạng Internet, tin học phát triển mạnh trở nên thiếu lĩnh vực ñời sống xã hội
Tin học ñược sinh miền giáp danh nhiều lĩnh vực khoa học Hai ngành khoa học trực tiếp làm móng cho tin học toán học vật lý ðặc trưng quan trọng tin học truyền xử lý thông tin cách tựđộng Việc xử lý thơng tin trước chưa đặt vấn đề tựđộng hóa người ln gắn liền với thao tác q trình xử lý thơng tin ðểđạt phương thức tự động hóa phải có phương tiện kỹ thuật, mà quan trọng máy tính điện tử (MTðT) Phương tiện kỹ thuật vừa cơng cụ vừa đối tượng nghiên cứu tin học
Ngay từ ñời, tin học ñã phát triển theo hai phận hợp thành chủ yếu là: bảo đảm tốn học, thuật tốn, chương trình (gọi phần mềm) thiết bị tính tốn, lưu trữ, truyền dẫn thơng tin (gọi phần cứng) Trong thân phần mềm phần cứng lại có lĩnh vực nghiên cứu chuyên sâu lý thuyết ứng dụng Mặc dù khó phân định xác lĩnh vực nghiên cứu, ứng dụng tin học, nói ñến tin học, người ta thường ñề cập ñến:
- Kỹ thuật chế tạo máy tính - Mạng máy tính
- Kỹ thuật lập trình
- ðảm bảo tốn học cho máy tính hệ thống tính tốn - Thuật tốn độ phức tạp thuật tốn
- Cơ sở liệu - Trí tuệ nhân tạo -
1.2 Thông tin xử lý thông tin
Thông tin theo nghĩa thơng thường đời sống hàng ngày hiểu thông báo, cắt nghĩa, Thông tin tồn nhiều dạng ñược lưu trữ nhờ vật mang tin tờ
báo, sách, băng ghi âm, đĩa từ,
Thơng tin ñối tượng kiện ñối tượng Thơng tin có khả làm thay đổi hiểu biết người, nguồn gốc nhận thức Trước thời điểm nhận thơng tin, có ta chưa biết, chưa xác định (bất định) Chẳng hạn ta biết sinh viên A học
ởðH Giao thông vận tải khoa nào, lớp việc tìm đến sinh viên A có độ bất định Bây giờ, giả sử biết thêm sinh viên A học khoa Công nghệ thơng tin trường, điều làm giảm ñộ bất ñịnh Như tính bất ñịnh ñã thay ñổi nhận thêm thông tin
(7)6
biết thêm A ñạt ñiểm lượng thơng tin bổ sung làm giảm độ bất định Tính bất định kiện lúc ñầu thể (điểm 5, 6, 7, 8, 9, 10) lúc sau (điểm 8) Tính bất định gắn liền với khái niệm xác suất Xác suất nhỏ ñộ bất ñịnh lớn, hay nói cách khác, lượng thông tin tỷ lệ nghịch với xác suất kiện
Thơng tin thường biểu diễn qua ký hiệu Ví dụ, ta có tập đối tượng X cần biểu diễn (tập thí sinh chẳng hạn) Chọn tập hữu hạn Y chữ số làm bảng chữ
cái, ta gọi dãy hữu hạn chữ từ Y (ởñây số báo danh) Với phần tử x ∈ X ta gán từ y ∈Y gọi mã x (Y gọi bảng mã) Phép tạo mã tương
ứng cần ñảm bảo tính chất với x1≠x2 (x1 , x2 ∈X) có y1≠y2 (y1 , y2 ∈ Y) mã tương
ứng chúng Khi biết mã số (số báo danh), phép giải mã ta tìm đối tượng tương ứng (thí sinh)
Thơng tin đưa vào MTðT (để lưu trữ, tính tốn, ) thực chất dãy tín hiệu nhị phân hay cịn gọi bit (binary digit), tương ứng với trạng thái mạch điện tử bên máy tính Vì vậy, xử lý thơng tin tự động, dạng mã quan trọng dùng mã nhị phân Thơng tin ñược mã hóa bảng chữ gồm ký hiệu chữ số chữ số
Ví dụ, với bảng mã ASCII, mã tiêu chuẩn Mỹ, ký tự (chữ cái, chữ số, ký tự ñặc biệt) tương ứng với mã bit Như bảng mã với bit có trạng thái cho phép mã hóa 27=128 ký tự Với bảng mã ANSI, hay gọi ASCII mở rộng, ký tựđược mã hóa bit, lượng ký tự mã hóa 28=256 ký tự Cuối năm 80 kỷ trước, bảng mã UNICODE ñược giới thiệu Bảng mã sử dụng 16 bit
để mã hóa ký tự, nên lượng ký tự mã hóa 216=65536 ký tự Hiện UNICODE trở thành tiêu chuẩn ñược chấp nhận rộng rãi mã hóa ký tự tất ngôn ngữ giới
1.3 Hệđếm biểu diễn thơng tin máy tính
Hệ ñếm ñược hiểu tập ký hiệu tập qui tắc xác ñịnh dùng ñể biểu diễn tính giá trị số Trước hết xét hệ ñếm quen thuộc, ñại diện cho hai cách đếm là: hệđếm La Mã (đếm khơng theo vị trí) hệđếm thập phân (đếm theo vị trí)
Hệ ñếm La Mã: Mỗi ký hiệu biểu thị giá trị (I=1, V=5, X=10, D=500, M=1000) Nó có qui tắc, chẳng hạn: n ký hiệu ñứng cạnh cho biết ký hiệu lặp lại n lần, ví dụ: II=2, III=3, XXX=30; hai ký hiệu ñó ký hiệu lớn ñứng trước biểu thị tổng hai ký hiệu đó, ví dụ: VI=6, XI=11, Như hệ ñếm La Mã, ký hiệu chỉñại diện cho giá trị, không phụ thuộc vào vị trí biểu diễn
Hệ đếm thập phân: Sử dụng 10 ký hiệu (là chữ số: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) Qui tắc tính giá trị: giá trị ký hiệu phụ thuộc vào thân ký hiệu vị trí biểu diễn Ví dụ: số 555, chữ số hàng ñơn vị ñơn vị, chữ số hàng chục 50
ñơn vị (5*101), chữ số hàng trăm 500 ñơn vị (5*102) Số lượng chữ số dùng hệ
thập phân (10 chữ số) gọi số hệñếm Số mũ số 10 xác ñịnh giá trịñịnh lượng ñơn vị
Hệ ñếm thập phân trường hợp riêng chọn số 10 Tổng quát,
một số nguyên b > ñều chọn làm số Lúc ký hiệu hệñếm 0, 1, 2, , b-1
Trong tin học, hệ ñếm thường ñược sử dụng là: hệ số (hệ nhị phân) dùng ký hiệu {0, 1} hệ số dùng ký hiệu {0, 1, 2, 3, 4, 5, 6, 7} hệ số 16 dùng ký hiệu {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F} Khi cần phân biệt số hệđếm nào, ta sử
(8)7
MTðT tác động trực tiếp với số nhị phân, người lại thường làm việc hệ thập phân Vì cần phải có thuật tốn để chuyển đổi số từ hệñếm sang hệ ñếm khác ðể chuyển ñổi số từ hệ ñếm số b1 sang hệ ñếm số b2 , người ta
thường dùng hệ thập phân làm trung gian: chuyển số từ hệ ñếm số b1 sang hệ thập phân,
sau ñó chuyển tiếp số từ hệ thập phân sang hệñếm số b2
1.3.1 Biến ñổi sốở hệñếm bất kỳ sang hệ thập phân:
Cho số N= (dn-1dn-2 d1d0d-1d-2 d-m) hệ ñếm số b ðể tìm biểu diễn N hệ
thập phân, ta tiến hành theo bước: - Viết N dạng ña thức:
N = dn-1 bn-1 + dn-2 bn-2 + + d1 b1 + d0 b0+d-1 b-1 + d-2 b-2 + + d-mb-m
- Sử dụng phép tốn hệ thập phân để tính giá trịđa thức Ví dụ:
1110,12 = 1.23 + 1.22 + 1.21 + 0.20 + 1.2-1 = 14,5
D3F,416 = D.162 + 3.161 + F.160 + 4.16-1
= 13.162 + 3.161 + 15.160 + 4.16-1= 3391,25 1.3.2 Biến ñổi sốở hệ thập phân sang hệñếm cơ số bất kỳ:
Trước hết cần tách phần nguyên phần thập phân (nếu có), tiến hành biến ñổi chúng riêng biệt sang hệñếm số b Sau cách ghép nối kết ta thu giá trị cần tìm
ðể biến đổi phần ngun N, ta chia ngun cho b thương số N1 số dư d1
Sau ñó lại lấy N1 chia nguyên cho b, ñược thương số N2 vào số dư d2, Lặp lại q trình đến thương số Nk=0, ta có kết cần tìm (dk d2d1)
Ví dụ: 5210 = ?2 Ta thực theo thuật toán sau:
Phép chia nguyên Thương số Số dư
52 : 26
26 : 13
13 :
6 :
3 : 1
1 :
Như 5210 = 1101002
Ví dụ: 5850610 = ?16 Ta thực theo thuật toán sau:
Phép chia nguyên Thương số Số dư
58506 : 16 3656 10
3656 : 16 228
228 : 16 14
14 : 16 14
Như 5850610 = E48A16
ðể biến ñổi phần thập phân 0,M ta nhân với b, phần ngun kết d1,
phần thập phân lại sau lấy kết trừđi d1 0,M1 Sau lấy 0,M1 nhân với b, ñược
(9)8
Tiếp tục lặp lại q trình này, có kết thúc lặp vơ hạn, tùy theo u cầu mà định dừng Ta có kết cần tìm (0,d1d2d3 )
Ví dụ: 0,687510 = ?2
Phép nhân Kết Phần nguyên
0,6875 * 1,375
0,375 * 0,75
0,75 * 1,5
0,5 * 1,0
Như vậy: 0,687510 = 0,10112
Từđây suy ra: 52,687510 = 110100,010112
Ví dụ: 0,843510 = ?16
Phép nhân Kết Phần nguyên
0,8435 * 16 13,496 13
0,496 * 16 7,936
0,936 * 16 14,976 14
0,976 * 16 15,616 15
Như vậy: 0,843510 = 0,D7EF 16
Từñây suy ra: 58506,843510 = E48A,D7EF 16
1.3.3 Biểu diễn thơng tin máy tính:
MTðT xử lý liệu số phi số, hai loại liệu ñưa vào máy ñều dãy tín hiệu nhị phân, thường thể chữ số 0, (gọi bit) Theo nghĩa MTðT xử lý liệu số, bit đơn vị thơng tin Sốđược biểu diễn dạng nhị phân dãy bit liên tiếp Các số, ký hiệu, lệnh máy biểu diễn máy tính thơng qua dãy nhị phân với ñộ dài xác ñịnh, gọi từ máy ðộ dài từ máy ñặc trưng họ máy Các độ dài từ máy thơng dụng 8, 16, 32, bit ðộ dài từ máy xác định, dải số biểu diễn ñược bên máy tính hữu hạn
1.4 Ngun lý của hệ xử lý thơng tin tựđộng
1.4.1 Nguyên lý làm việc của máy tính
Von Neumann người ñề xuất nguyên lý làm việc máy tính số, nguyên lý ñược dùng làm sở cho hầu hết MTðT Theo MTðT làm việc theo chương trình có nhớ ðểđảm bảo nguyên tắc này, MTðT cần phải gồm ñủ thành phần bản: nhớđể ghi thơng tin, số học logic để thực tính tốn, bộđiều khiển, thiết bị nhập thiết bị xuất liệu
Máy tính phải thi hành lệnh người dùng đưa vào Một chương trình thực chất chuỗi lệnh, nhằm thực công việc Một tập hợp qui ước
để viết nên dịng lệnh đưa vào máy, cho máy nhận diện thi hành gọi ngôn ngữ Ngôn ngữñược thực trực tiếp dựa qui ước mạch điện tử máy gọi ngơn ngữ
máy Mỗi loại máy có ngơn ngữ riêng Ngơn ngữ máy có ưu điểm máy hiểu ngay, q khác biệt so với ngơn ngữ người, nên việc xây dựng, kiểm thử
(10)9
Từ ñầu năm 60 kỷ trước ñã bắt ñầu xuất ngơn ngữ lập trình (NNLT) bậc cao Gọi ngơn ngữ bậc cao ngơn ngữ thường sử dụng từ
khóa dựa tiếng Anh, có cấu trúc gần gũi với ngôn ngữ người Các NNLT không ngừng phát triển, NNLT ln xuất hiện, ngày hồn thiện đểđáp
ứng nhu cầu ngày cao qui mơ, chất lượng, độ tin cậy, phần mềm Trên thực tế, phát triển ngôn ngữ lập trình gắn liền với phát triển cơng nghệ phần mềm tin học Một chương trình viết NNLT gọi chương trình nguồn Chúng ta cần phải có chương trình dịch cho NNLT để dịch chương trình nguồn NNLT ngơn ngữ máy, MTðT hiểu thực
ðể tựđộng hóa số công việc người vận hành máy, quản lý, khai thác thiết bị phần cứng hiệu hơn, từ năm 1960 người ta ñã xây dựng hệ điều hành cho máy tính Ngày nói đến hệ thống máy tính, ta phải hiểu thiết bị phần cứng hệ điều hành cài đặt Các hệđiều hành ngày phát triển đểđáp ứng nhu cầu khơng có giới hạn người dùng thay ñổi, tiến liên tục phần cứng Một số
hệñiều hành tiêu biểu là: MS-DOS, Windows, Linux, 1.4.2 Lịch sử phát triển của máy tính
Lịch sử kỹ thuật tính tốn có từ lâu đời Cơng cụ tính tốn người
những thứ thơ sơ ngón tay, hịn sỏi, đến bàn tính gảy, máy tính cơ, máy tính điện ðến năm 1946, việc chế tạo thành cơng máy tính ENIAC Mỹđược coi mốc đánh dấu ñời MTðT ñầu tiên giới Từ có MTðT, kỹ thuật tính tốn chuyển sang giai ñoạn
Năm Sự kiện
Trước CN Bàn tính gảy Trung Quốc
1642 Máy tính cơ, làm phép cộng (Blaise Pascal)
1670 Máy tính cơ, làm cộng,trừ,nhân,chia,căn bậc (Leibnitz) 1842 Máy tính lập trình để tính tựđộng (Charles Babbage)
1890 Herman Hollerith thiết kế hệ thống lưu thơng tin bìa đục lỗ, đọc tế bào quang điện, thành lập cơng ty IBM
1946 Máy ENIAC (Eckert, Mauchly), gồm 18000 bóng chân khơng, giá 500000$
1958 Máy tính dùng bóng bán dẫn transitor (IBM 7090) 1964 Máy tính ñầu tiên dùng mạch tích hợp IC (IBM 360) 1976 Hãng DEC giới thiệu máy vi tính VAX 11/780 1981 Hãng IBM đưa máy vi tính IBM PC
Bảng 1.1: Một số mốc lịch sử phát triển máy tính
(11)10
Sự phát triển MTðT từ năm 1946 ñến ñã trải qua nhiều hệ Mỗi hệ bước phát triển lớn ñược xác ñịnh vào tiêu chuẩn kỹ thuật mức ñộ phong phú phần mềm
Thế hệ thứ (khoảng 1946-1955): Dùng bóng đèn điện tử, độ tin cậy thấp, tiêu hao nhiều lượng, tốc độ tính tốn từ vài nghìn đến vài chục nghìn phép tính giây Phần mềm chưa phát triển, chủ yếu dùng ngôn ngữ máy để lập trình Thế hệ MTðT thường dùng mục đích nghiên cứu khoa học
Thế hệ thứ hai (khoảng 1955-1965): Dùng bóng bán dẫn thay ựèn ựiện tử, tiêu thụ lượng hơn, nhớ có dung lượng lớn hơn, tốc ựộ khoảng vài chục nghìn phép tắnh giây bắt ựầu xuất số NNLT bậc cao FORTRAN, COBOL, Vềứng dụng,
ñã bắt ñầu dùng vào mục đích tính tốn quản lý kinh tế, thống kê,
Thế hệ thứ ba (khoảng 1965-1980): Dùng mạch tích hợp thay cho bóng bán dẫn, tốc độ
tính tốn lên đến hàng triệu phép tính giây Các tiến khác phải kểñến: xuất nhiều hệ điều hành tốt hơn, có khả sử dụng nhớ ảo, đa chương trình, thiết bị ngoại vi phát triển mạnh mẽ Phần mềm phát triển ña dạng, ứng dụng nhiều lĩnh vực
Thế hệ thứ tư (khoảng từ sau 1980): Dùng mạch tích hợp cỡ lớn VLSI, phát triển mạng máy tính, kiến trúc song song, tốc độ tính tốn lên đến nhiều triệu, chí hàng tỷ
phép tính giây Vềứng dụng, sử dụng tất lĩnh vực
Dựa kích thước, kiến trúc vật lý, tính năng, tốc độ quy mô xử lý, người ta phân chia MTðT thành loại: Máy tính lớn (mainfraim), máy tính mini (mini computer) máy vi tính (micro computer) Các máy tính lớn có giá thành đắt, thường sử dụng vào lĩnh vực quan trọng, địi hỏi nhiều tính tốn phức tạp Thuộc loại kể đến máy Cray, IBM 3090/300, Gen/Blue, Các máy tính mini có giá thành vừa phải, thích hợp cho mục ñích chuyên dùng Một số máy loại PDP, HP-300, IBM 360, Sun 4, Các máy vi tính xuất từ cuối năm 70 kỷ 20 Các máy vi tính có kích thước nhỏ, giá thành rẻ loại máy trên, nên ñã dần ñược sử dụng rộng rãi, kể công ty nhỏ, trường học, hộ gia đình hay cho cá nhân Chính phiên máy vi tính ñầu tiên hãng IBM ñược gọi máy tính cá nhân (Personal Computer, viết tắt PC) Máy vi tính IBM chiếm thị phần lớn vào đầu năm 1980, nên người ta gần nhưñồng nghĩa từ PC với từ máy vi tính
Cần lưu ý cách phân loại tương ñối, cần quan tâm ñến yếu tố thời gian Nhiều máy vi tính ngày có tính sử dụng vượt xa máy tính lớn vào năm 1970
1.5 Cấu trúc máy tính
Về cấu trúc logic, MTðT gồm phận là: nhớ, số học-logic, bộđiều khiển, thiết bị nhập/xuất liệu ñường truyền dẫn Về tổ chức vật lý, phận đóng gói thành thiết bị sau:
- Bo mạch chủ (Mainboard Motherboard)
- Bộ xử lý trung tâm (Center Processing Unit, viết tắt CPU)
- Bộ nhớ: gồm nhớ (ROM, RAM) nhớ ngồi hay cịn gọi thiết bị lưu trữ (ñĩa từ, ñĩa CD, )
- ðường truyền (Bus) cổng giao tiếp - Bộ nguồn
(12)11
Hình 1.2 Máy vi tính Hình 1.3: Máy tính xách tay (laptop)
Thùng máy (case):
Hầu hết thiết bị MTðT kể ñều ñược ñặt bên thùng máy, trừ số
thiết bị ngoại vi Về hình thức, thường có kiểu thùng máy: ñặt ñứng ñặt nằm ngang Chú ý nhiều người quen gọi thùng máy CPU, gọi sai CPU xử lý trung tâm gắn bo mạch chủ, ñặt bên thùng máy
Bo mạch chủ:
Là thành phần quan trọng MTðT, kết nối phận máy tính với Tất thành phần MTðT ñều ñược cắm trực tiếp, gián tiếp (thông qua cáp) vào bo mạch chủ Bo mạch chủ gồm thành phần chính: ổ cắm xử lý trung tâm (ñể cắm CPU), rãnh cắm nhớ (ñể cắm RAM), BIOS, rãnh cắm cho thiết bị
ngoại vi (ñể cắm cạc hình, cạc mạng, ), cổng giao tiếp với thiết bị ngoại vi,
Hình 1.4: Bên máy vi tính
Bộ xử lý trung tâm (CPU):
Là não MTðT, nói sức mạnh máy tính phụ thuộc chủ yếu vào khả
năng tính tốn CPU Bộ xử lý trung tâm bao gồm số học – logic, bộñiều khiển ghi Bộ số học – logic có chức thực phép tính số học phép tính logic Bộđiều khiển có chức tìm nạp lệnh từ nhớ, ñiều khiển bước thực chương trình Cịn ghi thực chất nhớ tốc độ cao, ghi có chức riêng
CPU có phận tạo xung nhịp đểđiều khiển hoạt động đồng hoạt
ñộng phận khác tồn hệ thống máy tính Tốc độ CPU thể nhịp
(13)12
Hầu hết CPU sử dụng ñược sản xuất hãng tiếng như: Intel, AMD, Motorola
Hình 1.5: Bộ xử lý trung tâm (CPU)
Bộ nhớ
Bộ nhớ dùng để lưu trữ thơng tin ðơn vị đểđo lượng thơng tin byte (viết tắt B) Một byte thực chất dãy bit liên tiếp (8 bit) ðể lưu trữ ký tự nhớ, ta cần byte Trong thực tế, thường sử dụng số ñơn vị bội số byte là: kylobyte (viết tắt KB, KB = 210 B), megabyte (viết tắt MB, MB = 210 KB), gigabyte (viết tắt GB, GB = 210 MB), tetrabyte (viết tắt TB, TB = 210 GB)
Bộ nhớ gồm nhớ chỉñọc (Read Only Memory, viết tắt ROM) nhớ truy nhập ngẫu nhiên (Random Access Memory, viết tắt RAM) ROM chứa số liệu chương trình để máy tính khởi ñộng làm việc ROM ñược hãng sản xuất máy tính ghi sẵn, khơng bị tắt máy ta khơng thể thay đổi liệu ROM
Trên thực tế, nói đến nhớ máy tính người ta thường ngầm hiểu RAM RAM dùng để lưu trữ chương trình tạm thời máy ñang làm việc Chúng ta đọc, ghi, sửa xóa liệu RAM, ñọc ghi ñiện nên tắt máy
điện thơng tin lưu ñó bị hết Bộ nhớ RAM thường ñược tổ chức thành băng (còn gọi RAM), có dung lượng 16 MB, 32 MB, 64 MB, Các RAM ñược cắm bo mạch chủ Trên bo mạch chủ cắm nhiều RAM
Bộ nhớ RAM có tốc độ truy cập cao, khơng lưu liệu sau tắt máy, liệu muốn lưu trữ lâu dài cần phải ghi vào thiết bị lưu trữ Các thiết bị lưu trữ ña dạng, gồm: băng từ, loại ñĩa từ (ñĩa mềm, ñĩa cứng), loại ñĩa quang (ñĩa CD, ñĩa DVD), ñĩa USB (USB Flash Disk),
Hình 1.6: Bộ nhớ RAM
Bộ nguồn
Bộ nguồn chuyển ñổi ñiện lưới xoay chiều thành dòng ñiện chiều ñiện áp thấp (thường khoảng 3v ñến 12v) ñể cung cấp cho phận máy tính
(14)13
Tin học ngày ñã trở thành ñộng lực sản xuất xã hội MTðT khác máy móc khác chỗ gia cơng thơng tin không gia công nguyên vật liệu Sản phẩm MTðT thơng tin hướng dẫn hoạt động thực tiễn Ban ñầu tin học chủ yếu phục vụ vấn ñề khoa học kỹ thuật, người sử dụng chủ yếu nhà chun mơn lĩnh vực Sự phát triển nhanh chóng MTðT mạng Internet cho phép tin học xâm nhập vào lĩnh vực Do phát triển nhanh, mạnh rộng khắp tin học nên khó
để nói hết ứng dụng nó, tóm lược số phần mềm ứng dụng bản, phổ biến
Phầm mềm toán học:
- Mathematica: phần mềm cho phép tính tốn từ đơn giản tính tốn số
học đến phức tạp hơn, như: tốn đa thức, đại số tuyến tính, tìm giới hạn, tìm đạo hàm, tính tích phân, giải phương trình vi phân, khai triển Taylor, Ngồi phần mềm cịn cho phép vẽ biểu đồ đồ thị
- Matlab: phần mềm thực tính tốn tương tự
Mathematica Ngồi Matlab cịn dùng kỹ thuật đồ họa chiều để thiết kế mơ hình khoa học kỹ thuật làm đoạn phim hoạt hình đơn giản
Phần mềm văn phòng:
Bộ phần mềm văn phịng tiếng nhất, có mặt hầu hết máy tính Microsoft Office Trong phần mềm có chương trình:
- Word: ñể soạn thảo, lưu trữ, sửa chữa, in ấn văn
- Excel: ñể tạo lập, lưu trữ, sửa chữa, in ấn bảng tính, ví dụ: bảng lương, bảng thống kê bán hàng,
- PowerPoint: ñể tạo lập báo cáo (slide) trình bày báo cáo - Access: hệ quản trị sở liệu
- FrontPage: ñể xây dựng trang Web
- Outlook: ñể trao ñổi, quản lý thưñiện tử, lập lịch làm việc, Phần mềm thiết kế:
- AutoCAD: ñể tạo lập quản lý vẽ kỹ thuật - Soap: để tính tốn kế cấu ổn định lực học
- 3D Max: công cụ mạnh, có hỗ trợ multimedia để phục vụ cho công tác thiết kế
CÂU HỎI CHƯƠNG
Câu 1: Kể tên lĩnh vực nghiên cứu Tin học? Thơng tin máy tính lưu trữ, tính tốn theo hệđếm nào?
Câu 2: Chuyển giá trị A =1001001 từ hệñếm sang hệñếm 10? Chuyển giá trị B
=32456,4235 từ hệñếm 10 sang hệñếm 2? Chuyển giá trị C=100100010 từ hệñếm sang hệñếm 8?
(15)14
CHƯƠNG – HỆ ðIỀU HÀNH
Hệ ñiều hành (HðH) tập hợp chương trình đặc biệt dùng để tổ chức, phối hợp hoạt
ñộng thiết bị phần cứng, tạo môi trường làm việc cho chương trình ứng dụng giao tiếp với người dùng HðH phần mềm thiếu máy tính HðH tựđộng tải vào nhớ sau khởi động máy tính
Hiện có nhiều HðH cho hệ máy khác Số lượng HðH cho máy vi tính khơng ít, giới Việt Nam từ trước tới sử dụng phổ
biến HðH hãng Microsoft MS-DOS Windows
2.1 Hệñiều hành MS-DOS
Một HðH cho máy vi tính MS-DOS (Microsoft Disk Operating System), thường gọi tắt DOS MS-DOS ñã phát triển qua nhiều phiên từ 1.0
ñến 6.0 dần ñược thay HðH Windows Tuy nhiên, nhiều tư tưởng qui ñịnh DOS áp dụng Windows Ngồi ra, có nhiều phần mềm ñược viết từ HðH Windows chưa phổ biến, chúng chạy ñược DOS, nên Windows cho phép tạo mơi trường DOS ảo, giống dùng MS-DOS để chạy ñược phần mềm cũ
2.1.1 Một số khái niệm
Tệp tin (file): tập hợp thơng tin tổ chức lưu trữ thành đơn vịđộc lập Có hai loại tệp tin là: tệp tin liệu tệp tin chương trình Mỗi tệp tin có tên, gồm phần,
được phân cách dấu chấm (.) là: phần tên phần mở rộng ðặt tên tệp tin DOS phải tuân theo số qui tắc: phần tên không ký tự, phần mở rộng không ký tự
và không chứa dấu cách ký tựñặc biệt
Thư mục (directory): ðể tạo dễ dàng thuận lợi việc quản lý truy xuất ñến tệp tin, DOS cho phép tổ chức tệp tin thành nhóm, gọi thư mục Có thể ví thư
mục tủ hồ sơñể chứa hồ sơ tệp tin Trong thư mục tạo thư
mục Thư mục mà bên khơng có thư mục khơng có tệp tin gọi thư mục rỗng Thư mục hành thư mục mà ta làm việc, thể dấu nhắc DOS Tên thư mục khơng ñặt ký tự
Dựa khái niệm thư mục, DOS tổ chức liệu ñĩa cách logic dạng hình cây, với “gốc” ổ ñĩa, phân chia tiếp thư mục, từ thư mục đến thư
mục nó, cuối “lá” tệp tin Cách tổ chức liệu ñĩa HðH Windows tương tự vậy, có điều Windows đặt tên tệp tin tên thư
mục với ñộ dài lớn hơn, bao gồm dấu cách
ðường dẫn: ðể truy cập ñến thư mục hay tệp tin ta phải nằm ởđâu tính từ thư mục hành Các thơng tin trình bày cách liệt kê tên thư mục tệp tin, hai thư mục tệp tin sử dụng dấu sổ chéo (\) Dãy thư mục tệp tin gọi
đường dẫn Nếu phải xác ñịnh thư mục tệp tin ởổ ñĩa khác với ổ đĩa hành cần tên ổđĩa, kèm theo dấu hai chấm (:) Tên ổñĩa thường ký hiệu A cho ổñĩa mềm, C, D cho ổñĩa cứng,
Ví dụ đường dẫn: C:\GIAOTRINH\THDC\CHUONG1.DOC
(16)15 2.1.2 Một số qui ước
Một lệnh DOS ñược viết bắt ñầu từ dấu nhắc DOS hình Giữa phần lệnh phần thơng tin phía sau phải có dấu cách Trong lệnh DOS không phân biệt chữ hoa chữ thường Sau viết xong lệnh, gõ phím Enter để thực lệnh
Trong cách viết lệnh sau ñây, phần ñặt dấu < dấu > bắt buộc phải có, khơng lệnh sai cú pháp, cịn phần đặt dấu [ ] phần lựa chọn, tùy theo yêu cầu mà có cần sử dụng hay khơng
2.1.3 Một số lệnh làm việc với thư mục: 1) Tạo thư mục mới:
MD [ñường dẫn] <tên thư mục> <ENTER>
Trong đó: [đường dẫn] tên ổ ñĩa, tên thư mục ñể xác ñịnh thư mục cần làm việc, tức thư mục mà ta tạo thư mục nó, <tên thư mục> tên thư mục cần tạo, <ENTER> gõ phím Enter bàn phím
Ví dụ ổđĩa C hành có thư mục GIAOTRINH, cần tạo thư mục có tên VANPHONG:
MD GIAOTRINH\VANPHONG <ENTER> 2) Xóa thư mục rỗng:
RD [đường dẫn] <tên thư mục> <ENTER> 3) Chuyển ñến thư mục:
CD [ñường dẫn] <tên thư mục> <ENTER>
Thư mục sau ñược chuyển ñến trở thành thư mục hành Chuyển ñến thư mục cha:
CD <ENTER>
Chuyển ñến thư mục gốc: CD\ <ENTER> 4) Xem nội dung thư mục:
DIR [ñường dẫn] [tên thư mục] [/p] <ENTER>
Nếu dùng DIR ta xem nội dung thư mục hành: có thư
mục nào, tệp tin nào, kích thước tệp tin byte Tham số /p ñể xem trang hình, dùng số lượng tệp tin thư mục cần xem lớn
2.1.4 Một số lệnh làm việc với tệp tin 1) Xóa tệp tin:
DEL [ñường dẫn] <tên tệp tin> <ENTER>
ðể xác ñịnh tên tệp tin cần rõ tên phần mở rộng Có thể sử dụng ký tựđại diện
để xóa lúc nhiều tệp tin có chung tính chất
Ví dụ: xóa tất tệp tin có phần mở rộng TMP thư mục THDC DEL GIAOTRINH\THDC\*.TMP <ENTER>
(17)16
REN [ñường dẫn] <tên tệp tin> <tên mới> <ENTER> 3) Sao chép tệp tin:
COPY <Nguồn> <đắch> <ENTER>
Trong ựó phần <Nguồn> cần tệp tin cần chép phần <đắch> ổựĩa thư mục chép tệp tin vào
2.2 Hệñiều hành Windows
2.2.1 Một sốñặc ñiểm
HðH Windows bước phát triển MS-DOS Khác biệt dễ nhận thấy Windows so với DOS có giao diện đồ họa, với thực đơn (menu), cửa sổ biểu tượng Các thao tác Windows trực quan dễ dàng, người sử dụng không cần phải nhớ gõ dòng lệnh DOS Windows có q trình phát triển dài, từ
giữa năm 80 kỷ 20, thay DOS trở thành HðH ñược sử dụng nhiều giới
Những phiên ñược sử dụng rộng rãi ñầu tiên Windows 3.0 Windows 3.1 Các phiên ñược sử dụng phổ biến Windows 98, Windows 2000, Windows XP Nếu máy tính cài đặt HðH Windows, sau khởi ñộng máy, Windows tựñộng nạp chạy
Sau ñăng nhập, xuất hình (desktop) Windows (các ví dụởđây phiên Windows XP) Mỗi biểu tượng hình thường đại diện cho chương trình Muốn thực chương trình ta nháy đúp chuột vào biểu tượng Chúng ta tạo biểu tượng (shortcut) hình cho tệp tin hay thư mục cần thường xuyên dùng tới Thanh tác vụ (taskbar) phía hình cho biết ứng dụng
ñang thực
(18)17
Hình 2.1: Màn hình desktop của Windows XP
(19)18
Hình 2.4: Sau chọn Log Off Hình 2.5: Sau chọn Turn Off Computer Con chuột thiết bị giao tiếp chủ yếu dùng giao diện đồ họa Con chuột thường có hai phím: phím trái phím phải Một số thao tác với chuột là:
- Bấm chuột (hoặc gọi nháy chuột, kích đơn, ) thao tác ấn vào nút trái chuột, dùng ñể chọn ñối tượng
- Bấm chuột phải thao tác ấn vào nút phải chuột, thường dùng để kích hoạt bảng chọn tức thời (bảng chọn gồm chức phụ thuộc vào ngữ
cảnh)
- Bấm đúp chuột (hoặc cịn gọi nháy kép, kích ñúp, ) thao tác bấm nhanh lần liên tiếp phím trái chuột, thường dùng để kích hoạt ñối tượng ñó - Thao tác kéo-thả: bấm giữ phím trái chuột, kéo chuột tới vị trí dự ñịnh, nhả
phím bấm Thao tác dùng ñể di chuyển vị trí hay thay ñổi kích thước
đối tượng
Hình 2.6: Bảng chọn tức thời
(20)19
Hình 2.7: Windows Explorer
2.2.2 Các thao tác Windows Explorer Hiển thị nội dung:
Phía bên trái hình Windows Explorer tổ chức thư mục, cách tổ chức giống nhưở DOS Khi chọn thư mục (bằng cách bấm chuột vào nó) danh sách tệp tin thư mục xuất bên phải hình Ta xếp xem tệp tin theo nhiều cách khác (theo tên, theo kiểu, ) cách bấm chuột phải
màn hình bên phải, chọn Arrange Icons By, sau chọn cách xếp tương ứng
Hình 2.8: Chọn cách sắp xếp biểu tượng tệp tin ðóng mở thư mục:
ðể mở thư mục: bấm chọn biểu tượng dấu cộng , đểđóng thư mục: bấm chọn biểu tượng dấu trừ
Chọn ñối tượng (tệp tin thư mục):
(21)20
Sao chép ựối tượng (các tệp tin thư mục từ thư mục nguồn sang thư mục ựắch): Tìm ựến thư mục nguồn, nơi chứa ựối tượng đánh dấu chọn ựối tượng cần chép Bấm chuột phải ựể mở bảng chọn tức thời, chọn Copy Cuối tìm ựến thư mục ựắch, bấm chuột phải, chọn Paste bảng chọn tức thời Nếu muốn thay chép, ta chuyển ựối tượng từ thư mục nguồn sang thư mục ựắch (ựối tượng ựó khơng cịn thư mục nguồn), việc thay Copy Cut
Hình 2.9: Bảng chọn Copy Hình 2.10: Bảng chọn Paste ðổi tên tệp tin, thư mục:
Chọn ñối tượng (tệp tin thư mục), bấm chuột phải vào ñối tượng, chọn chức Rename bảng chọn, cuối gõ tên
Xóa tệp tin, thư mục:
Chọn ñối tượng (tệp tin thư mục), bấm chuột phải vào ñối tượng, chọn chức Delete bảng chọn hoặc gõ phím Delete bàn phím Chú ý: tệp tin, thư mục sau thực thao tác khơng bị xóa hẳn, mà bịđưa vào thùng rác Nếu muốn phục hồi ta cần vào thùng rác, chọn tệp tin, thư mục cần phục hồi, bấm chuột phải, chọn Restore Nếu muốn xóa hẳn tệp tin, thư mục nào, ta cần giữ phím Shift chọn chức Delete
Hình 2.11: Biểu tượng thùng rác
Thao tác Windows Explorer chủ yếu sử dụng chuột, thao tác ñơn giản, nên tận dụng thêm khả kéo-thả Chẳng hạn ñể chép tệp tin vào thư mục
đó, ta có thểđánh dấu chọn tệp tin kéo thả vào thư mục đích ðể xóa tệp tin, ta bấm chọn tệp tin đó, kéo thả vào biểu tượng thùng rác
Chúng giới thiệu ởđây số kiến thức nhất, khả HðH Windows phong phú, ñề cập hết giáo trình Tuy nhiên với giao diện
ñồ họa, trực quan, việc tự học làm chủ thao tác, khai thác chức khác Windows sau ñã nắm ñược kiến thức hồn tồn khơng khó
CÂU HỎI CHƯƠNG Câu 1: Nêu khái niệm HðH? Kể tên số HðH?
Câu 2: Quy tắc ñặt tên File hệñiều hành DOS? Nêu lệnh làm việc với thư mục, lệnh làm việc với tệp tin?
(22)21
CHƯƠNG – THUẬT TOÁN
3.1 Khái niệm
Thuât toán một dãy quy tắc, nhằm xác ñịnh dãy thao tác ñối tượng (dữ liệu ñầu vào) cho sau số hữu hạn bước thực thao tác ta đạt
được mục tiêu cần làm (dữ liệu kết tốn)
Ví dụ: Thuật tốn tìm ước số chung lớn (USCLN) hai số nguyên dương a,b - Input: a,b hai số nguyên dương
- Output: ƯSCLN a, b Có thể mơ tả thuật tốn sau: Bước 1: Tìm số dư r phép chia a cho b Bước 2: Kiểm tra:
- Nếu r = thơng báo b USCLN kết thúc
- Nếu r<>0 thực đặt a=b, b=r quay lại làm lại Bước
Thuật toán gồm thao tác tính số dư r, kiểm tra r<>0?, r<>0 ñặt a=b, b=r Các ñặc trưng thuật toán
- Thuật toán phải có tính dừng: Thuật tốn phải kết thúc sau số hữu hạn bước - Tính xác định: Ở bước thao tác phải rõ ràng, không gây nhập nhằng, tùy
chọn
- ðại lượng vào: Mỗi thuật tốn phải có nhiều liệu đầu vào
- ðại lượng ra: Sau kết thúc thuật tốn ta thu sốđại lượng kết tốn
- Tính hiệu quả: Mỗi tốn có nhiều thuật tốn khác để giải Một thuật tốn tốt phải đơn giản, tiết kiệm nhớ thời gian thực - Tính phổ dụng: Thuật tốn giải số tốn lớp
tốn
- Tính hình thức hóa: Thuật tốn phải hình thức cài ñặt ñược máy tính
3.2 Một số phương pháp biểu diễn thuật tốn
Máy tính sử dụng cơng cụ để hỗ trợ người giải toán thực tế Bản thân máy tính vật vơ chi vơ giác, khơng có tư Do đó, thân khơng thể tự giải tốn thực tếđược, mà thực lệnh, người bảo làm thơng qua ngơn ngữ lập trình Vì để máy giúp giải tốn ta cần phải cài đặt thuật tốn giải tốn ñó cho máy, theo ñó máy thực giải tốn ðể cài đặt thuật tốn cho máy người cài đặt phải có thuật tốn giải tốn
Có nhiều cách biểu diễn thuật tốn nhưđặc tả tự nhiên (liệt kê bước), sơñồ khối, giả
(23)22
Sử dụng ngôn ngữ tự nhiên để biểu diễn thuật tốn cách bước cần thực thuật tốn
Ví dụ: Thuật tốn giải phương trình bậc 2: ax2+bxc=0 với hệ số a, b, c số thực, a≠ Bước 1: Xác ñịnh hệ số a=?, b=?, c=? phương trình
Bước 2: Tính ∆ = b2 - 4ac Bước 3: Kiểm tra ∆:
- Nếu ∆ < kết luận phương trình vơ nghiệm
- Nếu ∆ = kết luận phương trình có nghiệp kép x1=x2=-b/(2a)
- Nếu ∆>0 kết luận phương trình có nghiệm x1=(-b + ∆ )/(2a); x2=(-b- ∆ )/(2a)
3.2.2 Sử dụng sơđồ khối
Sử dụng hệ thống kí hiệu để biểu diễn thuật tốn Một số ký hiệu sử dụng biểu diễn thuật toán:
STT Ký hiệu Ý nghĩa ký hiệu
1 Ký hiệu bắt ñầu thuật toán
2 Ký hiệu kết thúc thuật toán
3 Ký hiệu nhập liệu vào
4 Ký hiệu xuất liệu
5
Ký hiệu rẽ nhánh
Nếu Bt Lơgíc có giá trị ðúng thực theo nhánh ð Nếu Bt Lơgíc có giá trị Sai thực
hiện theo nhánh S
6
Ký hiệu vòng lặp với số lần xác
ñịnh trước
Thực cơng việc A n lần, ban
đầu Biến ñược gán 1, sau lần lặp biến tăng lên đơn vị
7 Kí hiệu khối thao tác
thực công việc A
8 Kí hiệu gọi chương trình A
thực
A Biến=1, 2, ,n Bt Lơgíc
S
ð
A A
Input:
Output: begin
(24)23
Kí hiệu hướng thực thuật toán
Bảng 3.1: Một số ký hiệu dùng vẽ sơđồ khối Ví dụ: Biểu diễn thuật tốn giải phương trình bậc sơñồ khối
Sơñồ khối biểu diễn thuật giải phương trình bậc hai ax2+bx+c=0, a≠0, a, b, c, x ∈ R
Nhận xét: Sử dụng sơñồ khối ñể biểu diễn thuật tốn có ưu điểm trực quan, dễ hiểu, dễ kiểm tra, có số nhược ñiểm phải vẽ nhiều, cồng kềnh, không thuận lợi cho toán phức tạp Phương pháp chủ yếu sử dụng cho người lập trình để biểu diễn thuật tốn đơn giản (ít thao tác)
3.3 Các cấu trúc cơ bản của thuật toán
Khi mơ tả thuật tốn ta sử dụng cấu trúc sau để mơ tả - Cấu trúc
- Cấu trúc rẽ nhánh - Cấu trúc lặp 3.3.1 Cấu trúc tuần tự
Khái niệm: Cấu trúc cấu trúc bao gồm nhiều bước Các bước ñược xếp theo trật tự định Khi máy thực thực theo thứ tự bước ñã
ñược xếp
Trong biểu diễn thuật toán phương pháp đặc tả tự nhiên bước xếp Trong đặc tảđó bước thực trước bước thực sau
S
Begin
Input: a, b, c
Delta = b2 – 4ac
Output: Pt có nghiệm x1, x2 Delta <
Output: Pt vô nghiệm
Delta =
x = -b/2a
Output: Pt Có nghiệm kép x
1 ( ) /(2 )
2 ( ) /(2 )
x b Delta a
x b Delta a
= − + = − −
ð
End
S
(25)24
Ví du: ðặc tả thuật tốn giải phương trình bậc hai ví dụ mục 3.2.1 thứ tự thực bước là: thực bước 1, sau thực xong bước thực bước sau thực xong bước thực bước
Trong biểu diễn thuật tốn sơđồ khối trình tự thực thuật tốn thực theo chiều mũi tên
Ví du: Tính diện tích, chu vi hình trịn bán kính r Sơđồ khối mơ tả thuật tốn giải tốn trên:
3.3.2 Cấu trúc rẽ nhánh
Khái niệm: Cấu trúc rẽ nhánh cấu trúc báo cho máy cần kiểm tra điều kiện tốn Ở ñây kết ñiều kiện kiểm tra nhận hai giá trịñúng (ð) sai (S) Nếu kết kiểm tra có giá trịđúng thực theo nhánh ñúng, sai
thực theo nhánh sai
Biểu thức điều kiện biểu thức lơgíc Sơđồ khối thể hiện cấu trúc rẽ nhánh
Ví dụ: Giải phương trình bậc ax + b = Sơñồ khối thể thuật toán:
Input: r
S = πr2 C = 2πr
Output: S, C begin
End
Biểu thức Lơgíc
ð
(26)25 3.3.3 Cấu trúc lặp
Trong lập trình có hai dạng cấu trúc lặp: cấu trúc lặp xác định trước cấu trúc lặp khơng xác ñịnh trước
Cấu trúc lặp xác ñịnh:
Khái niệm: Cấu trúc lặp xác ñinh trước cấu trúc báo cho máy lặp ñi lặp lại miền tác động với số lần lặp xác ñịnh trước
Trong miền tác ñộng bao gồm tập cấu trúc Sơñồ khối thể cấu trúc
Cấu trúc lặp khơng xác định:
Khái niệm: Cấu trúc lặp khơng xác định cấu trúc báo cho máy lặp ñi lặp lại miền tác động với số lần lặp khơng xác định trước ðiều kiện kết thúc vịng lặp biểu thức lơgíc
Input :a, b
a =
b =
Output: Pt vô số nghiệm
ð
Ouput: Pt vô nghiệm
x = -b/a
Output: x
S
S
ð
begin
end
Biến = 1, 2, n
(27)26
Trong miền tác động bao gồm tập cấu trúc Sơñồ khối thể cấu trúc
Ví dụ: Tìm số tự nhiên n nhỏ để tổng s = 2.5
1
1+ + + + ≥
n
Giải: Theo u cầu tốn cần tìm n nhỏ để s ≥ 2.5 ðể tìm n ta thực theo thuật toán sau:
Sử dụng phương pháp đặc tả tự nhiên mơ tả thuật tốn: Bước Khởi tạo giá trị ban ñầu n = 0, s =
Bước Tăng giá trị n lên ñơn vị (n = n + 1), tính s = s +1 n
Bước Kiểm tra: Nếu s >= 2.5 dừng lại ta có n giá trị cần tìm Nếu s < 2.5 quay lại thực lại bước Sử dụng sơđồ khối mơ tả thuật tốn
s = 0, n =
s < 2.5
s = s + 1/n n = n +1
ð
S
s, n begin
end Miền tác ñộng
Miền tác ñộng Biểu thức lơgíc
Biểu thức lơgíc
ð
S
ð
S
(28)27
3.4 Một số thuật toán giải một số toán đơn giản
3.4.1 Bài tốn đếm
Bài toán: Cho một dãy n phần tử a1, a2,…, an Hãy đếm xem dãy có
phần tử thoả mãn điều kiện
Một cách tự nhiên để giải tốn trên, ta thực duyệt qua phần tử Với phần tử thoả mãn điều kiện tăng biến đếm lên đơn vị
Thuật tốn
Bước Xác ñịnh n phần tử a1, a2, an
Bước Khởi tạo biến ñếm với giá trị
Bước Thực duyệt qua phần tử Với phần tửñược duyệt, thực kiểm tra xem có thoả mãn điều kiện tốn khơng? Nếu thoả mãn tăng biến ñếm lên
ñơn vị Nếu không thoả mãn duyệt phần tử Mơ tả thuật tốn bằng sơđồ khối
Ví dụ 1: Cho dãy n số nguyên ðếm xem dãy có số chẵn Thuật toán
Sử dụng phương pháp đặc tả tự nhiên mơ tả thuật tốn
n
i = 1, 2, , n
ai
Dem =
i = 1, 2, , n
Bt Lơgíc
Dem
S
ð
Dem = Dem +1 Begin
(29)28 Bước Xác ñịnh n phần tử a1, a2, an
Bước Khởi tạo biến ñếm với giá trị
Bước Thực duyệt qua phần tử Với phần tửñược duyệt, thực kiểm tra: Nếu chia hết cho tăng biến đếm lên ñơn vị Ngược lại, duyệt phần tử tiếp
theo
Sử dụng sơđồ khối mơ tả thuật tốn
Mơ tả thuật tốn đếm số chẵn một dãy số
3.4.2 Bài tốn tìm giá trị lớn nhất, giá trị nhỏ nhất
Trong sống thực tế, hàng ngày phải tìm giá trị lớn nhất, nhỏ tập phần tử Ví dụ tìm người có chiều cao cao (thấp nhất) lớp; tìm sinh viên có điểm tổng kết cao (thấp nhất) lớp, khoa, trường,… Như
vậy có thuật tốn giải tốn cài đặt máy tính để máy giải giúp thực ứng dụng có ích Bài tốn cụ thểđược phát biểu sau:
Bài tốn: Cho một dãy n số Hãy tìm giá trị lớn (nhỏ nhất) dãy sốđó
ðể tìm giá trị lớn (nhỏ nhất) phần tử dãy Ta thực so sánh phần tử dãy với tìm giá trị mong muốn Q trình tìm thể thuật tốn sau
Thuật tốn
Sử dụng phương pháp đặc tả tự nhiên mơt tả thuật tốn Bước Xác định n số a1, a2, …, an
Bươc Sử dụng Max lưu giá trị lớn Giả sử giá trị lớn a1 (tức Max = a1)
Bước Duyệt qua phần tử a2, a3, …, an So sánh giá trị phần tử với
Max Nếu > Max (i=2 n) gán giá trị cho Max (Max = ai) Nếu < Max chuyển
xét phần tử
Giá trị cuối lưu Max giá trị lớn dãy số
Input: n
i = 1, 2, , n
Input:
Dem =
i = 1, 2, , n
aiM
Dem = Dem +1
Output: Dem
S
ð
Begin
(30)29 Sử dụng sơđồ khối mơ tả thuật tốn
Thuật tốn tìm giá trị lớn nhất của một dãy số
ðối với tốn tìm giá trị nhỏ tương tự, phép so sánh ta phải thay dấu “<” dấu “>” thay tên Max thành Min ñể phù hợp với ý nghĩa kết lưu
Một số tốn qui về tốn tìm max, Bài Cho tọa ñộ dãy n ñiểm { }
1
, n
i i i
x y = mặt phẳng Tìm diện tích đường trịn tâm O(0,0) có bán kính nhỏ chứa n điểm
Gợi ý: Bài toán qui về tốn tìm Max Bài Cho tọa độ dãy n ñiểm { }
1
, n
i i i
x y = mặt phẳng Tìm hình chữ nhật có diện tích nhỏ cạnh song song với trục toạñộ chứa n điểm
Gợi ý: Bài tốn qui về tốn tìm cả Min Max
3.4.3 Bài tốn tính tổng một dãy số
Bài tốn: Cho dãy n số Tính tổng tất phần tử dãy Thuật toán
Sử dụng phương pháp đặc tả tự nhiên mơ tả thuật tốn Bước Xác định n, a1, a2, …, an
Bước Khởi tạo S =
Bước Duyệt qua phần tử dãy số Với phần tử dãy thực S = S +
Sau duyệt qua hết phần tử ta ñược tổng dãy lưu S Sử dụng sơđồ khối mơ tả thuật tốn
i = 2, 3, , n Input: n
i = 1, 2, , n
Input:
Max = a1
Max<ai
Output: Max
S
ð
Max =
Begin
(31)30 Một số toán qui về tốn tính tổng
Bài Tính giá trị đa thực Pn(x) = a0 + a1x + a2x2 + … +anxn
Bài Tính tổng theo công thức (công thức tổng quát dạng S = f(x) + ∑ = n i i x g ) , ( )
Ví dụ 1: Cho x số thực, n số nguyên dương Tính
S = ex + x + + x +
+ … + 1 n x n + +
Ví dụ 2: Cho x số thực, n số nguyên dương Tính S = | x+ (1+x)3 + (2+x)3 + … +(n+x)3| Ví dụ 3: Cho x số thực, n số nguyên dương Tính
1
2006 ( 1)
1! 2! !
n
x x x n
s
n
+ + +
= − + − + − Ví dụ 4: Cho x số thực, n số nguyên dương Tính
2 2006 2! ! n x x S x n = + + + +
Ví dụ 5: Cho n điểm mặt phẳng tọa ñộ ðề xOy: M1, M2, Mn Tính độ dài đường gấp khúc qua ñiểm theo thứ tự từ M1ñến Mn ?
Input: n
i = 1, 2, , n
Input:
S =
i = 1, 2, , n
S = S +
Output: S Begin
(32)31 3.4.4 Bài tốn tính tích một dãy số
Bài tốn: Cho dãy n số Tính tích tất phần tử dãy
Thuật tốn tính tích dãy số tương tự thuật tốn tính tổng Tuy nhiên khác với thuật tốn tính tổng khởi gán cho đại lượng lưu trữ tích thay khởi gán thay phép + phép * (nhân)
Các tốn qui về thuật tốn tính tích Bài Cho số tự nhiên n Tính S = n!
Bài Cho số thực x, số tự nhiên n Tính S = xn
CÂU HỎI CHƯƠNG
Vẽ sơđồ khối thể thuật tốn giải toán sau:
Bài 1: Cho số nguyên dương n Hãy kiểm tra xem n có số nguyên tố không? Bài 2: Cho số nguyên dương m n Tìm ước chung lớn số?
Bài 3: Cho dãy số nguyên a1, a2, an Hãy đếm xem có phần tử liên tiếp
dãy theo thứ tự tạo thành cấp số cộng?
Bài 4: Cho dãy số thực x1, x2, xn Hãy tính trung bình cộng phần tử dãy có giá trị
thuộc ñoạn [-6,9]?
(33)32
PHẦN
(34)33
Một số giới thiệu mởđầu về Ngơn ngữ lập trình C
Vào năm 1970 từ ngôn ngữ cũ gọi BCPL, Dennis Ritchie Brian Kernighan ñã đưa ngơn ngữ C với mục đích ban đầu viết Hệñiều hành Unix máy mini DEC PDP-11 Sau C nhanh chóng sử dụng máy tính PC Năm 1987 hãng Borland cung cấp phần mềm Turbo C - chương trình dịch hiệu quả, tiện lợi, nhờđó việc dùng ngơn ngữ C trở nên dễ dàng Trong trình phát triển ñã xuất nhiều phiên C khác ðể tiến tới thống nhất, năm 1990 ANSI [1] ñã xây dựng ngôn ngữ C chuẩn (ANSI C) C ngơn ngữ lập trình cấu trúc tiêu biểu có tốc
ựộ xử lý nhanh, có công cụ mạnh ựể quản lý nhớ thiết bị ngoại vi có nhiều sản phẩm phầm mềm lĩnh vực viết C hệựiều hành, ứng dụng xử lý
ñồ hoạ, ña phương tiện, xử lý văn bản, sở liệu, mạng, C khơng ngừng phát triển, từ C nghiên cứu ngơn ngữ tân tiến khác C++, C Windows, Visual C++, Java Chính C đưa vào giảng dạy cho tất khoa công nghệ
thông tin nhiều khoa chuyên ngành kỹ thuật khác Trong vài năm gần Trường ðại học Giao thơng Vận tải đưa ngơn ngữ C vào giảng dạy chương trình Tin học ðại cương
Trong phần II này, cung cấp kiến thức sở Turbo C Các vấn
ñề lý thuyết ñược giải thích tỉ mỉ minh hoạ nhiều ví dụ Các câu lệnh phức tạp
được giới thiệu từ dễ đến khó Thường lệnh điều khiển viết theo nhiều dạng Các ví dụ tập giúp người ñọc luyện tập cách vận dụng câu lệnh để viết chương trình
Phần II gồm chương 02 phụ lục
Chương 1: việc giới thiệu khái niệm cịn đưa số chương trình C
ñơn giản cách thực chúng máy ñể giúp người ñọc mau chóng tiếp cận với máy tính Chương 2: trình bày kiểu liệu, cách biểu diễn giá trị liệu cách tổ
chức (lưu trữ) liệu biến mảng
Chương 3: nói lớp tốn tử quan trọng dùng để thể thuật tốn , tốn tử rẽ nhánh if, tốn tử tạo lập chu trình (vịng lặp) for, while, - while
Chương 4: trình bày cách tổ chức chương trình thành hàm, quy tắc xây dựng sử dụng hàm Các vấn đề hay khó ởñây trỏ kỹ thuật ñệ quy
Chương 5: nói kiểu liệu quan trọng cấu trúc (tương tự ghi Foxpro Pascal) dùng ñể biểu diễn ñối tượng thường gặp thí sinh, học sinh, giáo viên, hố đơn bán hàng, phiếu xuất nhập vật tư, cơng văn ñến,
Phụ lục 1: trình bày bảng mã ASCII
(35)34
CHƯƠNG - MỘT SỐ KHÁI NIỆM MỞ ðẦU
Chương giới thiệu thành phần ngôn ngữ lập trình C, là: tập ký tự, từ khóa tên ðể lập chương trình đầy đủ, chúng tơi trình bày đơi
ñiều câu lệnh gán, câu lệnh vào ra, thị #include qui tắc cần lưu ý viết chương trình Ngồi để giúp bạn đọc mau chóng tiếp cận với máy, chúng tơi giới thiệu vài chương trình đơn giản hồn chỉnh cách vận hành chúng máy ñể nhận ñược kết cuối Tất điều nói bổ ích đáng ghi nhớ chúng thường xuyên sử dụng sau ðọc xong chương bạn lập số chương trình
đơn giản, biết cách thực chương trình mơi trường Turbo C 2.0 Turbo C++ 3.0
1.1 Tập ký tự
Mọi ngơn ngữ lập trình ñều ñược xây dựng từ ký tự ñó Các ký tựñược nhóm lại theo nhiều cách khác để lập lên từ ðến lượt mình, từ lại ñược liên kết theo qui tắc để tạo thành câu lệnh Một chương trình bao gồm nhiều câu lệnh diễn ñạt thuật tốn để giải tốn Ngơn ngữ C ñược xây dựng ký tự
sau:
26 chữ hoa: A B C Z 26 chữ thường: a b c z 10 chữ số:
Các ký hiệu toán học như: + - * / = ( )
Ký tự gạch nối: _ ( chú ý: phân biệt với dấu - )
Các ký hiệu ñặc biệt khác như: ,;: [] {} ?! \ & | % # $ ,
Dấu cách (space) thực khoảng trống dùng ñể tách từ Ví dụ HA NOI gồm ký tự, HANOI gồm ký tự
Chú ý: Khi viết chương trình ta khơng sử dụng ký hiệu khác tập ký tự nói
Chẳng hạn giải phương trình bậc hai: ax2 + bx + c =
ta cần tính biểu thức:
∆ = b2 - 4ac
Ký tự ∆ không cho phép dùng ngôn ngữ C, ta phải dùng cách ký hiệu khác d hay delta
1.2 Từ khóa
Từ khóa từđược định nghĩa trước có ý nghĩa hồn tồn xác định Chúng thường ñược sử dụng ñể khai báo kiểu liệu, để viết tốn tử câu lệnh Sau
đây từ khóa TURBO C:
asm break case cdecl char const continue default
(36)35
extern far float for
goto huge if int
interrupt long near pascal register return short signed sizeof static struct switch typedef union unsigned void volatile while
Ý nghĩa cách sử dụng chúng ñược giới thiệu mục sau Ởñây
cần nhớ hai điều:
- Khơng dùng từ khóa đểđặt tên cho hằng, biến, mảng, hàm,
- Từ khóa phải viết chữ thường Chẳng hạn khơng viết iNT mà phải viết int
1.3 Tên
Tên khái niệm quan trọng, dùng để xác định đối tượng khác 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 trỏ, tên cấu trúc, tên nhãn,
Việc ñặt tên phải tuân theo số quy tắc: tên dãy ký tự gồm chữ, số dấu gạch nối Ký tự đầu tên khơng số Tên khơng trùng với từ khóa (xem 1.2) ðộ dài cực ñại tên ñối với mơi trường Turbo C mặc định 32 ký tự
Các ví dụđúng tên:
a_1 BETA x1 delta_7 _x1 Các ví dụ sai tên:
3XYZ_7 (Ký tựñầu tiên số) r#3 (sử dụng ký tự # )
f(x) (sử dụng dấu ngoặc tròn) case (trùng với từ khóa )
be ta (sử dụng khoảng trống) X-1 (sử dụng dấu gạch ngang)
Chú ý: Trong tên, chữ hoa chữ thường ñược xem khác nhau, tên AB khác tên ab
1.4 Một số khái niệm
1.4.1 Biến
Biến ñại lượng dùng ñể chứa (lưu trữ) giá trị trình tính tốn Có thể hiểu khái niệm biến ởđây giống khái niệm biến toán học
(37)36
int a,b,c; /* khai báo biến a, b, c kiểu int */ float x,y,z; /* khai báo biến x,y,z kiểu float */
Sự khác biến kiểu int biến kiểu float chỗ: biến kiểu int luôn nhận giá trị ngun q trình tính tốn cịn biến kiểu float nhận giá trị số
thực 1.4.2 Hằng
Hằng ñại lựong có giá trị khơng đổi chương trình Khái niệm sẽñược ñề
cập chi tiết 2.2 1.4.3 Toán tử gán
Câu lệnh gán nói kỹ chương Ởđây ta hiểu tốn tử gán có dạng: b = bt;
Trong b biến, cịn bt biểu thức tốn học Tác dụng câu lệnh là: trước tiên tính biểu thức bt sau gán giá trị tính cho biến b
Ví dụ: Sau thực đoạn chương trình: float x;
x = 10.5; x = 2*x - 2.5;
biến x nhận giá trị 18.5
Chú ý: khái niệm gán không giống khái niệm ñẳng thức toán học 1.4.4 Câu lệnh khối lệnh
Mỗi câu lệnh thực chức (cơng việc) đó, viết nhiều dòng phải kết thúc dấu;
Ví dụ:
clsrcr();
printf("Hello");
Khối lệnh dãy câu lệnh ñược bao cặp dấu { } Ví dụ:
{
int a,b; a=2; b=3;
printf ("\n%6d%6d",a,b); }
Chú ý: Về mặt cú pháp, C xem khối lệnh câu lệnh riêng lẻ Nói cách khác chỗ viết câu lệnh ởđó có quyền đặt khối lệnh
Khai báo ởđầu khối lệnh
Các khai báo biến, mảng(1) đặt đầu hàm, viết đầu khối lệnh, ví dụ:
{
int a,b,c[50];
(1)
(38)37 float x,y,z,t[20][30];
a = 3; b = 5; x = 5.7; y=a*x; z=b*x;
printf ("\ny=%8.2f\nz=%8.2f",y,z); }
Sự lồng của khối lệnh
Bên khối lệnh lại viết khối lệnh khác Số khối lệnh lồng không hạn chế
Phạm vi hoạt ñộng của biến mảng
Khi gặp khai báo biến mảng, máy cấp phát nhớ cho biến mảng Các biến tồn khối lệnh mà biến ñược khai báo, ñi kết thúc khối lệnh
Từđó rút số kết luận sau:
- Giá trị biến hay mảng khai báo bên khối lệnh khơng thể đưa để sử dụng chỗ bên ngồi khối lệnh
- Từ bên ngồi khối lệnh, khơng thể can thiệp ñến biến mảng ñược khai báo bên khối lệnh
Về khối lệnh lồng
Ta khai báo hai biến hàm tên, khối lệnh bên trong, hai biến hai biến độc lập tên
Ví dụ xét ñoạn chương trình: {
int a=5; {
int a=4;
printf ("a = %d\n", a); }
printf("a = %d\n", a); }
ðoạn chương trình có hai lệnh printf giống nhau, in giá trị a, hai biến a khác nhau, kết quảñưa là:
a = a =
Biến a bên trùng tên với biến a bên ngồi, lệnh printf bên in giá trị
của biến a khối lệnh bên trong, hay nói cách khác, khối lệnh bên trong, biến a bên
đã “che”2 biến a bên ngồi 1.4.5 Chú thích
Trong chương trình, ngồi câu lệnh, ta đưa thêm vào lời thích Các thích khơng ảnh hưởng đến kết họat động chương trình, có tác dụng người đọc chương trình
Các lời giải thích cần đặt dấu /* dấu */ có thểđược viết: - Trên dịng
- Trên nhiều dòng
2
(39)38 - Trên phần lại dịng
Trong TC 3.0 ta dùng dấu // để thích Phần thích dấu // đến cuối dịng
Ví dụ:
clrscr(); // xố hình
printf(“Hello”); // in hình dịng chữ Hello
1.5 Một số chương trình đơn giản
Dưới ví dụ nhằm minh hoạ cấu trúc chương trình C ðộc giả dễ dàng hiểu câu lệnh qua giải thích viết dấu /* */
Ví dụ Viết chương trình cho lên hình hai dịng chữ: TURBO C HAN HANH
LAM QUEN VOI BAN
Dưới ñây hai chương trình thực u cầu đề /* Chương trình in hai dịng chữ - Bản */
#include <stdio.h> /* sử dụng thư viện vào chuẩn */ #include <conio.h>
void main () /* hàm */ {
/* Xuống dịng (\n) in: TURBO C HAN HANH */ printf("\nTURBO C HAN HANH");
/* Xuống dòng in: LAM QUEN VOI BAN */ printf("\nLAM QUEN VOI BAN");
getch(); /* Tạm dừng máy ñể xem kết */ }
Phiên sau ghép hai câu lệnh printf thành câu lệnh /* Chương trình in dòng chữ - Bản */
#include "stdio.h" /* sử dụng thư viện vào chuẩn */ #include "conio.h"
void main () /* hàm */ {
/*
Xuống dòng, in: TURBO C HAN HANH,
tiếp tục xuống dòng in: LAM QUEN VOI BAN */
printf("\nTURBO C HAN HANH\nLAM QUEN VOI BAN"); getch(); /* Tạm dừng máy ñể xem kết */ }
Nhận xét: Mỗi cậu lệnh printf in dịng Câu lệnh printf in hai dịng
Ví dụ Chương trình tính chu vi diện tích hình trịn theo giá trị bán kính r nhập từ bàn phím
#include "stdio.h" #include "conio.h"
#include "math.h" /*Sử dụng thêm thư viện hàm toán học*/ void main()
{
float r,cv,dt; /* Khai báo biến thực */
/* ðưa man hình thơng báo yêu cầu nhập số liệu */ printf("\nBan kinh r= ");
/* Nhập giá trị thực ñưa vào biến r */ scanf("%f",&r);
(40)39
Dùng M_PI (PI) ñã ñịnh nghĩa math.h */
cv = 2*M_PI*r; dt = M_PI*r*r; /* In kết */
printf("\nChu vi=%10.2f\nDien tich=%10.2f",cv,dt); getch(); /* Tạm dừng máy ñể xem kết */
}
Ví dụ 3: Tính x luỹ thừa y
/* chuong trinh tinh x luy thua y */ #include "stdio.h"
#include "math.h" void main () {
float x,y,z; // khai bao ba bien kieu float printf("\n vao x va y ");
scanf("%f%f",&x,&y); // vao x, y tu ban phim z=pow(x,y); // tinh z = x ^ y
/* in ket qua tren dong */
printf("\nx = %f\ny = %f\nz = %f", x, y, z); }
Ví dụ 4: Minh hoạ khả đưa
/* chuong trinh minh hoa cac kha nang dua */ #include "stdio.h"
void main() {
int a,c,t; float b,d;
a = 123; c = -4685; t = 12; b = -45.855; d = 123.425;
printf("\nChuc cac ban may man \n");
printf("Tong san luong hang nam tang %d %",t); /* giua cac so dua khong co khoang cach */ printf("\n%d%f%d%f",a,b,c,d);
/* giua cac so dua co nhung khoang */ printf("\n%d %f %d %f",a,b,c,d);
/* giua cac so co dat them cac ky tu khac */ printf("\na = %d, b = %f, c=%d, d=%f", a,b,c,d); }
Kết thực chương trình: Chuc cac ban may man
Tong san luong hang nam tang 12 % 123-45.855000-4685123.425000
123 -45.855000 -4685 123.425000 a = 123, b = -45.85, c = -4685, d = 123.43
1.6 Một số quy tắc cần nhớ viết chương trình
Bây vừa giải thích đơi điều ví dụ trên, vừa rút số ý viết chương trình
Quy tắc đầu tiên cần nhớ là: Mỗi câu lệnh viết hay nhiều dịng phải
được kết thúc dấu;
Nhìn vào ví dụ 1.5 ta thấy: + Câu lệnh printf ñược viết dịng
(41)40
Một điểm cần lưu ý ñây cách viết xâu ký tự (dãy ký tự ñặt hai dấu nháy kép) nhiều dòng ðể báo cho TURBO C biết chuỗi ký tự tiếp tục
dịng dưới, ta đặt thêm dấu \ trước xuống dịng Ví dụ: printf("\nTURBO C HAN HANH\
\nLAM QUEN VOI BAN");
Quy tắc thứ hai quy tắc viết lời giải thích Các lời giải thích cần ñược ñặt dấu /* dấu */ có thểđược viết:
- Trên dịng - Trên nhiều dòng
- Trên phần lại dịng
Những lời giải thích khơng có tác dụng ñối với làm việc chương trình máy tính Chúng có tác dụng người đọc
Qui tắc thứ ba qui tắc sử dụng hàm chuẩn Trong chương trình có dùng hàm chuẩn printf Hàm có tệp stdio.h (trong thư mục C), đầu chương trình cần viết:
#include "stdio.h"
Ta ý rằng: cuối dịng khơng có dấu ; cuối câu lệnh
Tóm lại trước sử dụng hàm cần biết nằm tệp phải dùng tốn tử
#include để gắn tệp vào tệp chương trình ta
Qui tắc thứ tư nói cấu trúc chương trình Một chương trình có hàm (main) ví dụ trên, thêm vài hàm khác ðiều trình bày chi tiết chương Tại ta xem cấu trúc chương trình sau:
1.7 Cách thực hiện chương trình máy tính
Phần việc cịn lại sau có chương trình thực chương trình máy tính để
nhận kết cuối ðây phần việc có tính chất tác nghiệp địi hỏi suy nghĩ sáng tạo so với cơng việc lập trình Q trình vận hành chương trình máy tính bao gồm bước sau:
- Tạo tệp chương trình gốc C soạn thảo chương trình - Dịch chạy chương trình
#include ……
khai báo biến, mảng tồn cục nếu có khai báo xây dựng hàm nếu có void main()
{
lệnh… }
(42)41
Dưới ñây trình bày cách sử dụng phần mềm TC2.0 (Turbo C 2.0) TC++3.0 (Turbo C++ 3.0) ñể thực chương trình Chúng ta thấy trình tự thao tác ñơn giản tượng tự (ñối với TC2.0 TC++3.0)
Thực hiện chương trình TC2.0
Giả sử TC2.0 ñược cài ñặt thư mục C:\TC
Soạn thảo chương trình: Vào mơi trường TC2.0 cách khởi ñộng tệp TC.EXE thư mục C:\TC Khi ñó nhận menu TC2.0 gồm menu: File, Edit, Run, Compile, Project, Option, Debug Break/Watch
Chọn menu File, mục New ñể nhận cửa sổ soạn thảo Dùng bàn phím để soạn thảo chương trình cửa sổ này, sau dùng phím F2 (hoặc chọn File - Save) để ghi chương trình lên tệp
Dịch chạy chương trình: Bấm đồng thời phím Ctrl F9, chọn menu Run, mục Run
Thực hiện chương trình TC++3.0
Giả sử TC++3.0 ñã ñược cài ñặt thư mục C:\TC++
Soạn thảo chương trình: Vào mơi trường TC++3.0 cách khởi động tệp TC.EXE thư mục C:\TC++\BIN Khi nhận menu TC++3.0 gồm menu: File, Edit, Search, Run, Compile, Debug, Project, Option, Window Help
Chọn menu File, mục New ñể nhận cửa sổ soạn thảo Dùng bàn phím để soạn thảo chương trình cửa sổ này, sau dùng phím F2 (hoặc chọn File - Save) để ghi chương trình lên tệp
Dịch chạy chương trình: Bấm đồng thời phím Ctrl F9, chọn menu Run, mục Run
BÀI TẬP CHƯƠNG
Bài Thực chương trình viết mục 1.5 máy ðối chiếu kết nêu sách với kết nhận
Bài Lập chương trình tính tích số thực nạp từ bàn phím, sau thực chương trình máy (dùng dấu * ñể biểu thị phép nhân)
Bài Cho biết lương kỳ hai cán tính theo cơng thức: lk2 = bl *n−t
26 540 *
(43)42
CHƯƠNG - CÁC KIỂU DỮ LIỆU
Kiểu liệu biến hay khái niệm dạng thông tin biến hay Ví dụ biến có kiểu ngun dùng ñể lưu giá trị nguyên, biến kiểu thực dùng ñể lưu giá trị thực
2.1 Các kiểu dữ liệu cơ bản
Trong chương này, tìm hiểu số kiểu liệu ñược ñịnh nghĩa Turbo C, bao gồm kiểu nguyên kiểu thực
2.1.1 Các kiểu số nguyên
Tuỳ yêu cầu cụ thể mà sử dụng kiểu số nguyên có phạm vi biểu diễn khác Bảng sau kiểu số nguyên phạm vi biểu diễn tương ứng
Kiểu Phạm vi biểu diễn Kích thước
char -128 → 127 byte
int -32768 → 32767 byte
long long int -2147483648→2147483647 byte
Tương ứng với kiểu số nguyên có dấu kiểu số nguyên không dấu Các kiểu số
nguyên không dấu ñược thành lập cách thêm từ khoá unsigned vào trước kiểu số nguyên có dấu tương ứng Bảng sau kiểu số nguyên không dấu:
Kiểu Phạm vi biểu diễn Kích thước
unsigned char → 255 byte
unsigned int → 65535 byte
unsigned long → 4294967295 byte
2.1.2 Các kiểu số thực
Kiểu số thực, hay kiểu dấu phẩy ñộng dùng ñể lưu giá trị thực Trong C cho phép sử
dụng ba kiểu dấu phẩy ñộng float, double long double Kích cỡ phạm vi biểu diễn chúng ñược bảng ñây:
Kiểu Phạm vi biểu diễn Số chữ số có nghĩa Kích thước (byte)
float 3.4E-38 → 3.4E+38 7-8
double 1.7E-308 → 1.7E+308 15-16
long double 3.4E-4932 → 1.1E4932 17-18 10
Giải thích: Máy có thể lưu trữ số kiểu float có giá trị tuyệt đối từ 3.4E-38 đến 3.4E+38 Số có giá trị tuyệt đối nhỏ 3.4E-38 ñược xem Phạm vi biểu diễn số
double ñược hiểu theo nghĩa tương tự
(44)43
ðể biểu diễn ký tự, người ta dùng số nguyên lưu mã ký tựđó bảng mã Với bảng mã ASCII3, ký tựñược biểu diễn số nguyên bit
Ví dụ:
Ký tự Mã ASCII
0 48
1 49
2 50
A 65
B 66
a 97
b 98
Bảng mã ASCII gồm 256 ký tự, phân thành nhóm:
- Nhóm ký tự điều khiển có mã từ đến 31 Chẳng hạn ký tự mã 13 dùng ñể
chuyển trỏ vềñầu dòng, ký tự 10 chuyển trỏ xuống dòng (trên cột) Các ký tự nhóm nói chung khơng hiển thị hình
- Nhóm ký tự văn có mã từ 32 đến 126 Các ký tự đưa hình máy in
- Nhóm ký tựđồ hoạ có mã số từ 127 đến 255 Các ký tự đưa hình khơng in ñược (bằng lệnh DOS)
Kiểu ñúng sai
Trong TC quy định rằng, biểu thức có giá trị khác ñúng ngược lại biểu thức có giá trị sai
2.2 Hằng
Hằng ñại lượng mà giá trị khơng thay đổi q trình tính tốn Dưới
đây trình bày cách biểu diễn C 2.2.1 Hằng số thực (float double)
Hằng số thực (hằng có giá trị thực) hay gọi Hằng dấu phẩy ñộng Hằng dấu phẩy ñộng
ñược viết theo hai cách:
Cách (dạng thập phân): Số gồm phần nguyên, dấu chấm thập phân phần thập phân, ví dụ:
214.35 -4563.48 234.0
Chú ý: Phần nguyên phần thập phân vắng mặt dấu chấm khơng thể
thiếu, ví dụ cho phép viết: 34 15
Cách (dạng khoa học hay dạng mũ): Sốñược tách thành phần ñịnh trị phần bậc Phần ñịnh trị số nguyên số thực dạng thập phân, phần bậc số nguyên Hai phần cách ký tự e E Ví dụ:
123.456E-4 (biểu diễn giá trị 0.0123456) 0.12E3 (biểu diễn giá trị 120.0)
3
(45)44 -49.5e-2 (biểu diễn giá trị -0.495) 1e8 (biểu diễn giá trị 100000000.0) 2.2.2 Hằng số nguyên kiểu int
Là số nguyên (hằng có giá trị nguyên) có giá trị khoảng từ -32768 đến 32767 Ví dụ:
-45 4007 635
Chú ý: phân biệt 125 125.0 Số 125 nguyên 125.0 thực (dấu phảy
ñộng)
2.2.3 Hằng kiểu long
Hằng kiểu long ñược biểu diễn cách thêm L l vào cuối giá trị nguyên Ví dụ:
-4893L -4893l
Một số ngun vượt ngồi miền xác định int ñược xem kiểu long Ví dụ:
4563946L 4563946 hai kiểu long có giá trị 2.2.4 Biểu diễn hằng nguyên hệ
Có thể biểu diễn số nguyên theo hệ số cách ñặt số ởđầu, chữ số phía sau phải nằm khoảng từ ñến Hằng nguyên hệ ln ln nhận giá trị
dương Ví dụ: 0345
là nguyên hệ Giá trị hệ 10 3*8*8 + 4*8 + = 229
2.2.5 Biểu diễn hằng nguyên hệ 16
Hệ số 16 cần 16 ký tựđể biểu diễn chữ số, ngồi giá trị từ đến 9, cịn dùng ký tự từ a (hoặc A) ñến f (hoặc F) ñể biểu diễn Hằng biểu diễn hệ 16 bắt ñầu 0x 0X
Ví dụ:
0xa9 , 0Xa9 , 0xA9, 0XA9
Các biểu diễn giá trị, hệ 10 là: 10*16 + = 169
2.2.6 Biểu diễn hằng nguyên dạng ký tự
Có thể biểu diễn giá trị nguyên khoảng từ ñến 255 ký tựđặt cặp dấu nháy đơn, giá trị mã ASCII ký tựđó
Ví dụ:
(46)45 'a' tương ñương với 97
ðể biểu diễn số ñặc biệt, người ta dùng cách biểu diễn với dấu \ Bảng sau
ra cách biểu diễn số ñặc biệt:
Cách viết Ký tự
'\'' '
'\"' "
'\\' \
'\n' \n (chuyển dòng) '\0' \0 (null)
'\t' Tab
'\b' Backspace
'\r' CR (vềđầu dịng) '\f' LF (sang trang)
2.2.7 Hằng xâu ký tự
Hằng xâu ký tự dùng ñể biểu diễn dãy ký tự, ký tựđược đặt hai dấu nháy kép, ví dụ:
"Ha noi" "Hai phong" "" /* xâu rỗng */
Xâu ký tựñược lưu trữ máy dạng mảng có phần tử ký tự riêng biệt Trình biên dịch tựđộng thêm ký tự \0 vào cuối xâu (ký tự \0 ñược xem dấu hiệu kết thúc xâu ký tự)
Chú ý: Cần phân biệt 'a' "a", 'a' nguyên ñược lưu trữ byte, cịn "a" xâu ký tựđược lưu trữ mảng hai phần tử: phần tử thứ chứa mã chữ a phần tử thứ hai chứa \0
2.2.8 ðặt tên cho hằng
Một số có ý nghĩa định trước, ví dụ số pi Trong trường hợp này, có thểđặt cho tên, thay viết trực tiếp ta dùng tên biểu thức ðểñặt tên cho hằng, dùng thị #define
Ví dụ:
#define MAX 1000 #define PI 3.141593
Khi ñã ñặt tên cho hằng, sử dụng chúng biểu thức, ví dụ: float r, s;
r = 5.0f; s = PI*r*r;
2.3 Biến
2.3.1 Khai báo
(47)46
<kiểu dữ liệu> <danh_sách_tên_biến>;
Tên biến ñược ñặt theo quy tắc ñặt tên TC ñược nêu 1.3, biến danh sách ñược phân biệt dấu phẩy “,” Kiểu liệu kiểu ñã nêu 2.1, kiểu người lập trình tạo trước khai báo biến
2.3.2 Vị trí của khai báo biến
Các khai báo cần ñặt sau dấu { ñầu tiên thân hàm khối lệnh cần
ñứng trước câu lệnh khác Như vậy, sau câu lệnh gán chẳng hạn khơng khai báo Sau ví dụ sai vị trí khai báo
#include <stdio.h> void main ()
{
int a; a = 35;
int d; /* Vị trí khai báo sai */ d = a * 2;
printf(“%d”, d); }
2.3.3 Việc khởi ñầu cho biến
Nếu khai báo, sau tên biến ta ñặt dấu = giá trị cách vừa khai báo vừa khởi ñầu cho biến
Ví dụ:
int a, b = 20, c ,d = 40;
float e = -35.1, x = 23.0, y, z, t = 36.1;
Tất nhiên ñiều đạt nhờ tốn tử gán, thực tế hai cách tương
ñương Vậy đểđạt ý định ví dụ ta dùng câu lệnh: int a, b, c, d;
float e, x, y, z ,t;
b = 20; d = 40; e = -35.1; x = 23.0; t = 36.1;
2.3.4 Cấp phát bộ nhớ cho biến
Khi thực chương trình, máy gặp khai báo biến thực việc cấp phát nhớ cho biến gồm số byte liên tiếp tùy thuộc vào kiểu liệu biến Ví dụ
như biến kiểu int cấp phát hai byte nhớ, biến kiểu float ñược cấp phát byte
nhớ…
2.3.5 Lấy ñịa chỉ của biến
Mỗi biến ñược cấp phát vùng nhớ gồm số byte liên tiếp Số hiệu byte đầu địa biến ðịa biến dùng số hàm, hàm scanf ðể nhận ñịa biến ta dùng phép toán:
& tên_biến
2.4 Mảng
2.4.1 Khái niệm về mảng, cách khai báo
(48)47
Mảng hiểu tập hợp nhiều phần tử có kiểu giá trị có chung tên Mỗi phần tử mảng có vai trị biến chứa giá trị Có kiểu biến có nhiêu kiểu mảng Mảng cần ñược khai báo ñểñịnh rõ:
- Kiểu mảng (int, float double, ) - Tên mảng
- Số chiều kích thước chiều
Khái niệm kiểu mảng tên mảng giống khái niệm kiểu biến tên biến,
điều nói mục Ta giải thích khái niệm số chiều kích thước chiều thơng qua ví dụ sau Các khai báo:
int a[10], b[4][2]; float x[5], y[3][3];
sẽ xác ñịnh mảng: a, b, x y Ý nghĩa chúng sau:
- ðối với mảng thứ kiểu int, tên a, số chiều một, kích thước 10 Mảng có 10 phần tửñược ñánh số sau:
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
Mỗi phần tử a[i] chứa ñược giá trị kiểu int mảng a biểu diễn dãy 10 số nguyên
- ðối với mảng thứ hai kiểu int, tên b, số chiều Kích thước chiều Mảng có phần tử, chúng đánh số ñược xếp sau:
b[0][0] b[0][1] b[1][0] b[1][1] b[2][0] b[2][1] b[3][0] b[3][1]
Mỗi phần tử b[i][j] chứa ñược giá trị kiểu int mảng b biểu diễn bảng số ngun dòng, cột
- ðối với mảng thứ ba kiểu float, tên x, số chiều một, kích thước Mảng có phần tửđược ñánh số sau:
x[0], x[1], x[2], x[3], x[4]
Mỗi phần tử x[i] chứa ñược giá trị kiểu float mảng x biểu diễn dãy số thực
- ðối với mảng thứ kiểu float, tên y, số chiều 2, kích thước chiều Mảng có phần tử, chúng đánh số ñược xếp sau:
y[0][0] y[0][1] y[0][2] y[1][0] y[1][1] y[1][2] y[2][0] y[2][1] y[2][2]
Mỗi phần tử y[i][j] chứa ñược giá trị kiểu float, mảng y biểu diễn
được bảng số thực dòng, cột Chú ý:
- Các phần tử mảng ñược cấp phát khoảng nhớ liên tiếp nhớ Nói cách khác, phần tử mảng có địa liên tiếp
(49)48
Một phần tử cụ thể mảng ñược xác ñịnh nhờ số Chỉ số mảng phải có giá trị int khơng vượt q kích thước chiều tương ứng Số số phải số chiều mảng
Giả sử a, b, x, y ñã ñược khai báo giả sử i, j biến nguyên i=2, j=1 Khi đó:
a[j+i-1] a[2] b[j+i][2-i] b[3][0] x[j/i] x[0] y[i][j] y[2][1] Các cách viết sau sai:
y[j] y mảng hai chiều, cần hai số
b[i][j][1] b mảng hai chiều, cần hai số
2.4.3 Lấy ñịa chỉ phần tử mảng
Dưới nói mảng ta hiểu mảng chiều Mảng có từ hai chiều trở lên ta nói mảng kèm số chiều (ví dụ mảng hai chiều, ) Có vài hạn chế mảng nhiều chiều Chẳng hạn lấy địa phần tử mảng chiều, nói chung khơng cho phép lấy
ñịa phần tử mảng nhiều chiều Như máy chấp nhận phép tính: &a[i]
nhưng khơng chấp nhận phép tính &y[i][j]
2.5 Các phép tốn kiểu
2.5.1 Biểu thức
Biểu thức kết hợp phép toán tốn hạng để diễn đạt cơng thức tốn học Khi viết biểu thức nên dùng dấu ngoặc trịn để thể
đúng trình tự tính tốn biểu thức Mỗi biểu thức có giá trị Hằng, biến, phần tử
mảng hàm ñược xem biểu thức Trong C ñưa nhiều quan niệm 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 thực Trong mệnh ñề logic, biểu thức ñược phân thành ñúng (giá trị khác không) sai (giá trị 0)
2.5.2 Phép toán số học
Các phép tốn hai ngơi số học là:
Phép tốn Ý nghĩa Ví dụ
+ Cộng a + b
- Trừ a - b
* Nhân a * b
/ Chia a / b
% Lấy phần dư a % b
Có phép tốn ngơi - ví dụ -(a+b) khơng có phép +
Phép chia hai số nguyên chặt cắt phần thập phân (kết phép chia số nguyên số ngun; số ngun phần ngun thương số), ví dụ:
(50)49
Phép tốn % cho phần dư phép chia ngun, khơng áp dụng ñược cho giá trị
kiểu float double Ví dụ: 11%3 =
Các phép tốn + - có số ưu tiên, nhỏ số ưu tiên * / % Ba phép tốn lại có số thứ tựưu tiên nhỏ phép trừ Các phép tốn số học thực từ trái sang phải
Các phép tốn số học dùng để viết cơng thức tốn học, ví dụ: (a*a-b*b)/(x*x+y*y)
2.5.3 Các phép toán so sánh
Phép toán so sánh cho ta giá trị (ñúng) giá trị (sai) Nói cách khác, điều kiện nêu ta nhận giá trị 1, trường hợp trái lại, ta nhận ñược giá trị
Các phép toán so sánh cho bảng sau:
Phép tốn ý nghĩa Ví dụ > Có lớn khơng ? a>b
3>7 có giá trị >= Có lớn hay a>=b
bằng khơng ? 8>=8 có giá trị < Có nhỏ khơng? a<b
9<9 có giá trị <= Có nhỏ hay a<=b
bằng khơng ? 3<=10 có giá trị == Có khơng? a==b
3==9 có giá trị != Có khác khơng a!=b
3!=9 có giá trị
Bốn phép đầu có sốưu tiên, hai phép sau có số thứ tựưu tiên thấp số thứ tựưu tiên bốn phép đầu
Các phép so sánh có sốưu tiên thấp so với phép toán số học, biểu thức: i < n-1 ñược hiểu là: i < (n-1)
Nói chung, nên dùng dấu ngoặc để tránh lỗi độưu tiên phép tốn gây nên 2.5.4 Phép toán logic
Cũng giống phép toán so sánh, phép toán logic cho ta giá trị (ñúng) giá trị (sai).Trong C sử dụng ba phép toán logic:
- Phép Phủñịnh ! - Phép Và (AND) && - Phép Hoặc (OR) ||
Ý nghĩa chúng ñược cho bảng:
A !a
Khác không Bằng khơng
(51)50 Trong a b ngun hay thực Ví dụ:
3>7 có giá trị 7>3 có giá trị && có giá trị ! 15.6 có giá trị
Các phép tốn so sánh logic ñược dùng ñể thiết lập ñiều kiện rẽ nhánh tốn tử if điều kiện kết thúc chu trình tốn tử for, while while Ở chương có nhiều ví dụ việc sử dụng phép toán
2.5.5 Chuyển kiểu
Việc chuyển ñổi kiểu giá trị thường diễn cách tựñộng hai trường hợp sau: - Khi biểu thức gồm toán hạng khác kiểu
- Khi gán giá trị kiểu cho biến (hoặc phần tử mảng) kiểu ðiều xảy toán tử gán, việc truyền giá trị tham số thực cho ñối (chương 4), câu lệnh return (chương 4)
Ngoài ta chuyển từ kiểu giá trị sang kiểu mà ta muốn phép ép kiểu:
(<Kiểu liệu>) (<biểu thức>) Ví dụ:
(float)(a+b)
2.5.6 Các phép toán tăng giảm
C đưa hai phép tốn ngơi để tăng giảm biến (nguyên thực) Toán tử tăng ++ cộng vào tốn hạng nó, tốn tử giảm trừđi Chẳng hạn n có giá trị thì:
Sau phép tính ++n, n có giá trị Sau phép tính n, n có giá trị
Dấu phép tốn ++ có thểđứng trước sau tốn hạng, viết: ++n n++ n n
Sự khác ++n n++ chỗ: Trong phép n++ n tăng sau giá trị
được sử dụng, cịn phép ++n n tăng trước sử dụng Sự khác n n
Ví dụ: Nếu n câu lệnh x = n++;
sẽ gán cho x, câu lệnh x = ++n;
sẽ gán cho x Trong hai trường hợp n ñều trở thành
(52)51
Cuối cùng, điều cần lưu ý khơng nên sử dụng toán tử tăng giảm tùy tiện biểu thức, việc dẫn đến kết sai
2.5.7 Biểu thức ñiều kiện
Biểu thức điều kiện biểu thức có dạng:
<biểu thức kiểm tra> ? <biểu thức 1> : <biểu thức 2>
Giá trị biểu thức ñiều kiện giá trị biểu thức biểu thức kiểm tra (khác khơng) giá trị biểu thức biểu thức kiểm tra sai (bằng khơng)
Ví dụ:
printf("\n %8.2f", a < b ? a : b);
ñưa giá trị nhỏ hai biến thực a b 2.5.8 Câu lệnh gán biểu thức gán
Biểu thức gán biểu thức có dạng: <biến> = <biểu thức>
Vế trái biểu thức biến (hay phần tử mảng), vế phải biểu thức Giá trị
của biểu thức gán giá trị ñược gán Nếu ñặt dấu ; vào sau biểu thức gán ta lệnh gán:
<biến> = <biểu thức>;
Biểu thức gán sử dụng phép toán câu lệnh biểu thức khác Ví dụ, viết
a = b = 5;
thì điều có nghĩa gán giá trị biểu thức b = cho biến a Kết qủa b=5 a=5 Một số dạng khác của toán tử gán
Trong trường hợp biểu thức gán có dạng như: i = i+2;
trong vế trái lặp lại viết gọn sau: i += 2;
Các biểu thức gán có dạng:
<biến> <phép tốn> = <biểu thức>; Trong <phép tốn> phép tốn hai ngơi Ví dụ câu lệnh:
x = x*(y+3); viết thành:
x *= y+3;
2.5.9 Thứ tựưu tiên phép toán
(53)52
STT Phép tốn Trình tự kết hợp
1 ( ) [] -> Trái qua phải
2 ! ~ & * - ++ (type) sizeof Phải qua trái
3 * / % Trái qua phải
4 + - Trái qua phải
5 < <= > >= Trái qua phải
6 == != Trái qua phải
7 && Trái qua phải
8 || Trái qua phải
9 ? : Phải qua trái
10 = += -= *= /= %= <<= >>= &= ^= |= Phải qua trái
11 , Trái qua phải
Giải thích:
- Các phép tốn dịng có thứ tựưu tiên, phép tốn hàng có sốưu tiên cao phép toán hàng
- ðối với phép tốn mức ưu tiên trình tự tính tốn từ trái qua phải hay ngược lại ðiều cột "Trình tự kết hợp"
- ðể viết biểu thức cách xác nên sử dụng dấu ngoặc trịn (ngoặc ñơn)
2.6 Nhập xuất dữ liệu
Nhập xuất liệu cách ñưa liệu vào chương trình đưa kết chương trình Thơng thường, liệu đưa vào thơng qua bàn phím kết quảđược đưa hình
2.6.1 ðưa kết quả hình
Có thểđưa hình dịng chữ, giá trị số lệnh printf Lệnh printf có dạng:
printf (<chuỗi ñiều khiển>, bt1, bt2, , btn);
Ởñây bt1, bt2, , btn biểu thức mà giá trị chúng cần đưa hình
Trong chuỗi điều khiển, chứa: - Ký tựñiều khiển
- Các ký tự hiển thị
- Các ký tự dùng để mơ tả kiểu cách ñưa biến, ta gọi chúng ñặc tả
Một số ký tựñiều khiển định nghĩa trước, thường có dấu \ phía trước, ví dụ ký tự điều khiển xuống dịng \n, ký tự tab \t
Các ký tự hiển thị ñược ñưa giống chúng xuất chuỗi ñiều khiển
Các ñặc tả cách mà giá trị biểu thức sẽñược ñưa Mỗi biểu thức cần phải có đặc tả tương ứng Khi in hình, giá trị biểu thức thay
tương ứng vào vị trí đặc tả
(54)53
đôi muốn ựưa thông báo, câu hướng dẫn, ựó cần ựưa vào chuỗi ựiều khiển không chứa ựặc tả Nội dung xâu sẽựược ựưa hình
Ví dụ, đểđưa thông báo nhắc người dùng nhập vào hệ số đa thức, dùng lệnh:
printf(“\nNhap he so da thuc: ”); Khi hình xuất hiện:
Nhap he so da thuc: ðưa giá trị nguyên
Khi muốn ñưa kết giá trị nguyên, dùng ñặc tả %d Sau ñây xét số ví dụđể hiểu hoạt động đặc tả
Ví dụ, đoạn mã sau ñưa tổng hai số nguyên: int a, b;
a = 10; b = 25;
printf(“Tong cua %d va %d la %d”, a, b, a + b);
Câu lệnh printf thay ñặc tả %d giá trị biểu thức tương ứng theo thứ tự ñưa vào Trong ñoạn mã trên, giá trị a, b a + b ñược thay vào vị trí %d chuỗi ñiều khiển, kết quảñưa sau:
Tong cua 10 va 25 la 35
Trong ví dụ trên, giá trị biểu thức có chữ số nhiêu vị trí hình sử dụng để in giá trị, ví dụ giá trị 10 cần hai vị trí máy dành hai vị
trí để in giá trị 10
Tuy nhiên, số trường hợp, in giá trị ma trận, in giá trị theo dạng cột, cần dành số vị trí định cho giá trị, số vị trí cần thiết ñể in giá trịñó nhỏ
Ví dụ, đoạn chương trình sau in giá trị luỹ thừa theo dạng cột: #include <stdio.h>
void main() {
int i, a; a = 1;
for (i = 1; i <= 10; i++) {
a*= 2;
printf("2 ^ %2d = %4d\n", i, a); }
}
(55)54
Trong ví dụ trên, ta dành vị trí cho việc in số mũ dành vị trí để in luỹ
thừa, giá trị Trường hợp giá trị cần in có số chữ số lớn vị trí, máy chuẩn bị số vị trị vừa đủ cho giá trịđó
ðưa giá trị thực
ðểñưa giá trị thực, dùng đặc tả %f Ví dụ sau tính diện tích hình trịn đưa kết hình
#include <stdio.h> void main()
{
float r; r = 2.34f;
printf("Dien tich hinh tron ban kinh %f la %f\n", r, 3.14*r*r); }
Kết in là:
Dien tich hinh tron ban kinh 2.340000 la 17.193383
Tuy nhiên, ñôi ta không cần kết gồm nhiều chữ số thập phân thế, mà cần lấy số lượng chữ số sau dấu phảy ñịnh
Câu lệnh printf sau thay cho câu lệnh printf ñoạn mã ñểñưa kết lấy hai chữ số sau dấu phảy, dành ký tự cho việc in giá trị
printf("Dien tich hinh tron ban kinh %6.2f la %6.2f\n", r, 3.14*r*r);
Kết là:
Dien tich hinh tron ban kinh 2.34 la 17.19
Một trường hợp muốn lấy số lượng chữ số sau dấu phẩy
định, khơng có ý định dành sẵn số vị trí xác định, đặc tả vắng mặt số phía trước dấu chấm
Sau câu lệnh printf thường dùng cho dạng trên: printf("Dien tich hinh tron ban kinh %.2f la %.2f\n",
r, 3.14*r*r); Kết là:
Dien tich hinh tron ban kinh 2.34 la 17.19 ðưa xâu ký tự
Khi muốn ñưa giá trị xâu ký tự, ví dụ họ tên hay ñịa chỉ, dùng ñặc tả
%s
Ví dụ sau yêu cầu nhập vào tên in lời chào #include <stdio.h>
void main() {
char szHoTen[100];
printf("Nhap ten ban: "); fflush(stdin);
gets(szHoTen);
printf("Xin chao %s", szHoTen); }
Khi chạy, nhập vào tên máy in lời chào tương ứng Nhap ten ban: Minh Quang
(56)55
Với đặc tả %s, ta dành sẵn ñộ rộng cho giá trị in ra, sử dụng trường hợp in họ tên theo cột Việc chỉñịnh ñộ rộng giống nhưñối với trường hợp số nguyên 2.6.2 Nhập dữ liệu từ bàn phím
Nhập liệu từ bàn phím cách thơng dụng ñể nạp giá trị cho biến mảng Trong phần này, tìm hiểu cách nhập liệu cho biến nguyên, biến thực xâu ký tự
Nhập số nguyên, số thực bằng scanf
Câu lệnh scanf dùng để nhập liệu cho biến nguyên, thực Một cách tổng quát câu lệnh scanf có dạng:
scanf("t1t2 tk", &b1,&b2, ,&bk);
Trong b1, b2, , bk biến (kiểu int kiểu float) t1, t2, , tk ñặc tả
tương ứng Dùng ñặc tả %d ñối với biến nguyên %f ñối với biến thực Một vài ý:
- Trong câu lệnh scanf, không dùng tên biến câu lệnh printf mà dùng ñịa biến cách ñặt phép toán & trước tên biến
- Mỗi biến ứng với ñặc tả Như sốñặc tả số biến
- Trong chuỗi ñiều khiển nên chứa ñặc tả ñặc tả nên viết liền Ví dụ, để vào giá trị: 25, -137, 45.3 cho hai biến nguyên m, n biến thực f, dùng lệnh:
scanf(“%d%d%f”, &n, &m, &f);
Khi gặp câu lệnh này, máy dừng ñểñợi thao tác viên vào số liệu từ bàn phím Các giá trị cần ñược phân cách vài khoảng trắng (ởñây khoảng trắng ñược hiểu dấu cách dấu xuống dịng)
Thao tác viên sử dụng cách bấm phím sau:
Cách 1: Mỗi giá trị dòng, cách nhấn phím Enter sau số 25
-137 45.3
Cách 2: ðặt giá trị dòng, cách dấu cách 25 -137 45.3
Sau nhập xong, n nhận giá trị 25, m nhận giá trị -137 f nhận giá trị 45.3 Nhập xâu ký tự bằng gets
ðể nhập xâu ký tự, dùng lệnh gets Lệnh gets có dạng: gets(<xâu ký tự>)
Ởđây, xâu ký tự mảng kiểu char
(57)56
2.7 Một số hàm thường dùng
ðộc giả xem chi tiết danh mục hàm phụ lục giảng Tại ñây chúng tơi trích giới thiệu số hàm thường dùng
2.7.1 Hàm toán học
Các hàm thuộc thư viện math.h stdlib.h 1 abs – Tính giá trị tuyệt đối số ngun x
int abs(int x);
2 labs-Tính giá trị tuyệt ñối số nguyên dài x long int labs(long int x)
3 cos – Tính cosine của x double cos(double x) 4 exp – Tính e mũ x
double exp(double x) 5 fabs-Tính giá trị tuyệt ñối x
double fabs(double x)
6 log – Tính logarit cơ số tự nhiên x double log(double x)
7.log10 - Tính logarit cơ số10 x double log10(double x) 8 pow – Tính x mũ y
double pow(double x, double y) 9 sin – Tính sine của x
double sin(double x) 10 sqrt – Tính căn bậc hai x
double sqrt(double x)
2.7.2 Hàm xử lý chuỗi ký tự
Các hàm khai báo string.h
1 strcmp: so sánh chuỗi s1, s2 phân biệt chữ thường chữ hoa int strcmp(char * s1, char *s2)
hàm trả số nguyên ñộ lệch ký tựñầu tiên chuỗi Nếu hàm trả
giá trị chuỗi s1 s2 giống
2 strcmpi: so sánh chuỗi không phân biệt chữ thường chữ hoa int strcmpi(char *s1, char *s2)
hàm hoạt động giống hàm strcmp khơng phân biệt chữ thường chữ hoa 3 strcpy : chép chuỗi
int strcpy(char *dest, char *sour) 4 stricmp: giống hàm strcmpi
5 strlen: tính độ dài chuỗi int strlen(char *s)
hàm trả số nguyên số ký tự chuỗi s (ñộ dài s) 6 strrev: ñảo ngược chuỗi
char * strrev( char *s)
hàm trả chuỗi ñảo chuỗi s
(58)57
BÀI TẬP CHƯƠNG
Bài Tìm chỗ sai chương trình sau #include "stdio.h"
void main() {
printf("\na=%10.0f, b=%10d, c=%10ld, d=%10d", -3456, 25e3, 4635, 456398461);
}
Sửa lại cho ñúng thực máy
Bài Viết chương trình in dịng với nội dung sau: N = 365
Bằng cách sử dụng loại khác (hằng số dấu phẩy ñộng, int, long, int hệ 8, int hệ 16, kí tự, xâu kí tự)
Bài Tìm chỗ sai đoạn chương trình float a[3], b = 2;
a[0] = 5;
a[10] = 4, a[b] = 7;
Bài Tìm chỗ sai đoạn chương trình {
int a = 6; float b=5.3; {
float x = a*b, y=a+b; }
printf("\na=%10.2f, b=%10.2f, x=%10.2f, y=%10.2f ", a, b, x, y);
}
(59)58
CHƯƠNG - CÁC LỆNH ðIỀU KHIỂN
Một chương trình bao gồm nhiều câu lệnh Thơng thường câu lệnh ñược thực cách theo thứ tự mà chúng ñược viết Các lệnh ñiều khiển cho phép thay đổi trật tự nói trên, máy từ câu lệnh nhảy tới thực câu lệnh khác trước sau ðường máy trở nên linh hoạt nhờ ta viết chương trình cách hiệu Xét mặt công dụng chia lệnh điều khiển thành ba nhóm chính:
- Nhảy khơng điều kiện (goto) - Rẽ nhánh (if, switch )
- Tổ chức chu trình (for, while,do while)
Ngồi cịn có số lệnh khác có chức bổ trợ break, continue
Chương giới thiệu cách viết nguyên tắc hoạt ñộng số lệnh nêu Chúng ta thấy lệnh ñiều khiển C có khả làm việc linh hoạt, phong phú mạnh mẽ Tất ñiều ñược giải thích tỉ mỉ ñược minh họa rõ ràng nhiều chương trình hồn chỉnh thử nghiệm máy
3.1 Nhắc lại khái niệm về câu lệnh khối lệnh
Trong C câu lệnh viết nhiều dịng ñược kết thúc dấu chấm phảy Khái niệm khối lệnh hay câu lệnh hợp thành trình bày mục 1.4.4, ởñây ta nhắc lại vài ñiều
- Khối lệnh dãy câu lệnh ñặt dấu { }
- Khơng đặt dấu chấm phảy sau dấu ngoặc nhọn kết thúc khối
- Khối lệnh tương ñương với câu lệnh riêng lẻ mặt cú pháp Nói cách khác, chỗ
nào đặt câu lệnh chỗđó ta có quyền viết khối lệnh - Khi khối lệnh gồm câu lệnh bỏ dấu ngoặc nhọn đầu cuối
Nói cách khác xem câu lệnh trường hợp riêng khối lệnh
Dưới ñây trình bày lệnh điều khiển if, for, while, , ta dùng thuật ngữ "khối lệnh", ñiều ta dùng "câu lệnh" (vì câu lệnh xem trường hợp riêng khối lệnh)
3.2 Lệnh if
Lệnh if cho phép lựa chọn ñể thực hai nhánh tùy thuộc vào ñiều kiện ñúng (khác không) hay sai (bằng không) biểu thức, gọi biểu thức ñiều kiện Mỗi nhánh lệnh if khối lệnh khác
3.2.1 Cú pháp của if Lệnh if có hai dạng sau: Dạng
if (<biểu thức ñiều kiện>) <khối lệnh>
Dạng
(60)59 <khối lệnh 1>
else
<khối lệnh 2>
Trong cú pháp trên, biểu thức ñiều kiện biểu thức Các khối lệnh câu lệnh đơn, kết thúc câu lệnh phải có dấu chấm phẩy
Lệnh if dạng dùng cần kiểm tra điều kiện xem có hay khơng thực khối lệnh
Lệnh if dạng dùng muốn lựa chọn hai khối lệnh ñể thực 3.2.2 Hoạt ñộng của if
Sự hoạt ñộng của lệnh if dạng
Khi gặp câu lệnh này, máy tính giá trị biểu thức Nếu biểu thức máy thực khối lệnh sau thực lệnh Nếu biểu thức sai máy bỏ qua khối lệnh chuyển đến lệnh viết sau
Sự hoạt ñộng của lệnh if dạng
Trước tiên máy xác ñịnh giá trị biểu thức Nếu biểu thức ñúng máy thực khối lệnh 1, sau nhảy tới lệnh viết sau khối lệnh Nếu biểu thức sai máy không thực khối lệnh mà thực khối lệnh sau thực lệnh viết sau
Ví dụ sau minh hoạ cho hoạt động câu lệnh if ðể tính giá trị lớn hai biến a b ta sử dụng hai chương trình ứng với hai dạng khác lệnh if
/* Chuong trinh tinh max cua hai so thuc, dung if dang */ #include <stdio.h>
void main() {
float a,b,max;
printf("\nVao hai so a va b: ");
scanf("%f%f", &a, &b);/*gia tri cua a va b nhan tu ban phim*/ max = a;
if (b > max) max = b;
printf("\na = %8.2f\nb = %8.2f\nmax = %8.2f", a, b, max ); }
/* Chuong trinh tinh max cua hai so thuc, dung if dang */ #include <stdio.h>
void main() {
float a,b,max;
printf("\nVao hai so a va b: ");
scanf("%f%f",&a,&b);/*gia tri cua a va b nhan tu ban phim */ if (a > b)
max = a; else max = b;
printf("\na = %8.2f\n b = %8.2f\n max = %8.2f", a, b, max); }
3.2.3 Sự lồng của lệnh if
(61)60
Trong trường hợp có nhiều if else, vấn đề quan trọng phải xác ñịnh
ñược mệnh ñề else thuộc if Có ngun tắc để xác định, là: mệnh ñề else ñược gắn với if gần trước
Tuy nhiên, để tránh nhầm lẫn, nên dùng cặp ngoặc {}
Sau ví dụ giải phương trình bậc ax + b = sử dụng if lồng #include <stdio.h>
void main() {
float a, b;
printf("Nhap a, b: "); scanf("%f%f", &a, &b);
if (a == 0) if (b == 0)
printf("Vo so nghiem."); else
printf("Vo nghiem."); else
printf("x = %f", -b/a); }
ðể lựa chọn nhiều trường hợp, ta dùng lệnh if lồng Ví dụ, với chương trình giải phương trình bậc 2, giá trị delta rơi vào trường hợp: lớn 0, nhỏ
Với trường hợp này, câu lệnh if – else viết có phần khác bình thường, cách
đặt câu lệnh if nằm hàng với else trước
Sau ví dụ giải phương trình bậc sử dụng if lồng #include <stdio.h>
#include <math.h> void main() {
float a, b, c, delta; printf("Nhap a, b, c: "); scanf("%f%f%f", &a, &b, &c); delta = b*b - 4*a*c;
if (delta < 0)
printf("Vo nghiem."); else if (delta == 0)
printf("x = %f", -b/(2*a)); else //if (delta > 0)
printf("x1 = %f\nx2 = %f", (-b - sqrt(delta))/(2*a), (-b + sqrt(delta))/(2*a)); }
Chú ý: đối với trường hợp cuối khơng cần if, nhưở ví dụ 3.2.4 Viết chương trình theo cấu trúc
ðể chương trình rõ ràng, dễ kiểm tra tránh nhầm lẫn, ta nên viết chương trình theo quy tắc sau:
- Các câu lệnh khối lệnh nằm lệnh ñiều khiển viết lui vào bên phải - Các câu lệnh khối lệnh cấp viết cột (thẳng cột)
(62)61
3.3 Lệnh for
Lệnh for cho phép thực khối lệnh số lần xác ñịnh Lệnh for thường dùng để
giải tốn có tính chu trình, ví dụ tốn dãy số, ma trận 3.3.1 Cú pháp của for
Lệnh for có dạng sau:
for (<biểu thức khởi tạo>; <biểu thức kiểm tra>; <biểu thức tăng>) <khối lệnh>
Trong cú pháp trên:
- for: từ khoá lệnh for
- biểu thức khởi tạo, biểu thức kiểm tra biểu thức tăng bắt buộc phải cặp ngoặc trịn cách dấu chấm phẩy Các biểu thức4 vắng mặt, phải ñủ dấu chấm phẩy
- Khối lệnh, cịn gọi phần thân lệnh for khối lệnh cần thực nhiều lần
Thơng thường, biểu thức khởi tạo thường dùng ñể khởi tạo giá trị cho biến ñiều khiển, biểu thức tăng dùng ñể thay ñổi giá trị biến ñiều khiển
3.3.2 Hoạt ñộng của for
Lệnh for làm việc theo bước sau:
- Bước Tính giá trị biểu thức khởi tạo
- Bước Tính giá trị biểu thức kiểm tra Nếu đúng, tới bước 3, ngược lại khỏi lệnh for
- Bước Thực khối lệnh
- Bước Tính giá trị biểu thức tăng, sau quay trở lại bước Chú ý:
- Nếu biểu thức kiểm tra vắng mặt xem ðể tránh lặp vơ tận, phần thân for phải có lệnh nhảy khỏi for lệnh break, return goto
- Các biểu thức lệnh for biểu thức ghép, tức gồm nhiều biểu thức cách dấu phẩy Trong trường hợp đó, tính sai xác định theo biểu thức cuối biểu thức ghép
3.3.3 Ví dụ minh hoạ
Ví dụ 1: ðảo ngược dãy số cho trước /* Chuong trinh dao nguoc mot day so */ #include <stdio.h>
float x[] = { 63.2, -45.6, 70.1, 3.6, 14.5}; int n = 5;
void main() {
int i, j; float c;
4
(63)62
for(i = 0, j = n - 1; i < j; i++, j ) {
c = x[i]; x[i] = x[j]; x[j] = c; }
printf("\nDay ket qua: \n"); for(i = 0; i < n; i++) printf(“%8.2f", x[i]); }
Ví dụ 2: Chương trình giải tốn tìm giá trị lớn nhỏ hàng ma trận Trong chương trình sử dụng chu trình lồng
#include <stdio.h> float a[3][4] = {
{15.0, 46.0, 3.5, 6.3}, {34.0, 0.0, -25.0, 35.0} , { 1.0, -13.0, 46.0, -38.0}};
void main() {
int i, j;
float max, min;
for (i = 0; i < 3; i++) {
max = a[i][0]; = a[i][0];
for (j = 0; j < 4; j++) {
if (max < a[i][j]) max = a[i][j]; if (min > a[i][j]) = a[i][j]; }
printf("Gia tri lon nhat va nho nhat cot %d la %.2f va %.2f\n", i + 1, max, min);
} }
Ví dụ 3: Chương trình nhập dãy số in hình dãy vừa nhập #include <stdio.h>
void main() {
float a[100]; int n, i ;
printf("\nSo phan tu cua day: "); scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("Phan tu thu %d: ", i + 1); scanf("%f", &a[i]);
}
printf("Day so vua nhap:\n"); for (i = 0; i < n; i++)
printf("%8.2f", a[i]); }
(64)63 #include <stdio.h>
#include <conio.h> void main()
{
float a[20][20], tc, tg; int m, n, i, j;
printf("\nNhap so hang va so cot cua ma tran: "); scanf("%d%d", &m, &n);
for (i = 1; i<= m; i++) for (j = 1; j <= n; j++) {
printf("a[%d][%d] = ", i, j); scanf("%f", &tg);
a[i][j] = tg ; }
/* Tinh tong cot */ for (j = 1; j <= n; j++) {
tc = 0;
for (i = 1; i <= m; ++i) tc += a[i][j] ;
printf ("\nTong cot %d = %.1f", j, tc);
} }
3.4 Lệnh while
Lệnh while cho phép thực khối lệnh nhiều lần Thông thường while sử dụng trường hợp mà số lần lặp khơng xác định trước
3.4.1 Cú pháp của while Cú pháp while có dạng:
while (<biểu thức kiểm tra5>)
<khối lệnh> Trong cú pháp trên:
- while: từ khoá lệnh while
- Biểu thức kiểm tra: bắt buộc phải đặt cặp ngoặc trịn
- Khối lệnh, gọi phần thân while, khối lệnh cần thực nhiều lần 3.4.2 Hoạt ñộng của while
Lệnh while làm việc theo bước sau:
- Bước 1: Tính giá trị biểu thức kiểm tra Nếu biểu thức ñúng, sang bước 2, ngược lại thoát khỏi lệnh while
- Bước 2: Thực khối lệnh, sau quay trở lại bước
Nhận xét: Thân của while có thểñược thực lần nhiều lần
khơng thực lần từñầu biểu thức kiểm tra ñã sai
5
(65)64 Chú ý:
- ðể tránh lặp vô tận, phần thân while cần có lệnh làm thay đổi giá trị
biểu thức kiểm tra cần ñảm bảo tới lúc biểu thức kiểm tra sai - Biểu thức kiểm tra biểu thức ghép, tức gồm dãy biểu thức cách dấu phẩy Tính sai xác ñịnh dựa vào biểu thức cuối dãy
3.4.3 Ví dụ minh hoạ
Ví dụ 1: Tính tích vơ hướng hai véc tơ x y /* Chương trinh tinh tich vo huong */ #include <stdio.h>
float x[] = {4.0, 6.0, 8.0, 3.5}; float y[] = {2.6, 3.2, 4.0, 7.0}; void main()
{
float s; int i; s = 0; i = 0;
while (i < 4) {
s += x[i]*y[i]; i += 1;
}
printf("\nTich vo huong = %.2f", s); }
Ví dụ 2: Chương trình tìm số nguyên dương n nhỏ cho: + + + n > 1000
#include <stdio.h> void main()
{
float s; int n; s = 0; n = 0;
while (s <= 1000) s += ++n;
printf("\nN = %d", n); }
Ví dụ 3: Tìm phần tử âm ñầu tiên dãy số nguyên #include <stdio.h>
int a[] = {2, 34, 16, -5, 43, 27};
void main() {
int i, n; i = 0; n = 6;
while ((i < n) && (a[i] >= 0)) i++;
if (i < n)
(66)65 else
printf("Khong co phan tu am."); }
3.5 Lệnh - while
Trong lệnh while for, việc kiểm tra ñiều kiện kết thúc ñặt ñầu chu trình Khác với hai lệnh trên, chu trình while việc kiểm tra điều kiện kết thúc đặt cuối chu trình Như thân chu trình thực lần
3.5.1 Cú pháp của – while Lệnh - while có dạng sau:
<khối lệnh>
while (<biểu thức kiểm tra>); Trong cú pháp trên:
- do, while từ khoá lệnh – while
- Khối lệnh, gọi phần thân – while khối lệnh cần thực nhiều lần
- Biểu thức kiểm tra phải ñặt cặp ngoặc trịn (ngoặc đơn) 3.5.2 Hoạt động của while
Lệnh – while thực sau: - Bước 1: Thực khối lệnh
- Bước 2: Tính giá trị biểu thức kiểm tra Nếu đúng, quay trở lại bước 1, ngược lại, khỏi lệnh – while
3.5.3 Ví dụ minh hoạ
Ví dụ : Tính căn bậc hai số nguyên a, thuật toán sau: x(0) = a
x(n+1) = ( x(n)*x(n) + a ) / ( 2*x(n) ) , với n>=0 Quá trình lặp kết thúc
| (x(n+1) - x(n)) / x(n)| < 0.00001
Khi x(n+1) xem giá trị gần a Thuật tốn chương trình hố sau /* Chuong trinh tinh can bac hai */ #include <stdio.h>
#include <math.h> void main()
{
double a, x, c; printf("\na = "); scanf("%f", &a);
x = a; {
c = x;
(67)66 }
while (fabs((x-c)/c) >= 1e-5);
printf("Can bac hai cua %.4f la %.4f", a, x); }
3.6 Lệnh break
Khi sử dụng lệnh lặp for, while hay – while ví dụ trên, điều kiện khỏi vòng lặp biểu thức kiểm tra sai Tuy nhiên, vài trường hợp, ta muốn thoát khỏi vịng lặp tức thời, sử dụng lệnh break
3.6.1 Cú pháp của break Lệnh break có dạng sau: break;
Ghi chú:
- Lệnh break có thểđược đặt bất cứñâu thân lệnh lặp
- Khi có nhiều lệnh lặp lồng nhau, lệnh break khỏi lệnh lặp chứa
3.6.2 Hoạt ñộng của break
Khi gặp break, máy bỏ qua lệnh lại phần thân lệnh lặp, dừng lặp thoát khỏi lệnh lặp
3.6.3 Ví dụ minh hoạ
Chương trình tìm phần tử âm ma trận ñây minh họa cách sử
dụng chu trình lồng cách dùng break ñể khỏi chu trình
/* Chuong trinh tim phan tu am dau tien cua ma tran dùng break */ #include <stdio.h>
float a[3][4] = {
{15.0, 46.0, 3.5, 6.3}, {34.0, 0.0, -25.0, 35.0} , { 1.0, -13.0, 46.0, -38.0}};
void main() {
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) if (a[i][j] < 0)
break; /* khoi for j */ if ( j < 4)
break; /* khoi for i */ }
if ((i < 3)&&(j < 4))
printf("\nPhan tu am dau tien la a(%d,%d) = %.2f", i + 1, j + 1, a[i][j]);
else
printf("\nMa tran khong co phan tu am."); }
3.7 Lệnh continue
(68)67 3.7.1 Cú pháp của continue
Lệnh continue có dạng: continue;
Ghi chú:
- Lệnh continue sử dụng lệnh lặp
- Lệnh continue có thểđặt bất cứđâu phần thân lệnh lặp
- Khi có nhiều lệnh lặp lồng nhau, lệnh continue có tác dụng ñối với lệnh lặp
3.7.2 Hoạt ñộng của continue
Khi gặp continue, máy bỏ qua lệnh lại phần thân lệnh lặp quay lại bắt đầu vịng lặp
ðối với while – while, vòng lặp bước tính biểu thức kiểm tra
ðối với for, vịng lặp bước tính biểu thức tăng 3.7.3 Ví dụ minh hoạ
Cho ma trận a, viết chương trình để từ ma trận a cho trước: - Tính tổng phần tử dương a
- Xác ñịnh số phần tử dương a
- Tìm giá trị lớn phần tử dương A #include <stdio.h>
float a[][4] = {
{ 25.0, 0.0, -3.0, 5.0}, { -6.0, 4.0, 0.0, -2.0}, { 30.0, -4.0, 7.0, -3.0}};
void main() {
int i, j, demD; float tongD, maxD; demD = 0;
tongD = 0; maxD = 0;
for (i = 0; i < 3; i++) for(j = 0; j < 4; j++) {
if(a[i][j] <= 0) continue;
++demD;
tongD += a[i][j]; if (maxD < a[i][j]) maxD = a[i][j]; }
printf("\nSo phan tu duong la: %d", demD);
(69)68
BÀI TẬP CHƯƠNG
Bài Lập chương trình giải hệ phương trình: ax + by = c
dx + ey = f
các hệ số a, b, c, d, e, f nhận từ bàn phím Yêu cầu xét tất trường hợp Bài Lập chương trình:
- Nhập dãy số từ bàn phím
- Tính trung bình cộng số dương trung bình cộng số âm dãy số
Bài Lập chương trình tính ex theo công thức xấp xỉ
e x x x
n
x
n
= + +1 + +
1
2
! !
với độ xác 0.00001 Tức n cần chọn cho x
n
n
! <0 00001
Bài Lập chương trình tính sin(x) với độ xác 0.0001 theo cơng thức: sin( )
! ! ( ) ( )!
x x x x x
n n n = − + + + − − −
3
3
Bài Lập chương trình vào bốn dãy số a1, , an, b1, , bn, c1, , cn, d1, , dn In kết
n dòng , dòng giá trị theo mẫu sau:
ai bi ci di min(ai,bi,ci,di) max(ai,bi,ci,di)
Bài Lập chương trình tính tổ hợp chập m n
C m n n n n m
m
( , ) ( ) ( )
!
= −1 − +1
Bài Lập chương trình in dãy n số thực x1, , xn nhiều dòng, dịng gồm m số
(dịng cuối hơn) Các giá trị m, n x1, , xn nhận từ bàn phím
Bài Nhập hệ số a1 , , an từ bàn phím sau in hàm f(x) dịng theo mẫu sau:
f(x) = a1x1 + + anxn
Bài Lập chương trình tính
5 2 2
1 )
(a a an
S= + + +
trong n a1, ,an nhận từ bàn phím
Bài 10 Cần có tổng số 200000đ từ loại giấy bạc 1000đ, 2000đ 5000đ Lập chương trình tìm tất phương án
Bài 11 Lập chương trình tìm phần tử âm cuối dãy a1, ,an
Bài 12 Cho hai dãy số: a1, ,an b1, ,bm, hai ñều xếp theo thứ tự tăng Lập chương trình
trộn hai dãy thành dãy theo thứ tự tăng
(70)69 Bài 14 Sắp xếp dãy số theo thứ tự tăng dần
Bài 15 Cho dãy số a1, ,an Lập chương trình in số âm dòng, số dương
dòng
Bài 16 Cho hiện lên hình kí tự có mã ASCII từ 33 đến 255 Bài 17 Viết chương trình tính giá trị đa thức đạo hàm Bài 18 Viết chương trình tính định thức ma trận vng cấp n
(71)70
CHƯƠNG - HÀM VÀ TỔ CHỨC CHƯƠNG TRÌNH
Một chương trình viết theo ngôn ngữ C dãy hàm có hàm (hàm main) Thứ tự hàm chương trình chương trình
cũng thực từ hàm main Mỗi hàm thực phần việc chương trình giải tốn trọn vẹn Một ưu điểm C cho phép tổ chức sử dụng hàm cách ñơn giản hiệu Chương giới thiệu qui tắc xây dựng sử dụng hàm
4.1 Tổ chức chương trình thành hàm
4.1.1 Khái niệm chung về hàm
Xét tốn đơn giản sau: Tìm giá trị lớn ba số mà giá trị chúng đưa vào từ bàn phím Ta tổ chức chương trình thành hai hàm: hàm main hàm mà ta ñặt tên max3s Nhiệm vụ hàm max3s tính giá trị lớn ba số giảñịnh mà ta gọi a, b, c Nhiệm vụ hàm main ñọc ba giá trị từ bàn phím, dùng hàm max3s để tính max ba giá trị vừa đọc được, đưa kết qủa hình Chương trình viết sau
#include <stdio.h>
/* Nguyen mau ham max3s */
float max3s(float a,float b,float c);
void main() {
float x, y, z;
printf("\nNhap ba so thuc: "); scanf("%f%f%f", &x, &y, &z);
printf("\nx = %0.2f\ny = %0.2f\nz= %0.2f\nmax = %0.2f", x, y, z, max3s(x, y, z));
}
/* Dinh nghia ham max3s */
float max3s(float a, float b, float c) {
float max; max = a>b?a:b;
return (max>c?max:c); /* Gia tri tra ve */ }
Ghi chú:
- Nên khai báo nguyên mẫu hàm trước sử dụng hàm
- Nguyên mẫu hàm thực chất dịng đầu hàm thêm vào dấu chấm phẩy Tuy nhiên nguyên mẫu bỏ tên đối
Qua chương trình rút nhiều khái niệm qui tắc quan trọng liên quan ñến việc xây dựng sử dụng hàm:
- Mỗi hàm phải có tên Ta có thểđặt cho hàm tên theo qui tắc nêu chương
- Trong chương trình, hàm phải có tên khác tên tùy ý ta nên ñặt cho hàm tên phù hợp với chức hàm - Hàm thường có vài đối Ví dụ hàm max3s có ba đối a, b, c Cả ba ñối
ñều có kiểu giá trị float Cũng có hàm khơng đối hàm main ví dụ
(72)71
- Hàm thường cho ta giá trị Ví dụ, hàm max3s cho giá trị lớn ba đối Giá trị hàm có kiểu int, float, double, Hàm max3s có giá trị kiểu float Ngồi cịn có hàm khơng có giá trị trả về, ñó khai báo kiểu trả hàm void
4.1.2 Quy tắc xây dựng một hàm
Hàm xem đơn vịđộc lập chương trình Trong C khơng cho phép xây dựng hàm bên hàm khác Hàm ñược viết theo thứ tự sau:
Nguyên mẫu hàm
Nguyên mẫu hàm cho biết tên hàm, ñối hàm kiểu giá trị trả Việc khai báo nguyên mẫu hàm cho phép sử dụng hàm trước ñịnh nghĩa hàm
Nguyên mẫu hàm khai báo theo mẫu sau: <kiểu> <tên_hàm>(
<kiểu 1> [<ñối1>, <kiểu 2> [<ñối 2>], …,
<kiểu n> [<ñối n>] );
Như vậy, nguyên mẫu hàm khai báo thông tin tối thiểu hàm để
sử dụng hàm
Trong trường hợp hàm định nghĩa trước sử dụng, khơng cần thiết phải khai báo nguyên mẫu
ðịnh nghĩa hàm
ðịnh nghĩa hàm gồm hai phần: tiêu ñề thân hàm Xét ví dụ hàm max3s: /* Dinh nghia ham max3s */
float max3s(float a, float b, float c) {
float max; max = a>b?a:b;
return (max>c?max:c); /* Gia tri tra ve */ }
Trong ví dụ trên, tiêu đề hàm là:
float max3s(float a, float b, float c)
Thân hàm bắt ñầu dấu { kết thúc dấu } Trong thân hàm chứa câu lệnh cần thiết để thực u cầu ñã ñề cho hàm Thân hàm max3s đoạn chương trình tính giá trị lớn ba ñối a, b, c
Trong thân hàm ta dùng thêm biến max Cần phân biệt khác biến max
ñối a, b, c Biến max biến cục có tác dụng thân hàm khơng có liên hệ đến biến hàm khác chương trình Trái lại đối a, b, c lại dùng ñể trao ñổi liệu hàm
Trong thân hàm sử dụng câu lệnh return, dùng nhiều câu lệnh return
những chỗ khác khơng sử dụng câu lệnh hàm khơng có giá trị trả
về Dạng tổng quát là: return [<biểu thức>];
(73)72 4.1.3 Sử dụng hàm
Hàm ñược sử dụng cách gọi hàm Lời gọi hàm có dạng sau: <tên hàm> ([<danh sách tham số thực>])
Khi gọi hàm, cần phải truyền cho tham số giá trị Các giá trị gọi tham số thực ñể phân biệt với tham sốñược khai báo ñịnh nghĩa hàm (tham số hình thức)
Như ta có khái niệm sau:
+ Biến toàn hay biến tồn cục: biến khai báo ởđầu chương trình, sử dụng vị trí chương trình
+ Biến cục bộ, biến ñịa phương: biến ñược khai báo hàm, ñầu khối lệnh Phạm vi họat ñộng biến thân hàm hay khối lệnh chứa
+ ðối số hay tham số hình thức: biến khai báo sau tên hàm dấu ngoặc tròn
+ ðối số thực hay tham số thực sự: Khi sử dụng hàm, ta viết tên hàm, cặp dấu ngoặc tròn giá trị dấu ngoặc tròn có Các giá trịđó gọi tham số
thực
Nguyên tắc hoạt ñộng chương trình gặp lời gọi hàm:
Khi gặp lời gọi hàm hàm bắt đầu thực Nói cách khác, máy gặp lời gọi hàm chỗ chương trình, máy tạm rời chỗđó chuyển đến hàm tương ứng Q trình diễn theo trình tự bước sau:
a/ Cấp phát nhớ cho ñối biến cục
b/ Gán giá trị tham số thực cho ñối tương ứng c/ Thực câu lệnh thân hàm
d/ Khi gặp câu lệnh return dấu } cuối thân hàm máy xố đối, biến cục (giải phóng nhớ đối, biến cục bộ) khỏi hàm
Nếu trở từ câu lệnh return có chứa biểu thức giá trị biểu thức gán cho hàm Giá trị hàm sẽñược sử dụng biểu thức chứa
Trong ví dụ trên, giá trị hàm max3s(x,y,z) sẽñược sử dụng câu lệnh printf Nói cách khác, giá trị lớn ba số x, y, z sẽñược ñưa hình
4.1.4 Cấu trúc tổng quát của chương trình
Chương trình gồm nhiều hàm viết theo trình tự sau: - Các #include
- Các #define
- Khai báo đối tượng liệu ngồi (biến, mảng, cấu trúc, ) - Khai báo nguyên mẫu hàm
- Hàm main
- Xây dựng (ñịnh nghĩa) hàm
(74)73
4.2 Tham số kiểu trỏ
Trong phần này, giới thiệu sơ lược trỏ C ứng dụng truyền tham số cho hàm
4.2.1 ðịa chỉ
Liên quan ñến biến ta có khái niệm: - Tên biến
- Kiểu biến - Giá trị biến Ví dụ câu lệnh
float alpha = 30.5;
xác ñịnh biến có tên alpha có kiểu float có giá trị 30.5 Ta biết, theo khai báo trên, máy cấp phát cho biến alpha khoảng nhớ gồm byte liên tiếp
ðịa biến số thứ tự byte ñầu tiên vùng nhớ biến nhớ Một ñiều cần lưu ý ñịa biến số ngun khơng đánh
đồng với số ngun thơng thường dùng phép tính
ðể lấy địa biến, dùng phép tốn & Ví dụđể lấy địa biến alpha &alpha
4.2.2 Con trỏ
Con trỏ biến dùng để chứa địa chỉ, có nghĩa giá trị trỏ ñịa biến
Vì có nhiều loại địa nên có nhiều kiểu trỏ tương ứng Con trỏ kiểu int dùng
ñể chứa ñịa biến kiểu int Tương tự, ta có trỏ kiểu float, kiểu double, Cũng ñối với biến khác, trỏ cần khai báo trước sử dụng
Việc khai báo biến trỏñược thực theo mẫu sau: <kiểu> *<tên trỏ>;
Ví dụ câu lệnh sau khai báo hai biến kiểu int x, y hai trỏ kiểu int px py int x, y, *px, *py;
Tương tự câu lệnh sau khai báo trỏ kiểu float float f, *pf;
Khi có khai báo câu lệnh sau hồn tồn xác định px = &x;
py = &y;
Câu lệnh thứ gán ñịa x cho trỏ px câu lệnh thứ hai gán ñịa
của biến y cho trỏ py
Khi trỏ px chứa địa biến x ta nói px trỏ tới x
Chúng ta khơng gán địa biến nguyên cho trỏ kiểu thực Ví dụ
(75)74 4.2.3 Qui tắc sử dụng trỏ biểu thức
Với biến, có hai đại lượng liên quan, ñó giá trị biến ñịa biến Khi trỏ trỏ tới biến, ñó có hai ñại lượng liên quan, ñó giá trị trỏ
(chính địa biến) giá trị biến mà trỏñang trỏ tới
Trong biểu thức, tên trỏñại diện cho giá trị trỏ dạng khai báo ñại diện cho giá trị biến mà trỏñang trỏ tới
Sử dụng tên trỏ
Con trỏ biến nên tên xuất trọng biểu thức giá trị ñược sử dụng biểu thức Khi tên trỏ đứng bên trái tốn tử gán giá trị biểu thức bên phải (giá trị phải ñịa chỉ) ñược gán cho trỏ
Ta xem câu lệnh sau làm ? float a, *p, *q;
p = &a; q = p;
Câu lệnh thứ khai báo biến kiểu float (biến a) hai trỏ p q kiểu float Câu lệnh thứ hai gán ñịa biến a cho trỏ p câu lệnh thứ ba gán giá trị p cho q Kết trỏ q chứa ñịa biến a
Sử dụng dạng khai báo của trỏ Xét ñoạn lệnh sau:
float x, y, *px, *py; x = 100.0;
y = 215.3; px = &x; py = &y;
Sau lệnh gán px trỏ tới x, py trỏ tới y Khi biến mà px trỏ tới (biến x) biểu diễn dạng *px
Nói cách khác, trỏ px trỏ tới biến x cách viết x *px
là tương ñương ngữ cảnh
Theo nguyên lý ba câu lệnh sau có hiệu lực y = 3*x + 1;
*py = 3*x + 1; *py = 3*(*px) + 1;
Từđây rút kết luận quan là: Khi biết ñược ñịa biến sử dụng giá trị mà cịn gán cho giá trị (làm thay đổi nội dung nó) ðiều ñược áp dụng phương pháp chủ yếu ñể
nhận kết hàm thơng qua đối 4.2.4 Mảng trỏ
Khi khai báo mảng, máy cấp phát vùng nhớ dùng ñể lưu giá trị phần tử mảng
(76)75
Khi máy cấp phát 100 nhớ, nhớ có kích thước số nguyên tương
ứng với phần tử, phần tử xếp liên tiếp nhớ, từ phần tử ñầu tiên
Trong C, tên mảng địa phần tửđầu tiên mảng, điều có nghĩa là: a &a[0]
Vì tên mảng địa chỉ, nên ta gán cho trỏ Ví dụ: int *p;
p = a;
Như mảng trỏ có tương đồng Do đó, C cho phép sử dụng thay
giữa mảng trỏ số trường hợp Ví dụ, sau ñã gán p a thì:
a[4] p[4] ñều biểu diễn phần tử thứ mảng a[0], *a *p biểu diễn phần tửñầu tiên mảng
Tuy nhiên mảng trỏ có khác Con trỏ biến, giá trị thay đổi ta gán giá trị cho trỏ Trong tên mảng địa chỉ, mảng cấp phát địa phần tử xác định Vì khơng thể thay ñổi ñược giá trị tên mảng
4.2.5 Hàm có đối trỏ
ðối trỏ thường ñược sử dụng trường hợp sau ñây: - Sử dụng hàm ñể thay ñổi giá trị biến
- Truyền mảng vào cho hàm - Trả nhiều kết
Sử dụng hàm ñể thay ñổi giá trị của một biến
Như ñã biết, truyền tham số thực cho hàm, có giá trị biểu thức ñược sử dụng Nếu thay ñổi giá trị đối số bên hàm, thay đổi
đó khơng ảnh hưởng đến giá trị biến truyền vào cho hàm
Vì vậy, muốn dùng hàm ñể thay ñổi giá trị biến, phải truyền địa biến thay giá trị biến
ðể khai báo tham số ñịa biến, ta khai báo tham sốđó trỏ có kiểu tương ứng Ví dụ sau định nghĩa hàm cho phép đảo giá trị hai biến
#include <stdio.h>
void hoan_vi(float *px, float *py) {
float z; z = *px; *px = *py; *py = z; }
void main() {
float a = 7.6, b = 13.5; hoan_vi(&a, &b);
(77)76 Kết thực chương trình
a = 13.50 b = 7.60
Ta xem hàm hoán_vị làm việc Nhưđã biết, chương trình câu lệnh
ñầu tiên hàm main() Kết qủa biến a nhận giá trị 7.6 biến b nhận giá trị 13.5 Tiếp
đó lời gọi hàm hoan_vi Máy gán giá trị tham số thực cho ñối tương ứng Như
vậy ñịa a ñược gán cho trỏ px , ñịa b ñược gán cho trỏ py Sau ñó máy xét ñến câu lệnh thân hàm Câu lệnh thứ cấp phát cho biến cục z khoảng nhớ byte Theo qui tắc sử dụng trỏ nêu mục 4.2.3 ba câu lệnh tương đương với câu lệnh:
z = a; a = b; b = z;
Như a nhận giá trị b ngược lại Tiếp đó, máy trở hàm main() in dòng kết qủa nhưñã
Truyền một mảng một chiều vào cho hàm
Khi muốn truyền mảng vào cho hàm, ví dụ hàm in số hạng dãy số, ta dùng ñối trỏ
Do mảng ñịa phần tử ñầu nên kiểu ñối kiểu trỏ kiểu phần tử
mảng Ví dụ, với mảng phần tử int kiểu đối trỏ kiểu int
Khi truyền mảng vào cho hàm, bên hàm không rõ số lượng phần tử mảng,
đó cần thêm đối số lượng phần tử mảng
Ví dụ sau ñịnh nghĩa hai hàm, hàm nhập liệu cho dãy số hàm in dãy sốđó hình
#include <stdio.h>
// Nguyen mau ham
void NhapDaySo(int *a, int n); void InDaySo(int *a, int n);
void main() { int a[100]; int n;
printf("Nhap so phan tu: "); scanf("%d", &n);
// Nhap day so NhapDaySo(a, n);
printf("Day so vua nhap:\n"); // In day so
InDaySo(a, n); }
void NhapDaySo(int *a, int n) {
int i;
for (i = 0; i < n; i++) {
printf("a[%d] = ", i + 1); scanf("%d", &a[i]);
(78)77 void InDaySo(int *a, int n) {
int i;
for (i = 0; i < n; i++) printf("%8d", a[i]); }
Trong ví dụ trên, tham số hai hàm NhapDaySo InDaySo ñược khai báo giống nhau, bao gồm tham số kiểu trỏ nguyên tham số nguyên
Tuy nhiên, hai trường hợp ý nghĩa tham số khác - Tham số a hàm NhapDaySo kết quảñưa - Tham số a hàm InDaySo liệu ñầu vào
Về mặt cú pháp, khơng phân biệt khác trên, mà phân biệt
được theo mục đích sử dụng
Vì vậy, truyền mảng vào cho hàm mà hàm khơng có nhu cầu thay đổi giá trị phần tử mảng, thêm từ khố const khai báo tham số Ví dụ, hàm InDaySo có thểđược định nghĩa sau:
void InDaySo(const int *a, int n) {
int i;
for (i = 0; i < n; i++) printf("%8d", a[i]); }
Khi xác ñịnh tham số a liệu vào cho hàm Truyền một mảng nhiều chiều vào cho hàm
Trong số trường hợp, phải truyền mảng nhiều chiều vào cho hàm, ví dụ
như truyền ma trận vào hàm in ma trận
Khi khai báo tham số mảng nhiều chiều, cần phải số phần tử tương ứng chiều, trừ chiều ñầu tiên khơng cần thiết phải
Ví dụ sau nhập in ma trận thực theo dạng bảng, sử dụng hai cú pháp khai báo mảng trỏ
#include <stdio.h>
// Nguyen mau ham
void NhapMaTran(float a[20][20], int, int); // Su dung dang khai bao mang
void InMaTran(float a[20][20], int, int);
void main() {
float a[20][20]; int m, n;
printf("Nhap so hang, so cot: "); scanf("%d%d", &m, &n);
// Nhap ma tran NhapMaTran(a, m, n);
(79)78
void NhapMaTran(float a[20][20], int m, int n) {
int i, j; float f;
for (i = 0; i < m; i++) for (j = 0; j < n; j++) {
printf("a[%d][%d] = ", i + 1, j + 1); scanf("%f", &f);
a[i][j] = f; }
}
void InMaTran(float a[20][20], int m, int n) {
int i, j;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) printf("%8.2f", a[i][j]); printf("\n");
} }
Chú ý: một số trình dịch khơng cho phép lấy địa phần tử mảng nhiều chiều, phải dùng biến trung gian nhập giá trị phần tử mảng, hàm NhapMaTran
Trả về nhiều kết quả
Một trường hợp mà ñối trỏ thường ñược sử dụng ñó muốn hàm trả
về nhiều giá trị Như biết, hàm trả giá trị dạng tên hàm,
đó để trả nhiều giá trị phải sử dụng tham số trỏ
Ví dụ: viết hàm giải phương trình bậc hai, cần phải trả đại lượng:
- Hàm có nghiệm (0, 1, 2)
- Nếu có nghiệm, giá trị nghiệm
Như ởñây phải trả ba ñại lượng: số nghiệm, hai nghiệm (trong trường hợp có nghiệm)
Ví dụ sau thể cách trả nhiều kết /* Chuong trinh giai phuong trinh bac hai */
#include <stdio.h> #include <math.h>
// Nguyen mau ham
int GiaiPTBac2(float, float, float, float*, float*);
void main() {
float a, b, c, x1, x2; int songhiem;
printf("Nhap a, b, c: "); scanf("%f%f%f", &a, &b, &c);
(80)79
songhiem = GiaiPTBac2(a, b, c, &x1, &x2); if (songhiem == 0)
printf("Phuong trinh vo nghiem."); else if (songhiem == 1)
printf("Nghiem kep: %.3f", x1); else
printf("x1: %.3f\nx2: %.3f", x1, x2); }
int GiaiPTBac2(float a, float b, float c, float *px1, float *px2) {
float delta;
delta = b*b - 4*a*c; if (delta < 0)
return 0;
else if (delta == 0) {
*px1 = -b/(2*a); return 1;
} else {
*px1 = (-b - sqrt(delta))/(2*a); *px2 = (-b + sqrt(delta))/(2*a); return 2;
} }
4.3 ðệ quy
4.3.1 Khái niêm chung vềñệ quy
C cho phép từ hàm gọi tới hàm khác, mà cịn cho phép từ vị trí thân hàm gọi tới hàm Hàm gọi hàm ñệ quy Trong số
trường hợp, sử dụng ñệ quy làm chương trình ngắn gọn, dễ hiểu
Khi hàm gọi đệ quy đến lần gọi, máy tạo tập biến cục
mới hồn tồn độc lập với tập biến (cục bộ) ñã ñược tạo lần gọi trước
Ta ý rằng: Có lần gọi tới hàm có nhiêu lần khỏi hàm lần khỏi hàm tập biến cục bị xóa Sự tương ứng lần gọi tới hàm lần khỏi hàm ñược thực theo thứ tự ngược, nghĩa là: Lần ñầu tiên
ứng với lần vào cuối lần khỏi hàm cuối ứng với lần ñầu tiên gọi tới hàm
ðể minh họa điều nói trên, ta đưa ví dụ đơn giản Giả sử ta cần viết hàm tính n giai thừa Thông thường ta viết sau:
long giai_thua(int n) {
long s; int i;
for (s = 1, i = 1; i <= n; i++) s*= i;
return s; }
Một cách khác, ta thấy n! tính theo cơng thức truy hồi sau: n!= n =
n!= n*(n-1)! n >
(81)80 #include <stdio.h>
long giai_thua(int n) {
return (n > 0)?n*giai_thua(n - 1) : 1; }
void main() {
printf("%d", giai_thua(5)); }
Cơ chế hoạt ñộng hàm giai_thua chương trình giải thích sau: - Trong hàm main, có lời gọi hàm giai_thua(5) để tính giai thừa Khi
hàm giai_thua sẽñược gọi ñể thực với tham số n
- Trong hàm giai_thua, n lớn nên giá trị trả n*giai_thua(n -1), tức 5*giai_thua(4) Tuy nhiên lúc giá trị giai_thua(4) chưa xác ñịnh, nên máy lại tiếp tục gọi hàm giai_thua để tính giai thừa
- Trong lần gọi thứ hai này, n lớn 0, nên tiếp tục cần tính giai_thua(3) - Cứ vậy, n 0, giá trị trả lần gọi giai_thua(0)
và sử dụng để tính biểu thức trả cho lần gọi giai_thua(1) 1*giai_thua(0), 1*1
- Giá trị giai_thua(1) 1, lại ñược sử dụng để tính biểu thức trả cho lần gọi giai_thua(2), 2*1
- Cứ vậy, cuối giá trị trả lời gọi giai_thua(5) main có giá trị
bằng 5*4*3*2*1*1 4.3.2 Cách dùng đệ quy
Bài tốn có thể dùng ñệ quy
Phương pháp ñệ quy thường áp dụng cho tốn phụ thuộc tham số có hai đặc điểm sau:
- Bài tốn dễ dàng giải số trường hợp riêng ứng với giá trịñặc biệt tham số Ta gọi ñây trường hợp suy biến
- Trong trường hợp tổng qt, tốn quy tốn dạng giá trị tham số thay đổi Và sau số hữu hạn bước biến ñổi ñệ quy, dẫn tới trường hợp suy biến
Ta nhận thấy tốn tính n! nêu thể hiên rõ ñặc ñiểm Cách xây dựng hàm ñệ quy
Hàm ñệ quy thường ñược viết theo thuật toán sau: if (trường hợp suy biến)
{
trình bày cách giải tốn (giả định ñã có cách giải) }
else /* trường hợp tổng quát */ {
gọi ñệ quy tới hàm (ñang lập) với giá trị khác tham số
(82)81 4.3.3 Các ví dụ
Mục trình bày số ví dụ nhằm minh hoạ cách xây dựng hàm đệ quy Ví dụ 1: Xét tốn tìm ước số chung lớn hai số nguyên dương x y
- Trường hợp suy biến trường hợp x = y Khi ñó: uscln(x,y) = x
- Trường hợp x khác y tính ƯSCLN cách đệ quy sau: uscln(x,y) = uscln(x-y,y) x > y
uscln(x,y) = uscln(x,y-x) x < y
Chương trình sau ñịnh nghĩa hàm tính ước số chung lớn sử dụng hàm để tính
ước số chung lớn hai số nhập vào: #include <stdio.h>
// Nguyen mau ham int uscln(int, int);
void main() {
int a, b;
printf("Nhap hai so nguyen: "); scanf("%d%d", &a, &b);
printf("USCLN cua %d va %d la %d.", a, b, uscln(a, b)); }
int uscln(int a, int b) {
if (a > b)
return uscln(a - b, b); else if (a < b)
return uscln(a, b - a); else
return a; }
Ví dụ 2: Bài toán tháp Hà Nội
Bài toán tháp Hà Nội đặt sau: Có tháp gồm n tầng, tầng nhỏ tầng Nhiệm vụ phải chuyển tháp từ vị trí A đến vị trí B ðiều kiện chuyển là:
- Mỗi lần chỉñược phép chuyển tầng
- Cho phép sử dụng thêm vị trí trung gian C đểđặt tầng
- Ln ñảm bảo tầng nhỏ tầng vị trí thời điểm Thuật tốn chuyển tháp diễn đạt sau:
Trường hợp suy biến: n = 1, cần chuyển tầng từ A ñến B Trường hợp tổng qt n > giải đệ quy sau:
- Chuyển tháp n -1 tầng từ A đến C, dùng B làm vị trí trung gian - Chuyển tầng n từ A ñến B
(83)82 Chương trình sau cài đặt thuật tốn
/* Thap Ha noi */ #include <stdio.h>
// Nguyen mau ham
void Chuyen(int, int, int, int);
void main() {
int n;
printf("Nhap so tang: "); scanf("%d", &n);
Chuyen(n, 'A', 'B', 'C'); }
void Chuyen(int n, int A, int B, int C) {
if (n == 1)
printf("Chuyen tang tu %c sang %c\n", A, B); else
{
Chuyen(n - 1, A, C, B);
printf("Chuyen tang %d tu %c sang %c\n", n, A, B); Chuyen(n - 1, C, B, A);
(84)83
BÀI TẬP CHƯƠNG
Viết hàm thực tốn Bài Giải hệ phương trình bậc
ax + by = c dx + ey = f
Hàm có sáu đối vào a, b, c, d, e, f hai ñối x, y Bài Tính đa thức cấp n
f(x) = a0 + a1x + + an-1 xn-1 + anxn
Hàm có hai đối biến ngun n mảng thực a Bài Tính cực đại cực tiểu dãy số
Bài Tính giá trị trung bình độ lệch tiêu chuẩn đại lượng ngẫu nhiên theo cơng thức
s x x
n
n
= + +1
n
s x s
x
d n
2
1
2=( − ) + +( − )
Trong x1, , xn dãy quan sát nhận ñược
Bài Nhân ma trận A cấp mxn với véc tơ X cấp n Bài Chuyển vị ma trận chữ nhật A cho trước
Bài Tìm tọa ñộ giao ñiểm hai ñường thẳng AB CD biết tọa ñộ ñiểm A, B, C, D
Bài Xây dựng hàm số sau ñây phương pháp ñệ qui f(x,n) = xn
s(n) = (2n)!!
(85)84
CHƯƠNG - CẤU TRÚC
ðể lưu trữ xử lý thơng tin máy tính ta có biến mảng Mỗi biến chứa
ñược giá trị Mảng xem tập hợp nhiều biến có kiểu giá trị biểu thị tên Cấu trúc xem mở rộng khái niệm biến mảng, cho phép lưu trữ xử lý dạng thông tin phức tạp Cấu trúc tập hợp biến, mảng ñược biểu thị tên
Một ví dụ truyền thống cấu trúc phiếu ghi lương: Mỗi cơng nhân miêu tả tập hợp thuộc tính tên, địa chỉ, ngày sinh, bậc lương, Một vài thuộc tính lại cấu trúc: Tên có nhiều thành phần, địa chí ngày sinh
5.1 ðịnh nghĩa cấu trúc khai báo biến cấu trúc
Cấu trúc kiểu liệu người dùng tự ñịnh nghĩa Khi ñịnh nghĩa cấu trúc, cần tên kiểu cấu trúc thành phần cấu trúc
ðểñịnh nghĩa cấu trúc, dùng mẫu sau: struct <Tên cấu trúc>
{
<Kiểu 1> <Tên thành phần 1>; <Kiểu 2> <Tên thành phần 2>;
};
ðể khai báo biến cấu trúc sau ñã ñịnh nghĩa kiểu cấu trúc, ta viết: struct <Tên cấu trúc> danh_sách_tên_biến_cấu_trúc;
Ví dụ, định nghĩa cấu trúc mô tả ngày tháng, sau: struct Ngay
{
int ngay; int thang; int nam; };
Sau định nghĩa trên, có kiểu liệu mô tả ngày tháng struct Ngay Kiểu liệu dùng để khai báo biến cấu trúc Ví dụ, biến ngay_sinh kiểu ngày tháng khai báo sau:
struct Ngay ngay_sinh;
Ta thấy việc khai báo biến cấu trúc giống khai báo biến kiểu liệu chuẩn Trong dòng khai báo trên, kiểu liệu struct Ngay tên biến ngay_sinh
5.2 Kết hợp ñịnh nghĩa cấu trúc khai báo biến cấu trúc
Trong phần 5.1, ñã biết ñịnh nghĩa cấu trúc sử dụng kiểu liệu ñể
khai báo biến Có thể kết hợp cảñịnh nghĩa cấu trúc khai báo biến vào lệnh theo mẫu sau:
struct [Tên cấu trúc] {
<Kiểu 1> <Tên thành phần 1>; <Kiểu 2> <Tên thành phần 2>;
(86)85
Với cách này, biến có kiểu cấu trúc có thành phần nhưđược khai báo cặp ngoặc nhọn {} Tên cấu trúc trường hợp có, khơng
Ví dụ, định nghĩa cấu trúc mơ tả ngày tháng đồng thời khai báo biến tu_ngay, den_ngay, ta dùng hai cách sau:
Cách 1: có tên cấu trúc: struct Ngay {
int ngay; int thang; int nam;
} tu_ngay, den_ngay;
Cách 2: tên cấu trúc: struct
{
int ngay; int thang; int nam;
} tu_ngay, den_ngay;
Sự khác hai cách là, cách vừa ñịnh nghĩa cấu trúc tên Ngay biến cấu trúc tu_ngay, den_ngay Sau ñịnh nghĩa này, ta dùng kiểu struct Ngay để khai báo biến khác
Cách ñịnh nghĩa biến tu_ngay, den_ngay có kiểu cấu trúc gồm ba trường: ngay, thang nam Vì khơng đặt tên cho cấu trúc, nên sau định nghĩa ngày khơng thể sử dụng kiểu liệu nữa, khơng thểđịnh nghĩa biến kiểu với biến tu_ngay, den_ngay
5.3 Sử dụng typedef ñểñịnh nghĩa kiểu dữ liệu cấu trúc
5.3.1 ðịnh nghĩa kiểu bằng typedef
Sử dụng từ khoá typedef, định nghĩa kiểu liệu dựa kiểu liệu có Mẫu chung cho việc ñịnh nghĩa kiểu liệu typedef nhau:
typedef <kiểu> <danh sách tên>;
Ví dụ, biết C khơng định nghĩa kiểu liệu logic, mà kiểu liệu ñược biểu diễn thông qua kiểu liệu Trong ví dụ này, sử dụng kiểu số nguyên ñể biểu diễn kiểu logic, ñịnh nghĩa sau:
typedef int BOOL, BIT;
Sau ñịnh nghĩa này, có kiểu liệu BOOL, BIT, mà thực chất kiểu int Kiểu BOOL, BIT dùng để khai báo biến sau:
BOOL tiep_tuc; BIT ket_qua;
ðoạn lệnh khai báo biến tiep_tuc kiểu BOOL ket_qua kiểu BIT Về mặt chất, biến có kiểu ngun, nhiên ta coi biến có kiểu logic nên biến nên nhận hai giá trị (biểu diễn giá trị sai) (biểu diễn giá trịñúng)
5.3.2 Sử dụng typedef ñểñịnh nghĩa kiểu cấu trúc
(87)86
Giả sử ñã ñịnh nghĩa kiểu struct Ngay, ñịnh nghĩa kiểu liệu tương ñương kiểu liệu sau:
typdef struct Ngay KieuNgay;
Sau định nghĩa kiểu KieuNgay, dùng kiểu liệu ñể khai báo biến cách ngắn gọn sau:
KieuNgay ngay_batdau, ngay_kethuc;
Chúng ta kết hợp định nghĩa cấu trúc với từ khố typedef đểđịnh nghĩa kiểu
liệu cấu trúc theo mẫu sau: typdef struct [Tên] {
<Kiểu 1> <Tên thành phần 1>; <Kiểu 2> <Tên thành phần 2>;
} <danh sách tên kiểu>;
Với cách này, tên cấu trúc có, khơng Ví dụ sau định nghĩa kiểu KieuNgay kết hợp với ñịnh nghĩa cấu trúc theo hai cách:
Cách 1: có tên cấu trúc: typedef struct Ngay {
int ngay; int thang; int nam; } KieuNgay;
Cách 2: khơng có tên cấu trúc: typedef struct
{
int ngay; int thang; int nam; } KieuNgay;
Khác biệt hai cách chỗ: với cách 1, sử dụng kiểu liệu struct Ngay KieuNgay, cịn với cách có kiểu liêu KieuNgay
5.4 Truy cập thành phần của cấu trúc
Với biến kiểu nguyên hay kiểu thực, nội dung biến mang giá trị
kiểu tương ứng Một biến cấu trúc mang nhiều thành phần khác làm việc với thành phần
Việc truy cập thành phần biến cấu trúc thực toán tử chấm (.) Toán tử cho phép truy cập ñến thành phần cấu trúc biết tên biến cấu trúc tên thành phần Cú pháp sau:
<biến cấu trúc>.<tên thành phần>
Trong trường hợp thành phần cấu trúc cấu trúc, áp dụng tốn tử
này cho thành phần để truy cập vào thành phần sâu
Nếu làm việc với biến cấu trúc thông qua trỏ, tốn tửđể truy cập đến thành phần cấu trúc toán tử ->
(88)87 5.5.1 Ví dụ
Nhập toạ ñộ N ñiểm mặt phẳng Tính tổng ñộ dài ñường gấp khúc ñi qua
ñiểm theo thứ tự nhập vào
Với ví dụ này, dùng mảng số thực để lưu toạ ñộ x y
điểm Một cách khác dùng cấu trúc mơ tảđiểm, x y thành phần cấu trúc Mảng ñiểm mảng cấu trúc
#include <stdio.h> #include <math.h> typedef struct {
float x; float y; } DIEM, *PDIEM;
// Khai bao cac nguyen mau ham void NhapDiem(PDIEM, int); float TinhDoDai(PDIEM, int);
void main() {
DIEM day[100]; int n;
printf("Nhap so diem: "); scanf("%d", &n);
NhapDiem(day, n);
printf("Do dai duong gap khuc la: %.3f", TinhDoDai(day, n)); }
void NhapDiem(PDIEM pDiem, int n) {
DIEM diem; int i;
for (i = 0; i < n; i++) {
printf("x[%d] = ", i + 1); scanf("%f", &diem.x); printf("y[%d] = ", i + 1); scanf("%f", &diem.y); pDiem[i] = diem; }
}
float TinhDoDai(PDIEM pDiem, int n) {
float do_dai, dx, dy; int i;
do_dai = 0;
for (i = 0; i < n - 1; i++) {
dx = (pDiem[i + 1].x - pDiem[i].x); dy = (pDiem[i + 1].y - pDiem[i].y); do_dai+= sqrt(dx*dx + dy*dy); }
return do_dai; }
(89)88
Nhập danh sách gồm n thí sinh dự thi đại học, thí sinh cấu trúc gồm trường: Họ tên, Quê, ðiểm toán, ðiểm lý, ðiểm hoá
Yêu cầu:
- Nhập điểm chuẩn sau tìm in hình danh sách thí sinh đỗđại học có q “Ha Noi” (Thí sinh đỗ đại học có tổng điểm khơng điểm chuẩn)
- Tìm in hình danh sách thí sinh có điểm tốn cao - In hình tồn thơng tin n thí sinh
ðể giải tốn ta có chương trình sau: #include <stdio.h>
#include <string.h>
// Dinh nghia kieu Ho so sinh vien typedef struct {
char HoTen[30]; char Que[50]; float DiemToan; float DiemLy; float DiemHoa; } HSSV, *PHSSV;
void NhapHSSV(PHSSV pSv, int n) {
HSSV sv; int i;
for (i = 0; i < n; i++) {
printf("Ten sinh vien %d: ", i + 1); fflush(stdin);
gets(sv.HoTen);
printf("Que sinh vien %d: ", i + 1); fflush(stdin);
gets(sv.Que);
printf("Diem toan, ly, hoa sinh vien %d: ", i + 1); scanf("%f%f%f", &sv.DiemToan, &sv.DiemLy, &sv.DiemHoa); pSv[i] = sv;
} }
void InHSSV(PHSSV pSv, int n) {
int i;
printf("%4s %20s %20s %6s %6s %6s\n",
"STT", "Ho ten", "Que quan", "Toan", "Ly", "Hoa"); for (i = 0; i < n; i++)
printf("%4d %20s %20s %6.1f %6.1f %6.1f\n", i + 1, pSv[i].HoTen, pSv[i].Que, pSv[i].DiemToan, pSv[i].DiemLy, pSv[i].DiemHoa); }
void main() {
HSSV day[50]; int n, i;
float chuan, max;
printf("Nhap so sinh vien: "); scanf("%d", &n);
(90)89 NhapHSSV(day, n);
// In ds sinh vien vua nhap InHSSV(day, n);
// Tim kiem cac sinh vien que o Ha Noi printf("Nhap diem chuan: ");
scanf("%f", &chuan);
printf("\nDanh sach sinh vien do, que o Ha Noi:\n");
printf("%4s %20s %20s %6s %6s %6s\n",
"STT", "Ho ten", "Que quan", "Toan", "Ly", "Hoa");
for (i = 0; i < n; i++)
if ((day[i].DiemToan + day[i].DiemLy + day[i].DiemHoa >= chuan)&& (strcmpi(day[i].Que, "Ha Noi") == 0))
printf("%4d %20s %20s %6.1f %6.1f %6.1f\n", i + 1, day[i].HoTen, day[i].Que, day[i].DiemToan, day[i].DiemLy, day[i].DiemHoa);
// Tim diem toan cao nhat max = day[0].DiemToan; for (i = 1; i < n; i++) if (max < day[i].DiemToan) max = day[i].DiemToan;
// In danh sach sinh vien diem toan cao nhat
printf("\nDanh sach sinh vien diem toan cao nhat:\n");
printf("%4s %20s %20s %6s %6s %6s\n",
"STT", "Ho ten", "Que quan", "Toan", "Ly", "Hoa");
for (i = 0; i < n; i++)
if (day[i].DiemToan == max)
printf("%4d %20s %20s %6.1f %6.1f %6.1f\n", i + 1, day[i].HoTen, day[i].Que, day[i].DiemToan, day[i].DiemLy, day[i].DiemHoa);
}
Trong chương trình trên, ta xây dựng hàm nhập (NhapHSSV) in (InHSSV) danh sách sinh viên Sau sử dụng chúng hàm main ðộc giả viết lại chương trình mà không sử dụng hàm cách viết trực tiếp đoạn chương trình nhập in vào hàm main
BÀI TẬP CHƯƠNG
Bài Xây dựng cấu trúc (ứng với phiếu ñiểm thí sinh) gồm thành phần: - Họ tên
- Quê quán - Trường - Tuổi
- Số báo danh - ðiểm thi
(91)90
ðọc số liệu từ phiếu ñiểm cụ thể lưu trữ vào thành phần cấu trúc nói trên, sau
đó in số liệu hình
Bài Sử dụng định nghĩa cấu trúc :
Nhập số liệu 20 phiếu ñiểm lưu trữ vào mảng cấu trúc nói Tìm kiếm in thí sinh có tổng sốđiểm ba mơn lớn 15
Bài Giả sửñã nhập số liệu 20 phiếu ñiểm theo yêu cầu Hãy lập chương trình xếp lại phần tử mảng cấu trúc theo thứ tự giảm dần tổng sốđiểm, sau in danh sách thí sinh (theo thứ tự nói trên) Mỗi thí sinh in dịng gồm thơng tin:
- Họ tên - Quê quán - Số báo danh - ðiểm toán, lý, hóa
Bài Nhập danh sách n học sinh với thuộc tính: họ tên, năm sinh tổng ñiểm Sắp xếp danh sách theo thứ tự giảm tổng điểm Khi tổng điểm học sinh có năm sinh nhỏ xếp trước In danh sách học sinh ñã xếp cho tất chữ họ
tên chuyển thành chữ hoa
Bài ðịnh nghĩa kiểu cấu trúc mô tả đa thức, sau viết hàm vào đa thức, in ña thức, cộng ña thức nhân ña thức áp dụng hàm main() ñể thực việc:
Vào từ bàn phím ba đa thức P1, P2 P3 Tính đa thức P theo cơng thức: P = (P1 + P2)2 + P3
In P1, P2, P3 P
(92)91
PHỤ LỤC - BẢNG MÃ ASCII
Bộ ký tự ASCII (American Standard Code for Interchange Information) gồm 256 ký
ñược phân bố sau:
- 32 ký tựđầu tiên ký tựđiều khiển khơng in ñược ký tự Enter (mã 13), ký tự ESC (mã 27)
- Các mã ASCII 32-47,58-64,91-96 123-127 ký tựñặc biệt dấu chấm, dấu phẩy, dấu cách, dấu ngoặc, dấu móc, dấu hỏi,
- Các mã ASCII 48-57 10 chữ số
- Các mã ASCII 65-90 chữ hoa từ A ñến Z - Các mã ASCII 97-122 chữ thường từ a ñến z - Các mã ASCII 128-255 ký tựñồ hoạ
MÃ KÝ TỰ MÃ KÝ TỰ MÃ KÝ TỰ
0 NUL 43 + 86 V
1 SOH 44 , 87 W
2 STX 45 - 88 X
3 ETX 46 89 Y
4 EOT 47 / 90 Z
5 ENQ 48 91 [
6 ACK 49 92 \
7 BEL 50 93 ]
8 BS 51 94 ^
9 HT 52 95 _
10 LF 53 96 `
11 VT 54 97 a
12 FF 55 98 b
13 CR 56 99 c
14 SO 57 100 d
15 SI 58 : 101 e
16 DLE 59 ; 102 f
17 DC1 60 < 103 g
18 DC2 61 = 104 h
19 DC3 62 > 105 i
20 DC4 63 ? 106 j
21 NAK 64 @ 107 k
22 SYN 65 A 108 l
(93)92
24 CAN 67 C 110 n
25 EM 68 D 111 o
26 SUB 69 E 112 p
27 ESC 70 F 113 q
28 FS 71 G 114 r
29 GS 72 H 115 s
30 RS 73 I 116 t
31 US 74 J 117 u
32 Space 75 K 118 v
33 ! 76 L 119 w
34 ” 77 M 120 x
35 # 78 N 121 y
36 $ 79 O 122 z
37 % 80 P 123 {
38 & 81 Q 124 |
39 ’ 82 R 125 }
40 ( 83 S 126 ~
41 ) 84 T 127 DEL
42 * 85 U
(94)93
PHỤ LỤC
DANH SÁCH MỘT SỐ HÀM CỦA TURBO C
(theo thứ tự ABC)
ðể biết chi tiết, ñề nghịñộc giả sử dụng help mơi trường TC cách đánh tên hàm mơi trường TC sau để trỏ tên hàm rối nhấn Ctrl + F1
Hàm Tệp tiêu ñề Hàm Tệp tiêu ñề
(95)94
(96)95
121 labs <stdlib.h> 147 perror <stdio.h> 122 line <graphics.h> 148 pieslice <graphics.h> 123 linerel <graphics.h> 149 poke <dos.h> 124 lineto <graphics.h> 150 pokeb <dos.h> 125 log <math.h> 151 pow <math.h> 126 log10 <math.h> 152 printf <stdio.h> 127 lseek <io.h> 153 putc <stdio.h> 128 Ltoa <ctype.h> 154 putch <conio.h> 129 malloc <alloc.h> 155 putchar <stdio.h> 130 memccpy <memory.h>
<string.h>
156 putimage <graphics.h>
131 memchr <memory.h> <string.h>
157 putpixel <graphics.h>
132 memcmp <memory.h> <string.h>
158 puts <stdio.h>
133 memcpy <memory.h> <string.h>
159 putw <stdio.h>
134 memicmp <memory.h> <string.h>
160 rand <stdlib.h>
135 memset <memory.h> <string.h>
161 random <stdlib.h>
136 MK_FP <dos.h> 162 randomize <stdlib.h> <time.h> 137 mkdir <dir.h> 163 read <io.h> 138 movedata <mem.h> 164 realloc <alloc.h> 139 movedata <memory.h>
<string.h>
165 rectangle <graphics.h>
(97)96
(98)- Đối tượng sử dụng: sinh viên ngành kỹ thuật
- Các từ khóa: Tin học Đại cương, Tin Đại cương, Lập trình cấu trúc, Ngơn
ngữ lập trình, Ngơn ngữ lập trình C, Kỹ thuật lập trình, Thuật tốn, Lập trình C, Sơ đồ khối, Ngôn ngữ C
- Kiến thức u cầu mơn học trước: tốn học sở
(99)Directory: C:\Documents and
Settings\Administrator\Desktop\GT80\TinDC_Ebook
Template: C:\Documents and Settings\Administrator\Application
Data\Microsoft\Templates\Normal.dot
Title: Thông tin về tác giả:
Subject:
Author: Nguyen Duc Du
Keywords: Comments:
Creation Date: 12/12/2008 9:15 PM
Change Number: 4
Last Saved On: 12/15/2008 9:50 AM
Last Saved By: Nguyen Duc Du
Total Editing Time: 25 Minutes
Last Printed On: 1/14/2004 9:54 AM
As of Last Complete Printing Number of Pages:
Number of Words: 53 (approx.)
(100)[1] PGS.TS Phạm Văn Ất
Kỹ thuật lập trình C, cơ sở nâng cao
Nhà xuất bản Khoa học Kỹ thuật
[2] Robert Sedgewick
Cẩm nang thuật toán (bản dịch), tập
Nhà xuất bản Khoa học kỹ thuật