2.1. Từ khóa và kí hiệu
2.1.1. Từ khóa
Các từ sử dụng để
dành riêng trong ngôn ngữ lập trình C gọi là từ khoá (keyword). Các từ khóa
không được sử dụng làm các biến, hằng, không được được định nghĩa lại các từ
khoá.
Bảng
liệt kê một số từ khoá :
break
case char continue default do double
else float
for if int
long register
return short sizeof struct switch
void while
Chú thích trong lập trình C:
Chú thích là những dòng mô tả diễn tả ý nghĩa câu lệnh
đang dùng. Trình biên dịch không biên dịch các phần ghi chú trong chương trình.
-
Chú thích 1 dòng
dùng cặp dấu //
-
Chú thích nhiều
dòng dùng cặp dấu /* và */.
Ví dụ:
#include <stdio.h>
#include<conio.h>
int main ()
{
/*Xuat chuoi ra man hinh*/
printf(“Xin cho biet ten cua ban: ”);
//Dung chuong trinh, cho go phim
getch();
return 0;
}
2.1.2. Ký hiệu
Ký hiệu bao gồm bảng chữ cái, ký tự số, và các ký tự đặc biệt.
2.1.3. Tập ký hiệu
Tập ký hiệu trong ngôn ngữ C bao gồm những ký tự, ký hiệu sau: (phân biệt chữ in
hoa và in thường):
§
26 chữ cái la tinh hoa A,B,C…Z
§
26 chữ cái latinh
thường a,b,c …z.
§
10 chữ số thập
phân 0,1,2…9.
§
Các ký hiệu toán
học: +, -, *, /, =, <, >, (, )
§
Các ký hiệu đặc
biệt: :. , ; ” ‘ _ @ # $ ! ^ [ ] { } …
§
Dấu cách hay
khoảng trống, xuống hàng (\n) và tab (\t)
Các ký tự điều khiển:
§
\n : Nhảy xuống
dòng kế tiếp canh về cột đầu tiên.
§
\t : Tab ngang.
§
\r : Nhảy về đầu
hàng, không xuống hàng.
§
\a : Tiếng kêu
bip.
§
\\ : In ra dấu \
§
\” : In ra dấu “
§
\’ : In ra dấu ‘
§
%%: In ra dấu %
Đây
chỉ là một số ký tự điểu khiển quen thuộc, hay dùng, ngoài ra còn một só ký tự
điều khiển khác các bạn có thể xem thêm trong các tài liệu khác. Để hiểu rõ về
các ký tự điều khiển các bạn hãy chạy thử chương trình sau và tự rút ra nhận
xét cho riêng mình.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 |
|
2.2. Các kiểu dữ liệu sơ cấp
2.2.1. Kiểu số nguyên
Loại dữ liệu |
Kiểu dữ liệu |
Kích thước (byte) |
Miền giá trị |
Kiểu Số nguyên |
short |
2 |
-32768 đến 32767 |
int |
4 |
-2147483648 đến 2147483647 |
|
long |
4 |
-2147483648 đến 2147483647 |
|
long long |
8 |
-9223372036854775808 đến 9223372036854775807 |
2.2.2. Kiểu dấu phẩy động
Loại dữ liệu |
Kiểu dữ liệu |
Kích thước (byte) |
Miền giá trị |
Kiểu Số thực |
float |
4 |
1.175494-38 đến 3.40282338 |
double |
8 |
2.225074308 đến 1.797693308 |
|
long double |
12 |
3.362103-4932 đến 1.1897314932 |
2.2.3. Kiểu ký tự
Loại dữ liệu |
Kiểu dữ liệu |
Kích thước (byte) |
Miền giá trị |
Kiểu Ký tự |
char |
1 |
-128 đến 127 |
unsigned char |
1 |
0 đến 255 |
2.3. Biến, hằng, biểu thức
2.3.1. Phân loại, khai báo và sử dụng biến
a. Phân loại:có 2 loại biến
- Biến toàn cục: được sử dụng trong
toàn bộ chương trình
- Biễn cục bộ: chỉ có giá trị sử
dụng trong hàm
b. Khai báo và sử dụng biến:
Biến dùng để lưu giá trị, tương ứng
với mỗi kiểu dữ liệu chúng ta có các biến thuộc các kiểu đó và có miền giá trị
tương ứng. Biến có thể thay đổi giá trị trong quá trình chạy chương trình.
Để khai báo biến ta dùng cú
pháp:
<Kiểu_dữ_liệu> <Danh_sách_tên_biến>;
Ví
dụ:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
Chú ý: Tên biến hợp lệ là một chuỗi liên tiếp gồm ký tự chữ, số hoặc dấu gạch dưới. Tên phân biệt chữ hoa chữ thường và không trùng với từ khóa.
§
Tên phân biệt chữ
hóa chữ thường nên: a khác A, quan khác Quan.
§
VD
Các tên đúng: a, quan,
nguyenvanquan7826, quan_7826, _7826, _nhung, _123huong.
§
**VD Các tên sai:
**
Tên sai |
Nguyên nhân |
1 |
Bắt đầu bằng số |
1a |
Bắt đầu bằng số |
quan 7826 |
Chứa dấu cách |
quan-7826 |
Chứa dấu gạch ngang |
f(x) |
Chứa dấu ngoặc nhọn |
int |
Trùng với từ khóa |
2.3.2. Hằng
Hằng cũng giống như
biến nhưng không thể thay đổi giá trị. Nếu bạn cố tình gán giá trị mới cho hằng
thì sẽ bị sai.
Tên hằng thường viết in hoa để
dễ nhận biết và phân biệt với biến.
Cú
pháp khai báo hằng:
#define <TÊN_HẰNG> <giá_trị> //chú ý
không có dấu chấm phẩy ở cuối câu lệnh
hoặc const
<kiểu_dữ_liệu> <TÊN_HẰNG> = <giá_trị>;
Ví
dụ:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 |
const
float PI = 3.14;
|
2.3.3. Biểu thức
Biểu thức là một sự kết hợp giữa các toán tử và các
toán hạng theo đúng một trật tự nhất định.
Mỗi toán hạng có thể là một hằng, một biến hoặc một biểu thức khác.
Trong trường hợp, biểu thức có nhiều toán tử, ta dùng cặp dấu ngoặc đơn
() để chỉ định toán tử nào được thực hiện trước.
Ví dụ: Biểu thức nghiệm của phương trình bậc hai:
(-b + sqrt(Delta))/(2*a)
Trong đó 2 là hằng; a, b, Delta là biến.
a. Các toán
tử số học
Trong ngôn ngữ C, các toán tử +, -, *, / làm việc tương tự như khi
chúng làm việc trong các ngôn ngữ khác. Ta có thể áp dụng chúng cho đa số kiểu
dữ liệu có sẵn được cho phép bởi C. Khi ta áp dụng phép / cho một số nguyên hay
một ký tự, bất kỳ phần dư nào cũng bị cắt bỏ. Chẳng hạn, 5/2 bằng 2 trong phép
chia nguyên.
Toán tử |
Ý nghĩa |
+ |
Cộng |
- |
Trừ |
* |
Nhân |
/ |
Chia |
% |
Chia lấy phần dư |
-- |
Giảm 1 đơn vị |
++ |
Tăng 1 đơn vị |
b. Tăng và giảm (++ & --)
Toán tử ++ thêm 1 vào toán hạng của nó và – trừ bớt 1. Nói cách khác:
x = x + 1 giống như ++x
x = x – 1 giống như x--
Cả 2 toán tử tăng và giảm đều có thể tiền tố (đặt trước) hay hậu tố
(đặt sau) toán hạng. Ví dụ: x = x + 1 có thể viết x++ (hay ++x)
Tuy nhiên giữa tiền tố và hậu tố có sự khác biệt khi sử dụng trong 1
biểu thức. Khi 1 toán tử tăng hay giảm đứng trước toán hạng của nó, C thực hiện
việc tăng hay giảm trước khi lấy giá trị dùng trong biểu thức. Nếu toán tử đi
sau toán hạng, C lấy giá trị toán hạng trước khi tăng hay giảm nó. Tóm lại:
x = 10
y = ++x //y = 11
Tuy nhiên:
x = 10
x = x++ //y = 10
Thứ tự ưu tiên của các toán tử số
học:
++ -- sau đó là * / % rồi mới đến
+ -
c. Các toán tử quan hệ và các toán tử Logic
Ý tưởng chính của toán tử quan hệ
và toán tử Logic là đúng hoặc sai. Trong C mọi giá trị khác 0 được gọi là đúng,
còn sai là 0. Các biểu thức sử dụng các toán tử quan hệ và Logic trả về 0 nếu
sai và trả về 1 nếu đúng.
Toán tử |
Ý nghĩa |
Các toán tử quan hệ |
|
> |
Lớn hơn |
>= |
Lớn hơn hoặc bằng |
< |
Nhỏ hơn |
<= |
Nhỏ hơn hoặc bằng |
== |
Bằng |
!= |
Khác |
Các toán tử Logic |
|
&& |
AND |
|| |
OR |
! |
NOT |
d. Toán tử ?
cùng với:
C có một toán tử rất mạnh và thích hợp để thay thế cho các câu lệnh của
If-Then-Else. Cú pháp của việc sử dụng toán tử ? là:
E1 ? E2 : E3
Trong đó E1, E2, E3 là các biểu
thức.
Ý nghĩa: Trước tiên E1 được ước
lượng, nếu đúng E2 được ước lượng và nó trở thành giá trị của biểu thức; nếu E1
sai, E2 được ước lượng và trở thành giá trị của biểu thức.
Ví dụ:
X = 10
Y = X > 9 ? 100 : 200
Thì Y được gán giá trị 100, nếu X
nhỏ hơn 9 thì Y sẽ nhận giá trị là 200. Đoạn mã này tương đương cấu trúc if như
sau:
X = 10
if (X < 9) Y = 100
else Y = 200
e. Toán tử
con trỏ & và *
Một con trỏ là địa chỉ trong bộ nhớ của một biến. Một biến con
trỏ là một biến được khai báo riêng để chứa một con trỏ đến một đối
tượng của kiểu đã chỉ ra nó. Ta sẽ tìm hiểu kỹ hơn về con trỏ trong chương về
con trỏ. Ở đây, chúng ta sẽ đề cập ngắn gọn đến hai toán tử được sử dụng để
thao tác với các con trỏ.
Toán tử thứ nhất là &, là một toán tử quy ước trả về địa chỉ bộ nhớ
của hệ số của nó.
Ví dụ: m =
&count
Đặt vào biến m địa chỉ bộ nhớ của biến count.
Chẳng hạn, biến count ở vị trí bộ nhớ 2000, giả sử count có giá trị là
100. Sau câu lệnh trên m sẽ nhận giá trị 2000.
Toán tử thứ hai là *, là một bổ sung cho &; đây là một toán tử quy
ước trả về giá trị của biến được cấp phát tại địa chỉ theo sau đó.
Ví dụ: q =
*m
Sẽ đặt giá trị của count vào q. Bây giờ q sẽ có giá trị là 100 vì 100
được lưu trữ tại địa chỉ 2000.
v
Bài tập:
Câu 1. Biến là gì? Cho ví dụ về khai báo
biến?
Câu 2. Có mấy loại biến. Nêu tác dụng của
từng loại biến?
Câu 3. Hằng là gì? Nêu 2 cách khai bao hằng.
Cho ví dụ?
Câu 3. Biểu thức là gì? Cho ví dụ?
Câu 4. Hãy nêu các toán tử số học?
Câu 5. Hãy cho biết các phép toán quan hệ?
Câu 6. Hay nêu các toán tử lôgic?
2.4. Cấu trúc một chương trình
2.4.1.Tiền xử lý và biên dịch
- Muốn chuyển từ chương trình nguồn sang chương
trình đích phải có chương trình dịch. Thông thường mỗi một ngôn ngữ cấp cao đều
có một chương trình dịch riêng nhưng chung quy lại thì có hai cách dịch: thông
dịch và biên dịch.
- Thông dịch (interpreter): Là cách dịch từng
lệnh một, dịch tới đâu thực hiện tới đó.
- Biên dịch (compiler): Dịch toàn bộ chương
trình nguồn thành chương trình đích rồi sau đó mới thực hiện. Các ngôn ngữ sử
dụng trình biên dịch như Pascal, C...
2.4.2. Cấu trúc một chương trình C
Cấu
trúc tổng quát của một chương trình C:
[ khai báo thư viện ]
[ các
khai báo nguyên mẫu hàm của người dùng ]
[ các
định nghĩa kiểu ]
[ khai báo hằng ]
[ khai báo biến toàn cục ]
int main ( )
{
[khai báo biến cục bộ]
< khối lệnh>
}
[ các
định nghĩa hàm của người dùng]
Ví dụ
2.8: Chương trình nhập bán kính từ bàn phím, tính và in
diện tích hình tròn
#include <stdio.h>
#include <conio.h>
#define PI 3.1415
float r; // Khai báo biến r có kiểu float
void main()
{
printf("\nNhap ban kinh
duong tron r =");
scanf("%f",&r);
//nhập số thực từ bàn phím vào r
printf("Dien tich =
%5.2f", r*r*PI); //tính và in diện tích
getch();
}
2.4.3. Các thư viện thông dụng
Khai báo thư viện
Cú pháp: #include <Tên tập
tin thư viện>
Ví dụ 2.9:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
v
Bài tập:
Câu 1. Hãy so sánh sự khác nhau giữa biên
dịch và thông dịch trong ngôn ngữ lập trình C?
Câu 2. Cấu trúc tổng quát của một chương
trình gồm các thành phần chính nào?
Câu 3. Nêu một số thư viện
thường dùng trong lập trình C?
2.5. Câu lệnh
2.5.1. Khái niệm
Phân
loại: Có hai loại lệnh
- Lệnh đơn: là một câu lệnh không chứa các câu lệnh
khác bên trong nó và kết thúc bằng một dấu chấm phẩy (;): lệnh gán, các câu
lệnh nhập xuất dữ liệu…
- Lệnh có cấu trúc: là một câu lệnh chứa câu lệnh
khác bên trong nó hoặc một khối lệnh gồm nhiều câu lệnh như lệnh điều kiện
(lệnh if), lệnh rẽ nhánh (lệnh switch), lệnh lặp (các vòng lặp for, while,
do…while).
2.5.2. Lệnh gán và lệnh gộp
Lệnh gán dùng để gán giá
trị của một biểu thức cho một biến.
Cú pháp:
<Tên biến> = <biểu thức>
Ví dụ
2.10:
int x,y;
x = 10;//Gán hằng số 10 cho biến x
y = 2*x; //Gán giá trị
Chú ý:
Nguyên tắc khi dùng lệnh gán là kiểu của biến và kiểu của biểu thức phải giống
nhau.
- Lệnh
gộp: là một khối lệnh (tập hợp nhiều lệnh đơn) được đặt
trong cặp dấu ngoặc nhọn { }.
2.5.3. Nhập và xuất dữ liệu
a) Lệnh
nhập giá trị từ bàn phím (hàm scanf)
Là
hàm cho phép đọc dữ liệu từ bàn phím và gán cho các biến trong chương trình khi
chương trình thực thi.
Cú pháp:
scanf(“Chuỗi
định dạng”, địa chỉ của các biến);
Giải
thích:
- Chuỗi
định dạng: dùng để qui định kiểu dữ liệu, cách biểu diễn, độ
rộng, số chữ số thập phân...
Một số định dạng:
Định dạng |
Ý nghĩa |
%[số
ký số]d |
Nhập
số nguyên tối đa [số ký số] ký số |
%[số
ký số]f |
Nhập
số thực tối đa [số ký số] ký số |
%c |
Nhập
một ký tự |
%s |
Nhập
một chuỗi kí tự |
Ví dụ 2.11:
%d :
Nhập số nguyên.
%4d :
Nhập số nguyên tối đa 4 ký số.
%f :
Nhập số thực.
%6f :
Nhập số thực tối đa 6 ký số
- Địa chỉ của các biến: là địa chỉ (&) của các
biến mà chúng ta cần nhập giá trị cho nó.
Được
viết như sau: &<tên biến>.
Ví dụ
2.12:
scanf(“%d”,&bien1);/*Doc gia tri cho bien1 co kieu nguyen*/
scanf(“%f”,&bien2); /*Doc gia tri cho bien2 co kieu thuc*/
scanf(“%d%f”,&bien1,&bien2);
Lưu ý:
• Chuỗi định dạng phải đặt trong cặp dấu nháy kép
(“”).
• Các biến (địa chỉ biến) phải cách nhau bởi dấu
phẩy (,).
• Có bao nhiêu biến thì phải có bấy nhiêu định
dạng.
• Thứ tự của các định dạng phải phù hợp với thứ tự
của các biến.
• Để đọc vào một chuỗi ký tự có chứa khoảng trắng
(kết thúc bằng phím Enter)
thì
phải dùng hàm gets().
b) Lệnh xuất giá trị của biểu
thức lên màn hình (hàm printf)
Cú
pháp:
printf(“Chuỗi định dạng ”, Các
biểu thức);
Giải thích:
- Chuỗi định dạng: dùng để qui định kiểu dữ liệu,
cách biểu diễn, độ rộng, số chữ số
thập
phân... Một số định dạng khi đối với số nguyên, số thực, ký tự.
Định dạng |
Ý nghĩa |
%[số
ký số]d |
Xuất
số nguyên |
%[số ký số].[số chữ
số thập phân]f |
Xuất số thực có <số chữ số thập phân> theo
quy tắc làm tròn số. |
%c |
Xuất một ký tự |
%s |
Xuất chuỗi ký tự |
Ví dụ
2.13:
%d : Xuất số nguyên
%4d : Xuất số nguyên tối đa 4 ký số.
%f : Xuất số thực.
%6f : Xuất số thực tối đa 6 ký số.
%.2f: Xuất số thực sau dấu chấm có 2 chữ số.
- Chú ý:
Khi xuất nhiều giá trị thì các giá trị phân cách nhau bởi dấu phẩy (,).
Ví dụ :printf(“%d%f”,bien1,bien2);
Ví dụ 2.14:
#include <stdio.h>
#include <conio.h>
int main()
{
printf(“Xin chao ngon ngu
C”);
getch();
}
Ví dụ 2.15:
#include <stdio.h>
#include <conio.h>
int main()
{
int bien_nguyen=1234, i=65;
float bien_thuc=123.4503;
printf(“Gia tri nguyen cua bien nguyen =%d”, bien_nguyen);
printf(“\nGia tri thuc cua bien thuc =%f”,bien_thuc);
printf(“\nTruoc khi lam tron=%f \n Sau khi lam tron=%.2f”, bien_thuc,
bien_thuc);
getch();
}
v
Thực hành:
Bài
1. Viết chương trình xuất ra màn hình dòng chữ “Xin
chao ngon ngu C”.
Bài
2. Viết chương trình nhập vào 1 số nguyên, xuất ra màn
hình số nguyên vừa nhập.
Bài
3. Viết chương trình tính tổng, hiệu, tích của 2 số
nguyên a và b nhập từ bàn phím.
Bài
4. Viết chương trình tính thương của 2 số thực a và b
nhập từ bàn phím. Kết quả lấy 1 số lẻ.
Bài 5. Viết chương
trình đổi nhiệt đô từ đơn vị Ferarit ra độ C theo công thức: C = 5/9 (F-32)
Bài 6. Viết chương
trình tính diện tích, chu vi hình tròn với bán kính R nhập từ bàn phím.
Bài 7. Nhập vào 2 số
nguyên a,b. Tìm số lớn nhất trong 2 số.
Bài 8. Nhập vào 5 số
nguyên. Tính trung bình cộng 5 số đó.
v
Bài tập:
Bài 1. Viết chương trình tính diện tích, chu vi của
hình chữ nhật với 2 cạnh a và b nhập từ bàn phím.
Bài 2. Viết chương trình tính diện tích, chu vi của tam giác vuông với 2 cạnh a và b nhập từ bà