Bài giảng Nhập môn lập trình: Bài 2 do TS. Ngô Hữu Dũng biên soạn cung cấp cho người học các kiến thức: 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,...
Trang 2 Nhập: scanf, cin, gets
Xuất: printf, cout, puts
Trang 3Ngô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
Trang 4Trình biên dịch/Trình thông dịch
Trình biên dịch
Executable Program
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
Interpreter
Source Code
Trình thông dịch: Phân tích và
thực thi chương trình cùng lúc.
Trang 5Biên dịch và chạy chương trình
Trang 6Sửa lỗi - debug
Semantic Errors
Trang 7 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
Trang 8Đị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"
Một ký tự được đặt giữa hai dấu một nháy 's'
Trang 10 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: <Data type> <Variable name>;
int year;
float score;
char kyTu;
char name[50];
Trang 12Kiể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
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++
Độ chính xác?
Trang 13significand x base exponent
Kiểu dữ liệu Dấu Mũ Trị số Tổng số bit Độ chính xác
Double 1 bit 11 bits 52 bits 64 bits (8 bytes) 53 bits (Dấu + trị số)
Trang 14Tê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
Trang 15Quiz – Tên biến
Những tên biến nào sau đây đúng hay sai?
Trang 16Quiz - khai báo biến
Hãy khai báo các biến phù hợp cho các nội dung sau
Trang 17Quiz - khai báo biến (tham khảo)
1 #include <stdio.h> // Khai báo thư viện
3 {
5 char ID_s[20]; // Hoặc ID kiểu chuỗi
7 char hoVaTen[100]; // Tên kiểu chuỗi
10 char gioiTinh; // Kiểu ký tự: ‘F’, ‘M’
11 int tuoiTac; // Tuổi kiểu số nguyên
12 bool giaDinh; // Có: True, Chưa: False
13 char email[100]; // Email kiểu chuỗi
14 char ngheNghiep[50]; // Ví dụ: “Ky su CNTT”
15 //…
16 return 0;
Trang 18Chuyể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
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
Trang 19Chuyể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!
Trang 20Quiz – Chuyển đổi kiểu dữ liệu
Chuyển đổi kiểu dữ liệu phù hợp (nếu cần)
Trang 21Quiz – Chuyển đổi kiểu dữ liệu (1)
Chuyển đổi kiểu dữ liệu phù hợp (nếu cần)
Trang 22#define b 125u // unsigned int
#define c 87l // long int
#define d 23ul // unsigned long int
#define e 057 // Cơ số 8
#define f 0xfee // Cơ số 16
#define g 3.14159 // float
#define h 314159E-5 // float
#define i 'a' // char
#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
không có số 8 */
#define p 59E // ERROR!
#define q E59 // ERROR!
Trang 23Toán tử
Gán
assignment
Tăng / Giảm increment decrement
Toán học arithmetic
Luận lý logical
So sánh comparison
member access
Trang 24Toán tử gán - assignment
Cho a = 7, b = 2 Số trên bit: a = 00000111, b = 00000010
a = b Gán giá trị của b cho biến a a = 2
a / = b Phép chia lấy nguyên: a = a / b a = 7 / 2 = 3
a % = b Phép chia lấy dư: a = a % b a = 7 % 2 = 1
a & = b Phép AND trên bit: a = a & b a = 0111&0010 = 2
a | = b Phép OR trên bit: a = a | b a = 0111|0010 = 7
a ^ = b Phép XOR trên bit: a = a ^ b a = 0111^0010 = 5
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
Trang 25Toán tử toán học - arithmetic
Cho a = 7, b = 2 Số trên bit: a = 00000111, b = 00000010
c = a * b Phép nhân c = 7 * 2 = 14
c = a / b Phép chia lấy nguyên c = 7 / 2 = 3
c = a % b Phép chia lấy dư c = 7 % 2 = 1
c = ~a Phép NOT trên bit c = 11111000 = –8
c = a & b Phép AND trên bit c = 0111&0010 = 2
c = a | b Phép OR trên bit c = 0111|0010 = 7
c = a ^ b Phép XOR trên bit c = 0111^0010 = 5
c = a << b Phép SHIFT LEFT trên bit c = a<<2 =11100=28
c = a >> b Phép SHIFT RIGHT trên bit c = a>>2 =0001 = 1
Trang 26Toán tử trên bit – bitwise operations
Các phép toán trên bit
Trang 27Toán tử tăng / giảm - increment / decrement
Cho a = 7, b = 2
b = ++a Cộng a lên một đơn vị trước khi tính
Trang 31Toán tử luận lý – logical
A && B: False
||
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
Trang 32int 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" );
if (A<=B) printf( "A ≤ B" );
return 0;
}
Trang 33Cá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 <tên thư viện>
<stdio.h> các hàm nhập xuất chuẩn, các thao tác với tập
tin…
getchar, putchar, printf, scanf, gets, fopen, fclose, remove, …
<stdlib.h> các hàm chuyển đổi kiểu dữ liệu, cấp phát bộ
Trang 34 gets, puts, cin, cout…
<time.h> các hàm xử lý về thời gian
time, clock, localtime, difftime, time_t, struct tm…
Trang 35Hàm thường dùng ở thư viện stdio.h
Khai báo: #include <stdio.h>
Trang 36Hàm thường dùng ở thư viện stdlib.h
Khai báo: #include <stdlib.h>
Hàm rand: Tạo số nguyên ngẫu nhiên
Nguyên mẫu hàm: int rand (void);
a = rand(); // a có giá trị từ 0 đến 32767
b = rand()%90; // b có giá trị từ 0 đến 89
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;
Trang 37Hàm thường dùng ở thư viện math.h
Khai báo: #include <math.h>
Hàm sqrt: Tính căn bậc hai
Nguyên mẫu hàm: double sqrt (double x);
x = sqrt(9); // Căn bậc hai của 9
y = sqrt(x + 1); // 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); // ba mũ hai
y = pow(x, 4); // x mũ bốn
Hàm floor, ceil: Làm tròn
z = floor(4.3); // z = 4.0
Trang 38Hàm thường dùng ở thư viện string.h
Khai báo: #include <string.h>
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
Nguyên mẫu hàm: char * strcpy(char * dest, const char * src)
char hello[50]; // Khai báo chuỗi
strcpy(hello, “Hello ”); // 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”); // a = 0
Trang 39Hàm thường dùng ở thư viện ctype.h
Khai báo: #include <ctype.h>
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
Nguyên mẫu int toupper ( int c );
char c = ‘n’; toupper(c); // c = ‘N’
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
Trang 41Quiz – Tính toán (tham khảo)
Cho một biến số nguyên x, viết biểu thức tính:
Trang 42gets (s);
.
return 0;
}
Trang 44Định dạng biểu diễn dữ liệu
Trang 45Định dạng biểu diễn dữ liệu
%[flags][width][.precision][length]specifier
width Số ký tự tối thiểu được in ra
.precision Số ký tự sau dấu chấm động
Trang 46Minh hoạ biểu diễn dữ liệu
1 #include <stdio.h>
2 int main()
4 printf( "Char: %c %c \n" , 'a' , 65);//Char: a A
5 printf( "Integer: %d \n" , 1999); //Integer: 1999
6 printf( "Space: %7d \n" , 1999); //Space: 1999
7 printf( "Zero: %07d \n" , 1999); //Zero: 0001999
8 printf( "Float: %.2f\n" , 3.1416); //Float: 3.14
9 printf( "Float: %6.2f\n" , 3.1416); //Float: 3.14
10 printf( "String: %s\n" , "Chuoi" ); //String: Chuoi
11 printf( "Hexa: %x\n" , 100); //Hexa: 64
12 printf( "Octo: %o\n" , 100); //Octo: 144
13 printf( "Hexa: %#x\n" , 100); //Hexa: 0x64
14 printf( "Octo: %#o\n" , 100); //Octo: 0144
15 return 0;
Trang 47 Mã escape dùng để đại diện
cho những ký tự đặc biệt hoặc
Trang 48 Nhập: scanf, cin, gets
Xuất: printf, cout, puts
Trang 49Bài tập 2.1: Biến và kiểu biến
Viết chương trình nhập vào từ bàn phím và xuất ra màn hình các thông tin sau
Trang 50Bài tập 2.2: Nhập, tính toán, xuất
Viết chương trình nhập vào một số nguyên x, tính toán và xuất ra màn hình giá trị các biểu thức sau:
Trang 51Bài tập 2.3: Chữ số
Viết chương trình tạo ra một số nguyên ngẫu nhiên gồm 3 chữ số, hãy xác định các chữ số hàng đơn vị, hàng chục và hàng trăm của số nguyên ấy
Trang 52Bài tập 2.4: Thời gian
Viết chương trình nhập vào tổng số giây, quy đổi và xuất
ra màn hình ngày, giờ, phút, giây tương ứng
Trang 53Bài tập 2.5 – Số ngẫu nhiên
Viết chương trình xuất ra màn hình các số ngẫu nhiên sau
a có giá trị trong khoảng từ 0 đến 89
b có giá trị trong khoảng từ 10 đến 99
c có giá trị trong khoảng từ -30 đến 30
d có giá trị giữa a và b bất kỳ nhập từ bàn phím
Gợi ý:
rand()%10 tạo ra số có giá trị từ 0 đến 9