Tài Liệu Hướng Dẫn Lập Trình C Chương 2: Mô-đun và Con Trỏ

Tài liệu hướng dẫn lập trình C chương 2 cung cấp kiến thức cơ bản và ví dụ thực hành giúp người học nắm vững ngôn ngữ lập trình này.

Trường đại học

www.com

Chuyên ngành

lập trình C

Người đăng

Ẩn danh

Thể loại

tài liệu hướng dẫn
164
3
0

Phí lưu trữ

45 Point

Mục lục chi tiết

1. Bài 1: Modular Programming (Mô-đun Lập trình)

1.1. Prototypes

1.2. Phạm Vi Sử Dụng (scope) của functions và biến số

1.3. Condition

2. Pointer (Con trỏ)

2.1. Cấu trúc (struct)

2.2. Vấn đề nan giải

2.3. Mảng cấu trúc

2.4. Địa chỉ trong bộ nhớ

2.5. Cách sử dụng pointer (con trỏ)

2.6. Cách sử dụng con trỏ trong một function

3. Arrays (Mảng)

3.1. Cách tạo một array

3.2. Liệt kê các giá trị trong array

3.3. Tạo một function để liệt kê các giá trị

3.4. Cấp phát động trong array

3.5. Kích thước của biến

3.6. Bài tập thực hành

4. Chuỗi ký tự

4.1. Biến kiểu Char

4.2. String hay còn gọi là mảng ký tự

4.3. Các thao tác với chuỗi ký tự

4.4. Giải pháp 1

4.5. Giải pháp 2

4.6. Ý tưởng cải tiến

5. Preprocessor – Tiền xử lý

6. Tạo ra những biến kiểu riêng của bạn

7. Những thao tác làm việc với tập tin (file)

7.1. Mở và đóng tập tin

7.2. Ghi dữ liệu vào tập tin

7.3. Đọc dữ liệu trong tập tin

7.4. Di chuyển tập tin

7.5. Đổi tên và xóa tập tin

8. Cấp phát động trong array

8.1. Cấp phát bộ nhớ động

8.2. Giải phóng bộ nhớ

9. Test Program: Người Treo Cổ

9.1. Một số chỉ dẫn

Tóm tắt

I. Tổng Quan Về Mô đun Trong Lập Trình C

Mô-đun lập trình là một khái niệm quan trọng trong lập trình C, giúp tổ chức mã nguồn một cách hiệu quả. Thay vì viết tất cả mã trong một file duy nhất, lập trình viên có thể chia nhỏ mã thành các file khác nhau, mỗi file chứa một phần chức năng riêng biệt. Điều này không chỉ giúp mã dễ đọc hơn mà còn dễ bảo trì và mở rộng hơn trong tương lai.

1.1. Lợi Ích Của Mô đun Trong Lập Trình C

Mô-đun giúp giảm thiểu sự phức tạp của mã nguồn. Khi mã được chia thành các phần nhỏ, việc tìm kiếm và sửa lỗi trở nên dễ dàng hơn. Hơn nữa, mô-đun cho phép tái sử dụng mã, tiết kiệm thời gian và công sức cho lập trình viên.

1.2. Cách Tổ Chức Mô đun Trong Dự Án Lập Trình C

Một dự án lập trình C thường bao gồm nhiều file mã nguồn. Mỗi file có thể chứa các hàm liên quan đến một chức năng cụ thể. Việc tổ chức này giúp lập trình viên dễ dàng quản lý và phát triển dự án.

II. Khám Phá Con Trỏ Trong Lập Trình C Cách Sử Dụng Hiệu Quả

Con trỏ là một trong những khái niệm quan trọng nhất trong lập trình C. Chúng cho phép lập trình viên truy cập và thao tác trực tiếp với bộ nhớ. Việc hiểu rõ cách sử dụng con trỏ sẽ giúp tối ưu hóa hiệu suất của chương trình.

2.1. Định Nghĩa Và Cách Khai Báo Con Trỏ

Con trỏ là một biến lưu trữ địa chỉ của một biến khác. Để khai báo con trỏ, sử dụng ký hiệu * trước tên biến. Ví dụ: int *ptr; sẽ khai báo một con trỏ trỏ đến một biến kiểu int.

