Professional Documents
Culture Documents
C01 NgonnguC
C01 NgonnguC
C01 NgonnguC
0
KIẾN THỨC CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH C
Ngôn ngữ C
• Do Dennis Ritchie phát triển (1972) tại phòng thí nghiệm Bell
Telephone – AT&T-USA trên cơ sở 2 ngôn ngữ lập trình trước đó:
BCPL (Martin Richard) và B (ken Thompson, 1970, cho hệ Unix đầu
tiên)
• Được sử dụng để phát triển UNIX
• Được sử dụng để viết các hệ điều hành
• Đến năm 1978, C thực sự phát triển
Chuẩn hoá
• Nhiều biến đổi nhỏ từ C ban đầu và không tương thích
• Chuẩn hoá ngôn ngữ trên cơ sở khả năng độc lập với phần cứng.
• Chuẩn C ban hành 1989, được cập nhật năm 1999.
2
Giới thiệu về ngôn ngữ lập trình C
Đặc điểm
• C là ngôn ngữ mạnh và mềm dẻo: sử dụng lập trình hệ điều hành, các
giải thuật phức tạp, chương trình soạn thảo, các trình điều khiển, đồ
hoạ...
• Ngôn ngữ cho người lập trình chuyên nghiệp: nhiều nhà tin học sử
dụng, mang tính phổ biến
• Khả năng độc lập về phần cứng (khả chuyển): chạy trên các máy tính
và hệ điều hành khác nhau.
• Ít từ khoá: Các từ khoá dùng riêng cho ngôn ngữ khi lập trình.
• Ngôn ngữ lập trình cấu trúc
• C là ngôn ngữ bậc trung: có các tính năng ngôn ngữ bậc cao và ngôn
ngữ bậc thấp (xử lý bít, byte và địa chỉ ô nhớ).
- C là ngôn ngữ cơ sở để phát triển lập trình hướng đối tượng (C++,
Java,...).
3
Cấu trúc cơ bản của một chương trình C
4
Ví dụ chương trình C đơn giản
1 /* Fig. 2.1: fig02_01.c
2 A first program in C */
3 #include <stdio.h>
4
5 /* function main begins program execution */
6 int main()
7 {
8 printf( "Welcome to C!\n" );
9
10 return 0; /* indicate that program ended successfully */
11
12 } /* end function main */
Comments:
Welcome to C!
Giải thích
Các ký tự nằm trong cặp /* */ là chú thích
• Sử dụng để mô tả, giải thích trong chương trình
#include <stdio.h>
• Chỉ thị tiền xử lý: tải nội dung của một file thư viện vào chương
trình
• <stdio.h> cho phép thực hiện các thao tác input/output chuẩn.
5
Chỉ thị tiền xử lý:
#include <[đường dẫn]\tên tệp tiêu đề>
#include “[đường dẫn]\tên tệp tiêu đề”
6
Ví dụ chương trình C đơn giản
int main()
7
Môi trường lập trình C
Program is created in
• Phases of C Programs: Editor Dis
the editor and stored
on disk.
k
Preprocessor program
1. Edit Preprocessor Dis processes the code.
k
Compiler creates
2. Preprocess Compiler Dis object code and stores
k it on disk.
3. Compile Linker Dis Linker links the object
code with the libraries
Primary k
Memory
4. Link Loader
Loader puts program
5. Load Disk ..
in memory.
..
..
Từ khóa
Hằng
Kiểu dữ liệu
Biến
Biểu thức
9
Từ khóa
Những từ trong ngôn ngữ được dành riêng cho một ý
nghĩa xác định (tên kiểu dữ liệu, toán tử, câu lệnh)
• Không dùng từ khóa để đặt tên cho hằng, biến, hàm,…
• Phân biệt chữ hoa và chữ thường
10
Kiểu dữ liệu trong C
Kiểu dữ liệu cơ sở
• Kí tự (char, unsigned char)
• Số nguyên (int, unsigned int, long (int), unsigned long (int))
• Số thực, độ chính xác đơn (float)
• Số thực, độ chính xác kép (double)
• Lưu ý: Kích thước và phạm vi biểu diễn của các kiểu dữ liệu
Kiểu enum
Kiểu mảng (array)
Kiểu cấu trúc (struct)
KIểm tra kích thước của kiểu dữ liệu: dùng toán tử
sizeof(), ví dụ: sizeof(int),…
11
Hằng
Là đại lượng mà giá trị không đổi trong quá trình tính
toán
Hằng số: 100, 10L, 10U, 0x10,…
Hằng kí tự: ‘A’, ‘a’,…
Hằng xâu kí tự: “A”
Lưu ý: phân biệt hằng kí tự và hằng xâu kí tự
• Lưu trữ ‘A’ (1 byte) A
integer1 45
Addition + f +7 f+7
Multiplication * bm b*m
Division / x/ y x/y
15
Các toán tử
Phép so sánh
Relational Operators
>
> x >y x is greater than y
<
< x <y x is less than y
>=
>= x >= y x is greater than or equal to y
<=
<= x <= y x is less than or equal to y
16
Các toán tử
17
Các toán tử
Phép gán và toán tử gán
• Biến = Biểu thức
Ví dụ về toán tử gán
d -= 4 (d = d - 4)
e *= 5 (e = e * 5)
f /= 3 (f = f / 3)
g %= 9 (g = g % 9)
19
Ví dụ: In số nguyên
1. #include <stdio.h>
2. #include <conio.h> Kết quả:
3. int main()
4. {
5. printf( "%d\n", 455 );
6. printf( "%i\n", 455 ); /* i same as d in printf */
7. printf( "%d\n", +455 ); 455
455
8. printf( "%d\n", -455 ); 455
9. printf( "%hd\n", 32000 ); -455
32000
10. printf( "%ld\n", 2000000000 ); 2000000000
11. printf( "%o\n", 455 ); 707
455
12. printf( "%u\n", 455 ); 4294966841
13. printf( "%u\n", -455 ); 1c7
1C7
14. printf( "%x\n", 455 );
15. printf( "%X\n", 455 );
16. getch();
17. return 0; /* indicates successful termination */
18. } /* end main */
20
Ví dụ: In số thực
1. #include <stdio.h>
2. #include <conio.h>
3. int main()
4. {
5. clrscr();
6. printf( "%e\n", 1234567.89 );
7. printf( "%e\n", +1234567.89 );
8. printf( "%e\n", -1234567.89 ); 1.234568e+006
1.234568e+006
9. printf( "%E\n", 1234567.89 ); -1.234568e+006
10. printf( "%f\n", 1234567.89 ); 1.234568E+006
1234567.890000
11. printf( "%g\n", 1234567.89 ); //so thuc mu e 1.23457e+006
1.23457E+006
12. printf( "%G\n", 1234567.89 ); // so thuc mu E
13. getch();
14. return 0; /* indicates successful termination */
15. } /* end main */
21
Ví dụ: In kí tự, xâu kí tự
1. #include <stdio.h>
2. #include <conio.h>
3. int main()
4. {
5. char character = 'A'; /* initialize char */
6. char string[] = "This is a string"; /* initialize char array */
7. const char *stringPtr = "This is also a string"; /* char pointer */
8. clrscr();
9. printf( "%c\n", character );
10. printf( "%s\n", "This is a string" );
11. printf( "%s\n", string );
12. printf( "%s\n", stringPtr );
13. getch();
14. return 0; /* indicates successful termination */
15. } /* end main */
A
This is a string
This is a string
This is also a string 22
Bài tập
Bài tập 1.1. Tìm hiểu Help, trình bày chi tiết cú pháp sử
dụng hàm và cho ví dụ:
+ Xuất dữ liệu: printf, putchar, puts
+ Nhập dữ liệu: scanf, getchar, getch, gets
23
Ví dụ: In giá trị con trỏ
1. #include <stdio.h>
2. #include <conio.h>
3. int main()
4. {
5. int *ptr; /* define pointer to int */
6. int x = 12345; /* initialize int x */
7. int y; /* define int y */
8. clrscr();
9. ptr = &x; /* assign address of x to ptr */
10. printf( "The value of ptr is %p\n", ptr );
11. printf( "The address of x is %p\n\n", &x );
25
Ví dụ: In số thực
1. #include <stdio.h>
2. #include <conio.h>
3. int main()
4. {
5. int i = 873; /* initialize int i */
6. double f = 123.94536; /* initialize double f */
7. char s[] = "Happy Birthday"; /* initialize char array s */
8. clrscr();
9. printf( "Using precision for integers\n" );
10. printf( "\t%.4d\n\t%.9d\n\n", i, i );
26
Kết quả thực hiện chương trình
27
Ví dụ: Sử dụng hàm scanf
1. #include <stdio.h>
2. #include <conio.h>
3. int main()
4. {
5. int x; /* define x */
6. int y; /* define y */
7. clrscr();
8. printf( "Enter a six digit integer: " );
9. scanf( "%2d%d", &x, &y );
28
KIỂU CON TRỎ
count
7
• Các con trỏ chứa địa chỉ của biến: biến được trỏ chứa giá trị cụ
thể (tham chiếu gián tiếp)
countPtr count Con trỏ countPtr trỏ đến biến count, giá trị
7 của biến con trỏ countPtr là địa chỉ của
biến count, giá trị của biến count là 7.
29
Biến con trỏ trong ngôn ngữ C
30
Biến con trỏ trong ngôn ngữ C
• Định nghĩa biến con trỏ, trỏ tới vùng nhớ kiểu int
• Định nghĩa nhiều con trỏ yêu cầu sử dụng * trước mỗi biến con
trỏ
int *myPtr1, *myPtr2;
31
Biến con trỏ trong ngôn ngữ C
y yptr y
5 500000 600000 600000 5
yPtr
Sử dụng dấu * để tham chiếu giá trị trong vùng nhớ trỏ bởi
con trỏ
• *yptr trả về giá trị của biến y (bởi vì yptr trỏ tới y)
• Dấu * có thể sử dụng trong lệnh gán làm thay đổi giá trị
của biến dữ liệu.
*yptr = 7; /* thay đổi y bằng 7 */
* và & quan hệ đối ngược nhau
- *p là dữ liệu được chứa trong vùng nhớ có địa chỉ là p
- &x là địa chỉ của biến x
int x; int *xptr; xptr = &x;
Khi đó, *xptr = x; &*xptr = *&xptr
33
The address of a is 0012FF7C
The value of aPtr is 0012FF7C
1 /* Fig. 7.4: fig07_04.c
The value of a is 7
2 Using the & and * operators */ The value of *aPtr is 7
3 #include <stdio.h>
4 Showing that * and & are complements of each other.
&*aPtr = 0012FF7C
5 int main() *&aPtr = 0012FF7C
6 {
7 int a; /* a is an integer */
8 int *aPtr; /* aPtr is a pointer to an integer */
9
10 a = 7;
11 aPtr = &a; /* aPtr set to address of a */
12
13 printf( "The address of a is %p"
14 "\nThe value of aPtr is %p", &a, aPtr ); Địa chỉ của biến a là giá trị
15 của con trỏ aPtr
16 printf( "\n\nThe value of a is %d"
17 "\nThe value of *aPtr is %d", a, *aPtr );
18
* aPtr là giá trị
19 printf( "\n\nShowing that * and & are complements of "
của biến
20 "each other\n&*aPtr = %p"
21 "\n*&aPtr = %p\n", &*aPtr, *&aPtr );
Quan hệ giữa *
22
và & là bổ
23 return 0; /* indicates successful termination */
sung
24
25 } /* end main */
Toán tử trên con trỏ
35
Biến con trỏ trong ngôn ngữ C
36
Con trỏ hằng
1 /* Fig. 7.13: fig07_13.c
2 Attempting to modify a constant pointer to non-constant data */
3 #include <stdio.h>
4
5 int main()
Thay đổi *ptr được phép – x
6 {
không phải là hằng.
7 int x; /* define x */
8 int y; /* define y */
9
10 /* ptr is a constant pointer to an integer that can be modified
11 through ptr, but ptr always points to the same memory location */
12 int * const ptr = &x;
13
14 *ptr = 7; /* allowed: *ptr is not const */
15 ptr = &y; /* error: ptr is const; cannot assign new address */
16
17 return 0; /* indicates successful termination */
18
19 } /* end main */
Thay đổi ptr là lỗi – ptr là
con trỏ hằng.
Compiling...
FIG07_13.c
D:\books\2003\chtp4\Examples\ch07\FIG07_13.c(15) : error C2166: l-value
specifies const object
Error executing cl.exe.