Giáo trình Ngôn ngữ Lập trình C - ĐH Sư phạm Kỹ thuật TP.HCM

Giáo trình Ngôn ngữ lập trình C của Trương Ngọc Sơn. Tài liệu kinh điển cung cấp kiến thức lập trình C từ cơ bản đến nâng cao cho người học.

Chuyên ngành

Kỹ thuật Máy tính

Người đăng

Ẩn danh

Thể loại

Giáo trình

2020

211
3
0

Phí lưu trữ

55 Point

Mục lục chi tiết

LỜI NÓI ĐẦU

1. Chương 1: GIỚI THIỆU

1.1. CHƯƠNG TRÌNH VÀ NGÔN NGỮ LẬP TRÌNH

1.2. GIẢI THUẬT VÀ LƯU ĐỒ

1.3. NGÔN NGỮ LẬP TRÌNH C

1.4. MỘT CHƯƠNG TRÌNH C ĐƠN GIẢN

1.5. MỘT CHƯƠNG TRÌNH C KHÁC: CỘNG HAI SỐ NGUYÊN

1.6. CÁC BƯỚC BIÊN DỊCH CHƯƠNG TRÌNH C

1.7. TỪ KHÓA VÀ TÊN GỌI

1.8. CÁC PHÉP TOÁN TRONG C

1.9. XUẤT NHẬP DỮ LIỆU

1.9.1. Hàm nhập dữ liệu

1.9.2. Hàm xuất dữ liệu

2. Chương 2: LỆNH RẼ NHÁNH CÓ ĐIỀU KIỆN

2.1. LỆNH ĐƠN VÀ LỆNH PHỨC

2.1.1. Lệnh phức/ Khối lệnh

2.2. CÁC DẠNG CẤU TRÚC CHƯƠNG TRÌNH

2.2.1. Cấu trúc tuần tự

2.2.2. Cấu trúc rẽ nhánh

2.3. LỆNH RẼ NHÁNH IF

2.3.1. Lệnh if thiếu

2.3.2. Lệnh if đủ

2.3.3. Lệnh if … else if … else

2.3.4. Cấu trúc if lồng nhau

2.4. TOÁN TỬ ĐIỀU KIỆN BA NGÔI

2.5. LỆNH RẼ NHÁNH SWITCH

2.5.1. Giải thích

2.5.2. Ví dụ minh họa

3. Chương 3: LỆNH VÒNG LẶP

3.1. Ví dụ minh họa

3.2. Ví dụ minh họa

3.3. Ví dụ minh họa

3.4. CÂU LỆNH BREAK

3.5. CÂU LỆNH CONTINUE

3.6. CÂU LỆNH GOTO VÀ NHÃN

4. Chương 4: MẢNG VÀ CHUỖI

4.1. Mảng 1 chiều

4.2. CHUỖI VÀ MẢNG CHUỖI

4.2.1. Mảng chuỗi

4.2.2. Một số hàm liên quan đến ký tự và chuỗi ký tự

5. Chương 5: CON TRỎ

5.1. KHAI BÁO VÀ SỬ DỤNG CON TRỎ

5.2. CON TRỎ VÀ MẢNG

5.3. CẤP PHÁT BỘ NHỚ ĐỘNG

5.3.1. Hàm calloc và realloc

6. Chương 6: HÀM

6.1. ĐỊNH NGHĨA HÀM

6.2. PHÂN LOẠI HÀM THEO THAM SỐ VÀ GIÁ TRỊ TRẢ VỀ

6.3. TRUYỀN THAM SỐ CHO HÀM

6.3.1. Truyền giá trị cho tham số hàm

6.3.2. Truyền địa chỉ cho tham số hàm

6.3.3. Truyền mảng cho hàm

6.4. MỘT SỐ HÀM THƯ VIỆN CHUẨN

7. Chương 7: KIỂU DỮ LIỆU TỰ TẠO

7.1. KIỂU CẤU TRÚC

7.1.1. Giới thiệu kiểu cấu trúc

7.1.2. Định nghĩa một kiểu cấu trúc mới

7.1.3. Khai báo biến kiểu cấu trúc

7.1.4. Truy xuất tới các thành phần của biến cấu trúc

7.1.5. Mảng một chiều kiểu cấu trúc

7.1.6. Con trỏ kiểu cấu trúc

7.1.7. Sử dụng kiểu cấu trúc với Hàm

7.2. KIỂU UNION

7.2.1. Giới thiệu kiểu Union

7.2.2. Định nghĩa một kiểu Union mới

7.2.3. Khai báo và sử dụng biến kiểu Union

7.3. KIỂU LIỆT KÊ (ENUMERATION)

7.3.1. Giới thiệu kiểu liệt kê

7.3.2. Định nghĩa một kiểu Enumeration mới

7.3.3. Khai báo và sử dụng biến kiểu liệt kê

8. Chương 8: TIỀN XỬ LÝ

8.1. CHỈ THỊ BAO HÀM TỆP (INCLUDE)

8.2. CHỈ THỊ ĐỊNH NGHĨA #DEFINE

8.3. CHỈ THỊ ĐIỀU KHIỂN TRÌNH BIÊN DỊCH

TÀI LIỆU THAM KHẢO

Tóm tắt

I. Tổng quan Giáo trình Ngôn ngữ Lập trình C Trương Ngọc Sơn Lê Minh Nền tảng vững chắc

