Tải bản đầy đủ (.pdf) (153 trang)

Một số kiến thức cơ sở về lập trình bằng ngôn ngữ C ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (757.84 KB, 153 trang )

1

























Một số kiến thức cơ sở về lập trình
bằng ngôn ngữ C
























2





CHƯƠNG 1: CƠ SỞ NGÔN NGỮ C

I. Phần mở đầu
Nội dung:

 Giới thiệu ngôn ngữ C & C++
 Lập trình hướng đối tượng (Object oriented programming)
 Cơ sở về phần cứng và phần mềm để thực hiện chương trình C.

Giới thiệu ngôn ngữ C & C++
- C là một loại ngôn ngữ lập trình bậc cao đa dụng phổ biến nhất hiện nay.
- C được phát triển từ ngôn ngữ B (K. Thompson, 1967) bởi Dennis Ritchie của hãng
AT&T Bell Labs và bắt đầu xuất hiện từ năm 1972.
- Yêu cầu của ngôn ngữ bậc cao: tính dễ đọc-viết (readability), tính dễ bảo trì
(maintainability) và khả năng linh động (portability).
 C là ngôn ngữ lập trình độc lập với phần cứng và các hệ điều hành máy tính.
- 1978: quyển sách The C Programming Language (Kernighan & Ritchie) là tài liệu kinh
điển của ngôn ngữ C.
- 1983: American National Standards Institute (ANSI) thành lập ủy ban xây dựng chuẩn
cho ngôn ngữ C.
- 1990: Chuẩn ANSI C ra đời.
- 1983: yếu tố lập trình hướng đối tượng + C  ngôn ngữ C++ do Bjarne Stroustrup phát
triển ở Bell Labs.
- C++ là một ngôn ngữ gần như là mở rộng của ngôn ngữ C, đã có 3 phiên bản: 1.1
(1986), 2.0 (1989) và 3.0 (1991). Chính phiên bản 3.0 là cơ sở để xây dựng chuẩn ANSI
C++ .
Lập trình hướng đối tượng (Object Oriented Programming)
- Phương pháp lập trình:
* LT tuyến tính (linear)
* LT thủ tục (procedural) LT cấu trúc (structural) (Chương trình = Cấu trúc dữ
liệu + Giải thuật)
* LT hướng đối tượng (object-oriented)
3

- Đặc điểm LTHĐT:

* Đối tượng (Object): Dữ liệu + phương thức  trọng tâm của quá trình phát triển
chương trình.
* Lớp (Class): tập hợp các đối tượng có tính chất chung giống nhau.
* Tính đóng gói dữ liệu (encapsulation): đối tượng bao gồm dữ liệu và phương
thức được đóng gói mà người sử dụng có thể tiếp cận đến dữ liệu thông qua các chức
năng mà không cần biết đến nọi dung lập trình cụ thể của chúng.
* Tính kế thừa (inheritance): Sự kế thừa cho phép định nghĩa các lớp mới dựa trên
các lớp có sẵn  cho phép sử dụng lại các module chương trình mà không cần thay đổi
chúng.
* Tính đa hình (polymorphism): trong các lớp kế thừa nhau, có thể định nghĩa
phương thức có cùng tên hoặc ý nghĩa nhưng hoàn toàn khác nhau về mặt lập trình.
- Ưu điểm:
* Tính kế thừa  loại bỏ những đoạn chương trình phải viết lại, mở rộng các lớp
nhanh chóng.
* Cơ sở chương trình là đối tượng  việc thiết kế và lập trình thực hiện theo quy
trình chứ không theo kinh nghiệm hoặc thủ thuật  tiết kiệm thời gian và tăng năng suất.
* Tính đóng gói  đảm bảo tính bảo mật mà vẫn phát triển chương trình được.
* Cách tiếp cận đặt trọng tâm đối tượng  có thể xây dựng mô hình chi tiết và dễ
cài đặt.
* Khả năng mở rộng hệ thống lớn hơn khả thi hơn.
- Ngôn ngữ LTHĐT:

Cơ sở về phần cứng và phần mềm để thực hiện chương trình C
Phần cứng:
* Các loại máy tính có phần mềm biên dịch ngôn ngữ C &C++ (tương thích ANSI
SIMULA (66)


SMALLTALK
(71)


SMALLTALK
(80)

JAVA (95)

ADA (83)

ADA (95)

EIFFEL (90)


C++ (86)

4

C)
* Đối với PC, cấu hình máy phù hợp với chương trình biên dịch ngôn ngữ.
Phần mềm:
* Các loại máy sử dụng HĐH Unix, C là ngôn ngữ mặc định.
* Đối với PC: Turbo C, Turbo C++, Borland C++, Symantec C, Visual C++, C++
Builder…
II. Chương trình C đầu tiên
Nội dung:
Với phần này ta làm quen với cấu trúc của một chương trình C và các thành phần cấu tạo
nên nó:
 Chú thích
 Chỉ thị #include
 Tập Header

 Hàm main()
 Lệnh return
 Hàm exit()
 Kiểu dữ liệu void
 Biên dịch và kết nối
 Dò sửa lỗi

Ví dụ đơn giản chương trình C

1: /* Chuong trinh dau tien */
2: #include <stdio.h>
3:
4: main()
5: {
6: printf ("Chao ban! Day la chuong trinh C dau tien cua toi.\n");
7: return 0;
8: }
Chú thích
Trong ngôn ngữ C, hàng chú thích được giới hạn giữa hai dấu /* và */. Trình phiên dịch
C sẽ bỏ qua tất cả nôi dung chứa trong cặp dấu trên.
/* Chuong trinh dau tien */

5

Đối với C++, ta có thể sử dụng // ở đầu mỗi hàng chú thích.
/*
This comment does not increase the size of
the executable file (binary code), nor does
it affect the performance speed.
*/

