Hướng dẫn học lập trình C căn bản

seminoon seminoon @seminoon

Hướng dẫn học lập trình C căn bản

19/04/2015 01:36 PM
241
Cùng tham khảo những hướng dẫn học lập trình C căn bản, không hề khó, đơn giản nhé các bạn.
 

  MỘT SỐ KHÁI NIỆM CƠ BẢN TRONG C

1.1. Bộ ký tự

Mọi ngôn ngữ lập trình đều được xây dựng từ một bộ ký tự nào đó. Ngôn ngữ C được xây dựng trên bộ ký tự sau:

26 chữ cái hoa : A B C .. Z    

26 chữ cái thường : a b c .. z

10 chữ số : 0 1 2 .. 9

Các ký hiệu toán học : + - * / = ( )

Ký tự gạch nối : _

Các ký tự khác : . , : ; [ ]  {} ! \ & % # $ ...

Dấu cách (space) dùng để tách các từ.

@Lưu ý: Khi viết chương trình, ta không được sử dụng bất kỳ ký tự nào khác ngoài các ký tự trên.

1.2 Từ khóa

Từ khoá là những từ được sử dụng để khai báo các kiểu dữ liệu, để viết các toán tử và các câu lệnh. Bảng dưới đây liệt kê các từ khoá của TURBO C:

Asm

break

case

cdecl

Char

const

continue

default

Do

double

else

enum

extern

far

float

for

Goto

huge

if

int

interrupt

long

near

pascal

register

return

short

signed

sizeof

static

struct

switch

tipedef

union

unsigned

void

volatile

while

@Lưu ý:

- Không được dùng các từ khoá để đặt tên cho các hằng, biến, mảng, hàm,...

- Từ khoá phải được viết bằng chữ thường, ví dụ: viết từ khoá khai báo kiểu nguyên là int chứ không phải là INT.

1.3 Tên

Khái niệm tên rất quan trọng trong quá trình lập trình, nó không những thể hiện rõ ý nghĩa trong chương trình mà còn dùng để xác định các đại lượng khác nhau khi thực hiện chương trình. Tên thường được đặt cho hằng, biến, mảng, con trỏ, nhãn,… Chiều dài tối đa của tên là 32 ký tự.

Tên biến hợp lệ là một chuỗi ký tự liên tục gồm: Ký tự chữ, số và dấu gạch dưới. Ký tự đầu của tên phải là chữ hoặc dấu gạch dưới. Khi đặt tên không được đặt trùng với các từ khóa.

Ví dụ 1.1:

Các tên đúng: delta, a_1, Num_ODD, Case

Các tên sai:

3a_1 (ký tự đầu là số)

num-odd (sử dụng dấu gạch ngang)

int (đặt tên trùng với từ khóa)

del ta (có khoảng trắng)

f(x) (có dấu ngoặc tròn)

Ví dụ 1.2: number khác Number

case khác Case (case là từ khóa, do đó bạn đặt tên là Case vẫn đúng)

@Lưu ý: Trong C, tên phân biệt chữ hoa, chữ thường

1.4 Kiểu dữ liệu

Có 4 kiểu dữ liệu cơ bản trong C là: char, int, float, double.

TT

Kiểu dữ liệu

Kích thước

Miền giá trị

1

2

3

4

5

6

7

8

9

10

11

unsigned char

char

enum

unsigned int

short int

int

unsigned long

long

float

double

long double

1 byte

1 byte

2 bytes

2 bytes

2 bytes

2 bytes

4 bytes

4 bytes

4 bytes

8 bytes

10 bytes

0 đến 255

– 128 đến 127

– 32,768 đến 32,767

0 đến 65,535

– 32,768 đến 32,767

– 32,768 đến 32,767

0 đến 4,294,967,295

– 2,147,483,648 đến 2,147,483,647

3.4 * 10–38 đến 3.4 * 1038

1.7 * 10–308 đến 1.7 * 10308

3.4 * 10–4932 đến 1.1 * 104932

1.5 Lời chú thích

