TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH
Phương pháp 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
Phương pháp 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
Phương pháp 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
Phương pháp 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. Chương trình có thể thực thi: Có thể chạy độc lập với trình biên dịch => Thực thi nhanh chóng Trình thông dịch: Phân tích và thực thi chương trình cùng lúc. Việc thực thi chậm nhưng dễ sửa lỗi chương trình.
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
Phương pháp 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
Phương pháp lập trình - Cơ bản
Cấu trúc chương trình C
1. /* Chương trình Hello world! */
2. #include // Khai báo thư viện
// Chương trình chính // Bắt đầu chương trình
// Câu lệnh
printf("Hello world!\n"); return 0;
3. int main() 4. { 5. 6. // Kết thúc chương trình 7. } Ký hiệu #include dùng để khai báo thư viện phục vụ chương
trình
Hàm main là nơi bắt đầu thực hiện chương trình Lệnh printf nằm trong thư viện stdio.h, dùng để xuất dữ liệu
ra màn hình
Kí hiệu \n dùng để xuống dòng Lệnh return dùng để kết thúc và trả về giá trị kiểu int cho hàm
main
7
Phương pháp 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
Phương pháp 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 world!
3. */
4. #include
//Khai báo thư viện
9
Phương pháp 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: Kiểu-dữ-liệu Tên-biến; int year; float score; char kytu;
10
Phương pháp 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
Phương pháp 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';
bool: Kiểu luận lý, có giá trị true hoặc false
Độ chính xác?
1 byte, ví dụ: bool kt = true;
12
Phương pháp 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
Phương pháp 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
Ví dụ: Những tên biến nào sau đây đúng hay sai?
1ngoi_sao, bienDem1, phepNhân, donVi$, ngoi_nha,
____dien___tich, +hai_so, luy thua, T_T, ^_^,
int, kiem-tra, A&T
14
Phương pháp lập trình - Cơ bản
edthbdl_mbcln2h
Từ khóa
Là những từ đã được định nghĩa bởi trình biên dịch Không được dùng để đặt tên biến, tên hàm…
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
15
Phương pháp lập trình - Cơ bản
Ví dụ về biến và kiểu biến
1. #include
// Khai báo thư viện
// Chương trình chính
2. int main() 3. { 4.
5.
6.
7.
8.
9.
// Kiểu ký tự // Kiểu số nguyên // Kiểu số thực // Phép gán // Phép gán // Biểu thức
10.
11.
12.
char a; int i1 = 5, i2; float f; a = 'f'; i2 = 10; f = (float)i1 / i2; printf("%c = %f, ", a, f); printf("kich thuoc %d bytes.\n", sizeof(f)); getchar(); return 0;
f = (float)i1 / i2;
13. 14.}
16
Phương pháp 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; Gán một số nguyên vào một biến kiểu thực
// Cảnh báo việc chuyển đổi // OK! f1 = 10.000000
f = i; f1 = 10; 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;
i1 = (int)9.5; i2 = (int)f;
// Cảnh báo, i1 = 9 // OK!
17
Phương pháp lập trình - Cơ bản
Chuyển đổi kiểu (2)
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.000000
f=(float)i1/i2;
// OK, f=0.500000
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.500000
18
Phương pháp 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!
19
Phương pháp lập trình - Cơ bản
Vận dụng
Đề bài 1: Hãy khai báo Một biến kiểu số nguyên Hai biến kiểu số thực Một biến kiểu ký tự Một biến kiểu luận lý Một hằng số PI = 3.15 Một hằng số MAX = 100
Đề bài 2: Hãy chuyển đổi kiểu dữ liệu cho biểu thức sau
float x = 1/2; float y = (1/5)*x; int z = (x+5)*2;
20
Phương pháp lập trình - Cơ bản
Toán tử toán học
Những phép toán học
Cho A = 5, B = 2
Mô tả Ví dụ
1. #include
2.
3. int main()
4. {
5.
Toán tử +
6.
Phép cộng A + B = 7
7.
Phép trừ A B = 3
8.
* Phép nhân A * B = 10
9.
/ Phép chia A / B = 2
10.
% Phép chia lấy phần dư A % B = 1
11.
++
12.
Cộng lên một số nguyên A++ = 6
13.
-- Trừ đi một số nguyên B-- = 1
int A=5, B=2, C; C = A + B; C = A - B; C = A * B; C = B / A; C = B % A; A++; B--; getchar(); return 0;
14. 15. }
21
Phương pháp lập trình - Cơ bản
Toán tử quan hệ
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;
<=
}
22
Phương pháp 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
Toán tử luận lý
Những phép toán luận lý
Cho A = 1, B = 0
Toán tử
Mô tả
Ví dụ
&&
Gọi toán tử AND, nếu cả hai toán hạng điều đúng, kết quả phép toán là đúng
(A && B) Sai
||
(A || B) Đúng
Gọi toán tử OR, nếu cả hai toán hạng đều sai, kết quả phép toán là sai
!
Gọi toán tử NOT, thực hiện phép phủ định
!(A && B) Đúng
23
Phương pháp lập trình - Cơ bản
Toán tử trên bit
Các phép toán trên bit
#include
int main()
{
0
0
1
1
A
0
1
0
1
B
// 0011 0100 // 0001 1101
0
0
0
1
A & B
// 0001 0100
0
1
1
1
A | B
// 0011 1101
0
1
1
0
A ^ B
1
1
0
0
~A
// 0010 1001
1
0
1
0
~B
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;
}
24
Phương pháp lập trình - Cơ bản
Toán tử gán
Các phép toán kết hợp với phép gán
Mô tả
Ví dụ
Toán tử = += -= *= /= %= <<= >>= &= ^= |=
Phép gán Phép cộng và gán Phép trừ và gán Phép nhân và gán Phép chia và gán Phép chia lấy dư và gán Phép dịch trái và gán Phép dịch phải và gán Phép AND trên bit và gán Phép XOR trên bit và gán Phép OR trên bit và gán
C = A + B C += A là C = C + A C -= A là C = C – A C *= A là C = C * A C /= A là C = C / A C %= A là C = C % A C <<= 2 là C = C << 2 C >>= 2 là C = C >> 2 C &= 2 là C = C & 2 C ^= 2 là C = C ^ 2 C |= 2 là C = C | 2
25
Phương pháp lập trình - Cơ bản
Category
Độ ưu tiên
Toán tử () [] -> . ++ - -
Postfix
+ - ! ~ ++ - - (type)* & sizeof
Các toán tử
+ -
Unary Multiplicative * / % Additive
<< >>
Shift
được tính toán theo thứ tự ưu tiên như bảng
< <= > >=
Relational
== !=
Equality Bitwise AND & Bitwise XOR ^ | Bitwise OR Logical AND && || Logical OR
?:
Conditional
= += -= *= /= %=>>= <<= &= ^= |=
Assignment
,
Comma
26
Phương pháp lập trình - Cơ bản
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, fopen, fclose, remove, rename…
nhớ… atof, atoi, atol, strtol, free, malloc, abs, rand, srand…
sqrt, pow, ceil, floor, trunc, abs, sin, cos…
27
Phương pháp 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…
28
Phương pháp 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);
29
Phương pháp 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;
30
Phương pháp 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); 31
Phương pháp 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 ”
32
Phương pháp 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
33
Phương pháp lập trình - Cơ bản
Vận dụng
Đề bài 3: Cho trước một biến số nguyên x và một biến số
thực y, viết biểu thức tính z:
z =
( ) ( )
z =
