资源描述
精品文档
实验十 结构和链表程序设计
班级: 学号: 姓名: 评分:
一.【实验目的】
1、掌握结构变量的基本使用方法。
2、掌握结构数组的基本使用方法。
3、掌握结构指针的概念以及结构指针作为函数参数的编程方法。
4、掌握单向链表的概念和建立方法。
5、掌握单向链表的基本操作
6、进一步掌握C程序的调试方法和技巧。
二.【实验内容和步骤】
1、程序调试题
A.目标:进一步学习掌握程序调试的方法和技巧。
B.内容:参照《实验指导》教材P95“9.改错题”,用递归函数计算xn的值。(注:程序文件保存在“调试示例”文件夹中,文件名为error10_1.cpp)
① 调试正确的源程序清单
#include <stdio.h>
double fun(int n,double x);
int main(void)
{int n;
double x, root;
printf("Enter x:");
scanf("%lf",&x);
printf("Enter n:");
scanf("%d",&n);
root=fun(n,x);
printf("root=%0.2f\n",root);
return 0;}
double fun(int n,double x)
{if(n==1) return x;
else return x*fun(n-1,x);}
② 运行结果:(提示:通过屏幕截图,贴粘程序运行界面)。
2、完善程序,并调试运行程序
题目(1)日期换算。程序功能:定义一个关于年、月、日的日期结构,并编写一个函数计算某日期是该年中的第几天(注意闰年问题)。要求用结构体指针作为函数参数。在主函数中输入一个日期(年、月、日),调用函数计算并输出该日期是该年中的第几天。(注:程序文件保存在“第1题”文件夹中)打开proj1.cpp文件,在两条星线之间填入相应的代码,使程序完成该功能。
① 调试正确的源程序清单
#include <stdio.h>
struct date{
int year; //年
int month; //月
int day; //日
};
int main (void ){
int n;
struct date d,*p;
int ComputeDays(struct date *p);
printf("Please Input a date: ");
scanf("%d%d%d", &d.year,&d.month,&d.day); //输入一个日期
p=&d; //指针p指向日期变量d
//请在两条星线之间填入相应的代码, 调用ComputeDays(struct date *p)函数计算。
/************************************************************************/
n=ComputeDays(p);
/************************************************************************/
printf("%d-%d-%d is the %d days.\n",d.year,d.month,d.day,n);
return 0;
}
int ComputeDays(struct date *p)
{
int i,num=0,flag; //num作为计算天数的累计和变量,flag作为是否闰年的标记。
int tab[2][13]={
{0, 31, 28, 31, 30,31,30,31,31,30,31, 30,31},
{0, 31, 29, 31, 30,31,30,31,31,30,31, 30,31}};
if((p->year%4==0 && p->year%100!=0) || (p->year%400==0))flag=1; //判定闰年
else flag=0;
//请在两条星线之间填入相应的代码, 计算某日期是该年中的第几天(注意闰年问题)。
/*************************************************************************/
for(i=1;i<p->month;i++)
{num=num+tab[flag][i];}
num=num+p->day;
/*************************************************************************/
return num;
}
② 运行结果:(提示:通过屏幕截图,贴粘程序运行界面)。
题目(2)计算时间差期。程序功能:定义一个关于时、分、秒的时间结构,并编写一个函数计算两个时刻的时间差(注:两个时刻的时间差小于24小时)。要求用结构体指针作为函数参数。在主函数中输入两个时刻(时、分、秒),调用函数计算并输出两个时刻的时间差。(注:程序文件保存在“第2题”文件夹中)打开proj2.cpp文件,在两条星线之间填入相应的代码,使程序完成该功能。
① 调试正确的源程序清单
#include <stdio.h>
struct time{
int hour;
int minute;
int second;
};
int main (void )
{
struct time t,t1,t2,*p,*q;
struct time TimeDiff(struct time *p,struct time *q);
printf("Please Input the First time: ");
scanf("%d%d%d", &t1.hour,&t1.minute,&t1.second); //输入第一个时间
printf("Please Input the second time: ");
scanf("%d%d%d", &t2.hour,&t2.minute,&t2.second); //输入第二个日期
p=&t1;q=&t2; //指针p、q分别指向日期变量d1、d2
//请在两条星线之间填入相应的代码, 调用TimeDiff(struct time *p,struct time *q)函数计算。
/************************************************************************************/
t=TimeDiff(p,q);
/************************************************************************************/
printf("The difference between t1 and t2 is ");
printf("%d Hours %d minutes and %d seconds.\n",t.hour,t.minute,t.second);
return 0;
}
struct time TimeDiff(struct time *p,struct time *q)
{struct time tt;
int num1,num2,num; //num作为计算时间差的总秒数变量
num1=p->hour*3600+p->minute*60+p->second;
num2=q->hour*3600+q->minute*60+q->second;
//请在两条星线之间填入相应的代码, 计算两个时刻的时间差。
/*****************************************************/
num=num2-num1;
tt.hour=num/3600;
tt.minute=(num-tt.hour*3600)/60;
tt.second=num-tt.hour*3600-tt.minute*60;
/*****************************************************/
return tt;
}
② 运行结果:(提示:通过屏幕截图,贴粘程序运行界面)。
题目(3)成绩处理。程序功能:定义一个关于学生成绩单的结构(包含:学号、姓名、语文、数学、计算机和平均成绩),编写4个对应的函数,分别完成以下几项计算和统计汇总工作:
(1) 计算每一个学生的平均成绩。
(2) 计算每门课程的平均成绩。
(3) 输出平均成绩最高的学生的记录。
(4) 按平均成绩从高到低输出学生的成绩单(学号、姓名、数学、英语、计算机和平均成绩)。
要求用结构体指针作为函数参数。在主函数中输入5个学生的学号、姓名和数学、英语、计算机三门课程的成绩数据,分别调用不同的函数完成以上4项工作。(注:程序文件保存在“第3题”文件夹中)打开proj3.cpp文件,在两条星线之间填入相应的代码,使程序完成该功能。
① 调试正确的源程序清单
② 运行结果:(提示:通过屏幕截图,贴粘程序运行界面)。
题目(4)链表拼接。程序功能:有两个单向链表,头指针分别为list1、list2,链表中每一结点包含姓名、工资基本信息,编写一个函数,把两个链表拼组成一个链表,并返回拼组后的新链表。要求用结构体指针作为函数参数。在主函数中建立两个单向链表list1和list2(注:基本工资为0,表示输入结束。),调用自定义的链表拼接函数,完成程序功能。(注:程序文件保存在“第4题”文件夹中)打开proj4.cpp文件,在两条星线之间填入相应的代码,使程序完成该功能。
① 调试正确的源程序清单
② 运行结果:(提示:通过屏幕截图,贴粘程序运行界面)。
三.【实验总结】
精品文档
展开阅读全文