Tài liệu Đề cương Cơ sở kỹ thuật lập trình: TRƢỜNG ĐẠI HỌC SƢ PHẠM KỸ THUẬT HƢNG YÊN
KHOA CÔNG NGHỆ THÔNG TIN
ĐỀ CƢƠNG
CƠ SỞ KỸ THUẬT LẬP TRÌNH
HƢNG YÊN – 2015
MỤC LỤC
MỤC LỤC .............................................................................................................. 2
BÀI 1: CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ LẬP TRÌNH ........ 8
1.1 Cấu trúc chung của một chương trình ..................................................... 8
1.1.1 Cấu trúc của một chương trình ............................................................ 8
1.1.2 Các bước để tạo và thực hiện một chương trình ................................. 9
1.1.3 Một số quy tắc cần nhớ khi viết chương trình ................................... 11
1.2 Các thành phần cơ bản của một ngôn ngữ lập trình .............................. 12
1.2.1 Bảng chữ cái ...................................................................................... 12
1.2.2 Từ khóa ....................................................................................
145 trang |
Chia sẻ: putihuynh11 | Lượt xem: 582 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Đề cương Cơ sở kỹ thuật lập trình, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
TRƢỜNG ĐẠI HỌC SƢ PHẠM KỸ THUẬT HƢNG YÊN
KHOA CÔNG NGHỆ THÔNG TIN
ĐỀ CƢƠNG
CƠ SỞ KỸ THUẬT LẬP TRÌNH
HƢNG YÊN – 2015
MỤC LỤC
MỤC LỤC .............................................................................................................. 2
BÀI 1: CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ LẬP TRÌNH ........ 8
1.1 Cấu trúc chung của một chương trình ..................................................... 8
1.1.1 Cấu trúc của một chương trình ............................................................ 8
1.1.2 Các bước để tạo và thực hiện một chương trình ................................. 9
1.1.3 Một số quy tắc cần nhớ khi viết chương trình ................................... 11
1.2 Các thành phần cơ bản của một ngôn ngữ lập trình .............................. 12
1.2.1 Bảng chữ cái ...................................................................................... 12
1.2.2 Từ khóa .............................................................................................. 12
1.2.3 Tên (định danh) ................................................................................. 13
1.3 Các kiểu dữ liệu cơ bản ......................................................................... 14
1.3.1 Kiểu ký tự .......................................................................................... 15
1.3.2 Kiểu số nguyên .................................................................................. 16
1.3.3 Kiểu dấu phẩy động ........................................................................... 16
1.4 Biến, hằng và cách khai báo .................................................................. 17
1.4.1 Biến và cách khai báo ........................................................................ 17
1.4.2 Hằng và cách khai báo....................................................................... 18
BÀI 2: BIỂU THỨC, CÁC PHÉP TOÁN VÀ VẤN ĐỀ NHẬP XUẤT .......... 22
2.1 Biểu thức ................................................................................................ 22
2.2 Câu lệnh, khối lệnh ................................................................................ 22
2.2.1 Câu lệnh ............................................................................................. 22
2.2.2 Các câu lệnh và các khoảng trắng ..................................................... 23
2.2.3 Khối lệnh ........................................................................................... 24
2.3 Các phép toán......................................................................................... 24
Đề cương bài giảng Cơ sở kỹ thuật lập trình
3
2.3.1 Các phép toán số học ......................................................................... 24
2.3.2 Phép toán so sánh .............................................................................. 25
2.3.3 Phép toán logic .................................................................................. 25
2.3.4 Phép gán ............................................................................................ 26
2.3.5 Thứ tự ưu tiên các phép toán ............................................................. 26
2.3.6 Phép chuyển đối kiểu ........................................................................ 27
2.4 Nhập/xuất dữ liệu ................................................................................... 30
2.4.1 Xuất dữ liệu ....................................................................................... 30
2.4.2 Nhập dữ liệu ...................................................................................... 32
2.5 Bài tập .................................................................................................... 33
BÀI 3: CẤU TRÚC ĐIỀU KHIỂN ................................................................... 35
3.1 Giới thiệu về cấu trúc điều khiển ........................................................... 35
3.2 Cấu trúc điều khiển rẽ nhánh if .............................................................. 35
3.2.1 Cấu trúc rẽ nhánh dạng khuyết .......................................................... 35
3.2.2 Cấu trúc rẽ nhánh dạng đủ ................................................................. 36
3.3 Cấu trúc điều khiển rẽ nhánh swicth...................................................... 38
3.4 Bài tập .................................................................................................... 41
BÀI 4: CẤU TRÚC LẶP ................................................................................... 43
4.1. Giới thiệu về cấu trúc lặp ........................................................................... 43
4.2. Cấu trúc lặp xác định ............................................................................. 43
4.2.1. Cấu trúc lặp For .................................................................................. 43
4.1.2 Ví dụ áp dụng .................................................................................... 45
4.3. Cấu trúc lặp không xác định ...................................................................... 46
4.3.1. Cấu trúc lặp while ............................................................................... 46
Đề cương bài giảng Cơ sở kỹ thuật lập trình
4
4.3.2. Cấu trúc lặp do.. while ........................................................................ 49
4.4. Các câu lệnh đặc biệt ................................................................................. 52
4.4.1. Câu lệnh break .................................................................................... 52
4.4.2. Câu lệnh continue ............................................................................... 53
4.5. Bài tập ........................................................................................................ 53
BÀI 5: THẢO LUẬN/BÀI TẬP VỀ CÁC CẤU TRÚC LẶP VÀ CẤU TRÚC
ĐIỀU KHIỂN 55
BÀI 6: MẢNG MỘT CHIỀU ............................................................................ 59
6.1 Giới thiệu về mảng một chiều ................................................................ 59
6.1.1 Khái niệm về mảng một chiều ........................................................... 60
6.1.2 Cách khai báo .................................................................................... 60
6.1.3 Đặc điểm của mảng một chiều .......................................................... 61
6.1.4 Cách khởi tạo phần tử cho mảng ....................................................... 62
6.2 Truy xuất các phần tử trong mảng ......................................................... 62
6.3 Các thao tác với mảng một chiều ........................................................... 63
6.3.1 Nhập mảng ........................................................................................ 63
6.3.2 Hiện mảng ......................................................................................... 64
6.2 Ví dụ áp dụng ......................................................................................... 65
BÀI 7: THỰC HÀNH VỀ CẤU TRÚC ĐIỀU KHIỂN VÀ CẤU TRÚC LẶP 72
BÀI 8: MẢNG HAI CHIỀU .............................................................................. 73
8.1. Giới thiệu về mảng hai chiều ................................................................. 73
8.1.1 Định nghĩa ......................................................................................... 73
8.1.2 Các cách khai báo .............................................................................. 74
8.2 Truy xuất các phần tử trong mảng hai chiều ......................................... 75
8.3 Các thao tác với mảng hai chiều ............................................................ 76
Đề cương bài giảng Cơ sở kỹ thuật lập trình
5
8.3.1 Nhập mảng ........................................................................................ 76
8.3.2 Hiện mảng ......................................................................................... 77
8.4 Một số ví dụ về mảng hai chiều ............................................................. 79
BÀI 9: THỰC HÀNH VỀ MẢNG (BUỔI 1) .................................................... 82
BÀI 10: THẢO LUẬN/BÀI TẬP VỀ MẢNG ................................................. 83
BÀI 11: THỰC HÀNH VỀ MẢNG (BUỔI 2) ................................................ 86
BÀI 12: THAO TÁC VỚI KÝ TỰ VÀ XÂU KÝ TỰ ..................................... 87
12.1 Giới thiệu về ký tự và xâu ký tự ............................................................ 87
12.1.1 Sử dụng các biến ký tự .................................................................... 88
12.1.2 Mảng của các ký tự ......................................................................... 89
12.1.3 Khởi tạo các mảng ký tự ................................................................. 90
12.2 Các thao tác trên xâu .............................................................................. 90
12.2.1 Nhập xâu .......................................................................................... 90
12.2.2 Hiển thị xâu và các ký tự ................................................................. 93
12.2.3 Một số thư viện hàm sử dụng trên xâu ............................................ 95
12.3 Bài tập .................................................................................................... 96
BÀI 13: THỰC HÀNH VỀ XỬ LÝ CHUỖI KÝ TỰ ...................................... 98
BÀI 14: KIỂU CẤU TRÚC VÀ TỆP ............................................................ 100
14.1 Giới thiệu về kiểu cấu trúc ................................................................... 100
14.2 Các thao tác trên biến cấu trúc ............................................................. 101
14.3 Mảng cấu trúc ...................................................................................... 102
14.4 Vấn đề vào/ra dữ liệu với tệp ............................................................... 102
14.4.1 Khai báo sử dụng tệp: .................................................................... 103
14.4.2 Mở tệp - hàm fopen ....................................................................... 103
Đề cương bài giảng Cơ sở kỹ thuật lập trình
6
14.4.3 Đóng tệp - hàm fclose ................................................................... 104
14.4.4 Làm sạch vùng đệm - hàm fflush .................................................. 105
14.4.5 Đọc/ghi tệp tin – hàm fprintf() và fscanf() .................................... 105
14.5 Bài tập .................................................................................................. 106
BÀI 15: THẢO LUẬN/ BÀI TẬP VỀ KIỂU CẤU TRÚC VÀ TỆP ............ 108
BÀI 16: THỰC HÀNH VỀ KIỂU CẤU TRÚC VÀ TỆP ............................. 111
BÀI 17: HÀM (2 BUỔI) ................................................................................ 112
17.1 Giới thiệu chung về hàm ...................................................................... 112
17.2 Cơ bản về hàm ..................................................................................... 114
17.2.1 Định nghĩa ..................................................................................... 114
17.2.2 Cấu trúc của một hàm tự xây dựng như sau: ................................. 115
17.2.3 Nguyên tắc xây dựng một hàm ...................................................... 119
17.3 Các khái niệm ...................................................................................... 120
17.3.1 Biến cục bộ .................................................................................... 120
17.3.2 Biến toàn cục ................................................................................. 120
17.3.3 Tham số hình thức ......................................................................... 120
17.3.4 Tham số thực thụ ........................................................................... 121
17.4 Cách gọi hàm ....................................................................................... 121
17.4.1 Lời gọi hàm ................................................................................... 121
17.4.2 Truyền tham số cho hàm ............................................................... 122
17.4.3 Đệ qui ............................................................................................ 122
17.5 Nguyên tắc hoạt động của hàm ............................................................ 124
17.6 Cấu trúc của một chương trình có nhiều hàm ...................................... 124
17.7 Bài tập về hàm ..................................................................................... 125
Đề cương bài giảng Cơ sở kỹ thuật lập trình
7
BÀI 18: THẢO LUẬN/BÀI TẬP VỀ HÀM ................................................. 127
BÀI 19: THỰC HÀNH VỀ HÀM .................................................................. 129
BÀI 20: CON TRỎ VÀ ỨNG DỤNG ........................................................... 130
20.1. Giới thiệu về con trỏ .............................................................................. 130
20.2. Khai báo và sử dụng con trỏ .................................................................. 130
20.2.1. Khai báo con trỏ .............................................................................. 130
20.2.2. Sử dụng con trỏ ............................................................................... 131
20.3. Một số ứng dụng của con trỏ ................................................................. 133
20.3.1. Con trỏ và mảng một chiều ............................................................. 133
20.3.2. Con trỏ và mảng hai chiều ............................................................. 135
20.3.3. Con trỏ và xâu ký tự ....................................................................... 136
BÀI 21: THỰC HÀNH VỀ CON TRỎ.......................................................... 137
BÀI 22: THẢO LUẬN/BÀI TẬP VỀ CON TRỎ ......................................... 138
BÀI 23: KIỂM TRA THỰC HÀNH .............................................................. 145
Đề cương bài giảng Cơ sở kỹ thuật lập trình
8
BÀI 1: CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN
NGỮ LẬP TRÌNH
MỤC TIÊU
Học xong bài này sinh viên có khả năng:
o Trình bày được cấu trúc chung của một chương trình và các thành phần cơ
bản của ngôn ngữ lập trình;
o Trình bày được đặc điểm, cách sử dụng của các kiểu dữ liệu;
o Trình bày được quy tắc khai báo biến, hằng;
o Sử dụng được các phép toán cơ bản vào bài toán cụ thể;
o Rèn luyện tính tư duy, logic trong lập trình.
1.1 Cấu trúc chung của một chƣơng trình
Ngôn ngữ lập trình là một hệ thống được ký hiệu hóa để miêu tả những tính toán
(qua máy tính) dưới dạng mà cả con người và máy đều có thể đọc và hiểu được.
Như vậy, theo định nghĩa ở trên thì một ngôn ngữ lập trình phải thỏa mãn được
hai điều kiện cơ bản sau:
- Dễ hiểu và dễ sử dụng đối với người lập trình, để có thể dùng để giải quyết
nhiều bài toán khác nhau.
- Miêu tả một cách đầy đủ và rõ ràng các tiến trình, để chạy được trên các hệ
máy tính khác nhau.
Một tập hợp các chỉ thị được biểu thị qua ngôn ngữ lập trình nhằm mục đích thực
hiện các thao tác nào đó được gọi là một chương trình. Khái niệm này còn có những
tên khác như chương trình máy tính hay chương trình điện toán.
1.1.1 Cấu trúc của một chƣơng trình
Cấu trúc chung của một chương trình gồm những thành phần chính như sau:
Đề cương bài giảng Cơ sở kỹ thuật lập trình
9
Để có cái nhìn tổng quan về cấu trúc của một chương trình, hãy xét ví dụ về
chương trình hiện lên dòng chữ “Hello World” trên màn hình. Trong giới lập trình,
chương trình “Hello World” không quá xa lạ gì, vì đó được xem là một chương trình
đầu tiên và chuẩn nhất cho cái nhìn bao quát về một ngôn ngữ nào đó được đề cập đến.
Nhưng nếu bạn chưa biết gì về lập trình thì cũng nên biết về chương trình này, và sau
này nếu có muốn học một ngôn ngữ khác thì bạn vẫn có thể tìm kiếm một “Hello
World” khác để biết ngôn ngữ đó khai báo như thế nào? bắt đầu ra sao? có khác gì so
với ngôn ngữ mà mình đã biết hay không. Và để có câu trả lời, hãy cùng theo dõi ví dụ
sau. Ví dụ được minh họa trên ngôn ngữ lập trình C:
1.1.2 Các bƣớc để tạo và thực hiện một chƣơng trình
a) Qui trình viết và thực hiện chương trình
Trước khi viết và chạy một chương trình thông thường chúng ta cần:
1. Xác định yêu cầu của chương trình: Nghĩa là xác định dữ liệu đầu vào (input)
cung cấp cho chương trình và tập các dữ liệu cần đạt được - tức đầu ra (output). Các
tập hợp dữ liệu này ngoài các tên gọi còn cần xác định kiểu của nó. Ví dụ để giải một
#include /* Lời gọi thư viện Nhập xuất */
#include /* Lời gọi thư viện xử lý màn hình */
int main() /* Hàm chính(bắt buộc có) của chương trình*/
{
printf("Hello World!"); /* Xuất ra màn hình dòng chữ Hello
World!*/
getch(); /* Đợi người dùng nhập vào 1 phím bất
kỳ rồi mới tiếp tục */
return 0; /* Kết thúc hàm*/
}
1. Lời gọi các thư viện sẽ sử dụng trong chương trình
2. Khai báo hằng, biến toàn cục
3. Khai báo chương trình con
4. Chương trình chính
Đề cương bài giảng Cơ sở kỹ thuật lập trình
10
phương trình bậc 2 dạng: ax2 + bx + c = 0, cần báo cho chương trình biết dữ liệu đầu
vào là a, b, c và đầu ra là nghiệm x1 và x2 của phương trình. Kiểu của a, b, c, x1, x2 là
các số thực.
2. Xác định thuật toán giải.
3. Cụ thể hoá các khai báo kiểu và thuật toán thành dãy các lệnh, tức viết thành
chương trình thông thường là trên giấy, sau đó bắt đầu soạn thảo vào trong máy. Quá
trình này được gọi là soạn thảo chương trình nguồn.
4. Dịch chương trình nguồn để tìm và sửa các lỗi gọi là lỗi cú pháp.
5. Chạy chương trình, kiểm tra kết quả in ra trên màn hình. Nếu sai, sửa lại
chương trình, dịch và chạy lại để kiểm tra. Quá trình này được thực hiện lặp đi lặp lại
cho đến khi chương trình chạy tốt theo yêu cầu đề ra của lập trình.
b) Soạn thảo tệp chương trình nguồn
Soạn thảo chương trình nguồn là một công việc đơn giản: gõ nội dung của
chương trình (đã viết ra giấy) vào trong máy và lưu lại nó lên đĩa. Thông thường khi
đã lưu lại chương trình lên đĩa lần sau sẽ không cần phải gõ lại. Mục đích của soạn
thảo là tạo ra một văn bản chương trình và đưa vào bộ nhớ của máy. Văn bản chương
trình cần được trình bày sáng sủa, rõ ràng. Các câu lệnh cần gióng thẳng cột theo cấu
trúc của lệnh (các lệnh chứa trong một lệnh cấu trúc được trình bày thụt vào trong so
với điểm bắt đầu của lệnh). Các chú thích nên ghi ngắn gọn, rõ nghĩa và phù hợp.
c) Dịch chương trình
Sau khi đã soạn thảo xong chương trình nguồn, bước tiếp theo thường là dịch
(trong C ấn phím F11 hoặc chọn Build/ compile) để tìm và sửa các lỗi gọi là lỗi cú
pháp. Trong khi dịch chương trình sẽ đưa ra thông báo lỗi và chỉ ra nơi gây lỗi. Để
chương trình có thể chạy được thì người lập trình phải sửa hết những lỗi đó. Quá trình
dịch và sửa lỗi cứ diễn ra cho đến khi nào chương trình không còn lỗi và đưa ra thông
báo dịch thành công. Sản phẩm sau khi dịch là một tệp mới gọi là chương trình đích có
đuôi EXE tức là tệp mã máy để thực hiện. Tệp này có thể lưu tạm thời trong bộ nhớ
phục vụ cho quá trình chạy chương trình hoặc lưu lại trên đĩa tuỳ theo tuỳ chọn khi
dịch của lập trình.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
11
d) Chạy chương trình
Để chạy chương trình, trong C ấn phím F5 hoặc chọn Build/ Run, nếu chương
trình chưa dịch sang mã máy, máy sẽ tự động dịch lại trước khi chạy. Kết quả của
chương trình sẽ hiện ra trong một cửa sổ kết quả để người lập trình kiểm tra. Nếu kết
quả chưa được như mong muốn thì quay lại văn bản để sửa và lại chạy lại chương
trình. Quá trình này được lặp lại cho đến khi chương trình chạy đúng như yêu cầu đã
đề ra. Khi chương trình chạy, cửa sổ kết quả sẽ hiện ra tạm thời che khuất cửa sổ soạn
thảo. Sau khi kết thúc chạy chương trình cửa sổ soạn thảo sẽ tự động hiện ra trở lại và
che khuất cửa sổ kết quả.
1.1.3 Một số quy tắc cần nhớ khi viết chƣơng trình
a) Quy tắc 1:
Mỗi câu lệnh có thể viết trên một hay nhiều dòng nhưng phải kết thúc bằng dấu
chấm phẩy (;)
b) Quy tắc 2:
Có 2 cách ghi chú thích trong chương trình:
- Cách 1: Các lời giải thích cần đặt giữa các dấu /* và */ và có thể được viết:
Trên một dòng
Trên nhiều dòng
Trên phần còn lại của dòng
- Cách 2: Các lời chú thích đặt sau dấu // thường được dùng khi lời chú thích
được viết trên 1 dòng.
c) Quy tắc 3:
Trong chương trình, khi ta sử dụng các hàm chuẩn, ví dụ như getch() mà hàm
này lại được chứa trong file conio.h trong thư mục của C, vì vậy ở đầu chương trình ta
phải khai báo sử dụng:
#include
d) Quy tắc 4:
Đề cương bài giảng Cơ sở kỹ thuật lập trình
12
Một chương trình có thể chỉ có một hàm chính (hàm main()) hoặc có thể có thêm
vài hàm khác nữa.
1.2 Các thành phần cơ bản của một ngôn ngữ lập trình
1.2.1 Bảng chữ cái
Mọi ngôn ngữ lập trình đều được xây dựng từ một bộ ký tự nào đó. Các ký tự
được nhóm lại theo nhiều cách khác nhau để tạo nên các từ. Các từ lại đươc liên kết
với nhau theo một quy tắc nào đó để tạo nên các câu lệnh. Một chương trình bao gồm
nhiều câu lệnh thể hiện một thuật toán để giải một bài toán cụ thể. Hầu hết các ngôn
ngữ lập trình đều được xây dựng trên bộ ký tự sau:
26 chứ cái hoa: A, B, C,.Z
26 chữ cái thường: a,b,c,.z
10 chữ số: 0,1,20
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 sự là một khoảng trống để tách các từ. Ví dụ HUNG YEN
gồm 8 ký tự, còn HUNGYEN gồm 7 ký tự.
Chú ý: Khi viết chương trình ta không được sử dụng bất kỳ ký hiệu nào khác ngoài
tập các ký tự nói trên.
Chẳng hạn, khi giải phương trình bậc hai:
ax
2
+ bx + c = 0
ta cần tính biệt thức:
∆ = b2 - 4ac
Ký tự ∆ không cho phép dùng trong ngôn ngữ C, vì vậy ta phải dùng một ký hiệu
khác để thay thế như là d hoặc delta
1.2.2 Từ khóa
Từ khóa trong ngôn ngữ lập trình là các từ hay ký hiệu mà đã được ngôn ngữ đó
gán cho một ý nghĩa xác định. Người lập trình sẽ không được phép dùng lại các từ
khóa này dưới một ý nghĩa khác. Thường các từ khóa này được ngôn ngữ xác định
Đề cương bài giảng Cơ sở kỹ thuật lập trình
13
dùng trong các kiểu dữ liệu cơ bản hay trong các dòng điều khiển. Ví dụ một số từ
khóa thường sử dụng trong ngôn ngữ C:
break case Char continue default
double else Float for goto
if int Long return short
static struct switch typedef unsigned
void while
Ý nghĩa và cách sử dụng của chúng sẽ được lần lượt giới thiệu ở các mục sau. Ở
đây ta chỉ cần nhớ hai trường hợp:
- Không được dùng từ khóa để đặt tên cho các hằng, biến, mảng, hàm,
- Từ khóa phải được viết bằng chữ thường. Chẳng hạn, không được viết
BREAK mà phải viết là break.
1.2.3 Tên (định danh)
Tên (định danh) được dùng để xác định các đối tượng khác nhau trong một
chương trình. Chúng ta có tên hằng, tên biến, tên mảng, tên con trỏ, tên tệp, tên
nhãn,
Trong ngôn ngữ C, khi đặt tên phải tuân thủ theo quy tắc sau:
- Không chứa dấu cách
- Không bắt đầu bằng số
- Không chứa các ký tự đặc biệt (như: % ? / + =,)
- Không trùng với từ khóa, kiểu dữ liệu
Ví dụ 1.1: Cách đặt tên đúng:
Ví dụ 1.2: Cách đặt tên sai:
4abc_3; // ký tự đầu tiên là số
abc#3; //sử dụng ký tự
sinh_vien;
gptb_2;
Đề cương bài giảng Cơ sở kỹ thuật lập trình
14
f(x); //sử dụng các dấu ngoặc tròn
int; //trùng với từ khóa
del ta; //sử dụng khoảng trống
A-1; //sử dụng dấu gạch ngang
Chú ý: Trong C, với các tên thì chữ hoa và chữ thường được xem là khác nhau,
như vậy tên HocSinh và hocsinh là khác nhau. Thường dùng chữ hoa để đặt tên cho
các hằng và dùng chữ thường để đặt tên cho hầu hết các đối tượng khác như biến,
hằng, mảng, hàm, cấu trúc. Tuy nhiên, đây không phải là điều bắt buộc.
1.3 Các kiểu dữ liệu cơ bản
Thông thường, dữ liệu hay dùng là số và chữ. Tuy nhiên việc phân chia chỉ 2 loại
dữ liệu là không đủ. Để dễ dàng hơn cho việc lập trình, hầu hết các ngôn ngữ lập trình
đều phân chia dữ liệu thành nhiều kiểu khác nhau được gọi là các kiểu cơ bản hay
chuẩn. Trên cơ sở kết hợp các kiểu dữ liệu chuẩn, người sử dụng có thể tự đặt ra các
kiểu dữ liệu mới để phục vụ cho chương trình giải quyết bài toán của mình. Có nghĩa
lúc đó mỗi đối tượng được quản lý trong chương trình sẽ là một tập hợp nhiều thông
tin hơn và được tạo thành từ nhiều loại (kiểu) dữ liệu khác nhau.
Tất cả các biến cần phải được khai báo trước khi sử dụng và kiểu của chúng phải
được mô tả ngay khi khai báo. Việc khai báo này sẽ làm chương trình quản lý các biến
dễ dàng hơn như trong việc phân bố bộ nhớ cũng như quản lý các tính toán trên biến
theo nguyên tắc: chỉ có các dữ liệu cùng kiểu với nhau mới được phép làm toán với
nhau. Do đó, khi đề cập đến một kiểu chuẩn của một ngôn ngữ lập trình, thông thường
chúng ta sẽ xét đến các yếu tố sau:
- Tên kiểu: là một từ dành riêng để chỉ định kiểu của dữ liệu.
- Số byte trong bộ nhớ để lưu trữ một đơn vị dữ liệu thuộc kiểu này: Thông
thường số byte này phụ thuộc vào các trình biên dịch và hệ thống máy khác
nhau, ở đây ta chỉ xét đến hệ thống máy PC thông dụng hiện nay.
- Miền giá trị của kiểu: Cho biết một đơn vị dữ liệu thuộc kiểu này sẽ có thể lấy
giá trị trong miền nào, ví dụ nhỏ nhất và lớn nhất là bao nhiêu. Hiển nhiên các
giá trị này phụ thuộc vào số byte mà hệ thống máy qui định cho từng kiểu.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
15
Người sử dụng cần nhớ đến miền giá trị này để khai báo kiểu cho các biến cần
sử dụng một cách thích hợp.
Dưới đây sẽ lần lượt trình bày về 3 kiểu dữ liệu đơn giản chuẩn và thông dụng:
Kiểu ký tự, kiểu nguyên, kiểu dấu phẩy động.
1.3.1 Kiểu ký tự
Một giá trị kiểu ký tự chiếm 1 byte (8 bit) và biểu diễn được một ký tự thông qua
bảng mã ASCII. Ví dụ:
Ký tự Mã ASCII
0 048
1 049
2 050
A 065
B 066
A 097
B 098
Trong C, có hai kiểu ký tự là signed char và unsigned char. Kiểu thứ nhất biểu
diễn một số nguyên từ -128 đến 127, kiểu thứ hai có giá trị từ 0 đến 255. Bảng dưới
đây cho kích cỡ và phạm vi biểu diễn của giá trị kiểu char.
Kiểu Phạm vi biểu diễn Số ký tự Kích thƣớc (byte)
unsigned char 0 ->255 256 1
Char -128 ->127 256 1
Phân loại ký tự: Có thể chia 256 ký tự thành 3 nhóm:
- Nhóm thứ nhất là các ký tự điều khiển có mã từ 0 đến 31. Chẳng hạn ký tự mã
13 dùng để chuyển con trỏ về đầu dòng, ký tự 10 chuyển con trỏ xuống dòng
dưới (trên cùng cột). Các ký tự nhóm này nói chung không hiển thị ra màn
hình.
- Nhóm thứ hai là các ký tự văn bản có mã từ 32 đến 126. Các ký tự này có thể
đưa ra màn hình và máy in.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
16
- Nhóm thứ ba là các ký tự đồ họa có mã từ 127 đến 255. Các ký tự này có thể
đưa ra màn hình nhưng không in được.
1.3.2 Kiểu số nguyên
Kiểu số nguyên là kiểu dữ liệu dùng để lưu các giá trị nguyên hay còn gọi là kiểu
đếm được. Kiểu số nguyên trong C được chia thành các kiểu dữ liệu con, mỗi kiểu có
một miền giá trị khác nhau.
Trong C cho phép sử dụng: số nguyên (int), số nguyên dài (long) và số nguyên
không dấu (unsigned). Kích cỡ và phạm vi biểu diễn của chúng được chỉ ra trong bảng
dưới đây:
Kiểu Phạm vi biểu diễn Kích thƣớc (byte)
unsigned int 0 -> 65535 2
int -32768 -> 32767 2
unsigned long [int] 0 -> 4.294967295 4
long [int] -2147483648 -> 2147483648 4
Lƣu ý:
Kiểu long int có thể viết gọn thành long, kiểu unsigned int viết gọn thành
unsigned.
Có thế kết hợp nhiều tiền tố với một kiểu dữ liệu cơ sở, chẳng hạn unsigned long
int viết gọn thành unsigned long.
1.3.3 Kiểu dấu phẩy động
Kiểu dấu phẩy động biểu diễn cho các số thập phân có dấu.
Trong C cho phép sử dụng 3 loại giá trị dấu phẩy động là float, double và long
double. Kích cỡ và phạm vi biểu diễn của chúng được chỉ ra trong bảng dưới đây:
Kiểu Phạm vi biểu diễn Kích thƣớc (byte)
float 3.4E-38 -> 3.4E+38 4
double 1.7E-308 -> 1.7E+308 8
long double 3.4E4932 -> 3.4E+4932 10
Đề cương bài giảng Cơ sở kỹ thuật lập trình
17
Máy tính có thể lưu trữ được 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ỏ hơn 3.4E-38 được xem bằng 0. Phạm vi biểu diễn
của số double cũng được hiểu theo nghĩa tương tự.
1.4 Biến, hằng và cách khai báo
1.4.1 Biến và cách khai báo
Một biến là một tên gọi cho một đại lượng hoặc một đối tượng nào đó. Mỗi biến
đều được phân bổ một địa chỉ trong bộ nhớ dùng để lưu giữ giá trị của biến. Giá trị này
có thể thay đổi trong khi chương trình thực hiện. Trong C, một biến chỉ có thể được sử
dụng sau khi đã được khai báo. Một khai báo biến cho chương trình dịch biết tên của
biến và kiểu của dữ liệu mà nó lưu giữ.
a) Khai báo
Quy tắc khai báo:
Kiểu_dữ_liệu Danh_sách_tên_biến;
Danh sách tên biến: Gồm các tên biến có cùng kiểu dữ liệu, mỗi tên biến được
phân cách nhau bằng dấu phẩy(,), cuối cùng là dấu chấm phẩy (;).
Ví dụ 1.3:
Biến kiểu int chỉ nhận được các giá trị kiểu int. Các biến khác nhau cũng có ý
nghĩa tương tự, chẳng hạn biến kiểu char chỉ chứa được một ký tự. Để lưu trữ một xâu
ký tự cần sử dụng một mảng kiểu char.
b) Khởi tạo cho các biến
Khi khai báo biến, giá trị của nó mặc nhiên là không xác định. Nhưng có thể bạn
sẽ muốn nó mang một giá trị xác định khi được khai báo. Để làm điều đó, bạn chỉ cần
int a; /* Khai báo biến a kiểu int */
long ax, bx, cx; /* Khai báo ba biến kiểu long */
char beta, alpha; /* Khai báo hai biến kiểu char */
float x,y; /* Khai báo hai biến kiểu float */
double x,y; /* Khai báo hai biến kiểu double */
Đề cương bài giảng Cơ sở kỹ thuật lập trình
18
viết dấu bằng và giá trị bạn muốn biến đó sẽ mang. Chúng ta có thể kết hợp việc khai
báo với toán tử gán để biến nhận ngay giá trị cùng lúc với khai báo:
Khai báo trước, gán giá trị sau:
Kiểu_dữ_liệu Tên_biến;
Tên_biến = Giá_trị_khởi_tạo;
Ví dụ 1.4:
Vừa khai báo, vừa gán giá trị
Kiểu_dữ_liệu Tên_biến = Giá_trị_khởi_tạo;
Ví dụ 1.6:
1.4.2 Hằng và cách khai báo
Hằng cũng là một biến nhưng giá trị của hằng không thay đổi. Tuy nhiên khi làm
việc với một giá trị được định nghĩa là không thay đổi, ta phải đảm bảo giá trị của nó
không được thay đổi trong suốt chương trình nên khi đó sử dụng biến sẽ không thích
hợp. Chẳng hạn, khi lập một chương trình thí nghiệm hóa học liên quan đến nhiệt độ
sôi hay nhiệt độ đông của nước, chương trình cần khai báo hai biến là DoSoi và
DoDong, nhưng không cho phép giá trị của hai biến này bị thay đổi hay bị gán. Để
ngăn việc gán giá trị khác, ta phải sử dụng biến kiểu hằng.
a) Cách khai báo hằng
Hằng có thể định nghĩa bằng hai cách:
Cách 1: Dùng toán tử #define nhằm định nghĩa một hằng, ký hiệu
#define
int a,b,c; /* Khai báo các biến a,b,c kiểu int */
char ch; /* Khai báo biến ch kiểu char */
a=0; b=15; c=21; ch=’A’; /* Khởi tạo giá trị cho các biến */
int a=0,b=15,c=21; /* Khai báo, đồng thời khởi tạo giá trị cho các biến */
char ch=’A’;
Đề cương bài giảng Cơ sở kỹ thuật lập trình
19
Cấu trúc này định nghĩa một hằng ký hiệu có tên bằng .
Khi biên dịch chương trình, chương trình dịch thay thế các lần xuất hiện của
bằng xâu ký tự tương ứng, ví dụ: #define MAX 100
Cách 2: const kieu_du_kieu ten_hang = gia_tri_hang;
const int n=20;
b) Một số loại hằng cơ bản
Hằng số nguyên(int)
- Hệ thập phân bình thường, ví dụ: 545
- Hệ cơ số 8 (Octal): Bắt đầu bằng số 0 và chỉ biểu diễn số dương, ví dụ:
024=2010
- Hệ cơ số 16 (Hecxa)
Bắt đầu bằng 0x, ví dụ: 0xAB = 16310
Chú ý: Nếu là hằng kiểu long thì thêm l (hay L) vào đuôi, ví dụ: 123L, 858L
Một hằng số nguyên có giá trị vượt ra ngoài phạm vi cho phép được ngầm hiểu là
hằng long.
Hằng số thực
Được viết theo hai cách sau:
- Dạng thập phân gồm: Phần nguyên, dấu chấm thập phân, phần thập
phân, ví dụ: 34.2 -344.122
Chú ý: Phần nguyên hay phần thập phân có thể vắng mặt nhưng dấu chấm thập
phân không được thiếu, ví dụ: 343. .454
- Dạng khoa học(dạng mũ) gồm: Phần định trị và phần mũ. Phần định trị
là số nguyên hay số thực dạng thập phân, phần mũ bắt đầu bằng E hoặc e theo
sau là số nguyên, ví dụ: 1234.54E-122
Hằng ký tự
Là một ký hiệu trong bảng mã ASCII được đặt trong hai dấu nháy đơn. Giá trị
của hằng kí tự chính là mã ASCII của kí hiệu, ví dụ: Hằng „A‟ có giá trị là 65.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
20
Chú ý: Hằng ký tự biểu thị mã của ký tự đó trong bảng mã ASCII. Do vậy một
hằng ký tự cũng có thể tham gia vào các phép toán, ví dụ: „A‟+10 có giá trị
(65+10=75).
Hằng ký tự còn có thể được viết theo cách: „\c1c2c3‟
Trong đó, c1c2c3 là một số hệ 8 mà giá trị của nó chính là mã ASCII của ký tự
cần biểu diễn, ví dụ: „a‟ hay „\141‟
Một số ký tự đặc biệt:
Viết Ký tự Diễn giải
\‟ „ Dấu nháy đơn
\” “ Dấu nháy kép
\\ \ Dấu gạch chéo ngược
\n \n Xuống dòng mới
\0 \0 Ký tự null
\t Nhảy cách ngang, ký tự tab
\b Xoá trái
\r Về đầu dòng
\f Sang trang
Hằng xâu ký tự
- Là một dãy các ký tự đặt trong hay dấu nháy “......”
- Xâu ký được lưu trữ trong một mảng ô nhớ liền nhau song còn thêm ô nhớ cuối
cùng chứa mã là 0 (ký hiệu là „\0‟ )
Ví dụ 1.6: Xâu ký tự: “Nguyen Van Anh”
Được tổ chức trong bộ nhớ như sau:
N g u y e n V a n A n h \0
Chú ý: Chúng ta cần phân biệt “A” và „A‟. Trong đó “A” được chứa trong 2 byte,
còn „A‟ chỉ mất 1 byte và nó có thể tham gia tính toán trong các biểu thức.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
21
TÓM TẮT
Cấu trúc chung của một chương trình
Các thành phần cơ bản của một ngôn ngữ lập trình: Bảng chữ cái, từ khóa,
tên.
Các kiểu dữ liệu cơ bản
Biến, hằng và cách khai báo
Đề cương bài giảng Cơ sở kỹ thuật lập trình
22
BÀI 2: BIỂU THỨC, CÁC PHÉP TOÁN VÀ VẤN ĐỀ
NHẬP XUẤT
MỤC TIÊU
Học xong bài này sinh viên có khả năng:
o Phân biệt được câu lệnh và khối lệnh
o Sử dụng được các phép toán cơ bản trong C vào bài toán cụ thể
o Viết được câu lệnh nhập/xuất dữ liệu
o Rèn luyện tính cẩn thận và tư duy sáng tạo trong lập trình.
2.1 Biểu thức
Biểu thức là một sự kết hợp giữa các phép toán và các toán hạng để diễn đạt một
công thức nào đó. Các toán hạng có thể là một đại lượng nào đó có giá trị như: hằng,
biến hay một biểu thức con. Mỗi biểu thức có một giá trị, tùy theo giá trị của biểu thức
mà có các biểu thức nguyên hay biểu thức thực. Các mệnh đề logic có giá trị nguyên
trong đó có giá trị khác 0 tương ứng mệnh đề đúng, còn giá trị 0 tương ứng mệnh đề
sai. Biểu thức được sử dụng trong: Vế phải của lệnh gán; làm tham số thực của các
hàm; làm chỉ số; các câu lệnh if, for, while, do while; các biểu thức lớn hơn của các
hàm; làm chỉ số; các câu lệnh if, for, while, do while; các biểu thức lớn hơn..
Trong C, một biểu thức là một mệnh đề dùng để tính ra một giá trị nào đó. Các
biểu thức C có thể có độ phức tạp tùy ý.
2.2 Câu lệnh, khối lệnh
2.2.1 Câu lệnh
Một câu lệnh là một phương hướng hành động hướng dẫn cho máy tính thực hiện
một nhiệm vụ nào đó. Mỗi câu lệnh được viết trên một dòng, nhưng cũng có những
câu lệnh phải viết trên nhiều dòng. Mỗi câu lệnh được kết thúc bằng dấu chấm phẩy (;)
(trừ các chỉ thị, chẳng hạn như #include và #define). Ngăn cách này chỉ đơn giản
Đề cương bài giảng Cơ sở kỹ thuật lập trình
23
là chỉ cho ngôn ngữ lập trình biết rằng, đã kết thúc một câu lệnh và có thể chuyển qua
câu lệnh mới.
Ví dụ 2.1:
char ten[30];// đây là một câu lệnh
printf(“Nhap vao ten cua ban:”);
scanf(“%s”, ten);
printf(“Chao ban%s”, ten);
2.2.2 Các câu lệnh và các khoảng trắng
Thuật ngữ khoảng trắng (whitespace) là để chỉ các dấu cách, tabs và các dòng
rỗng trong chương trình gốc. Chương trình dịch C không xét đến các khoảng trắng.
Khi chương trình dịch đọc một câu lệnh trong một chương trình gốc, nó sẽ đọc tất cả
các ký tự trong câu lệnh này cho đến khi gặp dấu chấm phẩy nhưng bỏ qua tất cả các
khoảng trắng. Vì vậy, câu lệnh x=2+3; trên đây là hoàn toàn tương đương với
x = 2 + 3;
và với
x =
2
+
3 ;
Mỗi câu lệnh nên viết trên một dòng và nên có một dấu cách đứng trước và một
dấu cách đứng sau mỗi tên biến. Trước và sau mỗi khối nên có một dòng trống để dễ
nhận biết từng khối một. Ngoài ra, có thể dùng tabs để đẩy một khối thụt vào so với lề
trái nhằm tạo ra một cấu trúc có tính phân cấp trong chương trình.
Tuy nhiên, trong một xâu các ký tự thì các dấu cách và các dấu tabs lại không bị
bỏ qua, chúng được coi là một bộ phận của xâu ký tự này. Một xâu là một dãy các ký
tự. Các hằng ký tự thực sự là các xâu được đặt trong các dấu nháy và được chương
trình dịch xử lý từng ký tự một.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
24
Nếu chỉ có đúng một dấu chấm phẩy trên một dòng nào đó, thì dòng này được
gọi là câu lệnh rỗng. Câu lệnh rỗng không thực hiện bất kỳ hành động nào.
2.2.3 Khối lệnh
Khối lệnh là một tập hợp gồm hai hay nhiều câu lệnh với nhau và được đặt trong
cặp dấu { }.
Ví dụ 2.2:
{ // đây là đầu khối lệnh
char ten[30];
printf(“Nhap vao ten cua ban:”);
scanf(“%s”, ten);
printf(“Chao ban %s”, ten);
} // đây là cuối khối lệnh
2.3 Các phép toán
2.3.1 Các phép toán số học
STT Phép toán Ý nghĩa Ví dụ Kết quả
1 - Phép đổi dấu -(10+2) -12
2 + Phép cộng 3+12 15
3 - Phép trừ 7-2 5
4 * Phép nhân 2*3 6
5 / Phép chia 6/3 2
6 % Phép lấy phần dư a = 6%4 2
Chú ý:
- Nếu phép chia hai toán hạng đều nguyên thì phép chia cho kết quả là phần
nguyên của thương hai toán hạng đó, ví dụ: 5/2=2
- Nếu một trong hai toán hạng là kiểu thực thì lúc này kết quả của phép chia cho
ta giá trị đúng, ví dụ 5/2.0=2.5
Đề cương bài giảng Cơ sở kỹ thuật lập trình
25
2.3.2 Phép toán so sánh
Phép toán so sánh được dùng để so sánh giữa hai giá trị, và sau đó trả về kết quả
là một giá trị kiểu bool (true hay false). Ví dụ toán tử so sánh lớn hơn (>) trả về giá trị
là true nếu giá trị bên trái của toán tử lớn hơn giá trị bên phải của toán tử. Do vậy 5 > 2
trả về một giá trị là true, trong khi 2 > 5 trả về giá trị false.
STT Phép toán ý nghĩa Ví dụ Kết quả
1 > So sánh lớn hơn 1>2 false
2 >= So sánh lớn hơn hoặc bằng 2>=2 true
3 < So sánh nhỏ hơn 3<3 false
4 <= So sánh nhỏ hơn hoặc bằng 4<2 false
5 == So sánh bằng nhau 4==5 false
6 != So sánh không bằng nhau 2!=7 true
2.3.3 Phép toán logic
Các phép toán logic cũng trả ra giá trị kiểu bool (true hay false).
STT Phép toán Ý nghĩa Ví dụ Kết quả
1 ! Phép phủ định một ngôi (not) !(3>1) false
2 &&
Liên kết hai biểu thức logic
Phép và (and). Giá trị bằng 1
khi cả 2 toán hạng có giá trị 1
(2>1)&&(5=2) false
3 ||
Liên kết hai biểu thức logic.
Phép hoặc (or). Giá trị biểu
thức bằng 1 khi một trong hai
toán hạng bằng 1
(4>3)||(1>8) true
Bảng giá trị của các phép toán logic:
X Y X && Y X || Y ! X
true true true true false
true false false true false
false true false true true
Đề cương bài giảng Cơ sở kỹ thuật lập trình
26
false false false false true
2.3.4 Phép gán
Phép gán được ký hiệu là dấu bằng (=). Cách dùng của nó trong C có khác một
chút so với cách dùng của nó trong toán học thông thường. Nếu viết
x = y;
thì không có nghĩa là "x bằng y", mà là "gán giá trị của y cho x." Trong một câu
lệnh gán, vế phải có thể là một biểu thức bất kỳ còn vế trái phải là một tên biến. Vì
vậy, dạng của câu lệnh gán là:
tenbien = bieuthuc;
Khi được thực hiện, bieuthuc được ước lượng và giá trị của kết qủa được gán
cho tenbien.
2.3.5 Thứ tự ƣu tiên các phép toán
Các phép toán có độ ưu tiên khác nhau, điều này có nghĩa là trong cùng một biểu
thức, một số phép toán này được thực hiện trước một số phép toán khác. Việc xác định
thứ tự ưu tiên của các phép toán ảnh hưởng rất lớn đến kết quả của một phép toán. Sau
đây là bảng liệt kê thứ tự ưu tiên của các phép toán:
Đề cương bài giảng Cơ sở kỹ thuật lập trình
27
Các phép toán được liệt kê cùng loại sẽ có thứ tự theo mục thứ thự của bảng: thứ
tự trái tức là độ ưu tiên của các phép toán từ bên trái sang, thứ tự phải thì các phép
toán có độ ưu tiên từ bên phải qua trái. Các toán tử khác loại thì có độ ưu tiên từ trên
xuống dưới, do vậy các toán tử loại cơ bản sẽ có độ ưu tiên cao nhất và phép toán gán
sẽ có độ ưu tiên thấp nhất trong các toán tử.
2.3.6 Phép chuyển đối kiểu
Khi tính toán một biểu thức phần lớn các phép toán đều yêu cầu các toán hạng
phải cùng kiểu. Ví dụ để phép gán thực hiện được thì giá trị của biểu thức phải có cùng
kiểu với biến. Trong trường hợp kiểu của giá trị biểu thức khác với kiểu của phép gán
thì hoặc là chương trình sẽ tự động chuyển kiểu giá trị biểu thức về thành kiểu của
biến được gán (nếu được) hoặc sẽ báo lỗi. Do vậy khi cần thiết người lập trình phải sử
dụng các câu lệnh để chuyển kiểu của biểu thức cho phù hợp với kiểu của biến.
a) Chuyển kiểu tự động
Về mặt nguyên tắc, khi cần thiết các kiểu có giá trị thấp sẽ được chương trình tự
động chuyển lên kiểu cao hơn cho phù hợp với phép toán. Cụ thể phép chuyển kiểu có
thể được thực hiện theo sơ đồ như sau:
char ↔ int → long int → float → double.
Ví dụ 2.3:
int i = 3;
float f ;
f = i + 2;
Trong ví dụ trên i có kiểu nguyên và vì vậy i+2 cũng có kiểu nguyên, trong khi f
có kiểu thực. Tuy vậy phép toán gán này là hợp lệ vì chương trình sẽ tự động chuyển
kiểu của i+2 (bằng 5) sang kiểu thực (bằng 5.0) rồi mới gán cho f.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
28
b) Ép kiểu
Trong chuyển kiểu tự động, chương trình chuyển các kiểu từ thấp đến cao, tuy
nhiên chiều ngược lại không thể thực hiện được vì nó có thể gây mất dữ liệu. Do đó,
nếu cần thiết người lập trình phải ra lệnh cho chương trình.
Ví dụ 2.4:
int i; float f = 3 ; // tự động chuyển 3 thành 3.0
và gán cho i = f + 2 ; // sai vì mặc dù f + 2 = 5 nhưng không gán được cho i
Trong ví dụ trên để câu lệnh i = f+2 thực hiện được ta phải ép kiểu của biểu thức f+2
về thành kiểu nguyên.
Cú pháp tổng quát như sau:
(tên_kiểu)biểu_thức;
trong đó, tên_kiểu là kiểu cần được chuyển sang.
Như vậy câu lệnh trên phải được viết lại:
i = int(f + 2) ;
Khi đó f+2 (bằng 5.0) được chuyển thành 5 và gán cho i.
Dưới đây ta sẽ xét một số ví dụ về lợi ích của việc ép kiểu.
Phép ép kiểu từ một số thực về số nguyên sẽ cắt bỏ tất cả phần thập
phân của số thực, chỉ để lại phần nguyên. Như vậy để tính phần nguyên của
một số thực x ta chỉ cần ép kiểu của x về thành kiểu nguyên, có nghĩa int(x)
là phần nguyên của số thực x bất kỳ. Ví dụ để kiểm tra một số nguyên n có
phải là số chính phương, ta cần tính căn bậc hai của n. Nếu căn bậc hai x
của n là số nguyên thì n là số chính phương, tức nếu int(x) = x thì x nguyên
và n là chính phương.
Ví dụ 2.5:
int n = 10 ;
Đề cương bài giảng Cơ sở kỹ thuật lập trình
29
float x = sqrt(n) ; // hàm sqrt(n) trả lại căn bậc hai của số n
if (int(x) == x)
printf("n chinh phuong");
else
printf("n khong chinh phuong");
Để biết mã ASCII của một kí tự ta chỉ cần chuyển kí tự đó sang kiểu nguyên.
char c ;
printf("Hay nhap vao 1 ky tu bat ky: ");
scanf(“%c”, &c) ;
printf( "Ma cua ki tu vua nhap la %d “, int(c));
Ghi chú:
Xét ví dụ sau:
int i = 3 , j = 5;
float x ;
x = i / j * 10; // x = 6 ?
printf(“%f”,x) ;
Trong ví dụ này mặc dù x được khai báo là thực nhưng kết quả in ra sẽ là 0 thay
vì 6 như mong muốn. Lý do là vì phép chia giữa 2 số nguyên i và j sẽ cho lại số
nguyên, tức i/j = 3/5 = 0. Từ đó x = 0*10 = 0. Để phép chia ra kết quả thực ta cần phải
ép kiểu hoặc i hoặc j hoặc cả 2 thành số thực, khi đó phép chia sẽ cho kết quả thực và
x được tính đúng giá trị. Cụ thể câu lệnh x = i/j*10 được đổi thành:
x = float(i) / j * 10 ; // đúng
x = i / float(j) * 10 ; // đúng
x = float(i) / float(j) * 10 ; // đúng
Đề cương bài giảng Cơ sở kỹ thuật lập trình
30
x = float(i/j) * 10 ; // sai
Phép ép kiểu: x = float(i/j) * 10 ; vẫn cho kết quả sai vì trong dấu ngoặc phép
chia i/j vẫn là phép chia nguyên, kết quả x vẫn là 0.
2.4 Nhập/xuất dữ liệu
2.4.1 Xuất dữ liệu
Để đưa dữ liệu ra màn hình, trong lập trình C sử dụng hàm printf, cú pháp để
xuất dữ liệu như sau:
printf(“Chuỗi định dạng”[đối mục 1, đối mục 2,]);
Chú ý: Để sử dụng được hàm printf cần phải khai báo thư viện #include
Trong đó:
- printf là tên hàm, phải viết bằng chữ thường
- Đối mục 1,: Là các mục dữ kiện cần in ra màn hình. Các đối mục này có
thể là biến, hằng hoặc biểu thức phải được định trị trước khi in ra.
- Chuỗi định dạng: Được đặt trong cặp nháy kép (“ ”), gồm 3 loại:
o Đối với chuỗi ký tự ghi như thế nào thì in ra màn hình giống như vậy.
o Đối với những kí tự chuyển đổi dạng thức cho phép kết xuất giá trị của
các đối mục ra màn hình tạm gọi là mã định dạng. Sau đây là các dấu
mô tả định dạng:
Ký hiệu Ý nghĩa
%c Ký tự đơn
%s Chuỗi
%d In ra kiểu int
%f In ra kiểu float
%e Số chấm động (ký hiệu có mũ)
Đề cương bài giảng Cơ sở kỹ thuật lập trình
31
%g Số chấm động (%f hay %g)
%u Số nguyên thập phân không dấu (unsigned)
%x In ra số ở dạng cơ số 16
%0 In ra số ở dạng cơ số 8
L Tiền tố dùng kèm với %d, %u, %x, %0 để chỉ số nguyên dài (ví
dụ ld)
o Các ký tự điều khiển và ký tự đặc biệt
Ký hiệu Ý nghĩa
\n \n Nhảy xuống dòng kế tiếp và canh về cột đầu tiên
\t Canh cột tab ngang
\r Nhảy về đầu hàng, không xuống hàng
\a Tiếng kêu bip
\\ In ra dấu \
\” In ra dấu ”
\‟ In ra dấu ‟
%% In ra dấu %
Ví dụ 2.6
printf (“Bài học về nhập xuất dữ liệu\n”); // “Bài học về nhập xuất dữ
liệu” là chuỗi ký tự cần in ra màn hình
// \n là ký tự điều khiển xuống dòng
Ví dụ 2.7
In ra màn hình tổng của hai số nguyên
//Chương trình in ra tổng hai số nguyên
Đề cương bài giảng Cơ sở kỹ thuật lập trình
32
#include //Khai báo thư viện nhập xuất
#include //Khai báo thư viện xử lý màn hình
int main()
{
int a = 7, b = 5; // Khai báo và khởi tạo giá trị cho biến
printf(“tong cua hai so %d và %d la %d”, a, b, a+b); //In ra màn
hình
getch();// dừng màn hình chờ nhập vào 1 phím bất kỳ
return 0;
}
Kết quả sau khi chạy chương trình:
2.4.2 Nhập dữ liệu
Để nhập dữ liệu vào từ bàn phím, trong lập trình C sử dụng hàm scanf, cú pháp
nhập như sau:
scanf(“chuỗi định dạng”[đối mục 1, đối mục 2,]);
Chú ý: Để sử dụng được hàm nhập, xuất dữ liệu thì đều cần phải khai báo thư
viện #include
Trong đó:
- scanf: Tên hàm, phải viết bằng chữ thường
- Chuỗi định dạng: được đặt trong cặp nháy kép (“ ”) là hình ảnh dạng dữ liệu
nhập vào.
- Đối mục 1,.: mỗi đối mục sẽ tiếp nhận giá trị nhập vào.
Ví dụ 2.8
scanf(“%d”, &i); //%d : định dạng dữ liệu kiểu int
Đề cương bài giảng Cơ sở kỹ thuật lập trình
33
//&i: đối mục i
Kết quả: Nếu nhập vào 31xyz thì biến i chỉ nhận giá trị 31, còn nếu nhập 3.1 thì
biến i chỉ nhận giá trị 3.
Ví dụ 2.9 Nhập vào hai số nguyên a, b rồi tính tổng của hai số nguyên đó.
//Chương trình tính tổng hai số nguyên
#include // Khai báo thư viện để sử dụng hàm nhập xuất
#include // Thư viện xử lý màn hình
int main()
{
int a,b; // Khai báo 2 biến nguyên
printf(“Nhap gia tri cho bien a = ”); scanf(“%d”,&a);
printf(“Nhap gia tri cho bien b = ”); scanf(“%d”,&b);
printf(“Tong cua %d va %d la %d”,a,b,a+b); /*in ra tổng của hai
số*/
getch();
return 0;
}
Kết quả:
2.5 Bài tập
Bài tập 2.1: Hãy nhập và dịch chương trình sau đây. Chương trình này làm việc gì?
Giải thích từng dòng lệnh? (không viết các số hiệu dòng khi soạn chương trình)
1: #include
2: float bankinh, dientich;
3: main()
4:
5: printf( "Nhập bán kính: " );
6: scanf( "%f", &bankinh );
7: dientich = 3.14159 * bankinh * bankinh;
8: printf( "\n\nDiện tích = %f", dientich );
Đề cương bài giảng Cơ sở kỹ thuật lập trình
34
9: return 0;
10:
Bài tập 2.2: . Chương trình sau đây đang có lỗi. Hãy nhập và dịch nó. Các dòng nào
sinh ra thông báo lỗi?
1: include
2: main();
3:
4: printf( "Hãy nhìn xem!" )
5: printf( "Bạn sẽ tìm thấy nó!" );
6: return ;
7:
Bài tập 2.3: Viết chương trình định dạng và in ra một bài thơ nào đó.
Bài tập 2.4: Viết chương trình nhập vào điểm của ba môn toán, lý, hóa của một học
sinh rồi in ra điểm trung bình của học sinh đó với hai số lẻ thập phân.
Bài tập 2.5: Viết chương trình nhập vào ngày, tháng, năm. In ra ngày tháng năm theo
định dạng dd/mm/yy. (dd: ngày, mm: thang, yy: năm; ví dụ 02/01/15).
TÓM TẮT
Cấu trúc chung của một chương trình
Các thành phần cơ bản của một ngôn ngữ lập trình: Bảng chữ cái, từ khóa,
tên.
Các kiểu dữ liệu cơ bản
Biến, hằng và cách khai báo
Đề cương bài giảng Cơ sở kỹ thuật lập trình
35
BÀI 3: CẤU TRÚC ĐIỀU KHIỂN
MỤC TIÊU
Học xong bài này sinh viên có thể:
o Hiểu và giải thích được cú pháp của các cấu trúc điều khiển
o Vận dụng được các điều khiển if, ifthen, switchcase vào từng bài toán cụ
thể
o So sánh được đặc điểm của các cấu trúc điều khiển
o Rèn luyện tính cẩn thận, tư duy trong lập trình.
3.1 Giới thiệu về cấu trúc điều khiển
Cấu trúc lệnh điều khiển hay còn gọi là câu lệnh rẽ nhánh, là một phần không thể
thiếu trong bất cứ ngôn ngữ lập trình cấp cao, có tác dụng chia chương trình ra nhiều
hướng xử lý khác nhau trong một số trường hợp xác định.
3.2 Cấu trúc điều khiển rẽ nhánh if
3.2.1 Cấu trúc rẽ nhánh dạng khuyết
a) Cú pháp
if ()
Cong_viec;
Trong đó:
- if là từ khóa
- bieu_thuc là biểu thức điều kiện
- Cong_viec là một lệnh hoặc một khối lệnh
b) Nguyên tắc hoạt động
Bước 1: Xác định giá trị của bieu_thuc
Đề cương bài giảng Cơ sở kỹ thuật lập trình
36
Bước 2: Tùy thuộc vào giá trị của bieu_thuc mà máy sẽ tiến hành lựa chọn một
trong hai nhánh:
- Nếu bieu_thuc trả ra giá trị True thì máy sẽ tiến hành thực hiện Công_việc.
- Nếu bieu_thuc trả ra giá trị False thì máy sẽ bỏ qua Công_việc trong câu lệnh
if mà tiến hành thực hiện các câu lệnh sau câu lệnh if.
Ví dụ 3.1
Viết chương trình nhập vào
3.2.2 Cấu trúc rẽ nhánh dạng đủ
a) Cú pháp
if()
Cong_viec_1;
else
Cong_viec_2;
Trong đó:
- if, else là từ khóa
- bieu_thuc là biểu thức điều kiện
- Cong_viec_1, Cong_viec_2 là một lệnh hoặc một khối lệnh.
b) Nguyên tắc hoạt động
Bước 1: Xác định giá trị của biểu thức điều kiện
Bước 2: Tùy vào giá trị của bieu_thuc mà máy sẽ tiến hành lựa chọn một trong
hai nhánh:
- Nếu bieu_thuc trả ra giá trị True thì máy sẽ tiến hành thực hiện Cong_viec_1;
- Ngược lại, nếu bieu_thuc trả ra giá trị False thì máy sẽ tiến hành thực hiện
Cong_viec_2;
Ví dụ 3.2
Đề cương bài giảng Cơ sở kỹ thuật lập trình
37
Viết chương trình nhập vào tổng điểm của 3 môn toán, lý, hóa.
Nếu tổng điểm 3 môn >=15 thì in ra màn hình: “Đạt”
Ngược lại thì in ra màn hình: “Không đạt”.
Hƣớng dẫn:
Input: Tổng điểm của 3 môn.
Output: Đạt/ Không đạt
- Bước 1: Nhập điểm của 3 môn, giả sử đặt tên biến là tong có kiểu dữ liệu
float (vì điểm có thể lẻ).
- Bước 2: Sử dụng cấu trúc ifelse để kiểm tra:
o Nếu tong >=15 thì in ra màn hình: “Đạt”
o Ngược lai thì in ra màn hình: “Không đạt”
- Bước 3: Kết thúc chương trình;
Chƣơng trình minh họa:
// Chương trình nhập và kiểm tra giá trị
#include // Khai báo thư viện nhập xuất
#include // Khai báo thư viện xử lý màn hình
int main() // Chương trình chính
{
float tong; // Khai báo biến
// Nhap gia tri cho bien
printf(“Nhap vao tong diem cua 3 mon: ”); scanf(“%f”,&tong);
if (tong>=15)
printf(“\n Dat”);
else
printf(“\n Khong dat”);
Đề cương bài giảng Cơ sở kỹ thuật lập trình
38
getch();
return 0;
}
3.3 Cấu trúc điều khiển rẽ nhánh swicth
a) Cú pháp
switch ()
{
case gt1: Khối_lệnh_1; [break;]
case gt2: Khối_lệnh_2; [break;]
..
case gtn: Khối_lệnh_n; [break;]
[default: Khối_lệnh_n+1;]
}
Trong đó:
- switch, case, default là các từ khóa
- bieu_thuc là một biểu thức nguyen bất kỳ
- gti là giá trị mà bieu_thuc có thể nhận được. Có thể là kiểu chả vì nó có thể
chuyển đổi thành kiểu int.
- Những phần đặt trong hai dấu [ và ] có thể có hoặc không.
b) Nguyên tắc hoạt động
Sự hoạt động của cấu trúc điều khiển switch phụ thuộc vào giá trị của bieu_thuc.
- Bước 1: Tính giá trị của bieu_thuc
- Bước 2: Tùy thuộc vào giá trị của bieu_thuc mà máy sẽ thực hiện những công
viêc khác nhau, cụ thể:
Đề cương bài giảng Cơ sở kỹ thuật lập trình
39
o Khi giá trị này bằng gti máy sẽ nhảy tới khối lệnh có nhãn case gti và
thực hiện Khối_lệnh_i. Nếu Khối_lệnh_i là rỗng thì ta có thể đặt
break sau Khối_lệnh_i hoặc không, với trường hợp không có break thì
máy sẽ tiến hành nhảy xuống thực hiện Khối_lệnh_i+1. Nếu
Khối_lệnh_i khác rỗng (tức là có công việc thực hiện) thì sau
Khối_lệnh_i ta phải đặt break. Khi máy gặp câu lệnh break thì sẽ thoát
khỏi cấu trúc switch và thực hiện các câu lệnh tiếp theo sau cấu trúc
lệnh này.
o Khi giá trị của bieu_thuc khác tất cả các giá trị gti thì cách làm việc
của máy lại phụ thuộc vào sự có mặt hay không có mặt của default.
Khi có default máy nhảy tới câu lệnh có nhãn default. Khi không có
default máy tiến hành thực hiện các câu lệnh sau cấu trúc này.
Ví dụ 3.3
Viết chương trình nhập vào một số nguyên từ 2 đến 8 và in ra thứ tương ứng.
Hƣớng dẫn:
Input: Một số nguyên a trong khoảng 2 đến 8.
Output: Thứ tương ứng với giá trị vừa nhập
- Bước 1: Nhập vào một số bất kỳ trong đoạn từ 28 (giả sử đặt là a có kiểu
dữ liệu là int)
- Bước 2: Kiểm tra xem số vừa nhập vào tương ứng với ngày nào trong tuần sử
dụng cấu trúc rẽ nhánh switch
Nếu giá trị nhập vào không nằm trong khoảng từ 2 đến 8 thì in ra thông báo:
“Giá trị bạn vừa nhập không hợp lệ!”
- Bước 3: Kết thúc chương trình
Chƣơng trình minh họa
/* chương trình hiển thị thứ trong tuần tương ứng với giá trị
nhập vào từ bàn phím*/
Đề cương bài giảng Cơ sở kỹ thuật lập trình
40
#include
#include
int main() //Chương trình chính
{
int a; //Khai báo biến nguyên nhận giá trị nhập vào
printf("\nHay nhap mot so nguyen tu 2 den 8: ");
scanf(“%d”, &a);
//Kiểm tra giá trị nhập vào rồi in ra thứ tương ứng
switch(a)
{
case 2: printf("\nThu hai"); break;
case 3: printf("\nThu ba"); break;
case 4: printf("\nThu tu"); break;
case 5: printf("\nThu nam"); break;
case 6: printf("\nThu sau"); break;
case 7: printf("\nThu bay"); break;
case 8: printf("\nChu nhat"); break;
default: printf("\nGia tri ban nhap khong hop le");
}
getch();
return 0;
}
Kết quả
Đề cương bài giảng Cơ sở kỹ thuật lập trình
41
3.4 Bài tập
Bài tập 3.1: Viết chương trình giải phương trình bậc nhất ax+b=0 rồi in ra màn hình
các nghiệm của phương trình.
Hƣớng dẫn:
Input: Hai tham số a,b
Output: Nghiệm của phương trình
- Bước 1: Nhập các tham số a,b từ bàn phím sử dụng hàm printf, scanf (a,b có
kiểu int)
- Bước 2: Dùng cấu trúc điều khiển ifelse để kiểm tra:
+ Nếu a = 0 thì kiểm tra:
Nếu b=0 thì in ra thông báo: “Phương trình có vô số nghiệm”
Ngược lại thì in ra thông báo: “Phương trình vô nghiệm”
+ Ngược lại thì tính nghiệm x = -b/a và in kết quả ra màn hình.
- Bước 3: Kết thúc chương trình.
Bài tập 3.2: Viết chương trình nhập vào một số 1=< n <=12 từ bàn phím rồi in ra
tháng tương ứng với số vừa nhập vào đó.
Hƣớng dẫn:
Input: Số nguyên n
Output: Tháng tương ứng
- Bước 1: Nhập số nguyên n từ bàn phím sử dụng hàm printf, scanf (n có kiểu
int)
- Bước 2: : Kiểm tra xem số vừa nhập vào tương ứng với tháng nào trong năm
sử dụng cấu trúc rẽ nhánh switch
Nếu giá trị nhập vào không nằm trong khoảng từ 1 đến 12 thì in ra thông báo:
“Giá trị bạn vừa nhập không hợp lệ!”
Đề cương bài giảng Cơ sở kỹ thuật lập trình
42
- Bước 3: Kết thúc chương trình.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
43
BÀI 4: CẤU TRÚC LẶP
MỤC TIÊU
Học xong bài này sinh viên có thể:
o Hiểu và giải thích được cú pháp của các cấu trúc lặp
o Vận dụng được các cấu trúc lặp for, while, do.. while vào từng bài toán cụ
thể
o So sánh được đặc điểm của các cấu trúc lặp
o Rèn luyện tính cẩn thận, tư duy trong lập trình.
4.1. Giới thiệu về cấu trúc lặp
Trong thực tế cuộc sống chúng ta gặp rất nhiều tình huống lặp. Ví dụ chương
trình tính điểm cho 40 sinh viên trong lớp học. Quá trình giáo viên nhập họ tên, điểm
cho từng sinh viên là quá trình lặp liên tục cho đến khi nhập đầy đủ cho 40 sinh viên
thì mới kết thúc. Như vậy quá trình lặp ở trên là quá trình lặp với điều kiện cụ thể là
nhập thông tin đến sinh viên thứ 40. Hoặc tình huống thứ 2 là: Em thực hiện công việc
để gánh nước đổ vào thùng nước? Em có biết cần bao nhiêu thùng nước là đủ không?
Như vậy em cần phải đổ đầy thùng nước mà không biết cần bao nhiêu gánh nước. Đó
là một tình huống lặp mà không biết trước số lần lặp.
Vậy cấu trúc vòng lặp cho phép lặp lại nhiều lần 1 công việc (được thể hiện bằng
một câu lệnh hay một khối lệnh) nào đó cho đến khi thỏa mãn một điều kiện cụ thể.
4.2. Cấu trúc lặp xác định
4.2.1. Cấu trúc lặp For
a) Cú pháp câu lệnh
for(bt1;btđk;bt2)
Công_việc;
Trong đó:
* for là từ khoá
Đề cương bài giảng Cơ sở kỹ thuật lập trình
44
* bt1,bt2 là các biểu thức gán, btđk là một biểu thức cho giá trị logic
* Công_việc có thể là một lệnh đơn, một cấu trúc điều khiển nào đó hay một
khối lệnh
Ví dụ 4.1: Viết đoạn chương trình in ra màn hình giá trị từ 1-5
int i; // Khai báo biến
printf("Day so tu 1 den 5");// câu lệnh thông báo ra màn
hình
for(i=1;i<=5;i++) //câu lệnh kiểm tra điều kiện nhập
printf(" Số nguyên thứ ",i); // câu lệnh in ra màn hình
b) Sự hoạt động của câu lệnh for
- Bước 1: Xác định giá trị của bt1
- Bước 2: Xác định giá trị của btđk
- Bước 3: Tuỳ thuộc vào tính đúng, sai của biểu thúc btđk máy sẽ tiến hành lựa
chọn một trong hai nhánh sau:
+ Nếu btđk có giá trị bằng không, máy sẽ ra khỏi vòng lặp for và
chuyển tới câu lệnh sau cấu trúc for
+ Nếu btđk có giá trị khác không, máy sẽ tiến hành thực hiện các câu
lệnh trong thân for . Khi thực hiện xong Công_việc hay gặp câu lệnh continue trong
thân vòng lặp for máy sẽ chuyển sang bước 4(khởi đầu lại).
- Bước 4: Tính bt2 sau đó quay lại bước 2 để bắt đầu lại vòng lặp mới của chu
trình.
Chú ý:
Các bt1,bt2,btđk có thể vắng mặt nhưng phải để lại dấu chấm phẩy
Nếu btđk vắng mặt thì máy coi luôn đúng. Khi đó muốn thoát khỏi vòng
lặp thì phải dùng câu lệnh return, break hay goto.
Các bt1,bt2 có thể gồm nhiều biểu thức cách nhau bởi dấu phẩy
Thông thường bt1 dùng để khởi gán giá trị cho các biến trong vòng lặp,
bt2 dùng để thay đổi giá trị của các biến điều khiển trong vòng lặp sao cho
Đề cương bài giảng Cơ sở kỹ thuật lập trình
45
lúc đầu btđk cho giá trị True nhưng sau một số hữu hạn bước thực hiện thì
btđk cho giá trị False.
4.1.2 Ví dụ áp dụng
Ví dụ 4.2: Viết chương trình in ra màn hình các số nguyên từ 1 đến 5
#include
#include
main()
{
int i; // Khai báo biến
printf("Day so tu 1 den 5");// câu lệnh thông báo nhập
for(i=1;i<=5;i++) //câu lệnh kiểm tra điều kiện nhập
printf(" Số nguyên thứ ",i); // câu lệnh in ra màn hình
getch();
}
Ví dụ 4.3: Viết chương trình nhập vào một số nguyên dương N sau đó tính tổng
N số nguyên dương đầu tiên
Hƣớng dẫn:
- Dữ liệu nhập vào: n nguyên dương
- Dữ liệu xuất ra: S=1+2+3+..+n
o Bước 1: Nhập số nguyên dương N
o Bước 2: Áp dụng cấu trúc lặp for để duyệt từ 1n, tại mỗi lần duyệt
cộng giá trị vào viết S
o Bước 3: In kết quả ra màn hình
Chƣơng trình minh họa:
#include
#include
Đề cương bài giảng Cơ sở kỹ thuật lập trình
46
int main()
{
int i,n,s; // Khai báo biến
printf(“Ban hay nhap gia tri n :”);
scanf(“%d”,&n);
s=0; // Khởi tạo giá trị cho biến tổng
for(i=1;i<=n;++i) // Kiểm tra điều kiện lặp
s= s+i; // Tăng giá trị tổng sau mỗi lần tăng biến đếm
printf(“Gia tri cua tong la %d”,s);
getch();
return 0;
}
4.3. Cấu trúc lặp không xác định
4.3.1. Cấu trúc lặp while
a) Cú pháp câu lệnh
while(bt) Công_việc;
Trong đó:
- while là từ khoá
- bt là một biểu thức
- Công_việc có thể là một lệnh đơn, một khối lệnh hay một cấu trúc điều khiển
khác
b) Nguyên tắc hoạt động của cấu trúc lặp while
- Bước 1: Tiến hành tính toán giá trị của bt.
- Bước 2: Nếu biểu thức có giá trị false máy thoát khỏi chu trình và tiến
hành thực hiện các câu lệnh sau câu lệnh while. Nếu biểu thức có giá trị
true máy tiến hành thực hiện Công_việc và quay về bước 1.
c) Ví dụ
Đề cương bài giảng Cơ sở kỹ thuật lập trình
47
Ví dụ 4.4: Viết chương trình nhập vào một số nguyên dương n. Tính tổng các số
nguyên dương từ 1 đến n
#include
#include
int main ()
{ unsigned int n,i,tong;
printf("\n Nhap vao so nguyen duong n:");
scanf("%d",&n);
tong=0;i=1; //Khởi tạo giá trị cho biến đếm và biến tổng
while (i<=n) //cấu trúc lặp kiểm tra điều kiện của i
{
tong=tong+i; //tổng tăng sau mỗi lần tăng i
i=i+1; // Tăng biến đếm i lên 1 đơn vị
}
printf("\n Tong tu 1 den %d = %d ",n,tong);
getch();
return 0;
}
Ví dụ 4.5: Viết chương trình nhập vào một số nguyên bất kỳ và in tất cả các ước
số của số đó
/* In tat ca cac uoc so cua n*/
#include
#include
int main()
{
int n, i; //Khai báo biến
printf("Cho gia tri n = ");
scanf("%d", &n);
printf("Cac uoc so cua %d la :\n", n);
i=1; //Khởi tạo giá trị cho biến i
while(i<n) //Cấu trúc lặp kiểm tra điều kiện của i
Đề cương bài giảng Cơ sở kỹ thuật lập trình
48
{
i=i+1; // tăng biến đếm lên 1
if((n%i)==0) //kiểm tra nếu n chia hết cho i
printf("%5d", i); /* quy định độ rộng cho giá trị của i
là 5*/
}
getch();
return 0;
}
Ví dụ 4.6: Viết chương trình tính tổng sau
s= a-a
2
+a
3
-....+(-1)
n+1
a
n
#include
#include
int main()
{
int n,i,dau;
float s,tg,a;
printf(“Ban hay cho gia tri n=”);scanf(“%d”,&n);
printf(“Ban hay cho gia tri cua a=”);scanf(“%f”,&a);
s=0;
i=1;
dau=-1;
tg=1; //Khởi tạo giá trị cho các biến
while (i++<=n)
/*Kiểm tra điều kiện của i, thực hiện các câu lệnh trong
thân vòng lặp while sau đó tăng biến i*/
{ dau=dau*(-1);
tg=tg*a;
s=s+dau*tg;
}
printf(“Gia tri cua tong la=%8.2f”,s); /* định dạng
Đề cương bài giảng Cơ sở kỹ thuật lập trình
49
8 chữ số phần nguyên và 2 chữ số phần thập phân cho tổng s*/
getch();
return 0;
}
Chú ý: bt có thể là một dãy các biểu thức đặt cách nhau bởi dấu phẩy. Tính đúng
sai của bt được hiểu là tính đúng sai của biểu thức cuối cùng trong dãy.
4.3.2. Cấu trúc lặp do.. while
a) Cú pháp câu lệnh
do
Công_việc;
while(bt);
Trong đó:
- while ,do là từ khoá
- bt là một biểu thức
b) Nguyên tắc hoạt động của câu lệnh do.. while
- Bước 1: Thực hiện Công_việc;
- Bước 2: Sau khi thực hiện xong Công_việc máy tiến hành tính toán giá
trị của bt.
Nếu bt có giá trị bằng true thì máy sẽ trở lại bước 1 để tiếp tục thực hiện
vòng lặp mới của chu trình. Nếu bt có giá trị bằng false thì máy sẽ ra khỏi chu
trình và chuyển tới câu lệnh đứng sau cấu trúc do...while.
c) Ví dụ
Ví dụ 4.7: Viết đoạn chương trình in dãy số nguyên từ 1 đến 10
#include
#include
int main ()
Đề cương bài giảng Cơ sở kỹ thuật lập trình
50
{ int i;
printf("\n Day so tu 1 den 10 :");
i=1;
do
printf("%d ",i++);
while (i<=10);
getch();
return 0;
}
Ví dụ 4.8: Viết chương trình nhập vào một số nguyên n. Tính tổng các số nguyên
từ 1 đến n
#include
#include
int main ()
{ unsigned int n,i,tong;
clrscr();
printf("\n Nhap vao so nguyen duong n:");
scanf("%d",&n);
tong=0;
i=1;
do
{
tong+=i;
i++;
} while (i<=n);
printf("\n Tong tu 1 den %d =%d ",n,tong);
getch();
return 0;
}
Ví dụ 4.9: Nhập một dãy số từ bàn phím và đếm xem ta nhập được bao nhiêu
phần tử có giá trị dương. Khi không nhập nữa thì nhập giá trị 0
Đề cương bài giảng Cơ sở kỹ thuật lập trình
51
#include
#include
int main()
{
int i=0,n,tong=0;
printf(“Ban hay tien hanh nhap cac so nguyen \n”);
do
{
printf(“So thu: %d”,++i);scanf(“%d”,&n);
if(n>0) tong++;
} while(n!=0);
printf(“Tong so phan tu ban da nhap la %d trong do co
%d so duong “,i,tong);
getch();
return 0;
}
Ghi chú: So sánh các cấu trúc lặp
- Giống nhau: của cấu trúc lặp for, while, do.. while đó là vòng lặp kết thúc khi
nào điều kiện sai
- Khác nhau:
Cấu trúc lặp for, while Cấu trúc lặp do..while
Kiểm tra điều kiện trước thực hiện công
việc sau nên đoạn lệnh thực hiện công
việc có thể không được thực hiện .
Thực hiện công việc trước kiểm tra điều
kiện sau nên đoạn lệnh thực hiện công
việc được thực hiện ít nhất 1 lần.
- Cách dùng các cấu trúc lặp:
Nếu nhìn vào cấu trúc của ba cấu trúc lặp này, thì có thể nói rằng cả ba đều có
thể dùng để giải quyết một bài toán lặp. Tuy nhiên mỗi cấu trúc lặp đều có nét riêng
Đề cương bài giảng Cơ sở kỹ thuật lập trình
52
của nó. Cấu trúc for là tốt nhất nếu cần phải khởi tạo và tăng trong vòng lặp. Nếu chỉ
có một điều kiện cần phải thỏa mãn và không quan tâm đến số lần thực hiện của vòng
lặp thì while là một sự lựa chọn tốt. Còn nếu biết rằng một khối các câu lệnh cần phải
thực hiện ít nhất một lần thì do ... while là cấu trúc tốt nhất.
4.4. Các câu lệnh đặc biệt
4.4.1. Câu lệnh break
Dùng để thoát khỏi vòng lặp. Khi gặp câu lệnh này trong vòng lặp, chương trình
sẽ thoát ra khỏi vòng lặp và chỉ đến câu lệnh liền sau nó. Nếu nhiều vòng lặp --> break
sẽ thoát ra khỏi vòng lặp gần nhất. Ngoài ra, break còn được dùng trong cấu trúc lựa
chọn switch.
Ví dụ 4.10: Viết chương trình cho phép người dùng nhập liên tục giá trị của n
cho đến khi nhập vào một giá trị âm.
Chƣơng trình minh họa
#include
#include
int main()
{
int n;
while (1)
{
printf("\nNhap n: "); scanf("%d",&n);
if(n<0)
break;
}
getch();
return 0;
Đề cương bài giảng Cơ sở kỹ thuật lập trình
53
}
4.4.2. Câu lệnh continue
- Khi gặp lệnh này trong các vòng lặp, chương trình sẽ bỏ qua phần còn lại trong
vòng lặp và tiếp tục thực hiện lần lặp tiếp theo.
- Ðối với lệnh for, biểu thức 3 sẽ được tính trị và quay lại bước 2.
- Ðối với lệnh while, do while; biểu thức điều kiện sẽ được tính và xét xem có thể
tiếp tục thực hiện nữa hay không? (dựa vào kết quả của biểu thức điều
kiện).
Ví dụ 4.11: In ra màn hình các số từ 10 đến 20 trừ số 13 và số 17.
#include
#include
int main()
{
int i;
for(i=10;i<=20;i++)
{
if (i==13||i==17)
continue;
printf("%d\t",i);
}
getch();
return 0;
}
}
4.5. Bài tập
1. Viết chương trình nhập vào từ bàn phím hai số nguyên dương x, n (10<x,
n<20). Tính và in ra màn hình tổng: S= S = x+x/2+x/3+...+x/n
2. Viết chương trình: nhập một số n từ bàn phím, kiểm tra n và in ra kết quả sau:
Nếu n âm thì in ra thì bắt người dùng nhập lại
Nếu n nguyên dương và là số chẵn thì tính và in ra tổng các số lẻ từ 1 n
Nếu n nguyên dương và là số lẻ thì tính và in ra tổng các số chẵn từ 1 n
Đề cương bài giảng Cơ sở kỹ thuật lập trình
54
3. Viết chương trình thực hiện nhập vào ba số nguyên dương từ bàn phím. Kiểm
tra xem ba số vừa nhập vào có phải là ba cạnh của một tam giác hay không? Nếu phải
thực hiện in ra diện tích tam giác có cạnh là ba số đã nhập.
4. Viết chương trình in ra màn hình giá trị các biểu thức sau:
Trong đó N là số nguyên dương được nhập vào từ bàn phím
5. Viết chương trình in ra màn hình giá trị các biểu thức sau:
Trong đó n là số nguyên dương được nhập vào từ bàn phím
Đề cương bài giảng Cơ sở kỹ thuật lập trình
55
BÀI 5: THẢO LUẬN/BÀI TẬP VỀ CÁC CẤU TRÚC
LẶP VÀ CẤU TRÚC ĐIỀU KHIỂN
MỤC TIÊU
Học xong bài học này sinh viên có thể:
o Vận dụng được cách thức hoạt động của các cấu trúc rẽ nhánh vào từng
bài toán cụ thể
o Phân biệt được điểm giống và khác nhau giữa các cấu trúc lặp
o Sử dụng thành thạo các câu lệnh lặp để giải các bài toán cụ thể
A. TỔ CHỨC THỰC HIỆN
- Giáo viên chia lớp thành nhiều nhóm cùng thảo luận các bài tập ở dưới (nhóm
thảo luận từ 20 đến 35 phút với mỗi bài thảo luận ở dưới).
- Giáo viên định hướng và giúp đỡ các nhóm thực hiện thảo luận một cách hiệu
quả.
- Các nhóm trình bày kết quả thảo luận; giáo viên góp ý, nhận xét và giải đáp
các vướng mắc của sinh viên.
B. NỘI DUNG THẢO LUẬN
Bài thảo luận số 1:
Viết chương trình tính lương của nhân viên dựa theo thâm niên công tác (TNCT)
như sau:
Lương = hệ số * lương căn bản, trong đó lương căn bản là 650000 đồng.
Nếu TNCT < 12 tháng: hệ số= 1.92
Nếu 12 <= TNCT < 36 tháng: hệ số= 2.34
Nếu 36 <= TNCT < 60 tháng: hệ số= 3
Đề cương bài giảng Cơ sở kỹ thuật lập trình
56
Nếu TNCT >= 60 tháng: hệ số= 4.5
Hƣớng dẫn:
- Lựa chọn cấu trúc: Bài toán có nhiều lựa chọn để tính thâm niên công tác nên
dùng cấu trúc điều khiển if else
- Cách thực hiện:
const int luongcb = 650;
int tnct;
double heso, luong;
if (tnct < 12) heso = 1.92;
else if (tnct < 36) heso = 2.34;
else if (tnct < 60) heso = 3;
else heso = 4.5;
luong = luongcb * heso;
Bài thảo luận số 2:
Một điểm KARAOKE tính tiền khách hàng theo công thức sau:
Mỗi giờ trong 3 giờ đầu tiên tính 30.000 đồng/giờ,
Mỗi giờ tiếp theo có đơn giá giảm 30% so với đơn giá trong 3 giờ đầu
tiên.
Ngoài ra nếu thời gian thuê phòng từ 8 – 17 giờ thì được giảm giá 10%. Viết
chương trình nhập vào giờ bắt đầu, giờ kết thúc và in ra số tiền khách hàng phải trả
biết rằng 8 ≤giờ bắt đầu < giờ kết thúc ≤24.
Hƣớng dẫn:
- Lựa chọn cấu trúc: Bài toán có nhiều lựa chọn để tính thời gian nên dùng cấu
trúc điều khiển if else
- Cách thực hiện:
int giobd, giokt, thoigian, tien;
Đề cương bài giảng Cơ sở kỹ thuật lập trình
57
//Nhập giobd, giokt và kiểm tra điều kiện giobd >= 8 và
giokt <= 24 sử dụng do...while
thoigian = giokt – giobd;
if (thoigian > 3)
tien = 3 * 30000 + (thoigian – 3) * 30000 * 0.7;
else tien = thoigian * 30000;
if (giokt <= 17) //tìm cách tính tổng quát hơn
tien *= 0.9; //Giảm 10%
Bài thảo luận số 3:
Viết chương trình tính n!! với n!! = 1.3.5n nếu n lẻ, n!! = 2.4.6n nếu n chẵn.
Hƣớng dẫn:
- Lựa chọn cấu trúc: Bài toán có công việc lặp là tính giai thừa dựa vào giá trị n
nhập từ bàn phím nên dùng cấu trúc lặp for
- Cách thực hiện:
Ta cần xác định i chạy từ 1 hay 2 phụ thuộc vào n chẵn hay lẻ?
for(i = (n % 2)? 1 : 2; i <= n; i += 2) gt *= i;
Bài thảo luận số 4:
Viết chương trình đếm và in ra số lượng các số nguyên chia hết cho 3 hoặc 7 nằm
trong đoạn 1 đến 100.
Hƣớng dẫn:
- Lựa chọn cấu trúc: Bài toán có công việc lặp là in ra số lương các số nguyên
trong đoạn 1 đến 100 nên dùng cấu trúc lặp for để kiểm tra điều kiện của biến chạy,
kết hợp với cấu trúc điều khiển if để kiểm tra điều kiện của i có chia hết cho 3 hoặc 7
hay không.
- Cách thực hiện:
Đề cương bài giảng Cơ sở kỹ thuật lập trình
58
int Dem = 0,i;
for (i = 1; i <= 100; i++)
if( (i % 3 ==0) || (i % 7 == 0))
{
Dem++;
}
Bài thảo luận số 5:
Viết chương trình nhập vào một số nguyên dương, xuất ra dạng phân tích thừa số
nguyên tố của số đó.
Hƣớng dẫn:
- Lựa chọn cấu trúc: Bài toán có công việc lặp là nhập vào số nguyên dương bất
kỳ nên dùng cấu trúc lặp while để kiểm tra điều kiện của i, sau đó dùng cú pháp điều
khiển if để kiểm tra điều kiện về số nguyên tố là chia hết cho 1 và chính nó.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
59
BÀI 6: MẢNG MỘT CHIỀU
MỤC TIÊU
Học xong bài này sinh viên có thể:
o Trình bày được cấu trúc của mảng một chiều
o Cài đặt bài toán trên mảng một chiều
o Rèn luyện tư duy, sáng tạo trong các ứng dụng mảng một chiều
6.1 Giới thiệu về mảng một chiều
Giả sử bạn muốn lưu n số nguyên để tính trung bình, bạn không thể khai báo n
biến để lưu n giá trị rồi sau đó tính trung bình.
Ví dụ 6.1:
Giả sử tính trung bình 10 số nguyên nhập vào từ bàn phím, ta sẽ khai báo 10
biến: a, b, c, d, e, f, g, h, i, j có kiểu int và lập thao tác nhập cho 10 biến này như sau:
printf("Nhap vao bien a: ");
scanf("%d", &a);
Với 10 biến thì 2 lệnh trên sẽ phải thực hiện 10 lần, sau đó tính trung bình:
(a + b + c + d + e + f + g + h + i + j)/10
Điều này thật mất thời gian và chỉ phù hợp với n nhỏ, còn đối với n lớn thì khó
có thể thực hiện được.
Và để giải quyết những bài toán này thì giải pháp đơn giản và tối ưu nhất là sử
dụng mảng.
Mảng có thể có một hay nhiều chiều và chúng ta có thể khai báo mảng là một,
hay nhiều chiều. Trong ngôn ngữ C không giới hạn số chiều của mảng.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
60
6.1.1 Khái niệm về mảng một chiều
Một mảng (array) là một tập hợp liên tiếp các vị trí lưu trữ dữ liệu được đặt
chung một tên và được khai báo chung một kiểu. Mỗi vị trí lưu trữ được gọi là một
phần tử mảng. Có bao nhiêu kiểu biến thì cũng có bấy nhiêu kiểu mảng.
Một mảng một chiều hay còn gọi là mảng đơn là một mảng chỉ có một chỉ số.
Một chỉ số là một số nằm trong các dấu ngoặc vuông đứng ngay sau tên mảng. Số này
chỉ thị số phần tử khác nhau của mảng. Ví dụ: float chi_tieu 12;
Hình ảnh về mảng một chiều
int a[10];
Phía trên là hình minh hoạ thể hiện một mảng có tên là a có thể chứa tối đa 10
phần tử kiểu int. Mỗi phần tử được biểu diễn bằng một vùng nhớ. Được lưu trữ theo
chỉ số bắt đầu từ phần tử 0.
- Kích thước của mảng chính là số phần tử mà mảng đó có thể chứa, như ví dụ
trên thì kích thước của mảng a trong ví dụ trên là 10.
6.1.2 Cách khai báo
a) Kiểu tường minh:
[];
int a[10]; //Khai báo một mảng số nguyên có tên là a gồm 10 phần tử.
float b[20]; //Khai báo một mảng số thực có tên là b gồm 20 phần tử.
int c[]; //Khai báo một mảng số nguyên có tên là c với số phần tử không xác
định.
Chú ý:
- Phải xác định số lượng phần tử cụ thể bằng hằng số khi khai báo.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
61
- Mảng luôn xác định phần tử đầu tiên xuất phát từ 0.
b) Khai báo không tường minh:
typedef [];
typedef int mang[10];
typedef dùng để đặt tên cho một kiểu dữ liệu. Tên kiểu sẽ được dùng để khai báo
dữ liệu sau này. Nói một cách nôm na thì từ khóa typedef sẽ giúp bạn tự do đặt tên
khai báo các kiểu dữ liệu cho riêng mình phù hợp với mục đích lập trình dựa vào các
kiểu dữ liệu đã có sẵn.
Sau này có thể dùng kiểu mang như là một kiểu dữ liệu mảng kiểu int mà không
cần phải khai báo dài dòng nữa. Khi viết một chương trình và trong chương trình đó có
một kiểu dữ liệu được sử dụng nhiều lần, hoặc muốn viết code một cách tường mình,
đọc là hiểu ngay, hoặc kiểu khai báo cũ mất quá nhiều thời gian thì những lúc này đây
typedef sẽ phát huy tác dụng của nó.
Ví dụ 6.2:
typedef int mang[10];
mang a,b;
Lúc này a,b là các mảng 1 chiều có kiểu dữ liệu là int và có độ rộng bằng 10.
6.1.3 Đặc điểm của mảng một chiều
- Mảng là một kiểu dữ liệu có cấu trúc do người lập trình tự định nghĩa.
- Biểu diễn một dãy các biến có cùng kiểu dữ liệu. Ví dụ: Dãy số nguyên, dãy
các ký tự
- Kích thước được xác định ngay khi khai báo và không bao giờ thay đổi.
- Trong ngôn ngữ lập trình C luôn chỉ định một khối nhớ liên tục cho một biến
kiểu mảng.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
62
6.1.4 Cách khởi tạo phần tử cho mảng
a) Khởi tạo phần tử ngay trong câu lệnh khai báo mảng:
int a[4]={2912, 1706, 1506, 1904};
b) Khởi tạo giá trị cho mọi phần tử
int a[4]={0};
Trong trường hợp khởi tạo giá trị như thế này thì tất các các phần tử của mảng
đều có giá trị là 0.
c) Tự động xác định số lượng phần tử
int a[]={1, 4, 3, 4};
Lúc này mảng có 4 phần tử và các phần tử của mảng sẽ lần lượt nhận các giá trị
như sau:
a[0]=1;
a[1]=4;
a[2]=3;
a[3]=4;
6.2 Truy xuất các phần tử trong mảng
Việc truy xuất đến các phần tử của mảng một chiều được xác định bởi tên mảng
cùng với chỉ số của phần tử được đặt trong cặp dấu ngoặc vuông “[” và “]”, cụ thể:
Đề cương bài giảng Cơ sở kỹ thuật lập trình
63
tên_mảng[chỉ số]
int a[] = {1, 2, 3, 4}; // lúc này a[0] = 1, a [1] = 2, a[2]=3, a[3]=4
printf (“%d”, a [0]); //kết quả in ra là 1;
printf (“%d”,a[2]); //Kết quả in ra là 3 ;
6.3 Các thao tác với mảng một chiều
6.3.1 Nhập mảng
Để nhập các giá trị cho mảng một chiều ta làm như sau:
- Bước 1: Nhập số phần tử của ma trận
- Bước 2: Khai báo mảng với kích thước vừa nhập
int A[so_phan_tu];
------------Với mảng được xác định trước số phần tử thì bỏ qua bước 1,2 và thực
hiện luôn bước 3----------
- Bước 3: Cho một biến i chạy từ 0 đến so_phan_tu
Với mỗi giá trị của i thì ta nhập giá trị cho từng phần tử của mảng
for (int i=0;i<so_phan_tu;i++)
{
// Tiến hành nhập giá trị cho các phần tử của mảng:
printf (“Nhap phan tu A[%d]:”,i);
scanf(“%d”,&A[i]);
}
Ví dụ 6.3: Nhập giá trị cho các phần tử của mảng các số nguyên, biết rằng số phần tử
của mảng được nhập từ bàn phím.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
64
#include
#include
int main()
{
int m;
printf(“Nhap so phan tu cua mang: ”); scanf(“%d”,&m);
int A[m];
for(int i=0; i < m; i++) //duyet cac phan tu tu 0 den m
{
printf (“Nhap phan tu A[%d]:”,i);
scanf(“%d”,&A[i]);
}
getch();
return 0;
}
Kết quả sau khi chạy chƣơng trình:
6.3.2 Hiện mảng
Để hiển thị giá trị của mảng lên màn hình theo hình ma trận thì ta làm như sau:
- Cho một biến i chạy từ 0 đến so_phan_tu
for (int i=0;i<so_hang;i++)
//Hiển thị mỗi ptu trên cùng 1 hàng và cách nhau 1 tab
printf (“%d\t”,A[i]);
Ví dụ 6.4: Nhập giá trị cho các phần tử của mảng các số nguyên rồi hiện mảng đó lên
màn hình, biết rằng số phần tử của mảng được nhập từ bàn phím.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
65
#include
#include
int main()
{
int m;
printf("Nhap so phan tu cua mang: "); scanf("%d",&m);
int A[m];
for(int i=0; i < m; i++) //duyet cac phan tu tu 0 den m
{
printf ("Nhap phan tu A[%d]:",i);
scanf("%d",&A[i]);
}
printf("Mang vua nhap la:\n ");
for(int i=0; i < m; i++) //duyet cac phan tu tu 0 den m
printf ("%d\t",A[i]);
getch();
return 0;
}
Kết quả sau khi chạy chương trình:
6.2 Ví dụ áp dụng
Ví dụ 6.5: Viết chương trình in ra những số chẵn trong mảng nhập từ bàn phím
Đề cương bài giảng Cơ sở kỹ thuật lập trình
66
Hƣớng dẫn:
Xác định yêu cầu bài toán:
- Yêu cầu 1: Nhập mảng từ bàn phím
- Yêu cầu 2: In ra những số chẵn ở trong mảng.
Các bƣớc thực hiện nhƣ sau:
Bước 1. Nhập mảng từ bàn phím
- Khai báo một phần tử kiểu nguyên lưu trữ số lượng phần tử của mảng spt (giá
trị phần tử được nhập từ bàn phím).
- Khai báo một mảng gồm spt phần tử (spt đã được nhập vào trước đó).
- Duyệt từ 0 ->spt-1 để nhập giá trị cho từng phần tử trong mảng=>Kết thúc
việc nhập các phần tử từ bàn phím.
Bước 2. Tìm các phần tử chẵn trong mảng.
- Duyệt qua từng phần tử của mảng (tương tự như quá trình nhập phần tử trong
mảng)
- Sử dụng cấu trúc rẽ nhánh để kiểm tra phần tử có chẵn hay không. Nếu phần
tử chẵn thì in giá trị phần tử ra màn hình. (Để kiểm tra phần tử chẵn hay lẻ ta
đem giá trị của phần tử %2 nếu được giá trị số dư là 0 thì phần tử là chẵn
ngược lại là lẻ).
Bước 3: Kết thúc chương trình.
#include
#include
int main()
{
int spt;
printf (“Nhap phan so phan tu cua mang: ”); //Nhập spt
scanf(“%d”, &spt); //số phần tử của mảng
int a[spt]; //khai báo mảng mới với số phần tử nhập vào
//nhập các giá trị cho các biến mảng từ bàn phím
Đề cương bài giảng Cơ sở kỹ thuật lập trình
67
for (int i = 0; i <spt; i++)
{
printf (“Nhap phan tu thu %d= ”,i); //thông báo
việc nhập
scanf(“%d”,&a[i]); //nhập giá trị cho phần tử
a[i]
}
for(int i=0; i < spt ; i++) //duyệt các phần tử 0,
1, 2, 3 ...
{
if (a[i] %2==0) //Kiểm tra xem phần tử có chia
hết cho 2?
{
printf (“%d\t”,a[i]); //In phần tử nếu chẵn
}
}
getch();
return 0;
}
Kết quả sau khi chạy chƣơng trình:
Ví dụ 6.6:
Tìm phần tử lớn nhất trong mảng gồm 4 phần tử với yêu cầu với các phần tử
được khởi tạo sẵn.
Yêu cầu:
Đề cương bài giảng Cơ sở kỹ thuật lập trình
68
Yêu cầu 1: Khai báo một mảng một chiều gồm 4 phần tử, khởi tạo dữ liệu cho
mảng được khai báo.
Yêu cầu 2: Tìm phần tử lớn nhất trong mảng một chiều vừa khai báo
Hƣớng dẫn:
Bước 1. Khai báo một mảng gồm 4 phần tử có khởi tạo dữ liệu (xem mục 6.2 a).
Bước 2. Tìm phần tử lớn nhất:
- Khởi tạo biến max= giá trị phần tử đầu tiên.
- Duyệt qua tất cả các phần tử của mảng, nếu phần tử nào có giá trị lớn hơn max
thì gán giá trị của phần tử đó cho max. Kết thúc vòng lặp giá trị của biến max sẽ là giá
trị của phần tử lớn nhất trong mảng.
#include
#include
int main()
{
int a[4] = {1, 6, 4, 5}; //khai báo mảng và khởi tạo giá
trị cho mảng bước 1
//các bước thực hiện tìm phần tử max
int max =a[0]; //khởi tạo giá trị biến max bước 2
for(int i=0; i < 4; i++) //duyệt các phần tử 0, 1, 2, 3
bước 3
{
if (max < a[i]) //so sánh giá trị max với phần tử
{
max = a[i]; //gán giá trị của phần tử lớn cho
biến max
}
}
printf (“%d”,max); //tìm được giá trị max trong
mảng.
getch();
Đề cương bài giảng Cơ sở kỹ thuật lập trình
69
return 0;
}
Ví dụ 6.7: Viết chương trình tính tổng các số lẻ ở trong mảng nhập từ bàn phím
Hƣớng dẫn
Xác định yêu cầu bài toán
Yêu cầu 1: Nhập mảng vào từ bàn phím
Yêu cầu 2: Tính tổng các số lẻ
Các bƣớc thực hiện
Bước 1. Nhập mảng từ bàn phím
- Tương tự bước 1 của ví dụ 6.2
Bước 2. Tính tổng các số lẻ
- Khởi tạo một biến để lưu trữ tổng các số lẻ: int tong=0;
- Duyệt qua từng phần tử của mảng
- Sử dụng cấu trúc rẽ nhánh để kiểm tra phần tử có lẻ hay không. Nếu phần tử
lẻ thì cộng thêm giá trị của phần tử vào biến tổng (các bước kiểm tra như với
số chẵn).
- In biến tổng ra màn hình và kết thúc bài toán.
#include
#include
int main()
{
int spt;
printf ("Nhap so phan tu cua mang:");
scanf("%d", &spt); //Nhập số phần tử của mảng
Đề cương bài giảng Cơ sở kỹ thuật lập trình
70
int a[spt]; //khai báo mảng với spt vừa nhập
//Nhập các giá trị cho các biến mảng
for (int i = 0; i <spt; i++)
{
printf ("Nhap phan tu thu %d= ",i); //thông báo việc
nhập
scanf("%d",&a[i]); //Nhập giá trị cho phần tử a[i]
}
int tong=0; //Kh?i t?o giá tr? t?ng
for(int i=0; i < spt ; i++) //duyệt các phần tử của
mảng
{
if (a[i] %2!=0) //Kiểm tra xem phần tử a[i] có
lẻ không
{
tong+=a[i]; //Cộng vào biến tong nếu a[i] lẻ
}
}
printf ("tong cac so le là: %d",tong);
getch();
return 0;
}
Kết quả sau khi chạy chương trình:
Đề cương bài giảng Cơ sở kỹ thuật lập trình
71
Ví dụ 6.8: Viết chương trình tính tích của các phần tử trong mảng nhập vào từ bàn
phím.
Hƣớng dẫn:
Input: Nhập mảng vào từ bàn phím
Output: Tính tích của các phần tử của mảng
- Bước 1: Nhập mảng từ bàn phím
Tương tự ví dụ 6.2
- Bước 2: Tính tích của các phần tử trong mảng.
- Khởi tạo một biến để lưu trữ tích của các phần tử: int tich=1; (khởi tạo khi
tính tích phần tử)
- Duyệt qua từng phần tử của mảng nhân vào với biến lưu trữ là biến “tich”
(tich=tich*a[i]; hoặc tich*=a[i];)
- In biến “tich” ra màn hình và kết thúc bài toán.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
72
BÀI 7: THỰC HÀNH VỀ CẤU TRÚC ĐIỀU KHIỂN
VÀ CẤU TRÚC LẶP
Đề cương bài giảng Cơ sở kỹ thuật lập trình
73
BÀI 8: MẢNG HAI CHIỀU
MỤC TIÊU
Học xong bài này sinh viên có thể:
o Hiểu và giải thích được cấu trúc của mảng hai chiều
o Xây dựng được chương trình xử lý dữ liệu trên mảng hai chiều
o Rèn luyện tư duy, sáng tạo trong các ứng dụng mảng hai chiều
8.1. Giới thiệu về mảng hai chiều
8.1.1 Định nghĩa
Có nhiều cách để hiểu về mảng hai chiều. Sau đây là một số cách định nghĩa
mảng hai chiều.
Cách 1: Mảng hai chiều là một mảng các phần tử trong đó mỗi phần tử của nó
là mảng một chiều có kích thước bằng nhau. Đây là cách định nghĩa đệ quy thông
qua định nghĩa mảng một chiều. Sử dụng phương pháp này ta có thể định nghĩa mảng
n chiều (với n>=2) bằng cách thông qua định nghĩa của mảng n-1 chiều.
Ví dụ 8.1:
int a[2][3];
Đây là một mảng trong đó có 2 phần tử, mỗi phần tử của mảng là một mảng một
chiều có kích thước là 3 phần tử.
Cách 2. Mảng hai chiều là tập hợp các phần tử có cùng kiểu dữ liệu được tổ
chức dưới dạng bảng (có thể coi nó như một ma trận). Với định nghĩa này các phần
tử của mảng được sắp xếp dựa trên chỉ số hàng và cột. Thông qua định nghĩa này ta
gọi một mảng hai chiều là một ma trận cấp m × ntrong đó m được gọi là chỉ số hàng
và được gọi là chỉ cố cột.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
74
Ở hình trên là một mảng với:
- Tên mảng là: m
- Số lượng phần tử của mỗi chiều là: 4 dòng, 5 cột
- Kiểu dữ liệu của các phần tử là: kiểu nguyên
- Phần tử của mảng được tham chiếu đến là m[2][3] có giá trị = 0
8.1.2 Các cách khai báo
Để khai báo một mảng 2 chiều ta khai báo một biến mảng có 2 chỉ số kích thước
đại diện cho hàng và cột.
[số hàng][số cột]
Ví dụ 8.2:
int a[m][n];
Đề cương bài giảng Cơ sở kỹ thuật lập trình
75
Theo như khai báo trên: m là số hàng của ma trận, n là số cột của ma trận. Trong
đó m, n là những số nguyên xác định. Với cách khai báo này các phần tử trong mảng
sẽ mặc định có giá trị là NULL.
- Việc khai báo mảng có thể kết hợp với gán giá trị cho mảng:
Cách 1:
int a[2][3]={1,2,3,4,5,6};
Trong cách khai báo này ta giá trị các phần tử được khởi tạo như sau:
a[0][0]=1; //Phần tử đầu tiên
a[0][1]=2; //Phần tử thứ hai
a[0][2]=3; //Phần tử thứ ba
a[1][0]=4; //Phần tử thứ tư
a[1][1]=5; //Phần tử thứ năm
a[1][2]=6; //Phần tử thứ sáu
Cách 2:
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
Trong cách khai báo này ta giá trị các phần tử được khởi tạo như sau:
a[0][0]=1; a[0][1]=2; a[0][2]=3;
a[1][0]=4; a[1][1]=5; a[1][2]=6;
a[2][0]=7; a[2][1]=8; a[2][2]=9;
8.2 Truy xuất các phần tử trong mảng hai chiều
Việc truy xuất đến các phần tử của mảng 2 chiều được xác định bởi tên mảng
cùng với hai chỉ số là hàng và được đặt trong cặp dấu ngoặc vuông “[” và “]”, cụ thể:
tên_mảng[chỉ số hàng][ chỉ số cột]
Chẳng hạn, muốn truy xuất đến phần tử tại hàng thứ 3 và cột thứ 5 của mảng a
thì ta viết: a[3][5].
Đề cương bài giảng Cơ sở kỹ thuật lập trình
76
Ví dụ 8.3:
int b = a[i][j];
Trong ví dụ trên giá trị của mảng a tại dòng i, cột j được gán vào cho biến b.
Thông thường trong các bài toán liên quan đến mảng 2 chiều ta thường sử dụng 2
cấu trúc lặp lồng nhau để thực hiện duyệt qua tất cả các hàng và cột của mảng.
8.3 Các thao tác với mảng hai chiều
8.3.1 Nhập mảng
Để nhập giá trị cho các phần tử của mảng hai chiều A[m][n] ta làm như sau:
- Bước 1: Nhập số hàng, số cột của ma trận
- Bước 2: Khai báo mảng với kích thước là số hàng và số cột vừa nhập
int A[so_hang][so_cot];
- Bước 3: Cho một biến i chạy từ 0 đến so_hang
Với mỗi giá trị của i thì j chạy từ 0 đến so_cot
for (int i=0;i<so_hang;i++)
for (int j=0;i<so_cot;j++)
{
// Tiến hành nhập giá trị cho các phần tử của mảng:
printf (“Nhap phan tu A[%d][%d]:”,i,j);
scanf(“%d”,&A[i][j]);
}
Ví dụ 8.4: Nhập giá trị cho các phần tử của mảng hai chiều a[m][n] với m,n được
nhập từ bàn phím.
#include
int main()
Đề cương bài giảng Cơ sở kỹ thuật lập trình
77
{
int m,n;
printf ("Nhap so hang, so cot cua ma tran:");
scanf("%d%d",&m,&n);
int a[m][n];
for (int i=0;i<m;i++) //duyet theo hang
for (int j=0;j<n;j++) //duyet theo cot
{
//Nhap gia tri cho cac phan tu cua mang
printf ("Nhap phan tu a[%d][%d]:",i,j);
scanf("%d",&a[i][j]);
}
return 0;
}
Kết quả sau khi chạy chƣơng trình:
8.3.2 Hiện mảng
Để hiển thị giá trị của mảng lên màn hình theo hình ma trận thì ta thực hiện các
bước như sau:
- Bước 1: Cho một biến i chạy từ 0 đến so_hang
Với mỗi giá trị của i thì j chạy từ 0 đến so_cot
for (int i=0;i<so_hang;i++)
Đề cương bài giảng Cơ sở kỹ thuật lập trình
78
{
for (int j=0;i<so_cot;j++)
//Hiển thị mỗi ptu trên cùng 1 hàng và cách nhau 1 tab
printf (“%d\t”,A[i][i]);
//Hết 1 hàng thì xuống dòng
printf (“\n”);
}
Ví dụ 8.5: Nhập giá trị cho các phần tử của mảng hai chiều a[m][n] rồi hiển thị mảng
vừa nhập lên màn hình,với n,m được nhập từ bàn phím.
#include
int main()
{
int n,m;
printf ("Nhap so hang, so cot cua ma tran:");
scanf("%d%d",&m,&n);
int a[m][n];
for (int i=0;i<m;i++) //duyet theo hang
for (int j=0;j<n;j++) //duyet theo cot
{
//Nhap gia tri cho cac phan tu cua mang
printf ("Nhap phan tu a[%d][%d]:",i,j);
scanf("%d",&a[i][j]);
}
//-------Hiển thị mảng vừa nhập------------
printf ("\nMang vua nhap la:\n");
Đề cương bài giảng Cơ sở kỹ thuật lập trình
79
for (int i=0;i<m;i++)
{
for (int j=0;j<n;j++)
printf ("%d\t",a[i][j]);
printf ("\n");
}
return 0;
}
Kết quả sau khi chạy chƣơng trình:
8.4 Một số ví dụ về mảng hai chiều
Ví dụ 8.6: Nhập và tính tổng các phần tử của một ma trận số nguyên gồm m dòng, n
cột với m, n nhập từ bàn phím.
Hƣớng dẫn:
Xác định yêu cầu bài toán:
- Yêu cầu 1. Nhập số phần tử của hàng và cột m, n
- Yêu cầu 2. Khai báo mảng 2 chiều m × n và nhập các phần tử của ma trận
- Yêu cầu 3. Tính tổng các phần tử trong ma trận
Thực hiện
Đề cương bài giảng Cơ sở kỹ thuật lập trình
80
- Bước 1: Nhập m, n từ bàn phím, khai báo 2 số nguyên m, n và sử dụng lệnh
cin để nhập số nguyên vào.
- Bước 2: Khai báo mảng m x n số nguyên và nhập vào từ bàn phím (xem ví dụ
8.1)
- Bước 3: Tính tổng các phần tử của mảng (thực hiện khởi tạo biến tổng và
duyệt qua từng phần tử của mảng và cộng vào biến tổng)
#include
int main()
{
//khai bao so hang va so cot
int n,m;
printf(”Nhap so hang và so cot cua mang:”);
scanf(“%d%d”,&m,&n);
//nhap cac phan tu cho mang
int a[m][n];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
printf(”Nhap phan tu [%d][%d]:”,i,j);
scanf(“%d”,&a[i][j]);
}
//tinh tong cac phan tu cua mang
int tong=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
Đề cương bài giảng Cơ sở kỹ thuật lập trình
81
tong+=a[i][j]; // hoac tong = tong+a[i][j];
}
printf(”Tong cac phan tu cua mang=%d”, tong);
return;
}
Ví dụ 8.7: Nhập và tính tổng các phần tử của hàng chẵn trong một ma trận số nguyên
gồm m dòng, n cột với m, n nhập từ bàn phím.
Hƣớng dẫn:
Xác định yêu cầu bài toán:
- Yêu cầu 1. Nhập số phần tử của hàng và cột m, n
- Yêu cầu 2. Khai báo mảng 2 chiều m × n và nhập các phần tử của ma trận
- Yêu cầu 3. Xác định các phần tử thuộc hàng chẵn trong ma trận, tính tổng các
phần tử trong ma trận
Ví dụ 8.8: Nhập và tính tích các phần tử của một ma trận số nguyên gồm m dòng, n
cột với m, n nhập từ bàn phím.
Hƣớng dẫn:
Xác định yêu cầu bài toán:
- Yêu cầu 1. Nhập số phần tử của hàng và cột m, n
- Yêu cầu 2. Khai báo mảng 2 chiều m × n và nhập các phần tử của ma trận
- Yêu cầu 3. Tính tích các phần tử trong ma trận
Đề cương bài giảng Cơ sở kỹ thuật lập trình
82
BÀI 9: THỰC HÀNH VỀ MẢNG (BUỔI 1)
Đề cương bài giảng Cơ sở kỹ thuật lập trình
83
BÀI 10: THẢO LUẬN/BÀI TẬP VỀ MẢNG
MỤC TIÊU
Học xong bài này sinh viên có thể:
o Nắm vững kỹ thuật sử dụng dữ liệu kiểu mảng.
o Vận dụng một cách hiệu quả dữ liệu kiểu mảng để xử lý một bài toán cụ thể
o Tăng cường kỹ năng làm việc nhóm và rèn luyện tính cẩn thận trong công
việc.
C. TỔ CHỨC THỰC HIỆN
- Giáo viên chia lớp thành nhiều nhóm cùng thảo luận các bài tập ở dưới (nhóm
thảo luận từ 20 đến 35 phút với mỗi bài thảo luận ở dưới).
- Giáo viên định hướng và giúp đỡ các nhóm thực hiện thảo luận một cách hiệu
quả.
- Các nhóm trình bày kết quả thảo luận; giáo viên góp ý, nhận xét và giải đáp
các vướng mắc của sinh viên.
D. NỘI DUNG THẢO LUẬN
Bài thảo luận số 1:
Viết chương trình thực hiện việc sau:
- Nhập mảng gồm n số nguyên từ bàn phím
- Hiển thị mảng ra màn hình
- Tìm kiếm một phần tử trong mảng: nhập số a, kiểm tra xem số a có trong
mảng không. Nếu có thì hiển thị ra màn hình vị trí mà số a xuất hiện lần đầu
tiên.
- Sắp xếp các số nguyên trong mảng theo thứ tự giảm dần và in ra màn hình
- Sắp xếp các số nguyên trong mảng theo thứ tự tăng dần và in ra màn hình
Bài thảo luận số 2:
Đề cương bài giảng Cơ sở kỹ thuật lập trình
84
Viết chương trình thực hiện việc sau:
- Nhập mảng có tên là a gồm n số nguyên từ bàn phím
- Hiển thị mảng a ra màn hình
- Kiểm tra xem mảng a có là nguyên tố hay không (mảng là nguyên tố khi tất
cả các phần tử của mảng đều là số nguyên tố)
- Tách các phần tử chẵn của mảng a đưa sang mảng có tên là chan; các phần tử
lẻ đưa sang mảng có tên là le.
- Sắp xếp mảng chan, mảng le theo thứ tự tăng dần
- Loại bỏ các phần tử giống nhau của mảng chan, mảng le
- Gộp hai mảng chan và le thành mảng tonghop sao cho các phần tử của mảng
tonghop vẫn được sắp theo thứ tự tăng dần.
Bài thảo luận số 3:
Viết chương trình thực hiện việc sau:
- Nhập mảng có tên là a gồm n số nguyên từ bàn phím
- Hiển thị mảng a ra màn hình
- Sắp xếp mảng a theo thứ tự giảm dần
- Nhập từ bàn phím số b và bổ sung vào mảng a sao cho mảng a vẫn được sắp
theo thứ tự giảm dần
- Loại bỏ các phần tử giống nhau của mảng chan, mảng le
- Gộp hai mảng chan và le thành mảng tonghop sao cho các phần tử của mảng
tonghop vẫn được sắp theo thứ tự tăng dần.
Bài thảo luận số 4:
Viết chương trình thực hiện việc sau:
- Nhập mảng có tên là a gồm n số nguyên từ bàn phím
- Hiển thị mảng a ra màn hình
Đề cương bài giảng Cơ sở kỹ thuật lập trình
85
- Kiểm tra xem mảng a có phải là mảng toàn số chẵn
- Kiểm tra xem mảng a có phải là mảng tăng dần
- Có bao nhiêu số trong mảng a chia hết cho 4 nhưng không chia hết cho 5
- Tính tổng các số nguyên tố có trong mảng a
- Hiển thị ra màn hình số nhỏ nhất, số lớn nhất của mảng a.
- Xóa tất cả các số nguyên tố của mảng a và hiển thị mảng a ra màn hình
TÓM TẮT
Thảo luận về cách khai báo và sử dụng mảng một chiều.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
86
BÀI 11: THỰC HÀNH VỀ MẢNG (BUỔI 2)
Đề cương bài giảng Cơ sở kỹ thuật lập trình
87
BÀI 12: THAO TÁC VỚI KÝ TỰ VÀ XÂU KÝ TỰ
MỤC TIÊU
Học xong bài này người học sẽ:
o Sử dụng được kiểu char để lưu giữ các ký tự đơn.
o Tạo lập các mảng kiểu char để lưu giữ các xâu nhiều ký tự.
o Thực hiện được các thao tác cơ bản trên xâu ký
o Cài đặt được các bài toán trên xâu ký tự
12.1 Giới thiệu về ký tự và xâu ký tự
Một ký tự là một chữ, một chữ số, hoặc một ký hiệu đặc biệt nào đó. Một xâu ký
tự (viết gắn gọn là xâu) là một dãy các ký tự. Các xâu được sử dụng để lưu giữ các dữ
liệu văn bản bao gồm các chữ, các chữ số và các ký hiệu khác.
Ký tự và xâu là một kiểu dữ liệu có ở trên tất cả các ngôn ngữ lập trình. Vì thế
việc thành thạo trong việc thao tác với ký tự và xâu là rất quan trọng đối với các lập
trình viên.
Trong C dùng kiểu char để lưu giữ các ký tự. Trong Bài 1, ta đã thấy char là
một trong các kiểu dữ liệu số nguyên. Như vậy, nếu char là một kiểu số, thì làm sao
nó có thể được sử dụng để giữ các ký tự ?
Câu trả lời nằm ở chỗ C lưu trữ các ký tự như thế nào. Bộ nhớ của máy tính ghi
tất cả các dữ liệu đều ở dạng số. Không có cách ghi trực tiếp các ký tự. Tuy nhiên mỗi
một ký tự có một mã số tương ứng dùng để mã hóa cho nó. Các mã này được gọi là
các mã ASCII (Amerian Standard Code for Information Interchange). Bảng mã này
gán các giá trị từ 0 đến 255 cho các chữ cái thường và hoa, các chữ số, và các ký hiệu
khác.
Ví dụ, 97 là mã của chữ a. Khi ghi chữ a trong một biến kiểu char, thực ra là ghi
số 97 này. Bởi vì miền giá trị cho phép của kiểu char trùng với tập hợp mã ASCII,
nên char cũng là kiểu thích hợp để lưu giữ các ký tự.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
88
12.1.1 Sử dụng các biến ký tự
Giống như các biến khác, các biến kiểu này cần phải được khai báo rồi mới
được sử dụng. Ngoài ra, có thể khởi tạo chúng cùng lúc với việc khai báo. Ví dụ,
char a, b, c; /* Khai báo ba biến kiểu char */
char code = 'x'; /* Khai báo biến char có tên code
và gán ký tự x cho biến này */
code = „!‟; /* Ghi ! vào biến char có tên code */
Để tạo ra các hằng ký tự thực sự, phải để ký tự trong các dấu nháy đơn. Chương
trình dịch sẽ tự động chuyển các hằng ký tự thực sự thành mã ASCII tương ứng và giá
trị của mã này được gán cho biến.
Có thể tạo ra các hằng ký tự ký hiệu bằng chỉ thị #define hoặc từ khóa const:
#define EX „x‟
char code = EX; /* Gán „x‟ cho code */
const char A = „z‟;
Chương trình 12.1 là một ví dụ minh họa về bản chất số của việc lưu giữ ký tự.
Hàm printf() có thể được sử dụng để in cả các ký tự và các số. Xâu format %c dùng
để in một ký tự, còn %d để in một số nguyên hệ thập phân.
Ví dụ 12.1: Chương trình minh họa bản chất của các biến kiểu
/*Chương trình 12.1. Minh họa bản chất số của các biến kiểu*/
#include
/* Khai báo và khởi tạo hai biến kiểu char */
char c1 = 'a';
char c2 = 97;
int main()
{
/* In biến c1 như một ký tự, sau đó như một số */
printf("\nLà một ký tự, biến c1 là %c", c1);
printf("\nLà một số, biến c1 là %d", c1);
/* Tương tự như vậy đối với biến c2 */
printf("\nLà một ký tự, biến c2 là %c", c1);
printf("\nLà một số, biến c2 là %d\n ", c1);
return 0;
}
Đề cương bài giảng Cơ sở kỹ thuật lập trình
89
Kết quả của chƣơng trình 12.1 là:
Là một ký tự, biến c1 là a
Là một số, biến c1 là 97
Là một ký tự, biến c2 là a
Là một số, biến c2 là 97
Trong Bài 1 có nói rằng miền giới hạn của một biến kiểu char chỉ đến 127,
trong khi đó mã ASCII lại có thể đến 255. Thực ra, các mã ASCII được chia thành hai
phần. Các mã ASCII thông thường chỉ đến 127; miền này chứa tất cả các chữ, các chữ
số và các ký hiệu khác. Các mã trong khoảng 128-255 là các mã ASCII mở rộng và
dùng để biểu diễn các chữ cái đặt biệt của các nước khác và các ký hiệu đồ họa. Vì vậy
đối với các dữ liệu văn bản thông thường, có thể dùng các biến kiểu char; nếu muốn
in các ký tự ASCII mở rộng, thì phải dùng kiểu unsigned char.
Các biến kiểu char chỉ có thể giữ một ký tự đơn, do đó chúng có tác dụng rất hạn
chế. Vì vậy, cần có một cách khác để lưu giữ các xâu, tức là một dãy các ký tự đơn.
Mặc dù không có một kiểu riêng biệt cho các xâu, nhưng C thao tác kiểu thông tin này
thông qua mảng của các ký tự.
12.1.2 Mảng của các ký tự
Để giữ một xâu gồm 9 ký tự chẳng hạn, cần phải khai báo một mảng kiểu char
có 10 phần tử. Các mảng kiểu char cũng được khai báo giống như các mảng kiểu
khác. Câu lệnh
char string[10];
khai báo một mảng 10 phần tử kiểu char. Mảng này có thể chứa một xâu dài
nhất là 9 ký tự.
Nhưng tại sao khai báo 10 phần tử lại chỉ giữ được nhiều nhất là 9 phần tử ?
Trong C, một xâu được định nghĩa là một dãy các ký tự kết thúc bằng một ký tự không
(null). Nó là một ký tự đặc biệt được biểu diễn bằng \0. Mặc dù được biểu diễn bằng
hai ký hiệu, ký hiệu không vẫn chỉ được hiểu là một ký tự đơn và có mã ASCII là 0.
Một biến kiểu char có cỡ là một byte, vì vậy số byte của một mảng ký tự bằng
đúng số phần tử của mảng.
Đề cương bài giảng Cơ sở kỹ thuật lập trình
90
12.1.3 Khởi tạo các mảng ký tự
Giống như các kiểu dữ liệu khác, các mảng ký tự cũng phải được khởi tạo khi
chúng được khai báo. Các mảng có thể được gán các giá trị theo phương thức tuần tự:
char string[
Các file đính kèm theo tài liệu này:
- 01200047_6448_1983577.pdf