Trong bối cảnh công nghệ thông tin và kỷ nguyên số phát triển mạnh mẽ, việc nắm vững các ngôn ngữ lập trình nền tảng trở nên vô cùng thiết yếu. Giáo trình Ngôn ngữ Lập trình C của nhóm tác giả uy tín TS. Trương Ngọc Sơn, ThS. Lê Minh, ThS. Trương Ngọc Hà, ThS. Lê Minh Thành đã khẳng định vị thế là một tài liệu học C chuẩn mực, đặc biệt dành cho sinh viên ngành Kỹ thuật Máy tính. Được xuất bản bởi Nhà Xuất Bản Đại Học Quốc Gia TP. Hồ Chí Minh vào năm 2020, giáo trình C này không chỉ cung cấp kiến thức toàn diện về lập trình C cơ bản mà còn đào sâu vào các khái niệm cốt lõi, từ đó giúp người học xây dựng một nền tảng vững chắc để tiếp cận các công nghệ hiện đại. Việc nghiên cứu tài liệu này giúp sinh viên hiểu rõ tầm quan trọng của C, từ cấu trúc chương trình đến các thao tác xử lý dữ liệu phức tạp, chuẩn bị hành trang vững chắc cho sự nghiệp lập trình tương lai. Đây là một sách lập trình C không thể thiếu trong thư viện học tập.

1.1. Tầm quan trọng của ngôn ngữ lập trình C trong kỷ nguyên 4.0

Ngôn ngữ lập trình C, dù ra đời từ năm 1972 bởi Dennis Ritchie, vẫn giữ vai trò là một trong những ngôn ngữ nền tảng và chuẩn mực trong ngành kỹ thuật. Theo lời nhóm tác giả Trương Ngọc Sơn, Lê Minh, Trương Ngọc Hà, Lê Minh Thành trong lời nói đầu, C không chỉ là công cụ cần thiết để tiếp cận công nghệ, đặc biệt trong cuộc cách mạng công nghiệp 4.0, mà còn giúp rèn luyện khả năng tư duy thông qua việc giải quyết các bài toán và giải thuật. Nhiều ứng dụng hệ thống, hệ nhúng, vi điều khiển, vi xử lý đều được xây dựng từ ngôn ngữ C. Hơn nữa, C được xem là ngôn ngữ nguồn gốc của nhiều ngôn ngữ lập trình cấp cao phát triển sau này như C++, C#, Objective-C, Python hay Verilog. Việc học tốt và vận dụng hiệu quả lập trình C giúp lập trình viên dễ dàng tiếp cận các ngôn ngữ hiện đại khác, làm chủ công nghệ tự động hóa, vạn vật kết nối (IoT) và trí tuệ nhân tạo (AI). Đây là một yếu tố quan trọng mà giáo trình ngôn ngữ lập trình C này nhấn mạnh, chuẩn bị kiến thức toàn diện cho sinh viên.

1.2. Mục tiêu và đối tượng của tài liệu học lập trình C từ Đại học Sư phạm Kỹ thuật

Giáo trình Ngôn ngữ Lập trình C của nhóm tác giả từ Trường Đại học Sư phạm Kỹ thuật TP. Hồ Chí Minh được biên soạn đặc biệt cho sinh viên khối kỹ thuật, với mục tiêu cung cấp kiến thức cơ sở về ngôn ngữ lập trình C. Tài liệu này hướng đến việc giúp người học hiểu rõ các đối tượng trong ngôn ngữ lập trình, cách vận hành của các câu lệnh, cấu trúc điều kiện, vòng lặp, hàm, mảng và con trỏ trong C. Mục tiêu cuối cùng là trang bị cho sinh viên khả năng vận dụng kiến thức vào các lĩnh vực thực tiễn như lập trình giao diện, lập trình game, lập trình vi điều khiển, vi xử lý và các thiết bị lập trình được. Đối tượng chính của giáo trình là những người mới bắt đầu học lập trình hoặc những sinh viên muốn củng cố nền tảng lập trình C cơ bản và nâng cao. Giáo trình còn giúp phát triển kỹ năng tư duy logic, giải quyết vấn đề, những kỹ năng không thể thiếu đối với một lập trình viên. Việc tập trung vào thực hành song song với lý thuyết là điểm nhấn, giúp người học nắm vững từng cấu trúc lệnh một cách trực quan.

II. Thách thức tự học lập trình C và giải pháp từ giáo trình này

Tự học C hay lập trình C cơ bản thường gặp phải nhiều thách thức, từ việc hiểu rõ các khái niệm trừu tượng đến việc chuyển đổi ý tưởng thành mã nguồn thực tế. Việc thiếu kinh nghiệm thực hành và một phương pháp giảng dạy rõ ràng có thể khiến người học nản lòng. Giáo trình ngôn ngữ lập trình C Trương Ngọc Sơn Lê Minh Trương Ngọc Hà Lê Minh Thành ra đời nhằm giải quyết những vấn đề này. Tài liệu này cung cấp một lộ trình học tập có cấu trúc, tích hợp lý thuyết và ví dụ thực tiễn, giúp người học dễ dàng vượt qua các khó khăn thường gặp. Sự kết hợp giữa lý thuyết nền tảng và các bài tập thực hành được trình bày chi tiết trong sách lập trình C này là chìa khóa để phát triển kỹ năng tư duy và kinh nghiệm lập trình. Đây là một hướng dẫn lập trình C toàn diện, giúp học viên tiến bộ nhanh chóng và vững chắc trong hành trình chinh phục ngôn ngữ C.

2.1. Vấn đề tư duy giải thuật và kinh nghiệm thực hành lập trình C

Kỹ thuật lập trình đòi hỏi nhiều kỹ năng tư duy, kinh nghiệm và kiến thức chuyên sâu. Tư duy giải thuật là cách người lập trình đưa ra các phương pháp hiệu quả để giải quyết bài toán, trong khi kinh nghiệm giúp chuyển đổi ý tưởng thành chương trình tối ưu. Nhóm tác giả Trương Ngọc Sơn, Lê Minh, Trương Ngọc Hà, Lê Minh Thành nhấn mạnh rằng học lập trình cần nhiều yếu tố hơn một số môn học khác, đặc biệt là quá trình thực hành phải luôn đi kèm hoặc song song với học lý thuyết. Theo tài liệu, “Thực hành luôn được đòi hỏi kèm theo hoặc song song với quá trình học lý thuyết. Quá trình thực hành giúp người học hình dung được, nắm được cách vận hành của từng cấu trúc lệnh.” Sinh viên mới học lập trình thường có thói quen bỏ qua bước vẽ lưu đồ, dẫn đến khó khăn khi đối mặt với các chương trình phức tạp. Giáo trình C đại học này khắc phục điều đó bằng cách trình bày cụ thể lý thuyết, giải thích chương trình và đưa ra các bài ví dụ mẫu, khuyến khích người học thực hành lại các ý tưởng lập trình và bài mẫu để đạt hiệu quả cao nhất.

2.2. Cách giáo trình ngôn ngữ lập trình C Trương Ngọc Sơn giải quyết khó khăn

Giáo trình Ngôn ngữ Lập trình C của nhóm Trương Ngọc Sơn, Lê Minh, Trương Ngọc Hà, Lê Minh Thành được thiết kế để giải quyết các khó khăn trong tự học C. Tài liệu này trình bày các khái niệm từ cơ bản đến nâng cao một cách logic, bắt đầu từ giới thiệu về ngôn ngữ lập trình, giải thuật, lưu đồ, đến các cấu trúc lệnh, mảng, con trỏ trong C, hàm và xử lý tệp (file I/O). Mục lục chi tiết của sách của Trương Ngọc Sơn bao gồm các chương như 'Giới thiệu', 'Lệnh rẽ nhánh có điều kiện', 'Lệnh vòng lặp', 'Mảng và chuỗi', 'Con trỏ', 'Hàm', 'Kiểu dữ liệu tự tạo' và 'Tiền xử lý'. Mỗi chương đều có mục tiêu rõ ràng và nội dung được giải thích cặn kẽ, kèm theo ví dụ minh họa và bài tập lập trình C để củng cố kiến thức. Phương pháp trình bày này giúp người học không chỉ hiểu 'cái gì' mà còn 'tại sao' và 'như thế nào', từ đó phát triển khả năng tư duy và kỹ năng giải quyết vấn đề. Việc đi sâu vào quy trình biên dịch C cũng giúp người học có cái nhìn tổng thể về quá trình phát triển phần mềm.

III. Hướng dẫn cơ bản lập trình C với giáo trình Trương Ngọc Sơn Lê Minh

Giáo trình Ngôn ngữ Lập trình C Trương Ngọc Sơn Lê Minh Trương Ngọc Hà Lê Minh Thành cung cấp một lộ trình học tập bài bản, giúp người đọc nắm vững những kiến thức nền tảng nhất của ngôn ngữ C. Từ việc hiểu các thành phần cấu tạo nên một chương trình C đơn giản, đến việc làm quen với các kiểu dữ liệu, biến, hằng, và các phép toán, tài liệu này đều trình bày một cách chi tiết và dễ hiểu. Việc phân tích từng dòng lệnh trong các ví dụ cơ bản giúp người học hình dung rõ ràng cách hoạt động của ngôn ngữ. Mục tiêu của phần này là xây dựng một nền tảng vững chắc cho người học, giúp họ tự tin viết và biên dịch C thành công các chương trình đầu tiên, chuẩn bị cho các kiến thức phức tạp hơn về sau. Đây là một tài liệu học lập trình C rất phù hợp cho ngôn ngữ C cho người mới bắt đầu.

3.1. Các thành phần cơ bản biến hằng và toán tử trong C

Trong lập trình C, việc hiểu rõ các thành phần cơ bản là bước đầu tiên để xây dựng chương trình. Giáo trình ngôn ngữ lập trình C Trương Ngọc Sơn định nghĩa biến là vùng nhớ trong RAM để lưu trữ dữ liệu, được khai báo với kiểu dữ liệu (ví dụ: int a;). Hằng số là vùng nhớ có giá trị cố định, không đổi trong suốt chương trình (ví dụ: const float PI = 3.14;). Việc khai báo và khởi tạo giá trị ban đầu cho biến và hằng được giải thích kỹ lưỡng. Ngoài ra, sách của Trương Ngọc Sơn còn trình bày chi tiết về các phép toán trong C bao gồm số học (+, -, *, /, %), quan hệ (>, <, ==, !=), luận lý (&&, ||, !) và bit-wise (&, |, ^, ~, <<, >>). Quy tắc ưu tiên của các phép toán được nhấn mạnh, giúp tránh sai sót logic trong quá trình viết mã. Hiểu rõ các thành phần này là chìa khóa để viết các mã nguồn C chính xác và hiệu quả.

3.2. Hiểu rõ quy trình biên dịch C và thực thi chương trình

