C语言程序课程设计报告lida.docx
《C语言程序课程设计报告lida.docx》由会员分享,可在线阅读,更多相关《C语言程序课程设计报告lida.docx(20页珍藏版)》请在冰豆网上搜索。
C语言程序课程设计报告lida
邵阳学院信息工程系
(高级语言程序设计)
专业班级:
通信工程二班
学生姓名:
李达
学号:
1141303072
指导教师:
黄同成
课程设计时间:
20125.18-6.3
目录
1前言2
2需求分析2
2.1要求2
2.2任务2
2.3运行环境2
2.4开发工具2
3概要设计与详细设计2
3.1系统流程图3
3.2查询函数流程图3
4编码与实现5
4.1分析5
4.2具体代码实现6
4.3运行结果截图22
1)主菜单22
4)按成绩排序23
5课程设计总结23
参考文献24
致谢24
1前言
编写一个程序来处理学生成绩。
通过一个结构体数组来存放输入的每一位同学的成绩(包括学期、学号、班级、姓名、四门课成绩),然后将其信息存入文件中。
并且能够完成队学生成绩的录入、修改、查询,按班级输出学生成绩单及不及格学生名单,统计学生成绩求学生的总分及平均分。
2需求分析
2.1要求
(1)用C语言实现程序设计;
(2)利用结构体进行相关信息处理;
(3)画出查询模块的流程图;
(4)系统的各个功能模块要求用函数的形式实现;
(5)界面友好(良好的人机互交),程序要有注释。
2.2任务
(1)定义一个结构体类型数组,输入每一位同学的记录(包括学期、学号、班级、姓名、四门课成绩),将其信息存入文件中;
(2)按顺序输入每个学生的信息;
(3)画出所有模块的流程图;
(4)编写代码;
(5)程序分析与调试。
2.3运行环境
(1)WINDOWS2000/XP系统
(2)TurboC2.0编译环境
2.4开发工具
C语言
3概要设计与详细设计
3.1系统流程图
图3.1系统流程图
3.2查询函数流程图
首先输入学号,当没有记录是显示“没有任何学生”,返回函数重新开始。
如过输入学号合格,则对已经存在的记录进行查找,最后打印信息。
函数流程图如下所示:
图3-2search()函数流程图
4编码与实现
4.1分析
1)本程序需要定义多个结构体,用于存放学生的相关信息。
structstudent//定义结构体
2)主函数功能比较简单,用while循环语句和switch多重选择语句来显示主界面和调用函数。
在主函数的前面要写必须的头文件,预定义语句以及全局变量的结构体。
3)利用while循环结构和else/if语句来实现增加信息的功能。
先定义5个指针*p0,*p1,*p2,*p3,*max,开始运行,当学生学号小于0时返回add函数,重新开始,而当输入0时返回菜单函数。
当输入学号符合要求时,函数向下运行,令p3=head,用else/if语句判断输入的学号是否重复,如果是则重新输入,如果不是,函数继续向下运行。
接下来利用指针来储存依次输入的语文、英语、数学、计算机成绩。
而用while结构来保证输入的成绩在0~100之间,如果不是则重新输入。
4)在C语言中无法做到删除和移动数据,所以删除记录要先将所有记录从文件中读出,删除后再将记录写回文件中。
每读出一条记录,按其在文件中的顺序做好指针链接关系,然后查处要删除的学生信息,将其在链表中删除,最后再将变动的记录重新写回文件中。
用指针,while循环和else/if结构来实现查找出要删除的学生。
5)在插入函数中利用指针,和else/if语句来实现输入的数据按照插入相应的位置。
6)利用指针、链表打开已经储存的信息。
7)先用if判断是否存在信息,如果没有则返回,如果已经存在则继续运行函数。
利用while循环语句和switch多重选择语句来实现是按照哪一种方式排名,用for,if语句来实现排名。
8)用do/while循环语句和switch多重选择语句调用各个功能函数。
9)用while循环语句和switch多重选择语句输出记录中的个人总分和平均分、单科平均分、总分最高分、总分最低分。
4.2具体代码实现
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedefstruct{
intnum;//学号
charname[20];//姓名
charsex[10];
intage;
doublemaths;//数学成绩
doubleenglish;//英语成绩
doublechinese;//语文成绩
doublecomputer;//计算机成绩
doubletotal;//总成绩
doubleaverage;//平均成绩
}STUDENT;//定义结构体
#defineN100
intmenu(){
chara;
do{system("cls");//运行前清零
printf("\t\t学生成绩管理系统\n");
printf("\t\t|1.输入记录\n");
printf("\t\t|2.插入\n");
printf("\t\t|3.按学号排序\n");
printf("\t\t|4.按成绩排序\n");
printf("\t\t|5.查询信息\n");
printf("\t\t|6.删除某人信息\n");
printf("\t\t|7.浏览结果\n");
printf("\t\t|0.退出\n");
printf("\t\t**********************************\n");
printf("\t\t\t给出你的选择(0-7):
");
a=getchar();
}while(a<'0'||a>'7');
return(a-'0');
}
voidinput(STUDENT*s,intsize){//输入函数
inti;
FILE*fp;
if((fp=fopen("stu.dat","wb"))==NULL){
printf("Cannotopenfile!
");
exit(0);
}
for(i=0;iprintf("输入学号:
\n");
scanf("%d",&s[i].num);
printf("输入姓名:
\n");
scanf("%s",s[i].name);
printf("输入性别:
\n");
scanf("%s",s[i].sex);
printf("输入年龄:
\n");
scanf("%d",&s[i].age);
printf("输入数学成绩:
\n");
scanf("%lf",&s[i].maths);
printf("输入英语成绩:
\n");
scanf("%lf",&s[i].english);
printf("输入语文成绩:
\n");
scanf("%lf",&s[i].chinese);
printf("输入计算机成绩:
\n");
scanf("%lf",&s[i].computer);
s[i].total=s[i].maths+s[i].chinese+s[i].english+s[i].computer;
s[i].average=s[i].total/4.0;
fwrite(&s[i],sizeof(STUDENT),1,fp);
}
fclose(fp);
}
voidoutput(STUDENT*s){
//输出函数
inti;
FILE*fp;
if((fp=fopen("stu.dat","rb"))==NULL){
printf("Cannotopenfile!
");
exit(0);
}
printf("学号姓名性别年龄数学英语语文计算机总分平均\n");
for(i=0;fread(&s[i],sizeof(STUDENT),1,fp)==1;i++){
printf("%-7d",s[i].num);
printf("%-6s",s[i].name);
printf("%-6s",s[i].sex);
printf("%-4d",s[i].age);
printf("%7.1f",s[i].maths);
printf("%7.1f",s[i].english);
printf("%7.1f",s[i].chinese);
printf("%7.1f",s[i].computer);
printf("%7.1f",s[i].total);
printf("%7.1f\n",s[i].average);
}
}
voidsave(){/*保存到磁盘上*/
FILE*fp;
STUDENT*s;
fp=fopen("stu.dat","wb");
inti;
for(i=0;ifwrite(&s[i],sizeof(STUDENT),1,fp);
}
fclose(fp);
}
voidread(STUDENT*s,intsize){/*从磁盘内读取*/
FILE*fp;
fp=fopen("stu.dat","rb");
inti;
for(i=0;ifread(&s[i],sizeof(STUDENT),1,fp);
}
fclose(fp);
}
voidfind(STUDENT*s,intsize){//按姓名查找
inti,flag=0;
charc[20];
FILE*fp;
fp=fopen("stu.dat","rb");
printf("输入要查询学生的姓名为:
\n");
scanf("%s",c);
printf("学号姓名性别年龄数学英语语文计算机总分平均\n");
for(i=0;fread(&s[i],sizeof(STUDENT),1,fp)==1;i++)
if(strcmp(s[i].name,c)==0){
printf("%-7d",s[i].num);
printf("%-6s",s[i].name);
printf("%-6s",s[i].sex);
printf("%-4d",s[i].age);
printf("%7.1f",s[i].maths);
printf("%7.1f",s[i].english);
printf("%7.1f",s[i].chinese);
printf("%7.1f",s[i].computer);
printf("%7.1f",s[i].total);
printf("%7.1f\n",s[i].average);flag=1;
}
if(flag==0)printf("输入有误!
");
fclose(fp);
}
voidsort_by_num(STUDENT*s,intsize){//按学号排序
inti,j,n=0;
STUDENTt;
FILE*fp;
fp=fopen("stu.dat","rb");
for(i=0;fread(&s[i],sizeof(STUDENT),1,fp)==1;i++){
n++;}
for(i=0;ifor(j=i+1;jif(s[i].num>s[j].num){
t=s[i];
s[i]=s[j];
s[j]=t;
}
}
printf("学号姓名性别年龄数学英语语文计算机总分平均\n");
for(i=0;iprintf("%-7d",s[i].num);
printf("%-6s",s[i].name);
printf("%-6s",s[i].sex);
printf("%-4d",s[i].age);
printf("%7.1f",s[i].maths);
printf("%7.1f",s[i].english);
printf("%7.1f",s[i].chinese);
printf("%7.1f",s[i].computer);
printf("%7.1f",s[i].total);
printf("%7.1f\n",s[i].average);}
fp=fopen("stu.dat","wb");
for(i=0;ifwrite(&s[i],sizeof(STUDENT),1,fp);
}
fclose(fp);
}
voidsort_by_total(STUDENT*s,intsize){//按总分排序函数
inti,j,n=0;
STUDENTt;
FILE*fp;
fp=fopen("stu.dat","rb");
for(i=0;fread(&s[i],sizeof(STUDENT),1,fp)==1;i++){
n++;
}
for(i=0;ifor(j=i+1;jif(s[i].total
t=s[i];
s[i]=s[j];
s[j]=t;
}
}
printf("学号姓名性别年龄数学英语语文计算机总分平均\n");
for(i=0;iprintf("%-7d",s[i].num);
printf("%-6s",s[i].name);
printf("%-6s",s[i].sex);
printf("%-4d",s[i].age);
printf("%7.1f",s[i].maths);
printf("%7.1f",s[i].english);
printf("%7.1f",s[i].chinese);
printf("%7.1f",s[i].computer);
printf("%7.1f",s[i].total);
printf("%7.1f\n",s[i].average);}
fp=fopen("stu.dat","wb");
for(i=0;ifwrite(&s[i],sizeof(STUDENT),1,fp);
}
fclose(fp);
}
voiddel(STUDENT*s,intsize){//按学号删除函数
inti,n;
intnum;
intflag=0;
inttotal=0,m=0;
FILE*fp;
fp=fopen("stu.dat","rb");
printf("请输入要删除的学生学号:
\n");
scanf("%d",&num);
for(i=0;fread(&s[i],sizeof(STUDENT),1,fp)==1;i++){
total++;
}
for(i=0;iif(num==s[i].num){flag=1;
printf("\t\t要删除学生的信息");
printf("学号姓名性别年龄数学英语语文计算机总分平均\n");
printf("%-7d",s[i].num);
printf("%-6s",s[i].name);
printf("%-6s",s[i].sex);
printf("%-4d",s[i].age);
printf("%7.1f",s[i].maths);
printf("%7.1f",s[i].english);
printf("%7.1f",s[i].chinese);
printf("%7.1f",s[i].computer);
printf("%7.1f",s[i].total);
printf("%7.1f\n",s[i].average);
for(i=i;is[i]=s[i+1];}
if((fp=fopen("stu.dat","wb"))==NULL){
printf("Cannotopenfile!
");
exit(0);
}
for(i=0;ifwrite(&s[i],sizeof(STUDENT),1,fp);}}
fclose(fp);
printf("\t\t删除后的情况\n");
printf("学号姓名数学英语语文计算机总分平均\n");
fp=fopen("stu.dat","rb");
for(i=0;fread(&s[i],sizeof(STUDENT),1,fp)==1;i++){
m++;}
for(i=0;iprintf("%-12d",s[i].num);
printf("%-11s",s[i].name);
printf("%7.1f",s[i].maths);
printf("%7.1f",s[i].english);
printf("%7.1f",s[i].chinese);
printf("%7.1f",s[i].computer);
printf("%7.1f",s[i].total);
printf("%7.1f\n",s[i].average);
}
if(flag==0){
printf("*******************************************");
printf("输入错误!
\n");
printf("请返回!
\n");
printf("*******************************************");}
printf("\n\n\n");
fclose(fp);
}
voidinsert(STUDENT*s,intsize)//按学号插入
{
inti,n=0;
inttotal=0;
FILE*fp;
fp=fopen("stu.dat","ab");
rewind(fp);
for(i=0;fread(&s[i],sizeof(STUDENT),1,fp)==1;i++){
printf("学号姓名性别年龄数学英语语文计算机总分平均\n");
printf("%-7d%-6s%-6s%-4s%7.1f%7.1f%7.1f%7.1f%7.1f%7.1f\n",s[i].num,s[i].sex,s[i].age,s[i].maths,s[i].english,s[i].chinese,s[i].computer,s[i].total,s[i].average);
}
total=i;
printf("请输入要插入学生的学号:
\n");
scanf("%d",&s[size].num);
printf("输入姓名:
\n");
scanf("%s",s[size].name);
printf("输入性别:
\n");
scanf("%s",s[size].sex);
printf("输入年龄:
\n");
scanf("%d",&s[size].age);
printf("输入数学成绩:
\n");
scanf("%lf",&s[size].maths);
printf("输入英语成绩:
\n");
scanf("%lf",&s[size].english);
printf("输入语文成绩:
\n");
scanf("%lf",&s[size].chinese);
printf("输入计算机成绩:
\n");
scanf("%lf",&s[size].computer);
s[size].total=s[size].maths+s[size].chinese+s[size].english+s[size].computer;
s[size].average=s[size].total/4.0;
fwrite(&s[size],sizeof(STUDENT),1,fp);
fclose(fp);
//while(!
feof(fp))
//if(fread(&s[n],sizeof(STUDENT),1,fp))
//n++;
/*printf("学号姓名性别年龄数学英语语文计算机总分平均\n");
for(i=0;iprintf("%-7d",s[i].num);
printf("%-6s",s[i].name);
printf("%-6s",s[i].sex);
printf("%-4d",s[i].age);
printf("%7.1f",s[i].maths);
printf("%7.1f",s[i].english);
printf("%7.1f",s[i].chinese);
printf("%7.1f",s[i].computer);
printf("%7.1f",s[i].total);
printf("%7.1f\n",s[i].average);
}*/
}
voidmain(){//主函数
STUDENTstd[N];//定义结构体数组
intm;
while
(1){//循环保证多次应用
switch(menu()){//运用菜单函数
case1:
printf("请输入你要登记的人数:
\n");
scanf("%d",&m);
input(std,m);system("pause");break;
case2:
insert(std,N);system("pause");break;
case3:
sort_by_num(std,N);
//output(std);
system("pause");break;
case