Tải bản đầy đủ (.doc) (57 trang)

Ngôn ngữ C 2

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 (547.41 KB, 57 trang )

Ngôn ngữ lập trình C
CHƯƠNG I:
SƠ LƯỢC VỀ NGÔN NGỮ C
I. LỊCH SỬ PHÁP TRIỂN CỦA NGÔN NGỮ C
C là một ngôn ngữ lập trình do Dennis M.Ritchie và W. Kernighan viết ra nhằm đáp
ứng nhu cầu của những nhà tin học trong việc xây dựng phần mềm hệ thống, hệ điều
hành. Nó được phát triển tại phòng thí nghiệm Bell vào những năm 1960 đầu 1970. Năm
1978 cuốn giáo trình “Ngôn ngữ lập trình C” do chính tác giả của ngôn ngữ được xuất
bản và phát triển rộng rãi.
Lúc đầu ngôn ngữ C được nghiên cứu và thao tác trên hệ điều hành UNIX, nhưng
nay đã được phát triển rộng rãi trên các hệ điều hành khác.
Thực tế, C đã tổ hợp được các thành tựu tiên tiến của tin học và đã trở thành một
chuẩn mặc nhiên trong tin học.
Không chỉ có C mà còn có rất nhiều Ngôn ngữ lập trình (NNLT) bậc cao khác,
chúng đều có một số nét chung như sau:
+ Quy định một số các ký tự dùng để viết chương trình, tập các ký tự này gọi là
Bảng chữ cái của ngôn ngữ.
+ Quy định một số từ đặc biệt với các chức năng khác nhau gọi là Từ khóa.
+ Quy định cấu trúc chung của một chương trình và các giai đoạn khi viết từng
phần của chương trình.
+ Tổ chứa một thư viện các chương trình con chuẩn hổ trợ người viết chương
trình.
+ Chương trình dịch.
II. BỘ TỪ VỰNG CỦA C
1. Bộ ký tự
- Gồm bộ chữ cái La Tin từ A(a) đến Z(z).
- Ký tự gạch nối: _
- Bộ chữ số từ 0 đến 9.
- Các ký hiệu toán học: + - * / = <> ( )
- Các ký hiệu đặc biệt: . , : ; [] % \ # $,…
2. Từ khoá


Là các từ dành riêng trong ngôn ngữ, mỗi ngôn ngữ có một bộ từ khoá riêng, mỗi
từ có một chức năng nhất định, nghĩa là khi lập trình bằng ngôn ngữ C chúng ta không
được sử dụng chúng vào những công việc khác như đặt tên cho biến, hàm, chương trình
con …
while
char
do
extern
goto
interrupt
register
sizeof
typedef
break
const
double
far
huge
long
return
static
union
case
continue
else
float
if
near
short
struct

unsigned
default
enum
for
int
signed
switch
void
Chú ý: Từ khoá phải được viết bằng chữ thường. Ngôn ngữ C phân biệt chữ hoa và
chữ thường, có nghĩa là INT sẽ khác với int.
3. Tên
Tên là một khái niệm rất quan trọng, nó dùng để phân biệt hay xác định các đại
lượng trong một chương trình. Chúng ta có tên hằng, tên biến, tên mảng, tên hàm, tên con
trỏ, tên cấu trúc, tên nhãn,… Tên phải được đặt theo qui tắc sau:
Trang: 1
Ngôn ngữ lập trình C
- Tên là một dãy các ký tự: chữ, số và dấu gạch nối ( _ ). Ký tự đầu của tên phải
là chữ hoặc là dấu gạch nối. Tên không được đặc trùng với từ khoá. Độ dài cực đại của
tên mặc định là 32.
- Chú ý: Trong các tên, chữ hoa và chữ thường được xem là khác nhau. Trong C
thường dùng chữ hoa để đặt tên cho các hằng và dùng chữ thường để đặt tên cho hầu hết
các đại lượng khác như biến, mảng, hàm, cấu trúc. Tuy nhiên đây không phải là điều bắt
buộc.
Ví dụ:
delta, temp, x1, y1 tên đúng
3xyz, r#2 tên sai
4. Dòng lệnh
Dòng lệnh là dòng ra lệnh cho chương trình thực hiện công việc mà người lập trình
đã định sẵn. Trong một chương trình có thể có một dòng lệnh hoặc nhiều dòng lệnh.
Cuối mỗi dòng lệnh phải có dấu chấm phẩy.

5. Khối lệnh
Khối lệnh là một dãy gồm nhiều dòng lệnh. Những dòng lệnh được bao trong cặp
ngoặc móc { }.
6. Lời giải thích
Chúng ta có thể dùng cặp dấu // hoặc /* <những dòng ghi chú> */ để chen vào
những dòng giải thích cho chương trình thêm sáng sủa, rõ ràng mà không ảnh hưởng đến
các phần khác và chương trình dịch khi biên dịch cũng bỏ qua những dòng này.
III. DẠNG CHUNG CỦA MỘT CHƯƠNG TRÌNH C
<khai báo thư viện>
[<khai báo các đối dữ liệu ngoài>]
[<khai báo nguyên mẫu của các hàm>]
void main( )
{
<khai báo biến>
<các dòng lệnh>
}
[<Định nghĩa các hàm>]
IV. NHỮNG ĐIỀU CẦN BIẾT KHI THỰC HÀNH C
1. Khởi động và thoát
- Khởi động: Vào chương trình DOS, chuyển đến thư mục chứa tập tin turbo.exe,
gõ lệnh turbo ↵ (Enter), cửa sổ của chương trình C xuất hiện.
- Thoát: Nhấn tổ hợp phím Alt+X, hoặc chọn menu File\Quit.
2. Cách soạn thảo và dịch một chương trình C
Các bước thực hiện:
- Mở cửa sổ soạn thảo bằng cách gõ phím F10+F, N.
- Gõ các lệnh của chương trình.
- Nhấn F2 để Save chương trình (tập tin có phần mở rộng .C).
- Biên dịch chương trình: Dùng tổ hợp phím Alt+F9. Nếu chương trình có lỗi,
những lỗi đó sẽ được hiển thị ở khung Message bên dưới, và dòng lệnh bị lỗi đầu tiên sẽ
có một vệt màu xanh chỉ định, gõ phím Enter vệt xanh sẽ biến mất và vị trí con trỏ nằm

sát ngay chỗ sai đầu tiên của chương trình. Sau khi sửa sai (nếu có) thì tiến hành biên
dịch lại cho tới khi chương trình không còn lỗi.
- Chạy chương trình: Dùng tổ hợp phím Ctl+F9.
3. Các thao tác cơ bản thường sử dụng
F2: Save chương trình.
F10+F, N: Mở một cửa sổ soạn thảo mới.
F6: di chuyển cửa sổ cuối cùng lên trên cùng.
F3: Mở một file đã được save trước đó.
Trang: 2
Ngôn ngữ lập trình C
F10: Gọi thanh menu.
Ctrl+K, B: Định đầu khối.
Ctrl+K, K: định cuối khối.
Ctrl+K, C: Sao chép một khối.
Ctrl+K, V: Di chuyển một khối.
Ctrl+K, Y: Xóa một khối.
Ctrl+K, H: Bỏ chọn một khối
Trang: 3
Ngôn ngữ lập trình C
CHƯƠNG II:
HẰNG, BIẾN VÀ MẢNG
I. CÁC KIỂU DỮ LIỆU
Trong C có các kiểu dữ liệu sau:
* Kiểu nguyên:
Tên kiểu Kích thước Phạm vi
char 1 byte -2
7
… 2
7
unsigned char 1 byte 0 … 2

