TỔNG QUAN VỀ NGÔN NGỮ C
Giới thiệu về lịch sử phát triển của ngôn ngữ, sự cần thiết phải học ngôn ngữ C hiện nay
C là ngôn ngữ lập trình cấp cao, được sử dụng rất phổ biến để lập trình hệ thống cùng với Assembler và phát triển ứng dụng
Vào cuối thập kỷ 60 và đầu thập kỷ 70 của thế kỷ XX, Dennish Ritchie tại phòng thí nghiệm Bell đã phát triển ngôn ngữ C dựa trên ngôn ngữ BCPL của Martin Richards và ngôn ngữ B do Ken Thompson phát triển Ngôn ngữ C được sử dụng để viết hệ điều hành UNIX đầu tiên trên máy PDP-7 và sau đó được cài đặt trên máy DEC PDP-11 Đến nay, ngôn ngữ C vẫn là một trong những ngôn ngữ lập trình phổ biến nhất, nhờ vào việc nó được xây dựng trên những thành tựu mới nhất trong lĩnh vực tin học.
Hình 1: (Dennis Ritchie(trái) và Ken Thompson trước hệ thống PDP-11với 2 text-terminal
Hình 2: (Dennis Ritchie (trái) và Kernighan)
Hiện nay, ngôn ngữ lập trình C và C++ đang được giảng dạy phổ biến ở bậc trung học và đại học tại các nước Âu, Mỹ Dự đoán trong tương lai, ngôn ngữ C sẽ trở thành ngôn ngữ quốc tế trong lĩnh vực tin học, tương tự như vai trò của tiếng Anh trong giao tiếp toàn cầu.
Ngôn ngữ C sở hữu một thư viện hàm phong phú, vượt trội hơn hẳn các ngôn ngữ khác Lập trình viên có thể dễ dàng sử dụng các hàm này bằng cách truyền tham số, giúp tiết kiệm thời gian và công sức so với việc tự viết các chức năng tương tự.
Công việc lập trình trở nên dễ dàng và nhanh chóng, cho phép tạo ra nhiều chương trình ứng dụng chất lượng cao trong mọi lĩnh vực Ngôn ngữ C là lựa chọn lý tưởng để giải quyết các bài toán kỹ thuật phức tạp nhờ vào các toán tử điều khiển mạnh mẽ của nó.
Khái niệm cấu trúc trong ngôn ngữ C cho phép mô tả các khối dữ liệu lớn, giúp ngôn ngữ này trở thành công cụ hiệu quả để giải quyết các bài toán quản lý và xử lý mô hình lựa chọn tối ưu Chương trình viết bằng C có khả năng chạy nhanh gần bằng ngôn ngữ Assembler.
Ngôn ngữ C là một ngôn ngữ lập trình dễ học, với cú pháp ngắn gọn và cấu trúc rõ ràng, giúp người dùng dễ dàng phát hiện lỗi Chính vì vậy, ngôn ngữ C ngày càng được ưa chuộng, đặc biệt là trong giới học sinh và sinh viên Các đặc điểm cơ bản của ngôn ngữ C bao gồm tính đơn giản và hiệu quả trong việc lập trình.
+ Tính cô động (compact): C chỉ có 32 từ khóa chuẩn và 40 toán tử chuẩn, nhưng đều được biểu diễn bằng những chuỗi ký tự ngắn gọn
Ngôn ngữ lập trình C có tính cấu trúc rõ ràng, với các chỉ thị như cấu trúc lựa chọn và lặp, giúp tổ chức chương trình một cách mạch lạc và dễ hiểu.
Ngôn ngữ lập trình C nổi bật với tính tương thích cao, nhờ vào tiền xử lý mạnh mẽ và thư viện chuẩn phong phú Điều này cho phép các chương trình viết bằng C duy trì tính tương thích hoàn hảo khi chuyển từ máy tính này sang máy tính khác.
C là một ngôn ngữ lập trình linh động, nổi bật với cú pháp uyển chuyển cho phép nhiều cách thể hiện khác nhau Điều này không chỉ giúp giảm kích thước mã lệnh mà còn tối ưu hóa tốc độ chạy của chương trình.
Biên dịch (compile) là quá trình mà ngôn ngữ lập trình C cho phép biên dịch nhiều tập tin chương trình riêng lẻ thành các tập tin đối tượng (object) Sau đó, các tập tin đối tượng này được liên kết (link) lại với nhau để tạo thành một chương trình có thể thực thi (executable) thống nhất.
Cách khởi động và thoát chương trình (Turbo C)
Giới thiệu môi trường làm việc của Turbo C:
- Turbo C do hãng Borland cung cấp
- Gồm các chức năng sau: soạn thảo chương trình, dịch, thực thi chương trình,…
- Phiên bản được sử dụng ở đây là Turbo C 3.0
- Đây là màn hình gọi Turbo C:
- Giao diện soạn thảo chương trình mới: vào menu File ->New
Hình 4: Giao diện soạn thảo chương trình mới
- Ghi chương trình đang soạn thảo vào đĩa:
- Sử dụng File->Save hoặc gõ phím F2
- Lệnh Save As để lưu lại chương trình với tên khác
Hình 5: Giao diện lưu chương trình mới
- Thực hiện chương trình, mở một chương trình và thoát:
+ Thực hiện chương trình: Nhấn Ctrl-F9 hoặc vào menu Run->Run
Hình 6: Giao diện thực hiện chương trình + Mở một chương trình có sẵn trên đĩa: Vào menu File->Open hoặc F3
Hình 7: Giao diện mở một chương trình có sẵn trên đĩa + Thoát khỏi Turbo C
Vào menu File->Exit hoặc Alt-X
- Các lệnh nằm trên menu Option:
Include directories: chứa các tập tin muốn đưa vào chương trình (file h trong dòng # include)
Library directories: Chứa tập tin thư viện (file lib)
Output directory: Chứa các tập tin ”đối tượng “ obj và exe sau khi chạy chương trình
Source directories: Chứa các tập tin nguồn (.obj và lib)
+ Environment: dùng để thiết lặp môi trường làm việc.
Hình 7: Giao diện thiết lặp môi trường làm việc
Để sử dụng lệnh BC tại dấu nhắc DOS, bạn cần gõ "BC" và nhấn Enter, nhưng chỉ khi đường dẫn đã được cài đặt thông qua lệnh path và chứa đường dẫn đến thư mục chứa tập tin BC.EXE Nếu đường dẫn chưa được cài đặt, hãy xác định vị trí thư mục BORLANDC trên ổ đĩa của bạn trước khi tiếp tục.
< ổ đĩa>:\BORLANDC\BIN\BC (Enter)
Để khởi động chương trình BC với một tập tin có tên tùy chọn, bạn cần gõ lệnh: BC [đường dẫn] Nếu tập tin đã tồn tại, nó sẽ được nạp lên; nếu không, một tập tin mới sẽ được tạo ra.
Để khởi động tại Windows, bạn mở menu Start và chọn Run, sau đó gõ vào hộp Open các dòng lệnh tương tự như khi nhập tại DOS Ngoài ra, bạn cũng có thể vào Windows Explorer, chọn ổ đĩa chứa thư mục BORLANDC và truy cập vào thư mục đó.
BORLANDC, vào thư mục BIN, khởi động tập tin BC.EXE
Bạn gõ D:\BORLANDC\BIN\BC E:\BAITAP_BC\VIDU1.CPP
Câu lệnh này khởi động BC và nạp tệp VIDU1.CPP từ thư mục BAITAP_BC trên ổ đĩa E Nếu tệp này không tồn tại, nó sẽ được tạo mới.
Màn hình sau khi khởi động thành công:
Hình 8: Màn hình sau khi khởi động thành công
- Ấn phím F10 (kích hoạt menu), chọn menu File, chọn Quit;
- Hoặc ấn tổ hợp phím Alt-X
2.3 Các ví dụ đơn giản:
Hình 09: Màn hình ví dụ 1
Kết quả in ra màn hình:
Hình 10: Màn hình kết quả ví dụ 1
/* Dòng đầu tiên trong mã nguồn bắt đầu bằng /* và kết thúc bằng */ để chỉ ra rằng đây là phần chú thích Khi thực hiện chương trình, phần này không được dịch hay thi hành, mà chỉ nhằm mục đích làm rõ nội dung của chương trình Việc ghi chú này giúp người đọc hiểu rõ hơn về chức năng và mục đích của mã khi xem lại sau này */
Dòng thứ hai của chương trình chứa lệnh tiền xử lý #include, cần thiết để sử dụng hàm printf từ thư viện C Việc khai báo này giúp chương trình biên dịch nhận biết hàm, nếu không có, chương trình sẽ báo lỗi.
+ Dòng thứ 3: hang trắng viết ra với ý đồ làm cho bảng chương trình thoáng, dễ đọc
Hàm void main(void) là thành phần chính của chương trình C, thường được viết dưới dạng main() hoặc void main() Việc sử dụng void main() giúp chương trình trở nên rõ ràng hơn Mọi chương trình C đều bắt đầu thực thi từ hàm main() Cặp dấu ngoặc () chỉ ra đây là khối hàm, trong đó từ khóa void đầu tiên cho biết hàm không trả về giá trị, và từ khóa void trong dấu ngoặc đơn cho biết hàm không nhận bất kỳ đối số nào.
+ Dòng thứ 4, 7: cặp dấu ngoặc nhọn {} là giới hạn thân của hàm Thân hàm bắt đầu bằng dấu { và kết thúc bằng dấu }
Dòng thứ 6 trong mã C là printf(“Bai hoc C dau tien.”);, thực hiện chức năng in ra chuỗi ký tự nằm trong dấu nháy kép (“”) Đây được xem là một câu lệnh, và mỗi câu lệnh trong ngôn ngữ C đều phải kết thúc bằng dấu chấm phẩy (;).
- Các từ include, stdio.h, void, main, printf phải viết bằng chữ thường
- Chuỗi nháy kép cần in ra bạn có thể viết chữ hoa hay chữ thường tùy ý
+ Kết thúc câu lệnh phải có dấu chấm phẩy
+ Kết thúc tên hàm không có dấu chấm phẩy hay bất cứ dấu gì
+ Ghi chú phải đặt trong dấu /*…*/
+ Thân hàm phải được bao trong cặp {}
+ Các câu lệnh trong thân hàm phải viết thụt vào
Bạn nhập đoạn chương trình trên vào máy Dịch, chạy và quan sát kết quả.
Hình 11: Màn hình dịch, chạy chương trình
Sau khi nhập đoạn chương trình vào máy, bạn cần ấn giữ phím Ctrl và gõ F9 để dịch và chạy chương trình Lúc này, chương trình sẽ chớp rất nhanh mà không có kết quả hiển thị Để xem kết quả, hãy ấn giữ phím Ctrl và gõ F5 Sau khi xem xong, bạn chỉ cần ấn phím bất kỳ để quay lại màn hình soạn thảo chương trình.
Bây giờ bạn sửa lại dòng thứ 6 bằng câu lệnh printf(“Bai hoc C dau tien.\n”);, sau đó dịch, chạy chương trình và quan sát kết quả
Kết quả in ra màn hình
Màn hình kết quả chương trình hiển thị dòng bạn vừa sửa với ký hiệu \n, là ký hiệu xuống dòng trong lệnh printf Dưới đây là một số ký hiệu khác liên quan.
Hình 13: Một số ký hiệu khác
Bây giờ bạn sửa lại dòng thứ 6 bằng câu lệnh printf(“\tBai hoc C dau tien.\n”); sau đó dịch, chạy chương trình và quan sát kết quả
Kết quả in ra màn hình
Hình 14: Màn hình kết quả chương trình
Khi chạy chương trình bạn nghe tiếng bip phát ra từ loa
Để khắc phục sự bất tiện khi phải ấn tổ hợp phím Alt-F5 để xem kết quả mỗi khi chạy chương trình, bạn có thể sửa đổi chương trình của mình.
Hình 15: Màn hình chương trình
Kết quả in ra màn hình
Dòng thứ ba của chương trình chứa câu lệnh tiền xử lý #include , cần thiết để sử dụng hàm getch từ thư viện C Việc khai báo hàm thư viện này là bắt buộc để trình biên dịch C nhận diện, nếu không sẽ dẫn đến lỗi trong quá trình biên dịch.
Dòng thứ 8: getch(); chờ nhận một ký tự từ bàn phím mà không hiển thị trên màn hình Hàm này được sử dụng để dừng chương trình sau khi hiển thị kết quả, cho phép người dùng ấn phím bất kỳ để quay lại màn hình soạn thảo.
+ Bạn nhập đoạn chương trình trên vào máy chạy và quan sát kết quả
Hình 16: Màn hình chương trình
Hình 17: Màn hình kết quả chương trình
Biến i được khai báo với lệnh "int i;", trong đó "int" là kiểu dữ liệu số nguyên Biến này đóng vai trò là một vị trí trong bộ nhớ, nơi lưu trữ giá trị mà chương trình sẽ sử dụng Mỗi biến đều thuộc một kiểu dữ liệu nhất định, và trong trường hợp này, biến i thuộc kiểu số nguyên (integer).
Dòng thứ 9 của mã nguồn sử dụng hàm scanf("%d", &i) để nhận dữ liệu từ người sử dụng Chuỗi định dạng "%d" chỉ ra rằng người dùng cần nhập vào một số nguyên Đối mục thứ hai, &i, là address operator, cho phép hàm scanf lưu giá trị nhập từ bàn phím vào biến i.
Thực hành
2 Chương 2: Các thành phần cơ bản 12 6 6
1 Từ khóa và kí hiệu 1
2 Các kiểu dữ liệu sơ cấp 1
3 Chương 3: Các lệnh có cấu trúc 20 9 10 1
1 Khái niệm về lệnh cấu trúc 2
3 Các tham số của hàm 2
4 Các lệnh đơn nhằm kết thúc hàm và nhận giá trị trả về cho tên hàm 2
CHƯƠNG 1 : TỔNG QUAN VỀ NGÔN NGỮ C
Mã chương: MH 09-01 Mục tiêu:
Sau khi học xong bài này sinh viên có khả năng:
- Hiểu được lịch sử phát triển của ngôn ngữ C
- Biết được ngôn ngữ này có ứng dụng như thế nào
- Biết cách khởi động được và thoát khỏi chương trình
- Sử dụng hệ thống trợ giúp từ help file
1 Giới thiệu về lịch sử phát triển của ngôn ngữ, sự cần thiết phải học ngôn ngữ C hiện nay
C là ngôn ngữ lập trình cấp cao, được sử dụng rất phổ biến để lập trình hệ thống cùng với Assembler và phát triển ứng dụng
Vào cuối thập kỷ 60 và đầu thập kỷ 70 của thế kỷ XX, Dennish Ritchie tại phòng thí nghiệm Bell đã phát triển ngôn ngữ C dựa trên ngôn ngữ BCPL do Martin Richards giới thiệu năm 1967 và ngôn ngữ B của Ken Thompson, được sử dụng để viết hệ điều hành UNIX đầu tiên trên máy PDP-7 Ngôn ngữ C sau đó được cài đặt lần đầu trên hệ điều hành UNIX của máy DEC PDP-11 và đã trở thành một trong những ngôn ngữ lập trình phổ biến nhất, nhờ vào việc tích hợp những thành tựu mới nhất trong lĩnh vực công nghệ thông tin.
Hình 1: (Dennis Ritchie(trái) và Ken Thompson trước hệ thống PDP-11với 2 text-terminal
Hình 2: (Dennis Ritchie (trái) và Kernighan)
Hiện nay, ngôn ngữ lập trình C và C++ đang được giảng dạy phổ biến ở bậc trung học và đại học tại các nước Âu, Mỹ Dự kiến trong tương lai, ngôn ngữ C sẽ trở thành ngôn ngữ quốc tế trong lĩnh vực tin học, tương tự như vai trò của tiếng Anh trong giao tiếp toàn cầu.
Ngôn ngữ C sở hữu một thư viện hàm phong phú, vượt trội hơn hẳn so với các ngôn ngữ khác Nhờ vào việc chỉ cần truyền tham số, lập trình viên có thể nhanh chóng nhận được kết quả mà không tốn thời gian viết lại các chức năng tương tự.
Công việc lập trình trở nên dễ dàng và nhanh chóng, cho phép tạo ra nhiều sản phẩm ứng dụng chất lượng cao trong mọi lĩnh vực Ngôn ngữ C là lựa chọn lý tưởng để giải quyết các bài toán kỹ thuật phức tạp nhờ vào các toán tử điều khiển mạnh mẽ của nó.
Khái niệm cấu trúc trong ngôn ngữ C cho phép mô tả các khối dữ liệu lớn, giúp giải quyết hiệu quả các bài toán quản lý và xử lý mô hình lựa chọn tối ưu Chương trình viết bằng C có thể đạt hiệu suất gần bằng với Assembler, mang lại tốc độ thực thi nhanh chóng.
Ngôn ngữ C là một ngôn ngữ lập trình dễ học, với chương trình viết ngắn gọn, súc tích và cấu trúc rõ ràng, giúp người dùng dễ dàng phát hiện sai lầm Chính vì vậy, ngôn ngữ C ngày càng được ưa chuộng, đặc biệt là trong giới học sinh và sinh viên Các đặc điểm cơ bản của ngôn ngữ C bao gồm tính đơn giản, khả năng kiểm soát tốt và tính linh hoạt trong lập trình.
+ Tính cô động (compact): C chỉ có 32 từ khóa chuẩn và 40 toán tử chuẩn, nhưng đều được biểu diễn bằng những chuỗi ký tự ngắn gọn
Ngôn ngữ lập trình C có tính cấu trúc rõ ràng với các chỉ thị như cấu trúc lựa chọn và lặp, giúp tổ chức chương trình một cách mạch lạc và dễ hiểu.
C có tính tương thích cao nhờ vào tiền xử lý và thư viện chuẩn phong phú, giúp các chương trình viết bằng C vẫn hoạt động hoàn hảo khi chuyển từ máy tính này sang máy tính khác.
Ngôn ngữ C nổi bật với tính linh động, cho phép lập trình viên sử dụng nhiều cách thể hiện khác nhau Cú pháp của C rất uyển chuyển, giúp tối ưu hóa kích thước mã lệnh và nâng cao tốc độ chạy của chương trình.
Biên dịch (compile) là quá trình cho phép ngôn ngữ lập trình C chuyển đổi nhiều tập tin chương trình riêng lẻ thành các tập tin đối tượng (object) Sau đó, các tập tin đối tượng này được liên kết (link) lại với nhau để tạo thành một chương trình có thể thực thi (executable) thống nhất.
2 Cách khởi động và thoát chương trình (Turbo C):
Giới thiệu môi trường làm việc của Turbo C:
- Turbo C do hãng Borland cung cấp
- Gồm các chức năng sau: soạn thảo chương trình, dịch, thực thi chương trình,…
- Phiên bản được sử dụng ở đây là Turbo C 3.0
- Đây là màn hình gọi Turbo C:
- Giao diện soạn thảo chương trình mới: vào menu File ->New
Hình 4: Giao diện soạn thảo chương trình mới
- Ghi chương trình đang soạn thảo vào đĩa:
- Sử dụng File->Save hoặc gõ phím F2
- Lệnh Save As để lưu lại chương trình với tên khác
Hình 5: Giao diện lưu chương trình mới
- Thực hiện chương trình, mở một chương trình và thoát:
+ Thực hiện chương trình: Nhấn Ctrl-F9 hoặc vào menu Run->Run
Hình 6: Giao diện thực hiện chương trình + Mở một chương trình có sẵn trên đĩa: Vào menu File->Open hoặc F3
Hình 7: Giao diện mở một chương trình có sẵn trên đĩa + Thoát khỏi Turbo C
Vào menu File->Exit hoặc Alt-X
- Các lệnh nằm trên menu Option:
Include directories: chứa các tập tin muốn đưa vào chương trình (file h trong dòng # include)
Library directories: Chứa tập tin thư viện (file lib)
Output directory: Chứa các tập tin ”đối tượng “ obj và exe sau khi chạy chương trình
Source directories: Chứa các tập tin nguồn (.obj và lib)
+ Environment: dùng để thiết lặp môi trường làm việc.
Hình 7: Giao diện thiết lặp môi trường làm việc
Để sử dụng lệnh BC tại dấu nhắc DOS, bạn cần gõ "BC" và nhấn Enter, nhưng chỉ khi đường dẫn đã được cài đặt bằng lệnh path và chứa thư mục chứa tập tin BC.EXE Nếu đường dẫn chưa được cài đặt, hãy kiểm tra thư mục BORLANDC trên ổ đĩa của bạn.
< ổ đĩa>:\BORLANDC\BIN\BC (Enter)
Để khởi động chương trình BC với một tập tin có tên tùy chỉnh, bạn chỉ cần gõ lệnh: BC [đường dẫn] Nếu tập tin đã tồn tại, nó sẽ được nạp lên; nếu không, một tập tin mới sẽ được tạo ra.
Để khởi động tại Windows, bạn vào menu Start và chọn Run, sau đó nhập vào hộp Open một trong các dòng lệnh như khi sử dụng DOS Ngoài ra, bạn cũng có thể mở Windows Explorer, chọn ổ đĩa chứa thư mục BORLANDC và truy cập vào thư mục đó.
BORLANDC, vào thư mục BIN, khởi động tập tin BC.EXE
Bạn gõ D:\BORLANDC\BIN\BC E:\BAITAP_BC\VIDU1.CPP
Câu lệnh trên khởi động BC và nạp tập tin VIDU1.CPP từ thư mục BAITAP_BC trên ổ đĩa E Nếu tập tin này không tồn tại, nó sẽ được tạo mới.
Màn hình sau khi khởi động thành công:
Hình 8: Màn hình sau khi khởi động thành công
- Ấn phím F10 (kích hoạt menu), chọn menu File, chọn Quit;
- Hoặc ấn tổ hợp phím Alt-X
2.3 Các ví dụ đơn giản:
Hình 09: Màn hình ví dụ 1
Kết quả in ra màn hình:
Hình 10: Màn hình kết quả ví dụ 1
/* Dòng đầu tiên của chương trình bắt đầu bằng /* và kết thúc bằng */ để ghi chú, giúp giải thích nội dung của mã Khi thực thi chương trình, những dòng này không được dịch và không ảnh hưởng đến lệnh Mục đích của việc ghi chú là làm cho mã nguồn trở nên rõ ràng hơn, giúp người đọc hiểu được chức năng của chương trình khi xem lại sau này */
CÁC THÀNH PHẦN CƠ BẢN
Hệ thống từ khóa và kí hiệu được dùng trong C
Bao gồm những ký tự, những ký hiệu sau (phân biệt chữ hoa và chữ thường):
26 chữ cái la tinh lớn A,B,C Z
26 chữ cái la tinh nhỏ a,b,c z
10 chữ số thập phân 0,1,2 9.(chữ số Ả Rập)
Các ký hiệu toán học: +, -, *, /, =, , (, )
Các ký hiệu đặc biệt: : , ; " ' _ @ # $ ! ^ [ ] { }
Dấu cách hay khoảng trống
Keywords in C are reserved words that programmers can use within their code according to the specific meanings assigned to each term They are essential for declaring data types and writing commands It is important to note that keywords cannot be used as identifiers for variables or functions In Turbo C 3.0, the following keywords are included: asm, auto, break, case, cdecl, char, class, const, continue, _cs, default, delete, do, double, _ds, else, enum, _es, extern, _export, far, _fastcall, float, for, friend, goto, huge, if, inline, int, interrupt, _loadds, long, near, new, operator, pascal, private, protected, public, register, and return.
_saveregs _seg short signed sizeof _ss static struct switch template this typedef union unsigned virtual void volatile while
Khác với ngôn ngữ khác, các từ khóa của Turbo C đều viết bằng chữ thường
Ví dụ: phải viết là if, không được viết là If hoặc IF như Pascal hoặc Foxpro
Tên trong lập trình đóng vai trò quan trọng, không chỉ thể hiện ý nghĩa rõ ràng trong chương trình mà còn giúp xác định các đại lượng khác nhau Tên thường được sử dụng cho hằng, biến, mảng, con trỏ và nhãn Lưu ý rằng chiều dài tối đa của một biến là 32 ký tự.
Tên biến hợp lệ là một chuỗi ký tự liên tục gồm: ký tự chữ, số và dấu gạch dưới
Ký tự đầu tiên phải là chữ hoặc dấu gạch dưới Khi đặt tên không được trùng từ khóa
Các tên đúng: delta, a_1, Num_ODD, Case
3a_1 (ký tự đầu là số) num-odd (sử dụng dấu gạch ngang) int (đặt tên trùng với từ khóa) del ta (có khoảng trắng) f(x) (có dấu ngoặc tròn)
Lưu ý: trong C phân biệt chữ hoa chữ thường
VD2: number khác Number case khác Case
(case là từ khóa, do đó bạn đặt tên là Case vẫn đúng)
1.4 Cặp dấu ghi chú thích:
Khi lập trình, việc thêm ghi chú vào mã nguồn là cần thiết để dễ dàng ghi nhớ và hiểu rõ các đoạn code sau này Ghi chú không ảnh hưởng đến hoạt động của chương trình và sẽ bị loại bỏ trong quá trình biên dịch Để tạo ghi chú, bạn sử dụng cặp dấu chú thích /* và */.
Nếu bạn không viết đúng quy định trên, khi chạy chương trình sẽ bị lỗi
{ char ten[50]; /* khai bao bien ten kieu char 50 ky tu */
Để xuất chuỗi ra màn hình trong ngôn ngữ lập trình C, bạn có thể sử dụng câu lệnh `printf` để yêu cầu người dùng nhập tên Sau đó, sử dụng `scanf` để đọc tên đó vào một chuỗi Cuối cùng, bạn có thể chào mừng người dùng bằng cách in ra tên đã nhập và thông báo về ngôn ngữ lập trình C.
/*Dung chuong trinh, cho go phim*/ getch(); return 0;
Khi biên dịch chương trình, C gặp cặp dấu ghi chú sẽ không dịch ra ngôn ngữ máy
Tóm lại, đối với ghi chú dạng // dùng ghi chú một hàng và dạng /* … */ có thể ghi chú một hàng hoặc nhiều hàng
1.5 Các ký tự điều khiển:
Turbo C cung cấp nhiều ký tự điều khiển cho việc xuất dữ liệu ra màn hình và máy in, vượt trội hơn so với các ngôn ngữ lập trình khác Bộ ký tự điều khiển của Turbo C rất phong phú và đa dạng.
Các kiểu dữ liệu: kiểu số, chuỗi, ký tự
Ký tự điều khiển Giá trị Ký tự được hiểu Tác dụng
Ký tự có giá trị theo mã ASCII
Ký tự có giá trị theo mã ASCII
Phát tiếng còi Xóa ký tự bên trái Sang trang
Xuống dòng, trở về đầu dòng, tab theo cột, tab theo hàng, dấu backslash, dấu nháy đơn (‘), dấu nháy kép (“) và dấu chấm hỏi (?) là những ký tự quan trọng trong lập trình Trong bảng mã, cơ số 8 tương ứng với ddd và cơ số 16 tương ứng với HHH.
Bảng 1: Bộ ký tự điều khiển của Turbo C
{ printf(“\nDay la chuong trinh \’ Turbo C\’”);
Kết quả sẽ in ra:
Day là chuong trinh ‘Turbo C’
2 Các kiểu dữ liệu: kiểu số, chuỗi, ký tự
Kiểu số nguyên là kiểu dữ liệu dùng để lưu trữ các giá trị nguyên, thường được gọi là kiểu đếm được Trong ngôn ngữ lập trình C, kiểu số nguyên được phân chia thành nhiều kiểu dữ liệu con, mỗi kiểu có miền giá trị riêng biệt.
2.1.1 Kiểu số nguyên 1 byte (8 bits):
Gồm có các kiểu sau:
STT Kiểu dữ liệu Miền giá trị (domain)
1 unsigned char Từ 0 đến 255 (tương đương 256 ký tự trong bảng mã ASCII)
Bảng 2: Kiểu dữ liệu số nguyên 1 byte (8 bits)
Kiểu unsigned char: lưu các số nguyên dương từ 0 đến 255
Để khai báo biến kiểu ký tự, bạn cần sử dụng kiểu dữ liệu unsigned char Mỗi giá trị trong miền của kiểu unsigned char tương ứng với một ký tự trong bảng mã ASCII.
Kiểu char: lưu các số nguyên từ -128 đến 127 Kiểu char sử dụng bit trái nhất làm bit dấu
Nếu gán giá trị > 127 cho biến kiểu char thì giá trị của biến này có thể là số âm
2.1.2 Kiểu số nguyên 2 bytes (16 bits):
STT Kiểu dữ liệu Miền giá trị (domain)
Bảng 3: Kiểu dữ liệu số nguyên 2 bytes (16 bits)
Kiểu enum, short int, int : Lưu các số nguyên từ -32768 đến 32767 Sử dụng bit bên trái nhất làm bit dấu
=> Nếu gán giá trị >32767 cho biến có 1 trong 3 kiểu trên thì giá trị của biến này có thể là số âm
Kiểu unsigned int: Kiểu unsigned int lưu các số nguyên dương từ 0 đến 65535
2.1.3 Kiểu số nguyên 4 bytes (32 bit):
Kiểu số nguyên 4 bytes hay còn gọi là số nguyên dài (long) gồm có 2 kiểu sau: STT Kiểu dữ liệu Miền giá trị (Domain)
Bảng 4: Kiểu dữ liệu số nguyên 4 bytes (32 bits)
Kiểu long: Lưu tất cả các số nguyên từ -2147483648 đên 2147483647 Sử dụng bit bên trái nhất để làm bit dấu
=> Nếu gán giá trị > 2147483647 cho biến có kiểu long thì giá trị biến này có thể là số âm
Kiểu unsigned long: Lưu các số nguyên dương từ 0 đên 4294967295
Kiểu số thực dùng lưu các số thực hay các sô có dấu chấm thập phân gồm có 3 kiểu sau:
STT Kiểu dữ liệu Kích thước
3 long double 10 bytes Từ 3.4 * 10 -4932 đến 3.4 * 10 4932
Bảng 5: Kiểu dữ liệu số thực
Mỗi kiểu số thực có miền giá trị và độ chính xác khác nhau, vì vậy việc khai báo biến phù hợp với nhu cầu sử dụng là rất quan trọng Bạn có thể lựa chọn giữa ba kiểu số thực để đáp ứng yêu cầu cụ thể của mình.
Ngoài ra ta còn có kiểu dữ liệu void, kiểu này mang ý nghĩa là kiểu rỗng không chứa giá trị nào cả.
Các loại biến, cách khai báo, sử dụng
Biến là một đại lượng được lập trình viên định nghĩa và đặt tên thông qua việc khai báo Nó dùng để chứa dữ liệu trong quá trình thực hiện chương trình, với giá trị có thể thay đổi theo thời gian Cách đặt tên biến tương tự như các quy tắc đã đề cập ở phần trước.
Mỗi biến thuộc về một kiểu dữ liệu xác định và có giá trị thuộc kiểu đó
Muốn biến sử dụng trong chương trình đều phải đặt tên theo các quy định như sa:
Tên biến hợp lệ trong Turbo C là một chuỗi ký tự liên tục, bao gồm chữ cái, số và dấu gạch dưới, với ký tự đầu tiên phải là chữ Khi đặt tên biến, cần tránh việc trùng lặp với các từ khóa đã được định nghĩa trong Turbo C.
Ví dụ: bien_1, bien_2, temp22 hợp lê bi&, 2ten, A b, float không hợp lệ
Turbo C phân biệt rất rõ rang giữa chữ in thường và in hoa
BIEN, Bien, bieN: Là những tên biến khác nhau
If, Goto: Tuy trùng với từ khóa nhưng vẫn hợp lệ
Turbo C chỉ phân biệt hai tên hợp lệ dựa trên n ký tự đầu tiên của chúng, với n nằm trong khoảng từ 8 đến 32 ký tự Điều này cho phép bạn tự do đặt tên biến hợp lệ, nhưng tên biến dài có thể gây khó khăn trong việc ghi nhớ.
Ví dụ : Hai tên biến sau đây được coi là hợp lệ và cùng tên nhau :
- Ten_bien_dai_toi_32_ky_tu_dau_tien_1
- Ten_bien_dai_toi_32_ky_tu_dau_tien_2
3.1.1 Cú pháp khai báo biến:
Danh sách các tên biến;
Kiểu dữ liệu: một trong các kiểu ở mục
Danh sách các tên biến: gồm các tên biến có cùng kiểu dữ liệu, mỗi tên biến cách nhau dấu phẩy (,), cuối cùng là dâu chấm phẩy (;)
Trong đoạn mã này, ba biến a, b và c được khai báo với kiểu dữ liệu int, trong khi biến chu_vi có kiểu long int Biến nua_chu_vi được định nghĩa với kiểu float, và biến dien_tich có kiểu double.
Khi khai báo biến nên đặt theo quy tắc Hungarian Notation
Trong đoạn mã, biến `ituoi` được khai báo với kiểu dữ liệu `int`, biến `fTrongluong` có kiểu `float`, và hai biến `ckitu1` cùng `ckitu2` được khai báo với kiểu `char`.
Biến khai báo theo quy tắc Hungarian Notation giúp dễ dàng nhận biết kiểu dữ liệu của biến Ví dụ, biến "ituoi" có kiểu int được đặt tên với chữ "i" ở đầu, cho phép lập trình viên nhanh chóng nhận ra kiểu dữ liệu mà không cần xem lại phần khai báo Tương tự, biến "fTrongluong" với chữ "f" ở đầu cho biết biến này có kiểu float Việc sử dụng quy tắc này làm cho quá trình lập trình và bảo trì mã nguồn trở nên thuận tiện hơn.
Việc khai báo biến trong Turbo C và Pascal có sự khác biệt rõ rệt, điều này thường gây nhầm lẫn cho những ai đã quen với lập trình Pascal khi chuyển sang Turbo C Để giúp các bạn tránh những sai sót không đáng có, chúng tôi xin lưu ý về những điểm khác nhau giữa hai ngôn ngữ lập trình này.
Ví dụ: var a,b,c: integer; begin
Bảng 6: Việc khai báo biến giữa Turbo C và Pascal có sự khác nhau
Trong ngôn ngữ lập trình C, việc khai báo biến đúng vị trí là rất quan trọng để tránh những sai sót ngoài ý muốn, được gọi là hiệu ứng lề Có hai cách để đặt vị trí các biến trong chương trình.
Các biến toàn cục được định nghĩa bên ngoài mọi hàm, và chúng có ảnh hưởng đến toàn bộ chương trình.
Hình 1: Khai báo biến ngoài
Ví dụ 1: int i; /*Bien ben ngoai */ float pi; /*Bien ben ngoai*/ int main()
Ví dụ 2 : int n, tong ;/*Khai báo biến ngoài*/ main()
Các biến được định nghĩa trong hàm, chương trình chính hoặc một khối lệnh cụ thể và chỉ có tác dụng trong phạm vi đó Khi khai báo biến, cần phải đặt chúng ở đầu khối lệnh, trước các lệnh gán và các thao tác khác.
30 int bienngoai; /*khai bao bien ngoai*/ int main ()
{ int j,i; /*khai bao bien ben trong chuong trinh chinh*/ clrscr(); i=1; j=2; bienngoai=3; printf("\n Gia tri cua i la %d",i);
/*%d là s nguyên, s bit sau */ printf("\n Gia tri cua j la %d",j); printf("\n Gia tri cua bienngoai la %d",bienngoai); getch(); return 0;
{ int i, j; /*Bien ben trong*/ clrscr(); i=4; j=5; printf("\n Gia tri cua i la %d",i); printf("\n Gia tri cua j la %d",j); if(j>i)
{ int hieu=j-i; /*Bien ben trong */ printf("\n Hieu so cua j tru i la %d",hieu);
{ int hieu=i-j ; /*Bien ben trong*/ printf("\n Gia tri cua i tru j la %d",hieu);
3.1.3 Khai báo đối số hàm:
Vị trí biến đặt trong phần định nghĩa tham số của hàm
Ví dụ: fun2(x,c) int x; /*Khai báo đối số hàm*/ char c;
Khi khai báo biến trong Turbo C, bạn cần đặt biến ngay sau dấu { đầu tiên của thân hàm và trước các câu lệnh khác Nếu bạn cố gắng khai báo biến sau một lệnh khác, như lệnh gán, Turbo C sẽ báo lỗi, như thể hiện trong đoạn chương trình dưới đây.
/*Khai báo sai vị trí biến*/ main()
{ int a,b,c;/*khai báo đúng*/ a5; int d;/*khai bao sai vi sau cau lenh gan*/
Khai báo biến ở các vị trí khác nhau trong chương trình mang ý nghĩa và giá trị khác nhau Việc chú ý đến điều này là rất quan trọng để tránh những sai lầm không đáng có.
Với đặc điểm này, bạn có thể tận dụng việc đặt trùng tên cho các biến, giúp tiết kiệm bộ nhớ mà không lo bị sai giá trị Để hiểu rõ hơn về tác dụng này, hãy nhập và chạy thử đoạn chương trình dưới đây.
/*Mô tả sự khác nhau về vi trí các biến*/
/*Các biến này chỉ tồn tại trong khối*/ printf(“KET QUA IN RA\n”); printf(“Gia tri i trong khoi = % d\n”,i); printf(“Gia tri j trong khoi = % d\n”,j);
} printf(“Gia tri i ngoai khoi = %d\n”,i); printf(“Gia tri j ngoai khoi = %d\n”j); getch();
Sau khi chay chương trinh ma se co ket qua nhu sau:
3.2 Vừa khai báo vừa khởi gán:
Có thể kết hợp việc khai báo với toán tử gán để biến nhận ngay giá trị cùng lúc với khai báo
Khai báo trước, gán trị sau:
Vừa khai báo vừa gán trị: void main()
Biểu thức là một sự kết hợp giữa các toán tử (operator) và các toán hạng (operand) theo đúng một trật tự nhất định
- Mỗi toán hạng có thể là một hằng, một biến hoặc một biểu thức khác
- Trong trường hợp, biểu thức có nhiều toán tử, ta dùng cặp dấu ngoặc đơn () để chỉ định toán tử nào được thực hiện trước
Biểu thức nghiệm của phương trình bậc hai:
Trong đó 2 là hằng; a, b, Delta là biến
Ví dụ 2 : a = (i = 10 * a) + sin (x = b + 1) * ( b>1) : hoặc x = y / 3 + power (i,2);
3.3.1 Các toán tử số học:
Trong ngôn ngữ C, các toán tử cơ bản như +, -, *, và / hoạt động tương tự như trong các ngôn ngữ lập trình khác và có thể áp dụng cho hầu hết các kiểu dữ liệu được hỗ trợ Khi thực hiện phép chia với toán tử / trên các số nguyên hoặc ký tự, phần dư sẽ bị loại bỏ, ví dụ, 5/2 sẽ cho kết quả là 2 trong phép chia nguyên.
Bảng 7: Các toán tử số học
Toán tử ++ thêm 1 vào toán hạng của nó và – trừ bớt 1 Nói cách khác: x = x + 1 giống như ++x x = x – 1 giống như x—
Cả 2 toán tử tăng và giảm đều có thể tiền tố (đặt trước) hay hậu tố (đặt sau) toán hạng Ví dụ: x = x + 1 có thể viết x++ (hay ++x)
Trong ngôn ngữ lập trình C, sự khác biệt giữa tiền tố và hậu tố rất quan trọng khi sử dụng trong biểu thức Khi toán tử tăng (++) hoặc giảm ( ) đứng trước toán hạng, C sẽ thực hiện phép toán trước khi sử dụng giá trị trong biểu thức Ngược lại, nếu toán tử đứng sau toán hạng, C sẽ lấy giá trị của toán hạng trước khi thực hiện phép toán Ví dụ, với x = 10, khi thực hiện y = ++x, giá trị của y sẽ là 11.
Thứ tự ưu tiên của các toán tử số học:
++ sau đó là * / % rồi mới đến + -
Thực hành
3 Chương 3: Các lệnh có cấu trúc 20 9 10 1
1 Khái niệm về lệnh cấu trúc 2
3 Các tham số của hàm 2
4 Các lệnh đơn nhằm kết thúc hàm và nhận giá trị trả về cho tên hàm 2
CHƯƠNG 1 : TỔNG QUAN VỀ NGÔN NGỮ C
Mã chương: MH 09-01 Mục tiêu:
Sau khi học xong bài này sinh viên có khả năng:
- Hiểu được lịch sử phát triển của ngôn ngữ C
- Biết được ngôn ngữ này có ứng dụng như thế nào
- Biết cách khởi động được và thoát khỏi chương trình
- Sử dụng hệ thống trợ giúp từ help file
1 Giới thiệu về lịch sử phát triển của ngôn ngữ, sự cần thiết phải học ngôn ngữ C hiện nay
C là ngôn ngữ lập trình cấp cao, được sử dụng rất phổ biến để lập trình hệ thống cùng với Assembler và phát triển ứng dụng
Vào cuối thập kỷ 60 và đầu thập kỷ 70 của thế kỷ XX, Dennish Ritchie tại phòng thí nghiệm Bell đã phát triển ngôn ngữ C, dựa trên ngôn ngữ BCPL do Martin Richards giới thiệu năm 1967 và ngôn ngữ B do Ken Thompson phát triển vào năm 1970 Ngôn ngữ C đã được sử dụng để viết hệ điều hành UNIX đầu tiên trên máy PDP-7 và sau đó cài đặt trên hệ điều hành UNIX của máy DEC PDP-11 Đến nay, ngôn ngữ C vẫn là một trong những ngôn ngữ lập trình phổ biến nhất, nhờ vào việc tích hợp những thành tựu mới nhất trong lĩnh vực tin học.
Hình 1: (Dennis Ritchie(trái) và Ken Thompson trước hệ thống PDP-11với 2 text-terminal
Hình 2: (Dennis Ritchie (trái) và Kernighan)
Hiện nay, các nước Âu, Mỹ đang sử dụng ngôn ngữ lập trình C và C++ trong giảng dạy bậc trung học và đại học Dự báo trong tương lai, ngôn ngữ C sẽ trở thành ngôn ngữ quốc tế trong lĩnh vực tin học, tương tự như vai trò của tiếng Anh trong giao tiếp hiện nay.
Ngôn ngữ C sở hữu một thư viện hàm phong phú, vượt trội so với các ngôn ngữ khác Lập trình viên chỉ cần truyền tham số vào các hàm của C để nhận kết quả nhanh chóng, tiết kiệm thời gian và công sức so với việc tự viết lại chức năng tương tự.
Công việc lập trình trở nên dễ dàng và nhanh chóng, giúp tạo ra nhiều sản phẩm ứng dụng chất lượng cao Ngôn ngữ C là lựa chọn lý tưởng để giải quyết các bài toán kỹ thuật phức tạp nhờ vào các toán tử điều khiển mạnh mẽ của nó.
Ngôn ngữ C hỗ trợ khái niệm cấu trúc, cho phép mô tả các khối dữ liệu lớn, từ đó có thể giải quyết hiệu quả các bài toán quản lý và xử lý mô hình lựa chọn tối ưu Chương trình viết bằng C có khả năng chạy nhanh gần bằng ngôn ngữ Assembler.
Ngôn ngữ C là một ngôn ngữ lập trình dễ học, với chương trình viết ngắn gọn và súc tích Cấu trúc rõ ràng của nó giúp người dùng dễ dàng phát hiện và sửa lỗi Chính vì vậy, ngôn ngữ C ngày càng được ưa chuộng, đặc biệt là trong giới học sinh và sinh viên Những đặc điểm cơ bản của ngôn ngữ C bao gồm tính đơn giản và khả năng tối ưu hóa hiệu suất.
+ Tính cô động (compact): C chỉ có 32 từ khóa chuẩn và 40 toán tử chuẩn, nhưng đều được biểu diễn bằng những chuỗi ký tự ngắn gọn
Ngôn ngữ lập trình C có cấu trúc rõ ràng với các chỉ thị như cấu trúc lựa chọn và lặp, giúp tổ chức chương trình một cách mạch lạc và dễ hiểu.
C là một ngôn ngữ lập trình có tính tương thích cao nhờ vào tiền xử lý mạnh mẽ và thư viện chuẩn phong phú, cho phép các chương trình viết bằng C vẫn hoạt động tốt khi chuyển từ máy tính này sang máy tính khác.
Ngôn ngữ lập trình C nổi bật với tính linh động, cho phép lập trình viên sử dụng nhiều cách thể hiện khác nhau Cú pháp của C rất uyển chuyển, giúp thu gọn kích thước mã lệnh, từ đó cải thiện hiệu suất và tốc độ chạy của chương trình.
Biên dịch là quá trình cho phép ngôn ngữ lập trình C chuyển đổi nhiều tập tin chương trình riêng lẻ thành các tập tin đối tượng Sau đó, các tập tin đối tượng này được liên kết với nhau để tạo thành một chương trình thực thi thống nhất.
2 Cách khởi động và thoát chương trình (Turbo C):
Giới thiệu môi trường làm việc của Turbo C:
- Turbo C do hãng Borland cung cấp
- Gồm các chức năng sau: soạn thảo chương trình, dịch, thực thi chương trình,…
- Phiên bản được sử dụng ở đây là Turbo C 3.0
- Đây là màn hình gọi Turbo C:
- Giao diện soạn thảo chương trình mới: vào menu File ->New
Hình 4: Giao diện soạn thảo chương trình mới
- Ghi chương trình đang soạn thảo vào đĩa:
- Sử dụng File->Save hoặc gõ phím F2
- Lệnh Save As để lưu lại chương trình với tên khác
Hình 5: Giao diện lưu chương trình mới
- Thực hiện chương trình, mở một chương trình và thoát:
+ Thực hiện chương trình: Nhấn Ctrl-F9 hoặc vào menu Run->Run
Hình 6: Giao diện thực hiện chương trình + Mở một chương trình có sẵn trên đĩa: Vào menu File->Open hoặc F3
Hình 7: Giao diện mở một chương trình có sẵn trên đĩa + Thoát khỏi Turbo C
Vào menu File->Exit hoặc Alt-X
- Các lệnh nằm trên menu Option:
Include directories: chứa các tập tin muốn đưa vào chương trình (file h trong dòng # include)
Library directories: Chứa tập tin thư viện (file lib)
Output directory: Chứa các tập tin ”đối tượng “ obj và exe sau khi chạy chương trình
Source directories: Chứa các tập tin nguồn (.obj và lib)
+ Environment: dùng để thiết lặp môi trường làm việc.
Hình 7: Giao diện thiết lặp môi trường làm việc
Để sử dụng lệnh BC tại dấu nhắc DOS, trước tiên bạn cần gõ BC và nhấn Enter, nhưng chỉ khi đường dẫn đã được cài đặt qua lệnh path và chứa thư mục chứa tập tin BC.EXE Nếu chưa cài đặt đường dẫn, hãy xác định vị trí thư mục BORLANDC trên ổ đĩa của bạn trước khi thực hiện lệnh.
< ổ đĩa>:\BORLANDC\BIN\BC (Enter)
Để khởi động BC với một tệp tin đã được đặt tên, bạn cần sử dụng lệnh: BC [đường dẫn] Nếu tệp tin đã tồn tại, nó sẽ được nạp lên; nếu không, một tệp tin mới sẽ được tạo ra.
Để khởi động tại Windows, bạn vào menu Start, chọn Run và gõ vào hộp Open các lệnh tương tự như trong DOS Hoặc bạn có thể sử dụng Windows Explorer để truy cập ổ đĩa chứa thư mục BORLANDC và vào thư mục đó.
BORLANDC, vào thư mục BIN, khởi động tập tin BC.EXE
Bạn gõ D:\BORLANDC\BIN\BC E:\BAITAP_BC\VIDU1.CPP
Câu lệnh trên khởi động BC và nạp tập tin VIDU1.CPP từ thư mục BAITAP_BC trên ổ đĩa E Nếu tập tin này không tồn tại, hệ thống sẽ tự động tạo mới nó.
Màn hình sau khi khởi động thành công:
Hình 8: Màn hình sau khi khởi động thành công
- Ấn phím F10 (kích hoạt menu), chọn menu File, chọn Quit;
- Hoặc ấn tổ hợp phím Alt-X
2.3 Các ví dụ đơn giản:
Hình 09: Màn hình ví dụ 1
Kết quả in ra màn hình:
Hình 10: Màn hình kết quả ví dụ 1
Dòng đầu tiên trong mã nguồn bắt đầu bằng /* và kết thúc bằng */ để chỉ ra rằng đây là phần chú thích, không được dịch hay thực thi khi chạy chương trình Mục đích của chú thích này là làm cho chương trình trở nên rõ ràng hơn, giúp người đọc dễ dàng hiểu được chức năng của mã khi xem lại sau này.
CÁC LỆNH CÓ CẤU TRÚC
Khái niệm về lệnh cấu trúc
3 Các tham số của hàm 2
4 Các lệnh đơn nhằm kết thúc hàm và nhận giá trị trả về cho tên hàm 2
CHƯƠNG 1 : TỔNG QUAN VỀ NGÔN NGỮ C
Mã chương: MH 09-01 Mục tiêu:
Sau khi học xong bài này sinh viên có khả năng:
- Hiểu được lịch sử phát triển của ngôn ngữ C
- Biết được ngôn ngữ này có ứng dụng như thế nào
- Biết cách khởi động được và thoát khỏi chương trình
- Sử dụng hệ thống trợ giúp từ help file
1 Giới thiệu về lịch sử phát triển của ngôn ngữ, sự cần thiết phải học ngôn ngữ C hiện nay
C là ngôn ngữ lập trình cấp cao, được sử dụng rất phổ biến để lập trình hệ thống cùng với Assembler và phát triển ứng dụng
Vào cuối thập kỷ 60 và đầu thập kỷ 70 của thế kỷ XX, Dennish Ritchie tại phòng thí nghiệm Bell đã phát triển ngôn ngữ C, dựa trên ngôn ngữ BCPL do Martin Richards giới thiệu năm 1967 và ngôn ngữ B do Ken Thompson phát triển vào năm 1970 Ngôn ngữ C đã được sử dụng để viết hệ điều hành UNIX đầu tiên trên máy PDP-7 và được cài đặt trên hệ điều hành UNIX của máy DEC PDP-11 Từ đó đến nay, ngôn ngữ C đã trở thành một trong những ngôn ngữ lập trình phổ biến nhất, nhờ vào việc xây dựng trên những thành tựu tiên tiến trong lĩnh vực tin học.
Hình 1: (Dennis Ritchie(trái) và Ken Thompson trước hệ thống PDP-11với 2 text-terminal
Hình 2: (Dennis Ritchie (trái) và Kernighan)
Hiện nay, ngôn ngữ lập trình C và C++ đang được giảng dạy phổ biến ở bậc trung học và đại học tại các nước Âu, Mỹ Dự đoán trong tương lai, ngôn ngữ C sẽ trở thành ngôn ngữ quốc tế trong lĩnh vực tin học, tương tự như vai trò của tiếng Anh trong giao tiếp toàn cầu.
Ngôn ngữ C sở hữu một thư viện hàm phong phú, vượt trội hơn hẳn so với các ngôn ngữ khác Điều này giúp lập trình viên tiết kiệm thời gian, chỉ cần truyền tham số vào các hàm đã có sẵn để nhận kết quả ngay lập tức, mà không cần phải viết lại chức năng tương tự.
Công việc lập trình ngày nay trở nên dễ dàng và nhanh chóng hơn, cho phép tạo ra nhiều sản phẩm ứng dụng chất lượng cao trong mọi lĩnh vực Ngôn ngữ C là lựa chọn lý tưởng để giải quyết các bài toán kỹ thuật phức tạp nhờ vào các toán tử điều khiển mạnh mẽ của nó.
Cấu trúc trong ngôn ngữ C cho phép mô tả các khối dữ liệu lớn, giúp giải quyết hiệu quả các bài toán quản lý và xử lý mô hình lựa chọn tối ưu Chương trình viết bằng C có khả năng chạy nhanh, gần tương đương với tốc độ của Assembler.
Ngôn ngữ C là một ngôn ngữ lập trình dễ học, với cú pháp ngắn gọn và cấu trúc rõ ràng, giúp người dùng dễ dàng phát hiện lỗi Sự đơn giản và hiệu quả của nó đã khiến ngôn ngữ C ngày càng được ưa chuộng, đặc biệt là trong cộng đồng học sinh và sinh viên Các đặc điểm cơ bản của ngôn ngữ C bao gồm tính dễ học, khả năng phát hiện lỗi nhanh chóng và cấu trúc lập trình rõ ràng.
+ Tính cô động (compact): C chỉ có 32 từ khóa chuẩn và 40 toán tử chuẩn, nhưng đều được biểu diễn bằng những chuỗi ký tự ngắn gọn
Ngôn ngữ lập trình C có tính cấu trúc rõ ràng với các chỉ thị như cấu trúc lựa chọn và lặp, giúp tổ chức các chương trình một cách mạch lạc và dễ hiểu.
C có tính tương thích cao nhờ vào tiền xử lý và thư viện chuẩn phong phú, giúp các chương trình viết bằng C vẫn hoạt động hoàn hảo khi chuyển từ máy tính này sang máy tính khác.
C là một ngôn ngữ lập trình linh động, cho phép nhiều cách thể hiện cú pháp khác nhau, giúp tối ưu hóa kích thước mã lệnh và cải thiện tốc độ chạy của chương trình.
Biên dịch (compile) cho phép ngôn ngữ C chuyển đổi nhiều tập tin chương trình riêng biệt thành các tập tin đối tượng (object) và liên kết chúng lại với nhau, tạo thành một chương trình có thể thực thi (executable) thống nhất.
2 Cách khởi động và thoát chương trình (Turbo C):
Giới thiệu môi trường làm việc của Turbo C:
- Turbo C do hãng Borland cung cấp
- Gồm các chức năng sau: soạn thảo chương trình, dịch, thực thi chương trình,…
- Phiên bản được sử dụng ở đây là Turbo C 3.0
- Đây là màn hình gọi Turbo C:
- Giao diện soạn thảo chương trình mới: vào menu File ->New
Hình 4: Giao diện soạn thảo chương trình mới
- Ghi chương trình đang soạn thảo vào đĩa:
- Sử dụng File->Save hoặc gõ phím F2
- Lệnh Save As để lưu lại chương trình với tên khác
Hình 5: Giao diện lưu chương trình mới
- Thực hiện chương trình, mở một chương trình và thoát:
+ Thực hiện chương trình: Nhấn Ctrl-F9 hoặc vào menu Run->Run
Hình 6: Giao diện thực hiện chương trình + Mở một chương trình có sẵn trên đĩa: Vào menu File->Open hoặc F3
Hình 7: Giao diện mở một chương trình có sẵn trên đĩa + Thoát khỏi Turbo C
Vào menu File->Exit hoặc Alt-X
- Các lệnh nằm trên menu Option:
Include directories: chứa các tập tin muốn đưa vào chương trình (file h trong dòng # include)
Library directories: Chứa tập tin thư viện (file lib)
Output directory: Chứa các tập tin ”đối tượng “ obj và exe sau khi chạy chương trình
Source directories: Chứa các tập tin nguồn (.obj và lib)
+ Environment: dùng để thiết lặp môi trường làm việc.
Hình 7: Giao diện thiết lặp môi trường làm việc
Để sử dụng lệnh BC tại dấu nhắc DOS, trước tiên bạn cần gõ "BC" và nhấn Enter, đảm bảo rằng đường dẫn đã được cài đặt đúng thông qua lệnh path, bao gồm cả thư mục chứa tập tin BC.EXE Nếu đường dẫn chưa được cài đặt, hãy xác định thư mục BORLANDC nằm trên ổ đĩa nào trước khi tiếp tục.
< ổ đĩa>:\BORLANDC\BIN\BC (Enter)
Để khởi động BC với một tập tin có tên tùy ý, bạn cần gõ lệnh: BC [đường dẫn] Nếu tập tin đã tồn tại, nó sẽ được nạp lên; nếu không, một tập tin mới sẽ được tạo ra.
Để khởi động tại Windows, bạn vào menu Start, chọn Run và gõ vào hộp Open một trong các dòng lệnh tương tự như khi nhập tại DOS Ngoài ra, bạn cũng có thể mở Windows Explorer, chọn ổ đĩa chứa thư mục BORLANDC và truy cập vào thư mục đó.
BORLANDC, vào thư mục BIN, khởi động tập tin BC.EXE
Bạn gõ D:\BORLANDC\BIN\BC E:\BAITAP_BC\VIDU1.CPP
Câu lệnh này khởi động BC và nạp tập tin VIDU1.CPP từ thư mục BAITAP_BC trên ổ đĩa E Nếu tập tin không tồn tại, hệ thống sẽ tự động tạo mới.
Màn hình sau khi khởi động thành công:
Hình 8: Màn hình sau khi khởi động thành công
- Ấn phím F10 (kích hoạt menu), chọn menu File, chọn Quit;
- Hoặc ấn tổ hợp phím Alt-X
2.3 Các ví dụ đơn giản:
Hình 09: Màn hình ví dụ 1
Kết quả in ra màn hình:
Hình 10: Màn hình kết quả ví dụ 1
/* Dòng đầu tiên trong mã nguồn bắt đầu bằng /* và kết thúc bằng */ để chỉ ra phần chú thích, không được dịch hay thực thi khi chạy chương trình Mục đích của chú thích này là làm cho chương trình trở nên rõ ràng hơn, giúp người đọc dễ dàng hiểu được chức năng của chương trình khi xem lại sau này */
Các lệnh cấu trúc rẽ nhánh như: if, switch
Cấu trúc rẽ nhánh là một thành phần quan trọng trong các ngôn ngữ lập trình, đặc biệt là trong C, nơi có hai loại chính: dạng không đầy đủ và dạng đầy đủ.
Quyết định sẽ thực hiện hay không thực hiện một khối lệnh
Cú pháp: if ()
Từ khóa if phải viết bằng chữ thường
kết quả công việc phải là đúng (≠0) hoặc sai (=0)
Nếu khối lệnh bao gồm 2 lệnh trở lên thì phải đặt trong dấu {}.
được thể hiện bằng 1 câu lệnh hay một khối lệnh
Kiểm tra biểu thức điều kiện trước
Nếu điều kiện đúng (!=0) thì thực hiện câu lệnh hay khối lệnh liền sau điều kiện
Nếu điều kiện không đúng, câu lệnh hoặc khối lệnh ngay sau điều kiện sẽ bị bỏ qua Các lệnh và khối lệnh tiếp theo vẫn được thực hiện bình thường vì chúng không phụ thuộc vào điều kiện của câu lệnh if.
Yêu cầu người thực hiện chương trình nhập vào một số thực a In ra màn hình kết quả nghịch đảo của a khi a ≠ 0
{ float a; printf("Nhap a = "); scanf("%f",&a); if (a !=0 ) printf("Nghich dao cua %f la %f",a,1/a); getch(); return 0;
Nếu chúng ta nhập vào a ≠ 0 thì câu lệnh printf ("Nghich dao cua %f la
%f",a,1/a) được thực hiện, ngược lại câu lệnh này không được thực hiện
- Lệnh getch() luôn luôn được thực hiện vì nó không phải là “lệnh liền sau” điều kiện if
Trong ví dụ 2, chương trình yêu cầu người dùng nhập vào hai số a và b Nếu a lớn hơn b, chương trình sẽ in ra thông báo “Giá trị của a lớn hơn giá trị của b” và hiển thị giá trị cụ thể của cả hai số trên màn hình.
{ int a,b; printf("Nhap vao gia tri cua 2 so a, b!"); scanf("%d%d",&a,&b); if (a>b)
{ printf("\n Gia tri cua a lon hon gia tri cua b"); printf("\n a=%d, b=%d",a,b);
Nếu chúng ta nhập vào giá trị của a lớn hơn giá trị của b thì khối lệnh:
{ printf("\n Gia tri cua a lon hon gia tri cua b"); printf("\n a=%d, b=%d",a,b);
Sẽ được thực hiện, ngược lại khối lệnh này không được thực hiện
Không đặt dấu chấm phẩy (;) sau câu lệnh if
Ví dụ: if;
Trình bien dịch không báo lỗi nhưng khối lệnh không được thực hiện cho dù điều kiện đúng hay sai.
Cú pháp: if (
Từ khóa if, else phải viết bằng chữ thường
kết quả Công việc 1, Công việc 2 phải là đúng (≠0) hoặc sai (=0)
Hình 3: Lưu đồ cú pháp
Nếu Công việc 1, Công việc 2 bao gồm từ 2 lệnh trở lên thì phải đặt trong dấu {}
Yêu cầu người thực hiện chương trình nhập vào một số thực a Nếu a khác 0, in ra màn hình kết quả nghịch đảo của a Ngược lại, khi a bằng 0, hiển thị thông báo “Không thể tìm được nghịch đảo của a”.
{ float a; printf("Nhap a = "); scanf("%f",&a); if (a !=0 ) printf("Nghich dao cua %f la %f",a,1/a); else printf(“Khong the tim duoc nghich dao cua a”); getch(); return 0;
Nếu chúng ta nhập vào a ≠ 0 thì câu lệnh printf ("Nghich dao cua %f la
%f",a,1/a) được thực hiện, ngược lại câu lệnh printf ("Khong the tim duoc nghich dao cua a") được thực hiện
Lệnh getch() luôn luôn được thực hiện
Trong ví dụ này, chương trình yêu cầu người dùng nhập vào hai giá trị a và b Nếu giá trị a lớn hơn b, chương trình sẽ hiển thị thông báo “Giá trị của a lớn hơn giá trị của b, giá trị của 2 số” Ngược lại, nếu a nhỏ hơn hoặc bằng b, thông báo sẽ là “Giá trị của a nhỏ hơn hoặc bằng giá trị của b, giá trị của 2 số”.
{ int a, b; printf("Nhap vao gia tri cua 2 so a va b !"); scanf("%d%d",&a,&b); if (a>b)
{ printf("\n a nho hon hoac bang b"); printf("\n a=%d b=%d",a,b);
} printf("\n Thuc hien xong lenh if"); getch(); return 0;
Nếu chúng ta nhập vào 40 30 thì kết quả hiện ra trên màn hình là a lon hon b a@ b0
Thuc hien xong lenh if
Còn nếu chúng ta nhập 40 50 thì kết quả hiện ra trên màn hình là a nho hon hoac bang b a@ bP
Thuc hien xong lenh if
Ví dụ 3: Yêu cầu người thực hiện chương trình nhập vào một số nguyên dương là tháng trong năm và in ra số ngày của tháng đó
Đoạn mã trên yêu cầu người dùng nhập vào một tháng trong năm và xác định số ngày của tháng đó Nếu tháng là 1, 3, 5, 7, 8, 10 hoặc 12, chương trình sẽ in ra rằng tháng đó có 31 ngày Nếu tháng là 4, 6, 9 hoặc 11, chương trình sẽ thông báo rằng tháng có 30 ngày Đặc biệt, nếu tháng là 2, chương trình sẽ xử lý riêng để xác định số ngày trong tháng này.
54 printf("\n Thang %d co 28 hoac 29 ngay",thg); else printf("Khong co thang %d",thg); printf("\n Thuc hien xong lenh if"); getch(); return 0;
Nếu chúng ta nhập vào một trong các số 1, 3, 5, 7, 8, 10, 12 thì kết quả xuất hiện trên màn hình sẽ là:
Thuc hien xong lenh if
Nếu chúng ta nhập vào một trong các số 4, 6, 9, 11 thì kết quả xuất hiện trên màn hình sẽ là:
Thuc hien xong lenh if
Nếu chúng ta nhập vào số 2 thì kết quả xuất hiện trên màn hình sễ là:
Thuc hien xong lenh if
Nếu chúng ta nhập vào số nhỏ hơn 0 hoặc lớn hơn 12 thì kết quả xuất hiện trên màn hình sẽ là:
Thuc hien xong lenh if
Trong đó là con số mà chúng ta đã nhập vào
Có thể sử dụng các câu lệnh if…else lồng nhau, trong đó else sẽ liên kết với if gần nhất mà chưa có else.
Khi sử dụng câu lệnh if mà không có else, cần phải đặt nó trong cặp dấu ngoặc nhọn {} để tạo thành khối lệnh Điều này giúp tránh những lỗi sai khi kết hợp với else if sau này.
Ví dụ 1: if ( so1>0) if (so2 > so3) a=so2; else /*else ca if (so2>so3) */ a=so3;
{ if (so2>so3) /*lenh if này không có else*/ a=so2;
} else /*else ca if (so1>0)*/ a=so3;
Sau else không có dấu chấm phẩy (;)
Trình biên dịch không báo lỗi, lệnh printf("a khac b\n"); không thuộc else
Các lệnh đơn nhằm kết thúc sớm vòng lặp
và nhận giá trị trả về cho tên hàm 2
Kiểm tra
3 Các tham số của hàm 2
4 Các lệnh đơn nhằm kết thúc hàm và nhận giá trị trả về cho tên hàm 2
CHƯƠNG 1 : TỔNG QUAN VỀ NGÔN NGỮ C
Mã chương: MH 09-01 Mục tiêu:
Sau khi học xong bài này sinh viên có khả năng:
- Hiểu được lịch sử phát triển của ngôn ngữ C
- Biết được ngôn ngữ này có ứng dụng như thế nào
- Biết cách khởi động được và thoát khỏi chương trình
- Sử dụng hệ thống trợ giúp từ help file
1 Giới thiệu về lịch sử phát triển của ngôn ngữ, sự cần thiết phải học ngôn ngữ C hiện nay
C là ngôn ngữ lập trình cấp cao, được sử dụng rất phổ biến để lập trình hệ thống cùng với Assembler và phát triển ứng dụng
Vào cuối thập kỷ 60 và đầu thập kỷ 70 thế kỷ XX, Dennish Ritchie tại phòng thí nghiệm Bell đã phát triển ngôn ngữ C, dựa trên ngôn ngữ BCPL của Martin Richards và ngôn ngữ B do Ken Thompson phát triển Ngôn ngữ C được sử dụng để viết hệ điều hành UNIX đầu tiên trên máy PDP-7 và sau đó được cài đặt trên hệ điều hành UNIX của máy DEC PDP-11 Đến nay, ngôn ngữ C đã trở thành một trong những ngôn ngữ lập trình phổ biến nhất, nhờ vào việc tích hợp các thành tựu mới nhất trong lĩnh vực tin học.
Hình 1: (Dennis Ritchie(trái) và Ken Thompson trước hệ thống PDP-11với 2 text-terminal
Hình 2: (Dennis Ritchie (trái) và Kernighan)
Hiện nay, ngôn ngữ lập trình C và C++ đang được giảng dạy phổ biến ở bậc trung học và đại học tại các nước Âu, Mỹ Dự đoán trong tương lai, ngôn ngữ C sẽ trở thành ngôn ngữ quốc tế trong lĩnh vực tin học, tương tự như vai trò của tiếng Anh trong giao tiếp toàn cầu.
Ngôn ngữ C sở hữu một thư viện hàm phong phú, vượt trội hơn hẳn so với các ngôn ngữ khác Lập trình viên chỉ cần truyền tham số vào các hàm này để nhanh chóng nhận được kết quả, tiết kiệm thời gian so với việc phải tự viết lại các chức năng tương tự.
Công việc lập trình trở nên dễ dàng và nhanh chóng, cho phép tạo ra nhiều sản phẩm ứng dụng chất lượng cao trong mọi lĩnh vực Ngôn ngữ C rất phù hợp để giải quyết các bài toán kỹ thuật phức tạp nhờ vào các toán tử điều khiển mạnh mẽ của nó.
Khái niệm cấu trúc trong ngôn ngữ C cho phép mô tả các khối dữ liệu lớn, giúp giải quyết hiệu quả các bài toán quản lý và xử lý các mô hình lựa chọn tối ưu Chương trình viết bằng C có thể chạy nhanh gần bằng ngôn ngữ Assembler.
Ngôn ngữ C là một ngôn ngữ lập trình dễ học, với cú pháp ngắn gọn và cấu trúc rõ ràng, giúp người dùng dễ dàng phát hiện lỗi Chính vì vậy, C ngày càng được ưa chuộng, đặc biệt là trong giới học sinh và sinh viên Một số đặc điểm cơ bản của ngôn ngữ C bao gồm tính đơn giản, hiệu quả và khả năng kiểm soát tốt.
+ Tính cô động (compact): C chỉ có 32 từ khóa chuẩn và 40 toán tử chuẩn, nhưng đều được biểu diễn bằng những chuỗi ký tự ngắn gọn
C là một ngôn ngữ lập trình có cấu trúc rõ ràng, bao gồm các chỉ thị như cấu trúc lựa chọn và lặp Điều này giúp các chương trình được viết bằng C trở nên dễ hiểu và tổ chức một cách hợp lý.
C có tính tương thích cao nhờ vào tiền xử lý mạnh mẽ và thư viện chuẩn phong phú, cho phép các chương trình viết bằng C hoạt động hoàn hảo khi chuyển từ máy tính này sang máy tính khác.
C là một ngôn ngữ lập trình linh động và uyển chuyển, cho phép nhiều cách thể hiện cú pháp khác nhau Điều này không chỉ giúp thu gọn kích thước mã lệnh mà còn làm cho chương trình chạy nhanh hơn.
Biên dịch trong ngôn ngữ C cho phép chuyển đổi nhiều tệp chương trình riêng lẻ thành các tệp đối tượng Sau đó, các tệp đối tượng này được liên kết với nhau để tạo thành một chương trình thực thi hoàn chỉnh.
2 Cách khởi động và thoát chương trình (Turbo C):
Giới thiệu môi trường làm việc của Turbo C:
- Turbo C do hãng Borland cung cấp
- Gồm các chức năng sau: soạn thảo chương trình, dịch, thực thi chương trình,…
- Phiên bản được sử dụng ở đây là Turbo C 3.0
- Đây là màn hình gọi Turbo C:
- Giao diện soạn thảo chương trình mới: vào menu File ->New
Hình 4: Giao diện soạn thảo chương trình mới
- Ghi chương trình đang soạn thảo vào đĩa:
- Sử dụng File->Save hoặc gõ phím F2
- Lệnh Save As để lưu lại chương trình với tên khác
Hình 5: Giao diện lưu chương trình mới
- Thực hiện chương trình, mở một chương trình và thoát:
+ Thực hiện chương trình: Nhấn Ctrl-F9 hoặc vào menu Run->Run
Hình 6: Giao diện thực hiện chương trình + Mở một chương trình có sẵn trên đĩa: Vào menu File->Open hoặc F3
Hình 7: Giao diện mở một chương trình có sẵn trên đĩa + Thoát khỏi Turbo C
Vào menu File->Exit hoặc Alt-X
- Các lệnh nằm trên menu Option:
Include directories: chứa các tập tin muốn đưa vào chương trình (file h trong dòng # include)
Library directories: Chứa tập tin thư viện (file lib)
Output directory: Chứa các tập tin ”đối tượng “ obj và exe sau khi chạy chương trình
Source directories: Chứa các tập tin nguồn (.obj và lib)
+ Environment: dùng để thiết lặp môi trường làm việc.
Hình 7: Giao diện thiết lặp môi trường làm việc
Để sử dụng lệnh BC tại dấu nhắc DOS, trước tiên bạn cần gõ "BC" và nhấn Enter, nhưng chỉ khi đường dẫn đã được cài đặt qua lệnh path, bao gồm đường dẫn đến thư mục chứa tập tin BC.EXE Nếu đường dẫn chưa được cài đặt, bạn cần xác định vị trí của thư mục BORLANDC trên ổ đĩa.
< ổ đĩa>:\BORLANDC\BIN\BC (Enter)
Để khởi động BC với một tập tin có tên do bạn đặt, hãy gõ lệnh: BC [đường dẫn] Nếu tập tin đã tồn tại, nó sẽ được nạp lên; nếu không, một tập tin mới sẽ được tạo ra.
Để khởi động tại Windows, bạn mở menu Start, chọn Run và nhập một trong các lệnh tương tự như trong DOS Hoặc bạn có thể vào Windows Explorer, tìm ổ đĩa chứa thư mục BORLANDC và truy cập vào thư mục đó.
BORLANDC, vào thư mục BIN, khởi động tập tin BC.EXE
Bạn gõ D:\BORLANDC\BIN\BC E:\BAITAP_BC\VIDU1.CPP
Lệnh trên khởi động BC và nạp tệp VIDU1.CPP từ thư mục BAITAP_BC trên ổ đĩa E Nếu tệp này không tồn tại, hệ thống sẽ tự động tạo mới.
Màn hình sau khi khởi động thành công:
Hình 8: Màn hình sau khi khởi động thành công
- Ấn phím F10 (kích hoạt menu), chọn menu File, chọn Quit;
- Hoặc ấn tổ hợp phím Alt-X
2.3 Các ví dụ đơn giản:
Hình 09: Màn hình ví dụ 1
Kết quả in ra màn hình:
Hình 10: Màn hình kết quả ví dụ 1
/* Dòng đầu tiên bắt đầu bằng /* và kết thúc bằng */ để chú thích, không được dịch hay thực thi lệnh khi chạy chương trình Mục đích của chú thích này là làm cho chương trình dễ hiểu hơn, giúp người đọc sau này nhận biết được chức năng của chương trình */
HÀM
Khái niệm hàm là gì, tại sao phải xây dựng và sử dụng hàm
3 Các tham số của hàm 2
4 Các lệnh đơn nhằm kết thúc hàm và nhận giá trị trả về cho tên hàm 2
CHƯƠNG 1 : TỔNG QUAN VỀ NGÔN NGỮ C
Mã chương: MH 09-01 Mục tiêu:
Sau khi học xong bài này sinh viên có khả năng:
- Hiểu được lịch sử phát triển của ngôn ngữ C
- Biết được ngôn ngữ này có ứng dụng như thế nào
- Biết cách khởi động được và thoát khỏi chương trình
- Sử dụng hệ thống trợ giúp từ help file
1 Giới thiệu về lịch sử phát triển của ngôn ngữ, sự cần thiết phải học ngôn ngữ C hiện nay
C là ngôn ngữ lập trình cấp cao, được sử dụng rất phổ biến để lập trình hệ thống cùng với Assembler và phát triển ứng dụng
Vào cuối thập kỷ 60 và đầu thập kỷ 70 của thế kỷ XX, Dennish Ritchie tại phòng thí nghiệm Bell đã phát triển ngôn ngữ C dựa trên BCPL và ngôn ngữ B Ngôn ngữ B được Ken Thompson phát triển từ BCPL vào năm 1970 khi viết hệ điều hành UNIX đầu tiên trên máy PDP-7, sau đó được cài đặt trên hệ điều hành UNIX của máy DEC PDP-11 Ngôn ngữ C đã trở thành một trong những ngôn ngữ lập trình phổ biến nhất nhờ vào những thành tựu mới nhất trong lĩnh vực tin học.
Hình 1: (Dennis Ritchie(trái) và Ken Thompson trước hệ thống PDP-11với 2 text-terminal
Hình 2: (Dennis Ritchie (trái) và Kernighan)
Hiện nay, ngôn ngữ lập trình C và C++ đang được giảng dạy phổ biến ở bậc trung học và đại học tại các nước Âu, Mỹ Dự đoán trong tương lai, ngôn ngữ C sẽ trở thành ngôn ngữ quốc tế trong lĩnh vực tin học, tương tự như vai trò của tiếng Anh trong giao tiếp toàn cầu.
Ngôn ngữ C sở hữu một thư viện hàm phong phú, vượt trội hơn hẳn các ngôn ngữ khác Lập trình viên chỉ cần truyền tham số vào các hàm này để nhanh chóng nhận được kết quả, tiết kiệm thời gian so với việc tự viết các chức năng tương tự.
Công việc lập trình trở nên dễ dàng và nhanh chóng hơn, cho phép tạo ra nhiều ứng dụng chất lượng cao trong các lĩnh vực khác nhau Ngôn ngữ C là lựa chọn lý tưởng để giải quyết các bài toán kỹ thuật phức tạp nhờ vào các toán tử điều khiển mạnh mẽ của nó.
Khái niệm cấu trúc trong ngôn ngữ C cho phép mô tả các khối dữ liệu lớn, giúp giải quyết hiệu quả các bài toán quản lý và xử lý mô hình lựa chọn tối ưu Chương trình viết bằng C có khả năng chạy nhanh gần như ngôn ngữ Assembler.
Ngôn ngữ C là một ngôn ngữ lập trình dễ học, với cú pháp ngắn gọn và cấu trúc rõ ràng, giúp người dùng dễ dàng phát hiện và sửa lỗi Chính vì lý do này, ngôn ngữ C ngày càng được ưa chuộng, đặc biệt trong giới học sinh và sinh viên Các đặc điểm cơ bản của ngôn ngữ C bao gồm tính đơn giản, khả năng kiểm soát tốt và hiệu suất cao trong lập trình.
+ Tính cô động (compact): C chỉ có 32 từ khóa chuẩn và 40 toán tử chuẩn, nhưng đều được biểu diễn bằng những chuỗi ký tự ngắn gọn
Ngôn ngữ lập trình C có cấu trúc rõ ràng với các chỉ thị như cấu trúc lựa chọn và lặp, giúp tổ chức chương trình một cách mạch lạc và dễ hiểu.
C có tính tương thích cao nhờ vào tiền xử lý và thư viện chuẩn phong phú, cho phép các chương trình viết bằng C hoạt động hoàn hảo khi chuyển từ máy tính này sang máy tính khác.
C là một ngôn ngữ lập trình linh động với cú pháp uyển chuyển, cho phép nhiều cách thể hiện khác nhau Điều này không chỉ giúp thu gọn kích thước mã lệnh mà còn tối ưu hóa tốc độ chạy của chương trình.
Biên dịch trong ngôn ngữ lập trình C cho phép chuyển đổi nhiều tập tin chương trình riêng lẻ thành các tập tin đối tượng Sau đó, quá trình liên kết sẽ kết hợp các đối tượng này lại với nhau để tạo thành một chương trình thực thi thống nhất.
2 Cách khởi động và thoát chương trình (Turbo C):
Giới thiệu môi trường làm việc của Turbo C:
- Turbo C do hãng Borland cung cấp
- Gồm các chức năng sau: soạn thảo chương trình, dịch, thực thi chương trình,…
- Phiên bản được sử dụng ở đây là Turbo C 3.0
- Đây là màn hình gọi Turbo C:
- Giao diện soạn thảo chương trình mới: vào menu File ->New
Hình 4: Giao diện soạn thảo chương trình mới
- Ghi chương trình đang soạn thảo vào đĩa:
- Sử dụng File->Save hoặc gõ phím F2
- Lệnh Save As để lưu lại chương trình với tên khác
Hình 5: Giao diện lưu chương trình mới
- Thực hiện chương trình, mở một chương trình và thoát:
+ Thực hiện chương trình: Nhấn Ctrl-F9 hoặc vào menu Run->Run
Hình 6: Giao diện thực hiện chương trình + Mở một chương trình có sẵn trên đĩa: Vào menu File->Open hoặc F3
Hình 7: Giao diện mở một chương trình có sẵn trên đĩa + Thoát khỏi Turbo C
Vào menu File->Exit hoặc Alt-X
- Các lệnh nằm trên menu Option:
Include directories: chứa các tập tin muốn đưa vào chương trình (file h trong dòng # include)
Library directories: Chứa tập tin thư viện (file lib)
Output directory: Chứa các tập tin ”đối tượng “ obj và exe sau khi chạy chương trình
Source directories: Chứa các tập tin nguồn (.obj và lib)
+ Environment: dùng để thiết lặp môi trường làm việc.
Hình 7: Giao diện thiết lặp môi trường làm việc
Để sử dụng lệnh BC tại dấu nhắc DOS, trước tiên bạn cần gõ BC và nhấn Enter, đảm bảo rằng đường dẫn đã được cài đặt đúng trong lệnh path, bao gồm thư mục chứa tập tin BC.EXE Nếu đường dẫn chưa được cài đặt, bạn cần xác định thư mục BORLANDC nằm ở ổ đĩa nào trước khi tiếp tục.
< ổ đĩa>:\BORLANDC\BIN\BC (Enter)
Để khởi động BC với một tập tin có tên do bạn đặt, hãy sử dụng lệnh: BC [đường dẫn] Nếu tập tin đã tồn tại, nó sẽ được nạp lên; nếu không, một tập tin mới sẽ được tạo ra.
Để khởi động tại Windows, bạn vào menu Start, chọn Run và gõ vào hộp Open một trong các dòng lệnh như khi nhập tại DOS Ngoài ra, bạn cũng có thể mở Windows Explorer, chọn ổ đĩa chứa thư mục BORLANDC và truy cập vào thư mục đó.
BORLANDC, vào thư mục BIN, khởi động tập tin BC.EXE
Bạn gõ D:\BORLANDC\BIN\BC E:\BAITAP_BC\VIDU1.CPP
Câu lệnh này khởi động BC và nạp tập tin VIDU1.CPP từ thư mục BAITAP_BC trên ổ đĩa E Nếu tập tin không tồn tại, nó sẽ được tạo mới.
Màn hình sau khi khởi động thành công:
Hình 8: Màn hình sau khi khởi động thành công
- Ấn phím F10 (kích hoạt menu), chọn menu File, chọn Quit;
- Hoặc ấn tổ hợp phím Alt-X
2.3 Các ví dụ đơn giản:
Hình 09: Màn hình ví dụ 1
Kết quả in ra màn hình:
Hình 10: Màn hình kết quả ví dụ 1
/* Dòng đầu tiên bắt đầu bằng /* và kết thúc bằng */ để chỉ ra rằng đây là phần chú thích, không được dịch và không thực thi lệnh nào khi chạy chương trình Mục đích của chú thích này là làm cho chương trình trở nên rõ ràng hơn, giúp người đọc dễ dàng hiểu được chức năng của chương trình khi xem lại sau này */
Nguyên tắc xây dựng và phân biệt các tham số của hàm
Do người lập trình tạo ra nhằm đáp ứng nhu cầu của mình
Cấu trúc của một hàm tự thiết kế:
< Kiểu dữ liệu > Tên hàm ( [ danh sách các tham số ] ) [ Khai báo kiểu dữ liệu cho các tham số ];
{ [Khai báo biến cục bộ và các câu lệnh thực hiện hàm]
- Kiểu dữ liệu: Nếu hàm phải trả về một giá trị thì trước hết phải khai báo kiểu dữ lệu của hàm
Tên hàm hợp lệ cần có 8 ký tự liên tiếp, và nên được đặt sao cho dễ nhớ, giúp thuận tiện cho việc sử dụng và chỉnh sửa sau này.
Danh sách tham số trong hàm, hay còn gọi là các biến hình thức, đóng vai trò quan trọng trong việc nhận giá trị thực khi hàm được gọi Khi có nhiều tham số, chúng ta cần sử dụng dấu phẩy để phân cách giữa các tham số này.
Khi khai báo kiểu cho các tham số trong hàm, mỗi tham số hình thức cần được chỉ định kiểu dữ liệu tương tự như khi khai báo biến Nếu có nhiều tham số có cùng kiểu dữ liệu, cần sử dụng dấu phẩy (,) để phân cách chúng.
- Thân hàm: Là phần giới hạn bởi cặp dấu ngoặc nhọn {} Trong thân hàm bao gồm:
Khai báo biến cục bộ chỉ ảnh hưởng trong phạm vi của hàm và không liên quan đến các biến trong các hàm khác Ngược lại, tham số hình thức được sử dụng để truyền dữ liệu giữa các hàm trong chương trình.
Trong thân hàm, bạn có thể sử dụng nhiều loại câu lệnh khác nhau tùy thuộc vào yêu cầu cụ thể, bao gồm các câu lệnh đơn giản, câu lệnh gán, biểu thức tính toán, cũng như các câu lệnh điều kiện và vòng lặp.
Trong thân hàm, bạn có thể sử dụng câu lệnh return với cú pháp return ([biểu thức]); Có thể sử dụng nhiều câu lệnh return ở các vị trí khác nhau, và cũng có thể không sử dụng câu lệnh này Giá trị của biểu thức trong câu lệnh return sẽ được gán cho hàm.
Cú pháp: return ; /*không trả về giá trị*/ return ; /*Trả về giá trị của biểu thức*/ return (); /*Trả về giá trị của biểu thức*/
Nếu hàm có kết quả trả về, ta bắt buộc phải sử dụng câu lệnh return trả về kết quả cho hàm
Ví dụ 1: Viết hàm tìm số lớn giữa 2 số nguyên a và b int max(int a, int b)
Để tìm ước chung lớn nhất (UCLN) giữa hai số nguyên a và b, ta ưu tiên xác định UCLN là số nhỏ hơn trong hai số đó Nếu số nhỏ hơn không phải là UCLN, ta sẽ giảm giá trị của nó đi một đơn vị và tiếp tục quá trình này cho đến khi tìm thấy UCLN Đoạn mã C dưới đây thực hiện điều này: ```cint ucln(int a, int b) { int u; if (a < b) u = a; else u = b; while ((a % u != 0) || (b % u != 0)) u ; return u; }```
Sau khi tạo lập các hàm, để sử dụng chúng trong chương trình chính, bạn chỉ cần gọi hàm bằng cách sử dụng tên hàm, có thể kèm theo hoặc không có các tham số thực.
([Danh sách các tham số])
Trước khi sử dụng một hàm thì bạn phải khai báo kiểu giá trị của nó như cú pháp sau đây:
Ví dụ: Viết chương trình cho phép tìm ước số chung lớn nhất của hai số tự nhiên
#include unsigned int ucln(unsigned int a, unsigned int b)
{ unsigned int u; if (a n; printf("Tat ca cac so nguyen to nho hon %d la: \n", n); if (n >= 2) { printf("%d ", 2);
Tat ca cac so nguyen to nho hon 100 la:
Bước 1: Mở phần mềm Dev C++
Bước 3: Biên dịch và chạy chương trình
5.2 Sinh viên thực hành khảo sát
Thực hiện trình tự theo các bước và điền kết quả vào bảng sau:
Thời gian thực hiện chương trình Số lỗi Kết quả chạy chương trình
Những trọng tâm cần chú ý trong bài
- Cách viết hàm và gọi hàm
- Truyền tham số cho hàm
Bài mở rộng và nâng cao
1 Viết chương trình C nhắc người dùng nhập 3 số nguyên và sau đó in các số nhỏ nhất và lớn nhất bởi sử dụng hàm trong C
2 Viết chương trình C để tính giai thừa của một số nguyên dương bởi sử dụng hàm trong C
Yêu cầu về đánh giá kết quả học tập chương 4
+ Về kiến thức: Trình bày được khái niệm hàm
+ Về kỹ năng: Sử dụng thành thạo hàm trong C
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc
+ Về kiến thức: Được đánh giá bằng hình thức kiểm tra viết, trắc nghiệm, vấn đáp
+ Về kỹ năng: Thực hiện việc gọi hàm
+ Năng lực tự chủ và trách nhiệm: Tỉ mỉ, cẩn thận, chính xác, ngăn nắp trong công việc
MẢNG
Trình bày khái niệm mảng trong C
Mỗi biến trong lập trình chỉ có thể lưu trữ một giá trị duy nhất, điều này gây khó khăn khi cần biểu diễn dãy số hoặc bảng số Để giải quyết vấn đề này, hầu hết các ngôn ngữ lập trình đã phát triển kiểu dữ liệu mảng, cho phép lưu trữ nhiều giá trị trong một cấu trúc duy nhất, giúp việc quản lý dữ liệu trở nên tiện lợi hơn.
Mảng là một tập hợp các phần tử đồng nhất về kiểu dữ liệu và được đặt chung một tên Mỗi phần tử trong mảng đại diện cho một giá trị cụ thể Số lượng kiểu dữ liệu (kiểu giá trị) xác định số lượng kiểu mảng tương ứng.
Ví dụ có các mảng sau : int a[10], b[4][2]
- Mảng a[10]: Mảng 1chiều, có 10 phần tử thuộc kiểu số nguyên (int) được đánh số như sau : a[0], a[1], a[9]
Như vậy mảng a có thể biểu diễn một dãy 10 phần tử, mỗi phần tử a[1] chứa 1 trị nguyên
- Mảng b[4][1]: Mảng 2 chiều b, có 8 phần tử thuộc kiểu nguyên (int) gồm 4 dòng, 2 cột được sắp xếp như sau: b[0][0] b[0][1] b[1][0] b[1][1] b[2][0] b[2][1] b[3][0] b[3][1]
Mỗi phần tử b[i][j] biểu diễn một giá trị kiểu nguyên
- Mảng X[5]: mảng 1 chiều X, có 5 phần tử thuộc kiểu số thực (float) được đánh số như sau:
Mỗi phần tử X[i] biểu diễn một giá trị kiểu số thực (float) Mảng X biểu diễn được 5 số thực
- Mảng y[3][3]: Mảng 2 chiều Y gồm 3 dòng, 3 cột, có 9 phần tử, mỗi phần tử y[i][j] chứa một giá trị kiểu số thực (float) được sắp xếp như sau: y[0][0] y[0][1] y[0][2] y[1][0] y[1][1] y[1][2] y[2][0] y[2][1] y[2][2]
Như vậy để xác định một mảng cần phải định rõ:
+ Kiểu dữ liệu của mảng: như int, float, double
+ Tên mảng: Là các ký tự từ a đến z, viết thường hoặc viết hoa
+ Số chiều và kích thước của mỗi chiều đặt trong cặp dấu ngoặc vuông [].
Cú pháp khai báo mảng và các cách gán giá trị cho mảng
Nếu xét dưới góc độ toán học, mảng 1 chiều giống như một vector Mõi phần tử của mảng một chiều có giá trị không phải là một mảng khác
2.1.1 Khai báo mảng với số phần tử xác định (khai báo tường minh):
; Ý nghĩa:
Tên mảng: đây là môt cái tên đặt đúng theo quy tắc đặt tên của danh biểu Tên này cũng mang ý nghĩa là tên biến mảng
Số phần tử: là một hằng số nguyên, cho bit số lượng phần tử tối đa trong mảng là bao nhiêu (hay kích thước của mảng là gì)
Kiểu dữ liệu của mọi phần tử trong mảng được xác định bởi kiểu mà chúng thuộc về Trong bài viết này, chúng ta sẽ khai báo một biến mảng với số lượng phần tử cụ thể Phần tử đầu tiên được truy cập qua tên mảng [0], trong khi phần tử cuối cùng có thể được truy cập bằng tên mảng [số phần tử - 1].
Ví dụ: int a[10]; /* Khai báo biến mang tên a, phần tử thứ nhất là a[0], phần tử cuối cùng là a[9].*/
Ta có thể coi mảng a là một dãy liên tiếp các phần tử trong bộ nhớ như sau:
2.1.2 Khai báo mảng với số phần tử không xác định (khai báo không tường minh):
Khi khai báo mảng mà không chỉ rõ số phần tử, kiểu khai báo này thường được sử dụng trong hai trường hợp: khi vừa khai báo vừa gán giá trị và khi mảng được khai báo như một tham số hình thức trong hàm.
Vừa khai báo vừa gán trị:
[]= {Các giá trị cách nhau bởi dấu phẩy};
Khi khai báo và gán giá trị cho mảng trong C, số phần tử của mảng sẽ được xác định dựa trên số giá trị được gán trong cặp dấu {} Để lấy số phần tử của mảng, chúng ta có thể sử dụng hàm sizeof().
Số phần tử=sizeof(tên mảng)/ sizeof(kiểu)
Ví dụ: vừa khai báo vừa gán trị cho mảng
Sau khi chạy chương trình, nhan được kết quả sau:
Khai báo mảng là tham số hình thức của hàm:
Trong trường hợp này không cần chỉ định số phần tử của mảng là bao nhiêu
( ,…);
2.1.3 Truy xuất đến từng phần tử của mảng:
Mỗi phần tử trong mảng được truy cập bằng tên biến và chỉ số trong dấu ngoặc vuông [ ] Ví dụ, a[0] đại diện cho phần tử đầu tiên của mảng a Chỉ số mảng là một biểu thức có giá trị kiểu số nguyên.
Với cách truy xuất mảng, tên biến mảng kết hợp với chỉ số có thể được xem như một biến có kiểu dữ liệu tương ứng với kiểu đã khai báo trong mảng.
Trong khai báo này, việc truy xuất các phần tử được chỉ ra trong hình 1 Chẳng hạn phần tử thứ 2 (có vị trí 1) là a[1]…
Ví dụ 2: Vừa khai báo và gán trị cho 1 mảng 1 chiều các số nguyên In mảng số nguyên này lên màn hình
Để hiển thị giá trị của n số nguyên từ một mảng, ta sử dụng hàm printf() với định dạng %d Cụ thể, để in ra n giá trị, cần gọi hàm printf() đúng n lần Do đó, việc sử dụng vòng lặp là cần thiết để in ra các phần tử trong mảng một cách hiệu quả.
Ta có đoạn chương trình sau:
{ int n,i,j,tam; int dayso[]={66,65,69,68,67,70}; clrscr(); n=sizeof(dayso)/sizeof(int); /*Lấy số phần tử*/ printf("\n Noi dung cua mang "); for (i=0;i0); printf("Dang nhi phan la: "); for(i=K-1;i>=0;i ) printf("%d",NhiPhan[i]); getch(); return 0;
Nhập vào một dãy n số và sắp xếp chúng theo thứ tự tăng là một bài toán quan trọng với nhiều ứng dụng thực tiễn Có nhiều giải thuật sắp xếp khác nhau, trong đó một phương pháp phổ biến là so sánh từng phần tử với các phần tử còn lại Cụ thể, bắt đầu từ phần tử đầu tiên, nếu nó lớn hơn phần tử đang so sánh, hai phần tử sẽ được hoán đổi vị trí Quá trình này tiếp tục với phần tử thứ hai so sánh với các phần tử từ thứ ba trở đi, và lặp lại cho đến phần tử thứ n-1.
Chương trình sẽ bao gồm ba hàm chính: Nhap (nhập các số), SapXep (sắp xếp) và InMang (in các số) Các tham số của các hàm này là một mảng không giới hạn số phần tử tối đa, tuy nhiên, cần phải chỉ định số phần tử thực tế được sử dụng trong mảng, đây là một giá trị nguyên.
#include void Nhap(int a[],int N)
{ printf("Phan tu thu %d: ",i);scanf("%d",&a[i]);
{ int t,i; for(i=0;i