课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565
本周目标是:1. 学会定义类中>>和<<运算符的重载函数;2. 理解通过运算符的重载解决实际问题的方法
【上机项目】
项目1-3直接复制第8周的代码,加入要求的运算符重载定义后,作为第9周的项目另外发博文。
【项目1-Complex类】接第8周项目1,定义Complex类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
【项目2-Time类】接第8周项目2,定义Time类中的<<和>>运算符重载,实现时间的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
【项目3-分数类】接第8周项目3,定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
【项目4-一元一次方程类】设计一元一次方程类,求形如ax+b=0的方程的解。
例如:输入3x-8=0时,输出的方程的解为x=2.66667;
再如:输入5s+18=0时,输出的方程的解为s=-3.6;
class CEquation {private: double a; // 未知数系数 double b; // 常数项 char unknown; // 未知数的符号 public: CEquation(double aa=0,double bb=0); friend istream &operator >> (istream &in,CEquation &e); friend ostream &operator << (ostream &out,CEquation &e); double Solve(); //返回解方程的结果 char getUnknown(); //返回未知数用什么符号 }; int main() { CEquation e; cout<<"请输入一元一次方程(输入格式:3x-8=0):"; cin>>e; //在两次测试中,分别输入3x-8=0和5s+18=0 cout<<"方程为:"<<e; cout<<"方程的解为:"<<e.getUnknown()<<"="<<e.Solve()<<endl; //对两次测试,分别输出x=...和s=... e.Solve(); return 0; }
【项目5(选做)-二维数组类Douary】建立一个二维数组类Douary,使该类中有以下数据成员、成员函数及友员函数,完成矩阵的输入、输出、加、减、相等判断等操作。
class Douary {public: Douary(int m, int n);//构造函数:用于建立动态数组存放m行n列的二维数组(矩阵)元素,并将该数组元素初始化为0 Douary::Douary(const Douary &d); //因为有指针数据成员,复制构造函数需要定义 ~Douary(); //析构函数:用于释放动态数组所占用的存储空间。 friend istream &operator>>(istream &input, Douary &d);//重载运算符“>>”输入二维数组 friend ostream &operator<<(ostream &output, Douary &d);//重载运算符“<<”以m行n列形式输出 friend Douary operator+(const Douary &d1,const Douary &d2);//两个矩阵相加,规则:对应位置上的元素相加 friend Douary operator-(const Douary &d1,const Douary &d2);//两个矩阵相减,规则:对应位置上的元素相减 bool operator==(const Douary &d);//判断两个矩阵是否相等,即对应位置上的所有元素是否相等 private: int *Array; //Array 为动态数组指针,构造函数中分配空间用Array = new int[row*col]; int row; //row 为二维数组的行数。 int col; //col 为二维数组的列数。 } int main() { Douary d1(2,3),d2(2,3) cout<<"输入d1:"<<endl; cin>>d1; cout<<"输入d2:"<<endl; cin>>d2; coutt<<"d1="<<endl; cout<<d1; coutt<<"d2="<<endl; cout<<d2; coutt<<"d1+d2="<<endl; cout<<(d1+d2); coutt<<"d1-d2="<<endl; cout<<(d1-d2); cout<<"d1"<<((d1==d2)?"==":"!=")<<"d2"<<endl; return 0; }
【程序阅读】阅读下面的程序,找出并标明其中出现构造函数、友元函数、运算符重载、静态数据成员等语法现象的位置,仔细体会其用法,在以后的设计中能够灵活应用有关方法和技巧
#include <iostream> #include <Cstring> using namespace std; #define MAX 100 class CDate // 定义日期类 {private: unsigned short int year; // 年 unsigned short int month; // 月 unsigned short int day; // 日 public: CDate(int y=0,int m=0,int d=0); bool operator < (CDate d); friend istream & operator >> (istream &in,CDate &d); friend ostream & operator<<(ostream &out,CDate &d); friend bool CheckValid(CDate d); friend bool LeapYear(int year); void SetDate(int y,int m,int d); }; CDate::CDate(int y,int m,int d):year(y),month(m),day(d){} // 设置日期 void CDate::SetDate(int y,int m,int d) { year=y; month=m; day=d; } // 重载输入运算符>> istream &operator>>(istream &in,CDate &d) { char ch1,ch2; cout<<"请输入日期(输入格式:-3-12):"; while(1) { cin>>d.year>>ch1>>d.month>>ch2>>d.day; if (ch1=='-' && ch2=='-') if (CheckValid(d)) break; cerr<<"时间格式不正确! 请重新输入\n"; } return cin; } // 重载输出运算符<< ostream &operator<<(ostream &out,CDate &d) { out<<d.year<<"年"<<d.month<<"月"<<d.day<<"日"; return out; } // 判断日期d1<d2 bool CDate::operator < (CDate d) { if (year<d.year) return true; if (year>d.year) return false; if (month<d.month) return true; if (month>d.month) return false; if (day<d.day) return true; return false; } // 检查日期合法性 bool CheckValid(CDate d) { int n; if (d.month<1 || d.month>12) return false; if (d.day<1) return false; n=31; switch(d.month) { case 2: if (LeapYear(d.year)) n=29; else n=28; break; case 4: case 6: case 9: case 11: n=30; break; } if (d.day>n) return false; return true; } // 检查是否为闰年 bool LeapYear(int year) { if (year%4==0 && year%100 || year%400==0) return true; return false; } class CStudent {private: char *name; // 姓名 bool sex; // 性别 CDate date; // 出生日期,类对象作数据成员 public: static int num; // 学生人数 CStudent(); void InputData(); friend void Sort(); // 排序 friend void FindName(); // 按姓名查询 friend void Statistic(); // 按性别统计 friend void Display(); // 显示全部信息 } stu[MAX]; int CStudent::num=0; CStudent::CStudent(){} // 输入信息 void CStudent::InputData() { int p; char s[41]; cout<<"请输入学生信息(NO."<<num<<"):\n"; cout<<"姓名:"; cin>>s; name=new char[strlen(s)+1]; strcpy(name,s); cout<<"性别(1-男,-女):"; cin>>p; if (p) sex=true; else sex=false; cin>>date; cout<<endl; } // 排序 void Sort() { int i,j,p,num; char *tn; bool ts; CDate td; num=CStudent::num; for(i=1;i<num;i++) { p=i; for(j=i+1;j<=num;j++) if (stu[j].date<stu[p].date) p=j;//找到当前未排序元素中年龄最小的对象的下标 if (p==i) continue; //下面交换stu[i]和stu[p] tn=stu[i].name; stu[i].name=stu[p].name; stu[p].name=tn; ts=stu[i].sex; stu[i].sex=stu[p].sex; stu[p].sex=ts; td=stu[i].date; stu[i].date=stu[p].date; stu[p].date=td; } } // 按姓名查询 void FindName() { char name[41]; int i,num; cout<<"请输入姓名:"; cin>>name; num=CStudent::num; for(i=1;i<=num;i++) if (strcmp(stu[i].name,name)==0) break; if (i>num) { cout<<"查无此人!"<<endl<<endl; return; } //如果查到了,显示学生信息 cout<<"姓名:"<<stu[i].name<<endl; cout<<"性别:"; if (stu[i].sex) cout<<"男"<<endl; else cout<<"女"<<endl; cout<<"生日:"<<stu[i].date<<endl; cout<<endl; } // 按性别统计 void Statistic() { int i,num,s1,s0; num=CStudent::num; s1=0; s0=0; for(i=1;i<=num;i++) if (stu[i].sex==1) s1++; else s0++; cout<<"男生人数:"<<s1<<endl; cout<<"女生人数:"<<s0<<endl; cout<<endl; } // 显示全部信息 void Display() { int i,num; num=CStudent::num; for(i=1;i<=num;i++) { cout<<stu[i].name<<" "; if (stu[i].sex) cout<<"男"; else cout<<"女"; cout<<stu[i].date<<endl; } cout<<endl; } void main() { char *menu[]={ "","输入信息","排序","按姓名查询","按性别统计","显示全部信息","退出" }; int i,p; bool end; end=false; while(!end) { for(i=1;i<7;i++) cout<<i<<" "<<menu[i]<<endl; cin>>p; switch(p) {case 1: // 输入信息 CStudent::num++; stu[CStudent::num].InputData(); break; case 2: // 排序 Sort(); break; case 3: // 按姓名查询 FindName(); break; case 4: // 按性别统计人数 Statistic(); break; case 5: // 显示全部信息 Display(); break; case 6: // 退出 end=true; break; } } }