Trong khi lập trình cần phải ghi chú để giải thích các biến, hằng, thao tác xử lý giúp cho chương trình rõ ràng dễ hiểu, dễ nhớ, dễ sửa chữa và để người khác đọc vào dễ hiểu. Trong C có các ghi chú sau: // hoặc /* nội dung ghi chú */

Tóm lại, đối với ghi chú dạng // dùng để ghi chú một hàng và dạng /* …. */ có thể ghi chú một hàng hoặc nhiều hàng.


CẤU TRÚC CỦA MỘT CHƯƠNG TRÌNH C

Một chương trình bao gồm một hoặc nhiều hàm, mỗi hàm được người lập trình tổ chức để giải quyết một hoặc một số công việc nào đó của bài toán cần giải quyết. Một chương trình C để có thể thực thi được luôn cần phải có hàm main().

Cấu trúc cơ bản của chương trình như sau:

•    Các #include ( dùng để khai báo sử dụng các hàm chuẩn)

•    Các #define  ( dùng để định nghĩa các hằng )

•    Khai báo các đối tượng dữ liệu ngoài ( biến, mảng, cấu trúc vv..).

•    Khai báo nguyên mẫu các hàm.

•    Hàm main().

•    Định nghĩa các hàm ( hàm main có thể đặt sau hoặc xen vào giữa các hàm khác).

Ví dụ 1.3:

?
1
2
3
4
5
6
7
8
9
#include  
//k.báo sử dụng thư viện xuất/nhập chuẩn của C
void main(void)
{
double x,y;                      //Khai báo 2 biến x,y
//kiểu số thực
printf("\n Nhap x va y");        //xuất dữ liệu ra màn hình
scanf("%lf%lf",&x,&y);           //nhập dữ liệu từ bàn phím                                         //và lưu vào vùng địa chỉ                                          //cấp cho 2 biến x,y*/
}
@Lưu ý:Một số qui tắc cần nhớ khi viết chương trình:

- Mỗi câu lệnh có thể viết trên một hay nhiều dòng nhưng phải kết thúc bằng dấu (;).

- Trong chương trình, khi ta sử dụng các hàm chuẩn, ở đầu chương trình ta phải khai báo sử dụng, ví dụ: #include "stdio.h".

 
 

HẰNG - BIẾN - TOÁN TỬ - BIỂU THỨC

3.1 Khai báo hằng

Hằng là các đại lượng mà giá  trị của nó không thay đổi trong quá trình tính toán.   Nguyên tắc đặt tên hằng theo nguyên tắc đặt tên của C.

+ Khai báo

Cú pháp:

            #define     

Diễn giải:

#define: Từ khóa để định nghĩa một biến hằng

: là tên của hằng mà ta cần định nghĩa

: Giá trị khởi gán cho hằng

Ví dụ:

            #define   MAX   1000

            Lúc này, tất cả các tên MAX trong chương trình xuất hiện sau này đều được thay bằng 1000. Vì vậy, ta thường gọi MAX là tên hằng, nó biểu diễn số 1000.

3.2 Khai báo biến

+ Khai báo

Cú pháp:

               ;

Diễn giải:

- : là kiểu dữ liệu muốn khai báo cho biến

- : gồm các tên biến có cùng kiểu dữ liệu, mỗi tên biến cách nhau dấu phẩy (,), cuối cùng là dấu chấm phẩy (;).

Ví dụ

int iTuoi; //khai báo biến iTuoi có kiểu int

float fTrongLuong; //khai báo biến fTrongLuong có kiểu float

char cKyTu1, cKyTu2; //khai báo biến cKyTu1, cKyTu2 có kiểu char

+ Vừa khai báo vừa khởi gán giá trị cho biến

Có thể kết hợp việc khai báo với toán tử gán để biến nhận ngay giá trị lúc mới khai báo.

Ví dụ

Khai báo trước, gán giá trị sau

?
1
2
3
4
5
6
7
8
void main(void)
{
int a, b, c;
a = 1;
b = 2;
c = 5;
}

Vừa khai báo vừa gán giá trị:

