Vài lời dài dòng

Khi lập trình, rất hiếm khi chương trình của chúng ta chỉ hiển thị một thứ giống nhau trong các lần chạy. Ví dụ như chương trình máy tính của bạn, nó yêu cầu bạn phải nhập vào cái gì đó sau đó cho kết quả.

Để làm được điều thì bạn sẽ cần một thứ để chứa giá trị mà người dùng nhập vào, và thứ bạn cần chính là biến.

Không dài dòng nữa, vào vấn đề chính nhé!

Biến - Variable

Khái niệm về biến trong lập trình có thể được hiểu là một nơi để chứa dữ liệu được gắn mác cố định do người lập trình đặt ra. Hoặc mọi người cũng có thể hiểu nó là một cái hộp dùng để chứa dữ liệu và được dán tên lên đó.

Trong C và đa số các ngôn ngữ, trước khi sử dụng một biến, chúng ta sẽ cần khai báo nó. Ví dụ

int so_luong_nguoi_yeu;

Đoạn code trên có thể được hiểu là: bạn đang muốn có một biến tên là so_luong_nguoi_yeu và dùng để chứa số nguyên (integer).

Tuy nhiên, nếu các bạn muốn chứa một kiểu dữ liệu khác số nguyên thì bạn sẽ cần khai báo khác. Ví dụ bạn đang muốn tạo một biến có tên là nhiet_do_trong_phong và dùng nó để chứa các giá trị số thập phân thì bạn sẽ cần khai báo như sau.

float nhiet_do_trong_phong;

Các từ khóa như intfloat là hai trong những kiểu dữ liệu có sẵn trong C. Danh sách các kiểu dữ liệu căn bản trong C theo như bảng bên dưới.

int     - số nguyên
float   - số thập phân
char    - chứa một chữ trong bảng mã ACII

long    - số nguyên
double  - số thập phân

Lưu ý về việc đặt tên cho biến, bạn cần tránh sử dụng các keyword trong C như là if, int. Hơn nữa, tên biến cũng không được có khoảng trắng giữa các chữ và không được phép bắt đầu bằng một số. Một số compiler không cho phép đặt tên biến dài quá 31 ký tự, vậy nên đây cũng là một điều nên lưu ý khi đặt tên cho biến.

Nhập dữ liệu vào chương trình - Input

Sau khi khởi tạo một biến, chúng ta có thể đưa cho nó giá trị bằng cách gán giá trị cho biến hoặc sẽ yêu cầu người dùng nhập vào sau đó. Đây là ví dụ cho hai cách trên.

/* Gán giá trị cho biến; */

int so_luong_nguoi_yeu;
// cho biến so_luong_nguoi_yeu có giá trị là 10
so_luong_nguoi_yeu = 10;
/* Yêu cầu người dùng nhập giá trị cho biến; */

int so_luong_nguoi_yeu;
scanf("%d", &so_luong_nguoi_yeu);

Trong ví dụ vừa rồi có lệnh mới đó là scanf(), câu lệnh này sẽ cho phép người dùng nhập thông tin từ bàn phím và nó cần hai tham số truyền vào.

Tham số đầu tiên bắt đầu bằng dấu % có nhiệm vụ cung cấp thông tin rằng loại dữ liệu nào sẽ được nhập vào. Trong ví dụ trên lại dữ liệu mà mình muốn nhập vào đó là số nguyên (ở dạng decimal), các bạn có thể tìm hiểu thêm về cái này với từ khóa format specifications in C.

Tham số thứ hai đó là địa chỉ ô nhớ của biến mà bạn vừa khởi tạo và được bắt đầu bằng ký tự &, từ đó lệnh scanf sẽ biết nên lưu giá trị mà người dùng nhập vào ở đâu.

Cả câu lệnh trên có thể được hiểu là hãy lấy một giá trị số nguyên được nhập vào và lưu vào địa chỉ của biến có tên là so_luong_nguoi_yeu.

Sau khi câu lệnh này được thực thi, giá trị nhập vào sẽ được lưu vào biến so_luong_nguoi_yeu.

Xuất dữ liệu từ chương trình - Output

Trong bài viết trước, mình đã có đề cập cách in một câu ra màn hình sử dụng câu lệnh printf(). Lần này mình sẽ viết rõ hơn về cách dùng printf cho các loại dữ liệu khác nhau. Cũng như kết hợp cả hai việc nhập và xuất dữ liệu trong một chương trình đơn giản.

Lệnh in ra màn hình sẽ luôn cần ít nhất là một tham số. Tuy nhiên, trong ví dụ sau đây, chúng ta sẽ thấy cách dùng printf với nhiều hơn một tham số.

int main() {
  int so_luong_nguoi_yeu;
  printf("Hay nhap so luong nguoi yeu ban muon co: ");
  scanf("%d", &so_luong_nguoi_yeu);
  printf("Ban muon co %d nguoi yeu!\n", so_luong_nguoi_yeu);
  printf("Vay thi ra ngoai va kiem vai nguoi di :))\n");

  return 0;
}

Trong câu lệnh printf("Ban muon co %d nguoi yeu!\n", so_luong_nguoi_yeu);, printf() được truyền vào hai tham số.

Tham số đầu tiên đó là câu mà bạn muốn in ra. Trong câu đấy sẽ chứa một hoặc nhiều ký tự format, ví dụ như trong chương trình trên đó là %d, được dùng để in ra giá trị số nguyên. Cũng như nhập giá trị, khi in giá trị từ một biến, chúng ta cần biết biết đó có kiểu giá trị là gì từ đó dùng ký tự format chính xác.

Tham số thứ hai chính là biến chứa giá trị mà bạn muốn in ra trong câu trên. Tùy vào số lượng biến và kiểu giá trị của biến, số lượng các ký tự format sẽ tăng theo cũng như thay đổi tùy theo kiểu dữ liệu. Các giá trị trong biến cũng sẽ được in ra theo thứ tự lần lượt của các ký tự format từ trái sang phải.

Chương trình trên sẽ in ra dòng chữ Hay nhap so luong nguoi yeu ban muon co:, và chở đợi bạn nhập vào một số. Output cho chương trình nhỏ trên sẽ là

Hay nhap so luong nguoi yeu ban muon co: 50
Ban muon co 50 nguoi yeu!
Vay thi ra ngoai va kiem vai nguoi di :))

Hoặc khi bạn nhập một số khác

Hay nhap so luong nguoi yeu ban muon co: 2340
Ban muon co 2340 nguoi yeu!
Vay thi ra ngoai va kiem vai nguoi di :))

Bonus

Các bạn có thấy hai kiểu dữ liệu là longdouble không?

Đó là hai kiểu khá là đặc biệt. Đối với kiểu int, trong hệ điều hành 16bit DOS, nó chỉ cho phép chứa giá trị từ khoảng -32768 đến 32767. Trong khi đó, nếu dùng long thì giá trị có thể chứa được là từ -2147483648 đến 2147483647. Nhưng trong các hệ điều hành 32 bit sau này, int cũng có thể được xem như long.

Đối với double (viết tắt của double-precision floating-point), nó được dùng để chứa giá trị thập phân. Khi dùng float chúng ta chỉ có thể chứa được số thập phân với 5 hoặc 6 số sau dấu phẩy. Tuy nhiên với double chúng ta có thể chưa một số với 11 hoặc 12 số sau dấu phẩy, do đó có sự chính xác cao hơn.

Cách scanf của các kiểu dữ liệu khác nhau:

// Nhập vào kiểu float
scanf("%f", &ten_bien)

// Nhập vào kiểu double
scanf("%lf", &ten_bien)

// Nhập vào kiểu long
scanf("%ld", &ten_bien)

// Nhập kiểu ký tự
scanf("%c", &ten_bien)

Cách printf của các kiểu dữ liệu khác nhau:

// In ra kiểu float
printf("%f", ten_bien)

// In ra kiểu double
printf("%lf", ten_bien)

// In ra kiểu long
printf("%ld", ten_bien)

// In ra kiểu ký tự
printf("%c", ten_bien)