实验名称:数据结构与软件设计实习
题
专业:生物信息学 班级:01 姓名: 学号:实验日期:2010.07.22
目:运动会分数统计
实验报告 1
一、
实验目的:
掌握基本的输入输出方法,理解程序的分支结构,实现条件判断和循环程序的
设计;
掌握结构体的应用;
二、 实验要求:
生各学院的成绩单,包括各学院所取得的项目号、名次(成绩)、学生姓名(或学号)和得分;产生
团体总分报表,包括学院号、男子团体总分、女子团体总分和团体总分。
二、
实验内容:
参加运动会的的学院编号为 1~n,比赛分成 m 个男子项目和 w 个女子项目,编号分别为 1~m 和
m+1~m+w,所有项目都取前五名,得分顺序为 7,5,3,2,1。写一个统计程序产生各种成绩单和得分
报表。
通过编程解决一些实际问题,并对程序进行测试,可设 n=4,m=3,w=2 进行测试,一般考虑 n≤
20,m≤30,w≤20,姓名长度不超过 20 个字符,按名次顺序输入运动员姓名、学院名和成绩。
四、实验编程结果或过程:
1. 数据定义
(1)描述运动员的线性表
typedef struct
{
int item[MAXSIZE]; //参赛项目号
char thletename[MAXSIZE][20];//姓名
char sex[MAXSIZE];//性别
int schoolnum[MAXSIZE];// 所 在 学 校 编
号
int num[MAXSIZE];//名次
int point[MAXSIZE];//得分
int last;
}student;
(2)描述学院的线性表
typedef struct
{
int schoolnum[MAXSIZE];//学校编号
int Tgirl[MAXSIZE];//女生团体总分
int Tboy[MAXSIZE];//男生团体总分
int Tall[MAXSIZE];//学校总成绩
int last;
}college;
2. 函数如下,代码详见文件“运动会.cpp”
开始
InitSCH(&S2,n)
初始化函数
input(&S1,n,m,w)
控制输入的函数
mark(&S1,&S2,n,m,w)
output(S1,S2)
结束
算分的函数
控制输出成绩的函数
3. 运行测试结果,运行结果无误,如下图
错误调试,能够正确处理错误,如下图
调试分析
1. 用线性链表时应注意细节,指针的使用过程中很容易出错,从而达不到采用其起到的
效果。
2. 线性表School的各属性在用之前需要初始化。
3. 进行健壮性判断时遇到很多问题:
a. 判断性别是否正确时S1->sex[i]!='g'和S1->sex[i]!='b'必须是并且关系
b. 当检测到错误,需要重新输入时,要在输入函数里再调输入函数,用递归调用的方法
实现重新输入。
4. 输入函数里传参时必须用指针(引用)类型,因为需要带回数据
五、实验总结:
(1)实验中的存在问题和提高
存在问题:程序有待简化。
提高:错误处理比较全面,而且能及时应对处理。
(2)收获与体会
基本的输入输出方法,理解程序的分支结构,实现条件判断和循环程序的设计;结构体的应用;
附录 源程序
#include
#include
#include
using namespace std;
#define MAXSIZE 100
#define ERROR 0
#define RIGHT 1
#include
#include
str_int(char *str)//字符串转换为数字
int
{
int num, i;
num = *str - '0';
i
= 1;
while (str[i] && isdigit(str[i]))
num = num * 10 + str[i++] - '0';
return num;
}
typedef struct
{
int item[MAXSIZE]; //参赛项目
string studentname[MAXSIZE];//姓名
char sex[MAXSIZE];//性别
int collegenum[MAXSIZE];//所在学院编号
int num[MAXSIZE];//名次
int point[MAXSIZE];//得分
int last;
}student;
typedef struct
{
int collegenum[MAXSIZE];//学院编号
int Tgirl[MAXSIZE];//女生团体总分
int Tboy[MAXSIZE];//男生团体总分
int Tall[MAXSIZE];//学院总成绩
int last;
}college;
void InitSCH(college *S,int n)
{
int i;
S->last=n-1;
for(i=0;ilast+1;i++)
{
S->collegenum[i]=i+1;
S->Tgirl[i]=0;
S->Tboy[i]=0;
S->Tall[i]=0;
}
}
int input(student *S1,int n,int m,int w)
{
string a1,a2,a3,a4,a5,a6;
int i=0,j=1,k=0;
if(S1->last==MAXSIZE-1)
{
cout<<"运动员人数已满,无法继续输入!"<>a6;
if(a6=="#") goto b;
a1=a6; cin>>a2>>a3>>a4>>a5;
S1->item[i]=str_int(&a1[0]);
S1->studentname[i]=a2;
S1->sex[i]=a3[0];
S1->collegenum[i]=str_int(&a4[0]);
S1->num[i]=str_int(&a5[0]);
while(1)
{
if(!(a1[0]>=48&&a1[0]<=57))
{
}
cout<<"您的输入有误,输入项目号不能为 非 数字,请重新输入该项目!"<
item[i]==0)
{
}
cout<<"您的输入有误,输入项目号!=0,请重新输入该项目!"<=48&&a4[0]<=57))
{
}
cout<<"您的输入有误,输入学院号不能为 非 数字,请重新输入该项目!"<collegenum[i]>n)
{
cout<<"您的输入 有误,输入学 院号不能超过"<sex[i]!='g'&&S1->sex[i]!='b')
{
cout<<"您的输入有误,输入运动员性别只能用'g'(女)或'b'(男)表示,请重
新输入该项目!"<item[i]>=0&&S1->item[i]<=m&&S1->sex[i]!='b')
{
cout<<"您的输入有误,项目号与性别不匹配,请重新输入该项目!"<item[i]>=m+1&&S1->item[i]<=m+w&&S1->sex[i]!='g')
{
cout<<"您的输入有误,项目号与性别不匹配,请重新输入该项目!"<=48&&a5[0]<=57))
{
cout<<"您的输入有误,输入名次不能为 非 数字,请重新输入该项目!"<num[i]>0&&S1->num[i]<=n))
{
}
cout<<"您的输入有误,输入名次>0 且<="<i++;S1->last=i;
if(i==100-1)
{
cout<<"运动员人数已满,无法继续输入!"<last=i;
return RIGHT;
}
void mark(student *L1,college *L2,int n,int m,int w)
{
int i,j;
for(i=0;ilast+1;i++)
{
if(L1->num[i]==1)
L1->point[i]=7;
if(L1->num[i]==2)
L1->point[i]=5;
if(L1->num[i]==3)
L1->point[i]=3;
if(L1->num[i]==4)
L1->point[i]=2;
if(L1->num[i]==5)
L1->point[i]=1;
if(L1->num[i]>5)
L1->point[i]=0;
}
for(i=0;ilast+1;i++)
{
for(j=0;jlast+1;j++)
{
if(L2->collegenum[i]==L1->collegenum[j])
{
if(L1->sex[j]=='b')
{
L2->Tboy[i]=L2->Tboy[i]+L1->point[j]; //累加各学院的男团
}
if(L1->sex[j]=='g')
{
L2->Tgirl[i]=L2->Tgirl[i]+L1->point[j]; //累加各学院的女团
}
总分
总分
}
}
L2->Tall[i]=L2->Tgirl[i]+L2->Tboy[i]; //计算个学院的集体总分
}
}
void output(student L1,college L2)
{
int i,j;
for(i=0;i>x; n=str_int(&x[0]);
cin>>x;m=str_int(&x[0]);
cin>>x;w=str_int(&x[0]);
int n,m,w;string x;
student S1;
S1.last=-1;
college S2;
cout<<"
cout<