2.2. Cách Sử Dụng Con Trỏ Trong Hàm

Con trỏ có thể được sử dụng để truyền tham số vào hàm. Điều này cho phép hàm có thể thay đổi giá trị của biến bên ngoài. Sử dụng con trỏ giúp tiết kiệm bộ nhớ và tăng tốc độ thực thi của chương trình.

III. Các Phương Pháp Quản Lý Bộ Nhớ Với Con Trỏ Trong C

Quản lý bộ nhớ là một phần quan trọng trong lập trình C. Việc sử dụng con trỏ không chỉ giúp truy cập dữ liệu mà còn cho phép cấp phát và giải phóng bộ nhớ động. Điều này rất cần thiết để tối ưu hóa hiệu suất của chương trình.

3.1. Cấp Phát Bộ Nhớ Động Với Con Trỏ

Sử dụng hàm malloc() để cấp phát bộ nhớ động cho con trỏ. Ví dụ: int *arr = (int *)malloc(n * sizeof(int)); sẽ cấp phát bộ nhớ cho một mảng có n phần tử kiểu int.

3.2. Giải Phóng Bộ Nhớ Đã Cấp Phát

Sau khi sử dụng bộ nhớ động, cần phải giải phóng nó bằng hàm free(). Việc này giúp tránh rò rỉ bộ nhớ, một vấn đề phổ biến trong lập trình C.

IV. Ứng Dụng Thực Tiễn Của Mô đun Và Con Trỏ Trong Lập Trình C

Mô-đun và con trỏ không chỉ là lý thuyết mà còn có nhiều ứng dụng thực tiễn trong lập trình C. Chúng giúp xây dựng các chương trình phức tạp và hiệu quả hơn.

4.1. Xây Dựng Các Chương Trình Lớn Với Mô đun

Khi xây dựng các chương trình lớn, việc sử dụng mô-đun giúp tổ chức mã nguồn một cách hợp lý. Điều này giúp lập trình viên dễ dàng bảo trì và mở rộng chương trình.

4.2. Tối Ưu Hiệu Suất Với Con Trỏ

Con trỏ cho phép truy cập nhanh chóng đến dữ liệu trong bộ nhớ. Việc sử dụng con trỏ trong các thuật toán và cấu trúc dữ liệu giúp tối ưu hóa hiệu suất của chương trình.

V. Kết Luận Về Mô đun Và Con Trỏ Trong Lập Trình C

Mô-đun và con trỏ là hai khái niệm cơ bản nhưng rất quan trọng trong lập trình C. Việc hiểu và áp dụng chúng một cách hiệu quả sẽ giúp lập trình viên phát triển các ứng dụng mạnh mẽ và hiệu quả.

5.1. Tương Lai Của Mô đun Trong Lập Trình C

Mô-đun sẽ tiếp tục đóng vai trò quan trọng trong việc phát triển phần mềm. Các phương pháp lập trình hiện đại ngày càng chú trọng đến việc tổ chức mã nguồn một cách hợp lý.

5.2. Xu Hướng Sử Dụng Con Trỏ Trong Các Ngôn Ngữ Lập Trình Khác

Con trỏ không chỉ xuất hiện trong C mà còn trong nhiều ngôn ngữ lập trình khác. Việc hiểu rõ về con trỏ sẽ giúp lập trình viên dễ dàng chuyển giao kiến thức giữa các ngôn ngữ.

17/07/2025

Trích đoạn nội dung tài liệu

