Lập trình C và kiểu dữ liệu trong C

1097

Các khái niệm cơ bản về lập trình

Lập trình máy tính

  • Gọi tắt là lập trình (Programming).
  • Nghệ thuật cài đặt một hoặc nhiều thuật toán trừu tượng có liên quan với nhau bằng một ngôn ngữ lập trình để tạo ra một chương trình máy tính.

Thuật toán

  • Là tập hợp (dãy) hữu hạn các chỉ thị (hành động) được định nghĩa rõ ràng nhằm giải quyết một bài toán cụ thể nào đó.
  • Ví dụ: Thuật toán giải phương trình bậc nhất ax + b = 0. Với a, b là số thực.
Đầu vào: a, b thuộc R.
Đầu ra: nghiệm phương trình ax + b = 0.
Nếu a = 0
b = 0 thì phương trình có nghiệm bất kì.
b ≠ 0 thì phương trình vô nghiệm.
Nếu a ≠ 0
Phương trình có nghiệm duy nhất x = -b/a.
  • Các tính chất của thuật toán:
    • Tính chính xác: quá trình tính toán hay các thao tác máy tính thực hiện là chính xác.
    • Tính rõ ràng: các câu lệnh minh bạch được sắp xếp theo thứ tự nhất định.
    • Tính khách quan: được viết bởi nhiều người trên máy tính nhưng kết quả phải như nhau.
    • Tính phổ dụng: có thể áp dụng cho một lớp các bài toán có đầu vào tương tự nhau.
    • Tính kết thúc: hữu hạn các bước tính toán.
  • Có nhiều cách thể hiện thuật toán, ở đây chúng ta tham khảo các cách sau đây:
    • Sử dụng ngôn ngữ tự nhiên
Đầu vào: a, b thuộc R
Đầu ra: nghiệm phương trình ax + b = 0

1. Nhập 2 số thực a và b.
2. Nếu a = 0 thì
    2.1. Nếu b = 0 thì
        2.1.1. Phương trình vô số nghiệm
        2.1.2. Kết thúc thuật toán.
    2.2. Ngược lại
        2.2.1. Phương trình vô nghiệm.
        2.2.2. Kết thúc thuật toán.
3. Ngược lại
    3.1. Phương trình có nghiệm.
    3.2. Giá trị của nghiệm đó là x = -b/a
    3.3. Kết thúc thuật toán.
    • Sử dụng mã giả (Vay mượn ngôn ngữ nào đó (ví dụ Pascal) để biểu diễn thuật toán):
Đầu vào: a, b thuộc R
Đầu ra: nghiệm phương trình ax + b = 0

If a = 0 Then
Begin
    If b = 0 Then
        Xuất “Phương trình vô số nghiệm”
    Else
        Xuất “Phương trình vô nghiệm”
End
Else
    Xuất “Phương trình có nghiệm x = -b/a”
    • Sử dụng lưu đồ khối

    • Hoặc cài đặt bằng ngôn ngữ C/C++
#include <stdio.h>
#include <conio.h>

int main()
{
    int a, b;
    printf(“Nhap a, b: ”);
    scanf(“%d%d”, &a, &b);
    if (a == 0)
        if (b == 0)
            printf(“Phương trình VSN”);
        else
            printf(“Phương trình VN”);
    else
        printf(“x = %.2f”, -float(b)/a);
return 0; }

Ngôn ngữ lập trình C

Ngôn ngữ C là gì?

  • NNLT C là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Dennis Ritchie dùng trong hệ điều hành UNIX. Ngôn ngữ này đã lan rộng và trở thành một những ngôn ngữ phổ dụng nhất.
  • NNLT C là ngôn ngữ được ưa chuộng nhất để viết các phần mềm hệ thống, ứng dụng. 
  • Ngoài ra, C cũng thường được dùng làm phương tiện giảng dạy các ngành liên quan công nghệ thông tin.

Cấu trúc chương trình HELLO WORLD đầu tiên

#include <stdio.h>
int main() {
  printf("Hello World!");
  return 0;
}
  • #include <stdio.h> khai báo file stdio.h, nó là một thư viện mà ta có thể dùng sẵn. Trong trường hợp này hàm printf() mà mình sử dụng đã được định nghĩa trong sdtio.h. Nếu mình không khai báo stdio.h thì chương trình sẽ không hiểu hàm printf() là gì.
  • int main() hàm main (chương trình viết bởi c sẽ bắt đầu chạy từ hàm main). int biểu thị kết quả trả về của hàm main là kiểu số nguyên.
  • Các dấu {} được dùng để đánh dấu mở đầu và kết thúc của một khối lệnh, một hàm. Dấu ; được dùng để kết thúc 1 lệnh.
  • printf(“Hello World!”); thực hiện in ra dòng chữ Hello World!
  • return 0; kết quả trả về của hàm main là 0. Trong ví dụ này thì giá trị trả về của hàm main không quan trọng.

