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á
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.
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
* 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
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ụ:
[<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;
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.
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
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:
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
+ 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)
{
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:
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>
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.
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
- 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
}
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>
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;
}
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;
<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
- 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ỉ
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