Chương 1 CÁC KHÁI NIỆM CƠ BẢN Chương này trỉnh bầy các vấn dé sau: - Cách sử dụng phan mém Turbo C** 3.0 - Tóm lược về các phương pháp lập trình cấu trúc và lập trình hướng đối tượng - Những mở rộng của C”” so với C § 1. LAM VIEC VOI TURBO C* 3.0 Các ví dụ trong giáo trình này được viết và thực hiện trên môi trường Turbo C†* (TC”” phiên bản 3. Sau khi cài đặt (giả sử vào thư mục C:WTC) thì trong thư mục _ TC sẽ gôm có các thư mục con sau: | C:TCOBGI chứa các tệp đuôi BGI và CHR C:TCWIN chứa các tệp chương trình (đuôi EXE) như TC, TCC, TLTIB, TLINK,. C:TTCWNCLUDE chứa các tệp tiêu đề đuôi H C:\TC\LIB chứa các tép dudi LIB, OBJ Để vào môi trường của TC** chi can thuc hién tép chuong trinh TC.EXE trong thu muc C:\TC\BIN.
Sau khi vao méi truéng TC** chung ta thay ving soan thao chương trình và hệ menu chính của TC** (gan giéng như hệ menu quen thuộc của Turbo C). Hệ menu của TC** gồm các menu: File, Edit, Search, Run, Compile, Debug, Project, Options, Window, Help. Cách soạn thảo, biên dịch và chạy chương trình trong TC”? cũng giống như trong TC, ngoại trừ điểm sau: Tệp chương trình trong hệ soạn thảo của TC”” có đuôi mặc định là CPP còn trong TC thì tệp chương trình có đuôi là C. Trong TC”* có thể thực hiện cả chương trình C và C””.
NGON NGU C VA C** Cé thé noi C** 1a sự mở rộng đáng kê của C. Điều đó có nghĩa là ngoài những khả năng mới của CỶ", mọi khả năng và khái niệm trong C đều dùng được trong C””. Vi trong C** sử dụng gần như toàn bộ các khái niệm, định nghĩa, các kiểu dữ liệu, các câu trúc lệnh, các hàm' và các công cụ khác của C, nên sẽ thuận lợi hơn nêu độc giả đã biết sử dụng tương đôi thành thạo ngôn ngữ C. Giáo trình này chủ yêu lập-' trung vào các khái niệm lập trình hướng đỗi tượng cùng ngôn ngữ C””, và do đó nó LTHDT & C**e 5 sẽ không trình bảy lại các chủ để cơ bản trong ngôn ngữ C như các kiểu đữ liệu, các cấu trúc điều khiển,.
Vi C”” là sự mở rộng của C, nên bản thân một chương trình C đã là chương trình C”. Tuy nhiên Trình biên dịch TC”” yêu cầu mọi hàm chuẩn dùng trong chương trình đều phải khai báo nguyên mẫu bằng một câu lệnh #include, trong khi điều này không bắt buộc đối với Trình biên dịch của TC. Trong C ta có thể dùng một hàm chuẩn mà bỏ qua câu lệnh #include để khai báo nguyên mẫu của hàm được dùng. Điều này không báo lỗi khi biên dịch, nhưng có thể dẫn đến kết qua sai khi chay chuong trinh.
Vi du khi biên dịch chương trình sau trong môi trường C sẽ không gap các dòng cảnh bão (waming) vàv thông báo lỗi (error). Nhưng khi chạy sẽ nhận được: kết quả sai. p=(atbjc)/2; s= sqrt(p*(p-a)*(p-b)*(p-©)); printf InDien tịch = %0.2f",s); getch(): } Nếu biên dịch chương trình này trong TC*” sẽ nhận được các thông báo lỗi sau: Error: F untion ‘sqrt’ should have a prototype Error: “Funtion ‘getch’ should have a prototype ĐỂ biến chương trình trên thành một chương trình Cˆ* cần + Đặt tên chương trình với đuôi CPP + Thêm hai câu lệnh #include để khai báo nguyên mẫu cho các hàm sqrt và getch:. LẬP TRÌNH CÁU TRÚC VÀ LẬP TRÌNH HƯỚNG ĐÓI TƯỢNG 3.
Phương pháp lập trình cấu trúc Tư tưởng chính của lập trình cấu trúc là tổ chức chương trình thành các chương trình con. Trong PASCAL có hai kiểu chương trình con là thủ tục (procedure) và hàm (function), Trong C chỉ có một loại chương trình con là hàm. 6s LTHĐT a ct Hàm là một đơn vị chương trình độc lập dùng để thực hiện một phần việc nào đó như: Nhập số liệu, in kết quả hay thực hiện một số tính toán. Hàm cần có các đối và các biến, mảng cục bộ dùng riêng cho hàm.
Việc trao đổi đữ liệu giữa các hàm được thực hiện thông qua các đối và các biến toàn bộ. Các ngôn ngữ như C, PASCAL là các ngôn ngữ cho phép triển khai phương pháp lập trình cấu trúc. Một chương trình cấu trúc gồm các cấu trúc dữ liệu (như biến, mảng, bản ghi, .) và các hàm, thủ tục. Nhiệm vụ chính của việc tổ chức thiết kế chương trình cầu trúc là tổ chức chương trình thành các hàm, thủ tục.
Ví dụ xét yêu cầu sau: Viết chương trình nhập toạ độ (x,y) của một dẫy điểm, sau đó tìm một cặp điềm cách xa nhau nhât. - Trên tư tưởng của lập trình cầu trúc có thể tổ chức chương trình như sau: + Sử dụng hai mảng thực toàn bộ x và y để chứa toạ độ dẫy điểm + Xây dựng hai hàm: Hàm nhapsl dùng để nhập toạ độ n điểm, hàm này có một đối là biến nguyên n và được khai báo như sau: vo¡d nhapsl(int n); Hàm do_ dai dùng dé tính độ dài đoạn thăng đi qua 2 điểm có chỉ số là ¡ và j , nó được khai báo như sau: float do_dai(int i, int j); Chương trình C cho bài toán trên được viết như sau: #include <stdio. dmax=do_dai(1,2); Imax= Í; jmax=2; for (i= ]|;1<=n-1;++1) for (=1+1;j<=n;++]) { d=do_dai(i,j); if (d>dmax) { dmax=d; imax=i; jmax=j; } printf("\nDoan thang lon nhat co do dai bang: %0. Phương pháp lập trình hướng đối tượng Khái niệm|trung tâm của lập trình hướng đối tượng là lớp (class).
Có thể xem lớp là sự kết hợp các thành phần dữ liệu và các hàm. Cũng có thể xem lớp là sự mở rộng của cấu trúc (Struct) trong C bằng cách đưa thêm vào các phương thức (methods) hay còn gọi là hàm thành viên (member functions). Một lớp được định nghĩa như sau: class Tên lớp { // Khai bao cac thanh phan dit liéu HIKhai báo các phương thức bi Các phương thức có thể được viết (xây dựng) bên trong hoặc bên ngoài (phía dưới) phần định nghiã lớp. Cách viết một phương thức tương tự như viết một ‘ham, ngoại trừ quy tắc sau: Khi xây dựng một phương thức bên ngoài định §eLTHĐT & C”” nghĩa lớp thì trong dòng đầu tiên cần dùng tên lớp và hai dấu hai chấm (::) đặt trước tên phương thức đề chỉ rõ phương thức đó thuộc lớp nào.
Vì phương thức và các thành phần đữ liệu thuộc cùng một lớp, hơn nữa phương thức được lập lên cốt để xử lý các thành phần đữ liệu, nên trong thân của phương thức có quyên truy nhập đến các thành phan đữ liệu (của cùng lớp). Sau khi định nghĩa một lớp, có thể dùng tên lớp để khai báo các biến kiêu lớp hay còn gọi là đối tượng. Mỗi đối tượng sẽ có các thành phần dữ liệu và các phương thức. Lời gọi một phương thức cần chứa tên đối tượng để xác định phương thức thực hiện từ đối tượng nào.
Một chương trình hướng đối tượng sẽ bao gồm các lớp có quan hệ với nhau. Việc phân tích, thiết kế chương trình theo phương pháp hướng đối tượng nhằm thiết kế, xây dựng các lớp và các quan hệ giữa các lớp đó. Từ khái niệm lớp nây sinh hàng loạt khái niệm khác như: Thành phần dữ liệu, phương thức, phạm vi, sự đóng gói, hàm tạo, hàm huỷ, sự thừa kế, lớp cơ sở, lớp dẫn xuất, tương ứng bội, phương thức ảo, Thiết kế hướng đôi tượng là tập trung xác định các lớp để mô tả các thực thể của bài toán. Mỗi lớp đưa vào các thành phần dữ liệu của thực thể và xây dựng luôn các phương thức để xử lý dữ liệu.
Như vậy việc thiết kế chương trình xuất phát từ các nội dụng các vấn để của bài toán. Các ngôn ngữ thuần tuý hướng đối tượng (như Smalltalk) chỉ hỗ trợ các khái niệm về lớp, không có các khái niệm hàm. C”” là ngôn ngữ lai, nó cho phép sử dung cả các công cụ của lớp và hàm. Để minh hoạ các khái niệm vừa nêu về lập trình hướng đối tượng ta trở lại xét bài toán tìm độ dài lớn nhất đi qua 2 điểm.
Trong bài toán này ta gặp một thực thể là dẫy điểm. Xây dựng lớp dãy điểm (daydiem), trong đó các thành phần dữ liệu của lớp dẫy điểm gồm: + Biến nguyên n là số điểm của dẫy + Con trỏ x kiểu thực trỏ đến vùng nhớ chứa dẫy hoành độ + Con trỏ y kiểu thực trỏ đến vùng nhớ chứa dẫy tung độ Các phương thức cần đưa vào theo yêu cầu bài toán gồm: + Nhập toạ độ một điểm + Tính độ dài đoạn thang di qua 2 điểm Dưới đây là chương trình viết theo thiết kế hướng đối tượng. Để thực hiện chương trình này nhớ đặt tên tệp có đuôi CPP. Xem chương trình ta thấy thêm một điều mới trong C°* là: Các khai báo biến, mảng có thể việt bat kỳ chỗ nào trong chương trình (tat nhiên phải trước khi sử dụng biên, mảng).h> LTHDT & C*+e9 #include <alloc.h> class daydiem { public:! int n; float *x, *y; float do_dai(int i, int j) { return sqrt(pow(x(i]-x{j],2)+pow(y[i]-y]j].
} void main() { daydiem p; int n,i,j; int imax,jmax; float d, dmax; p.do_dai(i,j); ‘if (d>dmax) { dmax=d; imax=i; Jmax=]; } } printf("\nDoan thang lon nhat co do dai bang: %0. MOT SO MO RONG DON GIAN CUA C* SO VOILC Trong muc nay trinh bay mét sé mé réng cua C**, tuy don gian nhung dem lai khá nhiều tiện lợi. Viết các dòng ghi chú Trong C” vẫn có thể viết các dòng ghi chú trong các dấu /* và */ như trong C. Cách viết này cho phép viết các ghi chú trên nhiều dòng hoặc trên một dòng.
ra trong C”” còn cho phép viết ghi chú trên một dòng sau hai dâu gạch chéo rất tiện lợi, ví dụ: _ intx,y; /Khai báo 2 biến thực 4. Khai báo linh hoạt Trong C tất cả các câu lệnh khai báo biến, mảng cục bộ phải đặt tại đầu khối: Do vậy nhiêu khi vị trí khai báo và vị trí sử dụng của biến khá xa nhau, gây khó khăn trong việc kiểm soát chương trình. C** đã khắc phục nhược điểm này băng cách cho phép các lệnh khai báo biến, mảng có thể đặt ở bất kỳ chỗ nảo trong chương trình trước khi các biến, mảng đó được sử dụng. Ví dụ chương trình nhập một dẫy số thực rồi sắp xếp theo thứ tự tăng dần có thể viết trong C”” như sau: | #include <stdio.h> ~ void main() { LTHDT & C**e 11 w — int n; // khai bao n printf "n So phan tu cua day n="); scanf( '%d",&n); float *x= (float*)malloc((n+1)*sizeof(float)); | for (int i=1;i<=n;++i) _ // khai bao i.
GIPxÚ) í float tg=x[i]; XI]: XU. Toán tử ép kiểu Toán tử này được viết trong C như sau: (Kiểu) biểu thức Trong Cả vẫn có thể dùng cách viết này.