Menu-ngang

☰ MENU

13/02/2022

Chương 2: Các thành phần cơ bản

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

#include <stdio.h>

 

int main()

{

    printf("\a");

    printf("Hinh nhu vua co tieng gi keu @@\n");

    printf("Ban dang o dong thu 2\nBay gio xuong dong 3 roi ne ^^\n");

    printf("\tDong nay cach ra 1 tab thi phai?\n");

    printf("\t\t\t\t\t\tCach ra nhieu tab qua \rVe dau dong thoi\n");

    printf("Dau \\ \nDau \'\nDau \" \nDau %%\n");

 

    // day la mot dong ghi chu va chi co tac dung chu thich khi viet code cho de hieu

 

    /*

      Day la mot doan ghi chu

      Doan ghi chu nay co 2 dong

     */

    return 0;

}

 

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

#include <stdio.h>

 

int main()

{

    int a, b; // khai bao 2 bien kieu so nguyen

    float c; // khai bao 1 bien kieu so thuc

 

    // Gan gia tri cho cac bien

 

    a = 1;     

    b = 2;

    c = 3.4;

 

    // vua khai bao bien vua gan gia tri

    int e = 4, f = 6;

 

    printf("a = %d; b = %d\n", a, b);

    printf("c = %f\n", c);

    printf("e = %d; f = %d\n", e, f);

 

    return 0;

}

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

#include <stdio.h>

 

#define AGE_MAX 150     // hang so

#define C 'a'            // hang ky tu

#define NICK_NAME "nguyenvan" // hang chuoi

const float PI = 3.14;

int main()

{

    printf("hang AGE_MAX = %d\n", AGE_MAX);

    printf("hang C = %c\n", C);

    printf("hang NICK_NAME = %s\n", NICK_NAME);

    printf("hang PI = %f\n", PI);

    // AGE_MAX = 10; // lenh nay sai vi hang khong the thay doi duoc gia tri

    return 0;

}

 

 

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    Thc 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à