Ngôn ngữ lập trình C là một trong những ngôn ngữ đã làm thay đổi hoàn toàn thế giới lập trình từ những năm 1970. Được tạo ra bởi Dennis Ritchie tại AT&T Bell Labs, C không chỉ là nền tảng của nhiều ngôn ngữ hiện đại như C++, Java, và Python, mà còn là “người hùng thầm lặng” đằng sau nhiều ứng dụng mạnh mẽ mà chúng ta sử dụng hàng ngày. Học lập trình C cơ bản sẽ không chỉ giúp bạn phát triển các ứng dụng mạnh mẽ, mà còn mở ra cánh cửa để tiếp cận và nắm bắt những ngôn ngữ lập trình khác một cách dễ dàng.

Bài viết này là phần đầu tiên trong chuỗi bài viết về ngôn ngữ lập trình C và C++. Trong phần này, chúng ta sẽ cùng đi qua những khái niệm cơ bản của ngôn ngữ lập trình C, giúp bạn xây dựng nền tảng vững chắc. Trước khi chúng ta bước vào các câu lệnh nâng cao trong C++, điều quan trọng là phải hiểu rõ và thành thạo các lệnh cơ bản trong C. Những kiến thức nền tảng này sẽ giúp bạn dễ dàng hơn khi chuyển sang học C++.

Chuỗi bài viết học lập trình C cơ bản và lập trình C++ cơ bản có nội dung như sau:

Cú pháp lập trình C cơ bản: Cách viết và chạy chương trình “Hello, World!”

Chương trình đầu tiên mà mọi lập trình viên học là “Hello, World!”.

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}
  • Lệnh này dùng để: In ra chuỗi “Hello, World!” trên màn hình.
  • Output: Hello, World!

Diễn giải:

  • #include <stdio.h>: Thêm thư viện chuẩn vào chương trình.
  • int main(): Hàm chính, điểm bắt đầu của chương trình.
  • printf(“Hello, World!\n”);: In ra màn hình chuỗi “Hello, World!”.
  • return 0;: Kết thúc chương trình và trả về giá trị 0.

Lập trình C cơ bản: Biến và Kiểu dữ liệu

Khai báo và khởi tạo biến

Biến là một tên gọi dùng để lưu trữ dữ liệu. Ví dụ:

int age = 25;
float height = 1.75;
char initial = 'A';
  • Lệnh này dùng để: Khai báo và khởi tạo các biến age, height, và initial với các giá trị tương ứng.

Các kiểu dữ liệu cơ bản trong C

  • int: Số nguyên. Ví dụ: int a = 5; (a là một số nguyên có giá trị là 5)
  • float: Số thực đơn. Ví dụ: float b = 3.14; (b là một số thực có giá trị là 3.14, độ dài 6 hoặc 7 chữ số thập phân)
  • double: Số thực kép. Ví dụ: double c = 3.141592653589793; (c là một số thực kép với giá trị 3.141592653589793 độ dài gấp đôi số thực đơn)
  • char: Ký tự đơn. Ví dụ: char d = ‘A’; (d là một ký tự đơn có giá trị là ‘A’)

Lập trình C cơ bản: Câu lệnh Điều kiện

Câu Lệnh if, else if, và else

Cấu trúc điều kiện cho phép chương trình thực hiện các khối mã khác nhau dựa trên điều kiện:

int age = 20;
if (age >= 18) {
    printf("You are an adult.\n");
} else {
    printf("You are not an adult.\n");
}
  • Lệnh này dùng để: Kiểm tra điều kiện age >= 18 và in ra thông báo tương ứng.
  • Output:
    • Nếu age >= 18: You are an adult.
    • Nếu age < 18: You are not an adult.

Câu Lệnh switch

Cấu trúc switch cho phép kiểm tra giá trị của một biến:

char grade = 'B';
switch (grade) {
    case 'A':
        printf("Excellent!\n");
        break;
    case 'B':
        printf("Good!\n");
        break;
    case 'C':
        printf("Average.\n");
        break;
    default:
        printf("Invalid grade.\n");
        break;
}
  • Lệnh này dùng để: Kiểm tra giá trị của grade và in ra thông báo tương ứng.
  • Output:
    • Nếu grade là ‘A’: Excellent!
    • Nếu grade là ‘B’: Good!
    • Nếu grade là ‘C’: Average.
    • Nếu grade là giá trị khác: Invalid grade.

Lập trình C cơ bản: Vòng lặp trong C

Vòng Lặp for

Vòng lặp for thường được dùng khi biết trước số lần lặp:

for (int i = 0; i < 10; i++) {
    printf("%d\n", i);
}
  • Lệnh này dùng để: Lặp từ 0 đến 9 và in ra từng giá trị của i.
  • Output: In ra các giá trị từ 0 đến 9 trên mỗi dòng.

Vòng Lặp while và do-while

While: Thực hiện lặp khi điều kiện đúng.

int i = 0;
while (i < 10) {
    printf("%d\n", i);
    i++;
}
  • Lệnh này dùng để: Lặp khi điều kiện i < 10 đúng và in ra giá trị của i.
  • Output: In ra các giá trị từ 0 đến 9 trên mỗi dòng.

Do-while: Thực hiện ít nhất một lần trước khi kiểm tra điều kiện.

int i = 1;
do {
    printf("%d\n", i);
    i++;
} while (i < 0);
  • Lệnh này dùng để: Thực hiện ít nhất một lần trước khi kiểm tra điều kiện i < 0 và in ra giá trị của i.
  • Output: In ra giá trị 1.

Lập trình C cơ bản: Mảng và Con trỏ

Khai báo và sử dụng Mảng

Mảng là tập hợp các phần tử, hay còn gọi là danh sách các phần tử cùng kiểu dữ liệu:

int numbers[5] = {1, 2, 3, 4, 5};
printf("%d\n", numbers[0]); // In ra phần tử đầu tiên
  • Lệnh này dùng để: Khai báo mảng numbers và in ra phần tử đầu tiên của mảng.
  • Output: 1

Giới thiệu về con trỏ và cách sử dụng

Con trỏ là biến lưu trữ địa chỉ của biến khác:

int x = 10;
int *ptr = &x;
printf("%d\n", *ptr); // In ra giá trị của x thông qua con trỏ
  • Lệnh này dùng để: Khai báo biến x, con trỏ ptr trỏ đến x, và in ra giá trị của x thông qua con trỏ ptr.
  • Output: 10

Lập trình C cơ bản: Hàm trong C

Định nghĩa và Gọi hàm

Hàm là khối mã thực hiện một nhiệm vụ cụ thể:

void greet() {
    printf("Hello!\n");
}

int main() {
    greet(); // Gọi hàm greet
    return 0;
}
  • Lệnh này dùng để: Định nghĩa hàm greet và gọi hàm trong main.
  • Output: Hello!

Tham số của hàm và phạm vi biến

Hàm có thể nhận tham số và trả về giá trị:

int add(int a, int b) {
    return a + b;
}

int main() {
    int sum = add(5, 3);
    printf("Sum: %d\n", sum);
    return 0;
}
  • Lệnh này dùng để: Định nghĩa hàm add với hai tham số và trả về tổng của chúng.
  • Output: Sum: 8

Lập trình C cơ bản: Struct và Union

Định nghĩa và sử dụng struct

struct cho phép nhóm các biến khác nhau dưới một tên chung:

struct Person {
    char name[50];
    int age;
};

int main() {
    struct Person person1 = {"John Doe", 30};
    printf("Name: %s, Age: %d\n", person1.name, person1.age);
    return 0;
}
  • Lệnh này dùng để: Định nghĩa struct Person và khởi tạo biến person1 với các giá trị cụ thể, sau đó in ra tên và tuổi của person1.
  • Output: Name: John Doe, Age: 30

Giới thiệu về union

union là một cấu trúc đặc biệt, trong đó các biến dùng chung một vùng nhớ:

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data data;
    data.i = 10;
    printf("data.i: %d\n", data.i);
    data.f = 220.5;
    printf("data.f: %f\n", data.f);
    return 0;
}
  • Lệnh này dùng để: Định nghĩa union Data, khởi tạo biến data với các giá trị cụ thể, sau đó in ra các giá trị của data.
  • Output:
    • Nếu data.i được in ra: data.i: 10
    • Nếu data.f được in ra: data.f: 220.500000

Lập trình C cơ bản: Làm việc với tệp tin

Mở và đóng tệp

FILE *fptr;
fptr = fopen("file.txt", "w"); // Mở tệp để ghi
if (fptr == NULL) {
    printf("Error opening file!\n");
    return 1;
}
fclose(fptr); // Đóng tệp
  • Lệnh này dùng để: Mở tệp file.txt để ghi và đóng tệp sau khi mở.

Đọc và ghi dữ liệu vào tệp

fptr = fopen("file.txt", "w");
fprintf(fptr, "Hello, World!\n");
fclose(fptr);
  • Lệnh này dùng để: Mở tệp file.txt để ghi, ghi chuỗi “Hello, World!” vào tệp, và sau đó đóng tệp.

Lập trình C cơ bản: Cấp phát và giải phóng bộ nhớ động với malloc và free

int *ptr = (int *)malloc(5 * sizeof(int));
if (ptr == NULL) {
    printf("Memory not allocated.\n");
    return 1;
}
// Sử dụng bộ nhớ
free(ptr); // Giải phóng bộ nhớ
  • Lệnh này dùng để: Cấp phát bộ nhớ động cho mảng ptr và giải phóng bộ nhớ sau khi sử dụng.

Câu hỏi thường gặp về lập trình C cơ bản

Làm thế nào để bắt đầu học lập trình C cơ bản?

Bắt đầu với các tài liệu cơ bản và thực hành viết các chương trình đơn giản. Tìm hiểu cú pháp và các khái niệm cơ bản như biến, kiểu dữ liệu, câu lệnh điều kiện, vòng lặp.

Những lỗi thường gặp khi lập trình C và cách khắc phục?

  • Lỗi cú pháp: Đọc kỹ thông báo lỗi từ trình biên dịch và sửa lại mã. Các lỗi cú pháp thường gặp bao gồm thiếu dấu chấm phẩy, dấu ngoặc không khớp.
  • Lỗi phân đoạn (Segmentation Fault): Xảy ra khi truy cập vào bộ nhớ không hợp lệ, chẳng hạn như dereferencing một con trỏ null hoặc vượt quá chỉ số mảng. Kiểm tra các con trỏ và chỉ số mảng cẩn thận.
  • Lỗi logic: Chương trình chạy nhưng không cho kết quả như mong đợi. Cần kiểm tra lại logic của chương trình và sử dụng các công cụ debug để tìm hiểu vấn đề.

Làm thế nào để debug chương trình C hiệu quả?

  • Sử dụng printf để in ra các giá trị biến và theo dõi dòng chảy của chương trình.
  • Sử dụng các công cụ debug như GDB (GNU Debugger) để kiểm tra từng dòng mã, xem giá trị biến, và theo dõi các lỗi phân đoạn.

C được sử dụng trong những lĩnh vực nào?

Hệ điều hành: Nhiều hệ điều hành như Unix và Linux được viết bằng C.

  • Phần mềm nhúng: Các thiết bị như router, hệ thống điều khiển tự động thường sử dụng C.
  • Trình biên dịch: Nhiều trình biên dịch và công cụ lập trình được viết bằng C.
  • Ứng dụng khoa học và kỹ thuật: C được sử dụng trong các ứng dụng đòi hỏi tính toán hiệu năng cao.

Tại sao nên học lập trình C cơ bản trước khi học C++?

Ngôn ngữ lập trình C và C++ có một mối quan hệ đặc biệt chặt chẽ. C++ được phát triển như một phần mở rộng của C bởi Bjarne Stroustrup vào những năm 1980. C++ bổ sung nhiều tính năng mới, đặc biệt là lập trình hướng đối tượng, nhưng vẫn giữ lại hầu hết cú pháp và nguyên tắc cơ bản của C.

Chính vì vậy, có thể coi C++ như một “phiên bản nâng cao” của C. Học lập trình C cơ bản trước sẽ giúp bạn:

  • Nền tảng vững chắc: Học C giúp bạn nắm vững những khái niệm cơ bản nhất của lập trình như biến, hàm, cấu trúc điều khiển, và quản lý bộ nhớ. Những kiến thức này là nền tảng quan trọng để hiểu sâu hơn về C++.
  • Cú pháp tương tự: C và C++ chia sẻ cú pháp và nhiều khái niệm cơ bản. Việc thành thạo C giúp bạn dễ dàng tiếp cận và hiểu các tính năng nâng cao trong C++ mà không gặp khó khăn về cú pháp.
  • Hiệu suất và tối ưu hóa: C nổi tiếng với hiệu suất cao và khả năng tối ưu hóa. Học C trước giúp bạn hiểu cách viết mã tối ưu, quản lý bộ nhớ hiệu quả, những kiến thức quan trọng khi bạn làm việc với các dự án lớn và phức tạp trong C++.
  • Kiến thức cơ bản về hệ thống: C thường được sử dụng để phát triển hệ điều hành và các phần mềm hệ thống. Những kiến thức này rất hữu ích khi bạn chuyển sang học C++, đặc biệt nếu bạn làm việc với các ứng dụng hệ thống hoặc nhúng.
  • Tư duy lập trình: C là ngôn ngữ lập trình thủ tục, giúp bạn phát triển tư duy lập trình có tổ chức và logic. Điều này rất quan trọng khi bạn học lập trình hướng đối tượng trong C++.

Đọc thêm: C và C++: Phân biệt hai ngôn ngữ qua 5 điểm khác biệt quan trọng

Cài đặt môi trường lập trình C/C++

Cài đặt trình biên dịch GCC

Để lập trình C, bạn cần một trình biên dịch. GCC (GNU Compiler Collection) là một trong những trình biên dịch phổ biến nhất.

  1. Trên Windows: Tải và cài đặt MinGW (Minimalist GNU for Windows).
  2. Trên macOS: Sử dụng Homebrew để cài đặt GCC: brew install gcc.
  3. Trên Linux: Cài đặt GCC qua package manager, ví dụ: sudo apt-get install gcc trên Ubuntu.

Cài đặt và cấu hình visual studio code cho C

Visual Studio Code là một IDE mạnh mẽ và dễ sử dụng. Để cài đặt và cấu hình:

  1. Tải và cài đặt Visual Studio Code từ trang chủ.
  2. Cài đặt các extension cần thiết: “C/C++” và “Code Runner”.
  3. Cấu hình task runner để biên dịch và chạy chương trình C.

Tổng kết lập trình C cơ bản

Qua bài viết này, chúng ta đã cùng nhau tìm hiểu các khái niệm cơ bản của lập trình C, từ cú pháp cơ bản, biến và kiểu dữ liệu, câu lệnh điều kiện, vòng lặp, mảng và con trỏ, đến hàm, cấu trúc và union, làm việc với tệp tin, và quản lý bộ nhớ động.

Lập trình C là một ngôn ngữ mạnh mẽ và linh hoạt, mở ra nhiều cơ hội trong các lĩnh vực công nghệ khác nhau. Việc nắm vững các kiến thức cơ bản sẽ giúp bạn dễ dàng tiếp cận và hiểu sâu hơn các khái niệm nâng cao trong lập trình C++, từ đó mở ra nhiều cơ hội phát triển và sáng tạo trong lĩnh vực công nghệ.

Để tiếp tục hành trình học lập trình, hãy chuyển sang phần 2 với các câu lệnh nâng cao trong C++.