1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

211 19 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Giáo Trình Ngôn Ngữ Lập Trình C
Tác giả Trương Ngọc Sơn, Lê Minh, Trương Ngọc Hà, Lê Minh Thành
Người hướng dẫn TS. Trương Ngọc Sơn, ThS. Lê Minh, ThS. Trương Ngọc Hà, ThS. Lê Minh Thành
Trường học Trường Đại Học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh
Chuyên ngành Ngành Kỹ Thuật Máy Tính
Thể loại giáo trình
Năm xuất bản 2020
Thành phố Thành Phố Hồ Chí Minh
Định dạng
Số trang 211
Dung lượng 4,16 MB

Cấu trúc

  • Chương 1 GIỚI THIỆU (12)
    • 1.1. CHƯƠNG TRÌNH VÀ NGÔN NGỮ LẬP TRÌNH (12)
    • 1.2. GIẢI THUẬT VÀ LƯU ĐỒ (16)
    • 1.3. NGÔN NGỮ LẬP TRÌNH C (22)
    • 1.4. MỘT CHƯƠNG TRÌNH C ĐƠN GIẢN (23)
    • 1.5. MỘT CHƯƠNG TRÌNH C KHÁC: CỘNG HAI SỐ NGUYÊN (27)
    • 1.6. CÁC BƯỚC BIÊN DỊCH CHƯƠNG TRÌNH C (30)
    • 1.7. TỪ KHÓA VÀ TÊN GỌI (31)
    • 1.8. BIẾN (33)
    • 1.9. HẰNG SỐ (37)
    • 1.10. CÁC PHÉP TOÁN TRONG C (38)
    • 1.11. XUẤT NHẬP DỮ LIỆU (45)
      • 1.11.1. Hàm nhập dữ liệu (45)
      • 1.11.2. Hàm xuất dữ liệu (46)
    • 1.12. BÀI TẬP (47)
  • Chương 2 LỆNH RẼ NHÁNH CÓ ĐIỀU KIỆN (50)
    • 2.1. LỆNH ĐƠN VÀ LỆNH PHỨC (50)
      • 2.1.1 Lệnh đơn (50)
      • 2.1.2 Lệnh phức/ Khối lệnh (50)
    • 2.2. CÁC DẠNG CẤU TRÚC CHƯƠNG TRÌNH (51)
      • 2.2.1 Cấu trúc tuần tự (51)
      • 2.2.2 Cấu trúc rẽ nhánh (53)
    • 2.3. LỆNH RẼ NHÁNH IF (54)
      • 2.3.1 Lệnh if thiếu (54)
      • 2.3.2 Lệnh if đủ (58)
      • 2.3.3 Lệnh if … else if … else (60)
      • 2.3.4 Cấu trúc if lồng nhau (63)
    • 2.4. TOÁN TỬ ĐIỀU KIỆN BA NGÔI (64)
    • 2.5. LỆNH RẼ NHÁNH SWITCH... CASE (65)
      • 2.5.1 Cú pháp (65)
      • 2.5.2 Hoạt động (0)
      • 2.5.3 Giải thích (66)
      • 2.5.4 Ví dụ minh họa (67)
    • 2.6. BÀI TẬP (69)
  • Chương 3 LỆNH VÒNG LẶP (74)
    • 3.1. LỆNH for (74)
      • 3.1.1. Cú pháp (74)
      • 3.1.2. Hoạt động (0)
      • 3.1.3. Ví dụ minh họa (76)
    • 3.2. LỆNH WHILE (80)
      • 3.2.1. Cú pháp (80)
      • 3.2.2. Hoạt động (0)
      • 3.2.3. Ví dụ minh họa (81)
    • 3.3. LỆNH DO .... WHILE (84)
      • 3.3.1. Cú pháp (84)
      • 3.3.2. Hoạt động (0)
      • 3.3.3. Ví dụ minh họa (85)
    • 3.4. CÂU LỆNH BREAK (87)
    • 3.5. CÂU LỆNH CONTINUE (88)
    • 3.6. CÂU LỆNH GOTO VÀ NHÃN (89)
    • 3.7. BÀI TẬP (91)
  • Chương 4 MẢNG VÀ CHUỖI (96)
    • 4.1. MẢNG (96)
      • 4.1.1. Mảng 1 chiều (96)
      • 4.1.2. Mảng 2 chiều (106)
    • 4.2. CHUỖI VÀ MẢNG CHUỖI (109)
      • 4.2.1. Chuỗi (0)
      • 4.2.2. Mảng chuỗi (112)
      • 4.2.3. Một số hàm liên quan đến ký tự và chuỗi ký tự (0)
    • 4.3. BÀI TẬP (118)
  • Chương 5 CON TRỎ (124)
    • 5.1. GIỚI THIỆU (124)
    • 5.2. KHAI BÁO VÀ SỬ DỤNG CON TRỎ (125)
    • 5.3. CON TRỎ VÀ MẢNG (127)
    • 5.4. CẤP PHÁT BỘ NHỚ ĐỘNG (130)
      • 5.4.1. Hàm malloc (132)
      • 5.4.2. Hàm free() (133)
      • 5.4.3. Hàm calloc và realloc (134)
    • 5.5. BÀI TẬP (137)
  • Chương 6 HÀM (139)
    • 6.1. GIỚI THIỆU (139)
    • 6.2. ĐỊNH NGHĨA HÀM (140)
    • 6.3. PHÂN LOẠI HÀM THEO THAM SỐ VÀ GIÁ TRỊ TRẢ VỀ (143)
    • 6.4. KHAI BÁO HÀM (150)
    • 6.5. TRUYỀN THAM SỐ CHO HÀM (151)
      • 6.5.1. Truyền giá trị cho tham số hàm (0)
      • 6.5.2. Truyền địa chỉ cho tham số hàm (0)
      • 6.5.3. Truyền mảng cho hàm (154)
    • 6.6. ĐỆ QUY (157)
    • 6.7. MỘT SỐ HÀM THƯ VIỆN CHUẨN (159)
    • 6.8. BÀI TẬP (159)
  • Chương 7 KIỂU DỮ LIỆU TỰ TẠO (162)
    • 7.1. KIỂU CẤU TRÚC (162)
      • 7.1.1. Giới thiệu kiểu cấu trúc (0)
      • 7.1.2. Định nghĩa một kiểu cấu trúc mới (0)
      • 7.1.3. Khai báo biến kiểu cấu trúc (0)
      • 7.1.5. Mảng một chiều kiểu cấu trúc (0)
      • 7.1.6. Con trỏ kiểu cấu trúc (0)
      • 7.1.7. Sử dụng kiểu cấu trúc với Hàm (0)
    • 7.2. KIỂU UNION (185)
      • 7.2.1. Giới thiệu kiểu Union (0)
      • 7.2.2. Định nghĩa một kiểu Union mới (0)
      • 7.2.3. Khai báo và sử dụng biến kiểu Union (0)
    • 7.3. KIỂU LIỆT KÊ (ENUMERATION) (188)
      • 7.3.1. Giới thiệu kiểu liệt kê (0)
      • 7.3.2. Định nghĩa một kiểu Enumeration mới (0)
      • 7.3.3. Khai báo và sử dụng biến kiểu liệt kê (0)
    • 7.4. BÀI TẬP (191)
  • Chương 8 TIỀN XỬ LÝ (198)
    • 8.1. GIỚI THIỆU (198)
    • 8.2. CHỈ THỊ BAO HÀM TỆP (INCLUDE) (199)
    • 8.3. CHỈ THỊ ĐỊNH NGHĨA #DEFINE (206)
    • 8.4. CHỈ THỊ ĐIỀU KHIỂN TRÌNH BIÊN DỊCH (207)
    • 8.5. BÀI TẬP (209)
  • TÀI LIỆU THAM KHẢO (210)

Nội dung

GIỚI THIỆU

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

Chương trình máy tính là chuỗi lệnh được viết bằng ngôn ngữ lập trình nhằm thực hiện các tác vụ cụ thể Ngôn ngữ lập trình là tập quy ước để viết chương trình mà máy tính có thể đọc và thực thi Mặc dù thường được hình dung là chạy trên máy tính, chương trình thực chất là mã lệnh điều khiển phần cứng như bộ vi xử lý và bộ vi điều khiển Các ngôn ngữ lập trình được phân loại theo mức độ trừu tượng khác nhau.

 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).

Hình 1.1 Phân loại ngôn ngữ lập trình

Ngôn ngữ cấp thấp được chia thành hai loại: ngôn ngữ máy và hợp ngữ Ngôn ngữ máy, bao gồm mã nhị phân và mã hệ 16, là thế hệ đầu tiên của ngôn ngữ lập trình, cho phép máy tính đọc và thực thi trực tiếp mà không cần trình biên dịch Điều này mang lại tốc độ và độ chính xác cao cho các chương trình Tuy nhiên, lập trình bằng ngôn ngữ máy cũng gặp nhiều khó khăn, như việc khó nhớ, khó hiểu và khó sửa đổi mã nhị phân, làm cho việc phát hiện và sửa lỗi trở nên phức tạp hơn.

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

Hợp ngữ (Assembly language) là ngôn ngữ lập trình thế hệ thứ hai, sử dụng từ khóa và ký hiệu tiếng Anh thay vì mã nhị phân, giúp lập trình viên dễ dàng hiểu và quản lý các dòng lệnh Mặc dù hợp ngữ cải thiện khả năng lập trình, máy tính chỉ hiểu ngôn ngữ máy, vì vậy cần có trình biên dịch (compiler) để chuyển đổi hợp ngữ thành mã máy, cho phép máy tính và bộ vi xử lý thực thi chương trình.

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)