Một chương trình C không thể thực thi trực tiếp mà cần trải qua quá trình biên dịch C. Giáo trình ngôn ngữ lập trình C mô tả 4 bước chính: tiền xử lý (Preprocessor), biên dịch (Compilation), hợp dịch (Assembly) và liên kết (Link). Bước tiền xử lý loại bỏ chú thích và xử lý các chỉ thị #include, #define. Bước biên dịch chuyển mã nguồn C sang mã hợp ngữ. Hợp dịch tiếp theo chuyển mã hợp ngữ sang mã máy. Cuối cùng, quá trình liên kết tổng hợp các mã từ thư viện hoặc các tệp nguồn khác để tạo ra một tập tin thực thi (.exe). Sự hiểu biết về quy trình này là quan trọng để gỡ lỗi và tối ưu hóa chương trình. Nhóm tác giả Trương Ngọc Sơn, Lê Minh, Trương Ngọc Hà, Lê Minh Thành đã trình bày rõ ràng các bước này, giúp người học hình dung toàn bộ chu trình phát triển một chương trình C, từ mã nguồn C đến khi chương trình sẵn sàng hoạt động. Kiến thức này đặc biệt hữu ích cho ngôn ngữ C cho người mới bắt đầu.

3.3. Các hàm xuất nhập dữ liệu C quan trọng cho người mới bắt đầu

Việc tương tác với người dùng thông qua nhập và xuất dữ liệu là một phần không thể thiếu trong lập trình C. Giáo trình Ngôn ngữ Lập trình C giới thiệu hai hàm cơ bản và quan trọng nhất: scanf() cho nhập liệu và printf() cho xuất liệu. Hàm scanf() được dùng để đọc dữ liệu từ bàn phím và lưu vào biến, sử dụng các mã định dạng như %d cho số nguyên, %f cho số thực, %c cho ký tự và %s cho chuỗi. Ví dụ scanf(“%d”,&a); giúp nhập một số nguyên vào biến a. Hàm printf() dùng để hiển thị thông tin ra màn hình, cũng sử dụng các mã định dạng tương tự. Ví dụ printf(“Tong la: %d \n”,tong); in ra dòng chữ 'Tong la:' cùng giá trị của biến tong. Tài liệu cũng nhấn mạnh tầm quan trọng của việc khai báo thư viện stdio.h bằng #include <stdio.h> để sử dụng các hàm này. Sự rõ ràng trong cách trình bày các hàm xuất nhập dữ liệu C này giúp người học dễ dàng nắm bắt cách tương tác với chương trình của mình, một yếu tố then chốt trong lập trình C cơ bản.

IV. Nắm vững con trỏ trong C và mảng Bí quyết lập trình hiệu quả

Một trong những khái niệm mạnh mẽ nhưng cũng đầy thách thức trong lập trình Ccon trỏ trong C và mảng. Giáo trình Ngôn ngữ Lập trình C Trương Ngọc Sơn Lê Minh Trương Ngọc Hà Lê Minh Thành dành riêng các chương để giải thích sâu sắc về cách khai báo, sử dụng và quản lý bộ nhớ với con trỏ, cũng như cách làm việc với mảng và chuỗi ký tự. Việc thành thạo những khái niệm này mở ra cánh cửa cho việc viết các chương trình C hiệu quả hơn, tối ưu tài nguyên và có khả năng tương tác trực tiếp với bộ nhớ. Đây là bí quyết giúp người học nâng cao kỹ năng lập trình C nâng cao, từ đó xây dựng các ứng dụng phức tạp và mạnh mẽ. Việc hiểu rõ cấu trúc dữ liệu và giải thuật C cũng gắn liền mật thiết với việc nắm vững con trỏ và mảng.

4.1. Khai báo và quản lý con trỏ trong C để tối ưu bộ nhớ

Con trỏ trong C là một biến lưu trữ địa chỉ của một biến khác. Giáo trình ngôn ngữ lập trình C giải thích cách khai báo con trỏ (ví dụ: int *ptr;) và cách sử dụng nó để truy cập hoặc thay đổi giá trị tại địa chỉ mà nó trỏ tới. Các khái niệm như toán tử lấy địa chỉ (&) và toán tử dereference (*) được trình bày cặn kẽ. Tài liệu cũng đi sâu vào mối quan hệ giữa con trỏ và mảng, chỉ ra rằng tên mảng có thể được coi là một con trỏ hằng trỏ đến phần tử đầu tiên của mảng. Đặc biệt, phần cấp phát bộ nhớ động sử dụng các hàm như malloc(), calloc(), realloc()free() được hướng dẫn chi tiết, giúp lập trình viên quản lý bộ nhớ một cách linh hoạt và hiệu quả hơn. Việc nắm vững con trỏ là yếu tố then chốt cho lập trình C nâng cao và phát triển các hệ thống phức tạp, giúp tối ưu hóa việc sử dụng tài nguyên hệ thống.

4.2. Ứng dụng mảng trong C và chuỗi ký tự qua ví dụ thực tiễn

Mảng trong C là cấu trúc dữ liệu cơ bản để lưu trữ một tập hợp các phần tử cùng kiểu. Giáo trình ngôn ngữ lập trình C Trương Ngọc Sơn trình bày cách khai báo mảng một chiều và đa chiều, cách truy cập các phần tử thông qua chỉ số. Các ví dụ thực tiễn giúp người học dễ dàng hình dung và áp dụng. Phần chuỗi ký tự trong C được xử lý như mảng các ký tự, kết thúc bằng ký tự null (\0). Tài liệu giới thiệu một số hàm thư viện chuẩn hữu ích để thao tác với chuỗi như strlen(), strcpy(), strcat(), strcmp(). Ví dụ về việc xử lý mảng và chuỗi được minh họa rõ ràng, từ việc duyệt mảng đến việc tìm kiếm, sắp xếp. Việc thành thạo mảng và chuỗi là điều kiện tiên quyết để xử lý dữ liệu có tổ chức, tạo nền tảng cho việc học các cấu trúc dữ liệu và giải thuật C phức tạp hơn. Đây là kiến thức cốt lõi giúp lập trình viên viết các chương trình xử lý thông tin hiệu quả.

