C语言课程设计报告34031157.docx
《C语言课程设计报告34031157.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告34031157.docx(27页珍藏版)》请在冰豆网上搜索。
C语言课程设计报告34031157
(此文档为word格式,下载后您可任意编辑修改!
)
华中科技大学计算机科学与技术学院
《C语言程序设计》课程设计
实验报告
题目:
C语言学生信息管理系统
专业:
计算机技术
班级:
11级
学号:
姓名:
指导教师:
甘早斌
说明
1、设计的目的
1)复习巩固C语言的基础知识,进一步加深对C语言编程的理解和掌握;
2)利用所学知识,理论和实际结合,利用资源,采用模块化的结构,使用模仿修改自主设计相结合的方法,锻炼学生综合分析解决实际问题的编程能力;
3)培养学生在项目开发中团队合作精神、创新意识及实战能力。
2、设计的任务
根据学生的实际情况,进行分组选题。
主要的课程设计题目如下(学生也可自主选题):
1.同学之间的通讯录
2、学生信息管理系统
3、设计要求与设计报告
设计要求:
1、任选上述题目之一,或自选题目。
2、模块化的程序设计
3、锯齿形的程序书写格式。
4、必须通过编译连接运行
设计报告:
1、设计目的和任务
2、总体设计:
包括程序设计组成框图、流程图。
3、详细设计:
包括模块功能说明:
函数功能、入口及出口参数说明,函数调用关系描述等。
4、调试与测试:
包括调试方法,测试结果分析与讨论,测试过程中遇到的主要问题及采取的解决措施。
5、源程序清单和执行结果:
清单中应有足够的注释。
设计目的和任务
设计目的:
(1)基本掌握面向过程程序设计的基本思路和方法;
(2)达到熟练掌握C语言的基本知识和技能;
(3)能够利用所学的基本知识和技能,解决简单的程序设计问题
程序功能:
(1).学生基本信息及成绩所选科目成绩的录入。
(2).基本信息的查询与修改。
(3).对学生成绩进行排序
(4)对所开课程的成绩分析(求其平均成绩,最高分和最低分);
(5).对学生考试成绩进行排名;
(6).保存于读取文件
(7).对学生成绩的追加与删除
对应子函数与流程图
voidcreatlist();*调用创建链表函数*
voidloadlist();*从文件调入记录函数*
voidsearchlist()*调用成绩查询函数*
voiddellist()*调用删除学生资料函数*
voidaddlist();break*调用追加学生资料函数*
voidprintlist(,k;
*==============================================================================================*
score*creatlist(void)
*函数creatlist,功能:
创建链表,此函数带回一个指向链表头的指针*
{
score*;
chart[10];
n=0;
p1=p2=p3=(score*)malloc(LEN);");
repeat1:
printf("请输入学生学号(学号应大于0):
");*输入学号,学号应大于0*
scanf("%d",&p1->number);
while(p1->number<0)
{
getchar();
printf("输入错误,请重新输入学生学号:
");
scanf("%d",&p1->number);}
if(p1->number==0)
gotoend;*当输入的学号为0时,转到末尾,结束创建链表*
else
{
p3=>0)
{
for(i=0;i{
if(p1->number!
=p3->number)
p3=p3->next;
else
{
printf("学号重复,请重输!
\n");
gotorepeat1;*当输入的学号已经存在,程序报错,返回前面重新输入*
}
}
}
}
printf("请输入学生姓名:
");
scanf("%s",&p1->name);
printf("请输入c成绩(0~100):
");*0-100*
scanf("%f",&p1->C);
while(p1->C<0||p1->C>100)
{
getchar();
printf("输入错误,请重新输入c成绩");
scanf("%f",&p1->C);}
printf("请输入高数成绩(0~100):
");
scanf("%f",&p1->Math);
while(p1->Math<0||p1->Math>100)
{
getchar();
printf("输入错误,请重新输入高数成绩");
scanf("%f",&p1->Math);}
printf("请输入英语成绩(0~100):
");
scanf("%f",&p1->English);
while(p1->English<0||p1->English>100)
{
getchar();
printf("输入错误,请重新输入英语成绩");
scanf("%f",&p1->English);}
=n+1;
if(n==1)
");
repeat2:
printf("请输入学生学号(学号应大于0):
");
scanf("%d",&p1->number);*输入学号,学号应大于0*
while(p1->number<0)
{
getchar();
printf("输入错误,请重新输入学生学号:
");
scanf("%d",&p1->number);
}
if(p1->number==0)
gotoend;*当输入的学号为0时,转到末尾,结束创建链表*
else
{
p3=>0)
{
for(i=0;i{
if(p1->number!
=p3->number)
p3=p3->next;
else
{
printf("学号重复,请重输!
\n");
gotorepeat2;
*当输入的学号已经存在,程序报错,返回前面重新输入*
}
}
}
}
printf("请输入学生姓名:
");
scanf("%s",&p1->name);*输入学生姓名*
printf("请输入c成绩(0~100):
");
scanf("%f",&p1->C);*输入各科成绩,成绩应在0-100,并直到输入正确为止*
while(p1->C<0||p1->C>100)
{
getchar();
printf("输入错误,请重新输入c成绩");
scanf("%f",&p1->C);
}
printf("请输入高数成绩(0~100):
");
scanf("%f",&p1->Math);
while(p1->Math<0||p1->Math>100)
{
getchar();
printf("输入错误,请重新输入高数成绩");
scanf("%f",&p1->Math);
}
printf("请输入英语成绩(0~100):
");
scanf("%f",&p1->English);
while(p1->English<0||p1->English>100)
{
getchar();
printf("输入错误,请重新输入英语成绩");
scanf("%f",&p1->English);
}
}
end:
p1=;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;
if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
*交换前后结点中的学号值,使得学号大者移到后面的结点中*
strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
*交换前后结点中的姓名,使之与学号相匹配*
fen=max->C;
max->C=p1->C;
*交换前后结点中的c成绩,使之与学号相匹配*
fen=max->Math;
max->Math=p1->Math;
p1->Math=fen;
*交换前后结点中的高数成绩,使之与学号相匹配*
fen=max->English;
max->English=p1->English;
p1->English=fen;
*交换前后结点中的英语成绩,使之与学号相匹配*
}
}
max=",n);
return([10];
FILE*fp;
printf("请输入文件路径及文件名:
");
scanf("%s",filepn);
if((fp=fopen(filepn,"r+"))==NULL)
{
printf("不能打开文件!
\n");
return0;
}
fscanf(fp,"学习成绩管理系统\n");
fscanf(fp,"作者:
班级:
11级计算机学号:
\n");
fscanf(fp,"-----\n");
fscanf(fp,"|学号\t|姓名\t|C\t|高数\t|英语\t|\n");
fscanf(fp,"-----\n");*读入表格域*
printf("学生成绩管理系统\n");
printf("作者:
班级:
11级计算机学号:
\n");
printf("-----\n");
printf("|学号\t|姓名\t|C\t|高数\t|英语\t|\n");
printf("-----\n");*打印表格域*
m=m+1;
if(m==1)
{
p1=(score*)malloc(LEN);*开辟一个新单元*
fscanf(fp,"%d%s%f%f%f",&p1->number,p1->name,&p1->C,&p1->Math,&p1->English);
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->C,p1->Math,p1->English);
*文件读入与显示*
=n+1;
if(n==1)",&p1->number,p1->name,&p1->C,&p1->Math,&p1->English);
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->C,p1->Math,p1->English);
}while(!
feof(fp));
p2->next=p1;
p1->next=NULL;
n=n+1;
}printf("-----\n");*表格下线*
fclose(fp);*结束读入,关闭文件*
return(;
chart[10];
p3=stu=(score*)malloc(LEN);*开辟一个新单元*
printf("\n输入要增加的学生的资料!
");
repeat4:
printf("请输入学生学号(学号应大于0):
");
scanf("%d",&stu->number);
while(stu->number<0)*输入学号,学号应大于0*
{
getchar();
printf("输入错误,请重新输入学生学号:
");
scanf("%d",&stu->number);
}*输入错误,重新输入学号*
if(stu->number==0)
gotoend2;*当输入的学号为0时,转到末尾,结束追加*
else
{
p3=>0)
{
for(i=0;i{
if(stu->number!
=p3->number)
p3=p3->next;
else
{
printf("学号重复,请重输!
\n");
gotorepeat4;
*当输入的学号已经存在,程序报错,返回前面重新输入*
}
}
}
}
******************************************************
printf("输入学生姓名:
");
scanf("%s",stu->name);*输入学生姓名*
printf("请输入c成绩(0~100):
");
scanf("%f",&stu->C);*输入各科成绩,成绩应在0-100,直到输入正确*
while(stu->C<0||stu->C>100)
{
getchar();
printf("输入错误,请重新输入c成绩");
scanf("%f",&stu->C);}
printf("请输入高数成绩(0~100):
");
scanf("%f",&stu->Math);
while(stu->Math<0||stu->Math>100)
{
getchar();
printf("输入错误,请重新输入高数成绩");
scanf("%f",&stu->Math);
}
printf("请输入英语成绩(0~100):
");
scanf("%f",&stu->English);
while(stu->English<0||stu->English>100)
{
getchar();
printf("输入错误,请重新输入英语成绩");
scanf("%f",&stu->English);}*输入错误,重新输入sql成绩直到正确为止*
p1==n+1;
p1=;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;
if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
*交换前后结点中的学号值,使得学号大者移到后面的结点中*
strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
*交换前后结点中的姓名,使之与学号相匹配*
fen=max->C;
max->C=p1->C;
p1->C=fen;
*交换前后结点中的各科成绩,使之与学号相匹配*
fen=max->Math;
max->Math=p1->Math;
p1->Math=fen;
fen=max->English;
max->English=p1->English;
p1->English=fen;
}
}
max=",n);
return(");return(");
printf("|学号\t|姓名\t|C\t|高数\t|英语\t|\n");
printf("-----\n");*打印表格域*
p1=",p1->number,p1->name,p1->C,p1->Math,p1->English);
printf("-----\n");
}*打印表格域*
else
printf("%d不存在此学生!
\n",number);
printf("输入要查询的学生的学号,");
scanf("%d",&number);
}
printf("已经退出了!
\n");
return(");
return(",number);n=n-1;
}
else
printf("%d不存在此学生!
\n",number);
*找不到该结点*
printf("输入要删除的学生的学号:
");
scanf("%d",&number);
getchar();
}
#ifdefDEBUG
printf("已经退出了!
\n");
#endif
printf("现在的学生数为:
%d个!
\n",n);
return(");}
else
{
printf("%d\n",n);
printf("----\n");
printf("|学号\t|姓名\t|C\t|高数\t|英语\t|\n");
printf("-----\n");*打印表格域*
p=",p->number,p->name,p->C,p->Math,p->English);
printf("---\n");*打印表格域*
p=p->next;
}while(p!
=NULL);*打印完成了*
}
}
*==============================================================================================*
*==============================================================================================*
score*statisticslist(score*;
score*p;
intx,y=0,i=0;
p=");
scanf("%d",&x);
getchar();
switch(x)
*用switch语句实现功能选择*
{
case1:
if(");return(");
printf("|学号\t|姓名\t|C\t|高数\t|英语\t|总分\t|平均分\t|\n");
printf("\n");*打印表格域*
while(p!
=NULL)
{
sum1=p->C+p->Math+p->English;*计算个人总分*
ave1=sum13;*计算个人平均分*
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->C,p->Math,p->English,sum1,ave1);
*打印结果*
printf("\n");*打印表格域*
p=p->next;
}
}
return(");return(",ave1);
printf("高数平均分是%.1f\n",ave2);
printf("英语平均分是%.1f\n",ave3);*打印结果*
return(");return()
{
i=i+1;
sum1=p->C+p->Math+p->English;*计算个人总分*
if(maxmax=sum1;
p=p->next;
}
printf("总分最高分:
%.1f",max);
printf("\n");
return(");
return(=p->C+p->Math+p->English;
while(p!
=NULL)
{
sum2=p->C+p->Math+p->English;
if(min>sum2)
min=sum2;
p=p->next;
}
}
printf("总分最低分:
%.1f",min);
printf("\n");
return(");
}
return([20];*用来存放文件保存路径以及文件名*
printf("请输入文件路径及文件名:
");
scanf("%s",filepn);
if((fp=fopen(filepn,"w+"))==NULL)
{
printf("不能打开文件!
\n");
return0;
}
fprintf(fp,"学生成绩管理系统\n");
fprintf(fp,"作者:
班级:
11级计算机学号:
V\n");
fprintf(fp,"-----\n");
fprintf(fp,"|学号\t|姓名\t|C\t|高数\t|英语\t|\n");
fprintf(fp,"-----\n");
*打印表格域*
while(p1!
=NULL)
{
fprintf(fp,"%d\t%s\t%.1f\t%.1f\t%.1f\t\n",p1->number,p1->name,p1->C,p1->Math,p1->English);
p1=p1->next;*下移一个结点*
}
fclose(fp);
printf("文件已经保存!
\n");
return0;
}
*==============================================================================================*
*==============================================================================================*
score*taxislist(score*;
chart[10];
if(");return(");
printf("4按高数成绩排序\t5按英语成绩排序\t\n");
for(i=0;i<80;i++)
printf("\3");
printf("请选择操作:
");
scanf("%d",&x);*选择操作*
getchar();
switch(x)*用switch语句实现功能选择*
{
case1:
for(i=1;i{
for(j=i+1;j<=n;j++)
{
max=p;
p=p->next;
if(max->number>p->number)
{
k=max->number;
max->number=p->number;
p->number=k;
*交换前后结点中的学号值,使得学号大者移到后面的结点中*
strcpy(t,max->name);
strcpy(max->name,p->name);
strcpy(p->name,t);
*交换前后结点中的姓名,使之与学号相匹配*
fen=max->C;
max->C=p->C;
p->C=fen;*交换前后结点中的各科成绩,使之与学号相匹配*
fen=max->Math;
max->Math=p->Math;
p->Math=fen;
fen=max->English;
max->English=p->Engl