C01 NgonnguC

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 40

KỸ THUẬT LẬP TRÌNH

NGÔN NGỮ LẬP TRÌNH C

0
KIẾN THỨC CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH C

1. Giới thiệu ngôn ngữ C


2. Cấu trúc cơ bản của một chương trình C. Ví dụ một
chương trình C đơn giản
3. Môi trường lập trình
4. Khái niệm cơ bản: Từ khóa, Hằng, Biến, Kiểu dữ liệu,
Biểu thức
5. Các phép toán
6. Các kiểu dữ liệu cơ sở trong C
7. Sơ lược về kiểu con trỏ
8. Các lệnh vào ra cơ bản
1
Giới thiệu 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

#include <...> /* 1. Các hàm thư viện */


#define /* 2. Định nghĩa hằng */
typedef /* 3. Định nghĩa kiểu dữ liệu */
/* 4. Khai báo nguyên mẫu các hàm */
function prototype
/* 5. Khai báo các biến toàn cục */
int main (void) /* 6. “Chương trình chính” */
{ Khai báo các biến;
Tập lệnh;
}
/* 7. “Các chương trình con”- các hàm */

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()

 Một chương trình C có thể có 1 hoặc một số function,


nhưng chỉ có duy nhất 1 hàm là main
 int có nghĩa là hàm main trả về một giá trị nguyên
 Cặp “{ }” thể hiện một khối, đoạn chương trình
 Phần thân của tất cả các hàm phải nằm trong cặp “{}”
 Có thể sử dụng: void main(void) và không cần câu
lệnh return ở cuối hàm
 Kết thúc lệnh bởi dấu ;

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.
..
..

6. Execute Primary Memory


CPU takes each
CPU instruction and
executes it, possibly
storing new data
..
.. values as the program
8
..
executes.
Các khái niệm cơ bản

 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

 Các từ khóa cơ bản trong ngôn ngữ C

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

• Lưu trữ “A” (2 byte) A \0

 Hằng biểu thức


12
Biến

1. /*Ví dụ chương trình C: Cộng hai số nguyên*/


2. #include <stdio.h>
3. #include <conio.h>
4. /* function main begins program execution */
5. int main()
6. {
7. int integer1; /* first number to be input by user */
8. int integer2; /* second number to be input by user */
9. int sum; /* variable in which sum will be stored */
10. clrscr();
11. printf( "Enter first integer\n" ); /* prompt */
12. scanf( "%d", &integer1 ); /* read an integer */

13. printf( "Enter second integer\n" ); /* prompt */


14. scanf( "%d", &integer2 ); /* read an integer */

15. sum = integer1 + integer2; /* assign total to sum */

16. printf( "Sum is %d\n", sum ); /* print sum */


17. getch();
18. return 0; /* indicate that program ended successfully */
19. } /* end function main */
13
Biến

 Khái niệm Biến:


• Tên biến tương ứng với vị trí xác định trong bộ nhớ máy tính
• Mỗi biến gồm: một tên, kiểu dữ liệu, kích thước và giá trị
• Mỗi khi giá trị mới được gán cho biến thì giá trị trước đó sẽ được
thay thế (xoá mất). Chẳng hạn khi sử dụng lệnh scanf để đọc giá
trị biến.
• Đọc các biến từ bộ nhớ giá trị của nó không thay đổi
 Mô tả trực giác về biến trong bộ nhớ

integer1 45

 Khai báo biến trước khi sử dụng


 Đặt tên biến đúng quy tắc (trong C, phân biệt chữ hoa và
chữ thường)
14
Các toán tử (phép tính)

 Các phép tính số học và thứ tự ưu tiên


• 1 - Thứ nhất, thực hiện biểu thức, toán tử trong cặp “()”, nếu
đồng cấp, thực hiện từ trái qua phải.
• 2 - Thứ hai: thực hiện phép *, / hoặc %, nếu đồng cấp thực hiện
từ trái qua phải.
• 3 - Cuối cùng: phép +,-, nếu đồng cấp thực hiện từ trái qua phải

Coperation Arithmetic operator Algebraic expression Cexpression

Addition + f +7 f+7

Subtraction - p–c p-c

Multiplication * bm b*m

Division / x/ y x/y

Modulus % r mod s r%s

15
Các toán tử

 Phép so sánh

Standard algebraic equality C equality or Example of C Meaning of C condition


operator or relational operator relational operator condition
Equality Operators
==
= x == y x is equal to y
!=
 x != y x is not equal to y

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)

 Toán tử tăng (++) và Toán tử giảm (−−)


• c ++ sử dụng thay cho c += 1
• c−− sử dụng thay cho c −= 1
• Toán tử đặt trước biến: biến thay đổi giá trị trước khi biểu thức sử dụng
nó được tính toán
• Toán tử đặt sau biến: biến thay đổi giá trị sau khi biểu thức sử dụng nó
được tính toán
18
Các lệnh vào/ra cơ bản

 Hàm printf(): in kết quả ra màn hình


printf(“Xâu_điều_khiển_khuôn_dạng”, Danh_sách_tham_số_được_in);

 Hàm scanf(): nhập dữ liệu vào từ bàn phím