4.3. Tìm hiểu kiểu cấu trúc struct trong C và kiểu dữ liệu tự tạo

Ngoài các kiểu dữ liệu cơ bản, lập trình C cho phép định nghĩa các kiểu dữ liệu tự tạo, nổi bật là kiểu cấu trúc (struct) trong C và kiểu hợp nhất (union). Giáo trình ngôn ngữ lập trình C của nhóm tác giả Trương Ngọc Sơn, Lê Minh, Trương Ngọc Hà, Lê Minh Thành giải thích cách định nghĩa một cấu trúc mới để nhóm các kiểu dữ liệu khác nhau thành một đơn vị logic. Ví dụ, một cấu trúc SinhVien có thể bao gồm tên (chuỗi), tuổi (số nguyên), điểm trung bình (số thực). Tài liệu hướng dẫn cách khai báo biến kiểu cấu trúc, truy xuất các thành phần, sử dụng mảng cấu trúc và con trỏ cấu trúc. Kiểu hợp nhất (union) cũng được giới thiệu, cho phép nhiều thành viên sử dụng cùng một vùng bộ nhớ. Cuối cùng, kiểu liệt kê (enumeration) giúp định nghĩa các hằng số có ý nghĩa rõ ràng. Việc sử dụng hiệu quả các kiểu dữ liệu tự tạo này giúp tổ chức dữ liệu một cách khoa học, làm cho mã nguồn C dễ đọc, dễ bảo trì và mở rộng hơn, một kỹ năng quan trọng trong lập trình C nâng cao.

V. Ứng dụng của Ngôn ngữ lập trình C trong ngành kỹ thuật máy tính

Dù ra đời đã lâu, Ngôn ngữ lập trình C vẫn là một công cụ mạnh mẽ với nhiều ứng dụng trong ngành kỹ thuật máy tính. Giáo trình Ngôn ngữ Lập trình C Trương Ngọc Sơn Lê Minh Trương Ngọc Hà Lê Minh Thành không chỉ dừng lại ở lý thuyết mà còn làm nổi bật vai trò thực tiễn của C trong các hệ thống hiện đại. Từ lập trình hệ thống đến phát triển các thiết bị nhúng, C luôn chứng tỏ được sức mạnh về hiệu suất và khả năng kiểm soát phần cứng trực tiếp. Việc hiểu rõ các ứng dụng này giúp sinh viên nhìn thấy bức tranh toàn cảnh về giá trị của việc học C, đồng thời mở rộng tầm nhìn về các cơ hội nghề nghiệp trong lĩnh vực công nghệ. Đây là một tài liệu học C không chỉ cung cấp kiến thức mà còn truyền cảm hứng về khả năng ứng dụng thực tế.

5.1. Vai trò của C trong lập trình hệ thống và hệ nhúng

Ngôn ngữ lập trình C đóng vai trò cốt lõi trong lập trình hệ thống (system programming). Nhiều hệ điều hành, điển hình là UNIX, được xây dựng bằng C. Theo giáo trình ngôn ngữ lập trình C của Trương Ngọc Sơn, C là ngôn ngữ tiêu chuẩn cho việc lập trình các hệ thống nhúng dựa trên hệ điều hành Linux (Embedded system programming), cũng như lập trình điều khiển với các hệ thống điện tử dân dụng, công nghiệp, sử dụng vi xử lý, vi điều khiển. Khả năng tương tác trực tiếp với phần cứng, quản lý bộ nhớ hiệu quả và tốc độ thực thi cao là những ưu điểm vượt trội của C, khiến nó trở thành lựa chọn hàng đầu cho các ứng dụng yêu cầu hiệu suất cao và tài nguyên hạn chế. Tài liệu này cung cấp kiến thức vững chắc để sinh viên có thể phát triển các ứng dụng trong những lĩnh vực này, từ đó đáp ứng yêu cầu của thị trường kỹ thuật hiện đại. Việc học C sẽ là nền tảng vững chắc cho sự nghiệp trong ngành Kỹ thuật Máy tính.

5.2. Sự ảnh hưởng của C đến các ngôn ngữ lập trình hiện đại

Mặc dù có nhiều ngôn ngữ lập trình hiện đại ra đời, nhưng cấu trúc và cách vận hành của chúng thường có nhiều nét tương đồng với Ngôn ngữ lập trình C. Giáo trình ngôn ngữ lập trình C Trương Ngọc Sơn Lê Minh chỉ ra rằng nhiều ngôn ngữ phổ biến hiện nay như C++, C#, Objective-C đều phát triển từ C. Ngay cả các ngôn ngữ như Python, dù có cú pháp khác biệt, vẫn có thể hưởng lợi từ tư duy và giải thuật trong C. “Thực tế cho thấy, các ngôn ngữ khác nhau sử dụng bộ từ khóa khác nhau dùng để phát biểu câu lệnh, tuy nhiên, cấu trúc, cách vận hành các câu lệnh và các phát biểu có nhiều nét tương đồng với nhau. Chính vì điều đó, hiểu và lập trình tốt ngôn ngữ C giúp lập trình viên có thể tiếp cận các ngôn ngữ các một cách nhanh và đơn giản.” (Trích từ giáo trình). Điều này khẳng định vai trò nền tảng của C trong việc hình thành tư duy lập trình và giúp người học dễ dàng chuyển đổi sang các ngôn ngữ khác. Đây là một lý do quan trọng khiến giáo trình C đại học này trở nên cần thiết cho sinh viên ngành kỹ thuật máy tính.

