NHẬP MÔN LẬP TRÌNH C
About me.Xin chào tất cả các bạn đang đọc bài viết này của mình, mình tên là Thanh Bình và hiện đang là sinh viên của một trường đại học ở TP.HCM. Hiện mình đang theo học chuyên ngành Kỹ thuật phần mềm, trong quá trình học thì mình thấy có rất nhiều bạn vẫn còn nhiều thắc mắc về ngôn ngữ lập trình C, và nhằm mục đích để các bạn không phải trong ngành CNTT muốn tìm hiểu về lập trình nên mình đã lập ra bài viết này nhằm cung cấp kiến thức cơ bản về C cho các bạn. Và từ những kiến thức cơ bản này sẽ là nền tảng để các bạn có thể học sâu lên các ngôn ngữ khác hoặc các chủ đề khác nhau như Cấu trúc dữ liệu & giải thuật, lập trình hướng đối tượng. Bài viết được viết dựa trên kiến thức của bản thân mình và tham khảo một số tài liệu, sách, video..... Do vậy không tránh khỏi nhiều sai sót trong quá trình trình bày kiến thức nên mong mọi người bỏ qua hoặc góp ý qua mail của mình.
Gmail: [email protected]
Trong quá trình học, mình khuyên các bạn nên cài DevC++ hoặc Visual Studio để có thể code C.
CHƯƠNG 1: CHƯƠNG TRÌNH, DỮ LIỆU CƠ SỞ VÀ PHÉP TOÁN
I. CHƯƠNG TRÌNH ĐƠN GIẢN
Mình sẽ trình bày kiến thức dựa trên code và các ví dụ được trình bày bên dưới.
C:
/* HelloWorld.c */
#include <stdio.h>
int main()
{
printf("Hello World");
return 0;
}
Đoạn code bên trên là một chương trình C cơ bản. Ý nghĩa của các dòng code như sau.
/* HelloWorld.c */ : Mỗi dòng ghi chú được bắt đầu bởi // đối với C. Và để ghi chú trên nhiều dòng thì ta dùng kí hiệu như sau: /* ..... */, khi chạy chương trình thì các dòng ghi chú này sẽ được chương trình bỏ qua. Ghi chú có tác dụng để giúp người đọc có thể hiểu đoạn code đó dùng để làm gì, có chức năng gì nhằm mục đích làm rõ ý nghĩa của những đoạn code.
#include <stdio.h> : Đây là lệnh khai báo sử dụng các hàm hay đối tượng có sẵn của ngon ngữ lập trình C. Trong trường hợp này là bộ nhập xuất chuẩn (<stdio.h>). Câu lệnh printf(); đã được định nghĩa sẵn trong trong bộ nhập xuất này.
int main() : Đây là hàm main, chương trình sẽ bắt đầu chạy từ dòng này. Lúc trước thì ta có thể khai báo hàm main là void main(), nhưng hiện tại cách khai báo này không còn được các trình biên dịch chấp nhận. Kiểu trả về là int nghĩa là hàm này sẽ nhận một số lượngđ ối số tùy ý và kiểu trả về là một số nguyên integer. Do đó khi khai báo hàm int main() ta phải có return 0; để trả về giá trị của hàm int main().
{ : Chương trình bắt đầu bằng dấu móc mở {.
printf("Hello World"); : Đây là câu lệnh in dùng để in dữ liệu ra thiết bị xuất chuẩn ( màn hình máy tính ). Nếu dùng các trình biên dịch ( IDE ) thì lệnh printf này sẽ được xuất ra trên màn hình Command Line ( CMD ). Những gì nằm trong dấu ngoặc kép ( " " ) sẽ được in ra.
return 0; : Như đã nói ở trên, do ta khai báo hàm main là kiểu int nên ta phải có giá trị trả về bằng câu lệnh return. Giá trị 0 là do quy định rằng chương trình không có lỗi thì hàm main sẽ được chạy.
} : Chương trình sẽ kết thúc bằng dấu móc đóng }.
C:
/* Hello.c */
#include <stdio.h>
int main()
{
printf("Hello Everyone!\n");
printf("Let's learn the programming languages\n");
return 0;
}
Đoạn code này cũng tương tự như đoạn code trên nhưng có một vài điểm khác biệt. Ký tự '\n' nghĩa là ký tự xuống dòng ( newline ), kết quả là lần in tiếp theo sẽ bắt đầu trên một dòng mới. Ngoài '\n' ta có thể sử dụng các ký tự khác nhau như '\t' ( dấu Tab )... Khi ta muốn đặt các dấu ' hoặc " vào trong printf thì để tránh lỗi chương trình ta sẽ thêm dấu \ trước các dấu đó. Ví dụ như \', \".
I.1 Kiểu dữ liệu, hằng và biến trong chương trình
Hằng số theo toán học là một đại lượng có giá trị không đổi. Để khai báo hằng trong C thì ta dùng từ khóa #defind nameConst value , trong đó nameConst là tên hằng số, value là giá trị của hằng số.
C:
// HelloWorld.c
#include <stdio.h>
#define Pi 3.14159
int main()
{
return 0;
}
Ở đây ta đã khai báo một hằng số Pi với giá trị là 3.14159.
Biến là một vị trí lưu trữ gắn liền với một tên tượng trưng liên quan, chứa một số lượng thông tin được biến đến hay chưa được biến đến mà được gọi là giá trị. Nói cách khác, biến được hiểu như biến trong toán học ( x, y, z.... ) nhưng trong lập trình thì biến còn dùng để lưu trữ giá trị.
Cú pháp khai báo biến như sau :
kiểu_dữ_liệu tên_biến hoặc kiểu_dữ_liệu tên_biến = giá_trị
int number; hoặc int number = 2;
Ở đây ta tạo một biến number thuộc kiểu int. Số hai sẽ được gán cho biến number đó và biến number có giá trị là 2. Mỗi biến khi được tạo sẽ được trình biên dịch cấp phát cho một địa chỉ gọi là địa chỉ của biến, địa chỉ này có dạng là mã Hex ( hệ thập lục phân ).
Cú pháp khai báo biến :
kiểu_dữ_liệu tên_biến; Ví dụ : float number;
Cú pháp khởi tạo biến:
kiểu_dữ_liệu tên_biến = giá_trị; Ví dụ : float number = 8.9;
Kiểu dữ liệu gồm có 2 loại kiểu dữ liệu là kiểu dữ liệu nguyên thủy và kiểu dữ liệu khác.
I.1.1 Kiểu số nguyên
Kiểu | Kích thước lưu trữ | Phạm vi giá trị | Định dạng |
---|---|---|---|
char | 1 byte | -128 to 127 or 0 to 255 | %c |
unsigned char | 1 byte | 0 to 255 | %c |
signed char | 1 byte | -128 to 127 | %s |
int | 4 bytes | -32,768 to 32,767 or -2,147,483,648 to 2,147,483,647 | %d |
unsigned int | 4 bytes | 0 to 65,535 or 0 to 4,294,967,295 | %u |
short | 2 bytes | -32,768 to 32,767 | |
unsigned short | 2 bytes | 0 to 65,535 | |
long | 4 bytes | 2,147,483,648 to 2,147,483,647 | %ld |
unsigned long | 4 bytes | 0 to 4,294,967,295 |
I.1.2 Kiểu số thực ( dấu chấm động, thập phân )
Kiểu | Kích thước lưu trữ | Phạm vi giá trị | Phần thập phân | Định dạng |
---|---|---|---|---|
float | 4 bytes | 1.2E-38 to 3.4E+38 | 6 vị trí sau thập phân | %f |
double | 8 bytes | 2.3E-308 to 1.7E+308 | 15 vị trí sau thập phân | %lf |
long double | 10 bytes | 3.4E-4932 to 1.1E+4932 | 19 vị trí sau thập phân | %Lf |
Code demo.
C:
// Hello.c
#include <stdio.h>
int main()
{
int firstNumber = 10;
float secondNumber = 5.9;
printf("Export first number %d",firstNumber);
printf("Export second number %f",secondNumber);
return 0;
}
Ở đoạn code trên, mình đã khai báo 2 biến là firstNumber và secondNumber với kiểu dữ liệu số nguyên và số thực. Khi muốn in ra giá trị của biến thì trong câu lệnh printf ta sử dụng các định dạng như hai bảng trên đã ghi như kiểu int thì dùng %d, float thì dùng %f...
Để coi kích thước của các biến mình đã khai báo, có thể sử dụng hàm sizeof().
C:
// HelloWorld.c
#include <stdio.h>
int main()
{
short Delta = 9;
printf("Kich thuoc bien Delta = %d\n", sizeof(Delta));
printf("Kich thuoc bien int = %d\n", sizeof(int));
printf("Kich thuoc bien long = %d\n", sizeof(long));
printf("Kich thuoc bien float = %d\n", sizeof(float));
printf("Kich thuoc bien double = %d\n", sizeof(double));
printf("Kich thuoc bien char = %d\n", sizeof(char));
return 0;
}
* Quy ước đặt tên biến
Tên biến nên được đặt có ý nghĩa, thể hiện biến đó dùng để làm gì. Với tên biến có nhiều chữ thì ta nên viết thường chữ đầu và với mỗi chữ tiếp theo ta nên viết hoa. Tên biến phải gợi nhớ và có liên quan về mặt ngữ nghĩa với đối tượng được đặt tên. Chẳng hạn nếu muốn sử dụng một biến để lưu tổng thì đặt tên là tong hoặc sum, muốn dùng một biến để lưu diện tích hay chu vi thì đặt tên biến là dienTich hoặc S, chuVi hoặc P.
Ví dụ: int fistNumber;
Tên biến không được bắt đầu bằng số, ta có thể đặt tên bằng cách dùng các chữ cái từ A đến Z, các số từ 0 đến 9, dấu gạch _ (gạch dưới, không phải dấu trừ). Tên phải luôn bắt đầu bằng chữ cái.
Ví dụ: int tongCua2So, delta_Avg;
II. KHÁI NIỆM VỀ NHẬP, XUẤT, TÍNH TOÁN
Để nhập giá trị từ bàn phím trong ngôn ngữ lập trình C, ta sử dụng hàm scanf(). Ví dụ để nhập bán kính hình tròn và lưu vào biến R có kiểu float, ta có thể gọi hàm scanf("%f",&R);. Dấu & là thể hiện giá trị của biến R. còn %f là định dạng của kiểu dữ liệu ( ở đây khai báo là float nên phải dùng %f ).
C:
// Sum.c
#include <stdio.h>
int main()
{
int firstNumber, secondNumber;
int sum;
printf("Nhap gia tri cua firstNumber");
scanf("%d",&firstNumber);
printf("Nhap gia tri cua secondNumber");
scanf("%d",&secondNumber);
sum = firstNumber + secondNumber;
printf("Tong hai so la %d\n",sum);
return 0;
}
Đoạn code trên mô tả chương trình tính tổng hai số, biến sum dùng để nhận giá trị tổng của hai biến firstNumber và secondNumber.
II.1 Các phép toán trong C
Cũng giống như toán học, trong ngôn ngữ C có những phép toán cơ bản và những phép toán logic. Các phép cơ bản là + - * / %. Phép chia ( / ) được gọi là phép chia lấy phần nguyên.
Ví dụ : 5 / 2 = 2 ( mặc dù kết quả là 2.5 nhưng phần nguyên ở đây là 2 nên kết quả là 2 ).
Phép chia ( % ) được gọi là phép chia lấy dư.
Ví dụ : 5 / 2 = 1 ( do phần dư được tính như sau: 5 / 2 = 2. 2 x 2 = 4. 5 - 4 = 1 ).
C:
// Operator.c
#include <stdio.h>
int main()
{
int firstNumber = 5;
int secondNumber = 3;
printf("Tong cua hai so = %d\n", firstNumber + secondNumber);
printf("Hieu cua hai so = %d\n", firstNumber - secondNumber);
printf("Tich cua hai so = %d\n", firstNumber * secondNumber);
printf("Thuong cua hai so = %d\n", firstNumber / secondNumber);
printf("Chia lay phan du %d\n", firstNumber % secondNumber);
return 0;
}
Ngoài những phép toán cơ bản trên còn có phép toán logic. Ở phép toán này chỉ chứa hai giá trị là 0 và 1. 0 tương ứng với false và 1 tương ứng với true.
C:
// Logic.c
#include <stdio.h>
int main()
{
int numberOne = 10;
int numberTwo = 20;
printf(numberOne == numberTwo);
return 0;
}
Kết quả trả về ở đoạn code trên sẽ là false do 10 không bằng 20.
II.2 Phép gán và lệnh viết ngắn
Việc tính toán trong chương trình được thực hiện bằng cách tính toán và chép kết quả tính toán vào một biến nằm bên trái của phép gán. Ví dụ:
- Lệnh sum = A + B : tính tổng hai giá trị trong biến A và B và gán kết quả vào biến sum.
- Lệnh sum = sum + 2 : lấy giá trị đang có trong biến sum rồi cộng thêm 2 và gán kết quả mới vào biến sum.
- Lệnh sum = sum + n : lấy giá trị đang có trong biến sum và biến n rồi cộng nó lại với nhau và ghi kết quả mới vào biến sum.
- Có thể viết sum++ (hay ++sum) thay cho sum = sum + 1;
- Có thể viết sum += 2 thay cho lệnh gán sum = sum + 2;
- Có thể viết sum += n thay cho lệnh gán sum = sum + n;
- Viết n-- hay --n thay cho n = n - 1;
- Viết p -= x thay cho p = p - x;
- Viết p *= n thay cho p = p * n;
Sửa lần cuối: