char na[10],nu[10];
cout<<\输入姓名和电话号码\ for (i=0; i cout<<\ 第\个人:\ cin>>na>>nu; pn[i].setname(na); pn[i].setnum(nu); } void compute::getsort() int i,j,k; person temp; for(i=0;i for(j=i+1;j if(strcmp(pn[k].getname(),pn[j].getname())>0) k=j; temp=pn[k]; pn[k]=pn[i]; pn[i]=temp; } } void compute::outdata() { int i; cout<<\输出结果:\ cout<<\ 姓名 电话号码\ cout << \ -------- --------\ << endl; for(i=0;i cout< void main() { compute obj; obj.getdata(); obj.getsort(); obj.outdata(); } 9. 编写一个程序,输入n个学生的姓名和出生日期,并按年龄从大到小输出。 【知识点】:2.2 2.3 3.1 【参考分】:40分 【难易度】:A 【答案】:设计一个结构体person,包含学生的姓名和出生日期等数据:设计一 个类compute,包含私有数据成员,即person结构体数组st[],另有3个私有成员函数daynum()、count day()、leap()和3个公共成员函数getdam()、sort()、disp(),它们的功能分别用于数据获取、按出生日期排序和输出数据,在实现过程中调用前面的3个私有成员函数。sort()成员函数按结构体数组元素的d成员排序,d存放的是该学生从1900年1月l日到出生日期的天数。程序如下: #include int count day(int,int,int,int); int leap(int); struct person { char name[10]; struct dates int year; int month; int day; }date; int d; //从1900.1.1到出生日的天数 }; class compute { struct person st[N]; int daynum(int,int,int,int,int,int); int count_day(int,int,int,int); bool leap(int); public: void getdata(); void sort(); void disp(); }; int compute::daynum(int s_year,int s_month,int s_day,int e_year, int e_month,int e_day) { int year,day,dayl,day2; if(s year day=count_day(s_year,s_month,s_day,0); for(year=s_year+l;year day+=365L; day+=count_day(e_year,e_month,e_day,1); } else if(s_year==e_year) { dayl=count_day(s_year,s_month,s_day,1); day2=count_day(e_year,e_month,e_day,1); day=day2-dayl; } else day=-1; return day; } int compute::count_day(int year,int month,int day,int flag) { staric int day_tab[2][12]={(31,28,31,30,31,30,3l,31,30,31,30,3l}, {31,29,31,30,31,30,31,31,30,31,30,31}}; //使用二维数组存放各月天数,第一行对应非闰年,第二行对应闰年 int p,i,s; if(leap(year)) p=1; else p=0; if(flag) { s=day; for(i=1;i s=day_tab[p][month]-day; for(i=month+1;i<=12;i++) s+=day_tab[P][i一1]; } return(s); } bool compute::leap(int year) { if(year%4==O&&year0!=O||year@0==O) //是闰年 return true; else //不是闰年 return false; } void compute::sort() { int i,j; struct person temp; for(i=O;i if(st[j].d>st[j+1].d) { temp=st[j]; st[j]=st[j+1]; st[j+1]=temp; } } void compute::getdata() { int i; for(i=0;i cout<<\输入第\个学生姓名:\ cin>>st[i].name; cout<<\ 出生日期:\ cin>>st[i].date.year>>st[i].date.month>>st[i].date.day; st[i].d=daynum(1900,1,1,st[i].date.year, st[i].date.month,st[i].date.day); } } void compute::disp() { int i; cout<<\输出结果:\ cout<<\ 姓名 出生日期\ for(i=0;i cout< void main() { compute obj; obj.getdata(); obj.sort(); obj.disp(); } 10. 设计一个集合类Set,包括将集合置空、添加元素、判断元素是否在集合中、输出集合以及将集合中元素逆置,另外还有一个复制构造函数,并使用一些数据进行测试。 【知识点】:2.2 2.3 3.1 【参考分】:40分 【难易度】:B 【答案】:Set类包括私有数据data(存放集合元素)、Bum(集合中元素个数),一个缺省构造函数和复制构造函数Set(Set &s),另有成员函数setempty()(将集合置空)、issetempty()(判断集合是否为空)、ismemberof()(判断元素是否在集合中)、add()(添加元素)、disp()(输出集合)、reverse()(将集合中元素逆置)。其中,issetempty、ismemberof和disp函数设计为常成员函数。程序如下: #include const int Max=10; C1ass Set { int data[Max]; int num; public: Set(){num=0;} Set(Set &s); //对象引用作为参数 void setempty(){num=0;} bool issetempty()const; bool ismemberof(int n) const; int add(int n); void disp() const; void reverse(); }; Set::Set(Set &S) nUm=S.num; for(int i=0;i bool Set::issetempty() const { return(num==0); } bool Set::ismemberof(int n) const { for(int i=0;i int Set::add(int n) { if (ismemberof(n)) return 1; else if(num>Max) return 0; else { data[num++]=n; return 1; } } void Set::disp() const { cout<<\ for(int i=0;i