Tương đương với:
// This comment does not increase the size of
// the executable file (binary code), nor does
// it affect the performance speed.
Chú ý: Các đoạn chú thích không được phép lồng vào nhau.
Chỉ thị #include
#include <stdio.h>
Chỉ thị #include có tác dụng bảo bộ tiền xử lý C tìm tập tin ứng với nội dung <tên > và
chép nội dung tập tin vào vị trí của include trong chương trình. Các tập tên ứng với nội
dung trong < > thường là các tập tin header ứng với những hàm thông dụng trong thư
viện của C, thường năm trong thư mục INCLUDE\. Nếu các tập header nằm tại thư mục
làm việc, ta dùng ngoặc kép “ “ thay cho ngoặc < >.
Chú ý
: Ngôn ngữ C phân biệt chữ Hoa và chữ thường !!!
Hàm main()
Hàm main() ở hàng 4 là hàm đặc biệt trong C. Mọi chương trình C phải có hàm này và
chạy chương trình bắt đầu từ hàm này. Nội dung các dòng lệnh trong hàm nằm giữa
ngoặc { }.
Trong hàm có lệnh đặc biệt return có nhiệm vụ trả lại một giá trị nào đó cho hàm. Mặc
định nó trả lại một giá trị số nguyên (int). Hàng 5 trả lại giá trị 0, nghĩa là chương trình
kết thúc bình thường; nếu giá trị trả lại khác 0, điều đó nghĩa là chương trình kết thúc có
lỗi.
Hàm exit() , hàm cơ sở của thư viện C được định nghĩa trong tập header stdlib.h (khi
muốn dùng hàm này, phải gọi #include <stdio.h>), dùng để kết thúc chương trình,
nhưng không trả lại giá trị nào cả.
Ví dụ:
1: /* Chuong trinh dau tien */
2: #include <stdio.h>
3: #include <stdlib.h>
4: void main()

6

5: {
6: printf ("Chao ban! Day la chuong trinh C dau tien cua toi.\n");
7: exit(0);
8: }
Trong chương trình trên, hàng 4 có thêm từ khóa void để xác định kiểu dữ
liệu trống (empty). Nếu void được thêm vào trước tên hàm, hàm sẽ không
phải trả lại một giá trị nào cả. Trong trường hợp trên, vì hàm exit(0) không
trả giá trị, từ void phải được thêm ở hàng 4.
Biên dịch và kết nối (compiling and linking)

Lỗi chương trình và dò sửa lỗi (debugging)
Khi chương trình nguồn được dịch và kết nối, có thể xuất hiện những lỗi cú pháp, lỗi kết
nối… mà ta cần phải sửa lại cho đúng trước khi chương trình được dịch thành dạng thi
hành được (executable).
Các chương trình thường cung cấp cho người sử dụng công cụ dò sửa lỗi (debugger).
Sinh viên nên tập làm quen với công cụ này để nâng cao hiệu quả lập trình.

III. Các thành phần cơ sở của chương trình C
Nội dung:
Với phần này ta làm quen với các thành phần cơ sở cấu tạo nên ngôn ngữ C:
 Hằng và biến
 Biểu thức
 Câu lệnh
 Cụm câu lệnh
 Cấu trúc hàm
 Kiểu và tên hàm
 Đối số của hàm
 Cách gọi hàm

Program.c


Program.obj


Program.exe


BIEN DICH
(kiem tra cu phap,
…)

KET NOI
(ket noi cac modul thu vien,…)


7


Các thành phần cơ sở
Hằng và biến
Hằng là đại lượng không thay đổi giá trị trong quá trình thi hành chương trình.
Biến là đại lượng mà giá trị của nó có thể thay đổi trong quá trình thi hành chương trình.
Biểu thức
Biểu thức là tổ hợp các hằng, biến và các toán tử xác định các phép toán.
(2 + 3*i) / 10
Toán tử số học
Ký hiệu Ý nghĩa
+ Cộng

- Trừ
* Nhân
/ Chia
% Phần dư (modulo)
Câu lệnh
Câu lệnh là một tổ hợp có nghĩa (ở 2 vế) các biểu thức và chấm dứt bởi dấu
chấm phẩy (;).
i = (2 + 3) * 10;
i = 2 + 3 * 10;
j = 6 % 4;
k = i + j;

return 0;
exit(0);
printf ("Ket thuc chuong trinh");
Cụm câu lệnh
Cụm câu lệnh là nhóm câu lệnh bắt đầu bằng ngoặc { và kết thúc bằng ngoặc }. Cụm câu
lệnh được thi hành như một câu lệnh bởi bộ biên dịch C.
for(. . .) {
s3 = s1 + s2;
mul = s3 * c;
remainder = sum % c;
8

}
Cấu trúc một hàm C
Một hàm được cấu tạo bởi 6 phần:
- Kiểu hàm
- Tên hàm
- Đối số

- Ngoặc mở {
- Thân hàm
- Ngoặc đóng }
Kiểu hàm là kiểu dữ liệu mà hàm sẽ trả. Mặc định hàm trả kiểu int. Kiểu void se không
trả giá gì nào cả.
Tên hàm phải có nghĩa và đúng cú pháp.
Tên không đúng
Cú pháp

2 (digit) Tên hàm không được khởi đầu bằng số
* (Asterisk) Tên hàm không được khởi đầu bằng dấu
+ (Addition) Tên hàm không được khởi đầu bằng từ khóa

. (dot) Tên hàm không được khởi đầu bằng .
total-number Tên hàm không được chứa ký hiệu toán tử
account'97 Tên hàm không được chứa dấu ‘
Tên hợp lệ: print2copy, total_number, _quick_add, Method3
Đối số hàm C
Đối số là những biến nằm trong ngoặc đơn sau tên hàm. Đối số hàm C chỉ có tính tham
trị, nghĩa là nó chỉ truyền giá trị vào trong hàm chứ không thay đổi giá trị ngoài hàm.
Ví dụ: Hàm cộng 2 số nguyên
1: /* This function adds two integers and returns the result */
2: int integer_add( int x, int y )
3: {
4: int result;
5: result = x + y;
6: return result;
7: }

Lời khuyên


Không nên tạo hàm quá phức tạp và dài, mànên chia nhỏ (tạo nhiều hàm con) ra để dễ
dàng theo dõi trong quá trình điều chỉnh hoặc sử lỗi chương trình.
Cách gọi hàm
9

Ví dụ: Chương trình tính phép cộng và xuất giá trị lên màn ảnh
1: /* Calculate an addition and print out the result */
2: #include <stdio.h>
3: /* This function adds two integers and returns the result */
4: int integer_add( int x, int y )
5: {
6: int result;
7: result = x + y;
8: return result;
9: }
10:
11: int main()
12: {
13: int sum;
14:
15: sum = integer_add( 5, 12);
16: printf("The addition of 5 and 12 is %d.\n", sum);
17: return 0;
18: }
Bài tập
1. Viết một hàm C nhân 2 số nguyên với nhau và trả lại giá trị nhân.
2. Viết chương trình gọi hàm nhân ở BT1 để nhân 3 với 5 và xuất kết quả lên màn
ảnh.


IV. Kiểu và tên dữ liệu trong C
Nội dung:
Với phần này ta làm quen với các bốn kiểu dữ liệu cơ sở của ngôn ngữ C:
 char
 int
 float
 double

Từ khóa
Từ khóa là từ dành riêng để xác định một đặc trưng của ngôn ngữ, không được dùng làm
biến, hằng hoặc tên hàm. ANSI C có 32 từ khóa sau (và chỉ viết bằng chữ thường !!):
Keyword

Description

Keyword

Description

auto Storage class specifier

int Type specifier
10

break Statement long Type specifier
case Statement register Storage class specifier
char Type specifier return Statement
const Storage class modifier

short Type specifier

continue Statement signed Type specifier
default Label sizeof Operator
do Statement static Storage class specifier
double Type specifier struct Type specifier
else Statement switch Statement
enum Type specifier typedef Statement
extern Storage class specifier

union Type specifier
float
Type specifier unsigned Type specifier
for
Statement void Type specifier
goto Statement volatile Storage class modifier
if Statement while Statement
Kiểu dữ liệu char
Một đối tượng của kiểu char biểu thị một ký tự đơn ứng với bảng mã ký tự 8 bits ASCII.
Biến ký tự
char variablename;
hoặc:
char variablename1, variablename2, variablename3;
Format Ký tự: %c
Hằng ký tự
x = `A';
x = 65;
hoặc

x = `a';
x = 97;
Ký tự thóat (\)

Ký tự

Mô tả
\b BACKSPACE
\f Kết thúc trang (form-
feed)
11

\r Xuống hàng (RETURN)
\t TAB
Xuất các ký tự
Dùng hàm printf(), địnhnghi4a trong stdio.h, để xuất lên màn ảnh.
Ví dụ: In các ký tự lên màn ảnh.

1: /* Printing out characters */
2: #include <stdio.h>
3:
4: main()
5: {
6: char c1;
7: char c2;
8:
9: c1 = `A';
10: c2 = `a';
11: printf("Convert the value of c1 to character: %c.\n", c1);
12: printf("Convert the value of c2 to character: %c.\n", c2);
13: return 0;
14: }

Kết quả:


Convert the value of c1 to character: A.
Convert the value of c2 to character: a.
Ví dụ: Biến đổi số thành ký tự (dùng format %c)
1: /* Converting numeric values back to characters */
2: #include <stdio.h>
3:
4: main()
5: {
6: char c1;
7: char c2;
8:
9: c1 = 65;
10: c2 = 97;
11: printf("The character that has the numeric value of 65 is:
%c.\n", c1);
12: printf("The character that has the numeric value of 97 is:
%c.\n", c2);
13: return 0;
14: }

Kết quả:

The character that has the numeric value of 65 is: A.
The character that has the numeric value of 97 is: a.
12

Kiểu dữ liệu int
Dữ liệu số không có thành phần thập phân. Khoảng lớn của nó phụ thuộc vào độ dài bộ
nhớ lưu trữ.

Số nguyên 32 bits : từ 2147483647 (2
31
_1) đến -2147483648.
Số nguyên 16 bits : từ 32767 (2
15
_1) đến -32768.
Biến int
int variablename;
int variablename1, variablename2, variablename3;
Format int: %f
Ví dụ: Biến đổi ký tự thành số (dùng format %d)
1: /* Showing the numeric values of characters */
2: #include <stdio.h>
3:
4: main()
5: {
6: char c1;
7: char c2;
8:
9: c1 = `A';
10: c2 = `a';
11: printf("The numeric value of A is: %d.\n", c1);
12: printf("The numeric value of a is: %d.\n", c2);
13: return 0;
14: }

Kết quả:
The numeric value of A is: 65.
The numeric value of a is: 97.
Kiểu dữ liệu float

Dữ liệu số thực biểu diễn bằng dấu chấm động.
Số thực 32 bits: Khỏang giá trị +/-1.0*10
37
, có ít nhất 6 số lẻ thập phân. Các phép tính
giữ số thực và số thực hoặc với số nguyên cho kết quả kiểu float.
Biến float
float variablename;
float variablename1, variablename2, variablename3;
Format float: %f
Ví dụ: Xuất kết quả chia số int và float
1: /* Integer vs. floating-point divisions */
13

2: #include <stdio.h>
3:
4: main()
5: {
6: int int_num1, int_num2, int_num3; /* Declare integer variables
*/
7: float flt_num1, flt_num2, flt_num3; /* Declare floating-point
variables */
8:
9: int_num1 = 32 / 10; /* Both divisor and dividend are integers
*/
10: flt_num1 = 32 / 10;
11: int_num2 = 32.0 / 10; /* The divisor is an integer */
12: flt_num2 = 32.0 / 10;
13: int_num3 = 32 / 10.0; /* The dividend is an integer */
14: flt_num3 = 32 / 10.0;
15:

16: printf("The integer divis. of 32/10 is: %d\n", int_num1);
17: printf("The floating-point divis. of 32/10 is: %f\n", flt_num1);
18: printf("The integer divis. of 32.0/10 is: %d\n", int_num2);
19: printf("The floating-point divis. of 32.0/10 is: %f\n",
flt_num2);
20: printf("The integer divis. of 32/10.0 is: %d\n", int_num3);
21: printf("The floating-point divis. of 32/10.0 is: %f\n",
flt_num3);
22: return 0;
23: }

Kết quả:

The integer divis. of 32/10 is: 3
The floating-point divis. of 32/10 is: 3.000000
The integer divis. of 32.0/10 is: 3
The floating-point divis. of 32.0/10 is: 3.200000
The integer divis. of 32/10.0 is: 3
The floating-point divis. of 32/10.0 is: 3.200000
Kiểu dữ liệu double
Dữ liệu số thực có độ chính xác gấp đôi.
Số thực 64 bits, có ít nhất 10 số lẻ thập phân.
Biến double
double variablename;
double variablename1, variablename2, variablename3;
Format double: %e, %E
Quy ước đặt tên biến
14

Các ký tự sau đây được dùng đặt tên biến: A-Z, a-z, 0-9 (nhưng không được đặt đầu), dấu

gạch dưới (_).
Biến không được chứa ký hiệu toán tử.
Biến không được chứa dấu (.).
Biến không được chứa (‘).
Biến không được chứa ký hiệu đặc biệt như *, @, #, ?, v.v
Cảnh báo
Không bao giờ dùng từ khóa của C hoặc tên các hàm thư viện C làm tên biến mặc dù có
thể được.
Bài tập
1. Viết chương trình xuất các giá trị số của các ký tự Z và z
2. Viết chương trình xuất các các ký tự có giá trị số 72 and 104.
3. Cho số double dbl_num = 123.456;,viết chương trình xuất giá trị trên theo format
float và doule.
4. Viết chương trình xuất giá trị bằng số của ký tự xuống hàng (\n).


V. Đọc và viết qua các giao tiếp nhập xuất (I/O) chuẩn
Nội dung:
Với phần này ta tìm hiểu kỹ hơn với lệnh printf() cũng như các lệnh nhập xuất sau:
 Hàm getc()
 Hàm putc()
 Hàm getchar()
 Hàm putchar()

Các giao tiếp nhập xuất chuẩn (I/O)
Ngôn ngữ C xử lý một tập tin như một chuỗi byte (8 bits), gọi là stream và có thể thu
nhận hoặc ghi lại nó qua các giao tiếp xuất nhập (I/O):
Nội dung Thiết bị giao tiếp
Stdin
Giao tiếp nhập chuẩn


Bàn phím
Stdout
Giao tiếp xuất chuẩn Màn ảnh
Stderr
Giao tiếp lỗi để thông báo lỗi Màn ảnh
15


Ghi chú
Ngôn ngữ C thao tác với nhiều lệnh nhập xuất (I/O) chứa trong header stdio.h. Cho nên,
luôn nhớ khai báo #include stdio.h trước khi sử dụng các lệnh I/O. Đối với C++, các lệnh
nhập xuất chứa trong iostream.h.
Giao tiếp nhập từ người sử dụng (thường là thông qua bàn phím)
Hàm getc()
Hàm getc() đọc 1 ký tự từ một file stream và trả lại giá trị số nguyên ứng với ký tự đó.
#include <stdio.h>
int getc(FILE *stream);
Nếu kết thúc tệp (end-of-file) hoặc lỗi xuất hiện, hàm trả lại giá trị EOF.
Ví dụ: Đọc ký tự do người sử dụng cho vào
1: /*Reading input by calling getc() */
2: #include <stdio.h>
3:
4: main()
5: {
6: int ch;
7:
8: printf("Please type in one character:\n");
9: ch = getc( stdin );
10: printf("The character you just entered is: %c\n", ch);

11: return 0;
12: }
Kết quả:
Please type in one character:
H
The character you just entered is: H
Hàm getchar()
Hàm getchar() tương đương với getc(stdin).
#include <stdio.h>
int getchar(void);
Nếu kết thúc tệp (end-of-file) hoặc lỗi xuất hiện, hàm trả lại giá trị EOF.
Ví dụ: Đọc ký tự do người sử dụng cho vào
1: /*Reading input by calling getchar() */
2: #include <stdio.h>
3:
16

4: main()
5: {
6: int ch1, ch2;
7:
8: printf("Please type in two characters together:\n");
9: ch1 = getc( stdin );
10: ch2 = getchar( );
11: printf("The first character you just entered is: %c\n", ch1);
12: printf("The second character you just entered is: %c\n", ch2);
13: return 0;
14: }
Kết quả:
Please type in two characters together:

Hi
The first character you just entered is: H
The second character you just entered is: i
Giao tiếp xuất ra màn ảnh
Hàm putc()
Hàm putc() ghi 1 ký tự vào một file stream.
#include <stdio.h>
int putc(int c, FILE *stream);
Nếu ghi thành công, hàm trả lại giá trị ký tự,; nếu không trả lại EOF.
Ví dụ: Xuất một ký tự lên màn ảnh
1: /*Outputting a character with putc() */
2: #include <stdio.h>
3:
4: main()
5: {
6: int ch;
7:
8: ch = 65; /* the numeric value of A */
9: printf("The character that has numeric value of 65 is:\n");
10: putc(ch, stdout);
11: return 0;
12: }
Kết quả:
The character that has numeric value of 65 is:
A
C:\app>
Hàm putchar()
Hàm putchar() tương đương với putc(stdout).
#include <stdio.h>
int putchar(int c);

17

Nếu ghi thành công, hàm trả lại giá trị ký tự,; nếu không trả lại EOF.
Ví dụ: Xuất ký tự lên màn ảnh
1: /* 05L04.c: Outputting characters with putchar() */
2: #include <stdio.h>
3:
4: main()
5: {
6: putchar(65);
7: putchar(10);
8: putchar(66);
9: putchar(10);
10: putchar(67);
11: putchar(10);
12: return 0;
13: }
Kết quả:
A
B
C
Hàm printf()
#include <stdio.h>
int printf(const char *format-string, );
VD: printf("The sum of two integers %d + %d is: %d.\n",a,b,c);
Các đặc tả format dùng với printf():
%c

Ký tự
%d


Số nguyên
%i Số nguyên (như %d).
%f Số thực dấu phẩy động
%e

Số thực dạng a.aaa
e
+bbb
%E

Số thực dạng a.aaa
E
+bbb
%g

Dùng %f hoặc %e, nếu cái nào ngắn hơn.

%G

Dùng %f hoặc %E, nếu cái nào ngắn hơn.

%o

Số octa không dấu
%s Chuỗi ký tự
%u

Số nguyên không dấu
%x


Số hexa không dấu (với x thường)
%X

Số hexa không dấu (với X hoa)
%p

Hiển thị đối số là pointer
%%

Cho ra ký tự (%).
18

Đổi thành số Hexa
Ví dụ:
1: /*Converting to hex numbers */
2: #include <stdio.h>
3:
4: main()
5: {
6: printf("Hex(uppercase) Hex(lowercase) Decimal\n");
7: printf("%X %x %d\n", 0, 0, 0);
8: printf("%X %x %d\n", 1, 1, 1);
9: printf("%X %x %d\n", 2, 2, 2);
10: printf("%X %x %d\n", 3, 3, 3);
11: printf("%X %x %d\n", 4, 4, 4);
12: printf("%X %x %d\n", 5, 5, 5);
13: printf("%X %x %d\n", 6, 6, 6);
14: printf("%X %x %d\n", 7, 7, 7);
15: printf("%X %x %d\n", 8, 8, 8);

16: printf("%X %x %d\n", 9, 9, 9);
17: printf("%X %x %d\n", 10, 10, 10);
18: printf("%X %x %d\n", 11, 11, 11);
19: printf("%X %x %d\n", 12, 12, 12);
20: printf("%X %x %d\n", 13, 13, 13);
21: printf("%X %x %d\n", 14, 14, 14);
22: printf("%X %x %d\n", 15, 15, 15);
23: return 0;
24: }
Kết quả:
Hex(uppercase) Hex(lowercase) Decimal
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
A a 10
B b 11
C c 12
D d 13
E e 14
F f 15
Format số nguyên xác định số chữ số: % (-0n) d
1: /*Specifying minimum field width */
2: #include <stdio.h>

3:
4: main()
5: {
6: int num1, num2;
7:
8: num1 = 12;
19

9: num2 = 12345;
10: printf("%d\n", num1);
11: printf("%d\n", num2);
12: printf("%5d\n", num1);
13: printf("%05d\n", num1);
14: printf("%2d\n", num2);
15: return 0;
16: }
Kết quả:
12
12345
12
00012
12345
Sắp xếp số nguyên thẳng hàng bên phải hoặc trái
1: /*Aligning output */
2: #include <stdio.h>
3:
4: main()
5: {
6: int num1, num2, num3, num4, num5;
7:

8: num1 = 1;
9: num2 = 12;
10: num3 = 123;
11: num4 = 1234;
12: num5 = 12345;
13: printf("%8d %-8d\n", num1, num1);
14: printf("%8d %-8d\n", num2, num2);
15: printf("%8d %-8d\n", num3, num3);
16: printf("%8d %-8d\n", num4, num4);
17: printf("%8d %-8d\n", num5, num5);
18: return 0;
19: }
Kết quả:
1 1
12 12
123 123
1234 1234
12345 12345
Format biểu diễm độ chính xác: % (a.b) f , % (a.b) d
1: /* Using precision specifiers */
2: #include <stdio.h>
3:
4: main()
5: {
6: int int_num;
7: double flt_num;
8:
9: int_num = 123;
10: flt_num = 123.456789;
11: printf("Default integer format: %d\n", int_num);

12: printf("With precision specifier: %2.8d\n", int_num);
20

13: printf("Default float format: %f\n", flt_num);
14: printf("With precision specifier: %-10.2f\n", flt_num);
15: return 0;
16: }
Kết quả:
Default integer format: 123
With precision specifier: 00000123
Default float format: 123.456789
With precision specifier: 123.46
Bài tập
1. Xuất lên màn ảnh ký tự B, y và e.
2. Hiển thị lên màn ảnh 2 số 123 và 123.456 và xếp thẳng hàng về phía trái.
3. Biểu diễn 3 số 15, 150, and 1500 dưới dạng hexa.
4. Chương trình sau có lỗi gì?
main()
{
int ch;
ch = getchar();
putchar(ch);
return 0;
}


CHƯƠNG II: TOÁN TỬ VÀ LỆNH ĐIỀU KHIỂN

VI. Thao tác dữ liệu với các toán tử
Nội dung:

Với phần này ta tìm hiểu kỹ hơn về các toán tử:
 Toán tử gán (Arithmetic assignment operators)
 Tóan tử tăng giảm (Increment and decrement operators )
 Toán tử quan hệ (Relational operators)
 Toán tử chuyển đổi kiểu (Cast operator)

Tóan tử gán số học
Tóan tử gán (=)
Biến = biểu thức;
21

Bằng toán tử (=), giá trị kết quả của vế trái sẽ được gắn vào bộ nhớ dành cho biến ở vế
phải
Cảnh báo

Đ
ừng nhầm lẫn (=) with the biểu thức quan hệ (= =).
Một số cách viết đơn giản hóa trong C
x = x + y  x += y
x = x - y  x -= y
x = x * y  x *= y
x = x / y  x /= y
x = x % y  x %= y
Chú ý : x = x*y + z khác với x*=y +z  x = x*(y + z)
Ví dụ:
1: /* Using arithmetic assignment operators */
2: #include <stdio.h>
3:
4: main()
5: {

6: int x, y, z;
7:
8: x = 1; /* initialize x */
9: y = 3; /* initialize y */
10: z = 10; /* initialize z */
11: printf("Given x = %d, y = %d, and z = %d,\n", x, y, z);
12:
13: x = x + y;
14: printf("x = x + y assigns %d to x;\n", x);
15:
16: x = 1; /* reset x */
17: x += y;
18: printf("x += y assigns %d to x;\n", x);
19:
20: x = 1; /* reset x */
21: z = z * x + y;
22: printf("z = z * x + y assigns %d to z;\n", z);
23:
24: z = 10; /* reset z */
25: z = z * (x + y);
26: printf("z = z * (x + y) assigns %d to z;\n", z);
27:
28: z = 10; /* reset z */
29: z *= x + y;
30: printf("z *= x + y assigns %d to z.\n", z);
31:
32: return 0;
33: }
Đáp số:
22



Given x = 1, y = 3, and z = 10,
x = x + y assigns 4 to x;
x += y assigns 4 to x;
z = z * x + y assigns 13 to z;
z = z * (x + y) assigns 40 to z;
z *= x + y assigns 40 to z.
Toán tử tăng giảm
Toán tử tăng: ++ (cộng thêm 1) x = x+1  ++x
Toán tử giảm: (trừ đi 1) x = x-1  x
Phân biệt: y = x++ nghĩa là sau khi x cộng thêm 1 (x=x+1), mới gán cho y (y=x+1)
y = ++x nghĩa là y lấy giá trị của x ban đầu (y=x), sau đó x mới cộng
thêm 1 (x=x+1)
Ví dụ:
1: /* pre- or post-increment(decrement) operators */
2: #include <stdio.h>
3:
4: main()
5: {
6: int w, x, y, z, result;
7:
8: w = x = y = z = 1; /* initialize x and y */
9: printf("Given w = %d, x = %d, y = %d, and z = %d,\n", w, x, y,
z);
10:
11: result = ++w;
12: printf("++w gives: %d\n", result);
13: result = x++;
14: printf("x++ gives: %d\n", result);

15: result = y;
16: printf(" y gives: %d\n", result);
17: result = z ;
18: printf("z gives: %d\n", result);
19: return 0;
20: }
Kết quả:

Given w = 1, x = 1, y = 1, and z = 1,
++w gives: 2
x++ gives: 1
y gives: 0
z gives: 1
Tóan tử quan hệ
Kết quả các biểu thức có toán tử quan hệ thu được theo nguyên tắc đại số Boole.
23

Toán tử
Mô t
ả Toán tử
Mô t

= = Bằng < Nhỏ hơn
!= Không bằng >= Lớn hơn hoặc bằng
> Lớn hơn <= Nhỏ hơn hoặc bằng
Ví dụ:
1: /* Using relational operators */
2: #include <stdio.h>
3:
4: main()

5: {
6: int x, y;
7: double z;
8:
9: x = 7;
10: y = 25;
11: z = 24.46;
12: printf("Given x = %d, y = %d, and z = %.2f,\n", x, y, z);
13: printf("x >= y produces: %d\n", x >= y);
14: printf("x == y produces: %d\n", x == y);
15: printf("x < z produces: %d\n", x < z);
16: printf("y > z produces: %d\n", y > z);
17: printf("x != y - 18 produces: %d\n", x != y - 18);
18: printf("x + y != z produces: %d\n", x + y != z);
19: return 0;
20: }
Đáp số:
Given x = 7, y = 25, and z = 24.46,
x >= y produces: 0
x == y produces: 0
x < z produces: 1
y > z produces: 1
x != y - 18 produces: 0
x + y != z produces: 1
Tóan tử chuyển đổi kiểu
(data-type) x
Ví dụ: (float)5 có tác dụng chuyển integer 5 thành số float 5.0.
Ví dụ:
1: /* Using the cast operator */
2: #include <stdio.h>

3:
4: main()
5: {
6: int x, y;
7:
8: x = 7;
9: y = 5;
24

10: printf("Given x = %d, y = %d\n", x, y);
11: printf("x / y produces: %d\n", x / y);
12: printf("(float)x / y produces: %f\n", (float)x / y);
13: return 0;
14: }
Kết quả:
Given x = 7, y = 5
x / y produces: 1
(float)x / y produces: 1.400000
Bài tập
1. Với x = 3 và y = 6, z = x * y = = 18 bằng bao nhiêu?
3. Phân biệt:
printf("x++ produces: %d\n", x++);
printf("Now x contains: %d\n", x);

printf("x = x++ produces: %d\n", x = x++);
printf("Now x contains: %d\n", x);
4. Trong chương trình dưới đây, có cái gì sai ?
#include <stdio.h>

main()

{
int x, y;

x = y = 0;
printf("The comparison result is: %d\n", x = y);
return 0;
}



VII. Các lệnh biểu thị sự lặp lại
Nội dung:
Với phần này ta làm quen với các lệnh biểu thị các vòng lặp – sự lặp lại của một cụm
lệnh nào đó với một thông số nào đó thay đổi có quy luật.
 Lệnh for
 Lệnh while
 Lệnh do - while

25

Lệnh For
for (expression1; expression2; expression3) {
statement1;
statement2;
.
.
.
}
Trình tự: 1) Tính giá trị expression1; 2) Tính giá trị expression2; 3) Nếu giá
trị expression2 sai, nhảy khỏi lệnh For; nếu đúng, thực hiện

statement1,2…; 4) Tính giá trị expression3 và quay lại bước 2).
Ví du:
1: /* 07L01.c: Converting 0 through 15 to hex numbers */
2: #include <stdio.h>
3:
4: main()
5: {
6: int i;
7:
8: printf("Hex(uppercase) Hex(lowercase) Decimal\n");
9: for (i=0; i<16; i++){
10: printf("%X %x %d\n", i, i, i);
11: }
12: return 0;
13: }
Kết quả:
Hex(uppercase) Hex(lowercase) Decimal
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
A a 10
B b 11
C c 12

D d 13
E e 14
F f 15
Cảnh báo
Bởi vì câu lệnh trống (null statement – phần câu lệnh trong lệnh For chẳng hạn không có
gì cả) có nghĩa trong C, nên chú ý khi đặt lầm dấu ; sau câu for sẽ gây ra l
ỗi tính toán lớn.
Ví dụ
for (i=0; i<8; i++)
sum += i;

×