Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 22 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
22
Dung lượng
270 KB
Nội dung
4 Khi viết giáo trình này chúng tôi ñã hết sức cố gắng ñể giáo trình ñược hoàn chỉnh, song chắc không tránh khỏi thiếu sót, vì vậy chúng tôi rất mong nhận ñược sự góp ý của ñộc giả. Các tác giả Chương 1 CÁC KHÁINIỆMCƠBẢN Chương này trình bầy các vấn ñề sau: - Cách sử dụng phần mềm Turbo C ++ 3.0 - Tóm lược về các phương pháp lậptrình cấu trúc và lậptrình hướng ñối tượng - Những mở rộng của C ++ so với C § 1. LÀM VIỆC VỚI 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.0). Sau khi cài ñặt (giả sử vào thư mục C:\TC) thì trong thư mục TC sẽ gồm cócác thư mục con sau: C:\TC\BGI chứa các tệp ñuôi BGI và CHR C:\TC\BIN chứa các tệp chương trình (ñuôi EXE) như TC, TCC, TLIB, TLINK, … C:\TC\INCLUDE chứa các tệp tiêu ñề ñuôi H C:\TC\LIB chứa các tệp ñuôi LIB, OBJ ðể vào môi trường của TC ++ chỉ cần thực hiện tệp chương trình TC.EXE trong thư mục C:\TC\BIN . Sau khi vào môi trường TC ++ chúng ta thấy vùng soạn thảo chương trình và hệ menu chính của TC ++ (gần 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ìnhtrong TC ++ cũng giống như trong TC, ngoại trừ ñiểm sau: Tệp chương trìnhtrong 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ìnhcó ñuôi là C. Trong TC ++ có thể thực hiện cả chương trình C và C ++ . § 2. NGÔN NGỮ C VÀ C ++ Có thể nói C ++ là 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, mọi kháiniệmtrong C ñều dùng ñược trong C ++ . Vì trong C ++ sử dụng gần như toàn bộ cáckhá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 5 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 tập trung vào cáckháiniệmlậptrình hướng ñối tượng cùng ngôn ngữ C ++ , và do ñó nó sẽ không trình bày lại các chủ ñề cơbảntrong ngôn ngữ C như các kiểu dữ liệu, các cấu trúc ñiều khiển, … Vì 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 quả sai khi chạy chương trình. Ví dụ khi biên dịch chương trình sau trong môi trường C sẽ không gặp các dòng cảnh báo (warning) và thông báo lỗi (error). Nhưng khi chạy sẽ nhận ñược kết quả sai. #include <stdio.h> void main() { float a,b,c,p,s; printf("\nNhap a, b, c "); scanf("%f%f%f",&a,&b,&c); p=(a+b+c)/2; s= sqrt(p*(p-a)*(p-b)*(p-c)); printf("\nDien tich = %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: Funtion ‘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: #include <math.h> #include <conio.h> § 3. LẬPTRÌNH CẤU TRÚC VÀ LẬPTRÌNH HƯỚNG ðỐI TƯỢNG 3.1. Phương pháp lậptrình cấu trúc 6 Tư tưởng chính của lậptrì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 (fuction). Trong C chỉ có một loại chương trình con là hàm. 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ó ñối và các biến, mảng cục bộ dùng riêng cho hàm. Việc trao ñổi dữ liệu giữa các hàm 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ậptrì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ậptrì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: void nhapsl(int n); Hàm do_dai dùng ñể tính ñộ dài ñoạn thẳng ñi qua 2 ñiểm có chỉ số là i 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.h> #include <conio.h> #include <math.h> float x[100], y[100]; float do_dai(int i, int j) { return sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2)); } void nhapsl(int n) { int i; for (i=1;i<=n;++i) { printf("\nNhap toa do x, y cua diem thu %d : ",i); scanf("%f%f", &x[i], &y[i]); 7 } } void main() { int n,i,j,imax,jmax; float d,dmax; printf("\nSo diem n = "); scanf("%d",&n); nhapsl(n); dmax=do_dai(1,2); imax=1; jmax=2; for (i=1;i<=n-1;++i) for (j=i+1;j<=n;++j) { d=do_dai(i,j); if (d>dmax) { dmax=d; imax=i; jmax=j; } } printf("\nDoan thang lon nhat co do dai bang: %0.2f",dmax); printf("\n Di qua 2 diem co chi so la %d va %d",imax,jmax); getch(); } 3.2. Phương pháp lậptrình hướng ñối tượng Kháiniệm trung tâm của lậptrì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 báo các thành phần dữ liệu // Khai báo các phương thức }; 8 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 hàm, ngoại trừ quy tắc sau: Khi xây dựng một phương thức bên ngoài ñịnh 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 dữ 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 dữ liệu, nên trong thân của phương thức có quyền truy nhập ñến các thành phần dữ 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. Từ kháiniệm lớp nẩy sinh hàng loạt kháiniệ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áckháiniệm về lớp, không cócáckháiniệm hàm. C ++ là ngôn ngữ lai, nó cho phép sử dụng cả các công cụ của lớp và hàm. ðể minh hoạ cáckháiniệm vừa nêu về lậptrì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 thẳng ñi 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áckhai báo biến, mảng có thể viết bất kỳ chỗ nào trong chương trình (tất nhiên phải trước khi sử dụng biến, mảng). #include <stdio.h> 9 #include <conio.h> #include <math.h> #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],2)); } void nhapsl(void); // khai báo phương thức }; void daydiem::nhapsl(void) // ñịnh nghĩa (xây dựng) phương thức { int i; printf("\nSo diem n = "); scanf("%d",&n); x=(float*)malloc((n+1)*sizeof(float)); y=(float*)malloc((n+1)*sizeof(float)); for (i=1;i<=n;++i) { printf("\nNhap toa do x, y cua diem thu %d : ",i); scanf("%f%f",&x[i],&y[i]); } } void main() { daydiem p; int n,i,j; int imax,jmax; float d, dmax; p.nhapsl(); n=p.n; dmax=p.do_dai(1,2); imax=1;jmax=2; 10 for (i=1;i<=n-1;++i) for (j=i+1;j<=n;++j) { d=p.do_dai(i,j); if (d>dmax) { dmax=d; imax=i; jmax=j; } } printf("\nDoan thang lon nhat co do dai bang: %0.2f",dmax); printf("\n Di qua 2 diem co chi so la %d va %d",imax,jmax); getch(); } § 4. MỘT SỐ MỞ RỘNG ðƠN GIẢN CỦA C ++ SO VỚI C Trong mục này trình bầy một số mở rộng của C ++ , tuy ñơn giản nhưng ñem lại khá nhiều tiện lợi. 4.1. Viết các dòng ghi chú Trong C ++ vẫn có thể viết các dòng ghi chú trongcá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. Ngoài 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ụ: int x,y ; // Khai báo 2 biến thực 4.2. 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> #include <alloc.h> 11 void main() { 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 { printf("\nX[%d]= ",i); scanf("%f",x+i); } for (i=1;i<=n-1;++i) for (int j=i+1;j<=n;++j) if (x[i]>x[j]) { float tg=x[i]; x[i]=x[j]; x[j]=tg; } printf("\nDay sau khi sap xep\n"); for (i=1;i<=n;++i) printf("%0.2f ",x[i]); } 4.3. 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. Ngoài ra C ++ cho phép viết một cách khác tiện lợi hơn như sau: Kiểu(biểu_thức) Ví dụ ñể in ra kết quả chính xác của phép chia hai biến nguyên (a chia cho b) trong C ++ ta cần thực hiện ép kiểu: printf("Ket qua = % ", float(a)/b); 4.4. Hằng có kiểu ðể tạo ra một hằng có kiểu, ta sử dụng từ khoá const ñặt trước một khai báo có khởi gán giá trị. Sau ñây là một số ví dụ: + Hằng nguyên: 12 const int maxsize = 1000; int a[maxsize] ; + Cấu trúc hằng: typedef struct { int x, y ; // Toạ ñộ của ñiểm int mau ; // Mã mầu của ñiểm } DIEM ; const DIEM d = {320, 240, 15}; Chương trình dưới ñây minh hoạ cách dùng hằng có kiểu. Chương trình tạo một cấu trúc hằng (kiểu DIEM) mô tả ñiểm giữa màn hình ñồ hoạ với mầu trắng. ðiểm này ñược hiển thị trên màn hình ñồ hoạ. #include <stdio.h> #include <graphics.h> #include <stdlib.h> typedef struct { int x,y; int mau; } DIEM; void main() { int mh=0, mode=0; initgraph(&mh,&mode,""); int loi=graphresult(); if (loi) { printf("\nLoi do hoa: %s",grapherrormsg(loi)); getch(); exit(0); } const DIEM gmh = {getmaxx()/2,getmaxy()/2,WHITE}; // khai bao hang putpixel(gmh.x, gmh.y, gmh.mau); closegraph(); } Chú ý: + Có thể dùng các hàm ñể gán giá trị cho các hằng có kiểu (trong chương trình trên dùng các hàm getmax và getmaxy). 13 + Mọi câu lệnh nhằm thay ñổi giá trị hằng có kiểu ñều bị báo lỗi khi biên dịch chương trình. Ví dụ nếu trong chương trình ñưa vào câu lệnh: gmh.x=200; thì khi dịch chương trình sẽ nhận ñược thông báo lỗi như sau: Cannot modify a const object 4.5. Các kiểu char và int Trong C một hằng ký tự ñược xem là nguyên do ñó nó có kích thước hai byte, ví dụ trong C: sizeof(‘A’) = sizeof(int) = 2 Còn trong C ++ một hằng ký tự ñược xem là giá trị kiểu char và có kích thước một byte. Như vậy trong C ++ thì: sizeof(‘A’) = sizeof(char) = 1 4.6. Lấy ñịa chỉ các phần tử mảng thực hai chiều Trong TC 2.0 không cho phép dùng phép & ñể lấy ñịa chỉ các phần tử mảng thực hai chiều. Vì vậy khi nhập dữ liệu cho một phần tử của ma trận thực (dùng scanf) ta phải nhập qua một biến trung gian sau ñó mới gán cho các phần tử mảng. Trong TC ++ 3.0 cho phép lấy ñịa chỉ các phần tử mảng thực hai chiều, do ñó có thể dùng scanf ñể nhập trực tiếp vào các phần tử mảng. Chương trình C ++ dưới ñây sẽ minh hoạ ñiều này. Chương trình nhập một ma trận thực cấp mxn và xác ñịnh phần tử có giá trị lớn nhất. #include <stdio.h> void main() { float a[20][20], smax; int m,n,i,j, imax, jmax; puts( "Cho biet so hang va so cot cua ma tran: ") ; scanf("%d%d",&m,&n) ; for (i=1;i<=m;++i) for (j=1;j<=n;++j) { printf("\na[%d][%d]= ",i,j); scanf("%f",&a[i][j]); // Lấy ñịa chỉ phần tử mảng thực hai chiều } [...]... i Ngư i cho các ñ i này, thì hàm s dùng giá tr m c ñ nh Hàm tr c tuy n (inline) ð i v i m t ño n chương trình nh (s l nh không l n) thì vi c thay các ño n chương trình này b ng các l i g i hàm s làm cho chương trình g n nh ñôi chút nhưng làm tăng th i gian máy Trongcác trư ng h p này có th dùng hàm tr c tuy n v a gi m kích thư c chương trình ngu n, v a không làm tăng th i gian ch y máy Các hàm trùng... xu t nh p ð in d li u ra màn hình và nh p d li u t bàn phím, trong C++ v n có th dùng các hàm printf và scanf (như ñã ch ra trong các chương trình C++ các m c trên) Ngoài ra trong C++ còn dùng toán t xu t ñ ñưa giá tr các bi u th c ra màn hình: cout > >> bi n; ð nh p m t d y không quá... Vi c dùng các phép toán thay cho m t l i g i hàm rõ ràng làm cho chương trình ng n g n, sáng s a hơn nhi u Ví d ñ th c hi n phép c ng 2 ma tr n n u dùng phép c ng và vi t: C=A+B; thì r t g n v i toán h c Trong C++ cho phép dùng các phép toán chu n ñ ñ t tên cho các hàm (g i là ñ nh nghĩa ch ng toán t ), sau ñó có th thay l i g i hàm b ng các phép toán như nói trên § 5 VÀO RA TRONG C++ 5.1 Các toán t... " ,imax, jmax) ; } 4.7 Hàm trong C++ Trong C++ có nhi u m r ng, c i ti n v hàm làm cho vi c xây d ng và s d ng hàm r t ti n l i ði u này s trình b y k trong chương sau Trong m c này ch th ng kê m t s ñi m m i v hàm mà C++ ñưa vào ð i ki u tham chi u Trong C, ñ nh n k t qu c a hàm qua các ñ i ta c n dùng ñ i con tr , làm cho vi c xây d ng cũng như s d ng hàm khá phi n ph c Trong C++ ñưa vào ñ i ki u... ñ nh nghĩa trong t p “new.h” Khi g p l i trong toán t new (c p phát không thành công) thì chương trình s th c hi n m t hàm nào ñó do con tr _new_handler tr t i Cách dùng con tr này như sau: + Xây d ng m t hàm dùng ñ ki m tra s thành công c a new + Gán tên hàm này cho con tr _new_handler Như v y hàm ki m tra s ñư c g i m i khi có l i x y ra trong toán t new ðo n chương trình ki m tra theo cách th nh... a m t ph n t delete [] px ; // Gi i phóng b nh c a c m ng 7.4 Các chương trình minh ho Chương trình th nh t minh ho cách dùng new ñ c p phát b nh ch a n thí sinh M i thí sinh là m t c u trúc g m các trư ng ht (h tên), sobd (s báo danh) và td (t ng ñi m) Chương trình s nh p n, c p phát b nh ch a n thí sinh, ki m tra l i c p phát b nh (dùng cách 1); sau ñó nh p n thí sinh, s p x p thí sinh theo th t gi... t chương trình nh p m t s t nhiên n Ki m tra xem n có ph i s nguyên t không Bài 2 Vi t chương trình nh p m t dãy s th c In các s dương trên m t dòng và các s âm trên dòng ti p theo Bài 3 Vi t chương trình nh p m t dãy s th c S p x p dãy s trên theo th t tăng d n Bài 4 Vi t chương trình nh p hai dãy s th c ñ u ñư c s p tăng d n Ghép hai dãy s trên thành m t dãy cũng ñư c s p tăng d n Bài 5 Trong m t... . ý c a ñ c giả. C c t c giả Chương 1 C C KHÁI NIỆM C BẢN Chương này trình bầy c c vấn ñề sau: - C ch sử dụng phần mềm Turbo C ++ 3.0 - Tóm lư c về c c. con sau: C: TCBGI chứa c c tệp ñuôi BGI và CHR C: TCBIN chứa c c tệp chương trình (ñuôi EXE) như TC, TCC, TLIB, TLINK, … C: TCINCLUDE chứa c c tệp tiêu