TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH
Nhập môn lập trình Các thành phần cơ bản TS. Ngô Hữu Dũng
Nội dung
Giới thiệu ngôn ngữ lập trình C
Trình biên dịch/thông dịch Cấu trúc chương trình Định dạng trong C Biến, kiểu dữ liệu Hằng số, từ khóa, toán tử
Thư viện
stdio.h, stdlib.h, math.h, string.h, ctype.h, time.h
Nhập xuất căn bản
Nhập: scanf, cin, gets Xuất: printf, cout, puts
2
Nhập môn lập trình - Cơ bản
Ngôn ngữ lập trình C
Được phát triển bởi Dennis Ritchie tại phòng thí nghiệm AT&T Bell vào đầu thập niên 1970
C được dùng trong hệ điều
hành UNIX và phát triển cùng với hệ điều hành này
C đã lan rộng ra nhiều hệ điều hành khác và trở thành ngôn ngữ phổ dụng nhất
3
Nhập môn lập trình - Cơ bản
Trình biên dịch/Trình thông dịch
Mã nguồn Source code
Mã máy Machine Code
Source Code Trình biên dịch Compiler
Trình thông dịch Interpreter
Input
Output
Input Output Executable Program
4
Nhập môn lập trình - Cơ bản
Trình biên dịch: Phân tích chương trình và biên dịch thành mã máy. Trình thông dịch: Phân tích và thực thi chương trình cùng lúc.
Biên dịch và chạy chương trình
IDE – Integrated
Editor
Source code file.c
Development Environment Trình soạn thảo
Biên soạn mã nguồn
Compiler
Trình biên dịch
Phân tích và biên dịch mã nguồn
Object code file.obj
Trình liên kết
Libraries
Linker
Executable code file.exe
Kết hợp các mã đối tượng và thư viện thành mã thực thi
IDE (Integrated Development Environment)
5
Nhập môn lập trình - Cơ bản
thành mã đối tượng
Sửa lỗi - debug Lỗi cú pháp
Semantic Errors
Phát hiện bởi trình biên
Editor
dịch
Syntactic Errors
Lỗi về từ khóa, cú pháp,
Source code file.c
ngữ pháp Lỗi ngữ nghĩa
Compiler
Object code file.obj
Được phát hiện bởi người sử dụng Lỗi về kết quả của
chương trình
Libraries
Linker
Lỗi xuất hiện trong quá trình thực thi chương trình
Executable code file.exe
Đúng cú pháp nhưng sai
kết quả
6
Nhập môn lập trình - Cơ bản
Quiz
Mục đích của việc “biên dịch” là chuyển đổi
A. Ngôn ngữ bậc thấp sang bậc cao B. Chương trình thành mã nguồn C. Mã nguồn sang mã máy D. Mã máy sang mã nguồn
Trường hợp nào sau đây là “lỗi ngữ nghĩa”?
A. Lỗi khi biên dịch chương trình B. Chương trình tính sai kết quả C. Lỗi do gõ sai một câu lệnh D. Lời chú thích không có nghĩa
7
Nhập môn lập trình - Cơ bản
Định dạng trong C
Có phân biệt giữa chữ in HOA và chữ in thường! Các dòng trống, khoảng trắng, lời chú thích đều
được trình biên dịch bỏ qua
Các dấu thụt dòng giúp chương trình dễ đọc, rõ
ràng. Có thể dùng tab hoặc dấu cách
Câu lệnh được kết thúc bằng dấu chấm phẩy ; Chuỗi ký tự được đặt giữa hai dấu hai nháy
"Chuỗi"
Một ký tự được đặt giữa hai dấu một nháy 's'
8
Nhập môn lập trình - Cơ bản
Lời chú thích
Hai cách ghi chú thích
// chú thích dòng /* chú thích
khối*/
Ví dụ 1. /* Chương trình C 2. ** In ra màn hình dòng chữ Hello 2017!*/
3. #include
//Khai báo thư viện
9
Nhập môn lập trình - Cơ bản
Biến
Biến được dùng để lưu trữ dữ liệu và kết quả tính
toán Kiểu dữ liệu: Nguyên, thực, ký tự, chuỗi, mảng, cấu
trúc, con trỏ…
Tên biến: Do người lập trình tự đặt
Biến phải được khai báo trước khi sử dụng
Cú pháp:
10
Nhập môn lập trình - Cơ bản
Biến (2)
Giá trị của biến có thể thay
// Khởi tạo
int year; year = 2016;// Gán
đổi Khởi tạo biến:
int year = 2016;
Phép gán:
year Biến
2016 Vùng nhớ
year = last_year + 1; Một vùng nhớ sẽ được cấp phát tương ứng với kích cỡ của biến Mỗi ô nhớ có một địa chỉ
Kiểu dữ liệu?
riêng
11
Nhập môn lập trình - Cơ bản
Kiểu dữ liệu int: Kiểu số nguyên
2 hoặc 4 bytes (16 hoặc 32 bits) -32,768 → 32,767 hoặc -2,147,483,648 → 2,147,483,647
float: Kiểu số thực
4 bytes (32 bits): 1.2E-38 → 3.4E+38, độ chính xác 24 bits
double: Kiểu số thực có độ chính xác cao hơn float
8 bytes (64 bits): 2.3E-308 → 1.7E+308, độ chính xác 53 bits
char: Kiểu ký tự
1 byte, ví dụ: char exit = 'e';
char []: Kiểu chuỗi
Độ chính xác?
ví dụ: char name[10] = "Quang"; bool: Kiểu luận lý, có giá trị true hoặc false 1 byte, ví dụ: bool kt = true; //C++
12
Nhập môn lập trình - Cơ bản
Số chấm động – floating-point numbers
Biểu diễn số thực
Ví dụ: 12’345 = 1.2345 x 104 Hay 1.2345E+4
significand x base exponent
Trị số x hệ cơ số số mũ Float: Độ chính xác đơn Double: Độ chính xác đôi
Kiểu dữ liệu Dấu Mũ Trị số Tổng số bit Độ chính xác
Float 1 bit 8 bits 23 bits 32 bits (4 bytes) 24 bits (Dấu + trị số)
13
Nhập môn lập trình - Cơ bản
Double 1 bit 11 bits 52 bits 64 bits (8 bytes) 53 bits (Dấu + trị số)
Tên biến
Phải bắt đầu bằng một chữ hoặc dấu gạch dưới (_), tiếp sau đó
có thể kết hợp giữa chữ, số và dấu gạch dưới. Không được trùng với từ khóa có sẵn của C Hai biến không được trùng tên nhau Có phân biệt giữa chữ hoa và chữ thường Độ dài tùy thích, tuy nhiên không nên đặt tên quá dài Nên đặt tên có nghĩa, dễ hiểu
Keywords
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
14
Nhập môn lập trình - Cơ bản
Quiz – Tên biến
Những tên biến nào sau đây đúng hay sai?
12. _mot_Ngoi_Sao 13. T_T 14. ^_^ 15. edthbdl_mbcln2h 16. dienTich@ 17. Chu-Vi-Hinh-Tron 18. mayViTinh 19. Tong+Hieu 20. 24gio
1. 1ngoi_sao 2. bienDem1 3. phepNhân 4. donVi$ 5. ngoi_nha 6. int 7. kiem-tra 8. A&T 9. ____dien___tich 10. +hai_so 11. luy thua
15
Nhập môn lập trình - Cơ bản
Quiz - khai báo biến
Hãy khai báo các biến phù hợp cho các nội dung sau
1. Mã ID 2. Năm sinh 3. Họ và tên 4. Chiều cao 5. Cân nặng 6. Giới tính: Chỉ cần lưu giá trị ‘F’ (female) hoặc ‘M’ (male) 7. Tuổi 8. Đã lập gia đình? Chỉ cần lưu có (true) hoặc không (false) 9. Địa chỉ email 10. Nghề nghiệp
16
Nhập môn lập trình - Cơ bản
// Khai báo thư viện // Chương trình chính
Quiz - khai báo biến (tham khảo)
1. #include
2. int main()
3. {
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
// ID kiểu số nguyên // Hoặc ID kiểu chuỗi // Ví dụ: 1999 // Tên kiểu chuỗi // Kiểu số thực // Kiểu số thực // Kiểu ký tự: ‘F’, ‘M’ // Tuổi kiểu số nguyên // Có: True, Chưa: False // Email kiểu chuỗi // Ví dụ: “Ky su CNTT”
15.
int ID; char ID_s[20]; int namSinh; char hoVaTen[100]; float chieuCao; float canNang; char gioiTinh; int tuoiTac; bool giaDinh; char email[100]; char ngheNghiep[50]; //… return 0;
16. 17.} 17
Nhập môn lập trình - Cơ bản
Chuyển đổi kiểu
Đặt (Kiểu dữ liệu) phía trước biểu thức để chuyển đổi kiểu dữ
liệu cho kết quả của biểu thức f = (float) i1 / i2; i = (int)f;
Chia một số nguyên cho một số nguyên: Kết quả là số
nguyên i1=5; i2=10; f=i1/i2; //Cảnh báo, f=0.00 f=(float)i1/i2;
// OK, f=0.50
Chia một số thực cho một số nguyên hoặc chia một số
nguyên cho một số thực: Kết quả là số thực i=5; f=10; i1 = i/f; f1=i/f; f2=i/10.0;
// Cảnh báo, i1 = 0 // OK! f1=f2=0.50
18
Nhập môn lập trình - Cơ bản
Chuyển đổi kiểu (2)
Gán một số nguyên vào một biến kiểu thực
f = i; // Cảnh báo việc chuyển đổi f1 = 10; // OK! f1 = 10.000000 f2 = (float)i; // OK!
Gán một số thực vào một biến kiểu nguyên:
Mất phần thập phân (sau dấu chấm) i1 = 9.5; i2 = f;//Cảnh báo, i1 = 9 i1 = (int)9.5; i2 = (int)f; // OK!
19
Nhập môn lập trình - Cơ bản
Quiz – Chuyển đổi kiểu dữ liệu
Chuyển đổi kiểu dữ liệu phù hợp (nếu cần)
1.
2.
3.
4.
5.
6.
7.
8.
int a = 13 / 2; float b = a / 4; float c = 10 / a; float d = 1 / 5; float e = (3 / 5) * a; float f = (7 + 3) / a; float g = 5.4 * 3 / a; float h = (a + 3) / 2; float i = (5 / 9) * (a – 32); 9. 10. float j = a / 2 + 10 / (2 * b);
20
Nhập môn lập trình - Cơ bản
Quiz – Chuyển đổi kiểu dữ liệu (1)
1.
1.
2.
2.
3.
3.
4.
4.
5.
5.
6.
6.
7.
7.
8.
8.
Chuyển đổi kiểu dữ liệu phù hợp (nếu cần) int a = 13 / 2; float b = (float)a / 4; float c = 10.0 / a; float d = 1.0 / 5; float e = (3.0 / 5) * a; float f = (float)(7 + 3) / a; float g = 5.4 * 3 / a; float h = (a + 3) / 2.0; float i = (5 / 9.0) * (a – 32); 9. 10. float j = a / 2.0 + 10 / (2 * b);
int a = 13 / 2; float b = a / 4; float c = 10 / a; float d = 1 / 5; float e = (3 / 5) * a; float f = (7 + 3) / a; float g = 5.4 * 3 / a; float h = (a + 3) / 2; float i = (5 / 9) * (a – 32); 9. 10. float j = a / 2 + 10 / (2 * b);
21
Nhập môn lập trình - Cơ bản
Hằng số trong C
Giá trị không đổi suốt chương trình
Hằng số có kiểu
// char
dữ liệu Số nguyên Số thực Ký tự Chuỗi
Khai báo hằng số
// int #define a 45 // unsigned int #define b 125u // long int #define c 87l // unsigned long int #define d 23ul // Cơ số 8 #define e 057 // Cơ số 16 #define f 0xfee #define g 3.14159 // float #define h 314159E-5 // float #define i 'a' #define j "morning" // string const int k = 2016; const float l = 2.016; const char m = '4'; const char n[] = "afternoon"; #define o 048
/* ERROR! Hệ cơ số 8
#define const
không có số 8 */
#define p 59E #define q .E59
// ERROR! // ERROR!
22
Nhập môn lập trình - Cơ bản
Toán tử
Toán học arithmetic Luận lý logical So sánh comparison member access Gán assignment Tăng / Giảm increment decrement
!a a && b a || b ++a --a a++ a-- a[b] *a &a a->b a.b a == b a != b a < b a > b a <= b a >= b
a = b a += b a -= b a *= b a /= b a %= b a &= b a |= b a ^= b a <<= b a >>= b
23
Nhập môn lập trình - Cơ bản
+a -a a + b a - b a * b a / b a % b ~a a & b a | b a ^ b a << b a >> b
Toán tử gán - assignment
Cho a = 7, b = 2. Số trên bit: a = 00000111, b = 00000010
Mô tả
Kết quả
Gán giá trị của b cho biến a Phép cộng: a = a + b Phép trừ: a = a – b Phép nhân: a = a * b Phép chia lấy nguyên: a = a / b Phép chia lấy dư: a = a % b Phép AND trên bit: a = a & b Phép OR trên bit: a = a | b Phép XOR trên bit: a = a ^ b
a = 2 a = 7 + 2 = 9 a = 7 – 2 = 5 a = 7 * 2 = 14 a = 7 / 2 = 3 a = 7 % 2 = 1 a = 0111&0010 = 2 a = 0111|0010 = 7 a = 0111^0010 = 5
Toán tử a = b a += b a -= b a *= b a /= b a %= b a &= b a |= b a ^= b a <<= b Phép dịch trái trên bit: a = a << b a = a<<2 =11100=28 a >>= b Phép dịch phải trên bit: a = a >> b a = a>>2 =0001 = 1
24
Nhập môn lập trình - Cơ bản
Toán tử toán học - arithmetic
Cho a = 7, b = 2. Số trên bit: a = 00000111, b = 00000010
Trừ a
c = -7 c = 7 + 2 = 9 c = 7 – 2 = 5 c = 7 * 2 = 14 c = 7 / 2 = 3 c = 7 % 2 = 1 c = 11111000 = –8 c = 0111&0010 = 2 c = 0111|0010 = 7 c = 0111^0010 = 5 c = a<<2 =11100=28 c = a>>2 =0001 = 1
25
Nhập môn lập trình - Cơ bản
c = -a c = a + b Phép cộng c = a - b Phép trừ c = a * b Phép nhân c = a / b Phép chia lấy nguyên c = a % b Phép chia lấy dư Phép NOT trên bit c = ~a c = a & b Phép AND trên bit c = a | b Phép OR trên bit c = a ^ b Phép XOR trên bit c = a << b Phép SHIFT LEFT trên bit c = a >> b Phép SHIFT RIGHT trên bit
Toán tử trên bit – bitwise operations
Các phép toán trên bit
#include
int main()
{
A
0
0
1
1
B
0
1
0
1
// 0011 0100 // 0001 1101
A & B
0
0
0
1
// 0001 0100
A | B
0
1
1
1
// 0011 1101
A ^ B
0
1
1
0
~A
1
1
0
0
// 0010 1001
~B
1
0
1
0
<<
Cho a = 00110100, a<<2= 11010000
>>
Cho a = 00110100, a>>2= 00001101
// 0000 1101
int a = 52; int b = 29; int c; c = a & b; printf("%d & %d = %d\n", a, b, c); c = a | b; printf("%d | %d = %d\n", a, b, c); c = a ^ b; printf("%d ^ %d = %d\n", a, b, c); c = ~a; // 1100 1011 printf("~%d = %d\n", a, c); c = a << 2; // 1101 0000 printf("%d << 2 = %d\n", a, c); c = a >> 2; printf("%d >> 2 = %d\n", a, c); return 0;
}
26
Nhập môn lập trình - Cơ bản
Toán tử tăng / giảm - increment / decrement
Cho a = 7, b = 2
Phép toán Kết quả
b = ++a
b = --a
b = a++
b = a--
Mô tả Cộng a lên một đơn vị trước khi tính Tương đương: a = a + 1; b = a; Trừ a đi một đơn vị trước khi tính Tương đương: a = a – 1; b = a; Cộng a lên một đơn vị sau khi tính Tương đương: b = a; a = a + 1; Trừ a đi một đơn vị sau khi tính Tương đương: b = a; a = a - 1;
Tương đương: a = a + 1; c = a – b; b = b – 1;
a = 8 b = 8 a = 6 b = 6 a = 8 b = 7 a = 6 b = 7 a = 8 b = 6 c = 1
27
Nhập môn lập trình - Cơ bản
Ví dụ: c = ++a - b--
Độ ưu tiên
Category
Toán tử () [] -> . ++ --
Postfix
+ - ! ~ ++ - - (type)* & sizeof
Unary
* / %
Multiplicative
+ -
Additive
<< >>
Shift
< <= > >=
Relational
== !=
Equality
&
Bitwise AND
^
Bitwise XOR
|
Bitwise OR
&&
Logical AND
||
Logical OR
?:
Conditional
= += -= *= /= %=>>= <<= &= ^= |=
Assignment
,
Comma
28
Nhập môn lập trình - Cơ bản
Quiz – Phép toán
Hãy cho biết kết quả của các phép toán sau int main() {
int a = 7, b = 2, c, d, e, f, g, h, i, j, k; b += 2; c = ++a; d = a--; e = a/2; f = a%2; g = a++ - 7%3; h = 11%3 + ++a; i = (a / 3) % 4; j = --a % 2; k = a/4*3 ; return 0;
}
29
Nhập môn lập trình - Cơ bản
Quiz – Phép toán (1)
Hãy cho biết kết quả của các phép toán sau int main() {
// b = b + 2 = 4 // ++a = 8, c = a = 8 // d = a = 8, a-- = 7 // e = 7 / 2 = 3 // f = 7 % 2 = 1 // 7%3 = 1, g = a – 1 = 6, a++ = 8 // ++a = 9, 11%3 = 2, h = 2 + 9 = 11
// --a = 8, j = 8 % 2 = 0 // a/4 = 2, k = 2 * 3 = 6
int a = 7, b = 2, c, d, e, f, g, h, i, j, k; b += 2; c = ++a; d = a--; e = a/2; f = a%2; g = a++ - 7%3; h = 11%3 + ++a; i = (a / 3) % 4; // a / 3 = 3, i = 3 % 4 = 3 j = --a % 2; k = a/4*3 ; return 0;
}
30
Nhập môn lập trình - Cơ bản
Toán tử luận lý – logical
Những phép toán luận lý
Cho A = True, B = False
Toán tử
Mô tả
Ví dụ
&&
A && B: False
||
A || B: True
Toán tử AND, nếu và chỉ nếu cả hai toán hạng điều đúng thì kết quả phép toán là đúng Toán tử OR, nếu và chỉ nếu cả hai toán hạng đều sai thì kết quả phép toán là sai
!
Toán tử NOT, thực hiện phép phủ định
!A: False !B: True !A || B: False A && !B: True
31
Nhập môn lập trình - Cơ bản
Toán tử so sánh – comparison
Những phép so sánh
#include
Cho A = 10, B = 20
int main() {
Toán tử Mô tả Ví dụ
== Bằng nhau (A == B) sai
!= Khác nhau (A != B) đúng
> Lớn hơn (A > B) sai
< Nhở hơn (A < B) đúng
>= (A >= B) sai
int A=10, B=20; if (A==B) printf("A = B"); if (A!=B) printf("A ≠ B"); if (A>B) printf("A > B"); if (A=B) printf("A ≥ B"); if (A<=B) printf("A ≤ B"); return 0;
<=
}
32
Nhập môn lập trình - Cơ bản
(A <= B) đúng Lớn hơn hoặc bằng Nhở hơn hoặc bằng
Các thư viện
Các thư viện định nghĩa sẵn các hàm hay kiểu dữ liệu
Cú pháp khai báo: #include
tin…
getchar, putchar, printf, scanf, gets, fopen, fclose, remove, …
nhớ… atof, atoi, atol, strtol, free, malloc, abs, rand, srand…
sqrt, pow, ceil, floor, trunc, abs, sin, cos…
33
Nhập môn lập trình - Cơ bản
Các thư viện (2)
strcpy, strcat, strlen, strstr, strcmp, strchr, memset…
toupper, tolower…
gets, puts, cin, cout…
time, clock, localtime, difftime, time_t, struct tm…
34
Nhập môn lập trình - Cơ bản
Hàm thường dùng ở thư viện stdio.h
Khai báo: #include
Hàm printf: Xuất ra màn hình
Nguyên mẫu hàm: int printf(const char * format, ... ); printf(“Hello world!”); printf(“a = %d.\n”, so_nguyen);
Hàm scanf: Nhập dữ liệu từ bàn phím
Nguyên mẫu hàm: int scanf( const char * format, ... ); scanf("%d", &so_nguyen); scanf("%f", &so_thuc); scanf("%c", &ky_tu);
Hàm gets: Nhập chuỗi từ bàn phím
char name[50];
gets(name);
35
Nhập môn lập trình - Cơ bản
Hàm thường dùng ở thư viện stdlib.h
Khai báo: #include
// a có giá trị từ 0 đến 32767 // b có giá trị từ 0 đến 89
Nguyên mẫu hàm: int rand (void); a = rand(); b = rand()%90; c = rand()%90 + 10;
// c có giá trị từ 10 đến 99
Hàm srand: Khởi tạo số ngẫu nhiên
Nguyên mẫu hàm: void srand (unsigned int seed); Ví dụ:
srand(time(NULL)); d = rand() % 101 – 50;
36
Nhập môn lập trình - Cơ bản
Hàm thường dùng ở thư viện math.h
Khai báo: #include
Hàm sqrt: Tính căn bậc hai
Nguyên mẫu hàm: double sqrt (double x); x = sqrt(9); y = sqrt(x + 1);
// Căn bậc hai của 9 // Căn bậc hai của x + 1
Hàm pow: Tính lũy thừa
Nguyên mẫu hàm: double pow (double base, double exponent); x = pow(3, 2); y = pow(x, 4);
// ba mũ hai // x mũ bốn
Hàm floor, ceil: Làm tròn // z = 4.0 // w = 5.0
z = floor(4.3); w = ceil(4.3); 37
Nhập môn lập trình - Cơ bản
Hàm thường dùng ở thư viện string.h
Khai báo: #include
Hàm strlen: Tính chiều dài của chuỗi
Nguyên mẫu hàm: size_t strlen(const char * str) a = strlen(“hello”);
// a = 5 Hàm strcpy: Sao chép chuỗi
// Khai báo chuỗi
Nguyên mẫu hàm: char * strcpy(char * dest, const char * src) char hello[50]; strcpy(hello, “Hello ”); Hàm strcat: Nối chuỗi
Nguyên mẫu hàm: char * strcat( char * dest, const char * src) char name[50] = “Tuan”; strcat(hello, name); // hello = “Hello Tuan!”
Hàm strcmp: So sánh chuỗi
Nguyên mẫu hàm: int strcmp( const char * str1, const char * str2 ) a = strcmp(name, “Tuan”);
// hello = “Hello ”
38
Nhập môn lập trình - Cơ bản
// a = 0
Hàm thường dùng ở thư viện ctype.h
Khai báo: #include
Hàm tolower: Chuyển ký tự sang chữ thường
Nguyên mẫu int tolower ( int c ); char c = ‘N’; tolower(c);
// c = ‘n’
Hàm toupper: Chuyển ký tự sang chữ in
// c = ‘N’
Nguyên mẫu int toupper ( int c ); char c = ‘n’; toupper(c); Các hàm kiểm tra ký tự
isalnum(c): Trả về true (khác 0) nếu c là số hoặc chữ isalpha(c): Trả về true nếu c là chữ islower(c): Trả về true nếu c là chữ thường isupper(c): Trả về true nếu c là chữ in
39
Nhập môn lập trình - Cơ bản
Quiz – Tính toán
Cho một biến số nguyên x, viết biểu thức tính:
a =
( ) ( )
b =