8
– 1
int 2 bytes -2
15
… 2
15
– 1
unsigned int 2 bytes 0 … 2
16
– 1
short 2 bytes 0 … 2
16
– 1
long 4 bytes -2
31
… 2
31
– 1
unsigned long 4 bytes 0 … 2
32
- 1
* Kiểu dấu phẩy động:
Tên kiểu Kích thước Phạm vi
float 4 bytes 3.4E –38 … 3.4E +38
double 8 bytes 1.7E –308 … 1.7E +308
long double 10 bytes 3.4E –4932 …3.4E +4932
II. HẰNG
Hằng là một đại lượng mà giá trị của nó không thay đổi trong quá trình tính toán.
Sau đây là một số loại hằng được sử dụng trong C:
1. Hằng số:

* Hằng dấu phẩy động (float và double):
Thường được viết theo 2 cách:
Cách 1 (dạng thập phân): Số gồm phần nguyên và phần phân cách nhau bởi
dấu chấm. Phần nguyên và phần phân có thể vắng mặt nhưng dấu chấm thập phân bắt
buộc phải có.
Ví dụ:
123.456 , .34 (=0.34) , 15. (=15.0)
Cách 2 (dạng khoa học hay dạng mũ): Số gồm phần định trị và phần bậc hai
phần này cách nhau bởi chữ e hoặc E. Phần định trị có thể là một số nguyên hoặc số thực
dạng thập phân. Phần bậc phải là một số nguyên.
Ví dụ:
123.456E-4 (=0.0123456)
0.12E3 (=120.0)
* Hằng nguyên (int và long):
Hằng int là số nguyên có giá trị trong khoảng từ -32768 đến 32767. Nếu số vượt
quá miền giá trị này thì nó sẽ thuộc hằng long. Hằng long được viết bằng cách thêm L
hoặc l vào cuối số.
Ví dụ:
-45 , 4007 , 4568946L
* Hằng hệ bát phân (hệ 8):
Được viết như hằng int với số 0 đứng đầu, dạng như sau: 0c1c2c3… với ci là số
nguyên trong khoảng từ 0 đến 7.
Ví dụ:
0345 (=229 hệ 10)
Trang: 4
Ngôn ngữ lập trình C
* Hằng thập lục phân (hệ 16):
Được viết dưới dạng: 0xc1c2c3… hoặc 0Xc1c2c3… với ci là một trong các ký
tự sau: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 và
Cách viết Ý nghĩa

A hoặc a 10
B hoặc b 11
C hoặc c 12
D hoặc d 13
E hoặc e 14
F hoặc f 15
Ví dụ:
0xA9 (=169 hệ 10)
2. Hằng ký tự:
Là một ký tự riêng biệt được viết trong 2 dấu nháy đơn. Giá trị của hằng ký tự là số
thứ tự của ký tự đó trong bảng mã ASCII. Vì vậy hằng ký tự có thể tham gia vào các
phép toán như mọi số nguyên khác.
Ví dụ:
‘0’ (có giá trị 48)
‘a’ (có giá trị 65)
Đối với một vài hằng ký tự đăc biệt ta cần thêm dấu \ phía trước như sau:
Cách viết Ký tự
‘\’’ ’
‘\”’ ”
‘\\’ \
‘\n’ chuyển dòng
‘\t’ tab
‘\b’ backspace
‘\r’ CR (về đầu dòng)
‘\f’ sang trang
‘\0’ null
Ví dụ:
printf(“\nKý tu can in len man hinh la: ”);  in ra một hằng chuỗi ký tự
printf(“%c%c”,65,66);  in ra 2 ký tự A, B
3. Hằng chuỗi ký tự:

Là một dãy ký tự bất kỳ (gồm 0 hoặc nhiều ký tự) được đặt trong 2 dấu nháy kép.
Chuỗi ký tự này được lưu trong máy dưới dạng một mảng các ký tự. Trình biên dịch tự
động thêm ký tự null (\0) vào cuối mỗi chuỗi để báo hiệu là đã kết thúc chuỗi ký tự.
Ví dụ:
“Ha Noi”
“Hai Phong”
“” \\chuỗi rổng
Chú ý: Cần phân biệt ‘a’ và “a”, ‘a’ là hằng ký tự được lưu trong 1 byte, còn “a” là
hằng chuỗi ký tự được lưu trữ trong một mảng hai phần tử gồm ký tự a và ký tự \0.
4. Tên hằng:
Để định nghĩa một tên hằng ta dùng toán tử #define với cú pháp như sau:
#define <tên hằng> <giá trị của hằng>
Ví dụ:
#define MAX 1000
#define KT “Khoa cong nghe thong tin”
Trong chương trình nếu chúng ta sử dụng tên MAX thì sẽ được thay bằng giá trị
1000, còn nếu sử dụng tên KT thì sẽ được thay bằng chuỗi “Khoa cong nghe thong tin”.
Trang: 5
Ngôn ngữ lập trình C
III. BIẾN
1. Khái niệm:
- Biến là vùng trống trong bộ nhớ và được đặt tên để tiện tham khảo.
- Tên biến phải tuân thủ theo qui tắc đặt tên đã được nêu ở chương 1.
- Tên biến thường được viết bằng chữ thường.
- Biến ngoài: Là biến được khai báo ngoài tất cả các hàm (kể cả hàm main).
2. Khai báo:
- Mọi biến cần phải khai báo trước khi sử dụng.
- Cú pháp:
<tên kiểu> <tên biến 1> [,<tên biến 2>…]
Ví dụ:

int x, y // khai báo 2 biến có tên x, y có kiểu int
char ch // khai báo biến có tên ch kiểu char.
- Vị trí khai báo biến: Các khai báo biến cần đặt ngay sau dấu { đầu tiên của thân
hàm (hoặc bắt đầu một khối lệnh) và cần đứng trước mọi câu lệnh khác.
Ví dụ:
void main()
{
int a, b, c; // vị trí khai báo đúng
a = 35
int d; // vị trí khai báo sai

}
- Khởi tạo giá trị ban đầu cho biến: Để khởi tạo giá trị cho biến ta phải dùng toán tử
gán (=). Chúng ta có thể vừa khai báo, vừa gán trị cho biến hoặc cũng có thể gán trị cho
biến sau khi đã khai báo biến.
Ví dụ:
int x = 20, y = 30 // vừa khai báo vừa gán trị
int a, b, c
a = 20, b = 30, c = 40 // gán trị sau khi đã khai báo biến
- Các biến ngoài khi chưa được gán trị mà được một hàm gọi tới sẽ được gán giá trị
là 0.
- Lấy địa chỉ của biến: Mỗi biến đều được cấp phát một vùng nhớ gồm một số
bytes liên tiếp dựa vào kiểu của biến. Địa chỉ của byte đầu tiên chính là địa chỉ của biến.
Để lấy địa chỉ của biến dùng cú pháp sau:
&<tên biến>
IV. KIỂU ENUM
- Kiểu enum giúp chúng ta định nghĩa một tập hợp những hằng có kiểu int, dạng
chung như sau:
enum [<tên kiểu>] {<tên hằng 1> [=<giá trị 1>],…} [<tên biến 1> [,<tên biến 2>]…];
Trong đó:

[<tên kiểu>]: Là tên của một kiểu dữ liệu mới.
<tên hằng 1> [=<giá trị 1>]: định nghĩa một <tên hằng> mà giá trị của nó sẽ
được chỉ ra trong điều khoản <giá trị>. Nếu điều khoản <giá trị> không được sử dụng thì
giá trị của <tên hằng> sẽ là <giá trị> của tên hằng đứng trước nó cộng với 1 biết rằng
<giá trị> của hằng đầu tiên là 0.
[<tên biến 1> [,<tên biến 2>]…]: là danh sách các biến kiểu enum.
Ví dụ:
enum {T0, T1, T2};
enum day {cn, t2, t3, t4, t5, t6, t7} n1, n2;
enum hso {h1=30, h2=40, h3, h4} // h3 có giá trị là 41, h4 là 42
Trang: 6
Ngôn ngữ lập trình C
- Nếu điều khoản <tên kiểu> có tồn tại thì sau này chúng ta có thể sử dụng cụm từ
enum <tên kiểu> để khai báo các biến enum theo mẫu:
enum <tên kiểu> <danh sách các biến>;
Ví dụ:
enum day n3, n4;
- Biến kiểu enum thực chất là biến nguyên, nó được cấp phát 2 bytes bộ nhớ và nó có
thể nhận một giá trị nguyên bất kỳ
- Ví dụ:
#include <stdio.h>
#include <conio.h>
void main( )
{
enum {T0, T1, T2};
enum day {cn, t2, t3, t4, t5, t6, t7};
enum day n2;
int i,j=2000, k =T2;
i = t7;
n1 = -1000;

n2 = j;
printf(“\n n1 = %d n2=%d i=%d”, n1, n2, i);
printf(“\n k=%d T1=%d”, k, T1);
getch( );
}
V. MẢNG
1. Khái niệm:
Mảng là một tập hợp các phần tử có cùng kiểu và có chung một tên. Mỗi phần tử
mảng chứa đựng một giá trị tùy theo kiểu của mảng. Chúng ta có thể có mảng kiểu float,
int, char,.. có bao nhiêu kiểu biến thì cũng có bấy nhiêu kiểu mảng.
2. Khai báo:
- Cú pháp:
<kiểu dữ liệu> <tên mảng>[<số phần tử>][[<số phần tử>]…]
- Ví dụ:
int a[10]; // mảng có tên là a, 1 chiều, có 10 phần tử,
// mỗi phần tử có kiểu int và chiếm 2 bytes trong bộ nhớ
int b[4][2]; // mảng tên là b, 2 chiều, 4 dòng và 2 cột tức có 8 phần tử kiểu int,
// mỗi phần tử chiếm 2 bytes trong bộ nhớ
float x[5], y[3][3]; // mảng x là mảng 1 chiều có 5 phần tử kiểu float,
// mỗi phần tử chiếm 4 bytes bộ nhớ
// mảng b là mảng 2 chiều, có 9 phần tử kiểu float
- Chú ý:
+ Các phần tử mảng được đánh số từ 0.
Ví dụ:
int a[3]; // có 3 phần tử: a[0], a[1], a[2]
+ Các phần tử mảng được cấp phát các vùng nhớ liên tiếp nhau trong bộ nhớ.
+ Các phần tử mảng hai chiều được cấp phát theo hàng.
Ví dụ:
void main( )
{

clrscr( );
int a[2][2], i, j;
for(i=0; i<2; i++)
for(j=0; j<2; j++)
Trang: 7
Ngôn ngữ lập trình C
printf(“%ld ”,&a[i][j]);
getch( );
}
3. Truy xuất:
- Cú pháp:
<tên mảng>[<chỉ số>] [[<chỉ số>]…]
- Ví dụ:
a[0] // truy xuất phần tử thứ 0 của mảng a
a[1] // truy xuất phần tử thứ 1 của mảng a
b[0][1] // truy xuất phần tử hàng 0 cột 1 của mảng b
void main( )
{
clrscr( );
int a[4]={1,2,3,4};
for(i=0; i<4; i++)
printf(“%d ”, a[i]);
getch( );
}
- Chú ý: Khi chỉ số vượt ra ngoài kích thước mảng (tức truy xuất phần tử nằm
ngoài mảng), máy vẫn không báo lỗi, nhưng nó sẽ truy nhập đến một vùng nhớ bên ngoài
mảng và có thể làm rối loạn chương trình.
4. Lấy địa chỉ phần tử mảng:
- Chúng ta có thể lấy địa chỉ của mảng một chiều nhưng không được phép lấy địa
chỉ của mảng nhiều chiều.

Ví dụ:
&a[i] // chấp nhận
&b[i][j] // không chấp nhận
- Tên mảng biểu thị địa chỉ đầu của mảng.
Ví dụ:
a = &a[0]
Trang: 8
Ngôn ngữ lập trình C
CHƯƠNGIII:
BIỂU THỨC
I. THẾ NÀO LÀ BIỂU THỨC?
Biểu thức là sự kết hợp giữa các toán hạng và toán tử để diễn đạt một công thức
toán học nào đó và có thể ước tính thành một giá trị. Như vậy hằng, biến, phần tử mảng,
hàm cũng được xem là biểu thức. Chúng ta có thể dùng cặp dấu ngoặc tròn ( ) để thể hiện
đúng trình tự tính toán trong biểu thức.
Ví dụ:
P = (a + b + c)/2; \\ bieu thuc tinh nua chu vi tam giac
S = a*b \\ bieu thuc tinh dien tich hinh chu nhat
II. CÁC PHÉP TOÁN
1. Phép toán số học
Các phép toán số học 2 ngôi:
Ký hiệu Phép toán
+
-
*
/
%
Cộng
Trừ
Nhân

Chia lấy nguyên (không áp dụng cho kiểu float hoặc double)
Chia lấy dư (không áp dụng cho kiểu float hoặc double)
Ví dụ:
25/8 = 8
25%3 = 1
Phép toán số học một ngôi: Là phép toán lấy âm một số ( - ).
Ví dụ:
-(a + b)
2. Các phép thao tác bit
Các phép toán sau đây cho phép xử lý đến từng bit của một số nguyên. Các toán tử
này không thực hiện trên các kiểu float và double.
Phép toán Ý nghĩa Ví dụ
&
|
^
<<
>>
~
Phép và (AND) theo bit
Phép hoặc (OR) theo bit
Phép hoặc loại trừ (XOR)
theo bit
Dịch trái
Dịch phải
Lấy phần bù theo bit
a & b
a | b
a ^ b
a << 4
a >> 4

~a
Qui tắc:
a b a & b a | b a ^ b
1
1
0
0
1
0
1
0
1
0
0
0
1
1
1
0
0
1
1
0
a << N = a*2
N
a >> N = a/2
N
~1 = 0
~0 = 1
Trang: 9

Ngôn ngữ lập trình C
Ví dụ:
0xa1b6 & 0xff = 0xb6
0xa1b6 | 0xff = 0xa1ff
0xa1b6 ^ 0xffff = 0x5e49
0xa1b6 << 8 = 0xb600
0xa1b6 >> 8 = 0xa1
~0xa1b6 = 0x5e49
3. Phép toán quan hệ và logic
Phép toán quan hệ:
Phép toán Ý nghĩa Ví dụ
>
>=
<
<=
= =
!=
Lớn hơn
Lớn hơn bằng
Nhỏ hơn
Nhỏ hơn bằng
Bằng
Khác
3 > 7 trả về 0
3 >= 8 trả về 1
9 < 9 trả về 0
3 <= 10 trả về 1
3 = = 9 trả về 0
3 != 9 trả về 1
Phép toán logic:

Phép toán Ý nghĩa
&&
||
!
Phép toán và (AND)
Phép toán hoặc (OR)
Phép phủ định (NOT)
Qui tắc: Trong C không có kiểu boolean (kiểu logic) nên không có giá trị True
và False mà thay vào đó ta sử dụng 0 và 1:
a b a && b a || b
0
0
khác 0
khác 0
0
khác 0
0
khác 0
0
0
0
1
0
1
1
1
a ! a
0
khác 0
1

0
Ví dụ:
3 && 7 \\ trả về giá trị 1
3 || 7 \\ trả về giá tị 1
! 15.6 \\ trả về giá trị 0
3 && 0 \\ trả về giá trị 0
4. Phép toán tăng giảm:
- C đưa ra hai phép toán 1 ngôi (++ và --) để tăng hoặc giảm các biến (nguyên và
thực):
a++, ++a : tương đương với a = a+1
a--, --a : tương đương với a = a-1
- Tuy nhiên, a++ và ++a là khác nhau:
a++ : dùng biến rồi mới tăng trị.
++a : tăng trị rồi mới dùng biến.
- Tương tự cho a-- và --a.
Trang: 10
Ngôn ngữ lập trình C
- Ví dụ:
int a = 5, x;
x = a++ // lúc này x = 5, a = 6
int a = 5, x;
x = ++a // lúc này x = 6, a = 6
III. CÂU LỆNH GÁN VÀ BIỂU THỨC
- Phép gán có dạng: a = b
Trong đó a là một biến hoặc một phần tử mảng, b là một biểu thức. Lệnh gán sẽ lấy
giá trị của b cất giữ vào a và kiểu là kiểu của a.
Ví dụ:
a = 5 // biến a có giá trị là 5
a = b = c = d = 8 // biến a, b, c và d đều có giá trị là 8
z = (y = 2)*(x = 6) // 6 gán cho x, 2 gán cho y và 12 gán cho z

- Câu lệnh gán cũng có thể có dạng: a = a + b hoặc có thể viết gọn a + = b.
Lệnh gán sẽ lấy giá trị của a cộng với b và gán lại cho a.
Ví dụ:
int i = 2; // biến i có giá trị là 2
i = i + 1; // biến i có giá trị là 3
i + = 4; // biến i có giá trị là 7
Tương tự, có thể áp dụng cho toán tử - * / %
Ví dụ:
int i = 4; // biến i có giá trị là 4
i = i*2; // biến i có giá trị 8
i / = 2; // biến i có giá trị 4
i %= 2; // biến i có giá trị 0
IV. CHUYỂN ĐỔI KIỂU GIÁ TRỊ
- Việc chuyển đổi kiểu xẩy ra:
+ Khi biểu thức gồm các toán hạng khác kiểu.
+ Trong phép gán.
+ Trong việc truyền giá trị các tham số thực cho các đối của hàm.
+ Trong câu lệnh return.
- Việc chuyển đổi kiểu thường được thực hiện tự động theo qui luật:
+ Nếu trong biểu thức có hai toán hạng có kiểu khác nhau thì kiểu thấp hơn sẽ được
nâng thành kiểu cao hơn trước khi thực hiện phép toán như:
giữa int và long thì int sẽ chuyển thành long;
giữa int và float thì chuyển int thành float;
giữa float và double thì chuyển float thành double,…
Ví dụ:
int x;
float y, z;
x = 11/3; // x có giá trị là 3
y = 1.5*x // y có giá trị là 4.5
z = 1.5*11/3 // z có giá trị là 5.5

+ Trong phép gán: Kiểu vế phải được chuyển sang kiểu vế trái.
Ví dụ:
int x;
float y = 12.5;
x = y; // x có giá trị là 12
- Tuy nhiên, chúng ta cũng có thể ép thành một kiểu như ý muốn theo dạng:
(<tên kiểu>) <biểu thức>
Trang: 11
Ngôn ngữ lập trình C
Ví dụ:
int x;
float y, z;
x = 11/3; // x có giá trị là 3
y = 11/3; // y cũng có giá trị là 3
z = (float) 11/3; // z có giá trị là 3.666667
V. BIỂU THỨC ĐIỀU KIỆN
- Biểu thức điều kiện có dạng:
e1 ? e2 : e3
Trong đó: e1, e2, e3 là các biểu thức. Nếu e1 khác 0 thì e2 sẽ là giá trị của biểu thức
điều kiện, ngược lại e3 là giá trị của biểu thức điều kiện.
- Ví dụ:
int a = 8, b = 9, c;
printf(“So lon la: %d”,a>b?a: b); // So lon la: 9
c = 1 ? 2:3 // biến c chứa giá trị là 2
c = 0 ? 2:3 // biến c chứa giá trị là 3
VI. THỨ TỰ ƯU TIÊN CỦA CÁC PHÉP TOÁN
Sau đây là bảng tóm tắt về thứ tự ưu tiên của các toán tử:
Stt Phép toán
1 ( ) [] ->
2 ! ~ ++ -- (type)

(ép kiểu)
*
(con trỏ)
& sizeof
3 *
(phép nhân)
/ %
4 + -
5 << >>
6 < <= > >=
7 = = !=
8 &
(and bit)
9 ^
10 |
11 &&
12 ||
13 ? :
14 = += -= *= /= %= <<= >>= &= ^= /=
15 ,
- Các toán tử trên cùng một hàng thì có cùng một độ ưu tiên.
- Các hàng được sắp theo độ ưu tiên giảm dần tức là các toán tử ở hàng trên sẽ có
độ ưu tiên hơn các toán tử ở hàng dưới.
- Toán tử sizeof dùng để trả về kích cở tính bằng byte của một kiểu dữ liệu (int,
float,…) hay một đối tượng dữ liệu (biến, mảng…).
+ Cú pháp: sizeof (<kiểu dữ liệu>)
sizeof(<đối tượng dữ liệu>)
+ Ví dụ:
double x[] = {23.5, 78, 49.3, 0.764};
void main( )

{
int n = sizeof(x) / sizeof(double);
clrscr( );
printf(“So phan tu co trong mang la: %d”, n);
getch( );
Trang: 12
Ngôn ngữ lập trình C
}
- Chú ý: Các lời gọi hàm, các câu lệnh gán lồng nhau và các toán tử tăng, giảm đều
có thể tạo ra “hiệu ứng phụ” (hiệu ứng lề) tức là một số biến bị thay đổi do việc tính toán
của biểu thức tạo ra. Các hiệu ứng này phụ thuộc vào trật tự tính toán và các biến tham
gia trong biểu thức. Các hiệu ứng phụ có thể gây ra các kết quả khác nhau tùy theo từng
trình biên dịch C và tùy theo các máy khác nhau.
Ví dụ:
a[i] = i++;
Tùy mỗi trình biên dịch mà có thể hiểu chỉ số mảng sẽ lấy giá trị cũ hay giá trị
mới.
Trang: 13
Ngôn ngữ lập trình C
CHƯƠNG IV:
NHẬP XUẤT TRÊN C
I. CÁC HÀM NHẬP, XUẤT TRONG STDIO.H
1. Các hàm xuất
a. Hàm printf
- Cú pháp:
printf(control, arg1, arg2,…)
- Ý nghĩa:
Hàm printf có khả năng chuyển dạng, tạo khuôn và đưa giá trị các đối ra màn
hình.
- Giải thích:

Control: Là một chuỗi điều khiển, nó có thể chứa 3 loại ký tự:
+ Các ký tự điều khiển:
\n Sang dòng mới
\f Sang trang mới
\b Lùi lại một bước
\t Dấu tab
+ Các ký tự đặc tả có dạng:
% [cờ] [chiều rộng] [. độ chính xác] <kiểu>
[cờ]: Dùng để canh chỉnh dạng số liệu:
Nếu không có cờ số liệu sẽ lệch phải.
Nếu khai báo cờ là dấu - thì số liệu sẽ lệch trái.
Nếu khai báo cờ là dấu + thì số liệu sẽ có dấu + hoặc - tùy số liệu
dương hay âm.
Nếu khai báo cờ là khoảng trống (blank) số liệu sẽ mang dấu -
khi âm.
Nếu khai báo cờ là # thì số thực luôn có dấu chấm thập phân.
[chiều rộng]: Là độ dài tối đa để xuất số liệu, tính luôn phần thập
phân và dấu chấm phân cách. Nếu [chiều rộng] có dạng 0n và dữ liệu canh phải thì phần
dư thừa bên trái sẽ được lấp đầy bằng những con số 0, còn nếu [chiều rộng] có dạng n và
dữ liệu canh phải thì phần dư thừa bên trái được lấp đầy bằng những khoảng trống.
Khi chúng ta bỏ qua điều khoản này hoặc [chiều rộng]
nhỏ hơn độ dài thực tế của dữ liệu ra thì chiều rộng sẽ là độ dài thực tế của dữ liệu ra.
[. độ chính xác]: Dùng để khai báo phần thập phân có bao nhiêu số
lẻ.
<kiểu>: Chỉ định đối in ra có kiểu dữ liệu nào.
<kiểu> Kiểu của đối tương ứng
c Dữ liệu có kiểu char hay unsigned char
d i Dữ liệu có kiểu int hoăc short
u Dữ liệu có kiểu unsigned int hoặc unsigned short
o Dữ liệu có kiểu int và khi in ra tự động đổi thành hệ 8 (hệ bát phân)

x Dữ liệu có kiểu int và khi in ra tự động đổi thành hệ 16 (thập lục
phân) và dùng các ký tự a, b, c, d, e, f để biểu diễn 10, 11, 12, 13, 14,
15
X Dữ liệu có kiểu int và khi in ra tự động đổi thành hệ 16 (thập lục
phân) và dùng các ký tự A, B, C, D, E, F để biểu diễn 10, 11, 12, 13,
14, 15
f Dữ liệu có kiểu float
e Dữ liệu có kiểu float được in theo dạng khoa học
g Dữ liệu có kiểu float được in ra dưới dạng dấu chấm thập phân hay
Trang: 14
Ngôn ngữ lập trình C
số mũ tùy thuộc vào dữ liệu có giá trị như thế nào và độ rộng truy
xuất ra sao. Sô mũ được in dưới dạng e.
G Dữ liệu có kiểu float được in ra dưới dạng dấu chấm thập phân hay
số mũ tùy thuộc vào dữ liệu có giá trị như thế nào và độ rộng truy
xuất ra sao. Sô mũ được in dưới dạng E.
li ld lo lx lX Dữ liệu có kiểu long
Le LE Lg LG Lf Dữ liệu có kiểu long double
+ Các ký tự không thuộc vào những ký tự điều khiển hay đặc tả gọi là
những ký tự hiển thị sẽ được in trực tiếp ra màn hình.
arg1, arg2,…: Các đối cần được phân cách nhau bởi dấu phẩy. Đối có thể là
một hằng, một biến, một phần tử mảng, một lời gọi hàm hay nói chung là một biểu thức
bất kỳ. Giá trị của đối sẽ được chuyển dạng và in ra theo cách của đặc tả tương ứng. Một
điều cần chú ý ở đây là mỗi đặc tả cần có một đối tương ứng. Khi mà một đặc tả không
tìm thấy đối tương ứng hoặc khi kiểu giá trị của đối tương ứng không tương thích với ký
tự chuyển dạng thì máy sẽ bị lẫn lộn và có thể đưa ra những kết quả vô nghĩa.
Số đối có thể lớn hơn số đặc tả, khi đó những đối cuối cùng
không có đặc tả tương ứng sẽ không được in ra.
- Ví dụ:
#include <stdio.h>

void main( )
{
int i = 1234, j = -2222;
float f = 2345.23;
long l = 1234556;
clrscr( );
printf(“%+d \n%-d \n%010.1f \n%10.1f \n%g”,i ,j ,f ,f , l);
getch( );
}
b. Hàm puts
- Cú pháp:
int puts (const char *s);
- Ý nghĩa:
Xuất chuỗi s lên màn hình và chuyển con nhấp nháy sang dòng mới. Khi
thành công hàm trả về ký tự cuối cùng chính là ký tự \n, khi có lỗi hàm trả về EOF.
- Giải thích:
s là con trỏ trỏ tới vùng nhớ chứa chuỗi ký tự cần xuất.
c. Hàm putchar
- Cú pháp:
int putchar (int c);
- Ý nghĩa:
Đưa một ký tự ra stdout. Khi thành công hàm trả về ký tự được xuất, khi có
lỗi hàm trả về EOF.
2. Các hàm nhập
a. Hàm scanf:
- Cú pháp:
int scanf (control, agr1, agr2,…)
- Ý nghĩa:
Hàm scanf có nhiều chức năng tương tư như hàm printf nhưng theo chiều
ngược lại. Nó đọc thông tin từ thiết bị vào chuẩn (bàn phím), chuyển dịch chúng (thành

số nguyên, số thực,…) và lưu trữ vào bộ nhớ theo các địa chỉ mà chúng ta chỉ định.
Trang: 15
Ngôn ngữ lập trình C
- Giải thích:
control: Bao gồm các ký tự đặc tả chuyển dạng, mỗi đặc tả chuyển dạng
tương ứng với một đối. Chuỗi này có dạng tổng quát như sau:
%[*][d…d] <ký tự chuyển dạng>
[*]: Dữ liệu tương ứng vẫn được đọc vào nhưng giá trị của nó sẽ không
được lưu vào bộ nhớ. Như vậy đặc tả chứa dấu * sẽ không có đối tương ứng.
[d…d]: Là một dãy số xác định chiều dài cực đại của dữ liệu vào. Nếu
điều khoản này bị bỏ qua hay giá trị của nó lớn hơn hoặc bằng độ dài dữ liệu vào thì toàn
bộ dữ liệu đó sẽ được đọc vào và gán cho địa chỉ tương ứng. Nếu giá trị của nó nhỏ hơn
độ dài dữ liệu vào thì chỉ phần đầu dữ liệu được đọc vào và gán cho địa chỉ tương ứng,
phần còn lại sẽ được xem xét bởi các đặc tả và đối tương ứng tiếp theo.
<ký tự chuyển dạng>: Gồm các dạng sau:
<ký tự chuyển dạng> <Ý nghĩa>
c Vào một ký tự, đối tương ứng là con trỏ ký tự. Có xét ký tự
khoảng trắng.
d Vào một giá trị kiểu int, đối tương ứng là con trỏ kiểu int, dữ
liệu nhập vào là số nguyên.
ld Vào một giá trị kiểu long, đối tương ứng là con trỏ kiểu long,
dữ liệu vào phải là số nguyên.
o Vào một giá trị kiểu int hệ 8, đối tương ứng là con trỏ kiểu int,
dữ liệu vào phải là số nguyên hệ 8.
lo Vào một giá trị kiểu long hệ 8, đối tương ứng là con trỏ kiểu
long, dữ liệu vào phải là số nguyên hệ 8.
x Vào một giá trị kiểu int hệ 16, đối tương ứng là con trỏ kiểu int,
dữ liệu vào phải là số nguyên hệ 16.
lx Vào một giá trị kiểu long hệ 16, đối tương ứng là con trỏ kiểu
long, dữ liệu vào phải là số nguyên hệ 16.

f hay e Vào một giá trị kiểu float, đối tương ứng là con trỏ kiểu float,
dữ liệu vào phải là số có dấu phẩy động.
lf hay le Vào một giá trị kiểu double, đối tương ứng là con trỏ kiểu
double, dữ liệu vào phải là số có dấu phẩy động.
s
Vào một chuỗi ký tự, đối tương ứng là con trỏ kiểu char trỏ tới
vùng nhớ đủ lớn để chứa được chuỗi ký tự và dấu kết thúc \0 sẽ
được tự động thêm vào, dữ liệu vào là dãy ký tự bất kỳ không
chứa các dấu cách và dấu xuống dòng \n.
[dãy ký tự]
Các ký tự trên dòng sẽ lần lượt đọc vào cho đến khi nào gặp
một ký tự không thuộc tập các ký tự đặt trong hai dấu []. Đối
tương ứng là con trỏ kiểu char trỏ tới một vùng nhớ đủ lớn, dữ
liệu nhập là một chuỗi ký tự bất kỳ kể cả khoảng trắng.
[^dãy ký tự]
Các ký tự trên dòng sẽ lần lượt đọc vào cho đến khi nào gặp
một ký tự thuộc tập các ký tự đặt trong hai dấu []. Đối tương
ứng là con trỏ kiểu char trỏ tới một vùng nhớ đủ lớn, dữ liệu
nhập là một chuỗi ký tự bất kỳ kể cả khoảng trắng.
agr1, agr2,…: Các đối phải được ngăn cách nhau bởi dấu phẩy. Mỗi đối là
một con trỏ chứa địa chỉ của một vùng nhớ (địa chỉ biến, mảng,…) dùng để lưu trữ giá trị
đọc vào từ bàn phím.
Trang: 16
Ngôn ngữ lập trình C
- Ví dụ 1:
#include <stdio.h>
#include <conio.h>
void main()
{
//bat dau chuong trinh chinh

char ch[20];
int i,j;
float f;
long l;
clrscr();
printf("Nhap mot day so tu ban phim: ");
scanf("%s %d %d %f %ld",ch,&i,&j,&f,&l);
printf("\nch=%s \ti=%d \tj=%d \tf=%5.2f \tl=%ld",ch,i,j,f,l);
getch();
//ket thuc chuong trinh chinh
}
Với dòng nhập: abcdef 12 34 56.5 22222
Kết quả: abcdef gán cho ch
12 gán cho i
34 gán cho j
56.5 gán cho f
22222 gán cho l
- Ví dụ 2:
#include <stdio.h>
#include <conio.h>
void main()
{
//bat dau chuong trinh chinh
char ch1[20],ch2[20];
clrscr();
printf("Bat dau nhap du lieu tu ban phim: ");
scanf("%[0123456789] %[^0123456789]",ch1,ch2);
printf("\nch1=%s \tch2=%s",ch1,ch2);
getch();
//ket thuc chuong trinh chinh

}
Với dòng nhập: 1234 abcdef12
Kết quả: 1234 gán cho ch1
abcdef gán cho ch2
b. Hàm gets:
- Cú pháp:
char* gets (char *s);
- Ý nghĩa:
Nhận một chuỗi ký tự từ stdin cho đến khi gặp ‘\n’. Ký tự ‘\n’ bị loại khỏi
stdin nhưng không được đưa vào chuỗi. Chuỗi được bổ sung thêm ký tự kết thúc ‘\0’ và
đặt vào vùng nhớ do s trỏ tới. Hàm trả về chuỗi nhận được.
Trang: 17
Ngôn ngữ lập trình C
- Giải thích:
s là con trỏ trỏ tới vùng nhớ chứa chuỗi ký tự nhận được.
- Ví dụ:
#include <stdio.h>
#include <conio.h>
void main( )
{
//bat dau chuong trinh chinh
char hoten[30];
clrscr( );
puts("Nhap vao ho ten: ");
gets(hoten);
puts(hoten);
getch( );
//ket thuc chuong trinh chinh
}
c. Hàm getchar

- Cú pháp:
int getchar (void);
- Ý nghĩa:
Nhận một ký tự từ stdin. Hàm trả về ký tự nhận được.
- Ví dụ:
#include <stdio.h>
#include <conio.h>
void main()
{
//bat dau chuong trinh chinh
int ch;
clrscr();
ch = getchar();
putchar(ch);
getch();
//ket thuc chuong trinh chinh
}
II.CÁC HÀM NHẬP, XUẤT TRONG CONIO.H
1. Hàm putch:
- Cú pháp:
int putch (int ch);
- Ý nghĩa:
Xuất ký tự ch lên cửa sổ văn bản màn hình. Ký tự sẽ được hiển thị theo màu xác
định trong hàm textcolor. Đây là sự khác nhau với hàm putchar. Hàm putchar luôn hiển
thị ký tự theo màu trắng.
Hàm trả về ký tự được hiển thị.
- Giải thích:
ch: Chứa mã ký tự cần hiển thị.
Trang: 18
Ngôn ngữ lập trình C

2. Hàm getch:
- Cú pháp:
int getch(void);
-Ý nghĩa:
Nhận một ký tự từ bộ đệm bàn phím nếu như trong đó đã có sẵn ký tự, ngược lại
thì máy tạm dừng cho đến khi có một ký tự được gõ, hàm sẽ nhận ngay không cần enter.
Ký tự vừa gõ không được hiện lên màn hình.
Hàm trả về ký tự nhận được.
3. Hàm getche:
- Cú pháp:
int getche(void);
- Ý nghĩa:
Hàm này làm việc giống như hàm getch( ), chỉ có một điểm khác là cho hiện ký
tự được gõ lên màn hình.
4. Hàm kbhit:
- Cú pháp:
int kbhit(void);
- Ý nghĩa:
Hàm trả về giá trị khác 0 nếu bộ đệm bàn phím khác rỗng, ngược lại trả về 0.
Nếu gõ phím khi máy dừng chờ trong các hàm scanf, gets và getchar thì ký tự
được gởi vào stdin. Gõ phím trong các trường hợp khác thì gởi vào bộ đệm.
5. Ví dụ:
Dưới đây là chương trình reo chuông, chỉ kết thúc khi nhấn ESC.
#include <conio.h>
void main()
{
tiep:
putch(7);
if (!kbhit( )) goto tiep;
if (getch( )!=27) goto tiep;

}
Trang: 19
Ngôn ngữ lập trình C
CHƯƠNG V:
CÁC CẤU TRÚC ĐIỀU KHIỂN
I. CÂU LỆNH ĐƠN, CÂU LỆNH GHÉP
Chương trình của C là tập hợp liên tiếp các câu lệnh đơn. Các câu lệnh này được máy
tính thi hành một cách tuần tự, câu ghi trước sẽ được thực hiện trước, câu ghi sau sẽ được
thực hiện sau. Nếu một thao tác nào đó không thể mô tả bằng câu lệnh đơn mà phải cần
đến nhiều câu lệnh đơn ghép lại thì các câu lệnh này phải được đặt trong cặp ngoặc móc
({ }). Như vây toàn bộ các câu lệnh bắt đầu từ { đến } được xem như một lệnh đơn.
Cú pháp câu lệnh ghép
{
<câu lệnh đơn 1>;
<câu lệnh đơn 2>;
<câu lệnh đơn 3>;
….
<câu lệnh đơn n>;
}
II. CÂU LỆNH ĐIỀU KIỆN (IF)
- Cú pháp:
if (<điều kiện>)
<câu lệnh 1>;
[else
<câu lệnh 2>;]
- Ý nghĩa:
Nếu <điều kiện> đúng thì <câu lệnh 1> được thực hiện. Nếu <điều kiện> sai thì
<câu lệnh 2> không được thực hiện.
- Ví dụ 1:
#include <stdio.h>

#include <conio.h>
void main( )
{
int max, a, b;
if (a>b)
max = a;
else
max = b;
printf(“max(%d,%d) = %d”, a, b, max);
getch( );
}
- Ví dụ 2:
#include <stdio.h>
#include <conio.h>
void main( )
{
int a;
printf(“Nhap vao so a = ”);
scanf(“%d”, &a);
if (a>0)
printf(“So a lon hon 0”);
else
if (a<0)
Trang: 20
Ngôn ngữ lập trình C
printf(“So a nho hon 0”);
else
printf(“So a bang 0”);
getch( );
}

III. CÂU LỆNH CHỌN (SWITCH)
- Cú pháp:
switch (biến)
case <giá trị 1>
<câu lệnh 1>;
[break;]
case <giá trị 2>
<câu lệnh 2>;
[break;]
….
case <giá trị n>
<câu lệnh n>;
[break;]
[default:
<câu lệnh n+1>;]
- Ý nghĩa:
Nếu giá trị của <biến> rơi vào <giá trị 1> thì <câu lệnh 1> được thực hiện.
Nếu giá trị của <biến> rơi vào <giá trị 2> thì <câu lệnh 2> được thực hiện.
Tương tự, nếu giá trị của <biến> rơi vào <giá trị n> thì <câu lệnh n> được thực
hiện.
Nếu giá trị của <biến> không rơi vào giá trị nào cả thì <câu lệnh n+1> sau default
được thực hiện nếu như có mệnh đề default.
- Chú ý:
<biến> chỉ có thể là kiểu ký tự hoặc kiểu số nguyên.
- Ví dụ:
#include <stdio.h>
#include <conio.h>
void main()
{
int diem;

clrscr();
printf("Nhap vao diem: ");
scanf("%d",&diem);
switch(diem)
{
case 0:
case 1:
case 2:
case 3:
printf("Xep loai yeu");
break;
case 4:
case 5:
printf("Xep loai trung binh");
break;
Trang: 21
Ngôn ngữ lập trình C
case 6:
case 7:
printf("Xep loai kha");
break;
case 8:
case 9:
printf("Xep loai gioi");
break;
case 10:
printf("Xep loai xuat sac");
break;
default:
printf("Diem sai quy cach");

}
getch();
}
IV. LỆNH LẶP FOR
- Cú pháp:
for(<biến chạy = giá trị đầu>; <điều kiện>; <biểu thức tăng giảm>)
<câu lệnh>;
- Giải thích:
<biến chạy = giá trị đầu>: Khởi tạo giá trị ban đầu cho biến chạy.
<điều kiện>: Điều kiện để tồn tại dòng lặp.
<biểu thức tăng giảm>: Biểu thức để tăng giá trị biến chạy.
- Ý nghĩa:
Nếu giá trị biến chạy còn thỏa <điều kiện> thì vòng lặp còn tồn tại, tức là <câu
lệnh> sẽ được thực hiện. Mỗi lần lặp thì biến chạy sẽ được tăng lên hoặc giảm xuống phụ
thuộc vào <biểu thức tăng giảm> và vòng lặp sẽ lặp đi lặp lại cho đến khi giá trị của biến
chạy không còn thoả <điều kiện>.
- Chú ý:
Các đối số trong câu lệnh for có thể được bỏ đi nhưng phải giữ dấu chấm phẩy (;).
For(;;) là một vòng lặp vô hạn. Chu trình này được thoát ra thường nhờ vào các
lệnh break hoặc return có trong vòng lặp.
Nếu <câu lệnh> là một nhóm lệnh thì phải đặt trong cặp ngoặc móc.
- Ví dụ:
#include <stdio.h>
#include <conio.h>
void main( )
{
int count, total=0;
for(count = 1; count<=10; count++)
{
total += count;

printf(“count = %d, total = %d\n”, count, total);
}
getch( );
}
Trang: 22
Ngôn ngữ lập trình C
V. LỆNH LẶP WHILE, DO WHILE
1. Vòng lặp while
- Cú pháp:
while (<điều kiện>)
<câu lệnh>;
- Giải thích:
Nếu <điều kiện> còn thỏa thì <câu lệnh> sẽ được thực hiện. Nếu <câu lệnh> là
một nhóm lệnh thì phải đặt trong cặp ngoặc móc.
- Ví dụ:
#include <stdio.h>
#include <conio.h>
void main( )
{
int count=0,total=0;
while (count<10)
{
total += count;
printf(“count = %d, total = %d\n”, count++, total);
}
getch( );
}
2. Vòng lặp do while
- Cú pháp:
do

<câu lệnh>;
while (<điều kiện>);
- Ý nghĩa:
Cú pháp do – while cũng giống như while nhưng phần kiểm tra điều kiện được
thực hiện sau khi thực hiện <câu lệnh>.
Cú pháp do – while bao giờ cũng thực hiện <câu lệnh> ít nhất 1 lần.
- Ví dụ:
#include <stdio.h>
#include <conio.h>
void main()
{
int cr, cd, dt;
char ch;
clrscr();
do
{
printf("Nhap chieu rong: ");
scanf("%d",&cr);
printf("\nNhap chieu dai: ");
scanf("%d",&cd);
dt=cd*cr;
printf("\nDien tich la: %d", dt);
printf("\nCo muon tiep tuc hay khong?c/k: ");
ch = getch();
}while (ch=='c' || ch=='C');
}
Trang: 23
Ngôn ngữ lập trình C
VI. MỘT SỐ LỆNH KHÁC
1. Lệnh break

- Lệnh break cho phép thoát khỏi vòng lặp for, while, do while và switch mà không
cần kiểm tra điều kiện.
- Khi có nhiều chu trình lồng nhau, câu lệnh break sẽ đưa máy ra khỏi chu trình bên
trong nhất chứa nó.
- Ví dụ:
Biết số nguyên dương n sẽ là nguyên tố nếu nó không chia hết cho các số
nguyên trong khoảng từ 2 đến căn hai của n. Thuật toán trên sẽ được sử dụng trong
chương trình dưới đây để kiểm tra tính nguyên tố của n.
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{
int n,i,nto=1;
clrscr();
printf("\nNhap vao so n: ");
scanf("%d",&n);
for(i=2;i<=sqrt(n);i++)
{
if ((n%i)==0)
nto=0;
}
if (nto==0)
printf("\n%d la hop so",n);
else
printf("\n%d la so nguyen to",n);
getch();
}
2. Lệnh continue
- Khi gặp lệnh continue máy sẽ trở về đầu vòng lặp.

- Trong lệnh while và do-while, lệnh continue chuyển điều khiển về phần kiểm tra
điều kiện.
- Lệnh continue chỉ thực hiện cho vòng lặp chứ không áp dụng cho lệnh switch.
- Ví dụ:
#include <stdio.h>
#include <conio.h>
void main()
{
int a[10]={-1,2,4,-3,-7,38,-2,4,10,-3};
int i,kq=0;
for(i=0;i<10;i++)
{
if (a[i]<0) continue;
kq+=a[i];
}
printf("Tong nhung so duong: %d",kq);
getch();
}
Trang: 24
Ngôn ngữ lập trình C
CHƯƠNG VI:
MẢNG VÀ CON TRỎ
I. CON TRỎ VÀ ĐỊA CHỈ
1. Địa chỉ
Khi chúng ta khai báo một biến thì máy sẽ cấp phát cho biến một vùng nhớ. Vùng
nhớ này là bao nhiêu byte tùy thuộc vào kiểu dữ liệu của biến. Nếu kiểu int thì cấp phát 2
bytes liên tiếp, kiểu float là 4 bytes liên tiếp,… Địa chỉ của biến là số thứ tự của byte đầu
tiên trong một dãy các byte liên tiếp trong bộ nhớ.
Rõ ràng địa chỉ của hai biến kiểu int liên tiếp cách nhau 2 bytes, địa chỉ của hai
biến kiểu float liên tiếp cách nhau 4 bytes,… Vì vậy máy sẽ phân biệt các kiểu địa chỉ

dựa vào các kiểu dữ liệu: địa chỉ kiểu int, kiểu float,…
Phép toán: &x cho ta địa chỉ của biến x.
2. Con trỏ
Con trỏ là biến chứa địa chỉ của một biến khác. Vì có nhiều loại địa chỉ nên cũng có
nhiều kiểu con trỏ tương ứng. Con trỏ kiểu int dùng để chứa địa chỉ các biến kiểu int, con
trỏ kiểu float dùng để chứa địa chỉ các biến kiểu float,… Kích thước của biến con trỏ
không phụ thuộc vào biến mà nó trỏ tới là kiểu gì. Kích thước của biến con trỏ luôn là 2
bytes do cách dùng 2 bytes để lưu địa chỉ của MS_DOS.
- Khai báo:
<kiểu> *<tên con trỏ>;
- Ví dụ:
int *px;
char *ch;
3. Qui tắc sử dụng con trỏ trong các biểu thức
- Sử dụng tên con trỏ: Con trỏ cũng là một biến nên khi tên của nó xuất hiện trong
biểu thức thì giá trị của nó sẽ được sử dụng. Chúng ta cần lưu ý là giá trị mà con trỏ chứa
là địa chỉ của một biến khác. Vì vậy khi tên con trỏ đứng ở bên trái phép gán thì biểu thức
bên phải phải là địa chỉ.
Ví dụ:
int *px, x; // khai báo con trỏ px và một biến x
px = &x; // giá trị mà con trỏ px chứa là địa chỉ của biến x
- Sử dụng dạng khai báo của con trỏ: Nếu con trỏ px trỏ tới biến x thì cách viết
x và *px
là tương đương nhau.
Ví dụ:
main( ){
int x, y, *px, *py;
clrscr( );
x = 3; y = 5;
printf(“&x=%d\n”,&x); //in địa chỉ biến x ra màn hình

px = &x; //nội dung của px là địa chỉ của biến x
// hay px trỏ tới x
printf(“px = %d\n”, px);
printf(“*px = %d\n”, *px);
py = &y; //nội dung của py là địa chỉ của biến y
// hay py trỏ tới y
py = px; // py trỏ tới vùng nhớ mà px đang trỏ
printf(“Sau khi gán: *py = %d”, *py);
getch( );
}
Trang: 25

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×