Lập trình căn bản - Chương 02: Các thành phần cơ bản của ngôn ngữ C
Bạn đang xem 20 trang mẫu của tài liệu "Lập trình căn bản - Chương 02: Các thành phần cơ bản của ngôn ngữ C", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- lap_trinh_can_ban_chuong_02_cac_thanh_phan_co_ban_cua_ngon_n.ppt
Nội dung text: Lập trình căn bản - Chương 02: Các thành phần cơ bản của ngôn ngữ C
- LẬP TRÌNH CĂN BẢN Phần 2 - Chương 2 CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ C 1
- Nội dung chương này • Bộ chữ viết trong C • Các từ khóa • Cặp dấu ghi chú thích • Các kiểu dữ liệu sơ cấp chuẩn • Tên và hằng • Biến và biểu thức • Cấu trúc của một chương trình C 2
- Bộ chữ viết trong C • Bộ chữ viết trong ngôn ngữ C bao gồm các ký tự sau: – 26 chữ cái latinh lớn A,B,C Z – 26 chữ cái latinh nhỏ a,b,c z. – 10 chữ số thập phân 0,1,2 9. – Các ký hiệu toán học: +, -, *, /, =, , (, ) – Các ký hiệu đặc biệt: :. , ; " ' _ @ # $ ! ^ [ ] { } – Dấu cách hay khoảng trống. • Phân biệt chữ in hoa và in thường 3
- Các từ khóa trong C • Từ khóa là các từ dành riêng của C. • Ta không được dùng từ khóa để đặt cho các tên của riêng mình. 4
- Cặp dấu chú thích (comment) #include #include int main (){ char ten[50]; /* khai bao bien ten kieu char 50 ky tu */ printf(“Xin cho biet ten cua ban !”); scanf(“%s”,ten); /*Doc vao 1 chuoi la ten ban*/ printf(“Xin chao ban %s\n ”,ten); //Dung chuong trinh, cho go phim getch(); return 0; } • Khi biên dịch các phần chú thích bị bỏ qua • Dùng /* và */: chú thích dài nhiều dòng • Dùng //: chú thích chỉ 1 dòng 5
- Các kiểu dữ liệu sơ cấp chuẩn trong C • Kiểu số nguyên (integer) • Kiểu số thực (real) 6
- Kiểu số nguyên • Được 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 1 byte (8 bits) – Kiểu số nguyên 2 bytes (16 bits) – Kiểu số nguyên 4 byte (32 bits) 7
- Kiểu số thực • Được dùng để lưu các số thực hay các số có dấu chấm thập phân • Kiểu void – Mang ý nghĩa là kiểu rỗng không chứa giá trị gì cả – Ví dụ: void main(){ .} 8
- Dùng sizeof() • Kích thước 1 kiểu có thể được xác định lúc chạy chương trình (runtime), dùng sizeof: – Ví dụ: sizeof(double) =>8(byte) sizeof(long double)=>10(byte) 9
- Kiểu enum (1) • enum gần giống với tiền xử lý #define. • Nó cho phép ta định nghĩa 1 danh sách các bí danh (aliase) để trình bày các số nguyên. • Ví dụ: #define MON 1 #define TUE 2 #define WED 3 có thể dùng enum: enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; • Ưu điểm của enum so với #define là nó có phạm vi (scope), nghĩa là 1 biến chỉ có tác dụng trong khối (block) nó được khai báo. 10
- Kiểu enum (2) 11
- Kiểu enum (3) 12
- Tên và hằng trong C • Tên (identifier) – Được dùng để đặt cho chương trình, hằng, kiểu, biến, chương trình con, – Có 2 loại: • Tên chuẩn: là tên do C đặt sẵn như tên kiểu: int, char, float, ; tên hàm: sin, cos • Tên do người lập trình tự đặt. 13
- Chú ý khi đặt tên 14
- Tên do người lập trình tự đặt • Ví dụ: – Tên đặt hợp lệ: Chieu_dai, Chieu_Rong, Chu_Vi – Tên không hợp lệ: Do Dai, 12A2 • Phải tuân thủ quy tắc: – Sử dụng bộ chữ cái, chữ số và dấu gạch dưới (_) – Bắt đầu bằng một chữ cái hoặc dấu gạch dưới. – Không có khoảng trống ở giữa tên. – Không được trùng với từ khóa. – Độ dài tối đa của tên là 32 ký tự, tuy nhiên cần đặt sao cho rõ ràng, dễ nhận biết và dễ nhớ. – Không cấm việc đặt tên trùng với tên chuẩn nhưng khi đó ý nghĩa của tên chuẩn không còn giá trị nữa. 15
- Hằng (Constant) • Là đại lượng không đổi trong suốt quá trình thực thi chương trình => không thể gán lạI giá trị cho hằng • Hằng có thể là: – 1 con số – 1 ký tự – 1 chuỗi ký tự 16
- Hằng số thực • Giá trị kiểu: float, double, long double • 2 cách thể hiện – Cách 1: viết thông thường • Ví dụ: 123.34 -223.333 3.00 -56.0 – Cách 2: viết theo số mũ hay số khoa học • Một số thực được tách làm 2 phần (phân cách bởi e/E) – Phần giá trị: như cách 1 – Phần mũ: là một số nguyên • Ví dụ: 1234.56e-3 = 1.23456 (là số 1234.56*10-3) -123.45E4 = -1234500 ( là -123.45*104) 17
- Hằng số nguyên (1) • Hằng số nguyên 2 byte (int) hệ thập phân – Sử dụng 10 ký số 0 9 – Ví dụ: 123 (một trăm hai mươi ba) -242 (trừ hai trăm bốn mươi hai) • Hằng số nguyên 2 byte (int) hệ bát phân – Sử dụng 8 ký số 0 7 – Cách biểu diễn: 0 – Số bát phân : 0dndn-1dn-2 d1d0 ( di có giá trị từ 0 7) n => giá trị: i d i *8 i=0 – Ví dụ: 1 0 = 020=2*8 + 0*8 (16)10 18
- Hằng số nguyên (2) • Hằng số nguyên 2 byte (int) hệ thập lục phân – Là kiểu số nguyên dùng: • 10 ký số 0 9 và • 6 ký tự A, B, C, D, E ,F – Cách biểu diễn: 0x – Số thập lục phân : 0xdndn-1dn-2 d1d0 n i => Giá trị thập phân= d i *16 • Ví dụ: i=0 2 1 0 0x345=3*16 + 4*16 + 5*16 = (837)10 2 1 0 0x2A9= 2*16 + 10*16 + 9*16 = (681)10 19
- Hằng số nguyên (3) • Ví dụ: Kết quả của chương trình sau là gi? 20
- Hằng số nguyên (4) • Hằng số nguyên 4 byte (long) – Được biểu diễn như số int trong hệ thập phân nhưng kèm theo ký tự l hoặc L. – Ví dụ: 45345L hay 45345l hay 45345 21
- Hằng ký tự (char) • Ví dụ: ‘a’, ‘A’, ‘0’, ‘9’ • Là 1 ký tự được viết trong cặp dấu nháy đơn (‘). • Mỗi một ký tự tương ứng với 1 giá trị trong bảng mã ASCII. • Hằng ký tự cũng được xem như trị số nguyên. • Chúng ta có thể thực hiện các phép toán số học trên 2 ký tự (dùng giá trị ASCII của chúng) • ASCII = American Standard Code for Information Interchange 22
- Hằng chuỗi ký tự • Ví dụ: “Ngon ngu lap trinh C” • Là 1 chuỗi hay 1 xâu ký tự được đặt trong cặp dấu nháy kép (“). • Chú ý: – “” : chuỗi rỗng - không có nội dung – Khi lưu trữ trong bộ nhớ, một chuỗi được kết thúc bằng ký tự NULL (‘\0’: mã Ascii là 0). – Để biểu diễn ký tự đặc biệt bên trong chuỗi ta phải thêm dấu \ phía trước. • Ví dụ: Viết “I\’m a student” cho “I’m a student” Viết “Day la ky tu \“dac biet\”” cho “Day la ky tu “dac biet”” 23
- Biến và Biểu thức (variable and expression) • Biến dùng để chứa dữ liệu trong quá trình thực hiện chương trình. • Giá trị của biến có thể bị thay đổi. • Cú pháp khai báo biến: Danh sách các tên biến cách nhau bởi dấu phẩy; 24
- Khởi tạo giá trị cho biến lúc khai báo • Ví dụ: • Cách viết giá trị cho biết luôn kiểu của nó: • Chú ý: 8864L có kiểu long, còn 8864 có kiểu int 25
- Vị trí khai báo biến (1) • Biến ngoài – Được đặt bên ngoài tất cả các hàm – Ảnh hưởng đến toàn bộ chương trình (biến toàn cục) 26
- Vị trí khai báo biến (2) • Biến trong – Được đặt bên trong hàm, chương trình chính hay một khối lệnh – Ảnh hưởng đến hàm, chương trình hay khối lệnh chứa nó (biến cục bộ). 27
- Biểu thức (1) • Ví dụ: (-b + sqrt(Delta))/(2*a) • Biểu thức là một sự kết hợp giữa – Các toán tử (operator) và – Các toán hạng (operand) • Các loại toán tử trong C – Toán tử số học – Toán tử quan hệ và logic – Toán tử Bitwise – Toán tử ? – Toán tử con trỏ & và * – Toán tử dấu phẩy 28
- Các toán tử số học (1) 29
- Các toán tử số học (2) • Tăng và giảm (++ & ) ++x hay x++ giống x = x + 1 x hay x giống x = x – 1 • Tuy nhiên: • Còn: x = 10; x = 10; y = ++x; //y = 11, x=11 y = x++; //y = 10, x=11 30
- Các toán tử số học (3) • Đâu là sự khác nhau? x++ trả về giá trị hiện hành của x và sau đó tăng x ++x tăng x trước và sau đó trả về giá trị mới của x 31
- Biểu thức Boolean (boolean expression) • Chú ý! Không có kiểu Boolean rõ ràng trong C (điều này đã được giới thiệu ở C99). Thay vào đó C dùng các giá trị nguyên để tượng trưng cho giá trị Boolean, với qui ước: false Giá trị 0 true Bất kỳ giá trị nào ngoại trừ 0 • Chú ý! C dùng “=” cho phép gán, và dùng “==“ cho phép so sánh. Nó trả về 1 nếu bằng và 0 nếu ngược lại 32
- Các toán tử quan hệ và các toán tử Logic (1) • Các phép so sánh sau tạo ra các biểu thức logic có giá trị kiểu Boolean 33
- Các toán tử quan hệ và các toán tử Logic (2) • Ví dụ: • Các biểu thức logic trả về 0 nếu false(sai) 1 nếu true(đúng) 34
- Các toán tử quan hệ và các toán tử Logic (3) • Bảng chân trị cho các toán tử Logic • Thứ tự ưu tiên • Ví dụ: 10>5&&!(10 đúng (1) 35
- Các toán tử Bitwise • Toán tử Bitwise giúp kiểm tra, gán hay thay đổi các bit thật sự trong 1 byte của word. • Chỉ dùng cho kiểu char và int. 36
- Toán tử ? • Toán tử ? thực hiện như lệnh if-else. • Cú pháp: – E1 ? E2 : E3 • Ví dụ: X = (10 > 9) ? 100 : 200; =>X=100 X = (10 >15 )? 100 : 200; =>X=200 37
- Toán tử con trỏ & và * • Ví dụ: int *p; //con tro so nguyen int count=5, x; p = &count; =>Đặt vào biến m địa chỉ bộ nhớ của biến count • Toán tử * trả về nội dung của ô nhớ mà một con trỏ đang chỉ vào – Ví dụ: x = *p; // x=5 38
- Toán tử dấu phẩy • Ví dụ: – x = (y=3,y+1); – Trước hết gán 3 cho y rồi gán 4 cho x. • Được sử dụng để kết hợp các biểu thức lại với nhau. • Bên trái của dấu (,) luôn được xem là kiểu void. • Biểu thức bên phải trở thành giá trị của tổng các biểu thức được phân cách bởi dấu phẩy. 39
- Tổng kết về độ ưu tiên • Tổng kết về độ ưu tiên 40
- Phép gán được viết gọn lại x= x y; có thể được viết gọn lại (short form): 41
- Take a break To be continued 42
- Các tập tin thư viện thông dụng • stdio.h: Định nghĩa các hàm vào/ra chuẩn (standard input/output):printf(), scanf(), getc(), putc(), gets(), puts(), fflush(), fopen(), fclose(), fread(), fwrite(), getchar(), putchar(), getw(), putw() • conio.h: Định nghĩa các hàm vào ra trong chế độ DOS clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(), clreol(), • math.h: Định nghĩa các hàm tính toán abs(), sqrt(), log(). log10(), sin(), cos(), tan(), acos(), asin(), atan(), pow(), exp(), • alloc.h: Định nghĩa các hàm liên quan đến việc quản lý bộ nhớ calloc(), realloc(), malloc(), free(), farmalloc(), farcalloc(), farfree(), • io.h: Định nghĩa các hàm vào ra cấp thấp open(), _open(), read(), _read(), close(), _close(), creat(), _creat(), creatnew(), eof(), filelength(), lock(), • graphics.h: Định nghĩa các hàm liên quan đến đồ họa initgraph(), line(), circle(), putpixel(), getpixel(), setcolor(), 43
- Cấu trúc của 1 chương trình C (1) • Cấu trúc một chương trình C • Tiền xử lý và biên dịch • Prototype • Các tập tin thư viện thông dụng 44
- Cấu trúc của 1 chương trình C (2) Các chỉ thị tiền Chương xử lý trình chính Định nghĩa kiểu mới Prototype Khai báo biến Cài đặt ngoài các hàm 45
- Tiền xử lý và biên dịch (preprocess and compile) • Các chỉ thị định hướng (directive): – #include , #define – Có thể chứa các lệnh phức tạp như if-else. • Bộ tiền xử lý (preprocessor) sẽ thông dịch các directive và xóa bỏ nó trước khi cung cấp cho trình biên dịch C. 46
- #define • #define khai báo một tên macro (macro symbol). • Sau đó, mỗi lần tên macro này xuất hiện, nó sẽ được thay thế bởi giá trị của nó. 47
- Chia chương trình ra các module (1) • 1 chương trình phức tạp có thể được chia ra vài module 48
- Chia chương trình ra các module (2) • Vấn đề: testmodule.c phải biết các prototype của foor và bar. • Giải pháp 1 (tệ): – Chèn tay các prototype vào các file .c có dùng nó. – Bất lợi: Mỗi khi prototype bị thay đổi => phải chỉnh lại prototype trong tất cả các file .c dùng nó. • Giải pháp 2 (tốt): – Lưu các prototype vào 1 file riêng biệt mymodule.h (h: header). – Dùng #include mymodule.h ở đầu các chương trình có dùng nó. 49
- #include • Với #include, bộ tiền xử lý sẽ thêm và thay thế token #include filename bằng nội dung của filename. • Các header file sẽ được tìm ở đâu? – #include : tìm file.h trong thư mục đã được xác định trong INCLUDE DIRECTORIES. Hoặc trong /usr/include (linux) – #include “C:\\TC\\file.h”: tìm file.h trong đường dẫn 50
- Header file • Các header file có thể chứa: • Prototype cho các hàm (function) • Định nghĩa kiểu (structs, unions, enums, typedefs) • (Định nghĩa các class trong C++) • #define macro • #pragma cho compiler • Các biến toàn cục • Cài đặt trực tiếp các hàm 51
- Hết chương 52