Quy ước khi viết chương trình C

  1. Kết thúc câu lệnh bằng dấu chấm phẩy ;
  2. Sử dụng thụt lề (các khoảng trắng đầu câu lệnh) cũng như xuống dòng để làm cấu trúc chương trình dễ hiểu.
  3. Sử dụng ký tự // để comment một dòng lệnh, và cặp dấu /* và */ để comment nhiều dòng lệnh.
  4. Comment có tác dụng giúp người đọc mã nguồn C dễ hiểu. Các quy tắc viết comment:
    • Chỉ viết comment khi cần thiết, không viết thông tin thừa.
    • Viết comment trước hàm và biến global.
    • Nội dung comment phải đúng và không mâu thuẫn với code.
    • Viết comment rõ ràng dễ hiểu, không gây loạn cho người đọc.
  5. Bao gồm cả hàm main(), chương trình trong C được tạo tạo ra bởi các hàm.
  6. Bắt đầu hàm bởi dấu { và kết thúc hàm bởi dấu }.

Bảng từ khoá (Keyword) trong C

autobreakcasecharconstcontinuedefaultdo
doubleelseenumexternfloatforgotoif
intlongregisterreturnshortsignedsizeofstatic
structswitchtypedefunionunsignedvoidvolatilewhile

Hằng và Biến trong C

Hằng trong C

  • Hằng là một giá trị hằng số không cho phép thay đổi trong quá trình chạy chương trình. Như vậy, chúng ta dùng hằng khi không muốn giá trị bị thay đổi trong suốt thời gian chương trình chạy.

    const <kiểu dữ liệu> <tên hằng> = <giá trị>;
    #define <tên hằng> <giá trị của hằng>
  • Có hai cách để định nghĩa hằng trong lập trình C.
    • Từ khóa const.
      #include <stdio.h>
       
      int main() {
          const float PI = 3.14;
          printf("Gia tri PI = %f", PI);
          return 0;
      }
    • Sử dụng #define preprocessor.
      #include <stdio.h>
      #define PI 3.14159
      
      int main() {
      int r;
      float chuvi, dientich;
      
          printf("Nhap ban kinh r:"); scanf("%d", &r);
          chuvi = 2*PI*r;
          dientich = PI*r*r;
          printf("Chu vi hinh tron la: %f\n", chuvi);
          printf("Dien tich hinh tron la: %f", dientich);
      
      return 0;
      }

Biến trong C

  • Một biến trong C là tên của vị trí bộ nhớ. Nó được sử dụng để lưu trữ dữ liệu. Giá trị của nó có thể được thay đổi và nó có thể được sử dụng lại nhiều lần. Mỗi biến trong C có một loại dữ liệu cụ thể, xác định kích thước của bộ nhớ của biến; phạm vi các giá trị có thể được lưu trữ trong bộ nhớ đó.
  • Biến là một cách để thể hiện vị trí bộ nhớ thông qua một cái tên để nó có thể được xác định dễ dàng. Tên của một biến bao gồm các chữ cái, chữ sốký tự gạch dưới. Nó bắt đầu bằng một chữ cái hoặc một gạch dưới. Biến trong C có phân biệt chữ hoa và chữ thường.
  • Vị trí khai báo: Biến thường được khai báo ở đầu chương trình, đầu hàm hoặc khối lệnh.
  • Có 2 loại biến theo vị trí khai báo:
    • Biến toàn cục: biến khai báo ở ngoài các hàm, các khối lệnh. Chu trình sống của chúng từ lúc bắt đầu chương trình tới khi kết thúc chương trình.
    • Biến cục bộ: biến khai báo bên trong các hàm, các khối lệnh. Chu trình sống từ khi bắt đầu khối lệnh tới khi khối lệnh được thực hiện xong.
  • Đặt tên cho biến, cho hằng hay cho hàm trong C cần phải tuân thủ những quy tắc như sau:

    • Tên không được có ký hiệu số ở đầu. Ví dụ: 1st, 3ab, … là sai.
    • Tên không được có dấu cách (space). Ví dụ: a b, he so a, he so b, … là sai.
    • Tên không được chứa các phép toán (toán tử). Ví dụ: a*b, a+b, a.b, … là sai.
    • Tên không được chứa các ký tự đặc biệt như: @, #, $, …
    • Tên không được trùng với từ khoá.
    • Hai biến bất kỳ nào đó nằm trong một hàm không được có cùng tên.
    • Hai biến bất kỳ nào đó nằm ngoài các hàm không được có cùng tên.
    • Tên biến không được trùng với tên hằng.
    • Có thể đặt tên biến hay tên hằng có cùng tên với tên hàm chứa nó, nhưng không nên làm điều này.
  • Cú pháp khai báo biến: (Khi khai báo biến gắn liền với kiểu dữ liệu)
    <kiểu dữ liệu> <danh sách biến>;
  • Ví dụ:
    int i,j; /* Khai báo biến i,j kiểu số nguyên */
    char ch; /* Khai báo biến ch kiểu chữ cái ASCII */
    char name[100]; /* Khai báo xâu kí tự tên name với độ dài lớn nhất là 100 kí tự */
    i = j = 0; /* Gán giá trị 0 cho 2 biến i,j */
    ch = 'A'; /* Gán giá trị chữ cái A in hoa cho biến ch */