VI. Giáo trình ngôn ngữ lập trình C và tương lai phát triển kỹ năng

Sở hữu Giáo trình Ngôn ngữ Lập trình C của Trương Ngọc Sơn, Lê Minh, Trương Ngọc Hà, Lê Minh Thành là một lợi thế lớn cho bất kỳ ai muốn xây dựng sự nghiệp vững chắc trong ngành công nghệ. Sách lập trình C này không chỉ là một tài liệu học lập trình C mà còn là một người dẫn đường giúp người học phát triển tư duy logic, khả năng giải quyết vấn đề và kỹ năng thực hành. Việc khai thác tối đa nội dung giáo trình, kết hợp với thực hành liên tục, sẽ giúp người học không chỉ thành thạo C mà còn có khả năng thích nghi và học hỏi các ngôn ngữ lập trình khác một cách nhanh chóng. Tương lai của ngành công nghiệp đòi hỏi những lập trình viên có nền tảng vững chắc, và giáo trình ngôn ngữ lập trình C này chính là điểm khởi đầu lý tưởng để đạt được điều đó. Đây thực sự là một sách tham khảo lập trình C đáng giá.

6.1. Hướng dẫn khai thác tối đa tài liệu học C để thành thạo

Để thành thạo lập trình C với giáo trình ngôn ngữ lập trình C của Trương Ngọc Sơn, Lê Minh, Trương Ngọc Hà, Lê Minh Thành, cần có một phương pháp học tập hiệu quả. Trước hết, cần đọc kỹ và hiểu sâu lý thuyết ở từng chương. Sau đó, không thể thiếu việc thực hành lại các ví dụ mẫu và làm đầy đủ các bài tập lập trình C được cung cấp. Nhóm tác giả khuyến nghị "người học cần thực hành lại các ý tưởng lập trình, các bài mẫu được trình bày trong tài liệu". Việc này giúp củng cố kiến thức và phát triển kỹ năng gỡ lỗi. Hơn nữa, cần tìm hiểu thêm các mã nguồn C từ bên ngoài, tham gia các diễn đàn lập trình hoặc dự án nhỏ để áp dụng kiến thức vào thực tế. Việc kết hợp lý thuyết với thực hành liên tục, tự mình viết mã nguồn C, và tìm kiếm giải pháp cho các vấn đề là chìa khóa để khai thác tối đa giá trị của giáo trình C Tiếng Việt này, từ đó nhanh chóng đạt được sự thành thạo.

6.2. Lời khuyên từ nhóm tác giả Trương Ngọc Sơn Lê Minh cho người học

Trong lời nói đầu của Giáo trình Ngôn ngữ Lập trình C, nhóm tác giả TS. Trương Ngọc Sơn, ThS. Lê Minh, ThS. Trương Ngọc Hà, ThS. Lê Minh Thành đã gửi gắm những lời khuyên chân thành cho người học. Họ nhấn mạnh tầm quan trọng của việc xây dựng tư duy giải thuật và không bỏ qua bước vẽ lưu đồ, đặc biệt đối với các chương trình phức tạp. “Việc xây dựng và kiểm tra kỹ lưu đồ cho phép người lập trình đánh giá, kiểm tra chương trình đã đáp ứng được yêu cầu hay chưa; nó cho phép người lập trình tìm ra được các lỗi mà chương trình khi chạy thực tế có thể mắc phải hoặc phát hiện một số trường hợp bị bỏ sót.” Đây là kinh nghiệm quý báu được đúc kết từ thực tế giảng dạy và nghiên cứu. Ngoài ra, việc chủ động thực hành và không ngại sai sót cũng là yếu tố quan trọng để tiến bộ. Những lời khuyên này không chỉ định hướng cho việc học C mà còn là kim chỉ nam cho toàn bộ hành trình trở thành một lập trình viên chuyên nghiệp, giúp người học phát triển toàn diện kỹ năng và tư duy.

30/09/2025

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

CHƯƠNG 1 GIỚI THIỆU Mục tiêu: Sau khi kết thúc chương này, người đọc có thể: - Phân biệt được các loại ngôn ngữ lập trình. - Vẽ được lưu đồ giải thuật cho các yêu cầu lập trình. - Sử dụng được các thành phần cơ bản trong ngôn ngữ C: câu lệnh, câu chú thích, biến, hằng, phép toán. - Sử dụng được các hàm xuất, nhập dữ liệu trong C.

- Viết được các chương trình C cơ bản theo đúng cấu trúc chương trình. CHƯƠNG TRÌNH VÀ NGÔN NGỮ LẬP TRÌNH Chương trình máy tính (computer program) là một chuỗi các lệnh được viết bởi một loại ngôn ngữ lập trình để thực hiện một hoặc một số tác vụ nào đó. Trong đó ngôn ngữ lập trình là một tập quy ước cụ thể được sử dụng để viết chương trình cho máy tính. Nói cách khác, chương trình được xem như một loạt các lệnh mà máy tính có thể đọc hiểu và thực thi theo đó.

