西安交大C++程序设计第九章作业
- 格式:doc
- 大小:265.00 KB
- 文档页数:18
西安交通大学19年9月课程考试《程序设计基础(高起专)》作业考核试题试卷总分:100 得分:100一、单选题 (共 30 道试题,共 60 分)cvb1. C语言中,定义结构体的保留字是()。
A. unionB. structC. enumD. typedef满分:2 分正确答案:B2. 逻辑运算符两侧运算对象的数据类型()。
A. 只能是0或1B. 只能是0或非0正数C. 只能是整型或字符型数据D. 可以是任何类型的数据满分:2 分正确答案:D3. int a[10];合法的数组元素的最小下标值为()。
A. 10B. 9C. 1D. 0满分:2 分正确答案:D4. 已知x=43,ch='A',y=0;则表达式(x>=y&&ch<'B'&&!y)的值是()。
A. 0B. 语法错C. 1D. "假"满分:2 分正确答案:C5. 设C语言中,int类型数据占2个字节,则short类型数据占()。
A. 1个字节B. 2个字节C. 4个字节D. 8个字节满分:2 分正确答案:B6. 若有int i=3,*p;p=&i;下列语句中输出结果为3的是()。
A. printf("%d",&p);B. printf("%d",*i);C. printf("%d",*p);D. printf("%d",p);满分:2 分正确答案:C7. 经过下列的语句 int j,a[10],*p;定义后,下列语句中合法的是()。
A. p=p+2;B. p=a[5];C. p=a[2]+2;D. p=&(j+2);满分:2 分正确答案:A8. 若有说明int a[3][4];则a数组元素的非法引用是()。
A. a[0][2*1]B. a[1][3]C. a[4-2][0]D. a[0][4]满分:2 分正确答案:D9. 以下数值中,不正确的八进制数或十六进制数是()。
西安交⼤C++程序的设计第九章作业交通⼤学实验报告课程__计算机程序设计__实验名称__继承__第 1 页共页系别____ ______ 实验⽇期 2014 年 5 ⽉⽇专业班级__ ___组别_____________ 实验报告⽇期 2014 年⽉⽇姓名___ ______学号_ _ 报告退发 ( 订正、重做 ) 同组⼈_________________________________ 教师审批签字⼀、实验⽬的熟练继承的⽤法,进⼀步训练类的编程,并练习不同继承⽅式下对基类的成员的访问的控制。
⼆、实验容(⼀)第⼀题:从类Person中派⽣出⼀个教师类,新增的属性有:专业、职称和主讲课程(⼀门),并为这些属性定义相应的⽅法。
1.源程序代码:#includeusing namespace std;class Person{protected:char *Name;char Sex;int Age;public:Person(){Name="csj";Sex='M';Age=18;}Person(char *name,char sex,int age){Register(name,sex,age);}~Person(){delete []Name;}void Register(char *name,char sex,int age){int m=strlen(name);Name=new char[m+1];strcpy(Name,name);Sex=sex;;Age=age;}void print(){cout<<":"<}};class Teacher:public Person{protected:char *zhuanye;char *zhicheng;char *course;public:Teacher();Teacher(char*,char,int,char*,char*,char*);void Register(char*,char,int,char*,char*,char*);~Teacher();void print();};Teacher::Teacher(){Person::Register("罗先觉",'M',61);strcpy(zhuanye,"电⽓⼯程及其⾃动化");strcpy(zhicheng,"教授");strcpy(course,"电路");}Teacher::Teacher(char *name,char sex,int age,char *zy,char *zc,char *cor) {Register(name,sex,age,zy,zc,cor);}void Teacher::Register(char *name,char sex,int age,char *zy,char *zc,char *cor) {Person::Register(name,sex,age);zhuanye=new char[strlen(zy)+1];strcpy(zhuanye,zy);zhicheng=new char[strlen(zc)+1];strcpy(zhicheng,zc);course=new char[strlen(cor)+1];strcpy(course,cor);}Teacher::~Teacher(){delete []zhuanye;delete []zhicheng;delete []course;}void Teacher::print(){cout<<":"<}int main(){Person person;person.Register("csj",'M',18);person.print();Teacher teacher("lll",'M',56,"math","jiaoshou","gaoshu");teacher.print();teacher.Register("某某",'M',58,"数学","教授","⾼等数学");teacher.print();return 0;}2.实验结果:(⼆)第⼆题:第⼆题:许多研究⽣既有学⽣的属性,⼜有教师的属性。
西安交通大学实验报告课程__计算机程序设计__实验名称_课外实验题目__第 1 页共 19 页系别___ _______ 实验日期 2014 年 4月 3日专业班级____组别_____________ 实验报告日期 2014 年4 月 5日姓名___ _____学号_ _报告退发 ( 订正、重做 )同组人_________________________________ 教师审批签字一、实验目的复习巩固本阶段所学的知识,包括数组的使用、函数的使用、循环语句和条件语句的使用等。
二、实验内容(一)第一题:1、编写一个程序,计算m~n范围内的每个正整数的全部素因子。
其中的m和n由键盘输入。
评分标准:(1)程序框架完整,代码规范;(20%)(2)数据类型的定义和使用方法正确;(20%)(3)程序控制结构使用正确;(20%)(4)算法正确,清晰合理;(20%)(5)运行结果正确,输入和输出格式如下所示。
(20%)请输入m和n:15 1815的非平凡因子:3 516的非平凡因子:2 4 817的非平凡因子:18的非平凡因子:2 3 6 91.源程序代码:#include<iostream>using namespace std;void suyinzi(int x);int main(){int m,n;cout<<"请输入正整数m和n(m<=n):";cin>>m>>n;while(m>n){cout<<"您输入有误,m应该小于等于n,请重新输入:";cin>>m>>n;}for(int j=m;j<=n;j++)//对于范围内的正整数逐一判断寻找因子{suyinzi(j);}return 0;}void suyinzi(int x)//寻找并输出x的所有非平凡因子{cout<<x<<"的非平凡因子为:";for(int i=2;i<=x/2;i++){if(x%i==0){cout<<i<<" ";}}cout<<endl;}2.实验结果:3.问题分析:此题简单,但当该数没有非平凡因子时,如能够输出:“x没有非平凡因子!”而非仅仅输出空白则更好。
第1章 C++语言简介1.在计算机上调试运行本章的所有例题,熟悉实验环境和方法。
2.仿照例1-3,编写一个计算矩形面积的程序。
3.乘法计算器程序:可以根据例1-4自行改编。
4.修改例1-5的生日卡程序,使其能够输入和显示日期。
5.使用梯形法计算下式定积分的值。
⎰-+11sin dx e x x积分区域等分数可取为200,并将计算结果和手算结果相比较。
提示:e x 用math.h 中得库函数exp(x)表示。
第2章 控制结构1.编写计算阶乘 n!的程序。
2.编写程序求斐波那契数列的第n 项和前n 项之和。
斐波那契数列是形如0, 1, 1, 2, 3, 5, 8, 13, ...其通项为:F 0 = 0;F 1 = 1;F n = F n -1+F n -2。
3.编程求 ...)12()!(2)!2(...5423132arcsin 221252++++⋅⋅⋅⋅+⋅+≈+n n x n x x x x n n ,其中1<x 。
提示:结束条件可用 ε<u ,其中u 为通项。
4.求解猴子吃桃问题。
猴子在第一天摘下若干个桃子,当即就吃了一半,又感觉不过瘾,于是就多吃了一个。
以后每天如此,到第10天时,就只剩下了一个桃子。
请编程计算第一天猴子摘的桃子个数。
5.用弦截法求一元方程0)(=x f 在区间[]10,x x 之间的一个根。
提示:考虑当区间[]10,x x 足够小,在此区间中方程0)(=x f 仅有一个单根的情况,如图2.14所示。
图2.14 弦截法求方程的解此时如)(0x f 和)(1x f 异号,则可用两点间直线公式求出x 2:)()()(0101002x f x f x f x x x x ---= 然后用x 2代入原式求出f (x 2),判断f (x 2)与f (x 1)和f (x 0)中的哪一个同号,就用x 2和f (x 2)代替之,即如果f (x 2)和f (x 0)同号,就用x 2和f (x 2)代替x 0和f (x 0),反之用x 2和f (x 2)代替x 1和f (x 1),然后再继续上述过程直至|x 2-x 0|或|x 2-x 1|小于给定的误差控制值。
西安交通大学实验报告课程__计算机程序设计__实验名称__指针与函数__第 1 页共 25 页系别____ _______ 实验日期 2014 年 4月 18日专业班级__ ____组别_____________ 实验报告日期 2014 年 4 月 19日姓名___ _______学号_ _报告退发 ( 订正、重做 )同组人_________________________________ 教师审批签字一、实验目的学会使用递归函数和函数重载,进一步熟练动态分配等指针使用方法。
二、实验内容(一)第一题:1、(必做题)使用递归算法编写如下程序:对于任意给定的实数 X 和整数k( k>0) ,计算 Xk 。
1.源程序代码:#include<iostream>using namespace std;double yunsuan(double x,int k);//递归函数用于计算x^kint main(){double x;int k;cout<<"请输入实数x:";cin>>x;cout<<"请输入正整数k:";cin>>k;while(k<=0)//判断输入的k是否满足要求,若否则提示输入错误并重新输入{cout<<"您的输入有误!请输入正整数:";cin>>k;}cout<<"计算结果是:"<<x<<"^"<<k<<"="<<yunsuan(x,k)<<endl;//输出运算结果return 0;}double yunsuan(double x,int k){if(k==1)//k=1时不再进行循环,输出值为xreturn x;else{double s=x*yunsuan(x,k-1);//对于k大于1的情况,进入下一循环return s;}}2.实验结果:(1)输入X正实数:(2)输入X正整数:(3)输入x为负数:(4)输入k为负数:3.问题分析:该函数的循环方式是:x^k=x*x^(k-1).设f(x,k)=x^k,那么就有f(x,k)=f(x,k-1)*x.而其结束递归的条件是k=1,此时有f(x,1)=x,由此给出初值。
#include<stdio.h>#include<stdlib.h>/*int days(inty,intm,int d) //计算天数{int days=0,i;int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};if(y%4==0&&y%100!=0||y%400==0) //判断是否为闰年a[1]+=1;if(m==1)return days;else{for(i=0;i<m-1;i++)days+=a[i];days+=d;return days;}}struct date{int year;int month;int day;int days;}a;int main(){printf("enter date:");scanf("%d %d %d",&a.year,&a.month,&a.day);a.days=days(a.year,a.month,a.day);printf("%d年%d月%d日是该年的第%d天\n",a.year,a.month,a.day,a.days); }*//*#define N 10 //第3、4题时N为5,第5题时N为10 struct student{intnum;char name[20];float score[3];float ave; //第3、4、5题共用一个结构体类型}stu[N];*/void print(struct student a[]){inti;printf("学号姓名\t三门课成绩\n");for(i=0;i<N;i++)printf("%ld %s\t%-5.1f %-5.1f %-5.1f\n",a[i].num,a[i].name,a[i].score[0],a[i].score[1],a[i].sc ore[2]);}int main(){inti;printf("请输入%d个学生的信息:学号、姓名、三门课成绩:\n",N);for(i=0;i<N;i++)scanf("%d %s %f %f %f",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].sc ore[2]);print(stu);}*//*void print(struct student a[]){inti;printf("学号姓名\t三门课成绩\n");for(i=0;i<N;i++)printf("%ld %s\t%-5.1f %-5.1f %-5.1f\n",a[i].num,a[i].name,a[i].score[0],a[i].score[1],a[i].sc ore[2]);}void input(struct student a[]) //在上一题的基础上编写input函数{inti;printf("请输入%d个学生的信息:学号、姓名、三门课成绩:\n",N);for(i=0;i<N;i++)scanf("%d %s %f %f %f",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].sc ore[2]);}int main(){input(stu);print(stu);*//*测试数据10101 wu 70 71 9010102 chen 60 64 9010103 guo 80 78 9010104 lu 80 64 9010105 xu 60 65 9010106 huang 90 78 9010107 chen 70 66 9010108 rong 90 72 9010109 yang 50 63 9010110 zhang 50 71 90*//*int main(){inti,m=0;float average=0;printf("请输入%d个学生的信息:学号、姓名、三门课成绩:\n",N);for(i=0;i<N;i++){scanf("%d %s %f %f %f",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].sc ore[2]);stu[i].ave=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;average+=stu[i].ave/N;}for(i=1;i<N;i++)if(stu[i].ave>stu[m].ave)m=i;printf("三门课程总平均成绩为:%5.1f\n成绩最高的学生是:\n学号:%d\n姓名:%s\n三门课成绩:%5.1f,%5.1f,%5.1f\n平均成绩:%6.2f\n",average,stu[m].num,stu[m].name,stu[m].score[0],stu[m].score[1],stu[m].score[2],st u[m].ave);}*//*#define N 13 //定义人数struct a{intnum; //原来的序号int count; //报数数目struct a *next;};int main(){inti,j=1;struct a *p1,*p2,b[N];p1=b;for(i=0;i<N;i++){b[i].num=i+1; //定义序号为1到13if(i==N-1)b[i].next=&b[0]; //将最后一个节点的指针变量指向第一个节点elseb[i].next=&b[i+1]; //将每个节点的指针变量指向下一个节点}while(p1->next!=p1) //p1的next成员指向自己时表明只剩最后一个人{p1->count=j; //报数if(j==2)p2=p1; //p2的作用是标记报数为2的人if(j==3){j=1;p2->next=p1->next;//将报数为3的next成员赋值给上一个报数为2的next成员,使之指向下一个报数为1的//成员;}elsej+=1;p1=p1->next; //p1指向下一个count不为3的成员}printf("最后留在圈子的人原来的序号为:%d\n",p1->num);}*//*# define L sizeof(struct student)struct student{longnum;float score;struct student *next;};int n;struct student *creat(void) //生成单向动态链表的函数{struct student *head;struct student *p1,*p2;n=0;p1=p2=malloc(L);scanf("%ld,%f",&p1->num,&p1->score);head=NULL;while(p1->num!=0){n+=1;if(n==1)head=p1;else p2->next=p1;p2=p1;p1=malloc(L);scanf("%ld,%f",&p1->num,&p1->score);}p2->next=NULL;return head;}void print(struct student *head) //输出链表的函数{struct student *p=head;printf("\nnow,these records are:\n");while(p!=NULL){printf("%ld %5.1f\n",p->num,p->score);p=p->next;}}struct student *del1(struct student *head,longnum) //删除指定节点的函数,方法一,指定删除节点的数据{struct student *p1,*p2;p1=head;if(p1->num==num)return head=p1->next;else{while(p1->num!=num){p2=p1;p1=p1->next;}p2->next=p1->next;p1->next=NULL;return head;}}struct student *del2(struct student *head,int n) //方法二,指定删除节点序号{struct student *p1,*p2;inti=1;p1=head;if(i==n)return head=p1->next;else{while(i++<n){p2=p1;p1=p1->next;}p2->next=p1->next;p1->next=NULL;return head;}}int main(){struct student *head;longnum; //int n;head=creat();print(head);printf("\n输入要删除学生的学号:"); //printf("\n输入要删除节点序号:");scanf("%ld",&num); //scanf("%d",&n);head=del1(head,num); //head=del2(head,n);print(head);}*//*# define L sizeof(struct student)struct student{longnum;float score;struct student *next;};int n;struct student *creat(void) //生成单向动态链表的函数{struct student *head;struct student *p1,*p2;n=0;p1=p2=malloc(L);scanf("%ld,%f",&p1->num,&p1->score);head=NULL;while(p1->num!=0){n+=1;if(n==1)head=p1;else p2->next=p1;p2=p1;p1=malloc(L);scanf("%ld,%f",&p1->num,&p1->score);}p2->next=NULL;return head;}void print(struct student *head) //输出链表的函数{struct student *p=head;printf("\nnow,these records are:\n");while(p!=NULL){printf("%ld %5.1f\n",p->num,p->score);p=p->next;}}struct student *del1(struct student *head,longnum)//删除指定节点的函数,num为指定删除节点的数据{struct student *p1,*p2;p1=head;if(p1->num==num)return head=p1->next;else{while(p1->num!=num){p2=p1;p1=p1->next;}p2->next=p1->next;p1->next=NULL;return head;}}struct student *insert(struct student *head,struct student *p,int n) //插入节点的函数,n为新节点序号{struct student *p1,*p2;inti=1;p1=head;if(i==n){p->next=p1;head=p;}else{while(i++<n){p2=p1;p1=p1->next;}p2->next=p;p->next=p1;}return head;}int main(){struct student *head,*p;int n;longnum;head=creat();print(head);printf("\n输入要删除学生的学号:");scanf("%d",&num);head=del(head,num);print(head);p=malloc(L);//为插入的新节点开辟单元,否则p的值不确定printf("\n输入要添加学生的学号,成绩,序号:");scanf("%ld,%f,%d",&p->num,&p->score,&n);head=insert(head,p,n);print(head);}*//*# define L sizeof(struct student)struct student{intnum;float score;struct student *next;};int n;struct student *creat(void) //生成单向动态链表的函数{struct student *head;struct student *p1,*p2;n=0;p1=p2=malloc(L);scanf("%d %f",&p1->num,&p1->score);head=NULL;while(p1->num!=0){n+=1;if(n==1)head=p1;else p2->next=p1;p2=p1;p1=malloc(L);scanf("%d %f",&p1->num,&p1->score);}p2->next=NULL;return head;}void print(struct student *head) //输出链表的函数{struct student *p=head;printf("\nnow,these records are:\n");while(p!=NULL){printf("%d %5.1f\n",p->num,p->score);p=p->next;}}struct student *sort(struct student *head) //建立链表排序函数{struct student *p1,*p2;int t;float s;p1=head;p2=p1->next;while(p1&&p2)//不能写为p1,否则当p1指向最后一个结点时,最后一句循环语句出问题{while(p2){if(p1->num>p2->num){t=p1->num;s=p1->score;p1->num=p2->num;p1->score=p2->score;p2->num=t;p2->score=s;p2=p2->next;}else //不能省略else语句,否则遇到p1->num<p2->num时无限循环p2=p2->next;}p1=p1->next;p2=p1->next;}return head;}struct student *cat(struct student *head1,struct student *head2) //建立链表合并函数{struct student *p,*t;p=head1;while(p){t=p; //循环结束时t将指向a链表的最后一个指针p=p->next;}t->next=head2;return head1;}int main(){struct student *a,*b;printf("输入链表a:\n");a=creat();printf("输入链表b:\n");b=creat();print(sort(cat(a,b)));}*//*测试数据10018 8910016 6410014 8110012 940 010017 6710015 6810013 7610011 850 0*//*# define L sizeof(struct student)struct student{longnum;char name[20];struct student *next;};int n;struct student *creat(void) //生成单向动态链表的函数{struct student *head;struct student *p1,*p2;n=0;p1=p2=malloc(L);scanf("%ld %s",&p1->num,p1->name);head=NULL;while(p1->num!=0){n+=1;if(n==1)head=p1;else p2->next=p1;p2=p1;p1=malloc(L);scanf("%ld %s",&p1->num,p1->name);}p2->next=NULL;return head;}void print(struct student *head) //输出链表的函数{struct student *p=head;printf("\n现在链表a为:\n");while(p!=NULL){printf("%ld %s\n",p->num,p->name);p=p->next;}}struct student *delsame(struct student *a,struct student *b) //从a中删去与b相同学号的节点{struct student *p1,*p2,*p3;longnum;ints,k=0;p3=p1=a;p2=b;while(p1){s=0;num=p1->num;while(p2){if(p2->num!=num)p2=p2->next;else{s=1;break;}}if(s==1)p3->next=p1->next; //若a最后一个相同,p3的指针数据为null else{p3=p1; //每找到一个与b不相等的指针时,p3指向它k+=1; //每找到一个与b不相等的指针时,k累加1if(k==1) //找到第一个与b不相等的指针时,将头指针赋值给aa=p1;}p1=p1->next; //p1指向下一个指针p2=b; //p2重新指向链表b开头}if(k==0) //k=0表明a,b链表相同,返回null return a=NULL;elsereturn a;}int main(){struct student *a,*b;printf("输入链表a:\n");a=creat();printf("输入链表b:\n");b=creat();a=delsame(a,b);print(a);}*//*#define L sizeof(structinf)structinf{longnum;int age;char name[20];char sex;structinf *next;};int n;structinf *creat(void) //生成单向动态链表的函数{structinf *head;structinf *p1,*p2;n=0;p1=p2=malloc(L);scanf("%ld %s %c %d",&p1->num,p1->name,&p1->sex,&p1->age);head=NULL;while(p1->num!=0){n+=1;if(n==1)head=p1;else p2->next=p1;p2=p1;p1=malloc(L);scanf("%ld %s %c %d",&p1->num,p1->name,&p1->sex,&p1->age);}p2->next=NULL;return head;}void print(structinf *head) //输出链表的函数{structinf *p=head;printf("\nnow,theseinf are:\n");while(p!=NULL){printf("%ld %s %c %d\n",p->num,p->name,p->sex,p->age);p=p->next;}}structinf *delage(structinf *head,int a) //删除指定年龄节点的函数{structinf *p1,*p2;p1=head;while(p1->age==a)p1=p1->next;head=p1;p2=p1;while(p1->next!=NULL){if(p1->age==a){p2->next=p1->next;p1=p1->next;}else{p2=p1;p1=p1->next;}}if(p1->age==a)p2->next=NULL;return head;}int main(){structinf *head;int a;head=creat();print(head);printf("\n输入要删除的年龄:");scanf("%d",&a);head=delage(head,a);print(head);}*//*测试数据10009 chen f 2410010 wang m 2810011 li f 2810012 zhao m 2810013 chen f 2410014 wei m 2510015 yang f 2610016 tian m 2810016 tian m 2810017 mei f 2710018 liu m 2810019 chen f 24*/。
单选题(共30 道试题,共60 分。
)得分:521. 若有说明int a[3][4];则a数组元素的非法引用是(D)。
A. a[0][2*1]B. a[1][3]C. a[4-2][0]D. a[0][4]满分:2 分得分:22. 函数rewind的作用是(A)。
A. 使位置指针重新返回文件的开头B. 将位置指针指向文件中所要求的特定位置C. 使位置指针指向文件的末尾D. 使位置指针自动移至下一个字符位置满分:2 分得分:23. 结构体类型的定义允许嵌套是指(C)。
A. 成员是已经或正在定义的结构体型B. 成员可以重名C. 结构体型可以派生D. 定义多个结构体型满分:2 分得分:04. 下面有关for循环的正确描述是(D)。
A. for循环只能用于循环次数已经确定的情况B. for循环是先执行循环循环体语句,后判断表达式C. 在for循环中,不能用break语句跳出循环体D. for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来满分:2 分得分:25. C语言中,定义结构体的保留字是(B)。
A. unionB. structC. enumD. typedef满分:2 分得分:26. 以下运算符中,优先级最高的运算符是(C)。
A. ||B. %C. !D. ==满分:2 分得分:27. 以下叙述中错误的是(D)。
A. 二进制文件打开后可以先读文件的末尾,而顺序文件不可以B. 在程序结束时,应当用fclose函数关闭已打开的文件C. 在利用fread函数从二进制文件中读数据时,可以用数组名给数组中所有元素读入数据D. 不可以用FILE定义指向二进制文件的文件指针满分:2 分得分:28. 在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是(B)。
A. 地址传递B. 单向值传递C. 由实参传给形参,再由形参传回实参D. 传递方式由用户指定满分:2 分得分:29. 若k为int型变量,则以下程序段的执行结果是(B)。
9.1 阅读下列程序,写出执行结果1. #include <iostream.h>template <typename T>void fun( T &x, T &y ){ T temp;temp = x; x = y; y = temp;}void main(){ int i , j;i = 10; j = 20;fun( i, j );cout << "i = " << i << '\t' << "j = " << j << endl;double a , b;a = 1.1;b = 2.2;fun( a, b );cout << "a = " << a << '\t' << "b = " << b << endl;}2. #include <iostream.h>template <typename T>class Base{ public:Base( T i , T j ) { x = i; y = j; }T sum() { return x + y; }private:T x , y;} ;void main(){ Base<double> obj2(3.3,5.5);cout << obj2.sum() << endl;Base<int> obj1(3,5);cout << obj1.sum() << endl;}9.2 思考题1.抽象类和模板都是提供抽象的机制,请分析它们的区别和应用场合。
2.类属参数可以实现类型转换吗?如果不行,应该如何处理?3.类模板能够声明什么形式的友员?当类模板的友员是函数模板时,它们可以定义不同形式的类属参数吗?请你写个验证程序试一试。
第九章第7题建立一个通讯录文件。
每个人的记录包括编号、姓名、电话号码和地址。
程序能根据每个人的编号检索出该人的姓名、电话和地址。
#include<iostream.h>#include<fstream.h>#include<string.h>#define N 3struct st{int no;char name[10];char telephoneno[10];char address[10];};int main(){st people;int i,n;ofstream sfile("message.dat",ios::binary); //新建并打开message.dat文件if(!sfile){ cout<<"cannot open file!\n";return 1; }for(i=0;i<N;i++){cout<<"Enter name telephone and address("<<i+1<<"):";people.no=i+1;cin>>;cin>>people.telephoneno>>people.address; //输入个人信息sfile.write((char*)&people,sizeof(st)); } //程序自动加入序号sfile.close();ifstream pfile("message.dat",ios::binary); //打开message.dat文件cout<<"Enter find people no:";cin>>n;if(n>0&&n<=N){ //判断输入的数字是否是序号pfile.seekg((long)((n-1)*sizeof(st)),ios::beg);pfile.read((char*)&people,sizeof(st));cout<<people.no<<" "<<<<" "<<people.telephoneno<<" "<<people.address<<endl;}else cout<<"no is not correct!"<<endl;pfile.close();return 0; }输出:Enter name telephone and address(1)输入:123 123456 1234输出:Enter name telephone and address(2)输入:789 789012 7890输出:Enter name telephone and address(3)输入:345 345678 3456Enter find people no:22 789 789012 7890Press any key to continue第九章第9题假定饲养宠物时放置宠物的窝共分20个栏,一部分用于养猫,一部分用于养狗。
西安交通大学实验报告课程__计算机程序设计__实验名称__继承__第 1 页共页系别____ ______ 实验日期 2014 年 5 月日专业班级__ ___组别_____________ 实验报告日期 2014 年月日姓名___ ______学号_ _ 报告退发 ( 订正、重做 ) 同组人_________________________________ 教师审批签字一、实验目的熟练继承的用法,进一步训练类的编程,并练习不同继承方式下对基类的成员的访问的控制。
二、实验内容(一)第一题:从类Person中派生出一个教师类,新增的属性有:专业、职称和主讲课程(一门),并为这些属性定义相应的方法。
1.源程序代码:#include<iostream>using namespace std;class Person{protected:char *Name;char Sex;int Age;public:Person(){Name="csj";Sex='M';Age=18;}Person(char *name,char sex,int age){Register(name,sex,age);}~Person(){delete []Name;}void Register(char *name,char sex,int age){int m=strlen(name);Name=new char[m+1];strcpy(Name,name);Sex=sex;;Age=age;}void print(){cout<<"姓名:"<<Name<<"\t性别:"<<Sex<<"\t年龄:"<<Age<<endl;}};class Teacher:public Person{protected:char *zhuanye;char *zhicheng;char *course;public:Teacher();Teacher(char*,char,int,char*,char*,char*);void Register(char*,char,int,char*,char*,char*);~Teacher();void print();};Teacher::Teacher(){Person::Register("罗先觉",'M',61);strcpy(zhuanye,"电气工程及其自动化");strcpy(zhicheng,"教授");strcpy(course,"电路");}Teacher::Teacher(char *name,char sex,int age,char *zy,char *zc,char *cor){Register(name,sex,age,zy,zc,cor);}void Teacher::Register(char *name,char sex,int age,char *zy,char*zc,char *cor){Person::Register(name,sex,age);zhuanye=new char[strlen(zy)+1];strcpy(zhuanye,zy);zhicheng=new char[strlen(zc)+1];strcpy(zhicheng,zc);course=new char[strlen(cor)+1];strcpy(course,cor);}Teacher::~Teacher(){delete []zhuanye;delete []zhicheng;delete []course;}void Teacher::print(){cout<<"姓名:"<<Name<<"\t性别:"<<Sex<<"\t年龄:"<<Age<<"\t专业"<<zhuanye<<"\t职称:"<<zhicheng<<"\t主讲课程:"<<course<<endl;}int main(){Person person;("csj",'M',18);();Teacher teacher("lll",'M',56,"math","jiaoshou","gaoshu");();("某某",'M',58,"数学","教授","高等数学");();return 0;}2.实验结果:(二)第二题:第二题:许多研究生既有学生的属性,又有教师的属性。
试通过多重继承说明一个研究生类。
1.源程序代码:验结果:(三)第三题:修改例9-5,从Point类中派生出一个Line类。
Line 类增加一个数据成员EndPoint计算线的长度。
试比较一下与直接使用Point类来构造Line类的不同之处。
1.源程序代码:(用了三个文件)验结果:四、第四题:从Date类和Time类派生出一个DateAndTime类,修改相应的成员函数,当时间递增到新的一天时,能够修改日期值。
1.程序源代码:#include<iostream>#include<cmath>using namespace std;class Date{protected:int year,month,day;public:Date(int a,int b,int c){year=a;month=b;day=c;}void init(int yy,int mm,int dd);void print_ymd();};void Date::init(int yy,int mm,int dd){ month=(mm>=1&&mm<=12) ? mm:0;year=(yy>=1900&&yy<=2100) ? yy:1900;day=(dd>=1&&dd<=31) ? dd:1;};void Date::print_ymd(){ cout<<year<<"-"<<month<<"-"<<day;}class Time{protected:int hour,minute,second;public:Time(int h,int m,int s){hour=h,minute=m,second=s;}void Register(int h=0,int m=0,int s=0){hour=h,minute=m,second=s;}void Showme_hms(){cout<<" "<<hour<<"小时"<<minute<<"分钟"<<second<<"秒"<<endl;}};class DateAndTime:public Date,public Time{public:DateAndTime(int a=1900,int b=1,int c=1,int d=0,int e=0,intf=0):Date(a,b,c),Time(d,e,f){}void input(int yy,int mm,int dd,int h,int m,int s){hour=h,minute=m,second=s;month=mm;year=yy;day=dd;}void Normal(){int n;if(second>=60){n=second/60;second=second%60;minute=minute+n;}if(second<0){n=second/60+1;second=second%60+60;minute=minute-n;}if(minute>=60){n=minute/60;minute=minute%60;hour=hour+n;}if(minute<0){n=minute/60+1;minute=minute%60+60;hour=hour-n;}if(hour>=24){n=hour/24;hour=hour%24;day=day+n;}if(hour<0){n=hour/24+1;hour=hour%24+24;day=day-n;}if(day>=30){n=day/30;day=day%30;month=month+n;}if(day<0){n=day/30+1;day=day%30+30;month=month-n;}if(month>=12){n=month/12;month=month%12;year=year+n;}if(month<0){n=month/12+1;month=month%12+12;year=year-n;}}void add(DateAndTime &d){year=year+;month=month+;day=day+;hour=hour+;minute=minute+;second=second+;}void sub(DateAndTime&d){year=;month=;day=;hour=;minute=;second=;}void show(){Normal();print_ymd();Showme_hms();}};void main(){DateAndTime d1,d2;cout<<"初始化:\n";();();(2014,5,23,22,4,50);(0,0,0,6,58,29);cout<<"第一个时间:\n";();cout<<"第二个时间:\n";();cout<<"第一个时间第二个时间相加为:\n";(d2);();}2.实验结果:五、第五题:采用继承方式定义一个三层生日蛋糕类,不论基类还是派生类都至少包含 5 个函数:构造函数、设置数据成员函数、求蛋糕体积、运算符 > 重载函数、输出生日祝词与蛋糕形状函数。