Các kiểu dữ liệu trong C

Chúng ta tìm hiểu 3 nhóm kiểu dữ liệu chính trong ngôn ngữ C:

  • Primary: Kiểu dữ liệu cơ bản của ngôn ngữ C.
  • User defined: Kiểu dữ liệu người lập trình tự định nghĩa.
  • Derived: Kiểu dữ liệu nâng cấp từ dữ liệu cơ bản, phục vụ cho các mục đích khác nhau.

Primary (Nhóm kiểu dữ liệu cơ bản)

1. Kiểu ký tự Char
  • Kiểu kí tự char có 1 kiểu đặc biệt là String, bao gồm chuỗi nhiều char liên tiếp.
  • Kiểu char thường được sử dụng để lưu giữ các ký tự, các chữ và số (Theo bảng ký tự ASCII).
    KIỂUCỠ LƯU TRỮDÃY GIÁ TRỊ
    char1 byte-128 tới 127 hoặc 0 tới 255
    unsigned char1 byte0 tới 255
    signed char1 byte-128 tới 127
2. Kiểu số nguyên (kiểu int) trong C
  • Kiểu dữ liệu số nguyên chia thành 2 kiểu có dấu (signal) và không âm (unsigned).
  • Dựa vào giá trị cực đại (giới hạn) của kiểu giá trị sẽ chia thành các kiểu nhỏ như sau:
    KIỂUCỠ LƯU TRỮDÃY GIÁ TRỊ
    int2 hoặc 4 bytes-32,768 tới 32,767 hoặc -2,147,483,648 tới 2,147,483,647
    unsigned int2 hoặc 4 bytes0 tới 65,535 hoặc 0 tới 4,294,967,295
    short2 bytes-32,768 tới 32,767
    unsigned short2 bytes0 tới 65,535
    long4 bytes-2,147,483,648 tới 2,147,483,647
    unsigned long4 bytes0 tới 4,294,967,295
3. Kiểu số thực dấu chấm động (Floating-Point) trong C
  • Bảng dưới đây là các kiểu số thực dấu chấm động tiêu chuẩn:
    KIỂUCỠ LƯU TRỮDÃY GIÁ TRỊĐỘ CHÍNH XÁC
    float4 byte1.2E-38 tới 3.4E+386 vị trí thập phân
    double8 byte2.3E-308 tới 1.7E+30815 vị trí thập phân
    long double10 byte3.4E-4932 tới 1.1E+493219 vị trí thập phân
4. Kiểu Void

Kiểu void xác định không có giá trị nào. Nó được sử dụng trong 4 trường hợp sau đây:

  • Hàm trả về không có giá trị. Ví dụ: void Turn_on_led(led1);
  • Hàm không có tham số truyền vào. Ví dụ: int Turn_off_all(void);
  • Hàm không có giá trị và không có tham số truyền vào. Ví dụ: void Ham(void);
  • Con trỏ kiểu void* . Ví dụ: void *malloc (size_t size); sẽ học trong các bài con trỏ.

User defined (Nhóm dữ liệu do người dùng định nghĩa)

Người lập trình tự định nghĩa kiểu dữ liệu mình sử dụng. Kiểu dữ liệu được định nghĩa phải sử dụng các kiểu dữ liệu cơ bản để tạo ra. Nội dung về enum và typerdef các bạn đón xem chi tiết bài sau nha!

Derived (Nhóm kiểu dữ liệu nâng cấp)

Đây là các kiểu dữ liệu có chức năng đặc biệt, cũng được tạo ra bởi các kiểu dữ liệu cơ bản, để sử dụng trong các trường hợp đặc biệt:

Ví dụ:

  • Array: mảng, là chuỗi các kiểu dữ liệu.
  • Pointer: con trỏ, là địa chỉ của ô nhớ.
  • Struct: tạo ra cấu trúc dữ liệu riêng.
  • Union: Tập hợp, là hợp của nhiều kiểu dữ liệu với nhau.