Tài liệu hướng dẫn lập trình C www.com Apprenez à programmer en C Tác giả: M@teo21 1) Modular Programming (Mô-đun Lập trình) 5) Preprocessor – Tiền xử lý  Prototypes.  Phạm Vi Sử Dụng (scope) của  Condition. functions và biến số. 6) Tạo ra những biến kiểu riêng của bạn 2) Pointer (Con trỏ)  Cấu trúc (struct).

 Vấn đề nan giải.  Mảng cấu trúc.  Địa chỉ trong bộ nhớ.  Cách sử dụng pointer (con trỏ).

 Cách sử dụng con trỏ trong một function. 7) Những thao tác làm việc với tập tin (file)  Mở và đóng tập tin.  Ghi dữ liệu vào tập tin. 3) Arrays (Mảng)  Đọc dữ liệu trong tập tin.

 Các Arrays trong bộ nhớ.  Di chuyển tập tin.  Cách tạo một array.  Đổi tên và xóa tập tin.

 Liệt kê các giá trị trong array.  Tạo một function để liệt kê các giá trị 8) Cấp phát động trong array.  Kích thước của biến.  Bài tập thực hành.

 Cấp phát bộ nhớ động.  Giải phóng bộ nhớ. 4) Chuỗi ký tự 9) Test Program: Người Treo Cổ  Biến kiểu Char.  Một số chỉ dẫn.

 String hay còn gọi là mảng ký tự.  Giải pháp 1:  Các thao tác với chuỗi ký tự.  Giải pháp 2:  Ý tưởng cải tiến. Dịch giả: Mr.

Hung Editor: M0N1M daihung.fr -1- thaibaminh2512@gmai.com Tài liệu hướng dẫn lập trình C www.com Apprenez à programmer en C Tác giả: M@teo21 Bài 1: Modular Programming Mô-đun Lập Trình Trong chương thứ hai của bài hướng dẫn, bạn sẽ khám phá những khái niệm lập trình ngôn ngữ C cao hơn. Cho đến lúc này, các bạn cũng chỉ làm việc trên một file duy nhất tên là "main.c" Điều này có thể tạm chấp nhận trong giai đoạn hiện tại vì chương trình của chúng ta vẫn còn khá ngắn, nhưng sắp tới chương trình của chúng ta sẽ chứa hàng chục, thậm chí hàng trăm functions, nếu bạn đặt tất cả chúng trong cùng một file thì sẽ rất dài ! Cũng chính vì lí do đó mà người ta đã sáng tạo ra cái gọi là modular programming. Về mặt nguyên tắc thì nghe có vẻ khá ngu ngốc: thay vì đặt tất cả các dòng code trong một file duy nhất (main.c), chúng ta sẽ chia ra thành nhiều file nhỏ hơn. Chú ý: tôi sẽ không đặt instruction system ("PAUSE") vào phía cuối của main ( ) nữa.

Hãy thêm vào nếu bạn cần nó. Và tôi vẫn khuyên bạn sử dụng IDE Code::Blocks. Vì IDE này đã được update để không phải đặt instruction system ("PAUSE") ở phía cuối main ( ) nữa. Prototypes Những bài hướng dẫn trước, tôi yêu cầu bạn đặt các functions trước main.

Tại sao vậy? Tại vì thứ tự sắp xếp có một tầm quan trọng: Khi bạn đặt function trước main, máy tính sẽ đọc và nhớ nó. Khi được gọi lại trong main, máy tính sẽ biết phải kiếm lại function đó ở đâu. Nhưng nếu bạn đặt sau main, chương trình sẽ không hoạt động vì máy tính vẫn không biết function đó là gì. Hãy test thử, bạn sẽ thấy ngay ! Nhưng vấn đề này khá bất lợi, đúng không? Tôi đồng ý với bạn về điểm này ! Nhưng bạn hãy yên tâm, những nhà lập trình trước cũng gặp điều tương tự và họ đã tìm cách khắc phục nó.

Dịch giả: Mr. Hung Editor: M0N1M daihung.fr -2- thaibaminh2512@gmai.com Tài liệu hướng dẫn lập trình C www.com Apprenez à programmer en C Tác giả: M@teo21 Nhờ vào những gì tôi sắp chỉ cho bạn sau đây, bạn sẽ có thể đặt các functions theo bất kì thứ tự nào bạn muốn trong code source. Prototype để báo trước một function Chúng ta bắt đầu việc báo trước cho máy tính những function của chúng ta bằng cách viết các prototypes. Tôi biết bạn đang nghĩ từ ngữ mang đậm chất “high-tech” prototypes này là thứ gì đó ghê gớm lắm nhưng thật ra nó là một thứ hoàn toàn ngu ngốc.

