9章


問題1  問題2  問題3  問題4  問題5(略)  問題6

問題7  問題8  問題9   問題10   問題11  問題12  問題13

問題 1
#include
class CUnivMem {                    // 大学人クラス
 char name[20];                         // 氏名
public:
 void SetName(const char *n) {strcpy(name, n);}
 const char *ShowName() const {return name;}
};

class CStudent: private CUnivMem {          // 学生クラス
 int code; // 学籍番号
public:
 void SetCode(const int c) {code = c;}
 void SetStdName(const char *n){SetName(n);}
 int ShowCode() const {return code;}
 const char *ShowStdName() const { return ShowName();}
};

問題 2
#include
enum {mei = 1867, tai = 1911, sho = 1925, hei = 1988};
class CCalendar {
 ...
};
int CCalendar::ShowWD() {
 int c, y, m, yr, w;
 if (ShowM() <= 2) {
  m = ShowM() + 12;
  yr = ShowY() - 1;
 } else {
  m = ShowM();
  yr = ShowY();
 }
 c = yr / 100;
 y = yr % 100;
 w = (int)(c / 4) - 2 * c + y + (int)(y / 4)
                  + (int)(26 * (m + 1) / 10) + ShowD() - 1;
 w %= 7;
 if (w < 0) w += 7;
 return w;
}
class JCalendar: public CCalendar {
public:
 JCalendar(int y, int m, int d): CCalendar(y, m, d) {}
 void print();
};
void JCalendar::print() {
 char *wname[7] = {"日", "月", "火", "水", "木", "金", "土"};
 if (ShowY() > mei && ShowY() <= tai) cout << "明治" << ShowY() - mei;
 else if (ShowY() > tai && ShowY() <= sho)
                          cout << "大正" << ShowY() - tai;
 else if (ShowY() > sho && ShowY() <= hei)
                          cout << "昭和" << ShowY() - sho;
 else if (ShowY() > hei)            cout << "平成" << ShowY() - hei;
 cout << "年" << ShowM() << "月" << ShowD() << "日"
                          << '(' << wname[ShowWD()] << ")\n";
}
class ECalendar: public CCalendar {
public:
 ECalendar(int y, int m, int d): CCalendar(y, m, d) {}
 void print();
};
void ECalendar::print() {
 char *wname[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
 char *mname[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
                     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
 cout << wname[ShowWD()] << ' ' << mname[ShowM() - 1]
                     << ' ' << ShowD() << ' ' << ShowY() << '\n';
}
int main() {
 CCalendar c(1998,12,28); c.print();
 JCalendar cj(1998,12,29); cj.print();
 ECalendar ce(1998,12,30); ce.print();
}

問題 3
#include
#include
class CUnivMem {                         // 大学人クラス
protected:
...
};
class CStudent: public CUnivMem {                // 学生クラス
 int code;                                // 学籍番号
public:
  void SetCode(const int c) {code = c;}
 int ShowCode() const {return code;}
 void print() {
  cout << "Name: " << name << '\n';    // 限定公開メンバのアクセス
  cout << "Student code: " << code << '\n';
 }
 void SetStdName(const char *n) {strcpy(name, n);}
};
int main() {
 CStudent s;
 s.SetStdName("Taro");           // CUnivMem の継承メンバ関数
 s.SetCode(1001);                  // CStudent のメンバ関数
 s.print();                               // Name: Taro
                               // Student code: 1001
 return 0;
}

問題 4
#include
enum {mei = 1867, tai = 1911, sho = 1925, hei = 1988};
class CCalendar {
 int year, month, day;
public:
 ...
 friend ostream &operator <<(ostream &, CCalendar);
};
ostream &operator <<(ostream &s, CCalendar x) {
 s << x.year << "/" << x.month << "/" << x.day;
 return s;
}
class JCalendar: public CCalendar {
public:
 ...
 friend ostream &operator <<(ostream &, JCalendar);
};
ostream &operator <<(ostream &s, JCalendar x) {
 char *wname[7] = {"日", "月", "火", "水", "木", "金", "土"};
 if (x.ShowY() > mei && x.ShowY() <= tai) s << "明治" << x.ShowY() - mei;
 else if (x.ShowY() > tai && x.ShowY() <= sho)
                          s << "大正" << x.ShowY() - tai;
else if (x.ShowY() > sho && x.ShowY() <= hei)
                          s << "昭和" << x.ShowY() - sho;
else if (x.ShowY() > hei)            s << "平成" << x.ShowY() - hei;
s << "年" << x.ShowM() << "月" << x.ShowD() << "日"
                         << '(' << wname[x.ShowWD()] << ")";
 return s;
}
class ECalendar: public CCalendar {
public:
 ...
 friend ostream &operator <<(ostream &, ECalendar);
};
ostream &operator <<(ostream &s, ECalendar x) {
 char *wname[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
 char *mname[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
                   "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
 s << wname[x.ShowWD()] <<' ' << mname[x.ShowM() - 1] << ' '
                            << x.ShowD() << ' ' << x.ShowY();
 return s;
}

問題 6
#include
#include

class CUnivMem {                           // 大学人クラス
 char name[20];                                // 氏名
public:
  CUnivMem(char *n) {cout << "CUnivMem 作成中\n"; strcpy(name, n);}
 void SetName(const char *n) {strcpy(name, n);}
 char *ShowName() {return name;}
 void print() {cout << "Name: " << name << '\n';}
};
class CStudent: public CUnivMem {                 // 学生クラス
 int code;                                 // 学籍番号
public:
 CStudent(char *n, int c): CUnivMem(n)
                      {cout << "CStudent 作成中\n"; code = c;}
 void SetCode(const int c) {code = c;}
 int ShowCode() {return code;}
 void print();
};
class CForeignStd: public CStudent {               // 留学生クラス
 char name[10];                                // 国名
public:
 CForeignStd(char *n, int c, char *cn): CStudent(n, c)
             {cout << "CForeignStd 作成中\n"; strcpy(name, cn);}
 void SetName(char *c) {strcpy(name, c);}
 char *ShowCoutry() {return name;}
 void print();
};
void CStudent::print() {
 CUnivMem::print();                     // CUnivMem の print
 cout << "Student code: " << code << '\n';        // Student の code
}
void CForeignStd::print() {
 CStudent::print();                       // CStudent の print
 cout << "Country: " << name << '\n';         // ForeignStd の code
}
int main() {
 CForeignStd f("John", 1032, "US");
 f.print();                                // Country: US
 return 0;
}

問題 7
class CUnivMem { /* 略 */ }                // 大学人クラス
class CStudent: public CUnivMem { /* 略 */ }       // 学生クラス
class CForeignStd: public CStudent { /* 略 */ }     // 留学生クラス
void printall(CUnivMem *p) {p->print(); // CUnivMem::print() を実行

int main() {
 CForeignStd f("John",1032,"US");
 CStudent s("Taro",1000);
 printall(&f);                          // Country: US
 printall(&s);
 return 0;
}

問題 8
#include
enum {mei = 1867, tai = 1911, sho = 1925, hei = 1988};
class CCalendar {
 int year, month, day;
public:
 ...
 void virtual print()
            {cout << year << '/' << month << '/' << day << '\n';}
};
int CCalendar::ShowWD() {
 ...
}
class JCalendar: public CCalendar {
public:
 JCalendar(int y, int m, int d): CCalendar(y,m,d) {}
 void print();
};
void JCalendar::print() {
 ...
}
class ECalendar: public CCalendar {
public:
 ECalendar(int y, int m, int d): CCalendar(y,m,d) {}
 void print();
};
void ECalendar::print() {
...
}
int main() {
 /* 本文参照 */
}

問題 9
#include
enum {mei = 1867, tai = 1911, sho = 1925, hei = 1988};
class CCalendar {
 ...
 void virtual print()=0;             // 純粋仮想関数
};
int CCalendar::ShowWD() {
 ...
}
class JCalendar: public CCalendar {
 ...
 void print();
};
void JCalendar::print() {
 ...
}
class ECalendar: public CCalendar {
 ...
 void print();
};
void ECalendar::print() {
 ...
}
int main() {
 CCalendar *c
 JCalendar cj(1998,12,29);
 ECalendar ce(1998,12,30);
 c=&cj; c->print();
 c=&ce; c->print();
}

問題 10
#include
#include
class CUnivMem {                                // 大学人クラス
 char name[20];                                     // 氏名
public:
 CUnivMem(char *n) {cout << "CUnivMem 作成中\n"; strcpy(name, n);}
 ...
};
class CStudent: public CUnivMem {                       // 学生クラス
 int code;                                       // 学籍番号
public:
 CStudent(char *n, int c): CUnivMem(n)
                      {cout << "CStudent 作成中\n"; code = c;}
 ...
};
class CStuff: public CUnivMem {
 int code;                                     // 教職員コード
public:
 CStuff(char *n, int x): CUnivMem(n)
                      {cout << "CStuff 作成中\n"; code = x;}
 ...
};
class CTA: public CStuff, public CStudent {
 int code;                                       // TA コード
public:
 CTA(char *n, int std_c, int stf_c, int TA_c): CStuff(n, stf_c),
           CStudent(n, std_c) {cout << "CTA 作成中\n"; code = TA_c;}
 ...
 }
};
int main() {
 CTA t("Jiro", 1003, 5046, 53);
 t.print();
 return 0;
}

問題 11
#include
enum {mei = 1867, tai = 1911, sho = 1925, hei = 1988};
class CCalendar {
 ...
};
int CCalendar::ShowWD() {
 ...
}
class JCalendar: public CCalendar {
 char name[10]; // 国名
public:
 JCalendar(char* n, int y, int m, int d): CCalendar(y, m, d) {
  strcpy(name, n);
 }
 char* ShowName() {return name;}
 void print();
};
void JCalendar::print() {
 ...
}
class ECalendar: public CCalendar {
 int code; // 国コード
public:
 ECalendar(int c, int y, int m, int d): CCalendar(y, m, d) {code = c;}
 int ShowCode() {return code;}
 void print();
};
void ECalendar::print() {
 ...
}
class EJCalendar: public ECalendar, public JCalendar {
 char name[10]; // 地域名
public:
 EJCalendar(char *n, char *nn, int c, int y, int m, int d):
       ECalendar(c, y, m, d), JCalendar(n, y, m, d) {strcpy(name, nn);}
 char* ShowName() {return name;}
 void print();
};
void EJCalendar::print() {
 ECalendar::print();
 cout << "(area code: " << ECalendar::ShowCode() << ' ' <<
      "国: " << JCalendar::ShowName() << ' ' << "地域: "<< name << ")\n";
}
int main() {
 ECalendar ce(1, 1998, 12, 1);
 EJCalendar cej("JPN", "Tokyo", 10, 1998, 12, 30);
 ce.print();
 cej.print();
}

問題 12
#include
#include
class CUnivMem {
 char name[20];                                      // 氏名
public:
 CUnivMem(char *n) {cout << "CUnivMem 作成中\n"; strcpy(name, n);}
 ...
};
class CStudent: public virtual CUnivMem {
                           // CUnivMem を仮想基本クラスとして継承
 int code;                                      // 学籍コード
public:
 CStudent(char *n, int c): CUnivMem(n)
                      {cout << "CStudent 作成中\n"; code = c;}
 ...
};

class CStuff: public virtual CUnivMem{
                              // CUnivMem を仮想クラスとして継承
 int code;                                     // 教職員コード
public:
 CStuff(char *n, int c): CUnivMem(n)
                       {cout << "CStuff 作成中\n"; code = c;}
 ...
};
class CTA: public CStuff, public CStudent {
 int code; // TA コード
public:
 CTA(char *n, int stf_c, int std_c, int ta_c): CStuff(n, stf_c),
                        CStudent(n, std_c), CUnivMem(n) {
  cout << "CTA 作成中\n"; code = ta_c;
 }
 void print() {
  cout << ShowName() << '\n';                     // 正。曖昧ではない
  cout << CStuff::ShowCode() << '\n';
  cout << CStudent::ShowCode() << '\n';
  cout << code << '\n';
 }
};
int main() {
 CTA t("Jiro", 1003, 5046, 53);
 t.print();
 return 0;
}

問題 13
#include
enum {mei = 1867, tai = 1911, sho = 1925, hei = 1988};
class CCalendar {
 ...
};
int CCalendar::ShowWD() {
 ...
}
class JCalendar: public virtual CCalendar {
 char name[10]; // 国名
public:
 JCalendar(char* n, int y, int m, int d):
                       CCalendar(y,m,d) {strcpy(name, n);}
 char* ShowName() {return name;}
 void print();
};
void JCalendar::print() {
 ...
}
class ECalendar: public virtual CCalendar {
 int code; // 国コード
public:
 ECalendar(int c, int y, int m, int d): CCalendar(y, m, d) {code = c;}
 int ShowCode(){return code;}
 void print();
};
void ECalendar::print() {
 ...
}
class EJCalendar: public ECalendar, public JCalendar {
  char name[10]; // 地域名
public:
 EJCalendar(char *n, char *nn, int c, int y, int m, int d):
  ECalendar(c, y, m, d), JCalendar(n, y, m, d), CCalendar(y, m, d) {
  strcpy(name, nn);
 }
 char *ShowName() {return name;}
 void print();
};
void EJCalendar::print() {
...
  }
int main() {
 EJCalendar cej("JPN", "Tokyo", 10, 1998, 12, 30);
 ECalendar ce(1, 1998, 12, 1);
 ce.print();
 cej.print();
}


問題1  問題2  問題3  問題4  問題5(略)  問題6

問題7  問題8  問題9   問題10   問題11  問題12  問題13