Khi nói đến chương trình máy tính, người ta thường hình dung ra chương trình được chạy trên một máy tính. Tuy nhiên, chương trình, nhìn ở góc độ kỹ thuật thì là một chuỗi các mã lệnh dùng để điều khiển phần cứng, cụ thể là bộ vi xử lý, bộ vi điều khiển. Có nhiều loại ngôn ngữ lập trình khác nhau. Các ngôn ngữ lập trình được phân loại theo mức độ trừu tượng, trong đó gồm có: 9  Ngôn ngữ máy (machine language) hay còn được gọi là mã máy (machine code).

 Ngôn ngữ lập trình cấp thấp (low-level programming language).  Ngôn ngữ lập trình cấp cao (high-level programming language). Phân loại ngôn ngữ lập trình Ngôn ngữ cấp thấp cũng được chia ra 2 mức khác nhau, ngôn ngữ máy hay mã máy và hợp ngữ (assembly language). Ngôn ngữ máy (machine code) là các đoạn mã hệ 16 (hexadecimal code) hoặc mã nhị phân (binary code) được sử dụng để lập trình cho các hệ thống máy tính đầu tiên và được xem là thế hệ đầu tiên của ngôn ngữ lập trình.

Mã máy được viết dưới dạng nhị phân (0 và 1) giúp máy tính (hay phần cứng hệ thống số) có thể đọc và thực thi trực tiếp các tác vụ mà người lập trình thiết kế. Một lợi thế của ngôn ngữ máy là máy tính có thể đọc trực tiếp và thực thi mà không cần tới một trình biên dịch, hay chuyển đổi nào. Điều này giúp các chương trình được 10 viết dưới dạng ngôn ngữ máy có thể thực thi nhanh và chính xác. Tuy nhiên, bên cạnh những ưu điểm, lập trình bằng ngôn ngữ máy cũng có nhiều nhược điểm.

Cụ thể là các mã nhị phân làm cho người lập trình khó nhớ, khó hiểu, khó chỉnh sửa. Hơn nữa, việc sửa lỗi, tìm lỗi chương trình cũng trở nên khó khăn thông qua việc dò, tham chiếu các mã nhị phân với các lệnh. Một ví dụ chương trình được viết bằng ngôn ngữ máy như sau: Lệnh bằng mã nhị phân Lệnh bằng mã Hex 0010 0001 0000 0100 2104 0001 0001 0000 0101 1105 0011 0001 0000 0110 3106 0111 0000 0000 0001 7001 0000 0000 0101 0011 0053 1111 1111 1111 1110 FFFE Hợp ngữ (Assemly language) là ngôn ngữ thế hệ thứ 2 của ngôn ngữ lập trình. Thay vì sử dụng mã nhị phân, 0 và 1, để thể hiện các lệnh, hợp ngữ sử dụng các từ khóa, các ký hiệu bằng tiếng Anh để diễn tả các câu lệnh.

Hợp ngữ giúp cho người lập trình có thể hiểu được mỗi dòng lệnh dễ dàng hơn, từ đó việc chỉnh sửa, thay đổi chương trình, cũng như quản lý chương trình đơn giản hơn so với lập trình bằng ngôn ngữ máy. Tuy nhiên, máy tính nói chung và các bộ xử lý nói riêng chỉ có thể hiểu được ngôn ngữ máy hay các mã nhị phân, do đó, cần một trình chuyển đổi hay biên dịch (compiler) để chuyển từ hợp ngữ sang mã máy, giúp máy tính nói chung và các bộ vi xử lý nói riêng có thể đọc hiểu và thực thi chương trình. 11 Ví dụ một chương trình được viết bằng hợp ngữ như sau: section .text global _start ;must be declared for linker (gcc) _start: ;tell linker entry point mov edx,len ;message length mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov edx,9 ;message length mov ecx,s2 ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .data msg db ‘Displaying 9 stars’,0xa ;a message len equ $ - msg ;length of message s2 times 9 db ‘*’ Ngôn ngữ cấp cao (high-level programming language) là ngôn ngữ gần với ngôn ngữ con người và được sử dụng phổ biến hiện nay. Chương trình được viết bằng ngôn ngữ cấp cao giúp người lập trình dễ đọc, dễ hiểu, dễ chỉnh sửa.

Với ngôn ngữ cấp cao, người lập trình dễ dàng chuyển đổi ý tưởng, các giải thuật thành các đoạn chương trình mà không cần quan tâm nhiều đến việc quản lý bộ nhớ, quản lý các thanh ghi, các chi tiết phần cứng như đã làm trong lập trình bằng ngôn ngữ cấp thấp. Cũng giống như hợp ngữ, ngôn ngữ cấp cao cần được chuyển đổi sang mã máy (ngôn ngữ máy) trước khi được thực thi. Có nhiều ngôn ngữ cấp cao được phát triển đến thời điểm hiện tại. Trong đó một số ngôn ngữ hình thành lâu đời như C, Pascal, Fortran, Basic, Java.

12 Ví dụ, một chương trình viết bằng ngôn ngữ cấp cao như sau: #include <stdio.h> int main() { printf(“Hello, World!\n”); return 0; } 1. GIẢI THUẬT VÀ LƯU ĐỒ Một chương trình được xem như một sự kết hợp của giải thuật và cách thể hiện của giải thuật thông qua ngôn ngữ lập trình. Giải thuật (Algorithm) là các cách để giải quyết bài toán lập trình, hay phương pháp cụ thể để thực hiện các tác vụ. Giải thuật được xem là cốt lõi để giải quyết các vấn đề lập trình.