Hàm sizeof

  • Hàm sizeof(tham số truyền vào) để kiểm tra xem biến, hoặc kiểu dữ liệu đó chiếm bao nhiêu byte trong bộ nhớ.
  • Để kiểm tra kích thước các kiểu dữ liệu cơ bản và phạm vi của nó, chúng ta có thể làm như sau:
    #include <stdio.h>
    #include<limits.h> // for int,char macros 
    #include<float.h> // for float,double macros 
     
    int main(){
        char c;
        short s;
        int i;
        unsigned int ui;
        float f;
        double d;
        long long ll;
      
        // sizeof
        printf("Size of char is %d\n", sizeof c); // Ctrl C, Ctrl V
        printf("Size of short is %d\n", sizeof s);
        printf("Size of int is %d\n", sizeof i);
        printf("Size of unsigned int is %d\n", sizeof ui);
        printf("Size of float is %d\n", sizeof f);
        printf("Size of double is %d\n", sizeof d);
        printf("Size of long long is %d\n", sizeof ll);
     
        // Get min_val and max_val of data_type
        printf("char ranges from : %d to %d\n", CHAR_MIN, CHAR_MAX);
        printf("int ranges from : %d to %d\n", INT_MIN, INT_MAX);
        printf("unsigned int ranges from : 0 to %lli\n", UINT_MAX);
    }

Nhập/Xuất trong C

Câu lệnh xuất trong C

  • Cú pháp: printf(<chuỗi định dạng>[, <đs1>, <đs2>, …]);
  • <chuỗi định dạng> là cách trình bày thông tin xuất và được đặt trong cặp nháy kép “ ”.
    • Văn bản thường (literal text).
      • Được xuất y hệt như lúc gõ trong chuỗi định dạng.
      • Ví dụ: printf(“Hello World”); => Xuất chuỗi: Hello World.
    • Ký tự điều khiển (escape sequence). Gồm dấu \ và một số ký tự như sau:
      • \a: Tiếng chuông
      • \b: Lùi lại 1 bước
      • \n: Xuống dòng
      • \t: Dấu Tab
      • \\: In dấu \
      • \?: In dấu ?
      • \”: In dấu “
    • Đặc tả (conversion specifier)
      • %d: số nguyên hệ 10 có dấu
      • %u: số nguyên hệ 10 không dấu
      • %x: số nguyên hệ 16
      • %o: số nguyên hệ bát phân
      • %s: xâu kí tự
      • %c: một kí tự đơn
      • %f: số chấm động cố định
      • %e: số chấm động (ký hiệu có số mũ)
      • l : Tiền tố dùng kèm với %d, %x, %o để chỉ số nguyên dài (ví dụ %ld)
    • Ví dụ
      • int a = 10, b = 20;
      • printf(“%d”, a); => Xuất ra 10
      • printf(“%d”, b); => Xuất ra 20
      • printf(“%d %d”, a, b); => Xuất ra 10 20
      • float x = 15.06;
      • printf(“%f”, x); => Xuất ra 15.060000
      • printf(“%f”, 1.0/3); => Xuất ra 0.333333

Câu lệnh nhập trong C

  • Cú pháp: scanf(<chuỗi định dạng>[, <đs1>, <đs2>, …]);
  • <chuỗi định dạng> giống định dạng xuất nhưng chỉ có các đặc tả.
  • Các đối số là tên các biến sẽ chứa giá trị nhập và được đặt trước dấu &.
  • Ví dụ: cho a và b kiểu số nguyên
    • scanf(“%d”, &a); // Nhập giá trị cho biến a.
    • scanf(“%d”, &b); // Nhập giá trị cho biến b.
    • => scanf(“%d%d”, &a, &b);
    • Các câu lệnh sau đây sai.
      • scanf(“%d”, a); // Thiếu dấu &.
      • scanf(“%d”, &a, &b);// Thiếu %d cho biến b.
      • scanf(“%f”, &a); // a là biến kiểu số nguyên.
      • scanf(“%9d”, &a); // không được định dạng.
      • scanf(“a = %d, b = %d”, &a, &b”);

Bài tập

  1. Nhập năm sinh của một người và tính tuổi của  người đó.
  2. Nhập 2 số a và b. Tính tổng, hiệu, tích và thương của hai số đó.
  3. Nhập số lượng và đơn giá sản phẩm. Tính tiền và thuế giá trị gia tăng phải trả, biết:
    • tiền = số lượng * đơn giá
    • thuế giá trị gia tăng = 10% tiền
  4. Nhập điểm thi và hệ số 3 môn Toán, Lý, Hóa của một sinh viên. Tính điểm trung bình.
  5. Nhập chiều dài, chiều rộng hình chữ nhật. Tính chu vi và diện tích của hình chữ nhật đó.
  6. Nhập bán kính của đường tròn. Tính chu vi và diện tích của hình tròn đó.
  7. Nhập vào số xe (gồm 4 chữ số) của bạn. Cho biết số xe của bạn được mấy nút?

VIDEO HƯỚNG DẪN CHI TIẾT

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây