Chương 1 TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH C/C++ 1. Lịch sử của ngôn ngữ lập trình C/C++ C được tạo bởi Dennis Ritchie ở Bell Telephone Laboratories vào năm 1972 để cho phép lập trình viên phát triển các ứng dụng hiệu quả hơn các ngôn ngữ lập trình hiện có tại thời điểm đó. Điểm mạnh và mềm dẻo của C cho phép các nhà phát triển ở Bell Labs tạo nên các ứng dụng phức tạp như hệ điều hành Unix. Vào năm 1983, học viện chuẩn quốc gia Mỹ (American National Standards Institute - ANSI) thành lập một tiểu ban để chuẩn hóa C được biết đến như ANSI Standard C.
Ngày nay, tất cả trình biên dịch C/C++ đều tuân theo ANSI Standard C. C++ được xây dựng trên nền tảng của ANSI Standard C. C++ là một ngôn ngữ lập trình hướng đối tượng mà bao hàm ngôn ngữ C ở trong nó. Trong giáo trình này chưa khảo sát phần lập trình hướng đối tượng của C++.
Phương pháp để giải quyết một bài toán Một chương trình máy tính được thiết kế để giải quyết một bài toán nào đó. Vì vậy, những bước cần để tìm kiếm lời giải cho một bài toán cũng giống như những bước cần để viết một chương trình. Các bước gồm: - Xác định yêu cầu của bài toán. - Nghĩ ra một phương cách (algorithm) để tìm lời giải.
- Thực hiện phương cách đó. - Kiểm tra kết quả để xem lời giải có đúng với yêu cầu của bài toán. Khoa Công Nghệ Thông Tin-Đại Học Công Nghệ Đồng Nái 6/156 Giáo trình Kỹ Thuật Lập Trình Khi viết một chương trình trong C/C++, đây là những bước được đề nghị: 1. Xác định mục đích của chương trình 2.
Nghĩ ra thuật toán phù hợp để giải quyết bài toán (dùng mã giả, lưu đồ,. Cài đặt (viết) thuật toán dùng ngôn ngữ lập trình C/C++ 4. Thực thi chương trình và kiểm thử (testing). Các bước trong chu trình phát triển chương trình Chu trình phát triển chương trình (program development cycle) có những bước sau đây.
Một trình soạn thảo văn bản được dùng để nhập mã nguồn (source code). Mã nguồn được biên dịch (compile) để tạo nên tập tin đối tượng (object file). Các tập tin đối tượng được liên kết (link) để tạo nên tập tin có thể thực thi (executable file). Thực hiện (run) chương trình để chỉ ra chương trình có làm việc đúng như đã định không.
Use (C-free, Borland C/C++ editor) editor Source code (.cpp files) Compile (bc.exe) source file Object code (.exe file) Library Link Executable files object file program Khoa Công Nghệ Thông Tin-Đại Học Công Nghệ Đồng Nái 7/156 Giáo trình Kỹ Thuật Lập Trình 3. Soạn thảo mã nguồn (source code editor) Mã nguồn là một tập các lệnh dùng để chỉ dẫn máy tính thực hiện công việc mong muốn. Tập tin mã nguồn được lưu trữ với phần phân loại. Biên dịch (compile) Tập tin mã nguồn được viết bằng những từ giống tiếng Anh nên dễ dàng để đọc và hiểu.
Tuy nhiên, máy tính không thể hiểu những từ này. Máy tính yêu cầu các chỉ dẫn nhị phân (binary) trong dạng thức của ngôn ngữ máy (machine language). Trước khi một chương trình được viết bằng ngôn ngữ cấp cao như C/C++ có thể thực thi trên máy tính, nó phải được biên dịch từ mã nguồn sang mã máy. Việc dịch này được thực hiện bởi một chương trình gọi là trình biên dịch (compiler).
Các chỉ dẫn ngôn ngữ máy được tạo bởi trình biên dịch được gọi là mã đối tượng (object code) và tập tin chứa chúng gọi là tập tin đối tượng. Tập tin đối tượng có cùng tên như tập tin mã nguồn nhưng có phần phân loại. Một compiler không dùng để viết code, thường được xây dựng dưới dạng ứng dụng command line. Có nhiều compiler khác nhau, đều phục vụ tốt cho người lập trình phổ thông.
Việc so sánh và đánh giá giữa các compiler này nằm ngoài nội dung của chương trình, học viên có thể tự tìm hiểu thêm. Một số compiler thông dụng: MS Visual C++ Compiler (Windows), GCC (Linux), MingW (Windows), Intel C++ Compiler (Linux, Windows, OS X), Borland C++ Compiler (Windows), … 3. Tạo tập tin thực thi (executable files) C/C++ có một thư viện hàm chứa mã đối tượng cho những hàm đã được tạo sẵn. Những hàm này thực hiện các tác vụ thường dùng như xóa màn hình (clrscr()), nhập một chuổi ký tự từ bàn phím Khoa Công Nghệ Thông Tin-Đại Học Công Nghệ Đồng Nái 8/156 Giáo trình Kỹ Thuật Lập Trình (gets()), tính căn bậc hai (sqrt()),.
mà chương trình được viết có thể sử dụng mà không phải viết lại. Tập tin đối tượng được tạo ra bởi trình biên dịch sẽ kết hợp với mã đối tượng của các hàm thư viện để tạo nên tập tin thực thi. Quá trình này được gọi là liên kết (linking), được thực hiện bởi một chương trình gọi là bộ liên kết (linker). Thực thi chương trình Khi chương trình nguồn được biên dịch và liên kết để tạo nên tập tin thực thi (có phần phân loại .exe), nó có thể thực thi trên máy tính tại dấu nhắc hệ thống.
Nếu chương trình hoạt động không đúng như yêu cầu, vấn đề có thể là do lỗi lập trình. Trong trường hợp này, chỉnh sửa chương trình nguồn, biên dịch lại và liên kết lại để tạo nên phiên bản mới của tập tin chương trình. Quá trình bốn bước này được lập đi lập lập cho đến khi tập tin thực thi thực hiện đúng yêu cầu của bài toán. Quá trình soạn thảo chương trình-thực thi thường phải nhờ đến một thành phần trợ giúp gỡ rối nếu chương trình có lỗi, được gọi là debugger.
Debugger giúp khảo sát và phân tích chương trình khi đang thực thi, cho phép chúng ta tạo điểm dừng chương trình (breakpoints) để xem giá trị các biến của chương trình… 4. Khảo sát một chương trình C/C++ đơn giản Khảo sát một chương trình đơn giản dùng để xuất ra màn hình dòng chữ Hello World! // my first program in C/C++ #include <conio.h> int main() { cout << "Hello World!"; //Output “Hello World!” getche(); Khoa Công Nghệ Thông Tin-Đại Học Công Nghệ Đồng Nái 9/156 Giáo trình Kỹ Thuật Lập Trình return 0; } Đây là chương trình đơn giản nhưng nó đã bao hàm những thành phần cơ bản mà mọi chương trình C/C++ đều có. Với ý nghĩa của từng dòng như sau: // my first program in C/C++ Đây là dòng chú thích, tất cả các dòng bắt đầu bằng hai dấu // được coi là các dòng chú thích, nó không ảnh hưởng đến hoạt động của chương trình, chỉ dùng để giải thích mã nguồn của chương trình.h> Các lệnh bắt đầu bằng dấu # được dùng cho các chỉ thị tiền xử lý (preprocessor). Trong ví dụ này, câu lệnh #include báo cho trình biên dịch biết cần phải gộp thư viện iostream.h là tập tin header chuẩn của C/C++, chứa các định nghĩa về nhập và xuất.
Hàm main() là điểm mà tất cả các chương trình C/C++ bắt đầu thực hiện. Nó không phụ thuộc vào vị trí của hàm, nội dung của nó luôn được thực hiện đầu tiên khi chương trình thực thi. Một chương trình C/C++ đều phải tồn tại một hàm main(). Hàm main() có thể có hoặc không có tham số.
Nội dung của hàm main() tiếp ngay sau phần khai báo chính thức được đặt trong cặp dấu ngoặc { }. cout << "Hello World!"; Đây là một lệnh nằm trong phần thân của hàm main. cout là một dòng (stream) xuất chuẩn trong C/C++ được định nghĩa trong thư viện iostream. Khi dòng lệnh này được thực thi, kết quả là chuổi "Hello World!" được xuất ra màn hình.
Dòng lệnh được kết thúc bằng dấu chấm phẩy (;). Khoa Công Nghệ Thông Tin-Đại Học Công Nghệ Đồng Nái 10/156 Giáo trình Kỹ Thuật Lập Trình getche(); Đây là một hàm thư viện dùng để chờ nhập một ký tự từ bàn phím. return 0; Lệnh return kết thúc hàm main và trả về giá trị biểu thức đi sau nó, trong trường hợp này là 0. Đây là một kết thúc bình thường của một chương trình không có lỗi trong quá trình thực hiện.
Chương trình trên có thể viết lại như sau: int main() { cout << " Hello World! "; getch(); return 0;} cũng cho cùng một kết quả. Các chú thích (comments) Các chú thích được các lập trình viên sử dụng để ghi chú hay mô tả trong các phần của chương trình. Trong C/C++ có hai cách để chú thích: Chú thích dòng: dùng cặp dấu //. Từ vị trí // đến cuối dòng được xem là chú thích Chú thích khối (chú thích trên nhiều dòng) dùng cặp /*.
Những gì nằm giữa cặp dấu này được xem là chú thích. Ví dụ: /* My second program in C/C++ with more comments Author: Novice programmer Date: 01/01/2008 */ #include <conio.h> int main() { cout << "Hello World! "; // output Hello World! cout << "I hate C/C++. getche(); return 0; } Khoa Công Nghệ Thông Tin-Đại Học Công Nghệ Đồng Nái 11/156 Giáo trình Kỹ Thuật Lập Trình Kết quả xuất của chương trình là: Hello World! I hate C/C++. Cấu trúc của một chương trình C/C++ Cấu trúc một chương trình C/C++ bao gồm các thành phần như: Các chỉ thị tiền xử lý, khai báo biến toàn cục, chương trình chính (hàm main),.
Khảo sát chương trình sau: /* fact.c Phần này thường dùng để mô Purpose: prints the factorials of tả mục đính chương trình, tác the numbers from 0 through 10 Author: Mr.Beginner giả, ngày viết, .h> Khai báo các tập tin thư viện Khai báo prototype của các int factorial(int n); hàm tự tạo int main() { int i; for(i=0; i<=10; i++) Hàm chính của chương trình cout<<i<<“!=“<<factorial(i); return 0; } /* This function computes the factorial of its parameter, returning it */ int factorial(int n) { int i, product; product = 1; Định nghĩa các hàm do người for (i=2;i<=n;i++) prod *= i; dùng tự xây dựng return product; } Khoa Công Nghệ Thông Tin-Đại Học Công Nghệ Đồng Nái 12/156 Giáo trình Kỹ Thuật Lập Trình 7. Các tập tin thư viện thông dụng Đây là các tập tin chứa định nghĩa các hàm thông dụng khi lập trình C/C++. Muốn sử dụng các hàm trong các tập tin header này thì phải khai báo #include <FileName.h> ở phần đầu của chương trình, với FileName.h là tên tập tin thư viện. Các tập tin thư viện thông dụng gồm: stdio.h : Tập tin định nghĩa các hàm vào ra trong chế độ DOS (DOS console) gồm các hàm clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(), clreol(), … math.h: Tập tin định nghĩa các hàm toán học gồm các hàm abs(), sqrt(), log(), log10(), sin(), cos(), tan(), acos(), asin(), atan(), pow(), exp(), … alloc.h: Tập tin định nghĩa các hàm liên quan đến việc quản lý bộ nhớ gồm các hàm calloc(), realloc(), malloc(), free(), farmalloc(), farcalloc(), farfree(), … io.h: Tập tin định nghĩa các hàm vào ra cấp thấp gồm các hàm open(), _open(), read(), _read(), close(), _close(), creat(), _creat(), creatnew(), eof(), filelength(), lock(), … 8.