Giải thuật còn thể hiện các ý tưởng của người lập trình nhằm giúp chương trình đạt hiệu quả cao nhất. Chương trình cuối cùng là tập hợp của các miêu tả giải thuật thông qua một ngôn ngữ lập trình nào đó. Lập trình là một quá trình tư duy logic giải quyết một vấn đề nào đó. Do đó, giải thuật là một yếu tố quan trọng trong lập trình.

Ví dụ, để giải một phương trình bậc 2, người lập trình phải biết các bước cần thiết để tự giải một phương trình. Nói cách khác là người lập trình có thể tự giải được thông qua các bước, các bước đó chính là giải thuật. Khi chúng ta không biết giải quyết vấn đề từ đâu, thì thật khó để viết một chương trình máy tính để giải quyết vấn đề đó. Lưu đồ là thể hiện của giải thuật bằng hình ảnh.

Nó thể hiện các bước giải quyết một vấn đề dựa trên một giải thuật nào đó. Các sinh viên mới học lập trình hoặc đã biết lập trình ở mức cơ bản thường có thói quen bỏ qua bước vẽ lưu đồ nhằm tiết kiệm thời gian. Điều này mang tính chất chủ quan vì các bạn cho rằng mình đã quen với ngôn ngữ và các công việc lập trình. Việc viết lưu đồ mang tính hình thức và mất thêm thời gian, điều này có thể đúng với một số chương trình nhỏ, một vài ví dụ cơ bản mà các bạn 13 đã nắm trong đầu từng bước xử lý.

Tuy nhiên, sẽ trở nên tai hại khi xây dựng các chương trình xử lý ở mức độ phức tạp mà bỏ qua bước xây dựng lưu đồ. Khi bắt đầu một chương trình, các ý tưởng cần được liệt kê, phân tích một cách cụ thể. Tiếp theo đó, lưu đồ để thực hiện các ý tưởng, các yêu cầu đó phải được viết ra một cách cẩn thận. Thực tế cho thấy, nhiều sinh viên viết hoàn chỉnh chương trình trước rồi sau đó mới viết lại lưu đồ giải thuật do yêu cầu phải trình bày trong báo cáo.

Điều này đi ngược với quá trình lập trình. Việc xây dựng và kiểm tra kỹ lưu đồ cho phép người lập trình đánh giá, kiểm tra chương trình đã đáp ứng được yêu cầu hay chưa; nó cho phép người lập trình tìm ra được các lỗi mà chương trình khi chạy thực tế có thể mắc phải hoặc phát hiện một số trường hợp bị bỏ sót. Khi lưu đồ đã hoàn chỉnh, việc lập trình chỉ là một cách biên dịch từ các hình khối sang một ngôn ngữ nào đó. Vì thế, khi viết lưu đồ có thể dùng ngôn ngữ mô tả sao cho đọc hiểu được, không nhất thiết phải dùng một ngôn ngữ nhất định nào.

Người lập trình dựa vào các bộ nguyên tắc cụ thể của ngôn ngữ lập trình mà mình hướng tới, xây dựng chương trình từ lưu đồ. Như vậy, tính chính xác, tính khoa học, logic của một chương trình thể hiện ở chỗ xây dựng lưu đồ, giải thuật có logic, chính xác hay không. Nếu lưu đồ giải thuật chính xác và logic, mà chương trình chạy chưa chính xác thì giống như bạn viết một bài văn mà sai chính tả, hoặc bạn dịch một bài từ tiếng Việt sang tiếng Anh mà sai ngữ pháp, từ vựng. Vấn đề tác giả muốn nhấn mạnh ở đây là các bạn mới học lập trình cần xây dựng tốt lưu đồ giải thuật, cũng như học cách thể hiện ý tưởng thông qua lưu đồ, giải thuật.

Lưu đồ (Flowchart) là cách biểu diễn bằng hình ảnh của giải thuật hay các bước xử lý và thực hiện của chương trình. Lưu đồ được viết dưới dạng các khối được quy ước cụ thể nhằm giúp người lập trình có thể đọc hiểu và chuyển các ý tưởng, giải thuật sang ngôn ngữ lập trình. Trong quá trình vẽ lưu đồ giải thuật, các ký hiệu, từ khóa, ngôn ngữ thể hiện có thể tùy chọn sao cho người đọc có thể hiểu được. Ngôn ngữ thể hiện ở đây không nhất thiết là một ngôn ngữ lập trình cụ thể nào.

Nó có thể là một ngôn ngữ thông thường mà người không có kiến thức lập 14 trình cũng có thể đọc và hiểu được. Các ngôn ngữ dùng để biểu diễn trong lưu đồ như vậy còn được gọi là code giả (Psuedo code). Một số quy ước khi biểu diễn giải thuật dưới dạng lưu đồ như sau: Bắt đầu hay kết thúc của một chương trình. Nhập hay xuất dữ liệu Các xử lý, tính toán Rẽ nhánh hay các quyết định có điều kiện Chương trình con, hàm, thủ tục Các điểm đầu cuối dùng để nối lưu đồ khi sang trang Chiều đi của quá trình xử lý Ví dụ 1.

Lưu đồ cho chương trình cộng 2 số được nhập từ bàn phím. Start Declare variables num1, num2, and sum Read num1 and num2 sum ←num1+num2 Display sum Stop 15 Trong lưu đồ trên, điểm đầu cuối cho quá trình bắt đầu và kết thúc được phân biệt bởi từ khóa start và end trong hình oval.

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