The provided assembly code demonstrates how to display a message and print a series of stars using system calls in Linux It begins by setting up the necessary registers to write the message "Displaying 9 stars" to the standard output, followed by writing nine asterisks Each output operation utilizes the `sys_write` system call, and the program concludes with a `sys_exit` call to terminate the process The message and the star pattern are defined in the data section, with the length of the message calculated for proper output.

Ngôn ngữ cấp cao (high-level programming language) là ngôn ngữ gần gũi với con người, giúp lập trình viên dễ dàng đọc, hiểu và chỉnh sửa chương trình Với ngôn ngữ cấp cao, việc chuyển đổi ý tưởng và thuật toán thành mã lệnh trở nên đơn giản hơn mà không cần lo lắng về quản lý bộ nhớ hay chi tiết phần cứng như khi lập trình bằng ngôn ngữ cấp thấp Tương tự như hợp ngữ, ngôn ngữ cấp cao cũng cần được biên dịch sang mã máy trước khi thực thi Hiện nay, có nhiều ngôn ngữ cấp cao đã được phát triển, trong đó có những ngôn ngữ lâu đời như C, Pascal, Fortran, Basic và Java.

Ví dụ, một chương trình viết bằng ngôn ngữ cấp cao như sau:

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

Một chương trình là sự kết hợp giữa giải thuật và cách thể hiện giải thuật qua ngôn ngữ lập trình Giải thuật, hay còn gọi là Algorithm, là phương pháp giải quyết vấn đề lập trình và thực hiện các tác vụ cụ thể Nó đóng vai trò cốt lõi trong việc xử lý các vấn đề lập trình và thể hiện ý tưởng của lập trình viên để tối ưu hóa hiệu quả chương trình Cuối cùng, chương trình là tập hợp các miêu tả giải thuật được diễn đạt qua một ngôn ngữ lập trình nhất định.

Lập trình là quá trình tư duy logic để giải quyết vấn đề, trong đó giải thuật đóng vai trò quan trọng Để giải một phương trình bậc 2, lập trình viên cần nắm rõ các bước thực hiện, tức là giải thuật Khi không biết bắt đầu từ đâu, việc viết chương trình trở nên khó khăn Lưu đồ là hình ảnh thể hiện giải thuật, giúp minh họa các bước giải quyết vấn đề Sinh viên mới học lập trình thường bỏ qua việc vẽ lưu đồ để tiết kiệm thời gian, nhưng điều này có thể gây hại khi xây dựng các chương trình phức tạp Việc liệt kê và phân tích ý tưởng cụ thể là cần thiết trước khi viết lưu đồ Nhiều sinh viên viết chương trình trước rồi mới tạo lưu đồ, điều này không đúng với quy trình lập trình Kiểm tra lưu đồ giúp lập trình viên đánh giá và phát hiện lỗi trong chương trình Khi lưu đồ hoàn chỉnh, lập trình chỉ là việc chuyển đổi từ hình khối sang ngôn ngữ lập trình Tính chính xác và logic của chương trình phụ thuộc vào việc xây dựng lưu đồ và giải thuật Nếu lưu đồ chính xác mà chương trình không chạy đúng, giống như viết sai chính tả hay ngữ pháp Tác giả nhấn mạnh rằng sinh viên mới học lập trình cần xây dựng tốt lưu đồ giải thuật và thể hiện ý tưởng qua lưu đồ.

Lưu đồ (Flowchart) là hình thức biểu diễn trực quan các thuật toán và quy trình trong lập trình Nó sử dụng các khối hình quy ước để giúp lập trình viên dễ dàng chuyển đổi ý tưởng thành mã nguồn Khi tạo lưu đồ, các ký hiệu và từ khóa có thể được tùy chỉnh để người đọc, kể cả những người không có kiến thức lập trình, vẫn có thể hiểu Ngôn ngữ thể hiện trong lưu đồ không nhất thiết phải là một ngôn ngữ lập trình cụ thể, mà có thể là một ngôn ngữ thông thường, thường được gọi là code giả (Pseudo code) Một số quy tắc cơ bản khi biểu diễn thuật toán bằng lưu đồ bao gồm việc sử dụng các ký hiệu chuẩn để đảm bảo tính nhất quán và dễ hiểu cho người dùng.

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.1 Lưu đồ cho chương trình cộng 2 số được nhập từ bàn phím

Declare variables num1, num2, and sum

Read num1 and num2 sum ←num1+num2

Trong lưu đồ, điểm bắt đầu và kết thúc được xác định bằng từ khóa "start" và "end" trong hình oval Những từ khóa này có thể thay thế bằng "begin" và "end", "start" và "stop", hoặc bất kỳ ngôn ngữ nào khác chỉ định sự bắt đầu và kết thúc Để biểu diễn tổng của hai số a và b, có thể sử dụng công thức "sum ← num1 + num2" hoặc đơn giản hơn là "sum = num1 + num2".

Ví dụ 1.2 Lưu đồ cho bài toán in ra số lớn nhất trong 3 số được nhập vào từ bàn phím.

Ví dụ 1.3 Lưu đồ cho bài toàn giải phương trình bậc 2: ax 2 + bx + c = 0

Trong các khối quyết định có điều kiện (hình thoi), luôn có hai ngõ ra: một cho trường hợp đúng và một cho trường hợp sai Các từ khóa thể hiện cặp luận lý đúng sai có thể được sử dụng là True/False hoặc Yes/No.

Không quan trọng là sử dụng các ký hiệu như T/F, Y/N, Đ/S hay bất kỳ ngôn ngữ nào khác, miễn là chúng thể hiện đúng ý nghĩa logic của đúng và sai Chương trình máy tính hoạt động theo một quy trình tuần tự, và trong trường hợp xử lý song song, sẽ áp dụng các kỹ thuật khác mà chưa được đề cập ở đây Do đó, từ điểm khởi đầu, chỉ có một con đường duy nhất dẫn đến điểm kết thúc.

Ví dụ 1.4 Hãy giải thích hoạt động của chương trình dựa vào lưu đồ sau đây:

Ví dụ 1.5 Hãy phân tích hoạt động của chương trình dựa vào lưu đồ sau đây:

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

Ngôn ngữ lập trình C, được phát triển bởi Dennis Ritchie tại Bell Laboratories vào năm 1972, vẫn được coi là ngôn ngữ chuẩn và cơ bản cho lập trình máy tính và các thiết bị lập trình như vi xử lý và vi điều khiển C là ngôn ngữ chính để xây dựng hệ điều hành UNIX và đã trở nên phổ biến trong ngành công nghệ Mặc dù hiện nay có nhiều ngôn ngữ lập trình như Java, Python, C++, C#, và Ruby, trong đó nhiều ngôn ngữ như C++ và Objective-C phát triển từ ngôn ngữ C, nhưng cấu trúc và cách vận hành của chúng vẫn có nhiều điểm tương đồng Do đó, việc nắm vững ngôn ngữ C sẽ giúp lập trình viên dễ dàng tiếp cận và học hỏi các ngôn ngữ lập trình khác.

Mặc dù không phải là ngôn ngữ hiện đại, C vẫn được sử dụng rộng rãi trong nhiều lĩnh vực, đặc biệt là lập trình hệ thống và lập trình nhúng trên hệ điều hành Linux Ngôn ngữ C là tiêu chuẩn cho lập trình điều khiển các hệ thống điện tử dân dụng và công nghiệp, cũng như vi xử lý và vi điều khiển Nhiều ngôn ngữ lập trình khác, như Verilog cho thiết kế vi mạch số, Python cho trí tuệ nhân tạo, và Objective-C cho ứng dụng di động trên iOS, có cấu trúc tương tự C Việc nắm vững ngôn ngữ lập trình C sẽ giúp người học tiếp cận các ngôn ngữ lập trình khác một cách nhanh chóng và hiệu quả.

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

Một chương trình C bao gồm hàm, biến và câu lệnh trong cùng một tập tin hoặc nhiều tập tin khác nhau Trong bài viết này, chúng ta sẽ viết, biên dịch và chạy một chương trình C đầu tiên, với chức năng in ra màn hình một dòng chữ cụ thể.

SST dòng lệnh Nội dung chương trình

//bat dau chuong trinh chinh int main (void)

{ printf(“Chao mung den voi C! \n”); getch(); return 0; /* cho biet chuong trinh da ket thuc thanh cong */

} //ket thuc chuong trinh chinh

Sau khi thực thi, chương trình sẽ in ra màn hình dòng chữ Chao mung den voi C!, như ở hình sau:

Chao mung den voi C! Ở dòng lệnh số 1 và số 2, ta có hai câu:

Chương trình C đầu tiên được viết với ký hiệu /* để bắt đầu và */ để kết thúc, thể hiện hai câu chú thích Đây là cách viết chú thích trên nhiều dòng lệnh, giúp giải thích hoặc làm rõ chương trình mà không ảnh hưởng đến quá trình chạy Các câu chú thích sẽ bị bỏ qua khi biên dịch chương trình.

Câu lệnh #include là một lệnh tiền xử lý trong ngôn ngữ C, bắt đầu bằng dấu # và được xử lý trước khi biên dịch chương trình Lệnh này yêu cầu bộ tiền xử lý bao gồm thư viện stdio.h, thư viện tiêu chuẩn cho xuất/nhập dữ liệu trong C Thư viện này chứa thông tin cần thiết cho trình biên dịch khi biên dịch các hàm xuất nhập dữ liệu cơ bản như printf và scanf.

Câu chú thích trong lập trình C được bắt đầu bằng ký hiệu // và tự động kết thúc khi chuyển sang dòng mới Dòng lệnh int main(void) đánh dấu phần chương trình chính, là phần bắt buộc phải có trong mỗi chương trình C Các thông số phía trước và phía sau từ "main" cho biết đây là một hàm (function) trong ngôn ngữ lập trình.

Trong một chương trình C, phải có ít nhất một hàm main, được coi là chương trình chính Từ khóa "int" đứng trước hàm main cho biết rằng hàm này sẽ trả về một giá trị kiểu số nguyên Tham số "void" phía sau hàm main chỉ ra rằng hàm này không cần nhận bất kỳ thông tin đầu vào nào Nội dung này sẽ được giải thích chi tiết hơn trong chương về Hàm.

Dấu mở ngoặc { ở dòng lệnh số 7 đánh dấu vị trí bắt đầu của hàm main, trong khi dấu đóng ngoặc } ở dòng 13 đánh dấu vị trí kết thúc của hàm này Phần giữa cặp dấu ngoặc { } được gọi là một khối lệnh Ở dòng lệnh số 8, câu lệnh printf(“Chao mung den voi C! \n”); in ra màn hình chuỗi ký tự "Chao mung den voi C!" Mỗi câu lệnh trong C phải kết thúc bằng dấu chấm phẩy (;) Dòng lệnh số 9, getch();, chờ người dùng nhập một ký tự từ bàn phím, nhằm dừng chương trình Để sử dụng lệnh getch();, cần khai báo thư viện #include ở dòng lệnh số 4 Cuối cùng, dòng lệnh số 10, return 0; /* cho biet chuong trinh da ket thuc thanh cong */, kết thúc hàm main và trả về giá trị 0, cho biết chương trình đã kết thúc thành công.

Như vậy, tới đây, ta có thể thấy cấu trúc chung của một chương trình C về cơ bản sẽ là:

#include int main (void) {

//Nội dung chương trình chính return 0;

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

Chúng ta sẽ xây dựng một chương trình C để nhập hai số nguyên từ bàn phím, tính tổng hai số này và in kết quả ra màn hình Chương trình sẽ được trình bày như hình dưới đây.

#include int main (void)

Đoạn mã trên thực hiện các bước sau: Đầu tiên, khai báo ba biến `a`, `b`, và `tong` để lưu trữ hai số nguyên và kết quả tổng Sau đó, chương trình yêu cầu người dùng nhập số thứ nhất và số thứ hai từ bàn phím Sau khi nhận được hai số, chương trình tính tổng của chúng và in ra kết quả Cuối cùng, hàm `getch()` được sử dụng để dừng chương trình cho đến khi người dùng nhấn một phím bất kỳ, trước khi kết thúc.

Kết quả sau khi thực thi chương trình như sau:

Trong đó, giá trị số 5 và 7 ở dòng kết quả thứ 2 và dòng kế quả thứ

4 là giá trị dữ liệu do người dùng nhập vào từ bàn phím.

Trong chương trình, hai thư viện stdio.h và conio.h được khai báo ở dòng lệnh 1 và 2 Dòng lệnh 4 đánh dấu bắt đầu chương trình chính, với dấu mở ngoặc ở dòng 5 và dấu đóng ngoặc ở dòng 21 để kết thúc nội dung chương trình Các biến a, b và tong được khai báo ở dòng 6, 7 và 8 với kiểu dữ liệu int, cho phép lưu trữ các giá trị số nguyên Câu lệnh printf ở dòng 10 in ra thông báo "Nhap so thu nhat :", trong khi câu lệnh scanf ở dòng 11 cho phép người dùng nhập một số nguyên từ bàn phím và lưu vào biến a.

&a Tham số đầu tiên “%d” được gọi là mã định dạng, cho biết kiểu dữ liệu của dữ liệu mà người dùng sẽ nhập vào Trong trường hợp này,

Mã định dạng “%d” được sử dụng để biểu diễn kiểu số nguyên Trong tham số thứ hai (&a), dấu & là toán tử lấy địa chỉ, cho phép xác định vị trí của biến a trong bộ nhớ RAM.

Câu lệnh scanf(“%d”,&b); ở dòng 14 cho phép người dùng nhập một số nguyên từ bàn phím và lưu vào biến b Tiếp theo, ở dòng 16, câu lệnh tong = a + b; thực hiện tính tổng của hai biến a và b bằng phép toán cộng +, và lưu kết quả vào biến tong thông qua phép toán gán =.

Câu lệnh printf ở dòng 17 hiển thị kết quả bằng cách in ra màn hình dòng chữ "Tổng là: " kèm theo giá trị của biến tong Hàm printf nhận hai tham số, trong đó tham số đầu tiên là chuỗi định dạng và tham số thứ hai là giá trị cần in.

%d \n” và tong Tham số đầu tiên “Tong la: %d \n” là chuỗi định dạng gồm chuỗi ký tự cần in ra màn hình Tong la: , mã định dạng

Một số nguyên sẽ được in ra cùng với ký tự điều khiển \n để đưa con trỏ xuống dòng Tham số thứ hai, tong, sẽ xác định giá trị dữ liệu cần in ra.

Câu lệnh getch(); ở dòng 19 cho phép người dùng nhập một ký tự bất kỳ từ bàn phím Để sử dụng hàm getch(), cần khai báo thư viện conio.h ở dòng lệnh số 2.

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

Trước khi một chương trình được thực thi, nó cần trải qua bốn bước quan trọng Các chương trình được viết và lưu dưới dạng tập tin văn bản với phần mở rộng c cho ngôn ngữ C và cpp cho ngôn ngữ C++ Tập tin đầu (header) thường có phần mở rộng h, chứa các khai báo hàm hoặc định nghĩa (define) cần thiết cho chương trình.

Quá trình tiền xử lý là bước đầu tiên trong biên dịch, nơi các tập tin chương trình loại bỏ các phần chú thích và xử lý các chỉ thị sau dấu #, bao gồm khai báo thư viện và định nghĩa.

 Compilation – biên dịch: Chương trình được biên dịch sang mã hợp ngữ (assembly code).

 Asembly – hợp dịch: Các mã hợp ngữ được biên dịch sang mã máy (machine-code).

Quá trình liên kết là bước quan trọng trong lập trình, nơi trình liên kết tổng hợp các hàm từ các thư viện hoặc mã nguồn khác để tạo ra một tập tin mã nguồn có khả năng thực thi Tập tin cuối cùng, có phần mở rộng exe, chứa mã nhị phân cần thiết để thực hiện chương trình.

Hình 1.2 Các bước biên dịch chương trình C

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

Trong câu lệnh khai báo biến "int a;", từ khóa "int" chỉ định kiểu dữ liệu, trong khi "a" là tên gọi được đặt cho biến, hay còn gọi là identifier.

Keywords in the C programming language are predefined terms with fixed meanings that users cannot alter These keywords serve specific functions within the code and include terms such as auto, double, int, struct, break, else, long, switch, case, enum, register, typedef, char, extern, return, union, const, float, short, unsigned, continue, for, signed, void, default, goto, sizeof, volatile, do, if, static, and while.

Bảng 1.1 Các từ khóa trong C

Tên gọi trong lập trình C là những từ được quy ước để xác định các thành phần như biến, hằng và hàm Khi đặt tên, cần tuân thủ quy tắc không sử dụng từ khóa đã được định nghĩa trong ngôn ngữ lập trình.

+ Tên gọi chỉ bao gồm: ký số 0 - 9, chữ cái thường a – z, chữ cái hoa A – Z, dấu gạch dưới _

+ Tên gọi không được bắt đầu bằng số.

+ Tên gọi có phân biệt chữ thường và chữ viết hoa.

Ví dụ một số tên gọi hợp lệ như:

Tên gọi hợp lệ a bien1 bien_1 thamSoThuNhat

Các tên gọi không tuân thủ quy ước sẽ được coi là không hợp lệ Ví dụ, những tên gọi sau đây là không hợp lệ:

Tên gọi không hợp lệ

Sai sót trong việc đặt tên biến có thể xảy ra do nhiều nguyên nhân, chẳng hạn như bắt đầu bằng số, trùng với từ khóa đã định nghĩa, chứa ký tự không hợp lệ như '@', hoặc tham số đầu tiên chứa khoảng trắng.

Trong lập trình, các ngôn ngữ không cho phép sử dụng tên gọi trùng với từ khóa Đối với ngôn ngữ C, tất cả các từ khóa được viết bằng ký tự thường, do đó, để tránh trùng lặp, người lập trình có thể sử dụng ký tự in hoa cho tên gọi Ví dụ, tên biến "enum" là không hợp lệ do trùng với từ khóa, trong khi "Enum" hoàn toàn hợp lệ vì không trùng lặp.

BIẾN

Biến là vùng nhớ trong RAM dùng để lưu trữ dữ liệu trong quá trình xử lý chương trình Để tạo ra một biến, cần khai báo biến bằng câu lệnh như "int a;", trong đó "a" là tên biến và "int" là kiểu dữ liệu số nguyên Khi khai báo, chương trình sẽ tạo ra một vùng nhớ cho biến "a" với giá trị ban đầu là ngẫu nhiên Để quản lý giá trị này, ta có thể khởi tạo giá trị ngay tại thời điểm khai báo.

Ví dụ, câu lệnh int a = 0; sẽ tạo ra vùng nhớ cho biến a và khởi tạo giá trị ban đầu là số

Như vậy, cú pháp chung của câu lệnh khai báo biến trong C sẽ là:

TênKiểuDữLiệu tênBiến = giá trị khởi tạo;

Bạn có thể khai báo nhiều biến cùng kiểu dữ liệu trong một câu lệnh duy nhất, ví dụ như int a, b, tong; để tạo ra ba biến a, b, tong có kiểu số nguyên, thay vì sử dụng ba câu lệnh khai báo riêng biệt như: int a; int b; int tong;

Mỗi biến trong lập trình C được xem như một vùng nhớ độc lập với định dạng dữ liệu cụ thể, được xác định bởi kiểu dữ liệu khi khai báo Kiểu dữ liệu không chỉ quy định định dạng mà còn xác định kích thước vùng nhớ cho biến Dưới đây là bảng liệt kê một số kiểu dữ liệu cơ bản trong C.

Kích thước vùng nhớ biến Định dạng dữ liệu Ví dụ char 1 byte

Kiểu ký tự A unsigned char 1 byte b int 2 byte hoặc 4 byte

-3569 +137 unsigned int 2 byte hoặc 4 byte 23052 short 2 byte +423

-7 unsigned short 2 byte 153 long 4 byte -2456783

+4539847 unsigned long 4 byte 345231 float 4 byte

5.6 double 8 byte 245.78 long double 10 byte 3.1

Bảng 1.2 Các kiểu dữ liệu trong C

Trong một số ngôn ngữ lập trình hiện đại, biến có thể được khai báo ở bất kỳ vị trí nào trong chương trình hoặc thậm chí không cần khai báo trước Tuy nhiên, ngôn ngữ lập trình C yêu cầu biến phải được khai báo trước khi sử dụng và thường ở đầu chương trình Biến có thể được khai báo trong chương trình chính, chương trình con, hoặc bên ngoài chúng, dẫn đến sự khác biệt về phạm vi hoạt động của biến Dựa vào phạm vi hoạt động, biến được chia thành hai loại cơ bản.

Biến toàn cục (global) là những biến được khai báo bên ngoài các hàm và có thể được truy cập từ bất kỳ hàm nào trong cùng một tệp chương trình Ví dụ, trong chương trình file1.c, các biến toàn cục cho phép chia sẻ dữ liệu giữa các hàm một cách dễ dàng.

#include int a,b,tong,hieu ; void tinhhieu(){ hieu = a - b; //tinh hieu printf(“Hieu la: %d \n”,hieu);

Đoạn mã trên hướng dẫn người dùng nhập hai số nguyên từ bàn phím, sau đó tính tổng của chúng và in kết quả ra màn hình Cụ thể, đầu tiên, chương trình yêu cầu nhập số thứ nhất và số thứ hai, rồi thực hiện phép cộng và hiển thị tổng Cuối cùng, nó chờ người dùng nhấn một phím bất kỳ trước khi kết thúc chương trình.

Trong chương trình, biến a và b được khai báo bên ngoài với đặc tính là biến chung, cho phép hàm main nhập giá trị cho chúng Trong hàm con tinhhieu(), giá trị của a và b được sử dụng và cập nhật từ hàm main Các biến cục bộ có thể được truy xuất và thay đổi bởi các câu lệnh trong bất kỳ hàm nào Trong ngôn ngữ lập trình C, các biến không có thuộc tính truy cập, do đó quyền truy cập vào các biến chung là như nhau.

Biến cục bộ hay biến địa phương là các biến được khai báo bên trong các hàm, bao gồm cả hàm main Phạm vi hoạt động của chúng chỉ giới hạn trong các hàm mà chúng được định nghĩa Điều này có nghĩa là các hàm không thể truy cập vào các biến cục bộ của các hàm khác.

Ví dụ, biến cục bộ được khai báo và sử dụng như sau:

#include void tinhhieu(){ int a,b,hieu ; hieu = a - b; //tinh hieu printf(“Hieu la: %d \n”,hieu);

Đoạn mã trên yêu cầu người dùng nhập hai số nguyên, sau đó tính tổng của chúng và in kết quả ra màn hình Cụ thể, chương trình sử dụng hàm `printf` để hiển thị thông báo nhập số, và hàm `scanf` để nhận dữ liệu từ bàn phím Kết quả tổng được tính và in ra bằng `printf` Cuối cùng, chương trình dừng lại chờ người dùng nhấn phím bất kỳ trước khi kết thúc.

Hàm main khai báo 2 biến cục bộ, a và b, và tiến hành nhập giá trị cho 2 biến Biến tổng được cập nhật giá trị là tổng của a và b tại dòng

15 Sau khi in tổng, hàm tinhhieu() được gọi Trong hàm tinhhieu(), 2 biến a và b lại được khai báo Các biến trong hàm main() có thể có cùng tên với các biến trong hàm tinhhieu() Trong hàm main() có 2 biến a và b, trong hàm tinhhieu() cũng có 2 biến a và b Biến a và b trong hàm main() khác với biến a và b trong hàm tinhieu() mặc dù chúng được đặt cùng một tên nhưng do chúng là các biến nội bộ Như vậy, trong hàm tinhhieu(), giá trị của a và b chưa được nhập nên chương trình sẽ lấy giá trị ngẫu nhiên cho

Trong hàm tinhhieu(), có hai biến a và b Để cập nhật giá trị của a và b được nhập từ hàm main, có nhiều phương pháp có thể được sử dụng, và các phương pháp này sẽ được trình bày trong các chương tiếp theo.

HẰNG SỐ

Hằng số, giống như biến, là một vùng nhớ trong bộ nhớ RAM dùng để lưu trữ dữ liệu Tuy nhiên, giá trị của hằng số chỉ được khởi tạo một lần và không thể thay đổi trong suốt quá trình thực thi chương trình.

Hằng số cần được khai báo và khởi tạo giá trị trước khi sử dụng, với cú pháp như sau: const float PI = 3.14; trong đó, từ khóa const là bắt buộc, float là kiểu dữ liệu, PI là tên hằng số và 3.14 là giá trị khởi tạo Sau khi khai báo, chương trình sẽ tạo ra một ô nhớ kiểu float cho hằng PI với giá trị 3.14 được lưu trữ trong đó.

Giá trị khởi tạo của hằng PI là 3.14, một giá trị cố định không thể thay đổi Nếu người dùng cố gắng thay đổi giá trị này, chương trình sẽ thông báo lỗi.

PI = 4.5; //cau lenh gay ra loi sẽ gây ra lỗi vì giá trị đã khởi tạo của hằng PI là cố định (3.14) và không được phép thay đổi.

Sau khi khai báo, hằng số PI có thể được sử dụng trong các lệnh khác trong chương trình Ví dụ, để tính chu vi của một hình tròn có đường kính 5cm, đoạn lệnh có thể được viết như sau:

Ngôn ngữ C hỗ trợ nhiều hệ thống số trong lập trình máy tính, bao gồm số thực và số nguyên Các số nguyên có thể được biểu diễn trong các hệ thống như nhị phân, bát phân, thập phân và thập lục phân Quy ước về cách biểu diễn các hằng số trong các hệ thống số này rất quan trọng để lập trình viên có thể làm việc hiệu quả.

Hệ thống số Cơ số

Ký tự sử dụng biểu diễn số Ví dụ: (giá trị 240 hệ thập phân)

Biểu diễn trong ngôn ngữ C

Hệ thập lục phân 16 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f (F0) 16 int a = 0xF0

CÁC PHÉP TOÁN TRONG C

Ngôn ngữ lập trình C cung cấp đa dạng các phép toán để đáp ứng nhu cầu lập trình của người dùng Các loại phép toán trong C bao gồm phép toán số học, phép toán quan hệ, phép toán luận lý và phép toán thao tác trên bit nhị phân.

 Các phép toán số học bao gồm các phép toán cộng, trừ, nhân, chia,… được liệt kê trong bảng bên dưới.

Ký hiệu trong ngôn ngữ C Ý nghĩa Ví dụ

Bảng 1.3 Các phép toán số học trong ngôn ngữ C

Ví dụ để thực hiện phép toán: c b x y = a + thì câu lệnh được viết trong ngôn ngữ C tương ứng sẽ là: y = (a/b)*x + c;

Lưu ý với các phép toán, thứ tự ưu tiên sẽ là:

1 Các phép toán trong cặp dấu ngoặc đơn ( ) Nếu có nhiều cặp ngoặc đơn lồng vào nhau thì ưu tiên từ trong ra ngoài.

2 Phép nhân, phép chia và phép chia lấy phần dư Nếu có nhiều phép nhân, chia, chia lấy phần dư ngang hàng nhau thì sẽ thực thi từ trái sang phải.

3 Phép cộng và phép trừ Nếu có nhiều phép cộng và phép trừ ngang hàng nhau thì sẽ thực thi từ trái sang phải.

Khi thực hiện phép chia trong lập trình, nếu cả số chia và số bị chia đều là kiểu dữ liệu số nguyên, kết quả sẽ là số nguyên Ngược lại, nếu một trong hai số là kiểu dữ liệu số thực, kết quả sẽ là số thực Ví dụ, trong đoạn lệnh `int a = 5, b = 2; float c = a/b;`, biến c sẽ nhận giá trị 2.0 do phép chia a/b cho kết quả là số nguyên.

Nhưng khi thực thi các lệnh int a = 5; float b = 2; float c = a/b; thì giá trị của biến c là 2.5 vì phép chia a/b sẽ cho kết quả là số thực.

Các phép toán quan hệ được sử dụng để so sánh giá trị của các toán hạng, khác với các phép toán số học, nơi toán tử bên trái được cập nhật giá trị Kết quả của các phép toán quan hệ là giá trị luận lý, tức là đúng hoặc sai Các phép toán này bao gồm các phép toán so sánh như lớn hơn, nhỏ hơn, bằng, khác, lớn hơn hoặc bằng, và nhỏ hơn hoặc bằng.

Ký hiệu trong ngôn ngữ C Ý nghĩa Ví dụ

>= So sánh lớn hơn hoặc bằng a >= b

b) không gán giá trị cho biến nào, nhưng nó trả về kết quả luận lý đúng (true), tạo điều kiện cho câu lệnh if được thực hiện.

Các phép toán luận lý là công cụ quan trọng giúp kết nối và xây dựng các biểu thức luận lý từ các phép toán quan hệ Có ba phép toán luận lý cơ bản, bao gồm AND, OR và NOT, mỗi phép toán đều có vai trò riêng trong việc xác định mối quan hệ giữa các giá trị.

Ký hiệu trong ngôn ngữ C Ý nghĩa Ví dụ

Bảng 1.5 Các phép toán luận lý trong ngôn ngữ C

Kết quả luận lý của các phép toán luận lý cũng trả về kết quả là đúng (true) hay sai (false).

False False False False True

False True False True True

True False False True False

True True True True False

Ví dụ, xét kết quả trả về của phép toán luận lý sau: int a = 3, b=2, c=4; if ((a>b)&&(c==0)) {…}

Biểu thức luận lý ((a>b)&&(c==0)) kết hợp hai biểu thức quan hệ: (a>b) và (c==0) Trong đó, biểu thức (a>b) trả về kết quả đúng (true), trong khi (c==0) lại trả về kết quả sai (false) Do đó, kết quả của biểu thức luận lý ((a>b)&&(c==0)) là sai (false).

Các phép toán bit-wise là những phép toán thao tác trực tiếp trên từng bit riêng lẻ, mang lại nhiều lợi ích cho lập trình viên trong các lĩnh vực như lập trình vi xử lý, vi điều khiển và hệ thống nhúng Các toán tử này giúp tối ưu hóa hiệu suất và kiểm soát chính xác các thông số trong lập trình điều khiển.

Ký hiệu trong ngôn ngữ C Ý nghĩa

Bảng 1.6 Các phép toán bit-wise trong ngôn ngữ C

Các phép toán bit-wise tương tự như phép toán số học, trong đó toán hạng bên trái được cập nhật trong khi toán hạng bên phải không thay đổi Ví dụ, với unsigned char a = 0b00001111 và b = 0x11101000, khi thực hiện phép toán c = a & b, kết quả sẽ là c = 0b00001000, thể hiện phép AND từng bit giữa hai thanh ghi.

Xét câu lệnh sau: c= a>>2; trong câu lệnh trên, giá trị của c là giá trị của a dịch đi bên phải

Giá trị của a không thay đổi sau hai lần thao tác, dẫn đến c được gán giá trị 0b00000011 Khi thực hiện dịch chuyển sang trái hoặc phải với các số nguyên không dấu, số 0 sẽ được thêm vào tại các vị trí bit còn thiếu.

Ký hiệu trong ngôn ngữ C Ý nghĩa Ví dụ

? Toán tử điều kiện max= (a>b)?a:b;

Bảng 1.7 Các phép toán khác trong ngôn ngữ C

Trong lập trình, các phép toán tăng 1 đơn vị (++) và giảm 1 đơn vị (– –) rất thông dụng và thường được sử dụng Những phép toán này có thể kết hợp với các phép toán khác để tiết kiệm số dòng lệnh Đặc biệt, vị trí của phép tăng và giảm trước hoặc sau biến sẽ tạo ra tác dụng khác nhau.

Ví dụ: int a = 6, b = 7 ; a++ ; giá trị a được khởi tạo là 6, lệnh a++ sẽ cập nhật giá trị a bằng cách tăng a lên 1 đơn vị Lệnh a++ tương đương với lệnh a = a+1.

Một ví dụ khác: int a = 6, b = 7, c ; c = a++ +b ;

Khi sử dụng phép tăng và giảm với các toán tử khác, cần chú ý vị trí của phép tăng, có thể đặt trước hoặc sau toán hạng Ví dụ, câu lệnh c = a++ + b tương đương với hai câu lệnh c = a + b và a = a + 1, nghĩa là phép tăng thực hiện sau phép cộng Ngược lại, nếu câu lệnh là c = ++a + b, thì hai câu lệnh tương đương sẽ là a = a + 1 và c = a + b, trong đó phép tăng được thực hiện trước phép cộng Do đó, kết quả cuối cùng của hai trường hợp này là khác nhau.

Toán tử điều kiện (?) là một công cụ quan trọng trong lập trình, thường được sử dụng trong các phát biểu điều kiện Việc áp dụng toán tử này giúp viết câu lệnh ngắn gọn và hiệu quả hơn Cú pháp của toán tử điều kiện được trình bày như sau:

Toán hạng = biểu thức ? giá trị 1: giá trị 2

Nếu biểu thức trả về true, giá trị 1 sẽ được gán cho toán hạng bên trái; nếu không, giá trị 2 sẽ được gán cho toán hạng bên trái.

Ví dụ sau sẽ tìm và gán giá trị lớn nhất cho biến max giữa 2 biến a và b: int a = 6, b = 7, max ; max = (a>b)?a:b ;

Toán tử điều kiện được xem là tương đương một phát biểu điều kiện (if… else…).

Cuối cùng, chúng ta có các phép toán mở rộng, là cách viết rút gọn cho các toán tử khi có chung một toán hạng Chẳng hạn, trong câu lệnh a = a + b; toán hạng a được cập nhật bằng cách cộng nó với b Ta có thể lược bỏ a bên phải dấu "=" và di chuyển phép "+" lên trước, từ đó rút gọn thành a += b;

XUẤT NHẬP DỮ LIỆU

Trong chương trình cộng hai số nguyên, chúng ta sử dụng câu lệnh scanf(“%d”,&a) để nhập dữ liệu từ bàn phím Hàm scanf cho phép người dùng nhập một số nguyên và lưu trữ giá trị đó vào biến a Hàm này có hai tham số: “%d” và địa chỉ của biến a.

&a, với “%d” là mã định dạng kiểu số nguyên cho dữ liệu nhận vào và

& là toán tử xác định địa chỉ của biến để lưu dữ liệu.

Cú pháp chung của hàm nhập dữ liệu trong ngôn ngữ lập trình C là: scanf(“mãĐịnhDạng”,&biếnLưuDữLiệu); Trong đó, mãĐịnhDạng là mã định dạng dữ liệu giúp xác định kiểu dữ liệu cho dữ liệu được nhập vào Một số mã định dạng phổ biến bao gồm các loại như số nguyên, số thực và ký tự.

%d mã định dạng kiểu số nguyên hệ thập phân

%f mã định dạng kiểu số thực

%c mã định dạng kiểu ký tự

%s mã định dạng kiểu chuỗi nhiều ký tự

Trong ví dụ cho phép nhập 3 số liên tiếp và lưu vào 3 biến a, b, c, câu lệnh sử dụng scanf(“%d%d%d”,&a,&b,&c) cho phép chương trình dừng lại và chờ nhập 3 giá trị số nguyên Các biến được tham chiếu thông qua địa chỉ và cách nhau bởi dấu “,” Tuy nhiên, trường hợp sử dụng scanf(“%d,%d,%d”,&a,&b,&c) là không hợp lệ vì các dấu “,” trong chuỗi định dạng không được phép Các ký tự định dạng luôn bắt đầu bằng từ khóa “%” và được liệt kê trong bảng quy định.

Trong chương trình cộng hai số, câu lệnh printf(“Tong la: %d \n”,tong); được sử dụng để in kết quả ra màn hình Hàm printf có hai tham số: chuỗi định dạng “Tong la: %d \n” và giá trị tong Chuỗi định dạng bao gồm phần văn bản “Tong la: ”, mã định dạng %d để chỉ định rằng sẽ có một số nguyên được in ra, và ký tự điều khiển \n để xuống dòng Tham số tong sẽ chứa giá trị dữ liệu cần in ra.

Vậy cú pháp chung của hàm in dữ liệu ra màn hình là: printf (“chuỗiĐịnhDạng”, biếnCầnIn); trong đó:

 biếnCầnIn là biến chứa dữ liệu cần in ra màn hình.

+ chuỗi ký tự thông thường.

+ mã định dạng (%d, %f, %c, %s, ) dùng để định dạng dữ liệu cho biếnCầnIn.

Lưu ý là để trình biên dịch có thể biên dịch được hàm scanf và printf, ta cần khai báo thư viện stdio.h bằng câu lệnh

#include ở đầu chương trình.

Danh sách các mã định dạng dữ liệu cho biến được liệt kê trong bảng sau:

%d hoặc %i Kiểu số nguyên hệ thập phân

%o Kiểu số nguyên hệ bát phân

%u Kiểu số nguyên không dấu hệ thập phân

%x Kiểu số nguyên hệ thập lục phân không dấu

BÀI TẬP

1 Hãy tìm và sửa lỗi trong các câu lệnh/đoạn lệnh sau: a scanf(“Nhap gia tri: %d”,a); b int a; scanf(a); c printf(“Gia tri bien a: %d”, &a); d int a = 5; printf(a); e 5 = a; f float b = 3.5; printf(“Gia tri b: %d\n”, b); g #include int a; printf(“Nhap a: “); scanf(“%d”,&a); printf(“So da nhap: %d\n”,a); h #include int main(void) printf(“Xin chao!”); return 0;

2 Hãy phân tích chương trình sau và cho biết chương trình thực hiện chức năng gì?

#include int main (void)

{ int a,b; printf (“Nhap a:”); scanf(“%d”, &a); printf (“Nhap b:”); scanf(“%d”, &b); printf (“ket qua 1: %d , ket qua 2: %d”, a+b, a - b); getch(); return 0;

3 Cho biết kết quả khi thực thi chương trình sau:

#include int main(void)

{ int a = 10, b = 100; float c = 10.5, d = 100.5; printf(“++a = %d \n”, ++a); // Kết quả in: printf(“ b = %d \n”, b); // Kết quả in: printf(“++c = %f \n”, ++c); // Kết quả in: printf(“ d = %f \n”, d); // Kết quả in: return 0;

4 Cho biết kết quả khi thực thi chương trình sau:

#include int main(void)

{ int a = 5, c; c = a; printf(“c = %d\n”, c); // Kết quả in: c += a; printf(“c = %d\n”, c); // Kết quả in: c -= a; printf(“c = %d\n”, c); // Kết quả in: c *= a; printf(“c = %d\n”, c); // Kết quả in: c /= a; printf(“c = %d\n”, c); // Kết quả in: c %= a; printf(“c = %d\n”, c); // Kết quả in: return 0;

5 Vẽ lưu đồ giải thuật và viết chương trình: nhập vào 2 số nguyên từ bàn phím và in ra tổng, hiệu, tích, thương của 2 số đó.

6 Vẽ lưu đồ giải thuật cho bài toán: nhập vào 1 số nguyên và kiểm tra xem số vừa nhập có phải là số nguyên tố hay không.

7 Vẽ lưu đồ giải thuật và viết chương trình cho bài toán nhập vào

4 số nguyên, in ra màn hình số lớn nhất, số bé nhất trong các số đã nhập.

LỆNH RẼ NHÁNH CÓ ĐIỀU KIỆN

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

Phần đầu tiên ta sẽ tìm hiểu về lệnh đơn và lệnh phức (hay khối lệnh).

Lệnh đơn là một câu lệnh không chứa các câu lệnh khác bên trong nó và kết thúc bằng một dấu chấm phẩy (;).

3 int x=5; //một câu lệnh đơn x++; //một câu lệnh đơn printf(“Giá trị x là: %d”,x); //một câu lệnh đơn

Lệnh phức hay khối lệnh là một tập hợp nhiều lệnh đơn được đặt trong cặp dấu ngoặc móc { và }.

{ char ten[30]; printf(“\n Nhap vao ten cua ban:”); scanf(“%s”, ten); printf(“\n Chao Ban %s”,ten);

Nếu một biến được khai báo bên ngoài khối lệnh và không trùng tên với biến bên trong khối lệnh, thì biến đó vẫn có thể được sử dụng trong khối lệnh.

Một khối lệnh có khả năng sử dụng các biến được khai báo bên ngoài, trong khi các lệnh bên ngoài không thể truy cập vào các biến được khai báo bên trong khối lệnh đó.

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

Một chương trình trong ngôn ngữ lập trình là tập hợp nhiều câu lệnh, thường được thực hiện theo thứ tự từ trên xuống dưới, bắt đầu từ lệnh đầu tiên trong hàm main Tuy nhiên, thực tế cho thấy rằng chương trình có thể thực thi theo cách phức tạp hơn, chẳng hạn như thực hiện một câu lệnh hoặc khối lệnh chỉ khi một điều kiện nhất định đúng, trong khi nếu điều kiện sai, nó sẽ bị bỏ qua Điều này cho phép xuất hiện khả năng lựa chọn giữa các nhánh khác nhau Bên cạnh đó, một chức năng có thể cần lặp lại nhiều lần trong quá trình thực thi.

Một ngôn ngữ lập trình có cấu trúc cần có các yếu tố để điều khiển trình tự thực hiện lệnh trong chương trình, được gọi là các cấu trúc, toán tử điều khiển hay lệnh điều khiển Có hai dạng cấu trúc chính: cấu trúc tuần tự và cấu trúc điều kiện.

2.2.1 Cấu trúc tuần tự Đây là cấu trúc đơn giản nhất của các ngôn ngữ lập trình, điều khiển thực hiện tuần tự các lệnh trong chương trình (bắt đầu từ các lệnh trong thân hàm main) theo thứ tự từ trên xuống dưới (nếu không có điều khiển nào khác).

Ví dụ 2.3: Chương trình nhập năm sinh của một người từ bàn phím, sau đó in ra lời chào và tuổi của người đó.

#include int main(void)

{ int namsinh; printf(“Nhap nam sinh cua ban : “); scanf(“%d”, &namsinh); printf(“\nChao ban! Tinh den nam 2020,tuoi ban là %4d tuoi”,2020-namsinh); getch(); return 0;

Chương trình nhập ba số thực a, b, c từ bàn phím đại diện cho ba cạnh của một tam giác Sau khi nhập, chương trình sẽ tính toán chu vi và diện tích của tam giác dựa trên các cạnh đã nhập Kết quả sẽ được in ra màn hình cho người dùng.

Dữ liệu vào : a, b, c kiểu float là 3 cạnh một tam giác

Chu vi p = (a+b+c), diện tích s = sqrt(q*(q-a)*(q-b)*(q-c)) với q

= p/2 và sqrt là hàm tính căn bậc 2.

Chúng ta có chương trình được viết như sau:

#include int main(void)

{ float a,b,c, p,q,s; printf(“Nhap so do 3 canh cua tam giac “); printf(“\na = “); scanf(“%f”, &a); printf(“\nb = “); scanf(“%f”, &b); printf(“\nc = “); scanf(“%f”, &c);

19 printf(“\nc = “); scanf(“%f”, &c); p = a+b+c; q = p/2; s = sqrt(q*(q-a)*(q-b)*(q-c)); printf(“\nChu vi la %5.1f, dien tich la %5.2f “,p,s); getch(); return 0;

Kết quả thực hiện chương trình:

Nhap so do 3 canh cua tam giac a = 3 ↵ b = 4 ↵ c = 5 ↵

Chu vi la 12.0, dien tich la 6.00

 Trong chương trình ví dụ trên chúng ta sử dụng hàm tính căn bậc 2: sqrt, hàm này được khai báo trong thư viện math.h.

 Chương trình trên chưa xử lý trường hợp a, b, c không hợp lệ (ba số a, b, c có thể không thoả mãn là 3 cạnh một tam giác).

Trong ví dụ 2.4, chúng ta cần xem xét trường hợp khi dữ liệu nhập vào không hợp lệ, cụ thể là khi ba số a, b, c không thỏa mãn điều kiện là độ dài ba cạnh của một tam giác Dù chương trình vẫn thực hiện tính toán và in ra diện tích, nhưng điều này có thể dẫn đến kết quả không chính xác hoặc không có ý nghĩa Việc kiểm tra tính hợp lệ của dữ liệu đầu vào là rất quan trọng để đảm bảo tính chính xác của kết quả.

Rõ ràng là có hai khả năng:

 Nếu a, b, c thoả mãn là 3 cạnh tam giác thì có thể tính chu vi, diện tích và in kết quả.

Trong lập trình, việc thông báo dữ liệu không phù hợp là cần thiết Để xử lý tình huống này, chúng ta phải lựa chọn giữa hai nhánh, tùy thuộc vào việc các điều kiện a, b, c có tạo thành ba cạnh của một tam giác hay không Quá trình này được gọi là rẽ nhánh Ngôn ngữ C cung cấp hai cú pháp điều khiển rẽ nhánh chính là lệnh rẽ nhánh if và lệnh rẽ nhánh switch… case.

LỆNH RẼ NHÁNH IF

Câu lệnh if cho phép lựa chọn một trong các nhánh tùy thuộc vào giá trị của các biểu thức luận lý là đúng (true) hay sai (false).

Lệnh if thiếu là một cấu trúc điều kiện trong lập trình, nơi khối lệnh sẽ được thực hiện khi biểu thức trả về giá trị đúng (true), và ngược lại, khối lệnh sẽ không được thực hiện nếu biểu thức là sai (false).

 Cú pháp if (biểu thức)

Hình 2.1 Lưu đồ giải thuật của lệnh if thiếu

 Giải thích hoạt động

Kết quả của biểu thức luận lý sẽ là đúng (khác 0) hoặc sai

Nếu biểu thức luận lý là đúng thì thực hiện khối lệnh và thoát khỏi if, ngược lại thì không làm gì cả và thoát khỏi if.

Từ khóa if phải viết bằng chữ thường.

Không nên đặt dấu chấm phẩy sau câu lệnh if, ví dụ: if (biểu thức luận lý); Mặc dù trình biên dịch không báo lỗi, nhưng khối lệnh sẽ không được thực hiện, bất kể biểu thức luận lý đúng hay sai.

 Các ví dụ minh họa

Ví dụ 2.5: Cho chương trình sau:

#include int main(void)

} printf(“Gia tri cua a la %d cua b la %d”,a,b); getch(); return 0;

Khi chạy chương trình, kết quả in ra màn hình sẽ là:

Gia tri cua a la 11 cua b la 7

Giải thích hoạt động của chương trình:

Trong chương trình, dòng lệnh đầu tiên khai báo thư viện stdio.h, và dòng lệnh thứ hai đánh dấu chương trình chính Dấu mở ngoặc ở dòng 3 bắt đầu nội dung chương trình, trong khi dấu đóng ngoặc ở dòng 13 kết thúc nó Dòng 4 khai báo các biến a, b, c kiểu int và gán giá trị ban đầu Dòng 5 chứa lệnh if (c > a), kiểm tra điều kiện c > a với c = 7 và a = 5, dẫn đến việc thực hiện khối lệnh từ dòng 6 đến dòng 9 do điều kiện đúng.

Như vậy các dòng 7 và 8 các giá trị a và b sẽ được thực hiện theo phép toán

Dòng 10 sẽ in giá trị a, b vừa tính dòng 7 và 8 Ở đây, kết quả a là

11 và b là 7, như vậy thực sự khối lệnh từ dòng 6 đến dòng 9 đã được thực hiện.

Như vậy trong ví dụ này, biểu thức luận lý trong câu lệnh if là đúng (khác 0) và khối lệnh được thực hiện

Ta xét tiếp một ví dụ khác liên quan đến lệnh if sau đây:

Ví dụ 2.6: So sánh sự khác nhau của ví dụ 2.6 này và ví dụ 2.5 ở phía trên:

#include int main(void)

} printf(“Gia tri cua a la %d cua b la %d”,a,b); getch(); return 0;

Khi chạy chương trình, kết quả in ra màn hình sẽ là:

Gia tri cua a la 5 cua b la 6

Giải thích hoạt động của chương trình:

Chương trình trong ví dụ 2.6 khác với ví dụ 2.5 ở dòng 5, nơi biểu thức logic trong câu lệnh if là c < a Khi thực hiện, biểu thức này sẽ cho kết quả sai, tương đương với giá trị bằng 0.

Khi chương trình thực thi, các lệnh từ dòng 6 đến dòng 9 sẽ bị bỏ qua, dẫn đến việc chương trình chuyển thẳng đến dòng 10 để in kết quả Do đó, giá trị của a và b sẽ giữ nguyên như ban đầu.

Ví dụ 2.7: Cho chương trình sau:

#include int main(void)

} printf(“Gia tri cua a la %d cua b la %d va c la

Khi chạy chương trình, kết quả in ra màn hình sẽ là:

Gia tri cua a la 5 cua b la 7 va c la 2

Giải thích hoạt động của chương trình:

Trong ví dụ 2.7, cần lưu ý rằng ở dòng số 6 và 7 không có cặp dấu { } Điều này dẫn đến việc dòng 7 vẫn được thực thi mặc dù biểu thức logic trong lệnh if ở dòng 5 là sai, trong khi dòng 6 không được thực hiện Kết quả là giá trị của b được tăng lên, khiến điều kiện if ở dòng 8 trở thành đúng, và khối lệnh từ dòng 9 đến dòng 12 được thực hiện Cuối cùng, giá trị các biến a, b, c được xác định như kết quả đã nêu.

Lệnh if đủ khác với lệnh if thiếu ở chỗ nó sẽ chọn và thực hiện một trong hai khối lệnh đã được xác định, dựa trên kết quả logic của biểu thức.

 Cú pháp if (biểu thức)

Hình 2.2 Lưu đồ giải thuật của lệnh if đủ

Nếu biểu thức là đúng thì thực hiện khối lệnh 1 và thoát khỏi if, ngược lại thì thực hiện khối lệnh 2 và thoát khỏi if.

Từ khóa if, else phải viết bằng chữ thường.

Kết quả của biểu thức là đúng (khác 0) hoặc sai (= 0).

Khi khối lệnh 1 hoặc khối lệnh 2 bao gồm từ 2 lệnh trở lên thì các khối lệnh này phải được đặt trong các cặp dấu { }.

Ví dụ 2.8: Cho chương trình sau:

#include int main(void)

} else a = a + 1; b = b +1; printf(“Gia tri cua a la %d cua b la %d va c la

Khi chạy chương trình, kết quả in ra màn hình sẽ là:

1 Gia tri cua a la 11 cua b la 7 va c la 3

Giải thích hoạt động của chương trình:

Ví dụ 2.8 trình bày cả hai cú pháp lệnh if đầy đủ và thiếu, với các lệnh từ dòng 1 đến 8 đã được giới thiệu trong ví dụ trước Điểm khác biệt ở ví dụ này nằm ở các dòng 9 đến 16; nếu biểu thức a < b ở dòng 9 đúng, chương trình sẽ thực hiện các lệnh từ dòng 10 đến 13 Ngược lại, nếu biểu thức này sai, chương trình sẽ thực hiện khối lệnh trong nhánh else, tức là dòng 15, trong khi dòng 16 nằm ngoài khối else Kết quả thực hiện của chương trình được máy tính thực hiện phù hợp với phân tích đã nêu.

2.3.3 Lệnh if … else if … else

Với lệnh if … else if …else thì chương trình sẽ lựa chọn và quyết định thực hiện 1 trong số n khối lệnh cho trước.

 Cú pháp if (biểu thức 1)

Hình 2.3 Lưu đồ giải thuật của lệnh if else if else

Nếu Biểu thức 1 đúng, thực hiện Khối lệnh 1 và kết thúc lệnh if Nếu không, kiểm tra Biểu thức 2; nếu đúng, thực hiện Khối lệnh 2 và kết thúc lệnh if Nếu cả hai biểu thức trên không đúng, tiếp tục với Biểu thức n-1; nếu đúng, thực hiện Khối lệnh n-1 và kết thúc lệnh if Nếu tất cả các biểu thức trước đều sai, thực hiện Khối lệnh n.

Không đặt dấu chấm phẩy ngay sau các phát biểu if, else if, else.

Nếu khối lệnh 1, 2…n bao gồm từ 2 lệnh trở lên thì phải đặt các khối lệnh này trong các cặp dấu { }.

Ví dụ 2.9: Cho chương trình sau:

#include int main(void)

} else a = a + 1; b = b +1; printf(“Gia tri cua a la %d cua b la %d va c la

Khi chạy chương trình, kết quả in ra màn hình sẽ là:

1 Gia tri cua a la 11 cua b la 3 va c la 5

Trong chương trình này, từ dòng 5 đến dòng 13 có sự khác biệt so với các ví dụ trước Biểu thức ở dòng 5 là ((a > c) || (a < b) && (b > c)), nếu kết quả đúng, câu lệnh ở dòng 6 sẽ được thực hiện; nếu sai, chương trình sẽ bỏ qua dòng 6 và chuyển sang dòng 7 Do kết quả của biểu thức ở dòng 5 là sai, chương trình kiểm tra biểu thức ở dòng 7 (a == b): nếu đúng, các lệnh từ dòng 8 đến 11 sẽ được thực hiện; nếu sai, chương trình sẽ thực thi dòng 12 Vì a == b ở dòng 7 cho kết quả sai, nên chương trình thực hiện các dòng 12 và 13 Các lệnh từ dòng 14 đến cuối chương trình luôn được thực hiện vì không liên quan đến lệnh if trước đó.

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

Với cấu trúc if lồng nhau, chương trình sẽ lựa chọn và quyết định thực hiện 1 trong số n khối lệnh cho trước.

Cấu trúc if lồng nhau là một dạng phức tạp của câu lệnh if, trong đó mỗi khối lệnh chứa ít nhất một lệnh if khác Sự gia tăng cấp độ lồng nhau dẫn đến độ phức tạp cao hơn, làm cho chương trình chạy chậm hơn và dễ gây nhầm lẫn trong quá trình lập trình.

Trong lệnh if lồng nhau, else sẽ luôn kết hợp với if gần nhất mà không có else Để tránh hiểu sai khi gặp lệnh if thiếu, cần đặt chúng trong các khối lệnh rõ ràng bằng cặp dấu {}.

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

C có một toán tử phổ biến và thích hợp để thay thế cho cú pháp lệnh if đủ (if else ), đó là toán tử điều kiện 3 ngôi ( ? : ).

Cú pháp của toán tử ba ngôi là:

E1 ? E2 : E3 Trong đó E1, E2, E3 là các biểu thức Ý nghĩa: nếu E1 là Đúng thì thực thi E2, nếu E1 là Sai thì thực thi E3.

Ví dụ 2.10a: Cho đoạn chương trình sau:

Khi chạy đoạn chương trình trên, kết quả in ra màn hình sẽ là:

Vì biểu thức a == 0 ở dòng lệnh thứ 2 trả về kết quả sai, chương trình sẽ thực hiện biểu thức b = 2 sau dấu : Do đó, giá trị của biến b sẽ được cập nhật thành 2.

Ví dụ 2.10b: Cho đoạn chương trình sau:

Khi thực hiện hai dòng lệnh, biến y sẽ nhận giá trị 100 nếu biến x lớn hơn 9; ngược lại, nếu x nhỏ hơn hoặc bằng 9, y sẽ nhận giá trị 200 Đoạn mã trong ví dụ 2.10b tương đương với cấu trúc lệnh if else trong lập trình.

Với cả hai cách viết này giá trị của biến y đều bằng 100.

LỆNH RẼ NHÁNH SWITCH CASE

Lệnh switch case hoạt động tương tự như lệnh if else if else, nhưng yêu cầu biểu thức kiểm tra phải có giá trị hằng số cụ thể Trong khi một bài toán có thể sử dụng lệnh switch, lệnh if cũng có thể áp dụng, tuy nhiên, việc sử dụng lệnh if thay thế cho switch phụ thuộc vào thuật toán của bài toán.

2.5.1 Cú pháp switch (biểu thức nguyên)

{ case n1: khối lệnh 1; break; case n2: khối lệnh 2; break;

……… case nk: khối lệnh k; break;

Hình2.4 Lưu đồ giải thuật của lệnh switch case

Từ khóa switch, case, break phải viết bằng chữ thường, biểu thức phải là có kết quả là các giá trị hằng nguyên (char, int, long, )

Khối lệnh 1, 2…n có thể gồm nhiều lệnh nhưng không cần đặt trong cặp dấu { } Không đặt dấu chấm phẩy ngay sau switch(biểu thức).

Lệnh switch trong lập trình sử dụng các số nguyên, hằng ký tự hoặc biểu thức hằng khác nhau (n1, n2,… nk) Thân lệnh switch được bao quanh bởi dấu { }, trong đó thành phần default là tùy chọn Khi giá trị của biểu thức trong dấu ngoặc () khớp với một trong các giá trị ni, chương trình sẽ nhảy tới câu lệnh tương ứng với case ni: Nếu không có giá trị nào khớp, chương trình sẽ chuyển tới câu lệnh sau nhãn default (nếu có) hoặc thoát khỏi cấu trúc switch (nếu không có default).

Khi sử dụng lệnh switch, máy sẽ rời khỏi lệnh này khi gặp câu lệnh break hoặc dấu ngoặc } đóng cuối cùng Ngoài ra, có thể dùng lệnh goto để nhảy tới một câu lệnh bên ngoài switch Nếu switch nằm trong một hàm, lệnh return có thể được sử dụng để thoát khỏi switch và kết thúc hàm Khi máy nhảy tới một vị trí câu lệnh, hoạt động tiếp theo sẽ dựa vào các lệnh phía sau Nếu nhảy tới vị trí có nhãn case ni:, máy sẽ thực hiện tất cả các câu lệnh cho đến khi gặp break, goto hoặc return Nếu không có lệnh nào như vậy ở cuối mỗi khối lệnh, máy có thể tiếp tục từ case ni sang case ni+1 Nếu mỗi khối lệnh kết thúc bằng break, switch chỉ thực hiện một khối lệnh duy nhất.

Ví dụ 2.11: Cho chương trình sau:

#include int main(void)

{ case 0: b = 0; printf (“chia het”); break; case 1: b = 1; printf(“khong chia het”); break; default: b = 2; printf(“khong chia het”);

}; printf(“\n gia tri cua b la %d”, b); getch(); return 0;

Khi chạy chương trình, kết quả in ra màn hình sẽ là:

Giải thích hoạt động của chương trình:

Ví dụ này khác với các ví dụ trước đó từ dòng lệnh 5 Ở dòng lệnh

Biểu thức a%3 trong lệnh switch sẽ được tính toán và kiểm tra Nếu kết quả là 0, chương trình sẽ nhảy đến dòng lệnh 7 tương ứng với nhãn case 0: Nếu kết quả là 1, chương trình sẽ nhảy đến dòng 11 với nhãn case 1: Trong trường hợp kết quả là các giá trị khác, chương trình sẽ nhảy đến dòng lệnh 15 tương ứng với nhãn default: Trong ví dụ cụ thể này, vì kết quả của biểu thức a%3 là 0, chương trình sẽ chuyển đến nhãn case 0: ở dòng 7.

Để thực hiện lệnh switch, chương trình sẽ tiếp tục cho đến khi gặp lệnh break ở dòng 10, lúc này lệnh switch sẽ kết thúc Sau đó, chương trình sẽ chuyển đến dòng 19 và tiếp tục thực thi cho đến khi hoàn thành chương trình chính.

Bây giờ, ta giả sử lệnh break; ở dòng lệnh 10 bị bỏ đi, thì điều gì sẽ xảy ra? Kết quả của trường hợp này sẽ là:

Giá trị của biến b là 1 Sau khi nhảy tới nhãn case 0 và thực thi khối lệnh ở dòng 8 và 9, do không có lệnh break, chương trình tiếp tục thực hiện các lệnh ở dòng 11, 12, 13 cho đến khi gặp lệnh break tiếp theo Chỉ khi đó, chương trình mới thoát ra khỏi lệnh switch và kết thúc khối lệnh này Đây là vấn đề quan trọng cần lưu ý để đảm bảo chương trình hoạt động đúng theo ý đồ của lập trình viên.

BÀI TẬP

1 Hãy tìm và sửa lỗi trong các câu/đoạn lệnh sau: a max = a;

The code snippet begins by comparing two variables, `a` and `b`, to determine the maximum value, with `max` assigned to `b` if `a` is less than `b` The program then prompts the user to input an integer value for `a` and checks if it is negative, displaying a message if true It further evaluates whether `a` is even or odd and prints the corresponding message The maximum value is printed based on the comparisons between `a` and `b` Additionally, the code checks if a floating-point variable `diem` is within a valid range, ensuring it is positive and less than or equal to 10, while providing appropriate feedback for invalid inputs Lastly, it captures an integer input for `nam` and utilizes a switch statement to assess its divisibility by 4.

{ case ==0: printf(“Nam nhuan\n”); break; default: printf(“Nam binh thuong\n”);

{ case 0: printf(“La so chan\n”); case 1: printf(“La so le\n”);

2 Hãy đọc và phân tích chương trình sau:

#include int main (void)

{ int a,b,c,m; printf (“Nhap a:”); scanf(“%d”, &a); printf (“Nhap b:”); scanf(“%d”, &b); printf (“Nhap c:”); scanf(“%d”, &c); if (a > b) m = a; else m = b; if (m < c) m = c; printf(“ket qua = %d”,m); getch(); return 0;

 Cho biết chương trình thực hiện chức năng gì?

 Vẽ lưu đồ hoạt động của chương trình.

 Viết lại chương trình khác thực hiện cùng chức năng với chương trình trên.

3 Vẽ lưu đồ xử lý và viết chương trình nhập vào 4 số nguyên từ bàn phím và in ra số lớn nhất trong 4 số này.

4 Vẽ lưu đồ xử lý và viết chương trình giải phương trình bậc 2 : ax 2 + bx + c = 0 (không xét đến trường hợp hệ số a = 0).

5 Vẽ lưu đồ xử lý và viết chương trình giải phương trình bậc 2: ax 2 + bx + c = 0 có xét đến trường hợp hệ số a = 0.

6 Vẽ lưu đồ xử lý và viết chương trình nhập vào: giờ : phút : giây từ bàn phím; kiểm tra thời gian vừa nhập vào có hợp lệ hay không; nếu hợp lệ cho biết trước đó 15s là thời gian bao nhiêu.

Thoi gian nhap vao khong hop le!!!!

7 Biết rằng một mã số sinh viên sẽ có định dạng như sau: yyNNNsss Trong đó: yy: là năm nhập học

NNN: là mã ngành học sss: là số thứ tự của sinh viên

Ví dụ nếu mã số sinh viên là 20141125, thì các thông tin tương ứng sẽ là:

125: là số thứ tự của sinh viên

Hãy vẽ lưu đồ xử lý và viết chương trình thực hiện yêu cầu sau:

 Nhập vào một mã số sinh viên theo định dạng trên.

 Kiểm tra và cho biết sinh viên đó học ngành nào trong các ngành học sau: mã ngành tên ngành

LỆNH VÒNG LẶP

MẢNG VÀ CHUỖI

CON TRỎ

HÀM

KIỂU DỮ LIỆU TỰ TẠO

TIỀN XỬ LÝ

Ngày đăng: 29/04/2022, 06:06

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
1. Paul Deitel and Harvey Deitel, C How to program, 6 th Edition, Prentice Hall, 2010 Sách, tạp chí
Tiêu đề: C How to program
2. Brian W. Kernighan and Dennis M. Ritchie, The C Programming Language, Prentice Hall, 1988 Sách, tạp chí
Tiêu đề: The C Programming Language
3. Peter D. Hipson, Advanced C, SAMS Publishing, 1992 Sách, tạp chí
Tiêu đề: Advanced C
4. Dan Gookin, C for Dimmies, Wiley Publishing, InC., 2004 Sách, tạp chí
Tiêu đề: C for Dimmies
5. John W. Perry, Advanced C Programming by Example, Pws Pub Co, 1998 Sách, tạp chí
Tiêu đề: Advanced C Programming by Example
6. Richard Reese, Understanding and Using C Pointers, O’Reilly, 2013 Sách, tạp chí
Tiêu đề: Understanding and Using C Pointers
7. K. N. King, C Programming – A modern Approach, W. W. Norton &amp; Company, 2008 Sách, tạp chí
Tiêu đề: C Programming – A modern Approach
8. Zed A. Shaw, Lear C the Hard Way, Addison-Wesley, 2015 Sách, tạp chí
Tiêu đề: Lear C the Hard Way

TỪ KHÓA LIÊN QUAN

w