Bài tập c++ cơ bản và thực tế năm 2024
Ngôn ngữ lập trình C là một ngôn ngữ lập trình máy tính được phát triển bởi Dennis Ritchie vào những năm 1970 tại Bell Labs. C là một ngôn ngữ lập trình mạnh mẽ, có hiệu suất cao, và được sử dụng rộng rãi trong phát triển phần mềm hệ thống, phần mềm nhúng, ứng dụng máy tính cá nhân, và nhiều lĩnh vực công nghiệp khác. Show
Photo by Uday Awal / Unsplash C được chú trọng vào việc quản lý bộ nhớ và cung cấp nhiều tính năng gần gũi với cấu trúc máy tính, giúp lập trình viên có kiểm soát chi tiết hơn về cách dữ liệu và mã máy được xử lý. Nó cũng có một cú pháp đơn giản và mạnh mẽ, giúp trong việc phát triển phần mềm hiệu quả và dễ bảo trì. Ngôn ngữ C đã tạo nền tảng cho nhiều ngôn ngữ lập trình khác, bao gồm C++, C#, và nhiều ngôn ngữ khác. Ngoài ra, nó cũng là ngôn ngữ phổ biến cho việc viết hệ điều hành và phần mềm nhúng do khả năng kiểm soát phần cứng của nó. 2. Ứng dụng của ngôn ngữ lập trình CNgôn ngữ lập trình C có nhiều ứng dụng khác nhau trong nhiều lĩnh vực khác nhau do tính linh hoạt, hiệu suất cao và khả năng tương tác gần gũi với cấu trúc máy tính. Dưới đây là một số ứng dụng phổ biến của ngôn ngữ lập trình C:
3. Tại sao cần phải học ngôn ngữ C?
4. Ngôn ngữ C hoạt động như thế nào?Quá trình biên dịch trong C chuyển đổi mã mà con người có thể đọc thành định dạng mà máy có thể đọc được. Đối với C, việc này xảy ra trước khi chương trình bắt đầu thực thi để kiểm tra cú pháp và ngữ nghĩa của mã. Quá trình biên dịch trong C bao gồm 4 bước: tiền xử lý (pre-processing), biên dịch (compiling), tập hợp (assembling) và liên kết (linking), sau đó chúng ta chạy file thực thi thu được để xuất ra màn hình kết quả. 4.1 Biên dịch là gì?Giả sử có 2 người đang nói chuyện với nhau, anh A đến từ Úc nói tiếng Anh còn anh B đến từ Việt Nam. Để 2 anh này có thể hiểu nhau nói gì thì một trong hai người phải biết ngôn ngữ của người kia, ví dụ anh A sử dụng Google Dịch để dịch tiếng Anh sang tiếng Việt, quá trình dịch này có thể hiểu là quá trình biên dịch. Đối với máy tính cũng vậy, bản thân máy tính chỉ hiểu các kí tự 01010101000, hay còn gọi là mã máy (Machine Code). Chính vì thế cần có trình biên dịch đứng ở giữa giúp chuyển đổi những dòng code ta viết ra ở dạng con người hiểu (ABC) sang dạng nhị phân (000 0000) để máy tính hiểu, các bạn có thể tìm hiểu thêm về ASCII để hiểu rõ hơn. Biên dịch là gì? Nguồn: Scaler Topics4.2 Quá trình biên dịch trong CQuá trình biên dịch trong C diễn ra qua 4 bước: tiền xử lý (pre-processing), biên dịch (compiling), tập hợp (assembling) và liên kết (linking). Giờ chúng ta sẽ cùng nhau phân tích từng bước thông qua những ví dụ cụ thể nhé. 4.2.1 Pre-processing (tiền xử lý)Tiền xử lý trong C là bước đầu tiên của quá trình biên dịch để thực hiện các thay đổi hoặc xử lý trước khi mã nguồn được biên dịch thành mã máy. Tiền xử lý trong C đầu tiên sẽ loại bỏ các dòng comment, sau đó sử dụng các hằng số ( define), macro (define), và các chỉ thị (include) để thực hiện các nhiệm vụ như định nghĩa hằng số, tạo các phiên bản mã, và nhập các tệp mã nguồn khác vào tệp mã nguồn hiện tại.Comments Removal (Loại bỏ comment) Các dòng comment trong chương trình C sẽ được loại bỏ trong bước tiền xử lý, do nó chỉ có chức năng là giải thích đoạn code chứ không được sử dụng khi biên dịch.
Những đoạn comment sẽ bị loại bỏ. Nguồn: Scaler Topics Macros Expansion (Định nghĩa hằng số) Việc định nghĩa sẵn các hằng số ở đầu chương trình giúp tạo ra một danh mục dễ đọc về các giá trị hằng số được sử dụng trong chương trình. Điều này làm cho mã nguồn dễ hiểu hơn, giúp lập trình viên và đồng nghiệp khác dễ dàng theo dõi và hiểu mã nguồn của bạn.
Ở ví dụ này,
9 được sử dụng để định nghĩa hằng số PI và MAX_SIZE. Khi tiền xử lý thực hiện, mọi sự xuất hiện của PI và MAX_SIZE trong mã nguồn sẽ được thay thế bằng giá trị tương ứng. File inclusion (Nhập mã nguồn từ thư viện) Để sử dụng được các hàm như
0 hay
1, ta cần sử dụng mã nguồn từ các thư viện bên ngoài. Thư viện điển hình mà chúng ta hay sử dụng trong C là thư viện
2. Để sử dụng thư viện này trong mã nguồn của chúng ta, ta viết như sau:
4.2.2 Compiling (Biên dịch)Giai đoạn Compilation (Biên dịch) trong quá trình biên dịch mã nguồn C là bước quan trọng để chuyển mã nguồn C của bạn thành mã máy hoặc mã nguồn trung gian. Trong giai đoạn này, trình biên dịch (compiler) sẽ phân tích mã nguồn C và tạo ra mã máy hoặc mã nguồn trung gian. Dưới đây là một ví dụ cụ thể: Giả sử bạn có một tệp mã nguồn C đơn giản như sau (ví dụ "hello.c"):
Bây giờ, để biên dịch tệp này, bạn sử dụng trình biên dịch C, chẳng hạn như GCC trên hệ thống Unix/Linux. Sử dụng lệnh sau:
Trong lệnh trên:
Khi bạn chạy lệnh trên, trình biên dịch sẽ thực hiện giai đoạn Compilation. Trong giai đoạn này, nó thực hiện các nhiệm vụ sau:
Sau giai đoạn Compilation, bạn có thể có một tệp đối tượng (với đuôi
Lưu ý rằng một số trình biên dịch có thể tạo mã nguồn trung gian (intermediate code) thay vì mã máy, và mã nguồn trung gian này có thể được thực thi trong một máy ảo hoặc môi trường chạy giả lập (sandbox). 4.2.3 Assembly (Sử dụng mã hoá)Assembly (Sử dụng mã hóa) là bước quan trọng sau khi mã nguồn C đã được biên dịch thành mã nguồn trung gian hoặc mã nguồn tương tự C. Trong giai đoạn này, mã nguồn trung gian hoặc mã nguồn tương tự C sẽ được chuyển đổi thành mã hợp ngữ (assembly code). Mã hợp ngữ là một dạng gần gũi với mã máy nhưng được viết bằng ngôn ngữ hợp ngữ, dễ đọc hơn và dễ hiểu hơn cho con người. Giả sử bạn đã biên dịch tệp mã nguồn C "hello.c" thành tệp đối tượng "hello.o" sử dụng trình biên dịch GCC như sau:
Sau đó, bạn có thể sử dụng trình liên kết để tạo tệp thực thi "hello" bằng cách sử dụng lệnh:
Tại giai đoạn liên kết, mã hợp ngữ được tạo ra bởi trình biên dịch. Để xem mã hợp ngữ, bạn có thể sử dụng các tùy chọn đối với trình biên dịch hoặc trình liên kết để in ra mã hợp ngữ. Ví dụ, bạn có thể sử dụng tùy chọn
7 với GCC để tạo tệp mã hợp ngữ:
Sau đó, một tệp mã hợp ngữ "hello.s" sẽ được tạo ra, và bạn có thể xem nội dung của tệp này bằng trình soạn thảo hoặc trình biên tập mã nguồn. Ví dụ nội dung tệp mã hợp ngữ "hello.s" có thể trông giống như sau:
Mã hợp ngữ trên thể hiện mã máy tương ứng cho chương trình "Hello, World!" đơn giản. Nó sử dụng các chỉ thị gán giá trị, di chuyển dữ liệu và gọi hàm hệ thống để in ra thông báo "Hello, World!" trên màn hình. Sau giai đoạn Assembly, mã hợp ngữ này sẽ được chuyển đổi thành mã máy thực thi trên máy tính của bạn. 4.2.4 Linking (Liên kết)Linking (Liên kết) là bước quan trọng sau khi mã nguồn đã được biên dịch và có thể thực hiện riêng lẻ. Trong giai đoạn này, các tệp đối tượng và thư viện được kết hợp để tạo một tệp thực thi (executable file) hoàn chỉnh. Giai đoạn này cũng giải quyết các tham chiếu đến các hàm và biến từ các thư viện hoặc tệp đối tượng khác. Giả sử bạn đã biên dịch hai tệp mã nguồn C thành hai tệp đối tượng "file1.o" và "file2.o" như sau:
Sau đó, bạn muốn liên kết hai tệp đối tượng này để tạo một tệp thực thi "myprogram". Bạn có thể sử dụng lệnh sau:
0 Trong ví dụ này:
Khi bạn chạy lệnh trên, trình liên kết sẽ thực hiện các công việc sau:
Kết quả cuối cùng là một tệp thực thi "myprogram" mà bạn có thể chạy để thực hiện chương trình. Tệp thực thi này bao gồm mã máy đã được kết hợp từ các tệp đối tượng và thư viện, và nó thực hiện toàn bộ ứng dụng C của bạn. Xem biểu đồ bên dưới để thấy trình tự diễn ra của quy trình biên dịch này Flow Diagram (Nguồn: Scaler Topics)5. Các khái niệm quan trọng trong ngôn ngữ C5.1 Biến (Variable)Biến trong ngôn ngữ lập trình C là một định danh được sử dụng để lưu trữ giá trị dữ liệu. Mỗi biến có một kiểu dữ liệu và một tên riêng biệt để xác định nó. Dưới đây là một số khái niệm quan trọng về biến trong C: 5.1.1 Khai báo biến (Variable Declaration)Để tạo một biến trong C, bạn phải khai báo nó. Khai báo biến bao gồm kiểu dữ liệu và tên biến. Ví dụ:
1 Vậy điều gì xảy ra ở dưới khi chúng ta khai báo một biến trong C?
5.1.2 Khởi tạo biến (Variable Initialization)Bạn có thể khai báo và khởi tạo biến cùng một lúc. Ví dụ:
2 Việc khởi tạo biến trong C là không bắt buộc, tuy nhiên nó cũng có một số lợi ích. Dưới đây là một số lý do tại sao bạn nên khởi tạo biến:
5.1.3 Tên biến (Variable Name)Tên biến là một định danh duy nhất được sử dụng để xác định biến. Tên biến phải tuân theo các quy tắc về cú pháp và không được trùng với từ khóa trong ngôn ngữ C. Có một số quy tắc cơ bản trong việc đặt tên biến trong C:
define PI 3.14159265define MAX_SIZE 100 00, v.v.
01. Trong Snake Case, các từ được phân tách bằng dấu gạch dưới, ví dụ:
02. Cả hai phong cách đều được chấp nhận, nhưng quan trọng là duy nhất trong mã nguồn của bạn.
5.1.4 Gán giá trị (Assignment)Để gán một giá trị mới cho biến, bạn sử dụng toán tử gán (=). Ví dụ:
3 Khi bạn gán giá trị cho một biến trong ngôn ngữ lập trình C, bạn đang thực hiện thao tác gán, tức là bạn đang đặt giá trị mới cho biến. Dưới đây là một số điểm quan trọng về quá trình gán giá trị này:
4
5
6 5.1.5 Phạm vi biến (Variable Scope)Phạm vi của một biến xác định nơi mà biến có thể được truy cập. Biến cục bộ (local variables) chỉ có thể truy cập trong phạm vi của hàm hoặc khối mã trong đó chúng được khai báo, trong khi biến toàn cục (global variables) có thể truy cập từ mọi nơi trong chương trình. Biến Cục Bộ (Local Variable):
7 Trong ví dụ trên, biến
6 và
05 là biến cục bộ. Biến
6 được khai báo trong hàm
6, và biến
05 được khai báo trong khối mã của câu lệnh
1. Biến
6 có phạm vi trong toàn bộ hàm
6, trong khi biến
05 chỉ có phạm vi trong khối mã của câu lệnh
1. Vì vậy, sau khi chương trình rời khỏi khối mã
1, biến
05 không còn tồn tại. Biến Toàn Cục (Global Variable):
8 Trong ví dụ này, biến
16 là biến toàn cục, có thể truy cập từ bất kỳ hàm nào trong chương trình. Biến
6 là biến cục bộ, chỉ có phạm vi trong hàm
6. Khi bạn muốn sử dụng biến toàn cục, bạn có thể thực hiện điều đó từ bất kỳ hàm nào trong chương trình, như trong ví dụ trên. 5.2 Kiểu dữ liệu (Data Type)C có một loạt các kiểu dữ liệu mà bạn có thể sử dụng để định nghĩa và lưu trữ dữ liệu. Dưới đây là một số kiểu dữ liệu thường gặp trong C:
define PI 3.14159265define MAX_SIZE 100 19
20
define PI 3.14159265define MAX_SIZE 100
21, nhưng có độ chính xác cao hơn. Ví dụ: define PI 3.14159265define MAX_SIZE 100 22
23
define PI 3.14159265define MAX_SIZE 100 25
26
define PI 3.14159265define MAX_SIZE 100 27
### 5.3 In và đọc dữ liệu
C cung cấp sẵn cho chúng ta 2 hàm là
gcc -S -o hello hello.c
gcc -S -o hello hello.c
define PI 3.14159265define MAX_SIZE 100
9
include
include
include
gcc -S -o hello hello.c
define PI 3.14159265define MAX_SIZE 100
31 trước tên biến để truyền địa chỉ của biến đó cho
gcc -S -o hello hello.c
gcc -S -o hello hello.c
define PI 3.14159265define MAX_SIZE 100
34 hay
define PI 3.14159265define MAX_SIZE 100
35 được sử dụng trong
gcc -S -o hello hello.c
gcc -S -o hello hello.c
include
38: Đây là kiểu dữ liệu của giá trị mà hàm sẽ trả về. Nếu hàm không trả về giá trị, bạn sử dụng
39.
define PI 3.14159265define MAX_SIZE 100 40: Đây là tên của hàm, bạn tự đặt tên cho hàm. Tên hàm phải tuân theo quy tắc đặt tên biến.
41: Đây là các tham số (có thể là không có tham số) mà hàm có thể nhận vào. Tham số là các giá trị mà bạn truyền cho hàm để thực hiện các công việc cụ thể.
define PI 3.14159265define MAX_SIZE 100 42: Đây là nơi bạn đặt mã nguồn của hàm, thực hiện các công việc cụ thể.
43: Nếu hàm trả về một giá trị, bạn sử dụng lệnh
3 để trả giá trị đó. Nếu hàm không trả về giá trị hoặc chỉ có mục tiêu thực hiện công việc mà không cần trả về giá trị, bạn sử dụng
3 với
39.5.4.2 Gọi hàmĐể sử dụng hàm, bạn gọi hàm bằng tên của nó cùng với các đối số (nếu có). Ví dụ:
4 5.4.3 Hàm có hoặc không có giá trị trả vềHàm có thể có giá trị trả về hoặc không. Ví dụ:
5 5.4.4 Hàm nguyên mẫu (Function Prototype)Trước khi sử dụng hàm trong một tệp mã nguồn khác, bạn nên định nghĩa hàm nguyên mẫu (function prototype) ở đầu tệp mã hoặc bao gồm tệp tiêu đề chứa định nghĩa hàm. Hàm nguyên mẫu chỉ ra kiểu dữ liệu trả về của hàm và kiểu dữ liệu của các tham số nó có. Điều này giúp trình biên dịch biết cách gọi hàm và kiểm tra sự phù hợp của đối số và kiểu trả về.
6 5.5 Chuỗi (String)Trong C, chuỗi (string) thường được biểu diễn bằng một mảng các ký tự (
47). Mảng này chứa các ký tự liên tiếp kết thúc bằng một ký tự null (
5.5.1 Định nghĩa chuỗiBạn có thể khai báo một mảng ký tự cố định để định nghĩa chuỗi. Độ dài của mảng cố định phải đủ lớn để chứa chuỗi và ký tự null cuối cùng. Ví dụ:
7 5.5.2 Làm việc với chuỗiCó nhiều cách để thao tác và làm việc với chuỗi, dưới đây là một số cách:
define PI 3.14159265define MAX_SIZE 100
35
include
50 để sao chép một chuỗi vào một chuỗi khác.
9
define PI 3.14159265define MAX_SIZE 100
51.
include int main() { }
52 được sử dụng để so sánh hai chuỗi.
1
define PI 3.14159265define MAX_SIZE 100
53.
include int main() { }
define PI 3.14159265define MAX_SIZE 100
48, nên khi bạn làm việc với chuỗi, hãy đảm bảo rằng bạn duyệt đến ký tự null để xác định kết thúc của chuỗi.
### 5.6 Mảng một chiều (Array)
Mảng (array) trong C là một tập hợp các phần tử có cùng kiểu dữ liệu được sắp xếp theo thứ tự. Mảng cho phép bạn lưu trữ nhiều giá trị cùng loại trong một biến duy nhất.
#### 5.6.1 Định nghĩa và Khai báo Mảng
Để định nghĩa một mảng trong C, bạn cần chỉ định kiểu dữ liệu của các phần tử và kích thước của mảng (số lượng phần tử). Cú pháp tổng quan như sau:
include int main() { }
38: Đây là kiểu dữ liệu của các phần tử trong mảng, ví dụ
7,
21,
47, ...
define PI 3.14159265define MAX_SIZE 100 59: Đây là tên của mảng.
60: Số lượng phần tử trong mảng. Ví dụ:
4 5.6.2 Truy cập phần tử trong MảngBạn có thể truy cập các phần tử trong mảng bằng cách sử dụng chỉ mục (index) của phần tử trong dấu ngoặc vuông
61. Chỉ mục bắt đầu từ 0. Ví dụ:
5 5.7 Mảng hai chiều (2D Array)Mảng hai chiều (2D array) trong ngôn ngữ lập trình C là một cấu trúc dữ liệu cho phép bạn lưu trữ dữ liệu dưới dạng ma trận hoặc lưới có hai chiều (hàng và cột). 5.7.1 Định nghĩa và Khai báo Mảng hai chiều
6
define PI 3.14159265define MAX_SIZE 100 38: Đây là kiểu dữ liệu của các phần tử trong mảng 2D, ví dụ _start:
`
7,
21,
47, ...
define PI 3.14159265define MAX_SIZE 100 59: Đây là tên của mảng.
67: Số lượng hàng trong mảng.
define PI 3.14159265define MAX_SIZE 100
68: Số lượng cột trong mảng.
Ví dụ:
include int main() { }
define PI 3.14159265define MAX_SIZE 100
69\. Chỉ mục hàng và cột bắt đầu từ 0\. Ví dụ:
include int main() { }
define PI 3.14159265define MAX_SIZE 100
70
Câu lệnh
define PI 3.14159265define MAX_SIZE 100
70 cho phép bạn thực hiện một khối mã nguồn nếu điều kiện kiểm tra là đúng (true), và một khối mã nguồn khác nếu điều kiện là sai (false). Cú pháp tổng quan như sau:
include int main() { }
gcc -o hello hello.c
define PI 3.14159265define MAX_SIZE 100
72
Câu lệnh
define PI 3.14159265define MAX_SIZE 100
73 cho phép bạn kiểm tra nhiều điều kiện liên tiếp và thực hiện các khối mã nguồn tương ứng với điều kiện đúng đầu tiên. Cú pháp tổng quan như sau:
gcc -o hello hello.c
gcc -o hello hello.c
define PI 3.14159265define MAX_SIZE 100
74
Câu lệnh
define PI 3.14159265define MAX_SIZE 100
74 cho phép bạn kiểm tra một biểu thức hoặc giá trị và thực hiện các tác vụ tương ứng với từng giá trị. Cú pháp tổng quan như sau:
gcc -o hello hello.c
gcc -o hello hello.c
gcc -o hello hello.c
gcc -o hello hello.c
define PI 3.14159265define MAX_SIZE 100
76
Vòng lặp
gcc -c -o file1.o file1.c gcc -c -o file2.o file2.c
gcc -o hello hello.c
gcc -o hello hello.c
define PI 3.14159265define MAX_SIZE 100
78:
Vòng lặp
define PI 3.14159265define MAX_SIZE 100
79 tương tự với
gcc -c -o file1.o file1.c gcc -c -o file2.o file2.c
gcc -o hello hello.c
gcc -o hello hello.c
define PI 3.14159265define MAX_SIZE 100
81 theo sau là tên cấu trúc và danh sách các biến thành viên (members) trong cấu trúc. Cú pháp tổng quan như sau:
gcc -o hello hello.c
gcc -o hello hello.c
gcc -o hello hello.c
82 => Truy xuất tới thuộc tính khi khai báo biến bình thường.
define PI 3.14159265define MAX_SIZE 100
83 => Truy xuất tới thuộc tính khi biến là con trỏ.
Ví dụ chúng ta muốn truy xuất đến thuộc tính
define PI 3.14159265define MAX_SIZE 100
84 của Person ta làm như sau:
gcc -o hello hello.c
define PI 3.14159265define MAX_SIZE 100
85 sau đó là tên liệt kê và danh sách các giá trị liệt kê trong dấu ngoặc nhọn
define PI 3.14159265define MAX_SIZE 100
86\. Ví dụ:
gcc -o hello hello.c
define PI 3.14159265define MAX_SIZE 100
87 là tên của liệt kê, và
define PI 3.14159265define MAX_SIZE 100
88,
define PI 3.14159265define MAX_SIZE 100
89,
define PI 3.14159265define MAX_SIZE 100
90, và
define PI 3.14159265define MAX_SIZE 100
91 là các giá trị liệt kê. Mặc định, giá trị của các trạng thái trong enum là các số nguyên liên tiếp, bắt đầu từ 0\.
define PI 3.14159265define MAX_SIZE 100
88 có giá trị là 0,
define PI 3.14159265define MAX_SIZE 100
89 là 1, và tiếp tục như vậy.
#### 5.11.2 Gán giá trị tùy chỉnh cho các trạng thái
Bạn có thể gán giá trị tùy chỉnh cho các trạng thái của enum bằng cách chỉ định giá trị sau mỗi trạng thái. Ví dụ:
gcc -o hello hello.c
define PI 3.14159265define MAX_SIZE 100
94 có giá trị là 1, và các giá trị tiếp theo sẽ được tự động tăng thêm một đơn vị (2, 3, 4,...).
#### 5.11.3 Sử dụng enum
Sau khi bạn đã định nghĩa enum, bạn có thể sử dụng nó để khai báo biến hoặc trong các biểu thức. Ví dụ:
gcc -o hello hello.c
gcc -o hello hello.c
98. Thư viện tiêu chuẩn được cung cấp bởi ngôn ngữ C và có sẵn cho mọi trình biên dịch C.
define PI 3.14159265define MAX_SIZE 100
99 chứa các khai báo hàm, cấu trúc dữ liệu và hằng số mà bạn cần sử dụng từ một thư viện. Để sử dụng thư viện, bạn cần đưa tiêu đề của nó vào mã nguồn của mình bằng cách sử dụng include
include
include
gcc -o hello hello.c
define PI 3.14159265define MAX_SIZE 100
31 để lấy địa chỉ của biến. Ví dụ:
gcc -o hello hello.o
include
gcc -o hello hello.o
gcc -o hello hello.o
gcc -o hello hello.o
gcc -o hello hello.o
05 có 5 phần tử và khởi tạo nó với các giá trị từ 10 đến 50.
include
05 cho con trỏ
07 bằng cách sử dụng tên mảng làm con trỏ vào phần tử đầu tiên của mảng.
include
include
gcc -o hello hello.o
define PI 3.14159265define MAX_SIZE 100
48). Con trỏ thường được sử dụng để xử lý chuỗi, vì chúng cho phép bạn truy cập và thay đổi từng ký tự trong chuỗi một cách dễ dàng.
Dưới đây là một ví dụ về cách sử dụng con trỏ để làm việc với chuỗi (string) trong ngôn ngữ lập trình C:
gcc -o hello hello.o
13 và khởi tạo nó với chuỗi "Hello, World!".
define PI 3.14159265define MAX_SIZE 100
47 có tên include
13 cho con trỏ
07, vì mảng là một chuỗi ký tự và tên mảng chính là con trỏ tới phần tử đầu tiên của chuỗi.
include
48, nên chúng ta dừng khi gặp ký tự null. Kết quả của chương trình sẽ in ra chuỗi "Hello, World!" lên màn hình. Con trỏ là một tính năng mạnh mẽ trong ngôn ngữ C, nhưng nó cũng đòi hỏi kiểm soát cẩn thận và làm việc chính xác với bộ nhớ để tránh lỗi segmentation fault và rò rỉ bộ nhớ. 5.14 File I/O (Input/Output)File I/O (Input/Output) trong ngôn ngữ lập trình C là quá trình đọc và ghi dữ liệu từ và vào các tệp (file). Các tệp được sử dụng để lưu trữ và truyền dữ liệu giữa chương trình và hệ thống tệp. Dưới đây là một số ví dụ về cách thực hiện File I/O trong C: Ghi dữ liệu vào tệp Để ghi dữ liệu vào một tệp, bạn cần mở tệp để ghi bằng cách sử dụng hàm
21. Sau đó, bạn có thể sử dụng các hàm như
22 hoặc
23 để ghi dữ liệu vào tệp. Ví dụ:
7 Trong ví dụ này, chúng ta mở tệp "example.txt" để ghi (mode "w" - viết tắt của write). Sau đó, chúng ta sử dụng
22 để ghi chuỗi "Hello, World!" vào tệp và đóng tệp sau khi đã hoàn thành. Đọc dữ liệu từ tệp Để đọc dữ liệu từ một tệp, bạn cũng cần mở tệp nhưng trong mode đọc bằng
21. Sau đó, bạn có thể sử dụng các hàm như
26 hoặc
27 để đọc dữ liệu từ tệp. Ví dụ:
8 Trong ví dụ này, chúng ta mở tệp "example.txt" để đọc (mode "r" - viết tắt của read). Sau đó, chúng ta sử dụng
26 để đọc dữ liệu từ tệp vào mảng
29 và in ra nội dung đã đọc. File I/O trong C là một phần quan trọng của việc làm việc với tệp và dữ liệu trên hệ thống tệp. Nó cho phép bạn lưu trữ, đọc, và xử lý dữ liệu từ và vào các tệp theo nhiều cách khác nhau. 6. Tài liệu học ngôn ngữ CCó rất nhiều tài liệu giúp bạn học ngôn ngữ C, tuy nhiên lựa chọn đúng tài liệu phù hợp với bản thân cũng như thật sự chất lượng thì không phải chuyện dễ. Dưới đây là một số tài liệu được 200Lab chọn lọc để giúp bạn nắm thật chắc ngôn ngữ C:
7. Cách học ngôn ngữ C hiệu quảNgôn ngữ C tính đến thời điểm hiện tại mặc dù đã cũ nhưng vẫn được sử dụng để giảng dạy ở rất nhiều trường Đại học, đặc biệt là ở Việt Nam. Chính vì thế nếu bạn đang là sinh viên, bạn cần nắm thật chắc ngôn ngữ này, vì nó sẽ giúp bạn rất nhiều ở chặng đường phía trước. Dưới đây là các bước thực hiện để học ngôn ngữ C một cách hiệu quả được đúc rút từ kinh nghiệm cá nhân: Bước 1: Tìm hiểu qua các khái niệm cơ bản Bước đầu tiên là các bạn cần đọc qua các khái niệm cơ bản trong C, hiểu được chúng dùng để làm gì sau đó nhớ cú pháp của chúng, ở bước này quan trọng nhất là cần nắm được cách sử dụng chúng. Bước 2: Tiến hành làm bài tập Hãy bắt đầu với những bài tập theo từng chủ đề trước, từ dễ đến khó. Các bạn có thể tìm trên Google 500 bài code thiếu nhi hoặc làm các bài tập mà thầy cô giao trên trường. Ở bước này điều quan trọng nhất là cố gắng tìm ra lời giải đúng của mỗi bài, từ cách làm đấy đem đi làm những bài tương tự nhưng ở mức độ khó hơn một chút. Bước 3: Quay lại tìm hiểu về khái niệm cơ bản Trong lúc làm bài tập chắc chắn sẽ có lúc bạn bị quên một số khái niệm, đừng ngần ngại mà hãy quay lại để đọc lại chúng. Lúc này bạn sẽ được thấy những khái niệm này hoạt động như thế nào trong thực tế sử dụng, giúp bạn nhớ nó lâu hơn. Bước 4: Luyện tập, luyện tập, và luyện tập Đến bước này thì việc còn lại của bạn chỉ là lặp đi lặp lại 3 bước trên, hãy cố gắng làm thật nhiều bài tập, xử lý thật nhiều vấn đề khác nhau. Từ đấy sẽ giúp bạn nắm rõ các khái niệm và nâng cao được tư duy. Bước 5: Không bỏ cuộc Bước cuối cùng và cũng là bước quan trọng nhất đấy là không được bỏ cuộc. Hãy cố gắng để tìm ra lời giải bằng mọi giá dù nó có tốn của bạn rất nhiều thời gian. Khi tìm ra được lời giải bạn sẽ thấy thời gian bạn bỏ ra là xứng đáng. 8. Kết luậnC là ngôn ngữ cơ bản nhất và là nền tảng cho rất nhiều ngôn ngữ khác về sau. Chính vì thế hiểu về C là rất quan trọng và là cần thiết đối với tất cả lập trình viên ngày nay. |
.section .data
.string "Hello, World!\n"
.section .text