?
1
2
3
4
5
void main(void)
{
int a = 1, b = 2, c = 5;
}

+ Phạm vi của biến

Khi lập trình, phải nắm rõ phạm vi của biến. Nếu khai báo và sử dụng không đúng, không rõ ràng sẽ dẫn đến sai sót khó kiểm soát được.

a. Khai báo biến ngoài (biến toàn cục):

Vị trí biến đặt bên ngoài tất cả các hàm, cấu trúc...Các biến toàn cục có ảnh hưởng đến toàn bộ chương trình. Chu trình sống của nó là bắt đầu từ khi chạy chương trình đến lúc kết thúc chương trình.

b. Khai báo biến trong (biến cục bộ):

Vị trí biến đặt bên trong hàm, cấu trúc…. Chỉ ảnh hưởng nội bộ bên trong hàm, cấu trúc đó…. Chu trình sống của nó bắt đầu từ lúc hàm, cấu trúc được gọi thực hiện đến lúc thực hiện xong.

3.3 Biểu thức

Biểu thức là sự phối hợp của những toán tử và toán hạng.

Ví dụ:

a + b

b = 1 + 5 * 2/i

a = 6 % (7 + 1)

x++ * 2/4 + 5 – power(i, 2)

Toán hạng sử dụng trong biểu thức có thể là hằng số, biến, hàm.

3.4 Phép toán

Trong C có 4 nhóm toán tử chính yếu sau đây:

+ Phép toán số học

+ : phép cộng    

– : phép trừ          

* : phép nhân

/ : phép chia

% : phép chia lấy phần dư, được áp dụng trên các toán hạng có kiểu dữ liệu char, int, long

+ Phép toán 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

@Lưu ý:

- Kết quả của phép toán quan hệ là số nguyên kiểu int, bằng 1 nếu đúng, bằng 0 nếu sai.

- Phép toán quan hệ ngoài toán hạng được sử dụng là kiểu dữ liệu số hoặc kiểu dữ liệu char.

+ Phép toán logic

! : (phép toán Phủ định)

&&: (phép toán Và)

|| : (phép Hoặc)

+ Phép toán trên bit (bitwise)

& : và(AND)

| : hoặc (OR)

^ : hoặc loại trừ (XOR)

>> : dịch phải

<< : dịch trái

~ : đảo

+ Phép gán hợp

Biểu thức gán là biểu thức có dạng:

            v=e

Trong đó v là một biến (hay phần tử mảng ), e là một biểu thức. Giá trị của biểu thức gán là giá trị của e, kiểu của nó là kiểu của v. Nếu đặt dấu ; vào sau biểu thức gán ta sẽ thu được phép toán gán có dạng:

            v=e;

Biểu thức gán có thể sử dụng trong các phép toán và các câu lệnh như các biểu thức khác. Ví dụ như khi ta viết

            a=b=5;

thì điều đó có nghĩa là gán giá trị của biểu thức b=5 cho biến a. Kết qủa là b=5 và a=5.

Hoàn toàn tương tự như :

            a=b=c=d=6; gán 6 cho cả a, b, c và d

            z=(y=2)*(x=6);            { ở đây * là phép toán nhân }

gán 2 cho y, 6 cho x và nhân hai biểu thức lại cho ta z=12.

+ Phép toán tăng giảm

C đưa ra hai phép toán một ngôi để tăng và giảm các biến (nguyên và thực). Toán tử tăng là ++ sẽ cộng 1 vào toán hạng của nó, toán tử giảm là -- sẽ trừ toán hạng đi 1.

Ví dụ

            n=5

            m=4

            ++n      Cho ta   n=6

            --m       Cho ta   m=3

Ta có thể viết phép toán ++ và -- trước hoặc sau toán hạng: ++n, n++, --n, n--.

Sự khác nhau của ++n và n++ ở chỗ : trong phép n++ thì tăng giá trị của biến n lên 1 sau khi giá trị của nó đã được sử dụng, còn trong phép ++n thì n được tăng trước khi sử dụng. Sự khác nhau giữa n-- và --n cũng như vậy.

+ Toán tử điều kiện

Cú pháp:

?:

Diễn giải:Nếu biểu thức điều kiện có giá trị đúng thì kết quả là , nếu sai kết quả là

Ví dụ:

            a=2

            b=5

            max=(a>b)? a:b;

kết quả là max = 5

Lập trình C cho vi điều khiển

Để có thể lập trình C cho vi điều khiển, cần học những gì ở ngôn ngữ C:

  • Cách khai báo biến, các hàm
  • Cách phân biệt các kiểu dữ liệu, và dùng trong trường hợp nào: các kiểu cơ bản có dấu, không có dấu, khoảng dữ liệu, kiểu cấu trúc, kiểu con trỏ, struct ..
  • Cách viết một hàm và gọi 1 hàm
  • Cách qui hoạch hàm: phân chương trình thành các hàm nhỏ và cho vào thư viện (thực ra là file .h, .c để sau này gọi )
  • Các lệnh gán, so sánh <=, >=, ==
  • Các vòng lặp if .. then , if  .. then ... else, while

Ngôn ngữ C cho vi điều khiển tuân theo chuẩn C, ngoài ra bổ sung thêm các kiểu dữ liệu khác phụ thuộc riêng vào từng loại vi điều khiển. Nên khi nói đến khái niệm "tệp lệnh" trong khi lập trình  C thì nó bao hàm tất cả các lệnh cơ bản của C và các kiểu dữ liệu này mà thôi, nên đừng đi hỏi là tệp lệnh là gì ? mà hãy xem trong manual của trình biên dịch đó xem.

Nói đến trình biên dịch mới nhớ là: các định nghĩa, kiểu dữ liệu, ... nó phụ thuộc thêm vào các trình biên dịch  C riêng biệt. Ví dụ với PIC16 thì khi viết bằng HTPIC thì khai báo configuration khác với khi viết bằng CCS, cái này được nói trong mỗi manual của trình biên dịch.

Các bạn có thể xem bài viết  Thư viện giao tiếp RS232 cho PIC18 bằng HTPIC18 thì những kiến thức để viết được nó rất đơn giản, chẳng có gì cả. Cái quan trọng là viết cái gì ở trong đó. Câu trả lời nằm ở datasheet của từng module của vi điều khiển. Các tên đặc biệt trong đó là nằm trong thư viện của trình biên dịch đó thôi. Bao giờ mỗi trình biên dịch cũng có các file header định nghĩa các thanh ghi của vi điều khiển, thường là giống với tên trong datasheet, nhưng có thể là không giống nên chỉ cần mở cái đó ra là được.

Thông thường, các vi điều khiển hiện nay khi giao tiếp với một cái gì đó thì nó có riêng một module và có riêng một chương trong mỗi datasheet của vi điều khiển hướng dẫn đầy đủ, cách active module thế nào, cách giao tiếp như thế nào.

Kết luận

Để có thể viết 1 chương trình cho vi điều khiển cần có các yếu tố sau:

  • Những kiến thức lập trình C căn bản.
  • Đọc kĩ manual của trình biên dịch, mở header file của vi điều khiển liên quan.
  • Datasheet của vi điều khiển để đọc từng module.
Vì thế nên hãy có khái niệm đầy đủ và đừng hỏi những câu hỏi không cần thiết ở các diễn đàn nhé.




Lập trình viên
Cách tự học lập trình hiệu quả nhất
Hướng dẫn học lập trình plc s7-200 đơn giản
Hướng dẫn học lập trình web bằng HTML cơ bản
Cách tư duy lập trình giúp công việc bạn nhanh hơn
Hướng dẫn học lập trình Excel căn bản

(St)


 

Hỏi đáp, bình luận, trả bài:
huong dan phep toan tren bit bitwise
hơn 1 tháng trước - Thích (2) - Trả lời
*địa chỉ email của bạn được bảo mật

Hot nhất
Top xink
Bộ sưu tập
Chợ xink
Thanh lý