Tài liệu Giáo trình Lập trình hướng đối tượng với C++ pptx

53 840 8
Tài liệu Giáo trình Lập trình hướng đối tượng với C++ pptx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Giáo trình Lập trình hướng đối tượng với C++ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ Trang 1 Mét sè tiÖn Ých vµ më réng cña C++ so víi C MỤC TIÊU CỦA BÀI NÀY GIÚP NGƯỜI HỌC  Nhập/xuất dữ liệu sử dụng toán tử cin và cout  Viết chú thích trên một dòng, khai báo biến ở mọi nơi, cấp phát và thu hồi bộ nhớ động sử dụng toán new và delete,  Giải các bài tập có sử dụng kỹ thuật chồng hàm, thâm số ngầm định. A/ TÓM TẮT LÝ THUYẾT - C++ là một sự mởi rộng của C, do đó có thể sử dụng một chương trình biên dịch C++ để dịch và thực hiện các chương trình viết bằng C - C yêu cầu các chú thích nằm giữa /* và */. C++ cho phép tạo một chú thích bắt đầu bằng “//” cho đến hết dòng - C++ cho phép khai báo tuỳ ý. Thậm chí có thể khai báo biến trong phần khởi tạo của câu lênh lặp for - C++ cho phép truyền tham số cho hàm bằng tham chiếu. Điều này tương tự như truyền tham biến cho chương trình con trong ngôn ngữ lập trình PASCAL. Trong lời gọi hàm ta dùng tên biến và biến đó sẽ được truyền cho hàm qua tham chiếu. Điều đó cho phép thao tác trực tiếp trên biến được truyền chứ không phải gián tiếp qua biến trỏ. - Toán tử new và delete trong C++ được dùng để quản lý bộ nhớ động thay vì các hàm cấp phát động của C - C++ cho phép người viết chương trình mô tả các giá trị ngầm định cho các tham số của hàm, nhờ đó hàm có thể được gọi với một danh sách các tham số không đủ. - Toán tử “::” cho phép truy nhập biến toàn cục khi đồng thời sử dụng biến cục bộ và toàn cục cùng tên. - Có thể định nghĩa các hàm cùng tên với các tham số khác nhau. Hai hàm cùng tên sẽ được phân biệt nhờ giá trị trả về và danh sách kiểu các tham số. B. MỘT SỐ LƯU Ý (Các lỗi thường gặp, một số thói quen lập trình tốt .)    Các lỗi thường gặp  Quên đóng */ cho các chú thích  Khai báo biến sau khi biến được sử dụng  Sử dụng lệnh return để trả về giá trị nhưng khi định nghĩa hàm lại mô tả hàm kiểu void hoặc ngược lại, quên câu lệnh này trong trường hợp hàm yêu cầu giá trị trả về.  Không có hàm nguyên mẫu cho các hàm  Bỏ qua khởi tạo cho các biến tham chiếu  Thay đổi giá trị của các hằng  Tạo các hàm cùng tên, cùng tham số.    Một số thói quen lập trình tốt  Sử dụng “//” để tránh lỗi không đóng */ khi chú thích nằm gọn trong một dòng.  Sử dụng các khả năng vào ra mới của C++ để chương trình dễ đọc hơn.  Đặt các khai báo biên lên đầu khối lệnh.  Chỉ dùng từ khoá inline với các hàm “nhỏ”,”không phức tạp”.  Sử dụng con trỏ để truyền tham số cho hàm khi cần thay đổi giá trị tham số, còn tham chiếu dùng để truyền các tham số có kích thước lớn mà không có nhu cầu thay đổi nội dung.  Tránh sử dụng biến cùng tên cho nhiều mục địch khác nhau trong chương trình. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ Trang 2 C/ BÀI TẬP MẪU Ví d 1: C++ chấp nhận hai kiểu chú thích. Các lập trình viên bằng C đã quen với cách chú thích bằng /*…*/. Trình biên dịch sẽ bỏ qua mọi thứ nằm giữa /*…*/. Xét chương trình sau : CT1_1.CPP /* Chương trình in các số từ 0 đến 9. */ #include <iostream.h> void main() { int I; for(I = 0; I < 10 ; ++ I)// 0 - 9 cout<<I<<"\n"; // In ra 0 - 9 } 1. 2. Mọi thứ nằm giữa /*…*/ từ dòng 1 đến dòng 3 đều được chương trình bỏ qua. Chương trình này còn minh họa cách chú thích thứ hai. Đó là cách chú thích bắt đầu bằng // ở dòng 8 và dòng 9. kết quả Nói chung, kiểu chú thích /*…*/ được dùng cho các khối chú thích lớn gồm nhiều dòng, còn kiểu // được dùng cho các chú thích một dòng. Ví d 2: Chương trình nhập vào hai số. Tính tổng và hiệu của hai số vừa nhập. CT1_2.CPP #include <iostream.h> void main() { int X, Y; cout<< "Nhap vao mot so X:"; LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ Trang 3 cin>>X; cout<< "Nhap vao mot so Y:"; cin>>Y; cout<<"Tong cua chung:"<<X+Y<<"\n"; cout<<"Hieu cua chung:"<<X-Y<<"\n"; } Ví d 3: Sử dụng toán tử xuất nhập để viết thực đơn cho chương trình: CT1_2.CPP #include <iostream.h> void menu() { cout<<” Menu \n”; cout<<”1. Cong viec 1\n”; cout<<”2. Cong viec 2\n”; cout<<”3. Cong viec 3\n”; cout<<”4. Ket thuc chuong trinh \n\n”; } void main() { int lc; do { // viet menu len man hinh menu(); //lay lua chon cout<<”Ban hay chon cong viec can thuc hien:1->4”;cin>>lc; switch(lc) { case 1:cout<<”Thuc hien cong viec 1\n”; break; case 2:cout<<”Thuc hien cong viec 2\n”; break; case 3:cout<<”Thuc hien cong viec 3\n”; break; } //lap cho den khi nguoi su dung lua chon 4 } while(lc!=4); } Ví d 4: Tìm lỗi sai của đoạn chương trình sau: int n; cin>>n; for(int i=0;i<n;i++) { int a[100]; cin>>a[i]; } for(i=0;i<n;i++) cout<<a[i]; Lời gải Chương trình bị lỗi trong vòng for thứ hai do biến mảng a không được định nghĩa. Mảng a được khai báo trong vòng for thứ nhất chỉ có tầm hoạt động trong vòng for đó mài thôi. Do vậy, chương trình không thể biết ở trong vòng lặp for thứ hai. Chú ý LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ Trang 4 biến nguyên i được khai báo trong dòng lệnh for có vị trí tương đương với việc khai báo i ở bên ngoài for. Vì vậy, trong vòng for thứ hai ta sử dụng biến i nhưng chương trình không báo lỗi. Ví d 5: Tìm lỗi sai cho các khai báo prototype hàm dưới đây (các hài này được khai báo trong cùng một chương trình) int func1(int); // (1) float func1(int); // (2) int func1(float); //(3) void func1(int=0,int); //(4) void func2(int,int=0); //(5) void func2(int); //(6) void func2(float); //(7) Lời gải: Trong định nghĩa chồng hàm, trình biên dịch phân biệt các hàm bởi kiểu dữ liệu trả ra của hàm mà chỉ phân biệt bởi danh sách tham số của hàm. Do vậy hàm 1 và hàm 2 bị định nghĩa chồng lên nhau và trình biên dịch báo lỗi. Giữa hàm 2 và hàm 3 không có lỗi bởi chúng khác nhau bởi kiểu dữ liệu của tham số. Trong hàm 4 ta đã sử dụng sai cách truyền giá trị mặc định cho tham số. Không báo giờ truyền giá trị mặc định cho một tham số trước một tham số không được truyền giá trị ngầm định. Trong cách định nghĩa hai hàm 5 và 6 có sự nhập nhằng. Khi ta gọi hàm func2 với tham số là một số nguyên thì trình biên dịch không biết là sẽ gọi hàm 5 hay hàm 6 bởi vì cả hai hàm này đều được. Trong trường hợp này trình biên dịch cũng thông báo lỗi. Ví dụ 6: Tìm lỗi sai(lỗi cú pháp và bộ nhớ) cho chương trình sau: int & refl() { int a=5; return a; } int & rè2(int a) { a++; return a; } int & ref3(int & a) { a++; return a; } int a=5; int &r1; int & r2=22; int &r3=a; int &r4=ref3(5); int &r5=ref3(a); Trả lời: Trong các hàm có kết quả trả về là một tham chiếu, chúng ta luôn phải chú ý rằng biến được trả lại có giá trị là tham chiếu không bị xoá khoải bộ nhớ chương trình khi kết thúc thực hiện hàm. Do vậy hai hàm ref1 và ref2 là sai bởi vì nó trả về tham chiếu tới biên mà a lại là biến cục bộ trong ref1 và là tham số trong ref2 chỉ được tạo ra tạm thời LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ Trang 5 trên stack khi gọi hàm và xoá khỏi stack khi kết thúc hàm. Hàm ref3 không có lỗi vì a là một tham chiếu tới một biến không nằm trong hàm. Trong khái báo các tham chiếu phải được gắn với một biến nào đó trong bộ nhớ. Do vậy các khai báo r1, r2 là sai. Lời gọi ref3(5) cũng là sai bởi vì tham số cho hàm phải là tham chiếu đến một biến, trong khi đó ta lại truyền vào hằng số. Ví dụ 7: Cho biết kết quả thực hiện chương trình sau: #include <iostream.h> int & foo(int &a,int b) { b+=a; if (b>5) a++; return a; } void main() { int i=2,j=4; int k=foo(i,j); k++; cout<<i<<” “<<j<<” “<<k<<endl; int &l=foo(i,j); l++ ; cout<<i<<” “<<j<<” “<<l<<endl; } Lời gải: Trong chương trình trên cần chú ý hai điểm. Thiứ nhất là ta truyền vào cho hàm tham chiếu của biến i chứ không phải biến i. Do vậy, mọi thay đổi của tham số này trong hàm là thay đổi tới biến i được tham chiếu tới. Tương tự như vậy với tham chiếu l. Tham chiếu l được xác lập bằng tham chiếu trả ra của hàm chính là tham chiếu tới biến i. Do vậy mọi thay đổi l chính là thay đổi i. Ví dụ 8: Viết một hàm hoanvi dùng để hoán vị hai số nguyên. Sau đó viêt chương trình nhập và sắp xếp một mảng số nguyên. Trả lời: CT1_8.CPP #include <iostream.h> void hoanvi(int &a,int &b) { int tam=a; a=b; b=tam; } void main() { // Nhap du lieu int n; cout<<” Ban hay cho so phan tu cua mang n=”;cin>>n; //Cap phat bo nho cho mang int *a=new int(n); cout<<”\n Hay nhap gia tri cho cac phan tu cua mang \n”; for(int i=0;i<n;++i) { cout<<”a[“<<i<<”]=”;cin>>a[i]; } // Sap xep for(i=0;i<n-1;i++) for(int j=i++;j<n;j++) LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ Trang 6 if (a[i]>a[j]) hoanvi(a[i],a[j]); // In ket qua cout<<”\n Cac phan tu cua mang sau khi da sap xep la \n”; for(i=0;i<n;i++) cout<<a[i]<<” “; delete a; } Ví dụ 9: Chương trình tạo một mảng động, khởi động mảng này với các giá trị ngẫu nhiên và sắp xếp chúng. CT1_9.CPP #include <iostream.h> #include <time.h> #include <stdlib.h> void main() { int N; cout<<"Nhap vao so phan tu cua mang:"; cin>>N; int *P=new int[N]; if (P==NULL) { cout<<"Khong con bo nho de cap phat\n"; } srand((unsigned)time(NULL)); for(int I=0;I<N;++I) P[I]=rand()%100; //Tạo các số ngẫu nhiên từ 0 đến 99 cout<<"Mang truoc khi sap xep\n"; for(I=0;I<N;++I) cout<<P[I]<<" "; for(I=0;I<N-1;++I) for(int J=I+1;J<N;++J) if (P[I]>P[J]) { int Temp=P[I]; P[I]=P[J]; P[J]=Temp; } cout<<"\nMang sau khi sap xep\n"; for(I=0;I<N;++I) cout<<P[I]<<" "; delete []P; } kết quả LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ Trang 7 Ví dụ 10: Chương trình cộng hai ma trận trong đó mỗi ma trận được cấp phát động. Chúng ta có thể xem mảng hai chiều như mảng một chiều như hình 1.2 dưới đây Hình 1.2: Mảng hai chiều có thể xem như mảng một chiều. Gọi X là mảng hai chiều có kích thước m dòng và n cột. A là mảng một chiều tương ứng. Nếu X[i][j] chính là A[k] thì k = i*n + j Chúng ta có chương trình như sau : CT1_10.CPP #include <iostream.h> #include <conio.h> //prototype void AddMatrix(int * A,int *B,int*C,int M,int N); int AllocMatrix(int **A,int M,int N); void FreeMatrix(int *A); void InputMatrix(int *A,int M,int N,char Symbol); void DisplayMatrix(int *A,int M,int N); int main() { int M,N; int *A = NULL,*B = NULL,*C = NULL; clrscr(); cout<<"Nhap so dong cua ma tran:"; cin>>M; cout<<"Nhap so cot cua ma tran:"; cin>>N; //Cấp phát vùng nhớ cho ma trận A if (!AllocMatrix(&A,M,N)) { //endl: Xuất ra kí tự xuống dòng (‘\n’) cout<<"Khong con du bo nho!"<<endl; return 1; } //Cấp phát vùng nhớ cho ma trận B if (!AllocMatrix(&B,M,N)) { LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ Trang 8 cout<<"Khong con du bo nho!"<<endl; FreeMatrix(A);//Giải phóng vùng nhớ A return 1; } //Cấp phát vùng nhớ cho ma trận C if (!AllocMatrix(&C,M,N)) { cout<<"Khong con du bo nho!"<<endl; FreeMatrix(A);//Giải phóng vùng nhớ A FreeMatrix(B);//Giải phóng vùng nhớ B return 1; } cout<<"Nhap ma tran thu 1"<<endl; InputMatrix(A,M,N,'A'); cout<<"Nhap ma tran thu 2"<<endl; InputMatrix(B,M,N,'B'); clrscr(); cout<<"Ma tran thu 1"<<endl; DisplayMatrix(A,M,N); cout<<"Ma tran thu 2"<<endl; DisplayMatrix(B,M,N); AddMatrix(A,B,C,M,N); cout<<"Tong hai ma tran"<<endl; DisplayMatrix(C,M,N); FreeMatrix(A);//Giải phóng vùng nhớ A FreeMatrix(B);//Giải phóng vùng nhớ B FreeMatrix(C);//Giải phóng vùng nhớ C return 0; } //Cộng hai ma trận void AddMatrix(int *A,int *B,int*C,int M,int N) { for(int I=0;I<M*N;++I) C[I] = A[I] + B[I]; } //Cấp phát vùng nhớ cho ma trận int AllocMatrix(int **A,int M,int N) { *A = new int [M*N]; if (*A == NULL) return 0; return 1; } //Giải phóng vùng nhớ void FreeMatrix(int *A) { if (A!=NULL) delete [] A; } //Nhập các giá trị của ma trận void InputMatrix(int *A,int M,int N,char Symbol) { for(int I=0;I<M;++I) for(int J=0;J<N;++J) { cout<<Symbol<<"["<<I<<"]["<<J<<"]="; cin>>A[I*N+J]; } } //Hiển thị ma trận void DisplayMatrix(int *A,int M,int N) { LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ Trang 9 for(int I=0;I<M;++I) { for(int J=0;J<N;++J) { out.width(7);//Hien thi canh le phai voi chieu dai 7 ky tu cout<<A[I*N+J]; } cout<<endl; } } kết quả D/ BÀI TẬP TỰ GIẢI Câu hỏi trắc nghiệm Câu 1: Cho biết giá trị của k sau khi thực hiện đoạn chương trình int i=5,k; { int i=6; ::i--; k=i; } k-=i; Với các kết quả: a) k=0 b) k=1 c) k=2 d)k=3 Câu 2: Tìm lời gọi hàm sai cho hàm sau: void func(int i=0,int j=0); a)func() b)dunc(1); [...]... cú m t giỏ tr m c nh Trang 13 L P TRèNH H NG I T NG V I C++ Đối tợng và lớp (Class and Object) M C TIấU C A BI NY GIP NG I H C Phõn tớch c khỏi ni m úng gúi d li u Khai bỏo v s d ng m t l p Khai bỏo v s d ng i t ng S d ng hm thi t l p v hm hu b Khai bỏo v s d ng hm thi t l p sao chộp Vai trũ c a hm thi t l p ng m nh A/ NH C L I Lí THUY T Trong C++, tờn c u trỳc l m t ki u d li u khụng c n kốm theo... x=3,y=2 x=3,y=3 Bi t p t gi i Bi 1.1: Anh (ch ) hóy vi t l i chng trỡnh sau b ng cỏch s nh p/xu t trong C++ d ng l i cỏc dũng /* Chng trỡnh tỡm m u chung nh nh t */ #include void main() { int a,b,i,min; printf("Nhap vao hai so:"); scanf("%d%d",&a,&b); min=a>b?b:a; Trang 10 L P TRèNH H NG I T NG V I C++ for(i = 2;i . Giáo trình Lập trình hướng đối tượng với C++ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ Trang 1 Mét sè tiÖn Ých vµ më réng cña C++ so víi C MỤC. chương trình. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++ Trang 2 C/ BÀI TẬP MẪU Ví d 1: C++ chấp nhận hai kiểu chú thích. Các lập trình viên bằng C đã quen với cách

Ngày đăng: 22/12/2013, 10:16

Hình ảnh liên quan

Chúng ta có thể xem mảng hai chiều như mảng một chiều như hình 1.2 dưới đây - Tài liệu Giáo trình Lập trình hướng đối tượng với C++ pptx

h.

úng ta có thể xem mảng hai chiều như mảng một chiều như hình 1.2 dưới đây Xem tại trang 8 của tài liệu.
Hình 1.2: Mảng hai chiều có thể xem như mảng một chiều. Gọi X là mảng hai chiều có kích thước m dòng và n cột - Tài liệu Giáo trình Lập trình hướng đối tượng với C++ pptx

Hình 1.2.

Mảng hai chiều có thể xem như mảng một chiều. Gọi X là mảng hai chiều có kích thước m dòng và n cột Xem tại trang 8 của tài liệu.
Bài 1.4: Viết chương trình in bảng của các số từ 1 đến 256 dưới dạng nhị phân, bát phân và thập lục phân tương ứng - Tài liệu Giáo trình Lập trình hướng đối tượng với C++ pptx

i.

1.4: Viết chương trình in bảng của các số từ 1 đến 256 dưới dạng nhị phân, bát phân và thập lục phân tương ứng Xem tại trang 12 của tài liệu.
Nh ập một ngày tháng năm từ bàn phím sau đó in ra màn hình. - Tài liệu Giáo trình Lập trình hướng đối tượng với C++ pptx

h.

ập một ngày tháng năm từ bàn phím sau đó in ra màn hình Xem tại trang 19 của tài liệu.
- Đưa ra màn hình danh sách thí sinh trung tuyển( điểm chuẩn vào trường là 18) - Tài liệu Giáo trình Lập trình hướng đối tượng với C++ pptx

a.

ra màn hình danh sách thí sinh trung tuyển( điểm chuẩn vào trường là 18) Xem tại trang 23 của tài liệu.
Bài 2: Hãy xây dựng các lớp cần thiết trong phân cấp hình 5.2 - Tài liệu Giáo trình Lập trình hướng đối tượng với C++ pptx

i.

2: Hãy xây dựng các lớp cần thiết trong phân cấp hình 5.2 Xem tại trang 53 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan