SlideShare a Scribd company logo
L P TRÌNH HƯ NG   I TƯ NG V I C++       Smith Nguyen Studio.
    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.



                                                                          Trang 1
L P TRÌNH HƯ NG       I TƯ NG V I C++            Smith Nguyen Studio.
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.                                         1.
               */
               #include <iostream.h>
               void main()
               {
                  int I;
                  for(I = 0; I < 10 ; ++ I)// 0 - 9
                    cout<<I<<"n"; // In ra 0 - 9
               }
                                                                                      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:";

                                                                      Trang 2
L P TRÌNH HƯ NG      I TƯ NG V I C++          Smith Nguyen Studio.
                 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 1n”;
                       cout<<”2. Cong viec 2n”;
                       cout<<”3. Cong viec 3n”;
                       cout<<”4. Ket thuc chuong trinh nn”;
                    }
                    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 1n”; break;
                                           case 2:cout<<”Thuc hien cong viec 2n”; break;
                                           case 3:cout<<”Thuc hien cong viec 3n”; 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 ig 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ú ý

                                                                                      Trang 3
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.
    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


                                                                       Trang 4
L P TRÌNH HƯ NG     I TƯ NG V I C++          Smith Nguyen Studio.
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++)

                                                                              Trang 5
L P TRÌNH HƯ NG      I TƯ NG V I C++           Smith Nguyen Studio.
                             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 phatn";
                  }
                  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 xepn";
                  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 xepn";
                  for(I=0;I<N;++I)
                     cout<<P[I]<<" ";
                  delete []P;
                }




      k t qu




                                                                                   Trang 6
L P TRÌNH HƯ NG     I TƯ NG V I C++           Smith Nguyen Studio.
      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))
                 {

                                                                  Trang 7
L P TRÌNH HƯ NG    I TƯ NG V I C++           Smith Nguyen Studio.
                  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)
            {

                                                               Trang 8
L P TRÌNH HƯ NG      I TƯ NG V I C++             Smith Nguyen Studio.
                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);
                                                                                 Trang 9
L P TRÌNH HƯ NG       I TƯ NG V I C++   Smith Nguyen Studio.
     c)func(1.5,2.5);
     d)func(1,2);
Câu 3: Cho bi t giá tr c a y sau khi th c hi n:
  int &foo(int &a)
     { a++;
         return a;
     }
  int i=5;
  int &r=foo(i);
  r++;

  a) i=5;
  b) i=6;
  c) i=7;
  d) không câu nào úng
Câu 4: Tìm giá tr c a x, y:
  void test(int &a, int b)
     { a+=b;
        b=a;
     }
  int x=1,y=2;
  test(x,y);

     a)   x=1,y=2;
     b)   x=1,y=3
     c)   x=3,y=2
     d)   x=3,y=3

     Bài t p t gi i

Bài 1.1: Anh (ch ) hãy vi t l i chương trình sau b ng cách s   d ng l i các dòng
nh p/xu t trong C++.

/*

Chương trình tìm m u chung nh nh t

*/

#include <stdio.h>

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++      Smith Nguyen Studio.
    for(i = 2;i<min;++i)

     if (((a%i)==0)&&((b%i)==0)) break;

      if(i==min)

         {

              printf("Khong co mau chung nho nhat");

          }

    printf("Mau chung nho nhat la %dn",i);

}

Bài 1.2: Vi t chương trình nh p vào s nguyên dương h (2<h<23), sau ó in ra các tam
giác có chi u cao là h như các hình sau:




Bài 1.3: M t tam giác vuông có th có t t c các c nh là các s nguyên. T p c a ba s
nguyên c a các c nh c a m t tam giác vuông ư c g i là b ba Pitago. ó là t ng bình
phương c a hai c nh b ng bình phương c a c nh huy n, ch ng h n b ba Pitago (3,
4, 5). Vi t chương trình tìm t t c các b ba Pitago như th sao cho t t c các c nh
không quá 500.

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.

Bài 1.5: Vi t chương trình nh p vào m t s nguyên dương n. Ki m tra xem s nguyên
n có thu c dãy Fibonacci không?

Bài 1.6: Vi t chương trình nhân hai ma trân Amxn và Bnxp. M i ma tr n ư c c p phát
  ng và các giá tr c a chúng phát sinh ng u nhiên (V i m, n và p nh p t bàn phím).

                                                                         Trang 11
L P TRÌNH HƯ NG   I TƯ NG V I C++         Smith Nguyen Studio.
Bài 1.7: Vi t chương trình t o m t m ng m t chi u ng có kích thư c là n (n nh p t
bàn phím). Các giá tr c a m ng này ư c phát sinh ng u nhiên trên o n [a, b] v i a
và b u nh p t bàn phím. Hãy tìm s dương nh nh t và s âm l n nh t trong m ng;
n u không có s dương nh nh t ho c s âm l n nh t thì xu t thông báo "không có s
dương nh nh t" ho c "không có s âm l n nh t".

Bài 1.8: Anh (ch ) hãy vi t m t hàm tính bình phương c a m t s . Hàm s tr v giá tr
bình phương c a tham s và có ki u cùng ki u v i tham s .

Bài 1.9: Trong ngôn ng C, chúng ta có hàm chuy n i m t chu i sang s , tùy thu c
vào d ng c a chu i chúng ta có các hàm chuy n i sau :

              int atoi(const char *s);

            Chuy n      i m t chu i s thành s nguyên ki u int.

              long atol(const char *s);

            Chuy n      i m t chu i s thành s nguyên ki u long.

              double atof(const char *s);

            Chuy n      i m t chu i s thành s th c ki u double.

      Anh (ch ) hãy vi t m t hàm có tên là aton (ascii to number)       chuy n      i chu i
      sang các d ng s tương ng.

Bài 1.10: Anh ch hãy vi t các hàm sau:

             Hàm ComputeCircle()      tính di n tích s và chu vi c c a m t ư ng tròn
            bán kính r. Hàm này có prototype như sau:

                   void ComputeCircle(float & s, float &c, float r = 1.0);

             Hàm ComputeRectangle()       tính di n tích s và chu vi p c a m t hình
            ch nh t có chi u cao h và chi u r ng w. Hàm này có prototype như sau:

                   void ComputeRectangle(float & s, float &p, float h = 1.0, float w =
                   1.0);

             Hàm ComputeTriangle()      tính di n tích s và chu vi p c a m t tam giác
            có ba c nh a,b và c. Hàm này có prototype như sau:

                   void ComputeTriangle(float & s, float &p, float a = 1.0, float b = 1.0,
                   float c = 1.0);

              Hàm ComputeSphere()       tính th tích v và di n tích b m t s c a m t
            hình c u có bán kính r. Hàm này có prototype như sau:

                   void ComputeSphere(float & v, float &s, float r = 1.0);



                                                                             Trang 12
L P TRÌNH HƯ NG   I TƯ NG V I C++     Smith Nguyen Studio.
              Hàm ComputeCylinder()       tính th tích v và di n tích b m t s c a m t
            hình tr có bán kính r và chi u cao h. Hàm này có prototype như sau:

                   void ComputeCylinder(float & v, float &s, float r = 1.0 , float h =
                   1.0);

Bài 1.11: Vi t chương trình qu n lý i m h c sinh v i c u trúc danh sách n i ơn.
Trong chương trình s d ng toán t vào ra và toán t new      c p phát b nh      ng.
Bài 1.12: Vi t m t hàm th c hi n vi c s p x p m t m ng s nguyên theo chi u tăng
d n ho c gi m d n. Hàm này t       ng m c nh ki u s p x p theo chi u tăng d n.
Bài 1.13: Vi t m t hàm gi i phương trình b c hai. Hàm này tr l i thông báo r ng
phương trình có nghi m hay không có nghi m kép. N u có nghi m thì nghi m s ư c
lưu vào tham s x1, x2 và ư c truy n như là tham bi n.
Bài 1.14:Vi t m t hàm tìm v trí xu t hi n u tiên c a m t t khoá trong m t xâu. Hàm
này tr l i v trí tìm th y c a t khoá trong xâu(b t   u t 0) và thay i con tr xâu
  ư c truy n vào thành v trí c a ký t ngay sau ký t cu i cùng c a t khoá. T khoá
c n tìm ư c ưa vào như là m t tham s và có m t giá tr m c nh.




                                                                       Trang 13
L P TRÌNH HƯ NG    I TƯ NG V I C++       Smith Nguyen Studio.

      §èi t−îng vµ líp (Class and Object)

M C TIÊU C A BÀI NÀY GIÚP 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 hàm thi t l p và hàm hu b
   Khai báo và s d ng hàm thi t l p sao chép
   Vai trò c a hàm 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 t khoá struct.
    L p cho phép ngư i l p trình mô t các i tư ng th c t v i các thu c tính và hành
vi. Trong C++ thư ng s d ng t khoá class             khai báo m t l p. Tên l p là m t ki u
d li u dùng khi khai báo các i tư ng thư c l p(các th hi n c th c a l p).
    Thu c tính c a     i tư ng trong m t l p ư c mô t dư i d ng các bi n th hi n.
Các hành vi là các hàm thành ph n bên trong l p.
    Có hai cách nh nghĩa các hàm thành ph n c a m t l p; khi nh nghĩa hàm thành
ph n bên ngoài khai báo l p ph i t trư c tên hàm thành ph n tên c a l p và toán t
“::”    phân bi t v i các hàm t do cùng tên. Ch nên nh nghĩa hàm thành ph n bên
trong khai báo l p khi nó không quá ph c t p        cho chương trình d     c.
    Có th khai báo và s d ng các con tr        i tư ng, tham chi u i tư ng.
    Hai t khoá public và private dùng         ch nh thu c tính truy nh p cho các thành
ph n( d li u/hàm) khai báo bên trong l p.
    Thành ph n bên trong l p ư c khai báo public có th truy nh p t m i hàm khai
báo m t i tư ng thu c l p ó.
    Thành ph n private trong m t       i tư ng ch có th truy nh p ư c b i các hàm
thành ph n c a i tư ng ho c các hàm thành ph n c a l p dùng               t o i tư ng(
  ây tính c trư ng h p i tư ng là tham s c a hàm thành ph n)
    Hai hàm thành ph n c bi t c a m t l p g i là hàm thi t l p và hàm hu b . Hàm
thi t l p ư c g i t       ng(ng m nh) m i khi m t i tư ng ư c t o ra và hàm hu
b ư cg it          ng khi i tư ng h t th i gian s d ng.
    Hàm thi t l p có thu c tính public, cùng tên v i tên l p nhưng không có giá tr tr
v .
    M t l p có ít nh t hai hàm thi t l p: hàm thi t l p sao chép ng m nh và hàm thi t
l p do ngư i l p trình thi t l p(n u không mô t tư ng minh thì ó là hàm thi t l p
ng m nh).
    Hàm hu b cũng có thu c tính public, không tham s , không giá tr tr v và có tên
b t u b i ~ theo sau là tên c a l p.
    Bên trong ph m v l p( nh nghĩa c a các hàm thành ph n), các thành ph n c a l p
  ư c g i theo tên. Trư ng h p có m t i tư ng toàn c c cùng tên, mu n xác nh i
tư ng y ph i s d ng toán t “::”.
    L p có th ch a các thành ph n d li u là các            i tư ng c a l p khác. Các      i
tư ng này ph i ư c kh i t o trư c i tư ng tương ng c a l p bao.
    M i i tư ng có m t con tr ch          n b n thân nó, ta g i ó là con tr this. Con tr
này có th     ư c s d ng tư ng minh ho c ng m nh                 tham xác nh các thành
ph n bên trong i tư ng. Thông thư ng ngư i ta s d ng this dư i d ng ng m nh.
    Hàm b n c a m t l p là hàm không thu c l p nhưng có quy n truy nh p t i các
thành ph n private c a l p.
                                                                           Trang 14
L P TRÌNH HƯ NG     I TƯ NG V I C++        Smith Nguyen Studio.
   Khai báo b n b có th khai báo b t kỳ ch nào trong khai báo l p.
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 d u “;” cu i khai báo l p
    Kh i t o các thành ph n giá tr trong khai báo l p
      nh nghĩa ch ng m t hàm thành ph n b ng m t hàm không thu c l p
    Truy nh p n các thành ph n riêng c a l p t bên ngoài ph m vi l p
    Khai báo giá tr tr v cho hàm thi t l p và hàm hu b
    Khai báo hàm hu b có tham s , nh nghĩa ch ng hàm hu b
    G i tư ng minh hàm thi t l p và hàm hu b
    G i các thàm thành ph n bên trong hàm thi t l p
   M t s thói quen l p trình t t
    Nhóm t t c c các thành ph n có cùng thu c tính truy nh p m t nơi trương khái
    báo l p, nh v y m i t khoá mô t truy nh p ch ư c xác nh m t l n. Khai báo
    l p vì v y d       c hơn. Theo kinh nghi m,         các thành ph n private trư c tiên r i
       n các thành ph n protectech, cu i cùng là t khoá public.
      nh nghĩa t t c các hàm thành ph n bên ngoài khai báo l p. i u này nh m ph n
    bi t gi a hai ph n giao di n và ph n cài t l p.
    S d ng các ti n x lý #ifndef, #define, #endif             cho các t p tin tiêu    ch xu t
    hi n m t l n bên trong chương trinhg ngu n.
    Ph i nh nghĩa các hàm thi t l p                m b o r ng các i tư ng u ư c kh i
    t o n i dung m t cách úng n.
C/ BÀI T P M U
Ví d 1: nh nghĩa m t l p mô t và x lý các i m trên màn hình                   ho . V i tên l p
là point
L i gi i
   + Các thu c tính c a l p
      int x;// hoành      (c t)
      int y;// tung     ( hàng)
      int m;// màu
   + Các phương th c
      Nh p d li u m t i m
      Hi n th m t i m
        nm t i m
L p i m ư c xây d ng như sau:
   class point
      {
         private:
          int x,y,m;
         public:
          void nhapsl();
          void hien();
          void an()
             {
                 putpixcel(x,y,getbkcolor());
             }
          void point::nhap()
             {
                 cout<<”n Nh p hoành        (c t) và tung    (hàng) c   i m:”; cin>>x>>y;
                 cout<<” Nh p màu c a i m:”;cin>>m;
             }
          void point::hien()

                                                                             Trang 15
L P TRÌNH HƯ NG    I TƯ NG V I C++    Smith Nguyen Studio.
          {
              int mau_ht;
              mau_ht=getcolor();
              putpixcel(x,y,m);
              setcolor(mau_ht);
           }
   Nh n xét:
      + Trong c ba phương th c( dù vi t trong hay vi t ngoài nh nghĩa l p) u ư c
truy nh p n các thu c tính x,y và m c a l p.
      + Các phương th c vi t bên trong nh nghĩa l p (như phương th c an()) ư c
vi t như m t hàm bình thư ng.
      +Khi xây d ng các phương th c bên ngoài l p, c n dùng thêm tên l p và toán t
ph m vi :: t ngay trư c tên phương th c       quy nh rõ ây là phương th c c a l p
nào.

Ví d 2: Chúng ta xây d ng ki u c u trúc Time v i ba thành viên s nguyên: Hour,
Minute và second. Chương trình nh nghĩa m t c u trúc Time g i là DinnerTime.
Chương trình in th i gian dư i d ng gi quân i và d ng chu n.

                                           CT2_2.CPP
              #include <iostream.h>
              class Time
              {
                 public:
                               Time();                      //Constructor
                               void SetTime(int, int, int);    //Thiet lap Hour,
              Minute va Second
                               void PrintMilitary();         //In thoi gian duoi
              dang gio quan doi
                               void PrintStandard();         //In thoi gian duoi
              dang chuan
                       private:
                               int Hour;     // 0 - 23
                               int Minute;   // 0 - 59
                               int Second;   // 0 - 59
              };

              //Constructor khoi tao moi thanh vien du lieu voi gia tri zero
              //Bao dam tat ca cac doi tuong bat dau o trang thai thich hop
              Time::Time()
              {
                      Hour = Minute = Second = 0;
              }

              //Thiet lap mot gia tri Time moi su dung gio quan doi
              //Thuc hien viec kiem tra tinh hop le tren cac gia tri du lieu
              //Thiet lap ca gia tri khong hop le thanh zero
              void Time::SetTime(int H, int M, int S)
              {
                      Hour = (H >= 0 && H < 24) ? H : 0;
                      Minute = (M >= 0 && M < 60) ? M : 0;
                      Second = (S >= 0 && S < 60) ? S : 0;
              }

              //In thoi gian duoi dang gio quan doi
              void Time::PrintMilitary()
              {
                      cout << (Hour < 10 ? "0" : "") << Hour << ":"


                                                                      Trang 16
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.
                                << (Minute < 10 ? "0" : "") << Minute << ":"
                                << (Second < 10 ? "0" : "") << Second;
           }

           //In thoi gian duoi dang chuan
           void Time::PrintStandard()
           {
                   cout << ((Hour == 0 || Hour     == 12) ? 12 : Hour % 12)
                             << ":" << (Minute     < 10 ? "0" : "") << Minute
                             << ":" << (Second     < 10 ? "0" : "") << Second
                             << (Hour < 12 ? "     AM" : " PM");
           }


           int main()
           {
                   Time T;

                    cout << "The initial military time is ";
                    T.PrintMilitary();
                    cout << endl << "The initial standard time is ";
                    T.PrintStandard();

                    T.SetTime(13, 27, 6);
                    cout << endl << endl << "Military time after SetTime is ";
                    T.PrintMilitary();
                    cout << endl << "Standard time after SetTime is ";
                    T.PrintStandard();

                    T.SetTime(99, 99, 99);     //Thu thiet lap gia tri khong hop
           le
                   cout    <<   endl   <<   endl   <<   "After   attempting   invalid
           settings:"
                              << endl << "Military time: ";
                    T.PrintMilitary();
                    cout << endl << "Standard time: ";
                    T.PrintStandard();
                    cout << endl;
                    return 0;
           }




      k t qu




                                                                       Trang 17
L P TRÌNH HƯ NG   I TƯ NG V I C++            Smith Nguyen Studio.
Ví d 3
   Nh p m t ngày tháng năm t bàn phím sau ó in ra màn hình.
L i gi i
                                              CT2_3.CPP
           #include <iostream.h>
           #include <conio.h>
           #define FALSE 0
           #define TRUE !FALSE
            char* Thang[]={"","gieng","hai","ba","bon","nam","sau","bay","tam",
                                    "chin","muoi","muoi mot","chap"};
            int NgayThang[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
           class CDate
           {
             private:
                int mNgay,mThang,mNam;
                int laNamNhuan(int);
             public:
               void nhap();
               int hopLe();
               void in();
           };
           void CDate::nhap()
           {
               cout<<endl<<"Ngay: ";cin>>mNgay;
               cout<<endl<<"Thang: "; cin>>mThang;
               cout<<endl<<"Nam: ";cin>>mNam;
           }
           int CDate::hopLe()
           {
               if ((mThang<1)||(mThang>12))
                    return FALSE;
               else
               {
                    if ((mNgay>=1)&&(mNgay<=NgayThang[mThang]))
                         return TRUE;
                    else if ((mNgay==29)&&laNamNhuan(mNgay))
                         return TRUE;
                    else
                         return FALSE;
               }
           }
           int CDate::laNamNhuan(int nam)
           {
               if (((nam%400)==0)||(((nam%4)==0)&&((nam%100)!=0)))
                    return TRUE;
               else
                    return FALSE;
           }
           void CDate::in()
           {
               cout<<endl<<"Ban da nhap vao ngay "<<mNgay;
               cout<<" thang "<<Thang[mThang];
               cout<<" nam "<<mNam;
           }
           void main()
           {
               CDate ngay;
               ngay.nhap();
               if (ngay.hopLe())
                    ngay.in();
               else

                                                                                  Trang 18
L P TRÌNH HƯ NG   I TƯ NG V I C++     Smith Nguyen Studio.
                  cout<<"BAN NHAP NGAY KHONG HOP LE";
               getch();
           }




Ví d 4
   Ch ra các cách khai báo   i tư ng có th cho các l p   i tư ng dư i ây: class A
   {
   };
class B
   {
       B(int, int);
     public:
       B(int=0);
   };
class C
   {
       C(C&);
     public:
       C();
   };
class D
   {
      public:
       D(D&);
   };
L i gi i
V l pA
   Cách 1: S d ng hàm thi t l p ng m nh
      A a; ho c A a();
   Cách 2: S d ng hàm thi t l p sao chép m c nh. Gi s a là m t i tư ng c a
l p A ã ư c khai báo trư c. Ta có th khai báo i tư ng a1 như sau:
      A a1(a); ho c A a1=a;
   Nh n xét:
      Khi trong l p không có m t khai báo hàm thi t l p nào thì trình biên d ch t ng
t o ra m t hàm thi t l p m c nh cho l p ó. Do v y ta có th s d ng khai báo i
tư ng theo cách 1 cho l p A. Hai chách vi t khai báo
   A a1(a); và A a1=a; là hoàn toàn gi ng nhau, chúng u s d ng hàm thi t l p sao
chép     kh i t o i tư ng.
V l pB
Cách 1: S d ng hàm thi t l p B(int). Ví d :
   B b(5);
Cách 2: S d ng hàm thi t l p B(int) v i tham s ng m nh là 0.
   B b; tương ương v i B b(0);
Cách 3: S d ng hàm thi t l p sao chép tương t như l p A.
   B b1=b;
Nh n xét
   Chúng ta ch có th khai báo i tư ng theo các hàm thi t l p có thu c tính quy n
truy nh p là public


                                                                     Trang 19
L P TRÌNH HƯ NG    I TƯ NG V I C++           Smith Nguyen Studio.
   Trong hàm thi t l p cũng có th s          d ng tham s ng m              nh gi ng như các hàm
thành ph n khác.
V l p C:
  Ch có th khai báo i tư ng theo hàm thi t l p C() b i vì hàm thi t l p sao chép ã
 ư c ngư i s d ng nh nghĩa và       t quy n truy xu t là private. Do v y không th
dùng hàm thi t l p sao chép. Ví d :
  C c;
V l p D:
   Không th khai báo i tư ng cho l p D b i vì trong l p này ch có hàm thi t l p sao
chép. Hàm thi t l p chép mu n s d ng ư c thì ph i có m t i tư ng c a l p D. Do
v y mu n khai báo ư c m t i tư ng thu c l p D thì trong l p D c n có m t hàm
thi t l p khác     sa chép.
Ví d 5
   Có bao nhiêu l n hàm thi t l p sao chép ư c g i trong o n mã chương trình sau:
   Widget f(Widget u)
       {
         Widget v(u);
         Widget w=v;
         return w;
       }
   void main()
       {
         Widget x;
         Widget y=f(f(x));
       }
L i gi i:
   Hàm thi t l p sao chép ư c g i 7 l n trong o n mã chương trình này. M i l n g i
hàm f òi h i 3 l n g i n hàm thi t l p sao chép: khi tham sô truy n vào b ng giá tr
u, khi v và w ư c kh i t o. L nh g i th b y là    kh i t o y.
Ví d 6
   Cho bi t k t qu in ra màn hình c a chương trình sau:
L i gi i
                                              CT 2_6.CPP
           #include <iostream.h>
           #include <conio.h>                                                            3.
              class A
                 {
                    static int count;
                   public:
                    A() { count++;}
                    ~A() { count--;}

                     static void printNum()
                        {
                            cout<<” Gia tri cua count la:”<<count<<endl;
                        }
                  };
              int A::count=0;
              void main()
                  {
                     clrscr();
                      A::printNum();
                      A a1;
                      a1.printNum();
                      A *pa=new A;
                      a1.printNum();

                                                                                  Trang 20
L P TRÌNH HƯ NG   I TƯ NG V I C++     Smith Nguyen Studio.
                   delete pa;
                   a1.printNum();
                   A a2=a1;
                   a2.printNum();
                   getch();
              }
                                                                             4.


L i gi i
   K t q in ra màn hình:
   Gia tri cua count la 0
   Gia tri cua count la 1
   Gia tri cua count la 2
   Gia tri cua count la 1
   Gia tri cua count la 1
   Trong l p A, thu c tính count và hàm thành ph n printNum là các thành ph n tĩnh
  ư c chia s b i m i i tư ng c a A. Ban u thu c tính count ư c khai báo kh i
t o là 0( dòng int A::count=0), do v y dòng u tiên c a chương trình chính ư c g i
   n phương th c printNum s ưa ra màn hình giá tr c a count là 0. Ti p theo ta t o
m t i tư ng a1 s d ng hàm thi t l p d ng A(). Hàm này làm tăng count lên 1. Do
v y, dòng g i phương th c printNum ti p theo s ưa ra màn hình giá tr c a count là
1. Tương t       i v i l nh new ta cũng t o ra m t i tư ng m i và lúc này giá tr c a
count là 2. Sau khi s d ng l nh new t o i tư ng, chương trình s d ng delete
xoá i tư ng ó kh i b nh . Lúc này hàm hu b ư c g i và count gi m xu ng 1.
   i tư ng a2 ư c khai báo s d ng hàm thi t l p sao chép m c nh, mà hàm này
không làm thay i giá tr count. Do v y, count v n gi giá tr 1.

Ví d 6
   Tim ra ch sai v quy n truy xu t trong o n chương trình sau:
class A
   {
       int pri;
      public:
       int bub;
       friend void funcA(A);
       firend class B;
   };
class B
   {
       void func(A a)
           {
              cout<<a.pri;
              cout<<a.pub;
           }
   };
class C
   {
       void func(A a)
           {
              cout<<a.pri;
              cout<<a.pub;

                                                                     Trang 21
L P TRÌNH HƯ NG   I TƯ NG V I C++            Smith Nguyen Studio.
       }
   };
void funcA(A a)
   {
      cout<<a.pri;
      cout<<a.pub;
   }
void funcB(A a)
   {
      cout<<a.pri;
      cout<<a.pub;
   }
L i gi i
   Truy xu t n thu c tính pri c a i tư ng a trong hàm funcB và trong hàm thành
ph n func c a l p C là không th ư c. T t c các truy xu t n thu c tính pub u
  ư c b i vì ây là thu c tính public. Trong hàm funcA, ta có th truy nh p ư c thu c
tính pri b i vì hàm này ã ư c khai báo là b n bè c a l p A. Tương t , t t c các
hàm thành ph n c a l p B cũng u có th truy xu t t i thu c tính pri c a l p A b i vì
l p B ã ư c coi là b n bè c a l p A.

Ví d 7
      qu n lý i m thi vào trư ng HSPKTHY c a các thí sinh, ta xây d ng l p
ThiSinh mô t các thí sinh bao g m các thu c tính và phương th c sau:
   - Tên thí sinh
   -   i m c a ba môn thi Toán, Lý, Hoá
   - Nh p thông tin c a các thí sinh g m tên và i m c a ba môn thi Toán, Lý, Hoá
   - In thông tin tên, i m và t ng i m thi 3 môn
   - Tính t ng i m thi c a thí sinh
Trên cơ s l p ã xây d ng ư c, vi t chương trình làm các công vi c sau.
   - Nh p danh sách k t qu thi c a các thí sinh vào t bàn phím
   -   ưa ra màn hình danh sách thí sinh trung tuy n( i m chu n vào trư ng là 18)

L i gi i
                                              CT2_7.CPP
              #include <iostream.h>
              #include <stdio.h>                                                     5.
              #include <conio.h>
              class ThiSinh
                 {
                      // Các thu c tính
                      char ten[25];// Tên c a thí sinh khôngdài quá 24 ký t
                      int toan, ly, hoa;// i m ba môn toán, lý, hoá
                   public:
                    // Các phương th c
                      void nhapdl();//Nh p d li u cho thí sinh
                      void inkq();// In k t qu thi c a thí sinh
                      int tong();// Tính t ng i m c a thí sinh
                   };
                   void ThiSinh::nhapdl()
                      {
                          cout<<”Nhap ten:”;fflush(stdin);gets(ten);
                          cout<<”Nhap diem toan:”;cin>>toan;
                          cout<<”Nhap diem ly:”;cin>>ly;
                          cout<<”Nhap diem hoa:”;cin>>hoa;
                      }

                                                                              Trang 22
L P TRÌNH HƯ NG   I TƯ NG V I C++             Smith Nguyen Studio.
                   void ThiSinh::inkq()
                     { // K t qu thi c a thí sinh ư c in trên m t dòng theo nh d ng
                         // Ten          Toan          Ly            Hoa
                     Tong
                         printf(“%-25s%6d%6d%6%6dn”,ten,toan,ly,hoa,tong());
                     }
                   int ThiSinh::tong()
                     {
                         return (toan+ly+hoa);
                     }
                    void main()
                     { // Chương trình chính th c hi n nh p danh sách vào s lư ng thí
                   // sinh c n nh p
                         clrscr();
                         int n;
                         cout<<”Cho so thi sinh:”;cin>>n;
                     // T o n i tư ng thí sinh cho n thí sinh c n nh p d li u
                         ThiSinh *dsts=new ThiSinh[n];
                     // Nh p d li u cho t ng thí sinh
                         for(int i=0;i<n;++i)
                             {
                                 cout<<” Nhap du lieu cho thi sinh thu:”<<i+1<<endl;
                             // G i phương th c nh p d li u c a thí sinh th i trong m ng
                                 dsts[i].nhapdl();
                             }
                   // In danh sách các thí sinh truýng tuy n
                     cout<<”Danh sach nhung nguoi trung truyen n”;
                     printf(“%-25s%6s%6s%s%6sn”,”Ten”,”Toan”,”Ly”,”Hoa”,”Tong”);
                   for(i=0;i<n;++i)
                     if(dsts[i].tong()>=18)
                             dsts[i].inkq();
                   // Xoá các i tư ng ã t o và k t thúc chương trình
                    delete dsts;
                    getch();
           }
                                                                                                6.


Ví d 8: Hàm thi t l p v i các tham s m c             nh

                                               CT2_8.CPP
           #include <iostream.H>
           class Time                                                                           7.
           {
                     public:
                               Time(int = 0, int = 0, int = 0); //Constructor mac dinh
                               void SetTime(int, int, int);
                               void PrintMilitary();
                               void PrintStandard();

                     private:
                                int Hour;
                                int Minute;
                                int Second;
           };

            //Ham constructor de khoi dong du lieu private
            //Cac gia tri mac dinh la 0
           Time::Time(int Hr, int Min, int Sec)
           {

                                                                                         Trang 23
L P TRÌNH HƯ NG    I TƯ NG V I C++               Smith Nguyen Studio.
                        SetTime(Hr, Min, Sec);
           }

            //Thiet lap cac gia tri cua Hour, Minute va Second
            //Gia tri khong hop le duoc thiet lap la 0
            void Time::SetTime(int H, int M, int S)
           {
                        Hour = (H >= 0 && H < 24) ? H : 0;
                        Minute = (M >= 0 && M < 60) ? M : 0;
                        Second = (S >= 0 && S < 60) ? S : 0;
           }

           //Hien thi thoi gian theo dang gio quan doi: HH:MM:SS
           void Time::PrintMilitary()
           {
                       cout << (Hour < 10 ? "0" : "") << Hour << ":"
                                   << (Minute < 10 ? "0" : "") << Minute << ":"
                                   << (Second < 10 ? "0" : "") << Second;
           }

           //Hien thi thoi gian theo dang chuan: HH:MM:SS AM (hoac PM)
           void Time::PrintStandard()
           {
                       cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12)
                                   << ":" << (Minute < 10 ? "0" : "") << Minute
                                   << ":" << (Second < 10 ? "0" : "") << Second
                                   << (Hour < 12 ? " AM" : " PM");
           }

           int main()
           {
                        Time T1,T2(2),T3(21,34),T4(12,25,42),T5(27,74,99);

                        cout << "Constructed with:" << endl
                                    << "all arguments defaulted:" << endl << " ";
                        T1.PrintMilitary();
                        cout << endl << " ";
                        T1.PrintStandard();
                        cout << endl << "Hour specified; Minute and Second defaulted:"
                                    << endl << " ";
                        T2.PrintMilitary();
                        cout << endl << " ";
                        T2.PrintStandard();
                        cout << endl << "Hour and Minute specified; Second defaulted:"
                                    << endl << " ";
                        T3.PrintMilitary();
                        cout << endl << " ";
                        T3.PrintStandard();
                        cout << endl << "Hour, Minute, and Second specified:"
                                    << endl << " ";
                        T4.PrintMilitary();
                        cout << endl << " ";
                        T4.PrintStandard();
                        cout << endl << "all invalid values specified:"
                                    << endl << " ";
                        T5.PrintMilitary();
                        cout << endl << " ";
                        T5.PrintStandard();
                        cout << endl;
                        return 0;
           }
                                                                                           8.
                                                                                    Trang 24
L P TRÌNH HƯ NG   I TƯ NG V I C++           Smith Nguyen Studio.

Chương trình    ví d trên kh i t o năm     i tư ng c a l p Time ( dòng 52). i
tư ng T1 v i ba tham s l y giá tr m c nh, i tư ng T2 v i m t tham s ư c mô
t , i tư ng T3 v i hai tham s ư c mô t , i tư ng T4 v i ba tham s ư c mô t
và i tư ng T5 v i các tham s có giá tr không h p l .

K t qu




Ví d 9:L p có hàm hu b

                                             CT 2_9.CPP
           #include <iostream.h>
           class Simple                                                               9.
           {
                     private:
                               int *X;
                     public:
                               Simple();              //Constructor
                               ~Simple();      //Destructor
                               void SetValue(int V);
                               int GetValue();
           };

           Simple::Simple()
           {
                     X = new int; //Cap phat vung nho cho X
           }

           Simple::~Simple()
           {
                     delete X; //Giai phong vung nho khi doi tuong bi huy bo
           }

                                                                               Trang 25
L P TRÌNH HƯ NG      I TƯ NG V I C++             Smith Nguyen Studio.
           void Simple::SetValue(int V)
           {
                    *X = V;
           }

           int Simple::GetValue()
           {
                      return *X;
           }

           int main()
           {
                           Simple S;
                           int X;

                           cout<<"Enter a number:";
                           cin>>X;
                           S.SetValue(X);
                           cout<<"The value of this number:"<<S.GetValue();
               return 0;
           }

                                                                                     10.



k t qu




Ví d 10: Chương trình sau minh h a khai báo và s d ng hàm friend.

                                                              CT2_10.CPP
                     #include <iostream.H>
                     class Count
                     {
                             friend void SetX(Count &, int); //Khai bao friend
                             public:
                                     Count()//Constructor
                                     {
                                             X = 0;
                                     }
                                     void Print() const //Xuat
                                     {
                                             cout << X << endl;
                                     }
                             private:
                                     int X;
                     };

                     //Co the thay doi du lieu private cua lop Count vi
                     //SetX() khai bao la mot ham friend cua lop Count
                     void SetX(Count &C, int Val)
                     {


                                                                              Trang 26
L P TRÌNH HƯ NG   I TƯ NG V I C++       Smith Nguyen Studio.
                           C.X = Val;   //Hop le: SetX() la mot friend cua lop Count
                  }

                  int main()
                  {
                          Count Object;

                           cout << "Object.X after instantiation: ";
                           Object.Print();
                           cout << "Object.X after call to SetX friend function: ";
                           SetX(Object, 8); //Thiet lap X voi mot friend
                           Object.Print();
                           return 0;

                  }




      k t qu




D/ BÀI T P T GI I
Câu h i tr c nghi m
Câu 1:
    Ch có m t kh ng nh trong nh ng câu sau là sai. Câu nào?
a./ M i th hi n c a m t l p có s h u riêng các thu c tính thông thư ng
b./ Các th hi n c a m t l p cùng chia s các thu c tính tĩnh c a l p ó
c./ M i th hi n c a m t l p có các nh nghĩa riêng cho các phương th c c a nó.
d./ M i i tư ng là m t th hi n c a m t l p
Câu 2:
    Các t khoá public và private dùng
a./ Cho phép ngư i thi t k l p che d u m t ph n thi hành c a l p trư c ngư i s
d ng l p.
b./ Trình biên d ch t i ưu hoá chương trình
c./     m b o na toàn c a l p khi thi t k
d./ H n ch vi c sao chép l p
Câu 3
Ch ra l i sai v i các khai báo cho l p A
    class A
       {
          A(int i);
       };
    A a1;//(1)
    A b2(5) //(2)
a./ Ch dòng 1 l i
b./ Ch dòng 2 l i
c./ C hai dòng l i
d./ Không dòng nào l i
Câu 4:
    Cho bi t giá tr c a n v i các dòng l nh sau:

                                                                   Trang 27
L P TRÌNH HƯ NG    I TƯ NG V I C++        Smith Nguyen Studio.
class A
   {
      public:
         static int i;
   };
int A::i=5;
A a1;
a1.i++;
A a2;
int n=a2.i+1;
a./ n=5;
b./ n=6;
c./ n=7;
d./ Không câu nào úng
Câu 5:
 Ch ra l i v i các khai báo cho l p A
   class A
      {
         public:
         A(int i);
      };
   A a1(5);
   A a3;// (1)
   A a2=a1;// (2)
a./ Ch dòng 1 l i
b./ Ch dòng 2 l i
c./ C 2 dòng l i
d./ Không dòng nào l i
Bài tâp

Bài 2.1: Xây d ng l p Stack, d       li u bao g m   nh stack và vùng nh   c a stack. Các
thao tác g m:

               Kh i    ng stack.

               Ki m tra stack có r ng không?

               Ki m tra stack có      y không?

               Push và pop.

Bài 2.2: Xây d ng l p hình tr Cylinder, d li u bao g m bán kính và chi u cao c a
hình tr . Các thao tác g m hàm tính di n tích toàn ph n và th tích c a hình tr ó.

Bài 2.3: Hãy xây d ng m t l p Point cho các i m trong không gian ba chi u (x,y,z).
L p ch a m t constructor m c nh, m t hàm Negate()        bi n   i i m thành      i
lư ng có d u âm, m t hàm Norm() tr v kho ng cách t g c và m t hàm Print().

Bài 2.4: Xây d ng m t l p Matrix cho các ma tr n bao g m m t constructor m c nh,
hàm xu t ma tr n, nh p ma tr n t bàn phím, c ng hai ma tr n, tr hai ma tr n và nhân
hai ma tr n.


                                                                          Trang 28
L P TRÌNH HƯ NG   I TƯ NG V I C++       Smith Nguyen Studio.
Bài 2.5: Xây d ng m t l p Matrix cho các ma tr n vuông bao g m m t constructor m c
 nh, hàm xu t ma tr n, tính nh th c và tính ma tr n ngh ch o.

Bài 2.6: Xây d ng l p Person     qu n lý h tên, năm sinh, i m chín môn h c c a t t
c các h c viên c a l p h c. Cho bi t bao nhiêu h c viên trong l p ư c phép làm lu n
văn t t nghi p, bao nhiêu h c viên thi t t nghi p, bao nhiêu ngư i ph i thi l i và tên
môn thi l i. Tiêu chu n  xét:

              Làm lu n văn ph i có i m trung bình l n hơn 7 trong ó không có môn
             nào dư i 5.

              Thi t t nghi p khi i m trung bình không l n hơn 7 và i m các môn
             không dư i 5.

              Thi l i có môn dư i 5.

Bài 2.7: Xây d ng m t l p String. M i i tư ng c a l p String s    i di n m t chu i ký
t . Các thành viên d li u là chi u dài chu i và chu i ký t th c. Ngoài constructor và
destructor còn có các phương th c như t o m t chu i v i chi u dài cho trư c, t o m t
chu i t m t chu i ã có.

Bài 2.8: Xây d ng m t l p Vector       lưu tr   vector g m các s th c. Các thành viên
d li u g m:

              Kích thư c vector.

              M t m ng     ng ch a các thành ph n c a vector.

Ngoài constructor và destructor, còn có các phương th c tính tích vô hư ng c a hai
vector, tính chu n c a vector (theo chu n b t kỳ nào ó).

Bài 2.9: Xây d ng l p Employee g m h tên và ch ng minh nhân dân. Ngoài
constructor còn có phương th c nh p, xu t h tên và ch ng minh nhân dân ra màn
hình


Bài 2.10:
M t l p i tư ng sách trong h th ng qu n lí thư vi n có các thu c tính
  - Tên sách
  - T ng s quy n sách
  - S quy n sách ã cho mư n
Xây d ng l p i tư ng trên v i các phương th như sau
  - Phương th nh p d li u cho i tư ng t bàn phím. Các thông tin c n nh p là
      tên sách, t ng s sách, s ã cho mư n.
  - Phương th c in thông tin i tư ng ra màn hình bao g m tên, t ng s và s ã
      cho mư n.
  - Phương th c tính s sách còn l i trong thư vi n(t ng s - s mư n)
Trên cơ s l p xây d ng ư c, vi t chương trình chính th c hi n các công vi c.
  - Nh p danh sách các quy n sách v i s lư ng sách c n nh p ư c cho vào t
      bàn phím.
  -     ưa ra màn hình thông tin v các quy n sách hi n có trong thư vi n(s sách còn
      l i ph i l n hơn 0)
                                                                       Trang 29
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.
Bài 2.11:
  Vi t m t l p bi u di n hình ch nh t có các thu c tính là     dài hai c nh( chi u r ng
và chi u dài) và có các phương th c sau.
   - Nh p d li u hai c nh cho hình ch nh t
   - Tính chu vi và di n tích hình ch nh t
   - In thông tin c a hình ch nh t ra màn hình(bao g m          dài hai c nh, chu vi và
      di n tích)
  Trên cơ s l p xây d ng ư c vi t chương trình cho phép ngư i s d ng nh p d
  li u c a m t hình ch nh t r i in thông tin v nó ra màn hình.
Bài 2.12:
  Xây d ng m t l p Date mô t thông tin v ngày, tháng, năm(month, day, year). L p
Date có các hàm thành ph n:
   - Hàm thi t l p v i ba tham s có giá tr m c nh( ó là ngày h th ng)
   - Nh p d li u ngày, tháng và năm
   - Hàm in thông tin v ngày tháng năm dư i d ng mm-dd-yy
   - Hàm nextDay()       tăng Date t ng ngày m t
Trên cơ s l p Date v a x y d ng vi t chương trình cho bi t kho ng cách ngày gi a
hai m c th i gian v i ngày b t u ư c nh p vào t bàn phím cho tơi ngày hi n th i.


Bài 2.13:
  Xây d ng l p Stack và l p Queue mô t ho t ng c a ngăn x p và hàng           i các sô
nguyên.
Bài 2.14:
  Xây d ng m t l p mô t các b ng thi u bóng á g i là BangThiDau. Gi thi t m i
b ng có b n     i và thi  u chéo t ng c p. Có l ch các tr n      u c a b ng. T o các
phương th c nh p k t qu thi u và tính i m cho t ng i. Yêu c u vi c nh p k t
q a thi u ph i theo th t th i gian. Thêm các phương th c hi n th thông tin thi u
c a t ng i và c a c b ng. Vi t chương trình       ki m nghi m l p xây d ng ư c.
Bài 2.15:
  M r ng bài t p trên v i l p DoiBong mô t các i bóng thi u. Thông tin c a m i
 ôi bóng bao g m tên        i bóng, danh sách c u th , và hu n luy n viên. L p
bangThiDau s d ng các i tư ng c a l p DoiBong           làm i bóng thi u c a b ng.
Các b ng lúc này có th m thu c tính tên c a b ng thi u.
  S d ng các l p ã xây d ng trên            vi t chương trình qu n lý thi u c a cúp
bóng á th gi i có 32 i thi u ư c chia làm 8 b ng. T o thêm l p mô t l ch thi
  u cho các vòng ti p theo c a gi i. Yêu c u c a chương trình như sau:
  - Ban u ngư i s d ng nh p các thông tin v           i bóng, sau ó phân b ng và l ch
      thi u toàn gi i.
  - K t qu các tr n thi u ư c vào theo th t l ch thi u
  - Chương trình t       ng ch n các i vào vòng ti p theo cho t i tr n trung k t.
  - T i m i th i i m c a gi i chương trình có th ưa ra các thông tin v gi i.
Bài 2.16:
  M t quy n s i n tho i ch a các th có thông tin v tên, a ch và s i n tho i.
Thi t k các l p tương ng v i các th thông tin và s i n tho i. Vi t chương trình cho
phép qu n lý s i n tho i d a trên các l p xây d ng ư c.




                                                                        Trang 30
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.

       §Þnh nghÜa chång to¸n tö trªn líp

M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C
   Cách nh nghĩa các phép toán cho ki u d li u l p và c u trúc
   Các toán t chuy n ki u áp d ng cho ki u d li u l p

A/ NH C L I LÝ THUY T
   Toán t      ư c nh nghĩa ch ng b ng cách nh nghĩa m t hàm toán t . Tên hàm
toán t bao g m t khoá operator theo sau là ký hi u c a toán t           ư c nh nghĩa
ch ng.
   H u h t các toán t c a C++ u có th           nh nghĩa ch ng. Không th t o ra các ký
hi u phép toán m i.
   Ph i m b o các c tính nguyên thu c a toán t             ư c nh nghĩa ch ng, ch ng
h n:      ưu tiên, tr t t k t h p, sô ngôi.
   Không s d ng tham s có giá tr ng m nh              nh nghĩa ch ng toán t .
   Các toán t (), [], ->, = yêu c u hàm toán t ph i là hàm thành ph n c a l p.
   Hàm toán t có th là hàm thành ph n hay là hàm b n c a l p
   Khi hàm toán t là hàm thành ph n, toán h ng bên trái luôn là i thu c l p.
   N u toán h ng bên trái là i tư ng c a l p khác thì hàm toán t tương ng ph i là
hàm b n.
   Chương trình d ch không t bi t cách chuy n ki u gi a ki u d li u chu n và ki u
d li u t      nh nghĩa. Vì v y ngư i l p trình c n ph i mô t tư ng minh các chuy n i
này dư i d ng hàm thi t l p chuy n ki u hay hàm toán t chuy n ki u.
   M t hàm toán t chuy n ki u th c hi n chuy n i t m t i tư ng thư c l p sang
   i tư ng thu c l p khác ho c m t i tư ng có ki u ư c nh nghĩa trư c.
   Hàm thi t l p chuy n ki u có m t tham s và th c hi n chuy n           i t m t giá tr
sang i tư ng ki u l p.
   Toán t gán là toán t hay ư c nh nhgiã ch ng nh t, c bi t khi l p có các thành
ph n d li u ng.
          nh nghĩa ch ng toán t tăng, gi m m t ngôi, ph i phân bi t hai hàm toán t
tư ng ng cho d ng ti n t và d ng h u t .
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
     T o m t toán t
     Thay i nh nghĩa c a các toán t trên các ki u ư c nh nghĩa trư c
     Cho r ng vi c nh nghĩa ch ng m t toán t s t           ng kéo theo nh nghĩa ch ng
    c a các toán t liên quan.
     Quên nh nghĩa ch ng toán t gán và hàm thi t l p sao chép cho các l p có các
    thành ph n d li u ng.
   M t s thói quen l p trình t t
     S d ng toán t        nh nghĩa ch ng khi i u ó làm cho chương trình trong sáng
    hơn.
     Tránh l m d ng nh nghĩa ch ng toán t vì i u ó ãn n khó ki m soát chương
    trình.
     Chú ý n các tính ch t nguyên thu c a toán t        ư c nh nghĩa ch ng.
     Hàm thi t l p, toán t gán, hàm thi t l p sao chép c a m t l p thư ng i cùng
    nhau.

                                                                        Trang 31
L P TRÌNH HƯ NG   I TƯ NG V I C++         Smith Nguyen Studio.
C/ BÀI T P M U
Ví d 1:
   M t l p phân s có toán t c ng(+) ư c nh nghĩa như sau:
      class PS
        {
           public:
              PS(int ts=0, int ms=1);
              PS operator+(PS);
        };
   Trong các dòng l nh sau ây dòng nào sai?
     PS a,b,c;
     a=b+c;//(1)
     a=b+3;//(2)
     a=3+b;//(3)
L i gi i
     Trong ba dòng l nh thì hai dòng u là úng b i vì lúc ó ta có:
     (1) a=b.operator+(c) là toán t     ã ư c nh nghĩa trong l p phân s
     (2)     a=b.operator+(3) v i 3 s t    ng chuy n ki u thành phân s
     Dòng l nh (3) sai vì ta không có toán t c ng m t s nguyên v i m t phân s .
     có th th c hi n ư c t t c ba dòng l nh như trên thì toán t c ng trong l p PS
     ph i ư c nh nghĩa là m t hàm b n.
          class PS
        {
           public:
              PS(int ts=0, int ms=1);
              friend PS operator+(PS);
        };
     Khi ó các l i g i s tương ng v i toán t như sau:
        (1) a=operator+(b,c)
        (2) a=operator+(b,3)
        (3) a=operator+(3,b)

Ví d 2:Chúng ta xây d ng l p s ph c v i tên l p là Complex và a năng hóa toán t
+ trên l p này.
                                           CT3_1.CPP
           #include <iostream.h>
           class Complex                                                                11.
           {
                     private:
                               double Real,Imaginary;
                     public:
                               Complex(double R=0.0,double I=0.0);//Constructor mac
           dinh
                               void Print();//Hien thi so phuc
                               Complex operator + (Complex Z);//Phep cong hai so phuc
                               Complex operator + (double R);//Phep cong mot so phuc
           voi mot so thuc
           };

           Complex::Complex(double R,double I)
           {
                    Real = R;
                    Imaginary = I;
           }


                                                                               Trang 32
L P TRÌNH HƯ NG    I TƯ NG V I C++           Smith Nguyen Studio.
           void Complex::Print()
           {
                   cout<<'('<<Real<<','<<Imaginary<<')';
           }

           Complex Complex::operator + (Complex Z)
           {
                   Complex Tmp;
                   Tmp.Real = Real + Z.Real;
                   Tmp.Imaginary = Imaginary + Z.Imaginary;
                   return Tmp;
           }

           Complex Complex::operator + (double R)
           {
                   Complex Tmp;
                   Tmp.Real = Real + R;
                   Tmp.Imaginary = Imaginary;
                   return Tmp;
           }

           int main()
           {
                        Complex X,Y(4.3,8.2),Z(3.3,1.1);
                        cout<<"X: ";
                        X.Print();
                        cout<<endl<<"Y: ";
                        Y.Print();
                        cout<<endl<<"Z: ";
                        Z.Print();
                        X = Y + Z;
                        cout<<endl<<endl<<"X = Y + Z:"<<endl;
                        X.Print();
                        cout<<" = ";
                        Y.Print();
                        cout<<" + ";
                        Z.Print();
                        X = Y + 3.5;
                        cout<<endl<<endl<<"X = Y + 3.5:"<<endl;
                        X.Print();
                        cout<<" = ";
                        Y.Print();
                        cout<<" + 3.5";
                        return 0;
           }
                                                                         12.


      k t qu




                                                                  Trang 33
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.




Ví d 3:
       Cho m t l p có toán t chuy n ki u như sau:
   class A
          {
             public:
                operator int ();
          };
Khi ó ta có th s d ng câu l nh nào trong nh ng câu l n sau:
   A a;
   int i=a;//(1)
   float f=a;//(2)
L i gi i
   L nh (1) là úng b i vì ta ã có toán t ép ki u int nên chương trình t   ng ép ki u
v m t s nguyên. Còn l nh 2 sai b i vì ta không có toán t ép ki u float.
Ví d 4       a năng hóa toán t []  truy c p n m t ph n t c a vector.
                                        CT3_4.CPP
            #include <iostream.h>
            class Vector                                                     13.
            {
                    private:
                            int Size;
                            int *Data;
                    public:
                            Vector(int S=2,int V=0);
                            ~Vector();
                            void Print() const;
                            int & operator [] (int I);
            };

            Vector::Vector(int S,int V)
            {
                    Size = S;
                    Data=new int[Size];
                    for(int I=0;I<Size;++I)
                            Data[I]=V;
            }

            Vector::~Vector()
            {
                    delete []Data;
            }
            void Vector::Print() const
            {
                    cout<<"Vector:(";

                                                                      Trang 34
L P TRÌNH HƯ NG    I TƯ NG V I C++             Smith Nguyen Studio.
                     for(int I=0;I<Size-1;++I)
                             cout<<Data[I]<<",";
                     cout<<Data[Size-1]<<")"<<endl;
           }

           int & Vector::operator [](int I)
           {
                   return Data[I];
           }

           int main()
           {
                   Vector V(5,1);
                   V.Print();
                   for(int I=0;I<5;++I)
                           V[I]*=(I+1);
                   V.Print();
                   V[0]=10;
                   V.Print();
                   return 0;
           }
                                                                                       14.


      k t qu




Ví d 5: a năng hóa toán t ()          truy c p       n m t ph n t c a vector.
                                               CT3_5.CPP
            //Chuong trinh 4.6
           #include <iostream.h>                                                       15.

           class Vector
           {
                    private:
                                int Size;
                                int *Data;
                     public:
                                Vector(int S=2,int V=0);
                                ~Vector();
                                void Print() const;
                                int & operator () (int I);
           };

           Vector::Vector(int S,int V)
           {
                     Size = S;
                     Data=new int[Size];
                     for(int I=0;I<Size;++I)
                                 Data[I]=V;
           }

           Vector::~Vector()
           {

                                                                                Trang 35
L P TRÌNH HƯ NG     I TƯ NG V I C++                 Smith Nguyen Studio.
                     delete []Data;
            }
            void Vector::Print() const
            {
                     cout<<"Vector:(";
                     for(int I=0;I<Size-1;++I)
                                  cout<<Data[I]<<",";
                     cout<<Data[Size-1]<<")"<<endl;
            }

            int & Vector::operator ()(int I)
            {
                       return Data[I];
            }

            int main()
            {
                         Vector V(5,1);
                         V.Print();
                         for(int I=0;I<5;++I)
                                     V(I)*=(I+1);
                         V.Print();
                         V(0)=10;
                         V.Print();
                         return 0;
            }

                                                                                         16.


      k t                                                                                    qu




Ví d 6: a năng hóa toán t ()                truy c p      n ph n t c a ma tr n.
                                                    CT3_6.CPP
            //Chuong trinh 4.7
            #include <iostream.h>                                                        17.

            class Matrix
            {
                     private:
                                    int Rows,Cols;
                                    int **Data;
                         public:
                                    Matrix(int R=2,int C=2,int V=0);
                                    ~Matrix();
                                    void Print() const;
                                    int & operator () (int R,int C);
            };

            Matrix::Matrix(int R,int C,int V)
            {
                      int I,J;
                      Rows=R;
                      Cols=C;

                                                                                  Trang 36
L P TRÌNH HƯ NG    I TƯ NG V I C++              Smith Nguyen Studio.
                        Data = new int *[Rows];
                        int *Temp=new int[Rows*Cols];
                        for(I=0;I<Rows;++I)
                        {
                                   Data[I]=Temp;
                                   Temp+=Cols;
                        }
                        for(I=0;I<Rows;++I)
                                   for(J=0;J<Cols;++J)
                                             Data[I][J]=V;
           }

           Matrix::~Matrix()
           {
                     delete [] Data[0];
                     delete [] Data;
           }

           void Matrix::Print() const
           {
                       int I,J;
                       for(I=0;I<Rows;++I)
                       {
                                  for(J=0;J<Cols;++J)
                                  {
                                            cout.width(5);//Hien thi canh ler phai voi chieu
           dai 5 ky tu
                                            cout<<Data[I][J];
                                  }
                                  cout<<endl;
                       }
           }

           int & Matrix::operator () (int R,int C)
           {
                      return Data[R][C];
           }

           int main()
           {
                        int I,J;
                        Matrix M(2,3,1);
                        cout<<"Matrix:"<<endl;
                        M.Print();
                        for(I=0;I<2;++I)
                                   for(J=0;J<3;++J)
                                             M(I,J)*=(I+J+1);
                        cout<<"Matrix:"<<endl;
                        M.Print();
                        return 0;
           }

                                                                                               18.


      k t qu




                                                                                     Trang 37
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.




Ví d 7:   a năng hóa toán t ++ và --
                                       CT3_7.CPP
           #include <iostream.h>
                                                            19.
           class Point
           {
                   private:
                           int X,Y;
                   public:
                           Point(int A=0,int B=0);
                           Point operator ++();
                           Point operator --();
                           void Print() const;
           };

           Point::Point(int A,int B)
           {
                   X = A;
                   Y = B;
           }

           Point Point::operator++()
           {
                   ++X;
                   ++Y;
                   return *this;
           }

           Point Point::operator--()
           {
                   --X;
                   --Y;
                   return *this;
           }

           void Point::Print() const
           {
                   cout<<"X="<<X<<",Y="<<Y<<endl;
           }

           int main()
           {
                   Point P1(2,6),P2(5,8);
                   cout<<"Point 1:";
                   P1.Print();
                   cout<<"Point 2:";
                   P2.Print();
                   ++P1;
                   --P2;
                   cout<<"Point 1:";
                   P1.Print();

                                                     Trang 38
L P TRÌNH HƯ NG    I TƯ NG V I C++       Smith Nguyen Studio.
                     cout<<"Point 2:";
                     P2.Print();
                     return 0;
           }
                                                               20.


K t qu




Ví d 8: a năng hóa toán t d u ph y.
                                         CT3_8.CPP
               #include <iostream.h>
                                                               21.
           class Point
           {
                   private:
                           int X,Y;
                   public:
                           Point(int A=0,int B=0);
                           Point operator +(Point P);
                           Point operator ,(Point P);
                           void Print() const;
           };

           Point::Point(int A,int B)
           {
                   X = A;
                   Y = B;
           }

           Point Point::operator+(Point P)
           {
                   Point Tmp;
                   Tmp.X=X+P.X;
                   Tmp.Y=Y+P.Y;
                   return Tmp;
           }

           Point Point::operator,(Point P)
           {
                   Point Tmp;
                   Tmp.X=P.X;
                   Tmp.Y=P.Y;
                   cout<<P.X<<" "<<P.Y<<endl;
                   return Tmp;
           }

           void Point::Print() const
           {
                   cout<<"X="<<X<<",Y="<<Y<<endl;
           }


                                                        Trang 39
L P TRÌNH HƯ NG   I TƯ NG V I C++     Smith Nguyen Studio.
           int main()
           {
                   Point P1(2,6),P2(5,20),P3(1,1);
                   cout<<"Point 1:";
                   P1.Print();
                   cout<<"Point 2:";
                   P2.Print();
                   cout<<"Point 3:";
                   P3.Print();
                   P1=(P1,P1+P2,P3);
                   cout<<"Point 1:";
                   P1.Print();
                   return 0;
           }
                                                              22.

k t qu




Ví d 9: a năng hóa toán t ->.
                                       CT3_9.CPP
           #include <iostream.h>
                                                              23.
           class MyClass
           {
                   public:
                             int Data;
                             MyClass * operator ->()
                             {
                                     return this;
                             }
           };

           int main()
           {
                   MyClass M;
                   M->Data = 10;
                   cout<<M.Data<<" "<<M->Data;
                   return 0;
           }
                                                              24.

k t qu




Ví d 10: a năng hóa toán t gán.
                                       CT3_10.CPP



                                                       Trang 40
L P TRÌNH HƯ NG   I TƯ NG V I C++    Smith Nguyen Studio.
            #include <iostream.h>
           #include <string.h>                                       25.

           class String
           {
                   private:
                           char *St;
                           int Len;
                   public:
                           String(char *S);
                           ~String();
                           char *GetStr();
                           String & operator=(String &Obj);
           };

           String::String(char *S)
           {
                   Len=strlen(S);
                   St=new char[Len+1];
                   strcpy(St,S);
           }

           String::~String()
           {
                   delete []St;
           }

           char * String::GetStr()
           {
                   return St;
           }

           String & String::operator=(String &Obj)
           {
                   if (Len< Obj.Len)
                   {
                           delete [] St;
                           St=new char[Obj.Len+1];
                   }
                   Len=Obj.Len;
                   strcpy(St,Obj.St);
                   return *this;
           }

           int main()
           {
                   String S1("Hello"), S2("Chao");
                   cout<<"S1="<<S1.GetStr()<<endl;
                   cout<<"S2="<<S2.GetStr()<<endl;
                   S2=S1;
                   cout<<"S1="<<S1.GetStr()<<endl;
                   cout<<"S2="<<S2.GetStr()<<endl;
                   return 0;
           }


                                                                     26.

k t qu




                                                              Trang 41
L P TRÌNH HƯ NG   I TƯ NG V I C++    Smith Nguyen Studio.



Ví d 11: Chúng ta s xây d ng m t l p x lý vi c t o và thao tác trên các chu i
(string). C++ không cài s n ki u d li u chu i. Nhưng C++ cho phép chúng ta thêm
ki u chu i như m t l p thông qua cơ ch a năng hóa.
                                     CT3_11.CPP
           #include   <iostream.h>
           #include   <iomanip.h>                                        27.
           #include   <string.h>
           #include   <assert.h>

           class String
           {
                   private:
                           char *Ptr;     //Con tro tro den diem bat
           dau cua chuoi
                           int Length; //Chieu dai chuoi
                   public:
                           String(const char * = ""); //Constructor
           chuyen doi
                           String(const String &);       //Constructor
           sao chep
                           ~String();                 //Destructor
                           const String &operator=(const String &);
           //Phep gan
                           String &operator+=(const String &);
                           int operator!() const;
                           int operator==(const String &) const;
                           int operator!=(const String &) const;
                           int operator<(const String &) const;
                           int operator>(const String &) const;
                           int operator>=(const String &) const;
                           int operator<=(const String &) const;
                           char & operator[](int);         //Tra ve ky
           tu tham chieu
                           String &operator()(int, int); //Tra ve mot
           chuoi con
                           int GetLength() const;
                           friend   ostream   &operator<<(ostream   &,
           const String &);
                           friend   istream   &operator>>(istream   &,
           String &);
           };

           //Constructor sao chep: Chuyen doi char * thanh String
           String::String(const char *S)
           {
                   cout << "Conversion constructor: " << S << endl;
                   Length = strlen(S);
                   Ptr = new char[Length + 1];
                   assert(Ptr != 0);
                   strcpy(Ptr, S);
           }

           String::String(const String &Copy)
           {
                   cout << "Copy constructor: " << Copy.Ptr << endl;

                                                                 Trang 42
L P TRÌNH HƯ NG   I TƯ NG V I C++    Smith Nguyen Studio.
                    Length = Copy.Length;
                    Ptr = new char[Length + 1];
                    assert(Ptr != 0);
                    strcpy(Ptr, Copy.Ptr);
           }

           //Destructor
           String::~String()
           {
                   cout << "Destructor: " << Ptr << endl;
                   delete [] Ptr;
           }

           const String &String::operator=(const String &Right)
           {
                   cout << "operator= called" << endl;
                   if (&Right != this)
                   {
                           delete [] Ptr;
                           Length = Right.Length;
                           Ptr = new char[Length + 1];
                           assert(Ptr != 0);
                           strcpy(Ptr, Right.Ptr);
                   }
                   else
                           cout << "Attempted assignment of a String
           to itself" << endl;
                   return *this;
           }

           String &String::operator+=(const String &Right)
           {
                   char *TempPtr = Ptr;
                   Length += Right.Length;
                   Ptr = new char[Length + 1];
                   assert(Ptr != 0);
                   strcpy(Ptr, TempPtr);
                   strcat(Ptr, Right.Ptr);
                   delete [] TempPtr;
                   return *this;
           }

           int String::operator!() const
           {
                   return Length == 0;
           }

           int String::operator==(const String &Right) const
           {
                   return strcmp(Ptr, Right.Ptr) == 0;
           }

           int String::operator!=(const String &Right) const
           {
                   return strcmp(Ptr, Right.Ptr) != 0;
           }

           int String::operator<(const String &Right) const
           {
                   return strcmp(Ptr, Right.Ptr) < 0;
           }

           int String::operator>(const String &Right) const

                                                               Trang 43
L P TRÌNH HƯ NG   I TƯ NG V I C++    Smith Nguyen Studio.
           {
                    return strcmp(Ptr, Right.Ptr) > 0;
           }

           int String::operator>=(const String &Right) const
           {
                   return strcmp(Ptr, Right.Ptr) >= 0;
           }

           int String::operator<=(const String &Right) const
           {
                   return strcmp(Ptr, Right.Ptr) <= 0;
           }

           char &String::operator[](int Subscript)
           {
                   assert(Subscript >= 0 && Subscript < Length);
                   return Ptr[Subscript];
           }

           String &String::operator()(int Index, int SubLength)
           {
                   assert(Index >= 0 && Index < Length && SubLength
           >= 0);
                   String *SubPtr = new String;
                   assert(SubPtr != 0);
                   if ((SubLength == 0) || (Index + SubLength >
           Length))
                           SubPtr->Length = Length - Index + 1;
                   else
                           SubPtr->Length = SubLength + 1;
                   delete SubPtr->Ptr;
                   SubPtr->Ptr = new char[SubPtr->Length];
                   assert(SubPtr->Ptr != 0);
                   strncpy(SubPtr->Ptr, &Ptr[Index], SubPtr->Length);
                   SubPtr->Ptr[SubPtr->Length] = '0';
                   return *SubPtr;
           }

           int String::GetLength() const
           {
                   return Length;
           }
           ostream &operator<<(ostream &Output, const String &S)
           {
                   Output << S.Ptr;
                   return Output;
           }

           istream &operator>>(istream &Input, String &S)
           {
                   char Temp[100];
                   Input >> setw(100) >> Temp;
                   S = Temp;
                   return Input;
           }

           int main()
           {
                   String S1("happy"), S2(" birthday"), S3;
                   cout << "S1 is "" << S1 << ""; S2 is "" << S2
                             << ""; S3 is "" << S3 << '"' << endl
                             << "The results of comparing S2 and S1:"

                                                                   Trang 44
L P TRÌNH HƯ NG    I TƯ NG V I C++    Smith Nguyen Studio.
           << endl
                                << "S2 == S1 yields " << (S2 == S1) <<
           endl
                                << "S2 != S1 yields " << (S2 != S1) <<
           endl
                                << "S2 >   S1 yields " << (S2 > S1) <<
           endl
                                << "S2 <   S1 yields " << (S2 < S1) <<
           endl
                                << "S2 >= S1 yields " << (S2 >= S1) <<
           endl
                                << "S2 <= S1 yields " << (S2 <= S1) <<
           endl;
                   cout << "Testing !S3:" << endl;
                   if (!S3)
                   {
                           cout << "S3 is empty; assigning S1 to S3;"
           << endl;
                           S3 = S1;
                           cout << "S3 is "" << S3 << """ << endl;
                   }
                   cout << "S1 += S2 yields S1 = ";
                   S1 += S2;
                   cout << S1 << endl;
                   cout << "S1 += " to you" yields" << endl;
                   S1 += " to you";
                   cout << "S1 = " << S1 << endl;
                   cout << "The substring of S1 starting at" << endl
                             << "location 0 for 14 characters, S1(0,
           14), is: "
                             << S1(0, 14) << endl;
                   cout << "The substring of S1 starting at" << endl
                             << "location 15, S1(15, 0), is: "
                             << S1(15, 0) <<endl; // 0 is "to end of
           string"
                   String *S4Ptr = new String(S1);
                   cout << "*S4Ptr = " << *S4Ptr <<endl;
                   cout << "assigning *S4Ptr to *S4Ptr" << endl;
                   *S4Ptr = *S4Ptr;
                   cout << "*S4Ptr = " << *S4Ptr << endl;
                   delete S4Ptr;
                   S1[0] = 'H';
                   S1[6] = 'B';
                   cout <<"S1 after S1[0] = 'H' and S1[6] = 'B' is:
           "<< S1 << endl;
                   cout << "Attempt to assign 'd' to S1[30] yields:"
           << endl;
                   S1[30] = 'd'; //Loi: Chi so vuot khoi mien!!!
                   return 0;
           }




                                                                         28.


k t qu




                                                                 Trang 45
L P TRÌNH HƯ NG   I TƯ NG V I C++   Smith Nguyen Studio.




D/ BÀI T P T GI I
Câu h i tr c nghi m
Câu 1:
   nh nghĩa nào úng cho toán t nh p(>>) c a m t l p T
   a) istream& operator>>(istream&);
   b) istream& operator>>(istream);
   c) friend istream& operator>>(istream&, T&);
   d) friend istream& operator>>(istream&, T);
                                                        Trang 46
L P TRÌNH HƯ NG   I TƯ NG V I C++     Smith Nguyen Studio.
Câu 2
 nh nghĩa nào phù h p nh t cho toán t l y thành ph n([]) c a l p m ng A
  a) int operator [] (int)
  b) int& operator [] (int)
  c) friend int operator [] (A&, int)
  d) friend int& operator [] (A&, int)
Câu 3:
Ch ra cách nh nghĩa toán t cho l p T b sai
  a) T operator-(T&)
  b) T operator-()
  c) T operator-()
  d) friend T opreator +(T&);
  e) T operator +(T&);
Câu 4:
Ch ra cách nh nghĩa toán t cho l p T bíai
  a) T& operator ++()
  b) T operator ++();
  c) T& operator++(int);
  d) T&operator++(float)
Câu 5:
Cho l p A
  class A
     {
       public:
         operator int ();
       };
       A a;
       int i=a;(1)
       float f=a;(2)
Ch ra dòng nào có l i
  a) Ch dòng 1 l i
  b) Ch dòng 2 l i
  c) C hai dòng u l i
  d) Không dòng nào l i
Bài tâp

Bài 1:
   T o ki u d li u Date bi u di n ngày, tháng, năm. Cài t các toán t        tính m t
ngày trư c ho c sau m t ngày xác nh nào ó, tính kho ng cách thao ngày gi a hai
ngày xác nh, tính th trong tu n c a ngày. Các toán t
vào ra cho ngày.
Bài 2:
        lưu tr m t ma tr n i x ng thì không c n     ô nh cho t t c các ph n t c a
nó. Xây d ng l p bi u di n ma tr n i x ng có các toán t truy nh p t ng ph n t c a
ma tr n. Ch s d ng       lư ng b nh c n thi t    lưu ma tr n i x ng
Bài 3
   Xây d ng l p bi u di n các a th c v i các toán t c ng, tr , nhân, chia và o d u.
   nh nghĩa toán t xu t    k t xu t.
Bài 4:
   Xây d ng m t l p map cho phép bi u di n m t ánh x t m t chu i kí t thành m t
giá tr s nguyên. nh nghĩa toán t [] cho l p     có th s d ng ánh x theo cách như
[“abc”]->5

                                                                     Trang 47
L P TRÌNH HƯ NG   I TƯ NG V I C++    Smith Nguyen Studio.
Bài 5
  Xây d ng m t l p bi u di n các vector n chi u v i các toán t c ng, tr , tích có
hư ng hai vector và tích vô hư ng m t vector v i m t s th c. nh nghĩa toán t cho
phép truy nh p các thành ph n c a vector.




                                                                   Trang 48
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.

                      Kü thuËt thõa kÕ

M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C
   Cài t ư c s th a k
   S d ng các thành ph n c a l p cơ s
      nh nghĩa l i các hàm thành ph n
   Truy n thông tin gi a các hàm thi t l p c a l p d n xu t và l p cơ s
   Các lo i d n xu t khác nhau và s thay i tr ng thái c a các thành ph n l p cơ
    s .
   S tương thích gi a các i tư ng c a l p d n xu t và l p cơ s
   Toán t gán và th a k
   Hàm o và tính a hình

A/ NH C L I LÝ THUY T
   Th a k nâng cao kh năng s d ng l i c a các o n mã chương trình.
   Ngư i l p trình có th khai báo l p m i th a th a k d li u và hàm thành ph n t
l p cơ s ã ư c nh nghĩa trư c ó. Ta g i l p m i là l p d n xu t.
   Trong ơn th a k , m t l p ch có th có m t l p cơ s . Trong a th a k cho phép
m t l p là d n xu t c a nhi u l p
   L p d n xu t thư ng b sung các thành ph n d li u và các hàm thành ph n trong
  nh nghĩa, ta nói l p d n xu t c th hơn so v i l p cơ s và vì v y thư ng mô t m t
l p các i tư ng có ph p vi h p hơn l p cơ s .
   L p d n xu t không có quy n truy nh p n các thành ph n private c a l p cơ s .
Tuy nhiên l p cơ s có quy n truy xu t n các thành ph n công c ng và ư c b o
v (proteced).
   Hàm thi t l p c a l p d n xu t thư ng t      ng g i các hàm thi t l p c a các l p cơ
s     kh i t o giá tr cho các thành ph n trong l p cơ s .
   Hàm hu b ư c g i theo th t ngư c l i.
   Thu c tính truy nh p protected là m c trung gian gi a thu c tính public và private.
Ch có các hàm thành ph n và hàm b n c a l p cơ s và l p d n xu t có quy n truy
xu t n các thành ph n protected c a l p cơ s .
   Có th     nh nghĩa l i các thành ph n c a l p cơ s trong l p d n xu t khi thành ó
không còn phù h p trong l p d n xu t.
   Có th gán n i dung i tư ng l p d n xu t cho m t i tư ng l p cơ s . M t con
tr l p d n xu t có th chuy n i thành con tr l p cơ s .
   Hàm o ư c khai báo v i t khoá virtual trong l p cơ s .
   Các l p d n xu t có th ưa ra các cài t l i cho các hàm o c a l p cơ s n u
mu n, trái l i chúng có th s d ng nh nghĩa ã nêu trong l p cơ s .
   N u hàm o ư c g i b ng cách tham chi u qua tên m t i tư ng thì tham chi u
  ó ư c xác nh d a trên l p c a i tư ng tương ng.
   M t l p có hàm o không có nh nghĩa(hàm o thu n tuý) ư c g i là l p tr u
tư ng. Các l p tr u tư ng không th dùng          khai báo các    i tư ng nhưng có th
khai báo con tr có ki u l p tr u tư ng.
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
    Cho con tr l p d n xu t ch      n i tư ng l p cơ s mà không m b o ch c ch n
   r ng phiên b n m i c a hàm trong l p d n xu t cũng tr v cùng gái tr như phiên
   b n cũ c a hàm.
    Khai báo i tư ng c a l p tr u tư ng
                                                                        Trang 49
L P TRÌNH HƯ NG   I TƯ NG V I C++      Smith Nguyen Studio.
     Khai báo hàm thi t l p là hàm o.
    M t s thói quen l p trình t t
    Khi th a k các kh năng không c n thi t trong l p d n xu t, t t nh t nên nh nghĩa
l i chúng.
C/ BÀI T P M U
Ví d 1:
    Gi s có các l p như trong khai báo. Ch ra các l i sai cho các l nh c a chương
trình vi t dư i ây.
    class A
     {
        public:
           void func();
     };
    class B: private class A
      { };
    A a;
    B b;
    a.func();
    A* pA =&b;
    B* pB=&a;
L i gi i
    L i g i b.func() có l i b i vì l p B k th a l p A theo ch   private. Do v y, t t c
các thành ph n c a A s là private trong B, hơn n a không th truy nh p vào m t
thành ph n private.
    M t i tư ng c a l p d n xu t cũng có th coi là i tư ng c a l p cơ s . Do v y,
khia báo A* pA=&b là hoàn toàn úng. Nhưng i u ngư c l i là không úng, nên khai
báo B* pB=&a s gây l i khi biên d ch.
Ví d 2: Qu n lý h c viên

                                        CT4_2.CPP
            #include <iostream.h>
            #include <conio.h>                                                 29.
            class person_data
            {
               public:
                 void getinfo();
                 void display();
                 person_data();
                 virtual ~person_data();
               private:
                 char name[25];
                 int roll_no;
                 char sex;
            };
            person_data::person_data()
            {

            }

            person_data::~person_data()
            {

            }
            void person_data::getinfo()
            {
              cout << "Ten: ";

                                                                       Trang 50
L P TRÌNH HƯ NG   I TƯ NG V I C++    Smith Nguyen Studio.
               cin>> name;
               cout<<"So: ";
               cin>>roll_no;
               cout<<"Gioi tinh(F/M) : ";
               cin>> sex;
           }

           void person_data:: display()
           {
              cout<<name<<"t";
              cout<<roll_no<<"t";
              cout<<sex<<"t";
           }
           //-----------------------------------
           class academics
           {
              public:
                void getinfo();
                void display();
                academics();
                virtual ~academics();
              private:
                char course_name[25];
                int semester;
                char grade[3];
           };
           academics::academics()
           {

           }

           academics::~academics()
           {

           }

           void academics::getinfo()
           {
             cout<<"Ten khoa (BA/MBA/MCA etc)? ";
             cin>>course_name;
             cout<< "Hoc ky (1/2/3/...)? ";
             cin>>semester;
             cout<<"muc do (A,B,B+,B-..) ? ";
             cin>>grade;
           }

           void academics::display()
           {
             cout<<course_name<<"t";
             cout<<semester<<"t";
             cout<<grade<<"t";
           }
           //-------------------------------

           class stud_scholarship :
             public person_data,
             public academics
           {
             public:
                void getinfo();
                void display();
                stud_scholarship();
                virtual ~stud_scholarship();

                                                    Trang 51
L P TRÌNH HƯ NG     I TƯ NG V I C++    Smith Nguyen Studio.
                private:
                  float amount;

            };
            stud_scholarship::stud_scholarship()
            {

            }

            stud_scholarship::~stud_scholarship()
            {

            }

            void stud_scholarship::getinfo()
            {
              person_data::getinfo();
              academics::getinfo();
              cout<<"Su ho tro ";
              cin>>amount;
            }
            void stud_scholarship::display()
            {
              person_data::display();
              academics::display();
              cout<<amount<<endl;
            }
            //----------------------------------
            int main()
            {
              stud_scholarship obj;
              cout<<"Nhap cac thong tin sau: "<<endl;
              obj.getinfo();
              cout<<endl;
              cout<<"Ten     So Gioi tinh    Khoa  Hoc ky       Muc do";
              cout<<"     Amount"<<endl;
              obj.display();

                return 0;
            }
                                                                              30.

D/ BÀI T P T      GI I

Bài 1: Xây d ng l p Stack v i các thao tác c n thi t. T   ó hãy d n xu t t l p Stack
     i m t s nguyên dương sang h       m b t kỳ.

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

Bài 3: Hãy xây d ng các l p c n thi t trong phân c p hình 5.3    tính di n tích (ho c
di n tích xung quanh) và th tích.

Bài 4: Vi t m t phân c p k th a cho các l p Quadrilateral (hình t giác), Trapezoid
(hình thang), Parallelogram (hình bình hành), Rectangle (hình ch nh t), và Square
(hình vuông). Trong ó Quadrilateral là l p cơ s c a phân c p.




                                                                      Trang 52

More Related Content

PDF
Sổ tay thư viện hàm ngôn ngữ C
PDF
Các cấu trúc lệnh trong C
PDF
LAP TRINH C - SESSION 2
DOCX
Giao trinh c++ aptech
DOC
Bai tap lap trinh c
PDF
Lập trình C cơ bản cho vi điều khiển
PDF
Hàm và Chuỗi
PDF
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Sổ tay thư viện hàm ngôn ngữ C
Các cấu trúc lệnh trong C
LAP TRINH C - SESSION 2
Giao trinh c++ aptech
Bai tap lap trinh c
Lập trình C cơ bản cho vi điều khiển
Hàm và Chuỗi
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...

What's hot (14)

PDF
Phong cach lap trinh c++
PDF
Ky thuat lap trinh c++
PDF
PDF
Giao trinh bai tap c va c++
PDF
C9 templates
PPTX
PDF
Ngon ngu c theo chuan ansi
PDF
lap trinh c Phan2 chuong5
PDF
Huong dan su dung va debug voi dev c++
PDF
Phần 6: Hàm
DOCX
Giáo trình c++ full tiếng việt
PPT
Nmlt c02 gioi_thieunnltc
DOCX
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
PPTX
Bài 18 tin hoc 11
Phong cach lap trinh c++
Ky thuat lap trinh c++
Giao trinh bai tap c va c++
C9 templates
Ngon ngu c theo chuan ansi
lap trinh c Phan2 chuong5
Huong dan su dung va debug voi dev c++
Phần 6: Hàm
Giáo trình c++ full tiếng việt
Nmlt c02 gioi_thieunnltc
Bài giảng Lập trình cơ bản - truongkinhtethucpham.com
Bài 18 tin hoc 11
Ad

Similar to Lap trinh huong doi tuong voi c++ smith.n studio (20)

PDF
C++ can ban
PDF
C3 functions and_library
PDF
C3 functions and_library
PDF
C++ can ban(dung thu vien iostream)
PDF
Chuong 01 - Cac dac diem moi cua C++.pdf
PDF
Lap trinh huong_doi_tuong
PDF
C2 basics of_c_and_cpp
PDF
C2 basics of_c_and_cpp
PDF
Pdf bai tap_nen_tang_lap_trinh_-_c#-mastercode.vn
DOC
Bồi dưỡng HSG Tin chuyên đề thuật toán
PPT
Giáo trình lập trình C
PPTX
Project - Ham - Chuong trinh con trong C++.pptx
PDF
Ctdl lab01
PDF
Kythuatlaptrinhtrongc++dehieunhathemattroi
PDF
Chuong 09 vb
DOC
Chuong 2
PDF
Pascal 2
PPTX
Hàm(Funtion),khái niệm, cú pháp, lợi ích, ví dụ
PPT
C++ can ban
C3 functions and_library
C3 functions and_library
C++ can ban(dung thu vien iostream)
Chuong 01 - Cac dac diem moi cua C++.pdf
Lap trinh huong_doi_tuong
C2 basics of_c_and_cpp
C2 basics of_c_and_cpp
Pdf bai tap_nen_tang_lap_trinh_-_c#-mastercode.vn
Bồi dưỡng HSG Tin chuyên đề thuật toán
Giáo trình lập trình C
Project - Ham - Chuong trinh con trong C++.pptx
Ctdl lab01
Kythuatlaptrinhtrongc++dehieunhathemattroi
Chuong 09 vb
Chuong 2
Pascal 2
Hàm(Funtion),khái niệm, cú pháp, lợi ích, ví dụ
Ad

More from na (15)

PDF
Gtrinh oop
 
PDF
Ky.thuat.vi.xu.ly uds
 
PPT
Chuong13
 
PPT
Chuong12
 
PPT
Chuong11
 
PPT
Chuong09
 
PPT
Chuong08
 
PPT
Chuong07
 
PPT
Chuong06
 
PPT
Chuong05
 
PPT
Chuong04
 
PPT
Chuong03
 
PPT
Chuong02
 
PPT
Chuong01
 
PPT
Chuong10
 
Gtrinh oop
 
Ky.thuat.vi.xu.ly uds
 
Chuong13
 
Chuong12
 
Chuong11
 
Chuong09
 
Chuong08
 
Chuong07
 
Chuong06
 
Chuong05
 
Chuong04
 
Chuong03
 
Chuong02
 
Chuong01
 
Chuong10
 

Recently uploaded (20)

PDF
Quản trị sự kiện........................
PDF
Quyền-biểu-tình-của-công-dân-theo-hiến-pháp-Việt-Nam.pdf
PDF
CHƯƠNG 1-P2: ĐẢNG CỘNG SẢN VIỆT NAM RA ĐỜI VÀ LÃNH ĐẠO ĐẤU TRANH GIÀNH CHÍNH ...
PDF
Vision - Language - Model-- - Ebook.pdf
PDF
PHÁT TRIỂN NĂNG LỰC KHÁM PHÁ TỰ NHIÊN CHO HỌC SINH TRONG DẠY HỌC CHỦ ĐỀ VẬT S...
PPTX
Direct Marketing- chieu thi truyen thong
DOCX
Báo cáo thực tập công ty Ah-GlobalGroup vị trí Data Analyst
PPTX
Vai trò vô cùng quan trọng để thuyết trình.pptx
PPTX
Xuất huyết tiêu hoá Đại học Y Hà Nội.pptx
PPTX
Giáo án Lý Luận Chung về Hành chính Nhà nước cập nhật mới....
DOCX
Luận văn group-Bài tiểu luận Ý thức - Giấc mơ.docx
PPT
Bài giảng Power Point 2003, hướng dẫn học tập
DOC
TẦM QUAN TRỌNG CỦA VIỆC TUÂN THỦ CÁC QUY TẮC AN TOÀN GIAO THÔNG ĐƯỜNG BỘ
PDF
BÀI TẬP TEST FOR UNIT TIẾNG ANH LỚP 8 GLOBAL SUCCESS CẢ NĂM THEO TỪNG ĐƠN VỊ ...
PDF
BÀI TẬP TEST BỔ TRỢ THEO TỪNG UNIT - TIẾNG ANH 10 GLOBAL SUCCESS - CẢ NĂM (30...
PPTX
Bài giảng chương 3 phương pháp luận nghiên cứu khoa học_HQH.pptx
PPT
BÀi giảng phương pháp luận nghiên cứu khoa học.ppt
PPTX
Triết học: Vận dụng nguyên tắc phát triển trong nhận thức và hoạt động thực...
PPTX
Chương 1 – Tổng quan về Cơ sở dữ liệu.pptx
DOCX
xin loi vi da den bai hoc cuo bd thnnn 2
Quản trị sự kiện........................
Quyền-biểu-tình-của-công-dân-theo-hiến-pháp-Việt-Nam.pdf
CHƯƠNG 1-P2: ĐẢNG CỘNG SẢN VIỆT NAM RA ĐỜI VÀ LÃNH ĐẠO ĐẤU TRANH GIÀNH CHÍNH ...
Vision - Language - Model-- - Ebook.pdf
PHÁT TRIỂN NĂNG LỰC KHÁM PHÁ TỰ NHIÊN CHO HỌC SINH TRONG DẠY HỌC CHỦ ĐỀ VẬT S...
Direct Marketing- chieu thi truyen thong
Báo cáo thực tập công ty Ah-GlobalGroup vị trí Data Analyst
Vai trò vô cùng quan trọng để thuyết trình.pptx
Xuất huyết tiêu hoá Đại học Y Hà Nội.pptx
Giáo án Lý Luận Chung về Hành chính Nhà nước cập nhật mới....
Luận văn group-Bài tiểu luận Ý thức - Giấc mơ.docx
Bài giảng Power Point 2003, hướng dẫn học tập
TẦM QUAN TRỌNG CỦA VIỆC TUÂN THỦ CÁC QUY TẮC AN TOÀN GIAO THÔNG ĐƯỜNG BỘ
BÀI TẬP TEST FOR UNIT TIẾNG ANH LỚP 8 GLOBAL SUCCESS CẢ NĂM THEO TỪNG ĐƠN VỊ ...
BÀI TẬP TEST BỔ TRỢ THEO TỪNG UNIT - TIẾNG ANH 10 GLOBAL SUCCESS - CẢ NĂM (30...
Bài giảng chương 3 phương pháp luận nghiên cứu khoa học_HQH.pptx
BÀi giảng phương pháp luận nghiên cứu khoa học.ppt
Triết học: Vận dụng nguyên tắc phát triển trong nhận thức và hoạt động thực...
Chương 1 – Tổng quan về Cơ sở dữ liệu.pptx
xin loi vi da den bai hoc cuo bd thnnn 2

Lap trinh huong doi tuong voi c++ smith.n studio

  • 1. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. 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. Trang 1
  • 2. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. 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. 1. */ #include <iostream.h> void main() { int I; for(I = 0; I < 10 ; ++ I)// 0 - 9 cout<<I<<"n"; // In ra 0 - 9 } 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:"; Trang 2
  • 3. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. 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 1n”; cout<<”2. Cong viec 2n”; cout<<”3. Cong viec 3n”; cout<<”4. Ket thuc chuong trinh nn”; } 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 1n”; break; case 2:cout<<”Thuc hien cong viec 2n”; break; case 3:cout<<”Thuc hien cong viec 3n”; 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 ig 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ú ý Trang 3
  • 4. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. 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 Trang 4
  • 5. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. 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++) Trang 5
  • 6. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. 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 phatn"; } 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 xepn"; 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 xepn"; for(I=0;I<N;++I) cout<<P[I]<<" "; delete []P; } k t qu Trang 6
  • 7. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. 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)) { Trang 7
  • 8. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. 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) { Trang 8
  • 9. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. 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); Trang 9
  • 10. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. c)func(1.5,2.5); d)func(1,2); Câu 3: Cho bi t giá tr c a y sau khi th c hi n: int &foo(int &a) { a++; return a; } int i=5; int &r=foo(i); r++; a) i=5; b) i=6; c) i=7; d) không câu nào úng Câu 4: Tìm giá tr c a x, y: void test(int &a, int b) { a+=b; b=a; } int x=1,y=2; test(x,y); a) x=1,y=2; b) x=1,y=3 c) x=3,y=2 d) x=3,y=3 Bài t p t gi i Bài 1.1: Anh (ch ) hãy vi t l i chương trình sau b ng cách s d ng l i các dòng nh p/xu t trong C++. /* Chương trình tìm m u chung nh nh t */ #include <stdio.h> void main() { int a,b,i,min; printf("Nhap vao hai so:"); scanf("%d%d",&a,&b); min=a>b?b:a; Trang 10
  • 11. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. for(i = 2;i<min;++i) if (((a%i)==0)&&((b%i)==0)) break; if(i==min) { printf("Khong co mau chung nho nhat"); } printf("Mau chung nho nhat la %dn",i); } Bài 1.2: Vi t chương trình nh p vào s nguyên dương h (2<h<23), sau ó in ra các tam giác có chi u cao là h như các hình sau: Bài 1.3: M t tam giác vuông có th có t t c các c nh là các s nguyên. T p c a ba s nguyên c a các c nh c a m t tam giác vuông ư c g i là b ba Pitago. ó là t ng bình phương c a hai c nh b ng bình phương c a c nh huy n, ch ng h n b ba Pitago (3, 4, 5). Vi t chương trình tìm t t c các b ba Pitago như th sao cho t t c các c nh không quá 500. 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. Bài 1.5: Vi t chương trình nh p vào m t s nguyên dương n. Ki m tra xem s nguyên n có thu c dãy Fibonacci không? Bài 1.6: Vi t chương trình nhân hai ma trân Amxn và Bnxp. M i ma tr n ư c c p phát ng và các giá tr c a chúng phát sinh ng u nhiên (V i m, n và p nh p t bàn phím). Trang 11
  • 12. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Bài 1.7: Vi t chương trình t o m t m ng m t chi u ng có kích thư c là n (n nh p t bàn phím). Các giá tr c a m ng này ư c phát sinh ng u nhiên trên o n [a, b] v i a và b u nh p t bàn phím. Hãy tìm s dương nh nh t và s âm l n nh t trong m ng; n u không có s dương nh nh t ho c s âm l n nh t thì xu t thông báo "không có s dương nh nh t" ho c "không có s âm l n nh t". Bài 1.8: Anh (ch ) hãy vi t m t hàm tính bình phương c a m t s . Hàm s tr v giá tr bình phương c a tham s và có ki u cùng ki u v i tham s . Bài 1.9: Trong ngôn ng C, chúng ta có hàm chuy n i m t chu i sang s , tùy thu c vào d ng c a chu i chúng ta có các hàm chuy n i sau : int atoi(const char *s); Chuy n i m t chu i s thành s nguyên ki u int. long atol(const char *s); Chuy n i m t chu i s thành s nguyên ki u long. double atof(const char *s); Chuy n i m t chu i s thành s th c ki u double. Anh (ch ) hãy vi t m t hàm có tên là aton (ascii to number) chuy n i chu i sang các d ng s tương ng. Bài 1.10: Anh ch hãy vi t các hàm sau: Hàm ComputeCircle() tính di n tích s và chu vi c c a m t ư ng tròn bán kính r. Hàm này có prototype như sau: void ComputeCircle(float & s, float &c, float r = 1.0); Hàm ComputeRectangle() tính di n tích s và chu vi p c a m t hình ch nh t có chi u cao h và chi u r ng w. Hàm này có prototype như sau: void ComputeRectangle(float & s, float &p, float h = 1.0, float w = 1.0); Hàm ComputeTriangle() tính di n tích s và chu vi p c a m t tam giác có ba c nh a,b và c. Hàm này có prototype như sau: void ComputeTriangle(float & s, float &p, float a = 1.0, float b = 1.0, float c = 1.0); Hàm ComputeSphere() tính th tích v và di n tích b m t s c a m t hình c u có bán kính r. Hàm này có prototype như sau: void ComputeSphere(float & v, float &s, float r = 1.0); Trang 12
  • 13. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Hàm ComputeCylinder() tính th tích v và di n tích b m t s c a m t hình tr có bán kính r và chi u cao h. Hàm này có prototype như sau: void ComputeCylinder(float & v, float &s, float r = 1.0 , float h = 1.0); Bài 1.11: Vi t chương trình qu n lý i m h c sinh v i c u trúc danh sách n i ơn. Trong chương trình s d ng toán t vào ra và toán t new c p phát b nh ng. Bài 1.12: Vi t m t hàm th c hi n vi c s p x p m t m ng s nguyên theo chi u tăng d n ho c gi m d n. Hàm này t ng m c nh ki u s p x p theo chi u tăng d n. Bài 1.13: Vi t m t hàm gi i phương trình b c hai. Hàm này tr l i thông báo r ng phương trình có nghi m hay không có nghi m kép. N u có nghi m thì nghi m s ư c lưu vào tham s x1, x2 và ư c truy n như là tham bi n. Bài 1.14:Vi t m t hàm tìm v trí xu t hi n u tiên c a m t t khoá trong m t xâu. Hàm này tr l i v trí tìm th y c a t khoá trong xâu(b t u t 0) và thay i con tr xâu ư c truy n vào thành v trí c a ký t ngay sau ký t cu i cùng c a t khoá. T khoá c n tìm ư c ưa vào như là m t tham s và có m t giá tr m c nh. Trang 13
  • 14. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. §èi t−îng vµ líp (Class and Object) M C TIÊU C A BÀI NÀY GIÚP 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 hàm thi t l p và hàm hu b Khai báo và s d ng hàm thi t l p sao chép Vai trò c a hàm 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 t khoá struct. L p cho phép ngư i l p trình mô t các i tư ng th c t v i các thu c tính và hành vi. Trong C++ thư ng s d ng t khoá class khai báo m t l p. Tên l p là m t ki u d li u dùng khi khai báo các i tư ng thư c l p(các th hi n c th c a l p). Thu c tính c a i tư ng trong m t l p ư c mô t dư i d ng các bi n th hi n. Các hành vi là các hàm thành ph n bên trong l p. Có hai cách nh nghĩa các hàm thành ph n c a m t l p; khi nh nghĩa hàm thành ph n bên ngoài khai báo l p ph i t trư c tên hàm thành ph n tên c a l p và toán t “::” phân bi t v i các hàm t do cùng tên. Ch nên nh nghĩa hàm thành ph n bên trong khai báo l p khi nó không quá ph c t p cho chương trình d c. Có th khai báo và s d ng các con tr i tư ng, tham chi u i tư ng. Hai t khoá public và private dùng ch nh thu c tính truy nh p cho các thành ph n( d li u/hàm) khai báo bên trong l p. Thành ph n bên trong l p ư c khai báo public có th truy nh p t m i hàm khai báo m t i tư ng thu c l p ó. Thành ph n private trong m t i tư ng ch có th truy nh p ư c b i các hàm thành ph n c a i tư ng ho c các hàm thành ph n c a l p dùng t o i tư ng( ây tính c trư ng h p i tư ng là tham s c a hàm thành ph n) Hai hàm thành ph n c bi t c a m t l p g i là hàm thi t l p và hàm hu b . Hàm thi t l p ư c g i t ng(ng m nh) m i khi m t i tư ng ư c t o ra và hàm hu b ư cg it ng khi i tư ng h t th i gian s d ng. Hàm thi t l p có thu c tính public, cùng tên v i tên l p nhưng không có giá tr tr v . M t l p có ít nh t hai hàm thi t l p: hàm thi t l p sao chép ng m nh và hàm thi t l p do ngư i l p trình thi t l p(n u không mô t tư ng minh thì ó là hàm thi t l p ng m nh). Hàm hu b cũng có thu c tính public, không tham s , không giá tr tr v và có tên b t u b i ~ theo sau là tên c a l p. Bên trong ph m v l p( nh nghĩa c a các hàm thành ph n), các thành ph n c a l p ư c g i theo tên. Trư ng h p có m t i tư ng toàn c c cùng tên, mu n xác nh i tư ng y ph i s d ng toán t “::”. L p có th ch a các thành ph n d li u là các i tư ng c a l p khác. Các i tư ng này ph i ư c kh i t o trư c i tư ng tương ng c a l p bao. M i i tư ng có m t con tr ch n b n thân nó, ta g i ó là con tr this. Con tr này có th ư c s d ng tư ng minh ho c ng m nh tham xác nh các thành ph n bên trong i tư ng. Thông thư ng ngư i ta s d ng this dư i d ng ng m nh. Hàm b n c a m t l p là hàm không thu c l p nhưng có quy n truy nh p t i các thành ph n private c a l p. Trang 14
  • 15. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Khai báo b n b có th khai báo b t kỳ ch nào trong khai báo l p. 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 d u “;” cu i khai báo l p Kh i t o các thành ph n giá tr trong khai báo l p nh nghĩa ch ng m t hàm thành ph n b ng m t hàm không thu c l p Truy nh p n các thành ph n riêng c a l p t bên ngoài ph m vi l p Khai báo giá tr tr v cho hàm thi t l p và hàm hu b Khai báo hàm hu b có tham s , nh nghĩa ch ng hàm hu b G i tư ng minh hàm thi t l p và hàm hu b G i các thàm thành ph n bên trong hàm thi t l p M t s thói quen l p trình t t Nhóm t t c c các thành ph n có cùng thu c tính truy nh p m t nơi trương khái báo l p, nh v y m i t khoá mô t truy nh p ch ư c xác nh m t l n. Khai báo l p vì v y d c hơn. Theo kinh nghi m, các thành ph n private trư c tiên r i n các thành ph n protectech, cu i cùng là t khoá public. nh nghĩa t t c các hàm thành ph n bên ngoài khai báo l p. i u này nh m ph n bi t gi a hai ph n giao di n và ph n cài t l p. S d ng các ti n x lý #ifndef, #define, #endif cho các t p tin tiêu ch xu t hi n m t l n bên trong chương trinhg ngu n. Ph i nh nghĩa các hàm thi t l p m b o r ng các i tư ng u ư c kh i t o n i dung m t cách úng n. C/ BÀI T P M U Ví d 1: nh nghĩa m t l p mô t và x lý các i m trên màn hình ho . V i tên l p là point L i gi i + Các thu c tính c a l p int x;// hoành (c t) int y;// tung ( hàng) int m;// màu + Các phương th c Nh p d li u m t i m Hi n th m t i m nm t i m L p i m ư c xây d ng như sau: class point { private: int x,y,m; public: void nhapsl(); void hien(); void an() { putpixcel(x,y,getbkcolor()); } void point::nhap() { cout<<”n Nh p hoành (c t) và tung (hàng) c i m:”; cin>>x>>y; cout<<” Nh p màu c a i m:”;cin>>m; } void point::hien() Trang 15
  • 16. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. { int mau_ht; mau_ht=getcolor(); putpixcel(x,y,m); setcolor(mau_ht); } Nh n xét: + Trong c ba phương th c( dù vi t trong hay vi t ngoài nh nghĩa l p) u ư c truy nh p n các thu c tính x,y và m c a l p. + Các phương th c vi t bên trong nh nghĩa l p (như phương th c an()) ư c vi t như m t hàm bình thư ng. +Khi xây d ng các phương th c bên ngoài l p, c n dùng thêm tên l p và toán t ph m vi :: t ngay trư c tên phương th c quy nh rõ ây là phương th c c a l p nào. Ví d 2: Chúng ta xây d ng ki u c u trúc Time v i ba thành viên s nguyên: Hour, Minute và second. Chương trình nh nghĩa m t c u trúc Time g i là DinnerTime. Chương trình in th i gian dư i d ng gi quân i và d ng chu n. CT2_2.CPP #include <iostream.h> class Time { public: Time(); //Constructor void SetTime(int, int, int); //Thiet lap Hour, Minute va Second void PrintMilitary(); //In thoi gian duoi dang gio quan doi void PrintStandard(); //In thoi gian duoi dang chuan private: int Hour; // 0 - 23 int Minute; // 0 - 59 int Second; // 0 - 59 }; //Constructor khoi tao moi thanh vien du lieu voi gia tri zero //Bao dam tat ca cac doi tuong bat dau o trang thai thich hop Time::Time() { Hour = Minute = Second = 0; } //Thiet lap mot gia tri Time moi su dung gio quan doi //Thuc hien viec kiem tra tinh hop le tren cac gia tri du lieu //Thiet lap ca gia tri khong hop le thanh zero void Time::SetTime(int H, int M, int S) { Hour = (H >= 0 && H < 24) ? H : 0; Minute = (M >= 0 && M < 60) ? M : 0; Second = (S >= 0 && S < 60) ? S : 0; } //In thoi gian duoi dang gio quan doi void Time::PrintMilitary() { cout << (Hour < 10 ? "0" : "") << Hour << ":" Trang 16
  • 17. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. << (Minute < 10 ? "0" : "") << Minute << ":" << (Second < 10 ? "0" : "") << Second; } //In thoi gian duoi dang chuan void Time::PrintStandard() { cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12) << ":" << (Minute < 10 ? "0" : "") << Minute << ":" << (Second < 10 ? "0" : "") << Second << (Hour < 12 ? " AM" : " PM"); } int main() { Time T; cout << "The initial military time is "; T.PrintMilitary(); cout << endl << "The initial standard time is "; T.PrintStandard(); T.SetTime(13, 27, 6); cout << endl << endl << "Military time after SetTime is "; T.PrintMilitary(); cout << endl << "Standard time after SetTime is "; T.PrintStandard(); T.SetTime(99, 99, 99); //Thu thiet lap gia tri khong hop le cout << endl << endl << "After attempting invalid settings:" << endl << "Military time: "; T.PrintMilitary(); cout << endl << "Standard time: "; T.PrintStandard(); cout << endl; return 0; } k t qu Trang 17
  • 18. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Ví d 3 Nh p m t ngày tháng năm t bàn phím sau ó in ra màn hình. L i gi i CT2_3.CPP #include <iostream.h> #include <conio.h> #define FALSE 0 #define TRUE !FALSE char* Thang[]={"","gieng","hai","ba","bon","nam","sau","bay","tam", "chin","muoi","muoi mot","chap"}; int NgayThang[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; class CDate { private: int mNgay,mThang,mNam; int laNamNhuan(int); public: void nhap(); int hopLe(); void in(); }; void CDate::nhap() { cout<<endl<<"Ngay: ";cin>>mNgay; cout<<endl<<"Thang: "; cin>>mThang; cout<<endl<<"Nam: ";cin>>mNam; } int CDate::hopLe() { if ((mThang<1)||(mThang>12)) return FALSE; else { if ((mNgay>=1)&&(mNgay<=NgayThang[mThang])) return TRUE; else if ((mNgay==29)&&laNamNhuan(mNgay)) return TRUE; else return FALSE; } } int CDate::laNamNhuan(int nam) { if (((nam%400)==0)||(((nam%4)==0)&&((nam%100)!=0))) return TRUE; else return FALSE; } void CDate::in() { cout<<endl<<"Ban da nhap vao ngay "<<mNgay; cout<<" thang "<<Thang[mThang]; cout<<" nam "<<mNam; } void main() { CDate ngay; ngay.nhap(); if (ngay.hopLe()) ngay.in(); else Trang 18
  • 19. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. cout<<"BAN NHAP NGAY KHONG HOP LE"; getch(); } Ví d 4 Ch ra các cách khai báo i tư ng có th cho các l p i tư ng dư i ây: class A { }; class B { B(int, int); public: B(int=0); }; class C { C(C&); public: C(); }; class D { public: D(D&); }; L i gi i V l pA Cách 1: S d ng hàm thi t l p ng m nh A a; ho c A a(); Cách 2: S d ng hàm thi t l p sao chép m c nh. Gi s a là m t i tư ng c a l p A ã ư c khai báo trư c. Ta có th khai báo i tư ng a1 như sau: A a1(a); ho c A a1=a; Nh n xét: Khi trong l p không có m t khai báo hàm thi t l p nào thì trình biên d ch t ng t o ra m t hàm thi t l p m c nh cho l p ó. Do v y ta có th s d ng khai báo i tư ng theo cách 1 cho l p A. Hai chách vi t khai báo A a1(a); và A a1=a; là hoàn toàn gi ng nhau, chúng u s d ng hàm thi t l p sao chép kh i t o i tư ng. V l pB Cách 1: S d ng hàm thi t l p B(int). Ví d : B b(5); Cách 2: S d ng hàm thi t l p B(int) v i tham s ng m nh là 0. B b; tương ương v i B b(0); Cách 3: S d ng hàm thi t l p sao chép tương t như l p A. B b1=b; Nh n xét Chúng ta ch có th khai báo i tư ng theo các hàm thi t l p có thu c tính quy n truy nh p là public Trang 19
  • 20. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Trong hàm thi t l p cũng có th s d ng tham s ng m nh gi ng như các hàm thành ph n khác. V l p C: Ch có th khai báo i tư ng theo hàm thi t l p C() b i vì hàm thi t l p sao chép ã ư c ngư i s d ng nh nghĩa và t quy n truy xu t là private. Do v y không th dùng hàm thi t l p sao chép. Ví d : C c; V l p D: Không th khai báo i tư ng cho l p D b i vì trong l p này ch có hàm thi t l p sao chép. Hàm thi t l p chép mu n s d ng ư c thì ph i có m t i tư ng c a l p D. Do v y mu n khai báo ư c m t i tư ng thu c l p D thì trong l p D c n có m t hàm thi t l p khác sa chép. Ví d 5 Có bao nhiêu l n hàm thi t l p sao chép ư c g i trong o n mã chương trình sau: Widget f(Widget u) { Widget v(u); Widget w=v; return w; } void main() { Widget x; Widget y=f(f(x)); } L i gi i: Hàm thi t l p sao chép ư c g i 7 l n trong o n mã chương trình này. M i l n g i hàm f òi h i 3 l n g i n hàm thi t l p sao chép: khi tham sô truy n vào b ng giá tr u, khi v và w ư c kh i t o. L nh g i th b y là kh i t o y. Ví d 6 Cho bi t k t qu in ra màn hình c a chương trình sau: L i gi i CT 2_6.CPP #include <iostream.h> #include <conio.h> 3. class A { static int count; public: A() { count++;} ~A() { count--;} static void printNum() { cout<<” Gia tri cua count la:”<<count<<endl; } }; int A::count=0; void main() { clrscr(); A::printNum(); A a1; a1.printNum(); A *pa=new A; a1.printNum(); Trang 20
  • 21. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. delete pa; a1.printNum(); A a2=a1; a2.printNum(); getch(); } 4. L i gi i K t q in ra màn hình: Gia tri cua count la 0 Gia tri cua count la 1 Gia tri cua count la 2 Gia tri cua count la 1 Gia tri cua count la 1 Trong l p A, thu c tính count và hàm thành ph n printNum là các thành ph n tĩnh ư c chia s b i m i i tư ng c a A. Ban u thu c tính count ư c khai báo kh i t o là 0( dòng int A::count=0), do v y dòng u tiên c a chương trình chính ư c g i n phương th c printNum s ưa ra màn hình giá tr c a count là 0. Ti p theo ta t o m t i tư ng a1 s d ng hàm thi t l p d ng A(). Hàm này làm tăng count lên 1. Do v y, dòng g i phương th c printNum ti p theo s ưa ra màn hình giá tr c a count là 1. Tương t i v i l nh new ta cũng t o ra m t i tư ng m i và lúc này giá tr c a count là 2. Sau khi s d ng l nh new t o i tư ng, chương trình s d ng delete xoá i tư ng ó kh i b nh . Lúc này hàm hu b ư c g i và count gi m xu ng 1. i tư ng a2 ư c khai báo s d ng hàm thi t l p sao chép m c nh, mà hàm này không làm thay i giá tr count. Do v y, count v n gi giá tr 1. Ví d 6 Tim ra ch sai v quy n truy xu t trong o n chương trình sau: class A { int pri; public: int bub; friend void funcA(A); firend class B; }; class B { void func(A a) { cout<<a.pri; cout<<a.pub; } }; class C { void func(A a) { cout<<a.pri; cout<<a.pub; Trang 21
  • 22. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. } }; void funcA(A a) { cout<<a.pri; cout<<a.pub; } void funcB(A a) { cout<<a.pri; cout<<a.pub; } L i gi i Truy xu t n thu c tính pri c a i tư ng a trong hàm funcB và trong hàm thành ph n func c a l p C là không th ư c. T t c các truy xu t n thu c tính pub u ư c b i vì ây là thu c tính public. Trong hàm funcA, ta có th truy nh p ư c thu c tính pri b i vì hàm này ã ư c khai báo là b n bè c a l p A. Tương t , t t c các hàm thành ph n c a l p B cũng u có th truy xu t t i thu c tính pri c a l p A b i vì l p B ã ư c coi là b n bè c a l p A. Ví d 7 qu n lý i m thi vào trư ng HSPKTHY c a các thí sinh, ta xây d ng l p ThiSinh mô t các thí sinh bao g m các thu c tính và phương th c sau: - Tên thí sinh - i m c a ba môn thi Toán, Lý, Hoá - Nh p thông tin c a các thí sinh g m tên và i m c a ba môn thi Toán, Lý, Hoá - In thông tin tên, i m và t ng i m thi 3 môn - Tính t ng i m thi c a thí sinh Trên cơ s l p ã xây d ng ư c, vi t chương trình làm các công vi c sau. - Nh p danh sách k t qu thi c a các thí sinh vào t bàn phím - ưa ra màn hình danh sách thí sinh trung tuy n( i m chu n vào trư ng là 18) L i gi i CT2_7.CPP #include <iostream.h> #include <stdio.h> 5. #include <conio.h> class ThiSinh { // Các thu c tính char ten[25];// Tên c a thí sinh khôngdài quá 24 ký t int toan, ly, hoa;// i m ba môn toán, lý, hoá public: // Các phương th c void nhapdl();//Nh p d li u cho thí sinh void inkq();// In k t qu thi c a thí sinh int tong();// Tính t ng i m c a thí sinh }; void ThiSinh::nhapdl() { cout<<”Nhap ten:”;fflush(stdin);gets(ten); cout<<”Nhap diem toan:”;cin>>toan; cout<<”Nhap diem ly:”;cin>>ly; cout<<”Nhap diem hoa:”;cin>>hoa; } Trang 22
  • 23. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. void ThiSinh::inkq() { // K t qu thi c a thí sinh ư c in trên m t dòng theo nh d ng // Ten Toan Ly Hoa Tong printf(“%-25s%6d%6d%6%6dn”,ten,toan,ly,hoa,tong()); } int ThiSinh::tong() { return (toan+ly+hoa); } void main() { // Chương trình chính th c hi n nh p danh sách vào s lư ng thí // sinh c n nh p clrscr(); int n; cout<<”Cho so thi sinh:”;cin>>n; // T o n i tư ng thí sinh cho n thí sinh c n nh p d li u ThiSinh *dsts=new ThiSinh[n]; // Nh p d li u cho t ng thí sinh for(int i=0;i<n;++i) { cout<<” Nhap du lieu cho thi sinh thu:”<<i+1<<endl; // G i phương th c nh p d li u c a thí sinh th i trong m ng dsts[i].nhapdl(); } // In danh sách các thí sinh truýng tuy n cout<<”Danh sach nhung nguoi trung truyen n”; printf(“%-25s%6s%6s%s%6sn”,”Ten”,”Toan”,”Ly”,”Hoa”,”Tong”); for(i=0;i<n;++i) if(dsts[i].tong()>=18) dsts[i].inkq(); // Xoá các i tư ng ã t o và k t thúc chương trình delete dsts; getch(); } 6. Ví d 8: Hàm thi t l p v i các tham s m c nh CT2_8.CPP #include <iostream.H> class Time 7. { public: Time(int = 0, int = 0, int = 0); //Constructor mac dinh void SetTime(int, int, int); void PrintMilitary(); void PrintStandard(); private: int Hour; int Minute; int Second; }; //Ham constructor de khoi dong du lieu private //Cac gia tri mac dinh la 0 Time::Time(int Hr, int Min, int Sec) { Trang 23
  • 24. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. SetTime(Hr, Min, Sec); } //Thiet lap cac gia tri cua Hour, Minute va Second //Gia tri khong hop le duoc thiet lap la 0 void Time::SetTime(int H, int M, int S) { Hour = (H >= 0 && H < 24) ? H : 0; Minute = (M >= 0 && M < 60) ? M : 0; Second = (S >= 0 && S < 60) ? S : 0; } //Hien thi thoi gian theo dang gio quan doi: HH:MM:SS void Time::PrintMilitary() { cout << (Hour < 10 ? "0" : "") << Hour << ":" << (Minute < 10 ? "0" : "") << Minute << ":" << (Second < 10 ? "0" : "") << Second; } //Hien thi thoi gian theo dang chuan: HH:MM:SS AM (hoac PM) void Time::PrintStandard() { cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12) << ":" << (Minute < 10 ? "0" : "") << Minute << ":" << (Second < 10 ? "0" : "") << Second << (Hour < 12 ? " AM" : " PM"); } int main() { Time T1,T2(2),T3(21,34),T4(12,25,42),T5(27,74,99); cout << "Constructed with:" << endl << "all arguments defaulted:" << endl << " "; T1.PrintMilitary(); cout << endl << " "; T1.PrintStandard(); cout << endl << "Hour specified; Minute and Second defaulted:" << endl << " "; T2.PrintMilitary(); cout << endl << " "; T2.PrintStandard(); cout << endl << "Hour and Minute specified; Second defaulted:" << endl << " "; T3.PrintMilitary(); cout << endl << " "; T3.PrintStandard(); cout << endl << "Hour, Minute, and Second specified:" << endl << " "; T4.PrintMilitary(); cout << endl << " "; T4.PrintStandard(); cout << endl << "all invalid values specified:" << endl << " "; T5.PrintMilitary(); cout << endl << " "; T5.PrintStandard(); cout << endl; return 0; } 8. Trang 24
  • 25. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Chương trình ví d trên kh i t o năm i tư ng c a l p Time ( dòng 52). i tư ng T1 v i ba tham s l y giá tr m c nh, i tư ng T2 v i m t tham s ư c mô t , i tư ng T3 v i hai tham s ư c mô t , i tư ng T4 v i ba tham s ư c mô t và i tư ng T5 v i các tham s có giá tr không h p l . K t qu Ví d 9:L p có hàm hu b CT 2_9.CPP #include <iostream.h> class Simple 9. { private: int *X; public: Simple(); //Constructor ~Simple(); //Destructor void SetValue(int V); int GetValue(); }; Simple::Simple() { X = new int; //Cap phat vung nho cho X } Simple::~Simple() { delete X; //Giai phong vung nho khi doi tuong bi huy bo } Trang 25
  • 26. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. void Simple::SetValue(int V) { *X = V; } int Simple::GetValue() { return *X; } int main() { Simple S; int X; cout<<"Enter a number:"; cin>>X; S.SetValue(X); cout<<"The value of this number:"<<S.GetValue(); return 0; } 10. k t qu Ví d 10: Chương trình sau minh h a khai báo và s d ng hàm friend. CT2_10.CPP #include <iostream.H> class Count { friend void SetX(Count &, int); //Khai bao friend public: Count()//Constructor { X = 0; } void Print() const //Xuat { cout << X << endl; } private: int X; }; //Co the thay doi du lieu private cua lop Count vi //SetX() khai bao la mot ham friend cua lop Count void SetX(Count &C, int Val) { Trang 26
  • 27. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. C.X = Val; //Hop le: SetX() la mot friend cua lop Count } int main() { Count Object; cout << "Object.X after instantiation: "; Object.Print(); cout << "Object.X after call to SetX friend function: "; SetX(Object, 8); //Thiet lap X voi mot friend Object.Print(); return 0; } k t qu D/ BÀI T P T GI I Câu h i tr c nghi m Câu 1: Ch có m t kh ng nh trong nh ng câu sau là sai. Câu nào? a./ M i th hi n c a m t l p có s h u riêng các thu c tính thông thư ng b./ Các th hi n c a m t l p cùng chia s các thu c tính tĩnh c a l p ó c./ M i th hi n c a m t l p có các nh nghĩa riêng cho các phương th c c a nó. d./ M i i tư ng là m t th hi n c a m t l p Câu 2: Các t khoá public và private dùng a./ Cho phép ngư i thi t k l p che d u m t ph n thi hành c a l p trư c ngư i s d ng l p. b./ Trình biên d ch t i ưu hoá chương trình c./ m b o na toàn c a l p khi thi t k d./ H n ch vi c sao chép l p Câu 3 Ch ra l i sai v i các khai báo cho l p A class A { A(int i); }; A a1;//(1) A b2(5) //(2) a./ Ch dòng 1 l i b./ Ch dòng 2 l i c./ C hai dòng l i d./ Không dòng nào l i Câu 4: Cho bi t giá tr c a n v i các dòng l nh sau: Trang 27
  • 28. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. class A { public: static int i; }; int A::i=5; A a1; a1.i++; A a2; int n=a2.i+1; a./ n=5; b./ n=6; c./ n=7; d./ Không câu nào úng Câu 5: Ch ra l i v i các khai báo cho l p A class A { public: A(int i); }; A a1(5); A a3;// (1) A a2=a1;// (2) a./ Ch dòng 1 l i b./ Ch dòng 2 l i c./ C 2 dòng l i d./ Không dòng nào l i Bài tâp Bài 2.1: Xây d ng l p Stack, d li u bao g m nh stack và vùng nh c a stack. Các thao tác g m: Kh i ng stack. Ki m tra stack có r ng không? Ki m tra stack có y không? Push và pop. Bài 2.2: Xây d ng l p hình tr Cylinder, d li u bao g m bán kính và chi u cao c a hình tr . Các thao tác g m hàm tính di n tích toàn ph n và th tích c a hình tr ó. Bài 2.3: Hãy xây d ng m t l p Point cho các i m trong không gian ba chi u (x,y,z). L p ch a m t constructor m c nh, m t hàm Negate() bi n i i m thành i lư ng có d u âm, m t hàm Norm() tr v kho ng cách t g c và m t hàm Print(). Bài 2.4: Xây d ng m t l p Matrix cho các ma tr n bao g m m t constructor m c nh, hàm xu t ma tr n, nh p ma tr n t bàn phím, c ng hai ma tr n, tr hai ma tr n và nhân hai ma tr n. Trang 28
  • 29. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Bài 2.5: Xây d ng m t l p Matrix cho các ma tr n vuông bao g m m t constructor m c nh, hàm xu t ma tr n, tính nh th c và tính ma tr n ngh ch o. Bài 2.6: Xây d ng l p Person qu n lý h tên, năm sinh, i m chín môn h c c a t t c các h c viên c a l p h c. Cho bi t bao nhiêu h c viên trong l p ư c phép làm lu n văn t t nghi p, bao nhiêu h c viên thi t t nghi p, bao nhiêu ngư i ph i thi l i và tên môn thi l i. Tiêu chu n xét: Làm lu n văn ph i có i m trung bình l n hơn 7 trong ó không có môn nào dư i 5. Thi t t nghi p khi i m trung bình không l n hơn 7 và i m các môn không dư i 5. Thi l i có môn dư i 5. Bài 2.7: Xây d ng m t l p String. M i i tư ng c a l p String s i di n m t chu i ký t . Các thành viên d li u là chi u dài chu i và chu i ký t th c. Ngoài constructor và destructor còn có các phương th c như t o m t chu i v i chi u dài cho trư c, t o m t chu i t m t chu i ã có. Bài 2.8: Xây d ng m t l p Vector lưu tr vector g m các s th c. Các thành viên d li u g m: Kích thư c vector. M t m ng ng ch a các thành ph n c a vector. Ngoài constructor và destructor, còn có các phương th c tính tích vô hư ng c a hai vector, tính chu n c a vector (theo chu n b t kỳ nào ó). Bài 2.9: Xây d ng l p Employee g m h tên và ch ng minh nhân dân. Ngoài constructor còn có phương th c nh p, xu t h tên và ch ng minh nhân dân ra màn hình Bài 2.10: M t l p i tư ng sách trong h th ng qu n lí thư vi n có các thu c tính - Tên sách - T ng s quy n sách - S quy n sách ã cho mư n Xây d ng l p i tư ng trên v i các phương th như sau - Phương th nh p d li u cho i tư ng t bàn phím. Các thông tin c n nh p là tên sách, t ng s sách, s ã cho mư n. - Phương th c in thông tin i tư ng ra màn hình bao g m tên, t ng s và s ã cho mư n. - Phương th c tính s sách còn l i trong thư vi n(t ng s - s mư n) Trên cơ s l p xây d ng ư c, vi t chương trình chính th c hi n các công vi c. - Nh p danh sách các quy n sách v i s lư ng sách c n nh p ư c cho vào t bàn phím. - ưa ra màn hình thông tin v các quy n sách hi n có trong thư vi n(s sách còn l i ph i l n hơn 0) Trang 29
  • 30. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Bài 2.11: Vi t m t l p bi u di n hình ch nh t có các thu c tính là dài hai c nh( chi u r ng và chi u dài) và có các phương th c sau. - Nh p d li u hai c nh cho hình ch nh t - Tính chu vi và di n tích hình ch nh t - In thông tin c a hình ch nh t ra màn hình(bao g m dài hai c nh, chu vi và di n tích) Trên cơ s l p xây d ng ư c vi t chương trình cho phép ngư i s d ng nh p d li u c a m t hình ch nh t r i in thông tin v nó ra màn hình. Bài 2.12: Xây d ng m t l p Date mô t thông tin v ngày, tháng, năm(month, day, year). L p Date có các hàm thành ph n: - Hàm thi t l p v i ba tham s có giá tr m c nh( ó là ngày h th ng) - Nh p d li u ngày, tháng và năm - Hàm in thông tin v ngày tháng năm dư i d ng mm-dd-yy - Hàm nextDay() tăng Date t ng ngày m t Trên cơ s l p Date v a x y d ng vi t chương trình cho bi t kho ng cách ngày gi a hai m c th i gian v i ngày b t u ư c nh p vào t bàn phím cho tơi ngày hi n th i. Bài 2.13: Xây d ng l p Stack và l p Queue mô t ho t ng c a ngăn x p và hàng i các sô nguyên. Bài 2.14: Xây d ng m t l p mô t các b ng thi u bóng á g i là BangThiDau. Gi thi t m i b ng có b n i và thi u chéo t ng c p. Có l ch các tr n u c a b ng. T o các phương th c nh p k t qu thi u và tính i m cho t ng i. Yêu c u vi c nh p k t q a thi u ph i theo th t th i gian. Thêm các phương th c hi n th thông tin thi u c a t ng i và c a c b ng. Vi t chương trình ki m nghi m l p xây d ng ư c. Bài 2.15: M r ng bài t p trên v i l p DoiBong mô t các i bóng thi u. Thông tin c a m i ôi bóng bao g m tên i bóng, danh sách c u th , và hu n luy n viên. L p bangThiDau s d ng các i tư ng c a l p DoiBong làm i bóng thi u c a b ng. Các b ng lúc này có th m thu c tính tên c a b ng thi u. S d ng các l p ã xây d ng trên vi t chương trình qu n lý thi u c a cúp bóng á th gi i có 32 i thi u ư c chia làm 8 b ng. T o thêm l p mô t l ch thi u cho các vòng ti p theo c a gi i. Yêu c u c a chương trình như sau: - Ban u ngư i s d ng nh p các thông tin v i bóng, sau ó phân b ng và l ch thi u toàn gi i. - K t qu các tr n thi u ư c vào theo th t l ch thi u - Chương trình t ng ch n các i vào vòng ti p theo cho t i tr n trung k t. - T i m i th i i m c a gi i chương trình có th ưa ra các thông tin v gi i. Bài 2.16: M t quy n s i n tho i ch a các th có thông tin v tên, a ch và s i n tho i. Thi t k các l p tương ng v i các th thông tin và s i n tho i. Vi t chương trình cho phép qu n lý s i n tho i d a trên các l p xây d ng ư c. Trang 30
  • 31. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. §Þnh nghÜa chång to¸n tö trªn líp M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C Cách nh nghĩa các phép toán cho ki u d li u l p và c u trúc Các toán t chuy n ki u áp d ng cho ki u d li u l p A/ NH C L I LÝ THUY T Toán t ư c nh nghĩa ch ng b ng cách nh nghĩa m t hàm toán t . Tên hàm toán t bao g m t khoá operator theo sau là ký hi u c a toán t ư c nh nghĩa ch ng. H u h t các toán t c a C++ u có th nh nghĩa ch ng. Không th t o ra các ký hi u phép toán m i. Ph i m b o các c tính nguyên thu c a toán t ư c nh nghĩa ch ng, ch ng h n: ưu tiên, tr t t k t h p, sô ngôi. Không s d ng tham s có giá tr ng m nh nh nghĩa ch ng toán t . Các toán t (), [], ->, = yêu c u hàm toán t ph i là hàm thành ph n c a l p. Hàm toán t có th là hàm thành ph n hay là hàm b n c a l p Khi hàm toán t là hàm thành ph n, toán h ng bên trái luôn là i thu c l p. N u toán h ng bên trái là i tư ng c a l p khác thì hàm toán t tương ng ph i là hàm b n. Chương trình d ch không t bi t cách chuy n ki u gi a ki u d li u chu n và ki u d li u t nh nghĩa. Vì v y ngư i l p trình c n ph i mô t tư ng minh các chuy n i này dư i d ng hàm thi t l p chuy n ki u hay hàm toán t chuy n ki u. M t hàm toán t chuy n ki u th c hi n chuy n i t m t i tư ng thư c l p sang i tư ng thu c l p khác ho c m t i tư ng có ki u ư c nh nghĩa trư c. Hàm thi t l p chuy n ki u có m t tham s và th c hi n chuy n i t m t giá tr sang i tư ng ki u l p. Toán t gán là toán t hay ư c nh nhgiã ch ng nh t, c bi t khi l p có các thành ph n d li u ng. nh nghĩa ch ng toán t tăng, gi m m t ngôi, ph i phân bi t hai hàm toán t tư ng ng cho d ng ti n t và d ng h u t . 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 T o m t toán t Thay i nh nghĩa c a các toán t trên các ki u ư c nh nghĩa trư c Cho r ng vi c nh nghĩa ch ng m t toán t s t ng kéo theo nh nghĩa ch ng c a các toán t liên quan. Quên nh nghĩa ch ng toán t gán và hàm thi t l p sao chép cho các l p có các thành ph n d li u ng. M t s thói quen l p trình t t S d ng toán t nh nghĩa ch ng khi i u ó làm cho chương trình trong sáng hơn. Tránh l m d ng nh nghĩa ch ng toán t vì i u ó ãn n khó ki m soát chương trình. Chú ý n các tính ch t nguyên thu c a toán t ư c nh nghĩa ch ng. Hàm thi t l p, toán t gán, hàm thi t l p sao chép c a m t l p thư ng i cùng nhau. Trang 31
  • 32. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. C/ BÀI T P M U Ví d 1: M t l p phân s có toán t c ng(+) ư c nh nghĩa như sau: class PS { public: PS(int ts=0, int ms=1); PS operator+(PS); }; Trong các dòng l nh sau ây dòng nào sai? PS a,b,c; a=b+c;//(1) a=b+3;//(2) a=3+b;//(3) L i gi i Trong ba dòng l nh thì hai dòng u là úng b i vì lúc ó ta có: (1) a=b.operator+(c) là toán t ã ư c nh nghĩa trong l p phân s (2) a=b.operator+(3) v i 3 s t ng chuy n ki u thành phân s Dòng l nh (3) sai vì ta không có toán t c ng m t s nguyên v i m t phân s . có th th c hi n ư c t t c ba dòng l nh như trên thì toán t c ng trong l p PS ph i ư c nh nghĩa là m t hàm b n. class PS { public: PS(int ts=0, int ms=1); friend PS operator+(PS); }; Khi ó các l i g i s tương ng v i toán t như sau: (1) a=operator+(b,c) (2) a=operator+(b,3) (3) a=operator+(3,b) Ví d 2:Chúng ta xây d ng l p s ph c v i tên l p là Complex và a năng hóa toán t + trên l p này. CT3_1.CPP #include <iostream.h> class Complex 11. { private: double Real,Imaginary; public: Complex(double R=0.0,double I=0.0);//Constructor mac dinh void Print();//Hien thi so phuc Complex operator + (Complex Z);//Phep cong hai so phuc Complex operator + (double R);//Phep cong mot so phuc voi mot so thuc }; Complex::Complex(double R,double I) { Real = R; Imaginary = I; } Trang 32
  • 33. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. void Complex::Print() { cout<<'('<<Real<<','<<Imaginary<<')'; } Complex Complex::operator + (Complex Z) { Complex Tmp; Tmp.Real = Real + Z.Real; Tmp.Imaginary = Imaginary + Z.Imaginary; return Tmp; } Complex Complex::operator + (double R) { Complex Tmp; Tmp.Real = Real + R; Tmp.Imaginary = Imaginary; return Tmp; } int main() { Complex X,Y(4.3,8.2),Z(3.3,1.1); cout<<"X: "; X.Print(); cout<<endl<<"Y: "; Y.Print(); cout<<endl<<"Z: "; Z.Print(); X = Y + Z; cout<<endl<<endl<<"X = Y + Z:"<<endl; X.Print(); cout<<" = "; Y.Print(); cout<<" + "; Z.Print(); X = Y + 3.5; cout<<endl<<endl<<"X = Y + 3.5:"<<endl; X.Print(); cout<<" = "; Y.Print(); cout<<" + 3.5"; return 0; } 12. k t qu Trang 33
  • 34. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Ví d 3: Cho m t l p có toán t chuy n ki u như sau: class A { public: operator int (); }; Khi ó ta có th s d ng câu l nh nào trong nh ng câu l n sau: A a; int i=a;//(1) float f=a;//(2) L i gi i L nh (1) là úng b i vì ta ã có toán t ép ki u int nên chương trình t ng ép ki u v m t s nguyên. Còn l nh 2 sai b i vì ta không có toán t ép ki u float. Ví d 4 a năng hóa toán t [] truy c p n m t ph n t c a vector. CT3_4.CPP #include <iostream.h> class Vector 13. { private: int Size; int *Data; public: Vector(int S=2,int V=0); ~Vector(); void Print() const; int & operator [] (int I); }; Vector::Vector(int S,int V) { Size = S; Data=new int[Size]; for(int I=0;I<Size;++I) Data[I]=V; } Vector::~Vector() { delete []Data; } void Vector::Print() const { cout<<"Vector:("; Trang 34
  • 35. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. for(int I=0;I<Size-1;++I) cout<<Data[I]<<","; cout<<Data[Size-1]<<")"<<endl; } int & Vector::operator [](int I) { return Data[I]; } int main() { Vector V(5,1); V.Print(); for(int I=0;I<5;++I) V[I]*=(I+1); V.Print(); V[0]=10; V.Print(); return 0; } 14. k t qu Ví d 5: a năng hóa toán t () truy c p n m t ph n t c a vector. CT3_5.CPP //Chuong trinh 4.6 #include <iostream.h> 15. class Vector { private: int Size; int *Data; public: Vector(int S=2,int V=0); ~Vector(); void Print() const; int & operator () (int I); }; Vector::Vector(int S,int V) { Size = S; Data=new int[Size]; for(int I=0;I<Size;++I) Data[I]=V; } Vector::~Vector() { Trang 35
  • 36. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. delete []Data; } void Vector::Print() const { cout<<"Vector:("; for(int I=0;I<Size-1;++I) cout<<Data[I]<<","; cout<<Data[Size-1]<<")"<<endl; } int & Vector::operator ()(int I) { return Data[I]; } int main() { Vector V(5,1); V.Print(); for(int I=0;I<5;++I) V(I)*=(I+1); V.Print(); V(0)=10; V.Print(); return 0; } 16. k t qu Ví d 6: a năng hóa toán t () truy c p n ph n t c a ma tr n. CT3_6.CPP //Chuong trinh 4.7 #include <iostream.h> 17. class Matrix { private: int Rows,Cols; int **Data; public: Matrix(int R=2,int C=2,int V=0); ~Matrix(); void Print() const; int & operator () (int R,int C); }; Matrix::Matrix(int R,int C,int V) { int I,J; Rows=R; Cols=C; Trang 36
  • 37. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Data = new int *[Rows]; int *Temp=new int[Rows*Cols]; for(I=0;I<Rows;++I) { Data[I]=Temp; Temp+=Cols; } for(I=0;I<Rows;++I) for(J=0;J<Cols;++J) Data[I][J]=V; } Matrix::~Matrix() { delete [] Data[0]; delete [] Data; } void Matrix::Print() const { int I,J; for(I=0;I<Rows;++I) { for(J=0;J<Cols;++J) { cout.width(5);//Hien thi canh ler phai voi chieu dai 5 ky tu cout<<Data[I][J]; } cout<<endl; } } int & Matrix::operator () (int R,int C) { return Data[R][C]; } int main() { int I,J; Matrix M(2,3,1); cout<<"Matrix:"<<endl; M.Print(); for(I=0;I<2;++I) for(J=0;J<3;++J) M(I,J)*=(I+J+1); cout<<"Matrix:"<<endl; M.Print(); return 0; } 18. k t qu Trang 37
  • 38. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Ví d 7: a năng hóa toán t ++ và -- CT3_7.CPP #include <iostream.h> 19. class Point { private: int X,Y; public: Point(int A=0,int B=0); Point operator ++(); Point operator --(); void Print() const; }; Point::Point(int A,int B) { X = A; Y = B; } Point Point::operator++() { ++X; ++Y; return *this; } Point Point::operator--() { --X; --Y; return *this; } void Point::Print() const { cout<<"X="<<X<<",Y="<<Y<<endl; } int main() { Point P1(2,6),P2(5,8); cout<<"Point 1:"; P1.Print(); cout<<"Point 2:"; P2.Print(); ++P1; --P2; cout<<"Point 1:"; P1.Print(); Trang 38
  • 39. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. cout<<"Point 2:"; P2.Print(); return 0; } 20. K t qu Ví d 8: a năng hóa toán t d u ph y. CT3_8.CPP #include <iostream.h> 21. class Point { private: int X,Y; public: Point(int A=0,int B=0); Point operator +(Point P); Point operator ,(Point P); void Print() const; }; Point::Point(int A,int B) { X = A; Y = B; } Point Point::operator+(Point P) { Point Tmp; Tmp.X=X+P.X; Tmp.Y=Y+P.Y; return Tmp; } Point Point::operator,(Point P) { Point Tmp; Tmp.X=P.X; Tmp.Y=P.Y; cout<<P.X<<" "<<P.Y<<endl; return Tmp; } void Point::Print() const { cout<<"X="<<X<<",Y="<<Y<<endl; } Trang 39
  • 40. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. int main() { Point P1(2,6),P2(5,20),P3(1,1); cout<<"Point 1:"; P1.Print(); cout<<"Point 2:"; P2.Print(); cout<<"Point 3:"; P3.Print(); P1=(P1,P1+P2,P3); cout<<"Point 1:"; P1.Print(); return 0; } 22. k t qu Ví d 9: a năng hóa toán t ->. CT3_9.CPP #include <iostream.h> 23. class MyClass { public: int Data; MyClass * operator ->() { return this; } }; int main() { MyClass M; M->Data = 10; cout<<M.Data<<" "<<M->Data; return 0; } 24. k t qu Ví d 10: a năng hóa toán t gán. CT3_10.CPP Trang 40
  • 41. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. #include <iostream.h> #include <string.h> 25. class String { private: char *St; int Len; public: String(char *S); ~String(); char *GetStr(); String & operator=(String &Obj); }; String::String(char *S) { Len=strlen(S); St=new char[Len+1]; strcpy(St,S); } String::~String() { delete []St; } char * String::GetStr() { return St; } String & String::operator=(String &Obj) { if (Len< Obj.Len) { delete [] St; St=new char[Obj.Len+1]; } Len=Obj.Len; strcpy(St,Obj.St); return *this; } int main() { String S1("Hello"), S2("Chao"); cout<<"S1="<<S1.GetStr()<<endl; cout<<"S2="<<S2.GetStr()<<endl; S2=S1; cout<<"S1="<<S1.GetStr()<<endl; cout<<"S2="<<S2.GetStr()<<endl; return 0; } 26. k t qu Trang 41
  • 42. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Ví d 11: Chúng ta s xây d ng m t l p x lý vi c t o và thao tác trên các chu i (string). C++ không cài s n ki u d li u chu i. Nhưng C++ cho phép chúng ta thêm ki u chu i như m t l p thông qua cơ ch a năng hóa. CT3_11.CPP #include <iostream.h> #include <iomanip.h> 27. #include <string.h> #include <assert.h> class String { private: char *Ptr; //Con tro tro den diem bat dau cua chuoi int Length; //Chieu dai chuoi public: String(const char * = ""); //Constructor chuyen doi String(const String &); //Constructor sao chep ~String(); //Destructor const String &operator=(const String &); //Phep gan String &operator+=(const String &); int operator!() const; int operator==(const String &) const; int operator!=(const String &) const; int operator<(const String &) const; int operator>(const String &) const; int operator>=(const String &) const; int operator<=(const String &) const; char & operator[](int); //Tra ve ky tu tham chieu String &operator()(int, int); //Tra ve mot chuoi con int GetLength() const; friend ostream &operator<<(ostream &, const String &); friend istream &operator>>(istream &, String &); }; //Constructor sao chep: Chuyen doi char * thanh String String::String(const char *S) { cout << "Conversion constructor: " << S << endl; Length = strlen(S); Ptr = new char[Length + 1]; assert(Ptr != 0); strcpy(Ptr, S); } String::String(const String &Copy) { cout << "Copy constructor: " << Copy.Ptr << endl; Trang 42
  • 43. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Length = Copy.Length; Ptr = new char[Length + 1]; assert(Ptr != 0); strcpy(Ptr, Copy.Ptr); } //Destructor String::~String() { cout << "Destructor: " << Ptr << endl; delete [] Ptr; } const String &String::operator=(const String &Right) { cout << "operator= called" << endl; if (&Right != this) { delete [] Ptr; Length = Right.Length; Ptr = new char[Length + 1]; assert(Ptr != 0); strcpy(Ptr, Right.Ptr); } else cout << "Attempted assignment of a String to itself" << endl; return *this; } String &String::operator+=(const String &Right) { char *TempPtr = Ptr; Length += Right.Length; Ptr = new char[Length + 1]; assert(Ptr != 0); strcpy(Ptr, TempPtr); strcat(Ptr, Right.Ptr); delete [] TempPtr; return *this; } int String::operator!() const { return Length == 0; } int String::operator==(const String &Right) const { return strcmp(Ptr, Right.Ptr) == 0; } int String::operator!=(const String &Right) const { return strcmp(Ptr, Right.Ptr) != 0; } int String::operator<(const String &Right) const { return strcmp(Ptr, Right.Ptr) < 0; } int String::operator>(const String &Right) const Trang 43
  • 44. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. { return strcmp(Ptr, Right.Ptr) > 0; } int String::operator>=(const String &Right) const { return strcmp(Ptr, Right.Ptr) >= 0; } int String::operator<=(const String &Right) const { return strcmp(Ptr, Right.Ptr) <= 0; } char &String::operator[](int Subscript) { assert(Subscript >= 0 && Subscript < Length); return Ptr[Subscript]; } String &String::operator()(int Index, int SubLength) { assert(Index >= 0 && Index < Length && SubLength >= 0); String *SubPtr = new String; assert(SubPtr != 0); if ((SubLength == 0) || (Index + SubLength > Length)) SubPtr->Length = Length - Index + 1; else SubPtr->Length = SubLength + 1; delete SubPtr->Ptr; SubPtr->Ptr = new char[SubPtr->Length]; assert(SubPtr->Ptr != 0); strncpy(SubPtr->Ptr, &Ptr[Index], SubPtr->Length); SubPtr->Ptr[SubPtr->Length] = '0'; return *SubPtr; } int String::GetLength() const { return Length; } ostream &operator<<(ostream &Output, const String &S) { Output << S.Ptr; return Output; } istream &operator>>(istream &Input, String &S) { char Temp[100]; Input >> setw(100) >> Temp; S = Temp; return Input; } int main() { String S1("happy"), S2(" birthday"), S3; cout << "S1 is "" << S1 << ""; S2 is "" << S2 << ""; S3 is "" << S3 << '"' << endl << "The results of comparing S2 and S1:" Trang 44
  • 45. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. << endl << "S2 == S1 yields " << (S2 == S1) << endl << "S2 != S1 yields " << (S2 != S1) << endl << "S2 > S1 yields " << (S2 > S1) << endl << "S2 < S1 yields " << (S2 < S1) << endl << "S2 >= S1 yields " << (S2 >= S1) << endl << "S2 <= S1 yields " << (S2 <= S1) << endl; cout << "Testing !S3:" << endl; if (!S3) { cout << "S3 is empty; assigning S1 to S3;" << endl; S3 = S1; cout << "S3 is "" << S3 << """ << endl; } cout << "S1 += S2 yields S1 = "; S1 += S2; cout << S1 << endl; cout << "S1 += " to you" yields" << endl; S1 += " to you"; cout << "S1 = " << S1 << endl; cout << "The substring of S1 starting at" << endl << "location 0 for 14 characters, S1(0, 14), is: " << S1(0, 14) << endl; cout << "The substring of S1 starting at" << endl << "location 15, S1(15, 0), is: " << S1(15, 0) <<endl; // 0 is "to end of string" String *S4Ptr = new String(S1); cout << "*S4Ptr = " << *S4Ptr <<endl; cout << "assigning *S4Ptr to *S4Ptr" << endl; *S4Ptr = *S4Ptr; cout << "*S4Ptr = " << *S4Ptr << endl; delete S4Ptr; S1[0] = 'H'; S1[6] = 'B'; cout <<"S1 after S1[0] = 'H' and S1[6] = 'B' is: "<< S1 << endl; cout << "Attempt to assign 'd' to S1[30] yields:" << endl; S1[30] = 'd'; //Loi: Chi so vuot khoi mien!!! return 0; } 28. k t qu Trang 45
  • 46. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. D/ BÀI T P T GI I Câu h i tr c nghi m Câu 1: nh nghĩa nào úng cho toán t nh p(>>) c a m t l p T a) istream& operator>>(istream&); b) istream& operator>>(istream); c) friend istream& operator>>(istream&, T&); d) friend istream& operator>>(istream&, T); Trang 46
  • 47. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Câu 2 nh nghĩa nào phù h p nh t cho toán t l y thành ph n([]) c a l p m ng A a) int operator [] (int) b) int& operator [] (int) c) friend int operator [] (A&, int) d) friend int& operator [] (A&, int) Câu 3: Ch ra cách nh nghĩa toán t cho l p T b sai a) T operator-(T&) b) T operator-() c) T operator-() d) friend T opreator +(T&); e) T operator +(T&); Câu 4: Ch ra cách nh nghĩa toán t cho l p T bíai a) T& operator ++() b) T operator ++(); c) T& operator++(int); d) T&operator++(float) Câu 5: Cho l p A class A { public: operator int (); }; A a; int i=a;(1) float f=a;(2) Ch ra dòng nào có l i a) Ch dòng 1 l i b) Ch dòng 2 l i c) C hai dòng u l i d) Không dòng nào l i Bài tâp Bài 1: T o ki u d li u Date bi u di n ngày, tháng, năm. Cài t các toán t tính m t ngày trư c ho c sau m t ngày xác nh nào ó, tính kho ng cách thao ngày gi a hai ngày xác nh, tính th trong tu n c a ngày. Các toán t vào ra cho ngày. Bài 2: lưu tr m t ma tr n i x ng thì không c n ô nh cho t t c các ph n t c a nó. Xây d ng l p bi u di n ma tr n i x ng có các toán t truy nh p t ng ph n t c a ma tr n. Ch s d ng lư ng b nh c n thi t lưu ma tr n i x ng Bài 3 Xây d ng l p bi u di n các a th c v i các toán t c ng, tr , nhân, chia và o d u. nh nghĩa toán t xu t k t xu t. Bài 4: Xây d ng m t l p map cho phép bi u di n m t ánh x t m t chu i kí t thành m t giá tr s nguyên. nh nghĩa toán t [] cho l p có th s d ng ánh x theo cách như [“abc”]->5 Trang 47
  • 48. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Bài 5 Xây d ng m t l p bi u di n các vector n chi u v i các toán t c ng, tr , tích có hư ng hai vector và tích vô hư ng m t vector v i m t s th c. nh nghĩa toán t cho phép truy nh p các thành ph n c a vector. Trang 48
  • 49. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Kü thuËt thõa kÕ M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C Cài t ư c s th a k S d ng các thành ph n c a l p cơ s nh nghĩa l i các hàm thành ph n Truy n thông tin gi a các hàm thi t l p c a l p d n xu t và l p cơ s Các lo i d n xu t khác nhau và s thay i tr ng thái c a các thành ph n l p cơ s . S tương thích gi a các i tư ng c a l p d n xu t và l p cơ s Toán t gán và th a k Hàm o và tính a hình A/ NH C L I LÝ THUY T Th a k nâng cao kh năng s d ng l i c a các o n mã chương trình. Ngư i l p trình có th khai báo l p m i th a th a k d li u và hàm thành ph n t l p cơ s ã ư c nh nghĩa trư c ó. Ta g i l p m i là l p d n xu t. Trong ơn th a k , m t l p ch có th có m t l p cơ s . Trong a th a k cho phép m t l p là d n xu t c a nhi u l p L p d n xu t thư ng b sung các thành ph n d li u và các hàm thành ph n trong nh nghĩa, ta nói l p d n xu t c th hơn so v i l p cơ s và vì v y thư ng mô t m t l p các i tư ng có ph p vi h p hơn l p cơ s . L p d n xu t không có quy n truy nh p n các thành ph n private c a l p cơ s . Tuy nhiên l p cơ s có quy n truy xu t n các thành ph n công c ng và ư c b o v (proteced). Hàm thi t l p c a l p d n xu t thư ng t ng g i các hàm thi t l p c a các l p cơ s kh i t o giá tr cho các thành ph n trong l p cơ s . Hàm hu b ư c g i theo th t ngư c l i. Thu c tính truy nh p protected là m c trung gian gi a thu c tính public và private. Ch có các hàm thành ph n và hàm b n c a l p cơ s và l p d n xu t có quy n truy xu t n các thành ph n protected c a l p cơ s . Có th nh nghĩa l i các thành ph n c a l p cơ s trong l p d n xu t khi thành ó không còn phù h p trong l p d n xu t. Có th gán n i dung i tư ng l p d n xu t cho m t i tư ng l p cơ s . M t con tr l p d n xu t có th chuy n i thành con tr l p cơ s . Hàm o ư c khai báo v i t khoá virtual trong l p cơ s . Các l p d n xu t có th ưa ra các cài t l i cho các hàm o c a l p cơ s n u mu n, trái l i chúng có th s d ng nh nghĩa ã nêu trong l p cơ s . N u hàm o ư c g i b ng cách tham chi u qua tên m t i tư ng thì tham chi u ó ư c xác nh d a trên l p c a i tư ng tương ng. M t l p có hàm o không có nh nghĩa(hàm o thu n tuý) ư c g i là l p tr u tư ng. Các l p tr u tư ng không th dùng khai báo các i tư ng nhưng có th khai báo con tr có ki u l p tr u tư ng. 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 Cho con tr l p d n xu t ch n i tư ng l p cơ s mà không m b o ch c ch n r ng phiên b n m i c a hàm trong l p d n xu t cũng tr v cùng gái tr như phiên b n cũ c a hàm. Khai báo i tư ng c a l p tr u tư ng Trang 49
  • 50. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. Khai báo hàm thi t l p là hàm o. M t s thói quen l p trình t t Khi th a k các kh năng không c n thi t trong l p d n xu t, t t nh t nên nh nghĩa l i chúng. C/ BÀI T P M U Ví d 1: Gi s có các l p như trong khai báo. Ch ra các l i sai cho các l nh c a chương trình vi t dư i ây. class A { public: void func(); }; class B: private class A { }; A a; B b; a.func(); A* pA =&b; B* pB=&a; L i gi i L i g i b.func() có l i b i vì l p B k th a l p A theo ch private. Do v y, t t c các thành ph n c a A s là private trong B, hơn n a không th truy nh p vào m t thành ph n private. M t i tư ng c a l p d n xu t cũng có th coi là i tư ng c a l p cơ s . Do v y, khia báo A* pA=&b là hoàn toàn úng. Nhưng i u ngư c l i là không úng, nên khai báo B* pB=&a s gây l i khi biên d ch. Ví d 2: Qu n lý h c viên CT4_2.CPP #include <iostream.h> #include <conio.h> 29. class person_data { public: void getinfo(); void display(); person_data(); virtual ~person_data(); private: char name[25]; int roll_no; char sex; }; person_data::person_data() { } person_data::~person_data() { } void person_data::getinfo() { cout << "Ten: "; Trang 50
  • 51. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. cin>> name; cout<<"So: "; cin>>roll_no; cout<<"Gioi tinh(F/M) : "; cin>> sex; } void person_data:: display() { cout<<name<<"t"; cout<<roll_no<<"t"; cout<<sex<<"t"; } //----------------------------------- class academics { public: void getinfo(); void display(); academics(); virtual ~academics(); private: char course_name[25]; int semester; char grade[3]; }; academics::academics() { } academics::~academics() { } void academics::getinfo() { cout<<"Ten khoa (BA/MBA/MCA etc)? "; cin>>course_name; cout<< "Hoc ky (1/2/3/...)? "; cin>>semester; cout<<"muc do (A,B,B+,B-..) ? "; cin>>grade; } void academics::display() { cout<<course_name<<"t"; cout<<semester<<"t"; cout<<grade<<"t"; } //------------------------------- class stud_scholarship : public person_data, public academics { public: void getinfo(); void display(); stud_scholarship(); virtual ~stud_scholarship(); Trang 51
  • 52. L P TRÌNH HƯ NG I TƯ NG V I C++ Smith Nguyen Studio. private: float amount; }; stud_scholarship::stud_scholarship() { } stud_scholarship::~stud_scholarship() { } void stud_scholarship::getinfo() { person_data::getinfo(); academics::getinfo(); cout<<"Su ho tro "; cin>>amount; } void stud_scholarship::display() { person_data::display(); academics::display(); cout<<amount<<endl; } //---------------------------------- int main() { stud_scholarship obj; cout<<"Nhap cac thong tin sau: "<<endl; obj.getinfo(); cout<<endl; cout<<"Ten So Gioi tinh Khoa Hoc ky Muc do"; cout<<" Amount"<<endl; obj.display(); return 0; } 30. D/ BÀI T P T GI I Bài 1: Xây d ng l p Stack v i các thao tác c n thi t. T ó hãy d n xu t t l p Stack i m t s nguyên dương sang h m b t kỳ. 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 Bài 3: Hãy xây d ng các l p c n thi t trong phân c p hình 5.3 tính di n tích (ho c di n tích xung quanh) và th tích. Bài 4: Vi t m t phân c p k th a cho các l p Quadrilateral (hình t giác), Trapezoid (hình thang), Parallelogram (hình bình hành), Rectangle (hình ch nh t), và Square (hình vuông). Trong ó Quadrilateral là l p cơ s c a phân c p. Trang 52