第九周 《C++语言基础》程序阅读——学生信息管理系统

问题描述:

阅读程序“简单C++学生信息管理系统”,找出其中出现构造函数、友元函数、运算符重载、静态数成员语法现象出现的位置,仔细体会其用法,在以后的设计中能够灵活应用有关方法和技巧。
[cpp]  view plain copy print ?
  1. #include <iostream>  
  2. #include <cstring>  
  3. using namespace std;  
  4. #define MAX 100  
  5.   
  6. class CDate  // 定义日期类  
  7. {  
  8. private:  
  9.     unsigned short int year;   // 年  
  10.     unsigned short int month;  // 月  
  11.     unsigned short int day;    // 日  
  12. public:  
  13.     CDate(int y=0,int m=0,int d=0);  
  14.     bool operator < (CDate d);  
  15.     friend istream & operator >> (istream &in,CDate &d);  
  16.     friend ostream & operator<<(ostream &out,CDate &d);  
  17.     friend bool CheckValid(CDate d);  
  18.     friend bool LeapYear(int year);  
  19.     void SetDate(int y,int m,int d);  
  20. };  
  21. CDate::CDate(int y,int m,int d):year(y),month(m),day(d) {}  
  22. // 设置日期  
  23. void CDate::SetDate(int y,int m,int d)  
  24. {  
  25.     year=y;  
  26.     month=m;  
  27.     day=d;  
  28. }  
  29. // 重载输入运算符>>  
  30. istream &operator>>(istream &in,CDate &d)  
  31. {  
  32.     char ch1,ch2;  
  33.     cout<<"请输入日期(输入格式:YYYY-MM-DD):";  
  34.     while(1)  
  35.     {  
  36.         cin>>d.year>>ch1>>d.month>>ch2>>d.day;  
  37.         if (ch1=='-' && ch2=='-')  
  38.             if (CheckValid(d)) break;  
  39.         cerr<<"时间格式或取值不正确! 请重新输入\n";  
  40.     }  
  41.     return cin;  
  42. }  
  43. // 重载输出运算符<<  
  44. ostream &operator<<(ostream &out,CDate &d)  
  45. {  
  46.     out<<d.year<<"年"<<d.month<<"月"<<d.day<<"日";  
  47.     return out;  
  48. }  
  49. // 判断日期d1<d2  
  50. bool CDate::operator < (CDate d)  
  51. {  
  52.     if (year<d.year) return true;  
  53.     if (year>d.year) return false;  
  54.     if (month<d.month) return true;  
  55.     if (month>d.month) return false;  
  56.     if (day<d.day) return true;  
  57.     return false;  
  58. }  
  59.   
  60. // 检查是否为闰年  
  61. bool LeapYear(int year)  
  62. {  
  63.     if ((year%4==0 && year%100) || year%400==0)  
  64.         return true;  
  65.     return false;  
  66. }  
  67.   
  68. // 检查日期合法性  
  69. bool CheckValid(CDate d)  
  70. {  
  71.     int n;  
  72.     if (d.month<1 || d.month>12) return false;  
  73.     if (d.day<1) return false;  
  74.     n=31;  
  75.     switch(d.month)  
  76.     {  
  77.     case 2:  
  78.         if (LeapYear(d.year))  
  79.             n=29;  
  80.         else  
  81.             n=28;  
  82.         break;  
  83.     case 4:  
  84.     case 6:  
  85.     case 9:  
  86.     case 11:  
  87.         n=30;  
  88.         break;  
  89.     }  
  90.     if (d.day>n) return false;  
  91.     return true;  
  92. }  
  93.   
  94. class CStudent  
  95. {  
  96. private:  
  97.     char *name;              // 姓名  
  98.     bool sex;                // 性别  
  99.     CDate date;              // 出生日期,类对象作数据成员  
  100. public:  
  101.     static int num;          // 学生人数  
  102.     CStudent();  
  103.     void InputData();  
  104.     friend void Sort();      // 排序  
  105.     friend void FindName();  // 按姓名查询  
  106.     friend void Statistic(); // 按性别统计  
  107.     friend void Display();   // 显示全部信息  
  108. } stu[MAX];  
  109. int CStudent::num=0;  
  110. CStudent::CStudent() {}  
  111. // 输入信息  
  112. void CStudent::InputData()  
  113. {  
  114.     int p;  
  115.     char s[41];  
  116.     cout<<"请输入学生信息(NO."<<num<<"):\n";  
  117.     cout<<"姓名:";  
  118.     cin>>s;  
  119.     name=new char[strlen(s)+1];  
  120.     strcpy(name,s);  
  121.     cout<<"性别(1-男,0-女):";  
  122.     cin>>p;  
  123.     if (p)  sex=true;  
  124.     else sex=false;  
  125.     cin>>date;  
  126.     cout<<endl;  
  127. }  
  128. // 排序  
  129. void Sort()  
  130. {  
  131.     int i,j,p,num;  
  132.     char *tn;  
  133.     bool ts;  
  134.     CDate td;  
  135.     num=CStudent::num;  
  136.     for(i=1; i<num; i++)  
  137.     {  
  138.         p=i;  
  139.         for(j=i+1; j<=num; j++)  
  140.             if (stu[j].date<stu[p].date) p=j;//找到当前未排序元素中年龄最小的对象的下标  
  141.         if (p==i) continue;  
  142.         //下面交换stu[i]和stu[p]  
  143.         tn=stu[i].name;  
  144.         stu[i].name=stu[p].name;  
  145.         stu[p].name=tn;  
  146.         ts=stu[i].sex;  
  147.         stu[i].sex=stu[p].sex;  
  148.         stu[p].sex=ts;  
  149.         td=stu[i].date;  
  150.         stu[i].date=stu[p].date;  
  151.         stu[p].date=td;  
  152.     }  
  153. }  
  154. // 按姓名查询  
  155. void FindName()  
  156. {  
  157.     char name[41];  
  158.     int i,num;  
  159.     cout<<"请输入姓名:";  
  160.     cin>>name;  
  161.     num=CStudent::num;  
  162.     for(i=1; i<=num; i++)  
  163.         if (strcmp(stu[i].name,name)==0) break;  
  164.     if (i>num)  
  165.     {  
  166.         cout<<"查无此人!"<<endl<<endl;  
  167.         return;  
  168.     }  
  169.     //如果查到了,显示学生信息  
  170.     cout<<"姓名:"<<stu[i].name<<endl;  
  171.     cout<<"性别:";  
  172.     if (stu[i].sex)  
  173.         cout<<"男"<<endl;  
  174.     else  
  175.     cout<<"女"<<endl;  
  176.     cout<<"生日:"<<stu[i].date<<endl;  
  177.     cout<<endl;  
  178. }  
  179. // 按性别统计  
  180. void Statistic()  
  181. {  
  182.     int i,num,s1,s0;  
  183.     num=CStudent::num;  
  184.     s1=0;  
  185.     s0=0;  
  186.     for(i=1; i<=num; i++)  
  187.         if (stu[i].sex==1)  
  188.             s1++;  
  189.         else  
  190.             s0++;  
  191.     cout<<"男生人数:"<<s1<<endl;  
  192.     cout<<"女生人数:"<<s0<<endl;  
  193.     cout<<endl;  
  194. }  
  195.   
  196. // 显示全部信息  
  197. void Display()  
  198. {  
  199.     int i,num;  
  200.     num=CStudent::num;  
  201.     for(i=1; i<=num; i++)  
  202.     {  
  203.         cout<<stu[i].name<<"\t";  
  204.         if (stu[i].sex)  
  205.             cout<<"男";  
  206.         else  
  207.             cout<<"女";  
  208.         cout<<"\t"<<stu[i].date<<endl;  
  209.     }  
  210.     cout<<endl;  
  211. }  
  212.   
  213. int main()  
  214. {  
  215.     char *menu[]= { "","输入信息","排序","按姓名查询","按性别统计","显示全部信息","退出" };  
  216.     int i,p;  
  217.     bool end;  
  218.     end=false;  
  219.     while(!end)  
  220.     {  
  221.         for(i=1; i<7; i++)  
  222.             cout<<i<<"  "<<menu[i]<<endl;  
  223.         cin>>p;  
  224.         switch(p)  
  225.         {  
  226.         case 1:                          // 输入信息  
  227.             CStudent::num++;  
  228.             stu[CStudent::num].InputData();  
  229.             break;  
  230.         case 2:                          // 排序  
  231.             Sort();  
  232.             break;  
  233.         case 3:                          // 按姓名查询  
  234.             FindName();  
  235.             break;  
  236.         case 4:                          // 按性别统计人数  
  237.             Statistic();  
  238.             break;  
  239.         case 5:                          // 显示全部信息  
  240.             Display();  
  241.             break;  
  242.         case 6:                          // 退出  
  243.             end=true;  
  244.             break;  
  245.         }  
  246.     }  
  247.     return 0;  
  248. }
运行结果:

第九周 《C++语言基础》程序阅读——学生信息管理系统_第1张图片



你可能感兴趣的:(第九周 《C++语言基础》程序阅读——学生信息管理系统)