Hãy cùng xem đoạn code đầu tiên của function dientichHinhChuNhat: C code: double dientichHinhChuNhat (double chieuRong, double chieuDai) { return chieuRong * chieuDai; } Hãy copy lại dòng đầu tiên (double dientichHinhChuNhat.) và chép vào phần đầu của file source của bạn (sau những dòng #include). Và thêm vào một dấu chấm phẩy ở cuối cùng. Vậy là xong ! Bây giờ bạn có thể đặt function sau main nếu bạn muốn. Dịch giả: Mr.

Hung Editor: M0N1M daihung.fr -3- thaibaminh2512@gmai.com Tài liệu hướng dẫn lập trình C www.com Apprenez à programmer en C Tác giả: M@teo21 Và đoạn code sẽ thay đổi như sau: C code: #include <stdio.h> // Doan code sau chinh la prototype cua function dientichHinhChuNhat : double dientichHinhChuNhat (double chieuRong, double chieuDai); int main (int argc, char *argv[ ]) { printf ("Hinh chu nhat voi chieu rong 5 va chieu dai 10 co dien tich la %f\n", dientichHinhChuNhat(5, 10)); printf ("Hinh chu nhat voi chieu rong 2.5 va chieu dai 3.5 co dien tich la %f\n", dientichHinhChuNhat(2.5)); printf ("Hinh chu nhat voi chieu rong 4.2 va chieu dai 9.7 co dien tich la %f\n", dientichHinhChuNhat(4.7)); return 0; } // function dientichHinhChuNhat bay gio co the dat o bat ki vi tri nao trong code source double dientichHinhChuNhat (double chieuRong, double chieuDai) { return chieuRong * chieuDai; } Và điều thay đổi ở đây là, dòng prototype được thêm vào ở phần đầu code source. Một prototype thật ra là lời chỉ dẫn cho máy tính. Nó sẽ thông báo với máy tính có sự tồn tại của function (dientichHinhChuNhat) với những tham số (parameters) cần đưa vào và type giá trị sẽ xuất ra. Nhờ vậy mà máy tính có thể tự sắp xếp.

Và cũng nhờ vào dòng code này, bạn không còn đau đầu khi chọn vị trí đặt function nữa. Hãy luôn viết prototypes của các functions có trong chương trình. Chương trình của bạn sẽ không hề bị chậm hơn khi sử dụng nhiều function đâu: và bạn nên tập một thói quen tốt kể từ bây giờ, hãy đặt prototype cho mỗi functions bạn viết. Chắc bạn cũng thấy function main không có prototype.

Và đây cũng là function duy nhất không cần prototype, bởi vì máy tính đã biết rõ nó là gì rồi (tất cả các chương trình đều dùng đến mà, nó bắt buộc phải biết thôi). Dịch giả: Mr. Hung Editor: M0N1M daihung.fr -4- thaibaminh2512@gmai.com Tài liệu hướng dẫn lập trình C www.com Apprenez à programmer en C Tác giả: M@teo21 Để cho chính xác hơn, bạn cần biết thêm: dòng code prototype không cần thiết phải viết lại tên của các biến số cần cho parameter. Máy tính chỉ cần biết type của các biến số đó thôi.

Vì vậy đơn giản hơn ta có thể viết như sau: C code: double dientichHinhChuNhat (double , double); Và với 2 cách viết đó, chương trình đều chạy tốt, nhưng lợi ích của cách viết đầu tiên là bạn có thể copy-paste nhanh chóng và chỉ thêm vào mỗi dấu chấm phẩy ở cuối. ĐỪNG QUÊN đặt dấu chấm phẩy ở cuối một prototype. Vì nó giúp cho máy tính có thể nhận ra sự khác nhau giữa prototype và function. Nếu bạn không làm vậy, bạn sẽ mắc lỗi khi biên dịch chương trình.

Headers Cho đến lúc này, bạn cũng chỉ sử dụng duy nhất một file source cho project của bạn. Và tôi yêu cầu bạn gọi file source này là main.c Cách sử dụng nhiều files trong cùng một project Trong thực tế, chương trình sẽ không được viết hết toàn bộ trong mỗi file main.c Chắc chắn là chúng ta cũng có thể làm vậy nhưng việc mò mẫm trong một file chứa 10000 dòng code thật sự không thiết thực chút nào. Chính vì vậy, thông thường, một project sẽ được tạo bởi nhiều files. Nhưng mà project là gì vậy? Không phải vậy chứ, bạn quên nó rồi à ? Dịch giả: Mr.

Hung Editor: M0N1M daihung.fr -5- thaibaminh2512@gmai.com Tài liệu hướng dẫn lập trình C www.com Apprenez à programmer en C Tác giả: M@teo21 Ok, không sao, tôi sẽ giải thích lại cho bạn, việc chúng ta thống nhất chung về khái niệm thật sự cần thiết. Project là tập hợp những files source của chương trình. Trong thời điểm hiện tại, chương trình của chúng ta chỉ chứa mỗi một file duy nhất. Hãy nhìn vào IDE, phía bên trái: Bạn thấy trong hình chụp phía trên, bên trái, project này chỉ chứa duy nhất mỗi file main.c Sau đây, tôi sẽ cho bạn xem hình ảnh một chương trình thật sự, chương trình mà bạn sẽ thực hiện trong những bài sau: trò chơi Sokoban Bạn thấy đấy, có khá nhiều files khác nhau.

Một chương trình bình thường sẽ giống như trên: bạn sẽ thấy nhiều files được liệt kê ở cột bên trái. Bạn cũng tìm thấy file main.c: bên trong chứa function main. Và hầu như mọi chương trình tôi viết, tôi đều để function main trong file main. Dịch giả: Mr.

Hung Editor: M0N1M daihung.fr -6- thaibaminh2512@gmai.com Tài liệu hướng dẫn lập trình C www.com Apprenez à programmer en C Tác giả: M@teo21 Nhưng tại sao phải tạo ra nhiều files như vậy? Vậy thì tôi có thể tạo tối đa bao nhiêu file cho mỗi project ? Điều đó tùy thuộc vào bạn. Bình thường, người ta thường hay sắp xếp những function có cùng chủ đề vào chung với nhau. Trong hình vẽ trên, trong file editor.c tôi tập hợp những functions liên quan đến việc thay đổi cấp độ của trò chơi, trong file game.c, tôi tập hợp những functions liên quan đến trò chơi,.c Bạn thấy trong hình vẽ trên, có 2 loại file khác nhau:  những file .h: gọi là file headers. Những file này chứa prototype của các functions.c: là những file source.

Những file này chứa nội dung của các functions. Bình thường, người ta rất ít khi để những prototypes trong các file .c giống như vừa rồi chúng ta đã làm trong file main.c tương ứng với một file .h trong đó chứa những prototype của những functions. Xem lại hình trên một lần nữa:  Có file editor.c (chứa C code của các functions) và file editor.h (chứa prototype các functions đó)  Tương tự như vậy ta có các file game.c và file game. Làm thế nào máy tính có thể biết được các prototypes nằm ở một file khác ngoài file .c ? Ta thêm file .h vào chương trình nhờ vào một chỉ thị tiền xử lý (preprocessor directive).

Tập trung nhé, bạn cần chuẩn bị tinh thần để hiểu biết thêm khá nhiều thứ đấy ! Làm sao thêm vào một file header ?. Bạn biết cách mà, bạn đã làm rất nhiều lần rồi nhớ không? Dịch giả: Mr. Hung Editor: M0N1M daihung.fr -7- thaibaminh2512@gmai.com Tài liệu hướng dẫn lập trình C www.com Apprenez à programmer en C Tác giả: M@teo21 Chúng ta hãy xem ví dụ đoạn đầu của file jeu.c tôi viết: C code: #include <stdio. Và bây giờ bạn đã biết cách thêm vào là sử dụng các chỉ thị tiền xử lý (preprocessor directive) #include.

Bây giờ, chú ý những dòng đầu tiên của đoạn code trên: C code: #include <stdio.h" // them vao file game.h Tôi thêm vào 3 files .h: stdio, stdlib và game. Có một sự khác biệt ở đây: Những file mà bạn để chung trong folder project phải được viết trong ngoặc kép ".

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