scanf(“Xâu_điều_khiển_khuôn_dạng”, Danh_sách_địa_chỉ_biến);

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 );

12. printf( "Total characters printed on this line:%n", &y );


13. printf( " %d\n\n", y );

14. y = printf( "This line has 28 characters\n" );


15. printf( "%d characters were printed\n\n", y );

16. printf( "Printing a %% in a format control string\n" );


17. getch();
18. return 0; /* indicates successful termination */
19. } /* end main */
24
In giá trị con trỏ

 Kết quả thực hiện chương trình

The value of ptr is 0012FF78


The address of x is 0012FF78

Total characters printed on this line: 38

This line has 28 characters


28 characters were printed

Printing a % in a format control string

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 );

11. printf( "Using precision for floating-point numbers\n" );


12. printf( "\t%.3f\n\t%.3e\n\t%.3g\n\n", f, f, f );

13. printf( "Using precision for strings\n" );


14. printf( "\t%.11s\n", s );
15. getch();
16. return 0; /* indicates successful termination */

17. } /* end main */

26
 Kết quả thực hiện chương trình

Using precision for integers


0873
000000873

Using precision for floating-point numbers


123.945
1.239e+002
124

Using precision for strings


Happy Birth

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 );

10. printf( "The integers input were %d and %d\n", x, y );


11. getch();
12. return 0; /* indicates successful termination */
13. } /* end main */

28
KIỂU CON TRỎ

 Biến con trỏ (Pointer)


• Địa chỉ bộ nhớ của biến được gán cho con trỏ là giá trị của biến
con trỏ.
• Biến thông thường chứa một giá trị cụ thể (count = 7).

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

 Con trỏ - Pointer


• Sức mạnh của ngôn ngữ lập trình C
• Tạo ra khả năng mềm dẻo khi lập trình
• Thuận lợi truyền tham số cho hàm (tham biến), xử lý
mảng, xâu, bộ nhớ
• Con trỏ có quan hệ mật thiết giữa arrays và strings
• Lưu ý, thận trọng trong cách sử dụng: can thiệp vào
bộ nhớ.

30
Biến con trỏ trong ngôn ngữ C

 Định nghĩa và khởi tạo biến con trỏ


• * được sử dụng định nghĩa biến pointer
int *myPtr;

• Đị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;

• Có thể định nghĩa con trỏ kiểu dữ liệu bất kỳ


• Khởi tạo con trỏ là 0, NULL (con trỏ rỗng) hoặc một địa chỉ của
một biến cùng kiểu dữ liệu

31
Biến con trỏ trong ngôn ngữ C

 &Tenbien (trả về địa chỉ của tenbien)


• Phép gán trả về địa chỉ của biến dữ liệu
int y = 5;
int *yPtr;
yPtr = &y; /* yPtr lấy địa chỉcủa y */
yPtr “trỏ tới” y

y yptr y
5 500000 600000 600000 5
yPtr

địa chỉ của y


là giá trị của
yptr
32
Biến con trỏ trong ngôn ngữ C

 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ỏ

Operators Associativity Type


() [] left to right highest
+ - ++ -- ! * & (type) right to left unary
* / % left to right multiplicative
+ - left to right additive
< <= > >= left to right relational
== != left to right equality
&& left to right logical and
|| left to right logical or
?: right to left conditional
= += -= *= /= %= right to left assignment
, left to right comma
Fig. 7.5 Operator precedence.

35
Biến con trỏ trong ngôn ngữ C

 Con trỏ hằng (const pointers)


• Trỏ tới vùng nhớ cố định
• Phải được khởi tạo khi định nghĩa
• int *const myPtr = &x;
– Kiểu int *const – con trỏ hằng trỏ đến vùng nhớ kiểu int

• const int *myPtr = &x;


– Con trỏ thông thường trỏ đến const int

• const int *const Ptr = &x;


– con trỏ const trỏ đến một vùng nhớ const int

– x có thể thay đổi, nhưng *Ptr thì không.

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.

FIG07_13.exe - 1 error(s), 0 warning(s)


Ví dụ: những tình huống sử dụng con trỏ hằng,
được phép và không được phép

1 /* Fig. 7.14: fig07_14.c


2 Attempting to modify a constant pointer to constant data. */
3 #include <stdio.h>
4
5 int main()
6 {
7 int x = 5; /* initialize x */
8 int y; /* define y */
9
10 /* ptr is a constant pointer to a constant integer. ptr always
11 points to the same location; the integer at that location
12 cannot be modified */
13 const int *const ptr = &x;
14
15 printf( "%d\n", *ptr );
16
17 *ptr = 7; /* error: *ptr is const; cannot assign new value */
18 ptr = &y; /* error: ptr is const; cannot assign new address */
19
20 return 0; /* indicates successful termination */
21
22 } /* end main */
Compiling...
FIG07_14.c
D:\books\2003\chtp4\Examples\ch07\FIG07_14.c(17) : error C2166: l-value
specifies const object
D:\books\2003\chtp4\Examples\ch07\FIG07_14.c(18) : error C2166: l-value
specifies const object
Error executing cl.exe.

FIG07_12.exe - 2 error(s), 0 warning(s)

You might also like