以下为《 学生成绩管理系统c语言实践报告》的无排版文字预览,完整内容请下载
《C语言应用》实验报告
题 目
学生成绩管理系统
专业名称
软件工程
班 级
***2
学 号
191355
学生姓名
孟某某
指导教师
张某某
完成时间
2020.7.2
目 录
第1章 需求分析 3
第2章 总体设计 3
2.1 系统的程序流程图 3
2.2系统的全局变量和常量 3
2.3系统的函数介绍 3
第3章 详细设计 3
3.1 主函数设计 4
3.2 录入函数设计 4
3.3 排序函数设计 4
3.4 显示函数设计 4
3.5 查找函数设计
3.6 保存函数设计
第4章 测试 4
总结 4
参考文献 5
附录 程序源代码 5
需求分析
做一个学生管理系统,包含学生姓名和成绩,可对学生成绩进行排序,并实现由学号查找成绩
总体设计
2.1 系统的程序流程图
2.2系统的全局变量和常量
头文件有,,,
全局变量由n.k
常量有
2.3系统的函数介绍
main()函数:主函数功能主要是让程序选择将要进行的操作,通过menu()函数返回的选项进入其他函数执行。
int menu(int k)函数:此函数显示主菜单容,需要一个int类型变量作为输入要执行的选项并返回给main()函数。
score *creatlink()函数:此函数用于创建链表,为了节省存空间,我们采用malloc()函数为结构体分配动态存空间。另外考虑到学号不可能是0,所以用输入0 的式来判断是否结束输入,将最后的结构体中的指针指向NULL,并返回一个指向链表第一个结构的指针。
void print(score *head)函数:此函数返回值为空,知识为了在stdout流(屏幕)上打印出学生的成绩信息,需要一个指向链表头的指针来逐个向后打印。
score *add(score *head , score *stu)函数:为学生信息中添加新的学生资料,然后重新排序(按学号),并返回头指针。传入函数的head为链表头指针,stu指针指的是要添加的位置。
score *search(score *head)函数:按照学号查找学生信息,需要链表头指针并返回指向被搜索学生的指针。搜索原理就是从头向后面依次检索。
score *dele(score *head)函数:删除指定学生的资料。传入头指针,在函数中创建变量储存要删除学生的学号,然后从头向尾检索,直至找到该学生并将其删除,返回头指针。
score *sortdata(score *head)函数:用于按要求(学号、姓名、单科成绩)排序,最后返回头指针,排序运用老师上课时讲过的冒泡排序法。
int save(score *p1)函数:将链表的数据以文件的形式储存,传入的p1指针一开始指向链表头,随着储存顺序一个一个地向后面指,直到NULL为止。函数部定义一个指向文件的指针*fp,用于写入文件。
score *load(score *head)函数:读取文件数据,head为一个新建的链表头指针,读取文件数据之后令其保存至新建的链表之中,并返回头指针。
score *statistics(score *head)函数:统计成绩,可以统计总分、平均分、最高(低)分,返回操作后的链表首地址(头指针)。
详细设计
按函数,写出函数的原型声明,并画出每个函数的程序流程图。
3.1 主函数设计
int main() {int k;
score *head=0,*stu=0;
while(1)
{
k=menu(k);
switch(k)
{case 1:head=creatlink();break;
case 2: system("CLS");print(head); break;
case 3: head=search (head);break;
case 4: head=add (head,stu);break;
case 5: head=dele (head); break;
case 6: sortdata(head);break;
case 7: save (head);break;
case 8: statistics(head); break;
case 9: head=loadfile(head);break;
case 0:exit(0); default: printf("输入错误,请重试!\n"); }
}
}
3.2 录入函数设计
score *add(score *head,score *stu)
{
score *p0,*p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];
p3=stu=(score *)malloc(LEN); printf("\n输入要增加的学生的资料!");
repeat4: printf("请输入学生学号(学号应大于0):");
scanf("%d",&stu->number); while(stu->numbernumber);
} if(stu->number==0)
goto end2; / else
{
p3=head;
if(n>0)
{ for(i=0;inumber!=p3->number)
p3=p3->next;
else
{
printf("学号重复,请重输!\n");
goto repeat4; }
}
}
}
printf("输入学生姓名:");
scanf("%s",stu->name); printf("请输入语成.文绩(0~100):");
scanf("%f",&stu->chinese); while(stu->chinesechinese>100)
{ getchar();
printf("输入错误,请重新输入语成.文绩");
scanf("%f",&stu->chinese);
} printf("请输入数学成绩(0~100):");
scanf("%f",&stu->mathmatic); while(stu->mathmaticmathmatic>100)
{
getchar();
printf("输入错误,请重新输入数学成绩");
scanf("%f",&stu->mathmatic);
} printf("请输入英语成绩(0~100):");
scanf("%f",&stu->english); while(stu->englishenglish>100)
{
getchar();
printf("输入错误,请重新输入英语成绩");
scanf("%f",&stu->english);
} p1=head;
p0=stu;
if(head==NULL)
{
head=p0;
p0->next=NULL;
} else {
if(p1->next==NULL) {
p1->next=p0;
p0->next=NULL; /*将它与新开单元相连接*/
}
else
{
while(p1->next!=NULL) {
p2=p1;p1=p1->next;
}
p1->next=p0;
p0->next=NULL;
}
}
n=n+1;
p1=head;
p0=stu;
for(i=1;inumber>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->chinese;
max->chinese=p1->chinese;
p1->chinese=fen; fen=max->mathmatic;
max->mathmatic=p1->mathmatic;
p1->mathmatic=fen; fen=max->english;
max->english=p1->english;
p1->english=fen; }
max=head;p1=head ; } end2:
printf("现在的学生数为:%d个!\n",n);
return(head);
}
3.3排序函数设计
score *sortdata(score *head)
{
score *p,*max;
int i,j,x;
float fen;
char t[10];
if(head==NULL)
{
printf("\n没有任学生资料,请先建立链表!\n");
return(head);
} /*链表为空*/
max=p=head;
for(i=0;inumber)
{
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->chinese;
max->chinese=p->chinese;
p->chinese=fen;
fen=max->mathmatic;
max->mathmatic=p->mathmatic;
p->mathmatic=fen;
fen=max->english;
max->english=p->english;
p->english=fen;
}
}
max=head;
p=head;
}
print(head);
break;
case 2 :
for(i=1;iname,p->name)>0)
{
strcpy(t,max->name);
strcpy(max->name,p->name);
strcpy(p->name,t);
k=max->number;
max->number=p->number;
p->number=k;
fen=max->chinese;
max->chinese=p->chinese;
p->chinese=fen;
fen=max->mathmatic;
max->mathmatic=p->mathmatic;
p->mathmatic=fen;
fen=max->english;
max->english=p->english;
p->english=fen;
}
}
p=head;
max=head;
}
print(head);
break;
case 3 :
for(i=1;ichinese>p->chinese)
{
fen=max->chinese;
max->chinese=p->chinese;
p->chinese=fen;
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->mathmatic;
max->mathmatic=p->mathmatic;
p->mathmatic=fen;
fen=max->english;
max->english=p->english;
p->english=fen;
}
}
p=head;
max=head;
}
print(head);
break;
case 4 :
for(i=1;imathmatic>p->mathmatic)
{
fen=max->mathmatic;
max->mathmatic=p->mathmatic;
p->mathmat 内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。 ----\n");
fprintf(fp,"|学号\t|姓名\t|语文\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->chinese,p1->mathmatic,p1->english);
p1=p1->next;
}
fclose(fp);
printf("文件已经保存!\n");
return ;
}
测试
主要进行功能性测试,即验证各个功能模块是否正确运行。
可以采用运行系统进行截图的方法来验证系统结果的正确性。
总结
掌握了更多的知识,收益更多了,拥有一个编程的思维,和一个良好的编程习惯是必不可少的,c的学习正是对我这方面的锻炼和提高
参考文献
附录 程序源代码
[文章尾部最后500字内容到此结束,中间部分内容请查看底下的图片预览]请点击下方选择您需要的文档下载。
以上为《 学生成绩管理系统c语言实践报告》的无排版文字预览,完整内容请下载
学生成绩管理系统c语言实践报告由用户“freewindwl”分享发布,转载请注明出处