Lập trình C: Bài 2 – Các thành phần trong C

1. 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.

#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. Bộ chữ viết

Bộ chữ viết 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 latinh 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)

3. Từ khóa

Là các từ mà ngôn ngữ C đã xây dựng sẵn và có những chức năng nhất định, sau này làm nhiều các bạn sẽ biết dần dần. Chúng ta không nên định nghĩa lại những từ khóa này.

asm • auto • break • case • cdecl • char • class • const • continue • _cs • default • delete • do double • _ds • else • enum • _es • extern • _export • far • _fastcall • float • for •friend • goto • huge • if • inline • int • interrupt • _loadds • long • near • new • operator • pascal • private • protected • public • register • return • _saveregs • _seg • short •signed • sizeof • _ss • static • struct • switch • template • this • typedef • union • unsigned • virtual • void • volatile • while

4. Kiểu dữ liệu

Trong cuộc sống có nhiều loại vật dụng để chứa đựng các thứ khác nhau như Rổ để đựng rau, Cốc (ca) để đựng nước. Cũng giống vậy, trong lập trình có các kiểu dữ liệu để có thể biểu diễn (lưu trữ) các thành phần tương ứng.

Mỗi kiểu dữ liệu sẽ có kích thước (chiếm diện tích), loại giá trị và miền giá trị khác nhau trong bộ nhớ máy tính khi sử dụng. Dưới đây là một số kiểu dữ liệu cơ bản hay dùng trong C.

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

Lưu ý:

  • Trên đây là bảng thông tin của một số kiểu dữ liệu thông dụng hay dùng. Còn khá nhiều kiểu dữ liệu khác nhưng tôi không đưa vào, các bạn có thể tham khảo tại đây cho Kiểu số nguyên, đây cho kiểu số thực
  • Do C (hoặc C++) có nhiều phiên bản khác nhau và dùng trên các hệ điều hành khác nhau nên có thể giá trị và kích thức các kiểu dữ liệu cũng khác nhau. Bảng trên là tôi kiểm tra trên win 7, Dev-C 5.11.

Các bạn có thể dùng chương trình sau chạy và kiểm tra kết quả:

#include <stdio.h>
#include <limits.h>  // limits for interger
#include <float.h>   // limits for float

int main()
{
    printf("TYPE                %6s %20s %20s\n", "SIZE", "MIN VALUE", "MAX VALUE");
    printf("char:          %6ld byte %20d %20d\n", sizeof(char), CHAR_MIN, CHAR_MAX);
    printf("unsigned char: %6ld byte %20d %20d\n", sizeof(unsigned char), 0, UCHAR_MAX);
    printf("short:         %6ld byte %20d %20d\n", sizeof(short), SHRT_MIN, SHRT_MAX);
    printf("int:           %6ld byte %20d %20d\n", sizeof(int), INT_MIN, INT_MAX);
    printf("long:          %6ld byte %20ld %20ld\n", sizeof(long), LONG_MIN, LONG_MAX);
    printf("long long:     %6ld byte %20lld %20lld\n", sizeof(long long), LLONG_MIN, LLONG_MAX);
    printf("float:         %6ld byte %20e %20e\n", sizeof(float), FLT_MIN, FLT_MAX);
    printf("double:        %6ld byte %20e %20e\n", sizeof(double), DBL_MIN, DBL_MAX);
    printf("long double:   %6ld byte %20Le %20Le\n", sizeof(long double), LDBL_MIN, LDBL_MAX);
    return 0;
}

5. Tên

Mỗi chúng ta ai cũng có tên, do vậy trong lập trình C các thành phần cũng sẽ có tên. Ví dụ như tên hàm, tên biến, tên hằng số, tên nhãn,…

Tê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

6. Biến

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 như trên dùng để lưu giá trị. Các bạn cần phân biệt kiểu và biến.

VD cái rổ A để đựng rau muống, cái rổ B để đựng rau cần và chúng cùng là rổ, thì tương ứng biến a lưu giá trị số 5, còn biến b lưu giá trị số 9 mặc dù chúng cùng kiểu số nguyên.

Biến có thể thay đổi giá trị trong quá trình chạy chương trình.

6.1 Khai báo biến

Để khai báo biến ta dùng cú pháp:

Kiểu_dữ_liệu Danh_sách_tên_biến;

Lý thuyết thì hơi dài, các bạn xem và chạy chương trình sau sẽ thấy cụ thể hơn:

#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;
}

Như trên các bạn thấy cấu trúc khai báo rồi đó. Còn về lệnh xuất ra màn hình các giá trị thì có một số điều khác đó là cách sử dụng %d, %f . Cái này mình sẽ nói cụ thể ở phần sau, đến đây các bạn cứ viết theo để thấy được cách khai báo biến là ok roài. !

6.2 Phạm vi của biến

Khi lập trình, bạn 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, vì vậy bạn cần phải xác định đúng vị trí, phạm vi sử dụng biến trước khi sử dụng biến.

Mỗi biến được khai báo ở đâu thì sẽ được dùng và có phạm vi hoạt động tương ứng từ nơi nó khai báo đến dấu đóng ngoặc nhọn } ngang cấp với nó.

Ví dụ chương trình sau.

#include <stdio.h>

int a = 1, b = 5; // khai bao bien toan cuc, no se duoc dung o bat ky dau ke tu dong nay.

int main()
{
    // khai bao 2 bien trong ham main, no se duoc dung trong toan bo ham main ke tu dong nay
    int c = 4, d = 6; 

    if(c < d)
    {
        int e = 6, d = 8;  // khai bao bien e va d, no duoc dung trong doan nay.
        c = 7;
        printf("gia tri cac bien trong khoi:\n");
        printf("e = %d \t d = %d \t c = %d\n", e, d, c);
    } // den day bien e, d vua khai bao khong con hoat dong nua.

    // printf("gia tri bien e = %d\n", e);  // lenh nay sai vi bien e khong con ton tai nua

    printf("gia tri cac bien trong ham main:\n");
    printf("c = %d \t d = %d\n", c, d);

    printf("gia tri cac bien toan cuc:\n");
    printf("a = %d \t b = %d\n", a, b);

    return 0;
}

Các bạn chạy chương trình, xem kết quả và tự rút ra nhận xét nhá.

Trong này có một lời giải thích nhỏ với các bạn sau khi chạy chương trình là chúng ta có khai báo 2 biến d, và 2 biến d này do nằm trong 2 khối lệnh khác nhau (1 cái nằm trong hàm main, 1 cái nằm trong đoạn lệnh if ) nên chúng hoàn toàn khác nhau, không ảnh hưởng gì đến nhau. Nhưng biến c thì chỉ khai báo 1 lần, nên khi dùng c trong đoạn lệnh if thì chính là dùng biến c của hàm main đã khai báo và biến c đã được thay đổi giá trị.

7. 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ị (Lưu ý không có dấu chấm phẩy ở cuối).

Các bạn chạy và xem kết quả của ví dụ sau:

#include <stdio.h>

#define AGE_MAX 150     // hang so
#define C 'a'            // hang ky tu
#define NICK_NAME "nguyenvanquan7826" // hang chuoi

int main()
{
    printf("hang AGE_MAX = %d\n", AGE_MAX);
    printf("hang C = %c\n", C);
    printf("hang NICK_NAME = %s\n", NICK_NAME);

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

Bài tập: Các bạn chạy các ví dụ ở trong bài và suy nghĩ rút ra nhận xét của riêng mình.