(课后习题解答)第7章 用户自定义数据类型
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
string num; string name; float score[4]; float avr; } stu[N];
int main(){ int i,j,max=0,maxi=0; float average=0,sum; for (i=0;i<N;i++){ //输入 10 个学生的信息 cout<<"输入第"<<i+1<<"个学生的信息"<<endl;; cout<<"学号:"; cin>>stu[i].num; cout<<"姓名:"; cin>>stu[i].name; for (j=0;j<3;j++){ cout<<"第"<<j+1<<"门课程的成绩:"; cin>>stu[i].score[j]; } cout<<endl; }
中国矿业大学计算机学院
《高级语言程序设计》部分习题解答
教师:李政伟
第 7 章 自定义数据类型
作业:2、5、6、7、8、9、10 7.2(P219)写一个函数 days,由主函数将年,月,日传递给函数 days,计算出该日在本年是第 几天并将结果传回主函数输出。
分析:可以先定义一个结构体类型,包括年,月,日这三个成员。通过调用 days 函数来计算 这一天是该年的第几天。
while(num!=p1->num && p1->next!=NULL) //p1 指向的不是所要找的结点且后面还有结点
{
p2=p1; p1=p1->next;
}
//p1 后移一个结点
if(num==p1->num)
//找到了
{ p2->next=p1->next;
//否则将下一结点地址赋给前一结点地址
int day_sum;
cout<<"input year,month,day:";
cin>>date.year>>date.month>>date.day; day_sum=days(date.year,date.month,date.day); //对 days 函数的调用
cout<<date.month<<"/"<<date.day<<" is the "<<day_sum
struct STUDENT{ long num; float score; STUDENT *next;
}; int n;
int main(){ STUDENT *creat(void); STUDENT *del(STUDENT *,long); STUDENT *insert(STUDENT *,STUDENT *); void print(STUDENT *); STUDENT *head,*stu;
return 0; }
7.6(P219)写一个函数 creat,用来建立一个动态链表。所谓建立动态链表是指在程序执行过 程中从无到有地建立起一个链表,即一个一个第开辟节点和输入各节点的数据,并建立起前后 相链的关系。各节点的数据由键盘输入。 【源程序】 #include <iostream> using namespace std; struct STUDENT{
long num; float score; STUDENT *next; };
【creat 函数实现 1】 int n; STUDENT *creat(void)
//定义 n 为全局变量,本文件模块中各函数均可使用它 //尾插法。此函数带回一个指向链表头的指针
备注:1.欢迎大家参与讨论并不断更新完善 2.仅供大家平时学习讨论使用,未经同意,切莫随意传播或作其他用途。
2.仅供大家平时学习讨论使用,未经同意,切莫随意传播或作其他用途。
第4页
中国矿业大学计算机学院
《高级语言程序设计》部分习题解答
教师:李政伟
do{ cout<<p->num<<" "<<p->score<<endl; p=p->next;
}while(p!=NULL); }
7.8(P219)写一个函数 del,用来删除动态链表中一个指定的节点(由实参指定某一学号,表 示要删除该学生节点)。
{ STUDENT *h,*p; h=new STUDENT; h->next=NULL;
/*建立一个头结点*/ /*使头结点的指针域为空*/
p=new STUDENT;
cin>>p->num>>p->score;
while (p->num!=0)
{
p->next=h->next;
/*改变指针状况*/
return(day_sum);
}
运行结果如下:
备注:1.欢迎大家参与讨论并不断更新完善 2.仅供大家平时学习讨论使用,未经同意,切莫随意传播或作其他用途。
第1页
中国矿业大学计算机学院
《高级语言程序设计》部分习题解答
教师:李政伟
7.5(P219)有 10 个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入 10 个学生数据,要求打印出 3 门课的总平均成绩,以及最高分的学生的数据。 【源程序】 #include <iostream> #include <iomanip> #include <string> using namespace std; const int N=10; struct STUDENT{ //定义结构体类型 STUDENT
day_sum=0;
for (i=1;i<month;i++)
day_sum+=day_tab[i];
day_sum+=day;
if ((year%4==0 && year%100!=0 || year%4==0) && month>=3) day_sum+=1; //如果是闰年,则在上面计算基础上加 1
h->next=p;
p=new STUDENT;
/* h 的直接后继是 p*/
cin>>p->num>>p->score;
}
return (h);
}
7.7(P219)写一个 print 函数,将上题建立的链表中各节点的数据依次输出。
【源程序】
void print(STUDENT *head) {
STUDENT *p; cout<<endl<<"Now, These records are:"<<endl; p=head->next; if(p!=NULL) 备注:1.欢迎大家参与讨论并不断更新完善
《高级语言程序设计》部分习题解答
教师:李政伟
average+=stu[i].avr; if (sum>max){ max=sum; maxi=i; //记下最高分的学生所对应数组元素的下表 } } average/=N; cout<<setiosflags(ios::left)<<endl; cout<<setw(8)<<" 学 号 "<<setw(8)<<" 姓 名 "<<setw(6)<<" 课 程 1"<<setw(6)<<" 课 程 2"<<setw(6)<<"课程 3"<<setw(8)<<"平均成绩"<<endl; for (i=0;i<N;i++){ cout<<setw(8)<<stu[i].num<<setw(8)<<stu[i].name; for (j=0;j<3;j++)
第3页
中国矿业大学计算机学院
《高级语言程序设计》部分习题解答
教师:李政伟
{ STUDENT *head;
STUDENT *p1,*p2;
n=0;
p1=p2=new STUDENT;
//开辟一个新单元,并使 p1,p2 指向它
cin>>p1->num>>p1->score;
head=NULL;
while(p1->num!=0) //当输入的学号为 0 时,终止循环
【源程序】
STUDENT *del(STUDENT *head,long num)
{
STUDENT *p1,*p2; if (head->next==NULL)
//是空表
{cout<<"list null!"<<endl; return(head);}
p2=p1=head->next;
//使 p1 指向第一个结点
{ n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=new STUDENT;
cin>>p1->num>>p1->score;
}
p2->next=NULL;
return(head);
}
【creat 函数实现 2】:
STUDENT *creat() /*头插法,建立单链表,通过函数返回头指针*/
<<"th day in "<<date.year<<endl;
return 0;
}
int days(int year,int month,int day)
// 定义 days 函数
{int day_sum,i;
int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
【源程序】
#include <iostream>
using namespace std;
struct y_m_d { int year; //分别存放年、月、日
int month;
int day;
};
int main()
{ y_m_d date; int days(int,int,int);
// 对 days 函数的声明
for (i=0;i<N;i++){ sum=0; for (j=0;j<3;j++) sum+=stu[i].score[j];
stu[i].avr=sum/3;
备注:1.欢迎大家参与讨论并不断更新完善 2.仅供大家平时学习讨论使用,未经同意,切莫随意传播或作其他用途。
第2页
中国矿业大学计算机学院
cout<<setw(6)<<stu[i].score[j]; cout<<setw(8)<<setiosflags(ios::fixed)<<setprecision(1)<<stu[i].avr<<endl; } cout<<"总平均成绩="<<average<<endl; cout<<"最高分的学生信息"<<endl; cout<<"姓名:"<<stu[maxi].name<<endl; cout<<"学号:"<<stu[maxi].num<<endl; cout<<"课程 1:"<<stu[maxi].score[0]<<endl; cout<<"课程 2:"<<stu[maxi].score[1]<<endl; cout<<"课程 3:"<<stu[maxi].score[2]<<endl; cout<<"平均成绩:"<<stu[maxi].avr<<endl;
cout<<"delete:"<<num<<endl;
free(p1);
} else cout<<"cannot find "<<num;
//找不到该结点
return(head);
}
7.9(P219)写一个函数 insert,用来向动态链表插入一个节点。
【源程序】 STUDENT *insert(STUDENT *head,STUDENT *st) {STUDENT *p0,*p1,*p2;
}
备注:1.欢迎大家参与讨论并不断更新完善 2.仅供大家平时学习讨论使用,未经同意,切莫随意传播或作其他用途。
第5页
中国矿业大学计算机学院
《高级语言程序设计》部分习题解答
教师:李政伟
else {
p2->next=st; st->next=NULL; } return (head);
}
7.10(P219)将以上 4 个函数组成一个程序,由主程序先后调用这些函数,实现链表的建立、 输出删除和插入、在主程序中指定需要删除和插入的结点。 【源程序】 #include <iostream> using namespace std;
cout<<"input records:"<<endl;
head=creat();
//返回头指针
print(head);
//输出全部结点
long del_num;
cout<<endl<<"input the deleted number:";
cin>>del_num;
//输入要删除的学号
p2=p1=head->next; //使 p1 指向第一个结点
while((p1!=NULL) && (st->num>p1->num) )
{p2=p1;
//使 p2 指向刚才 p1 指向的结点
p1=p1->next;//p1 后移一个结点
}
if(p1!=NULL)
{
p2->next=st;
Байду номын сангаас
st->next=p1;
int main(){ int i,j,max=0,maxi=0; float average=0,sum; for (i=0;i<N;i++){ //输入 10 个学生的信息 cout<<"输入第"<<i+1<<"个学生的信息"<<endl;; cout<<"学号:"; cin>>stu[i].num; cout<<"姓名:"; cin>>stu[i].name; for (j=0;j<3;j++){ cout<<"第"<<j+1<<"门课程的成绩:"; cin>>stu[i].score[j]; } cout<<endl; }
中国矿业大学计算机学院
《高级语言程序设计》部分习题解答
教师:李政伟
第 7 章 自定义数据类型
作业:2、5、6、7、8、9、10 7.2(P219)写一个函数 days,由主函数将年,月,日传递给函数 days,计算出该日在本年是第 几天并将结果传回主函数输出。
分析:可以先定义一个结构体类型,包括年,月,日这三个成员。通过调用 days 函数来计算 这一天是该年的第几天。
while(num!=p1->num && p1->next!=NULL) //p1 指向的不是所要找的结点且后面还有结点
{
p2=p1; p1=p1->next;
}
//p1 后移一个结点
if(num==p1->num)
//找到了
{ p2->next=p1->next;
//否则将下一结点地址赋给前一结点地址
int day_sum;
cout<<"input year,month,day:";
cin>>date.year>>date.month>>date.day; day_sum=days(date.year,date.month,date.day); //对 days 函数的调用
cout<<date.month<<"/"<<date.day<<" is the "<<day_sum
struct STUDENT{ long num; float score; STUDENT *next;
}; int n;
int main(){ STUDENT *creat(void); STUDENT *del(STUDENT *,long); STUDENT *insert(STUDENT *,STUDENT *); void print(STUDENT *); STUDENT *head,*stu;
return 0; }
7.6(P219)写一个函数 creat,用来建立一个动态链表。所谓建立动态链表是指在程序执行过 程中从无到有地建立起一个链表,即一个一个第开辟节点和输入各节点的数据,并建立起前后 相链的关系。各节点的数据由键盘输入。 【源程序】 #include <iostream> using namespace std; struct STUDENT{
long num; float score; STUDENT *next; };
【creat 函数实现 1】 int n; STUDENT *creat(void)
//定义 n 为全局变量,本文件模块中各函数均可使用它 //尾插法。此函数带回一个指向链表头的指针
备注:1.欢迎大家参与讨论并不断更新完善 2.仅供大家平时学习讨论使用,未经同意,切莫随意传播或作其他用途。
2.仅供大家平时学习讨论使用,未经同意,切莫随意传播或作其他用途。
第4页
中国矿业大学计算机学院
《高级语言程序设计》部分习题解答
教师:李政伟
do{ cout<<p->num<<" "<<p->score<<endl; p=p->next;
}while(p!=NULL); }
7.8(P219)写一个函数 del,用来删除动态链表中一个指定的节点(由实参指定某一学号,表 示要删除该学生节点)。
{ STUDENT *h,*p; h=new STUDENT; h->next=NULL;
/*建立一个头结点*/ /*使头结点的指针域为空*/
p=new STUDENT;
cin>>p->num>>p->score;
while (p->num!=0)
{
p->next=h->next;
/*改变指针状况*/
return(day_sum);
}
运行结果如下:
备注:1.欢迎大家参与讨论并不断更新完善 2.仅供大家平时学习讨论使用,未经同意,切莫随意传播或作其他用途。
第1页
中国矿业大学计算机学院
《高级语言程序设计》部分习题解答
教师:李政伟
7.5(P219)有 10 个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入 10 个学生数据,要求打印出 3 门课的总平均成绩,以及最高分的学生的数据。 【源程序】 #include <iostream> #include <iomanip> #include <string> using namespace std; const int N=10; struct STUDENT{ //定义结构体类型 STUDENT
day_sum=0;
for (i=1;i<month;i++)
day_sum+=day_tab[i];
day_sum+=day;
if ((year%4==0 && year%100!=0 || year%4==0) && month>=3) day_sum+=1; //如果是闰年,则在上面计算基础上加 1
h->next=p;
p=new STUDENT;
/* h 的直接后继是 p*/
cin>>p->num>>p->score;
}
return (h);
}
7.7(P219)写一个 print 函数,将上题建立的链表中各节点的数据依次输出。
【源程序】
void print(STUDENT *head) {
STUDENT *p; cout<<endl<<"Now, These records are:"<<endl; p=head->next; if(p!=NULL) 备注:1.欢迎大家参与讨论并不断更新完善
《高级语言程序设计》部分习题解答
教师:李政伟
average+=stu[i].avr; if (sum>max){ max=sum; maxi=i; //记下最高分的学生所对应数组元素的下表 } } average/=N; cout<<setiosflags(ios::left)<<endl; cout<<setw(8)<<" 学 号 "<<setw(8)<<" 姓 名 "<<setw(6)<<" 课 程 1"<<setw(6)<<" 课 程 2"<<setw(6)<<"课程 3"<<setw(8)<<"平均成绩"<<endl; for (i=0;i<N;i++){ cout<<setw(8)<<stu[i].num<<setw(8)<<stu[i].name; for (j=0;j<3;j++)
第3页
中国矿业大学计算机学院
《高级语言程序设计》部分习题解答
教师:李政伟
{ STUDENT *head;
STUDENT *p1,*p2;
n=0;
p1=p2=new STUDENT;
//开辟一个新单元,并使 p1,p2 指向它
cin>>p1->num>>p1->score;
head=NULL;
while(p1->num!=0) //当输入的学号为 0 时,终止循环
【源程序】
STUDENT *del(STUDENT *head,long num)
{
STUDENT *p1,*p2; if (head->next==NULL)
//是空表
{cout<<"list null!"<<endl; return(head);}
p2=p1=head->next;
//使 p1 指向第一个结点
{ n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=new STUDENT;
cin>>p1->num>>p1->score;
}
p2->next=NULL;
return(head);
}
【creat 函数实现 2】:
STUDENT *creat() /*头插法,建立单链表,通过函数返回头指针*/
<<"th day in "<<date.year<<endl;
return 0;
}
int days(int year,int month,int day)
// 定义 days 函数
{int day_sum,i;
int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
【源程序】
#include <iostream>
using namespace std;
struct y_m_d { int year; //分别存放年、月、日
int month;
int day;
};
int main()
{ y_m_d date; int days(int,int,int);
// 对 days 函数的声明
for (i=0;i<N;i++){ sum=0; for (j=0;j<3;j++) sum+=stu[i].score[j];
stu[i].avr=sum/3;
备注:1.欢迎大家参与讨论并不断更新完善 2.仅供大家平时学习讨论使用,未经同意,切莫随意传播或作其他用途。
第2页
中国矿业大学计算机学院
cout<<setw(6)<<stu[i].score[j]; cout<<setw(8)<<setiosflags(ios::fixed)<<setprecision(1)<<stu[i].avr<<endl; } cout<<"总平均成绩="<<average<<endl; cout<<"最高分的学生信息"<<endl; cout<<"姓名:"<<stu[maxi].name<<endl; cout<<"学号:"<<stu[maxi].num<<endl; cout<<"课程 1:"<<stu[maxi].score[0]<<endl; cout<<"课程 2:"<<stu[maxi].score[1]<<endl; cout<<"课程 3:"<<stu[maxi].score[2]<<endl; cout<<"平均成绩:"<<stu[maxi].avr<<endl;
cout<<"delete:"<<num<<endl;
free(p1);
} else cout<<"cannot find "<<num;
//找不到该结点
return(head);
}
7.9(P219)写一个函数 insert,用来向动态链表插入一个节点。
【源程序】 STUDENT *insert(STUDENT *head,STUDENT *st) {STUDENT *p0,*p1,*p2;
}
备注:1.欢迎大家参与讨论并不断更新完善 2.仅供大家平时学习讨论使用,未经同意,切莫随意传播或作其他用途。
第5页
中国矿业大学计算机学院
《高级语言程序设计》部分习题解答
教师:李政伟
else {
p2->next=st; st->next=NULL; } return (head);
}
7.10(P219)将以上 4 个函数组成一个程序,由主程序先后调用这些函数,实现链表的建立、 输出删除和插入、在主程序中指定需要删除和插入的结点。 【源程序】 #include <iostream> using namespace std;
cout<<"input records:"<<endl;
head=creat();
//返回头指针
print(head);
//输出全部结点
long del_num;
cout<<endl<<"input the deleted number:";
cin>>del_num;
//输入要删除的学号
p2=p1=head->next; //使 p1 指向第一个结点
while((p1!=NULL) && (st->num>p1->num) )
{p2=p1;
//使 p2 指向刚才 p1 指向的结点
p1=p1->next;//p1 后移一个结点
}
if(p1!=NULL)
{
p2->next=st;
Байду номын сангаас
st->next=p1;