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 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 từ BCPL năm 1970 khi viết hệ điều hành UNIX đầu tiên trên máy PDP-7 Ngôn ngữ C đã được cài đặt lần đầu trên hệ điều hành UNIX của máy DEC PDP-11 và từ đó trở thành ngôn ngữ lập trình phổ biến 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
Hiện nay, ngôn ngữ lập trình C và C++ đang được sử dụng rộng rãi trong giảng dạy ở bậc trung học và đại học tại các nước Âu, Mỹ Dự đoán rằng 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ú mà không ngôn ngữ nào có thể so sánh 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, giúp tạo ra nhiều ứ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 cho việc 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 bằng ngôn ngữ Assembly.
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ữ này 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 đã thu hút sự quan tâm của nhiều người.
+ 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 sở hữu một 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ý mạnh mẽ và thư viện chuẩn phong phú, giúp các chương trình viết bằng C duy trì sự 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.
Ngôn ngữ lập trình C nổi bật với tính linh động, cho phép người dùng sử dụng nhiều cách thể hiện khác nhau trong cú pháp Điều này không chỉ giúp thu gọn kích thước mã lệnh mà còn tăng tốc độ thực thi chương trình, mang lại hiệu suất cao hơn trong quá trình lập trình.
Biên dịch trong 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 đó, các tập tin đối tượng này được liên kết lại để tạo thành một chương trình thực thi 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, 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 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, hãy kiểm tra thư mục BORLANDC để xác định vị trí 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 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 giống 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 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 của mã nguồn bắt đầu bằng /* và kết thúc bằng */ để chỉ ra rằng đây là một chú thích Chú thích này không được dịch hay thực thi khi chương trình chạy, mà chỉ nhằm mục đích làm rõ nội dung của chương trình Việc ghi chú 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.
Dòng thứ hai của chương trình chứa chỉ thị 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 và sử dụng 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, và bạn có thể viết là main() hoặc void main() nhưng nên sử dụng void main() để 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(), với cặp dấu ngoặc () chỉ ra đây là khối hàm Từ khóa void đầu tiên cho biết hàm này không trả về giá trị, trong khi từ khóa void trong dấu ngoặc đơn cho biết hàm không nhận vào đối số.
+ 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à câu lệnh printf(“Bai hoc C dau tien.”);, có nhiệm vụ in ra chuỗi ký tự nằm trong dấu nháy kép (“”) Mỗi câu lệnh trong ngôn ngữ C 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 hãy ấ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ạy rất nhanh và không hiển thị kết quả Để xem kết quả, bạn ấn giữ phím Ctrl và gõ F5 Sau khi xem xong, hãy ấ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
Hình 12 hiển thị màn hình kết quả của chương trình Trong dòng bạn vừa sửa, ký hiệu "\n" được sử dụng để xuống dòng trong lệnh printf Dưới đây là một số ký hiệu khác.
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
Để cải thiện trải nghiệm khi chạy chương trình mà không cần phải nhấn tổ hợp phím Alt-F5 để xem kết quả, bạn có thể sửa đổi chương trình theo hướng dẫn sau đây.
Hình 15: Màn hình chương trình
Kết quả in ra màn hình
Để sử dụng hàm getch trong chương trình C, bạn cần khai báo thư viện bằng cách thêm dòng #include Việc này là cần thiết để chương trình hiểu và nhận diện hàm này; nếu không có khai báo, bạn sẽ gặp phải lỗi khi 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 để giữ cho chương trình dừng lại ở màn hình kết quả, cho đến khi người dùng nhấ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
Dòng thứ 7: int i; là lệnh khai báo biến, trong đó "i" là tên biến Biến là vị trí trong bộ nhớ dùng để lưu trữ giá trị cho chương trình Mỗi biến thuộc một kiểu dữ liệu, và trong trường hợp này, biến "i" có kiểu số nguyên (integer), được viết tắt là int.
Dòng thứ 9 trong mã lệnh sử dụng hàm scanf("%d", &i) để nhận dữ liệu từ người dùng Chuỗi định dạng "%d" chỉ định rằng người dùng cần nhập một số nguyên Đối mục thứ hai, &i, sử dụng toán tử địa chỉ (&) để cho phép hàm scanf lưu giá trị nhập vào 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
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 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 Ngôn ngữ C, lần đầu tiên được cài đặt trên hệ điều hành UNIX của máy DEC PDP-11, đã 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 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
Hiện nay, ngôn ngữ lập trình C và C++ đang được giảng dạy phổ biến tại các trường trung học và đại học ở châu Âu và Mỹ Dự đoán rằng trong tương lai, ngôn ngữ C sẽ trở thành ngôn ngữ quốc tế trong lĩnh vực công nghệ thông tin, 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ố để nhận kết quả ngay mà không cần phải 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 ứ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 phù hợp cho việc giải quyết 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 tốc độ của Assembler.
Ngôn ngữ C là một lựa chọn 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 lỗi Chính vì lý do nà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 dễ học, tính năng mạnh mẽ và khả năng lập trình hiệu quả.
+ 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 toàn tương thích 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 nhiều cách thể hiện cú pháp khác nhau Điều này giúp lập trình viên có thể tối ưu hóa kích thước mã lệnh, từ đó nâng cao hiệu suất và tốc độ chạy của chương trình.
Biên dịch trong ngôn ngữ 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 Quá trình này cũng bao gồm việc liên kết các tập tin đối tượng lại với nhau, tạo thành một chương trình có thể 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, 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 đường dẫn đến thư mục chứa tập tin BC.EXE Nếu chưa cài đặt, hãy xác định vị trí thư mục BORLANDC trên ổ đĩa của bạn và sau đó thực hiện lệnh cần thiết.
< ổ đĩ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 các dòng lệnh như trong DOS Hoặc bạn 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
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ỉ ra rằng đây là một chú thích trong chương trình Khi dịch và chạy chương trình, đoạn này sẽ không được dịch và không thực hiện lệnh nào Mục đích của việc ghi 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 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 are reserved words in C that programmers can utilize in their code according to the specific meanings of each term They are essential for declaring data types and writing statements It is important to note that keywords cannot be used as identifiers for custom names In Turbo C 3.0, the keywords include: asm, auto, break, case, cdecl, char, class, const, continue, default, delete, do, double, else, enum, extern, far, float, for, friend, goto, if, inline, int, interrupt, long, 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
Trong lập trình, khái niệm tên đóng vai trò quan trọng vì nó 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 trong quá trình thực hiện 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 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ú cho các đoạn mã là cần thiết để giúp người lập trình ghi nhớ, dễ hiểu và thuận tiện cho việc chỉnh sửa sau này Ghi chú không ảnh hưởng đến nội dung chương trình và sẽ bị bỏ qua trong quá trình biên dịch, được đánh dấu bằ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 lệnh printf để yêu cầu người dùng nhập tên: `printf("Xin cho biet ten cua ban !");` Sau đó, sử dụng scanf để đọc vào chuỗi tên: `scanf("%s", ten);` Cuối cùng, bạn có thể chào mừng người dùng bằng cách in ra tên họ: `printf("Xin chao ban %s\n", ten);`, và kết thúc bằng một lời chào đến với ngôn ngữ lập trình C: `printf("Chao mung ban den voi Ngon ngu lap trinh 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 này của Turbo C rất đa dạng và hữu ích.
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
Trong lập trình và xử lý văn bản, các ký tự đặc biệt như 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 (?) đều có vai trò quan trọng Cụ thể, trong hệ thống mã hóa, cơ số 8 tương ứng với ddd trong bảng, trong khi cơ số 16 tương ứng với HHH trong bảng.
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, hay còn 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ự, chúng ta sử dụng kiểu dữ liệu unsigned char Mỗi giá trị trong miền của 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
(Size) Miền giá trị (domain)
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 đều có miền giá trị và độ chính xác khác nhau Tùy thuộc vào nhu cầu sử dụng, bạn có thể khai báo biến thuộc một trong ba kiểu số thực này.
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 do lập trình viên định nghĩa và đặt tên thông qua khai báo Nó được sử dụng để chứa dữ liệu trong quá trình thực hiện chương trình và giá trị của biến có thể thay đổi Cách đặt tên biến tương tự như đã đề 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 phải 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 bắt buộc phải là chữ Khi đặt tên biến, cần tránh trùng 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, với n dao động từ 8 đến 32 ký tự Điều này cho phép người dùng tự do đặt tên biến, nhưng tên biến dài sẽ khó nhớ hơn.
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ú p há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, chúng ta khai báo bốn biến: a, b, c có kiểu dữ liệu int; chu_vi có kiểu long int; nua_chu_vi có kiểu float; và dien_tich có kiểu double.
Khi khai báo biến nên đặt theo quy tắc Hungarian Notation
Biến ituoi được khai báo với kiểu int, biến fTrongluong được khai báo với kiểu long, và hai biến ckitu1, 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 diện kiểu dữ liệu của biến Ví dụ, biến "ituoi" có kiểu int được thêm ký tự "i" ở đầu, trong khi biến "fTrongluong" có kiểu float được thêm ký tự "f" Nhờ đó, lập trình viên có thể nhanh chóng xác định kiểu dữ liệu mà không cần phải tra cứu phần khai báo.
Việc khai báo biến trong Turbo C và Pascal có sự khác biệt rõ rệt, dẫn đến nhiều bạn học lập trình Pascal gặp khó khăn khi chuyển sang Turbo C Để tránh nhầm lẫn, chúng tôi xin lưu ý những điểm khác nhau quan trọng giữa hai ngôn ngữ 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 không mong muốn Nếu không đặt biến ở vị trí thích hợp, lập trình viên có thể gặp phải hiệu ứng lề Có hai cách để xác định vị trí khai báo các biến trong C.
Các biến toàn cục được định nghĩa bên ngoài tất cả các hàm và ả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 khai báo trong hàm, chương trình chính hoặc một khối lệnh chỉ có tác dụng trong phạm vi của chúng Để đảm bảo tính rõ ràng và hiệu quả, các biến này cần được đặt ở đầu khối lệnh, trước khi thực hiện các lệnh gán hoặc 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 Việc khai báo biến sau một lệnh khác, như câu lệnh gán, sẽ dẫn đến lỗi.
/*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 sẽ có ý nghĩa và giá trị khác nhau Bạn cần chú ý điều này để 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 để đặt trùng tên cho các biến, giúp tiết kiệm bộ nhớ mà không lo lắng về việc sai giá trị của các biến Để 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
VD: 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);
Trong ngôn ngữ lập trình C, các toán tử cơ bản như +, -, *, và / hoạt động tương tự như trong các ngôn ngữ khác Chúng có thể được áp dụng cho hầu hết các kiểu dữ liệu được hỗ trợ trong C Đặc biệt, khi thực hiện phép chia (/) với số nguyên hoặc ký tự, phần dư sẽ bị loại bỏ, ví dụ, phép chia 5/2 sẽ cho kết quả là 2.
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, có sự khác biệt giữa tiền tố và hậu tố 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 thực hiện phép toán trước khi lấy giá trị 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ụ: khi x = 10 và 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
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 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 Ngôn ngữ C đã được cài đặt lần đầu tiên trên hệ điều hành UNIX của máy DEC PDP-11 và từ đó trở thành 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 của ngành 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
Hiện nay, ngôn ngữ lập trình C và C++ đang được giảng dạy rộng rãi ở các trường 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ố để nhận kết quả mà không cần phải 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, giú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 đặc biệ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ý mô hình lựa chọn tối ưu Chương trình viết bằng C có thể đạt tốc độ chạy gần như 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ữ này 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 phát triển phần mềm.
+ 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, 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 dễ hiểu và mạch lạc.
Ngôn ngữ lập trình C nổi bật với tính tương thích cao, nhờ vào việc sở hữu một 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 có thể dễ dàng chuyển giao và hoạt động một cách hoàn hảo trên nhiều máy tính khác nhau.
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 cú pháp đa dạng và linh hoạt Đ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 (compile) là quá trình cho phép ngôn ngữ lập trình C 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.
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 trong dấu nhắc DOS, bạn cần gõ "BC" và nhấn Enter, nhưng trước đó phải đảm bảo rằng đường dẫn đã được cài đặt bằng lệnh path và bao gồm 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 và sau đó nhập lệnh cần thiết.
< ổ đĩ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 mở 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ể 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
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.
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 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 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Ó 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
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 do Martin Richards giới thiệu năm 1967 và ngôn ngữ B của Ken Thompson, được 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 Ngôn ngữ C đã được cài đặt lần đầu tiên trên hệ điều hành UNIX của máy DEC PDP-11 và từ đó 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 kế thừa 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
Hiện nay, ngôn ngữ lập trình C và C++ được sử dụng rộng rãi trong giảng dạy ở bậc trung học và đại học tại các nước Âu, Mỹ Dự đoán rằng 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 hơn hẳn so với các ngôn ngữ khác Khi lập trình viên sử dụng các hàm trong C, họ chỉ cần cung cấp tham số và ngay lập tức nhận được kết quả, tiết kiệm thời gian và công sức so với việc tự viết 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 ứ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ó.
Ngôn ngữ C cho phép mô tả các khối dữ liệu lớn thông qua khái niệm cấu trúc, 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 ngôn ngữ C có thể chạy với hiệu suất 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 giúp người học dễ dàng phát hiện sai sót Chính vì lý do nà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 dễ học và khả năng phát hiện lỗi hiệu quả.
+ 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 thiết kế với tính 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 cho các chương trình viết bằng C trở nên tổ chức một cách mạch lạc và dễ hiểu hơn.
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 mượt mà 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 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 tăng tốc độ chạy của chương trình.
Biên dịch trong 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 đó liên kết 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 bằng 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 thư mục BORLANDC nằm ở ổ đĩa nào 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ên mà bạn đã đặt, hãy sử dụng lệnh: BC [đường dẫn] Nếu tập tin cần soạn thảo đã 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 dòng lệnh như trong DOS Hoặc bạn 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 rằng đây là phần chú thích Khi thực thi chương trình, phần này không được dịch hay thực hiện bất kỳ lệnh nào Mục đích của chú thích là làm cho mã nguồn dễ hiểu hơn, giúp người đọc có thể nắm bắt 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 yếu tố quan trọng và phổ biến trong các ngôn ngữ lập trình, đặc biệt là trong ngôn ngữ C C có hai loại cấu trúc rẽ nhá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 Tuy nhiên, các lệnh và khối lệnh tiếp theo vẫn sẽ đượ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ụ 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ẽ in ra thông báo “Giá trị của a lớn hơn giá trị của b” và hiển thị cụ thể giá trị của hai số này 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 và Công việc 2 có từ hai lệnh trở lên, cần đặt chúng trong dấu {} Ví dụ: yêu cầu người thực hiện chương trình nhập vào một số thực a Kết quả sẽ in ra màn hình giá trị nghịch đảo của a nếu a khác 0; nếu a bằng 0, chương trình sẽ 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 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 đó
Nhập vào tháng trong năm bằng cách sử dụng lệnh printf và scanf Nếu tháng là 1, 3, 5, 7, 8, 10 hoặc 12, tháng đó có 31 ngày Nếu tháng là 4, 6, 9 hoặc 11, tháng đó có 30 ngày Đối với tháng 2, số ngày sẽ khác nhau tùy thuộc vào năm nhuận hay không.
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âu lệnh if…else có thể được lồng nhau, cho phép xử lý nhiều điều kiện phức tạp Trong cấu trúc này, mỗi else sẽ liên kết với if gần nhất mà chưa có else đi kèm.
Khi câu lệnh if không có phần else, cần phải đặt nó trong cặp dấu {} để xác định rõ khối lệnh Điều này giúp tránh tình trạng kết hợp sai với else if.
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
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 năm 1970 Ngôn ngữ C được sử dụng rộng rãi nhờ những thành tựu tiên tiến trong lĩnh vực tin học, đặc biệt khi nó được áp dụng trong việc 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.
Hình 1: (Dennis Ritchie(trái) và Ken Thompson trước hệ thống PDP-11với 2 text-terminal
Ngôn ngữ lập trình C và C++ hiện đ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ỹ Trong tương lai, ngôn ngữ C dự kiến 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 phong phú các hàm mà không ngôn ngữ nào có thể so sánh Nhờ vào việc sử dụng các hàm này, lập trình viên chỉ cần truyền tham số để nhận kết quả ngay lập tức, tiết kiệm thời gian và công sức so với việc 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 ứ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ó 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, súc tích và cấu trúc rõ ràng, giúp dễ dàng phát hiện lỗi Do đó, 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 đã thu hút sự quan tâm của nhiều người.
+ 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ú, giúp các chương trình viết bằng C hoạt động mượt mà trên nhiều máy tính khác nhau.
Ngôn ngữ C nổi bật với tính linh động, cho phép người lập trình sử dụng nhiều cú pháp khác nhau, từ đó 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) là quá trình cho phép ngôn ngữ lập trình C 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.
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 thiết lập, 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 BC với một tập tin đã được đặt tên, 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, chọn Run và 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ể 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, 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 rằng đây là chú thích Những chú thích này không được dịch hay thực thi khi chạy chương trình, nhưng chúng giúp làm rõ nội dung của chương trình Việc ghi chú này rất hữu ích cho việc hiểu và theo dõi chức năng của chương trình khi bạn đọc lại sau này */
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
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à được cài đặt lần đầu tiên 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 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
Hiện nay, ngôn ngữ lập trình C và C++ đang được giảng dạy rộng rãi ở các trường 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 hiện nay.
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 sử dụng các hàm có sẵn, lập trình viên chỉ cần truyền tham số để nhận kết quả nhanh chóng, tiết kiệm thời gian so với việc 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 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ể hoạt động với tốc độ gần như 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ó cấu trúc rõ ràng giúp phát hiện sai lầm dễ dàng 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 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 quản lý bộ nhớ 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
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ú, cho phé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ữ lập trình C nổi bật với tính linh động, cho phép người dùng thể hiện cú pháp theo nhiều cách 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 (compile) là quá trình cho phép ngôn ngữ 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 sẽ được liên kết (link) lại với nhau để tạo thành một chương trình 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 hãy gõ BC và nhấn Enter, đảm bảo rằng đường dẫn đã được cài đặt bằng lệnh path, bao gồm thư mục chứa tập tin BC.EXE Nếu chưa cài đặt đường dẫn, 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 tên, 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, sau đó gõ vào hộp Open một trong các dòng lệnh như trong DOS Ngoài ra, bạn cũng có thể mở Window 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 khởi động BC sẽ 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.
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 mã nguồn bắt đầu bằng /* và kết thúc bằng */ để chỉ ra rằng đây là một chú thích Chú thích này không được dịch hay thực thi khi chương trình chạy, mà chỉ nhằm mục đích làm cho mã nguồn trở nên rõ ràng hơn Việc ghi chú 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ệ bao gồm 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 bao gồm các biến hình thức, nhận giá trị thực khi hàm được gọi Đối với nhiều tham số, hãy sử dụng dấu phẩy để phân cách chúng.
Khi khai báo kiểu cho các tham số trong hàm, cần chỉ định kiểu dữ liệu cho từng tham số giống như cách khai báo cho các biến Nếu có nhiều tham số có cùng kiểu dữ liệu, chúng phải được phân cách bằng dấu phẩy (,).
Thân hàm là phần được giới hạn bởi cặp dấu ngoặc nhọn {} và bao gồm khai báo biến cục bộ Các biến cục bộ chỉ có tác dụng trong thân hàm, không liên quan đến các biến trong các hàm khác của chương trình Ngược lại, tham số hình thức được sử dụng để trao đổi dữ liệu giữa các hàm.
Trong thân hàm, bạn có thể sử dụng nhiều loại câu lệnh khác nhau, từ câu lệnh đơn giản đến câu lệnh gán, biểu thức tính toán, câu lệnh điều kiện và vòng lặp, tùy thuộc vào yêu cầu cụ thể của từng tình huống.
Trong thân hàm, bạn có thể sử dụng câu lệnh return với cú pháp ([biểu thức]) Nhiều câu lệnh return có thể được áp dụng ở các vị trí khác nhau, và bạn 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 gọi UCLN là số nhỏ hơn trong hai số Nếu điều này không đúng, ta sẽ giảm số đó đi một đơn vị và tiếp tục giảm cho đến khi tìm được UCLN Dưới đây là mã nguồn hàm tìm UCLN: ```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 cần gọi hàm bằng cách sử dụng tên hàm, có thể kèm theo 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 Cnhắ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
Trong lập trình, mỗi biến chỉ có thể lưu trữ một giá trị duy nhất, điều này gây khó khăn khi muốn biểu diễn một dãy số hoặc bảng số Để khắc phục vấn đề này, hầu hết các ngôn ngữ lập trình đã phát triển một kiểu dữ liệu đặc biệt gọi là kiểu mảng, cho phép lưu trữ nhiều giá trị trong cùng một biến một cách thuận tiệ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 có mặt sẽ tương ứng với 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ột mảng xác định kiểu của tất cả các phần tử trong mảng đó Khi khai báo một biến mảng, số lượng phần tử được chỉ định, với phần tử đầu tiên được truy cập qua tên mảng[0] và phần tử cuối cùng qua 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ỉ định rõ số phần tử, kiểu khai báo này thường được sử dụng trong các trường hợp như vừa khai báo vừa gán giá trị, hoặc khi khai báo mảng là tham số hình thức của 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 tự động dựa trên số lượng 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 thông qua tên biến, theo sau là chỉ số trong dấu ngoặc vuông [ ] Ví dụ, a[0] là phần tử đầu tiên của mảng a đã được khai báo Chỉ số của phần tử mảng là một biểu thức có giá trị kiểu số nguyên.
Với phương pháp truy xuất này, tên biến mảng[chỉ số] có thể được xem như một biến có kiểu dữ liệu tương ứng với kiểu đã được khai báo trong định nghĩa của 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 Để in ra tất cả các phần tử, cần gọi hàm printf() đúng n lần Do đó, việc sử dụng một vòng lặp là cần thiết để in ra giá trị từng phần tử trong mảng.
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 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 có ứng dụng rộng rãi Có nhiều thuật toán sắp xếp khác nhau, trong đó một phương pháp đơn giản là so sánh từng phần tử với các phần tử còn lại 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 khi phần tử thứ n-1 được xử lý.
Chương trình được chia thành ba hàm chính: Nhap (Nhập các số), SapXep (Sắp xếp) và InMang (In các số) Các hàm này sử dụng một mảng không chỉ định rõ số phần tử tối đa, nhưng cần có thêm tham số để chỉ rõ 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;iSave 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, đảm bảo rằng đường dẫn đã được cài đặt thông qua 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, hãy xác định vị trí thư mục BORLANDC trên ổ đĩa của bạn và sau đó nhập lệnh cần thiết.
< ổ đĩ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, cò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 có thể vào menu Start, chọn Run, và gõ vào hộp Open các dòng lệnh 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 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ạ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 Khi thực thi chương trình, những dòng này không được dịch hoặc thực hiện bất kỳ lệnh nào Mục đích của chú thích là làm cho chương trình trở nên rõ ràng hơn, giúp người đọc hiểu chức năng của mã khi xem lại sau này */