桂林航天工业学院
课程设计总结报告
报告题目 | 学生管理系统 |
开课学期 | 2016-2017学年第2学期 |
班 级 | 软件工程4班 |
姓 名 | 有什么不懂的可以加我 |
学 号 | QQ:1416978277 |
地 点 | 巡天楼314机房 |
报告日期 | 2017年6月17日 |
成绩(五级记分制):
指导教师(签字):_____________________
本课程设计是针对刚学完C语言的计算机类专业学生的课程设计教学。C语言是学生的第一门计算机高级语言课程,课程结束后,学生已经对C语言程序设计有了较全面的了解,但接触的基本上是为了阐述相关概念或知识点而列举的示例,都是较小的程序,程序功能单一,因此缺乏整体观点和编写一个具体实用的综合程序的思想。
本课程设计的目的是要培养学生初步具有系统分析思想,并能利用开发工具开发一个简单实用的综合程序。为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力,提高学生适应实际,实践编程的能力。
要求学生以VC++6.0为开发工具,完成一个小型应用软件的设计和开发。进一步提高学生进行程序设计的能力。
(1)选题
(2)进行系统分析
(3)程序设计实现
(4)系统测试
(5)编写、上交课程设计报告
(1)系统设计要实用。
(2)对系统进行功能模块分析,主要功能模块正确实现。
(3)编程简练,可读性好,界面友好,功能全面。
(4)课程设计报告格式要规范。
本课程设计选题为“学生成绩管理系统”。系统主要功能是管理学生成绩信息,要求能实现学生成绩添加、删除、修改、查找、平均分、排序等功能。经过分析,确定本系统结构图如下图所示:
以下各个函数所需的头文件以及预定义
#include
#include
#include
#include
#include
#define N 128
#define stlensizeof(structst)//结构体长度
根据系统所管理数据信息的要求和特点,将学生成绩信息定义成以下结构体类型
structst
{
int no; //序号
int flag; //标记
char num[8]; //学号
char name[8]; //姓名
float cpp; //C语言成绩
float eng; //英语成绩
float math; //数学成绩
float ave; //平均分
};
为了简化函数的参数传递
structst s[N];
int tot=0;//结构体个数
int flag0=0;//标记为0的个数
方便各个函数相互调用
void head();
int all(int t);
int change();
intdelall();
intdelpart();
int display(int t);
int find();
intfindswitch(int t);
int input();
int insert();
int part(int t);
int recycle();
int reset();
int save();
int sort();
intsortswitch(int x);
int view();
intviewplus();
为了验证是否为主人操作,正确后才可以进入系统,否则3次错误退出系统
void main()
{
system("mode con cols=94 lines=30");//94行30列(居中)
SetConsoleTitle("学生管理系统"); //标题
system("color F0");//白底黑字
printf("欢迎使用学生管理系统\n");
printf("请输入口令!\n");
char get[10],pw[]="123";//密码
int count=3;
while(count)
{
gets(get);
if(strcmp(get,pw)==0)
{
printf("口令正确!正在进入系统...\n");
Sleep(500);head();
}
else
{
if(count!=1)
{
printf("口令错误!请重新输入!\n");
printf("您还有%d次机会!\n",--count);
}
else
{
printf("口令错误!按任意键退出系统!\n");
getch();exit(1);
}
}
}
}
进入主界面
void head()
{
FILE *fp;
if((fp=fopen("data.dat","r"))==NULL)//如果没有文件
fp=fopen("data.dat","wb+"); //创建一个文件
fp=fopen("data.dat","rb");
fseek(fp,0L,SEEK_END);//指向文件尾
tot=ftell(fp)/stlen; //结构体个数
fseek(fp,0L,SEEK_SET);//指向文件头
fread(s,stlen,tot,fp);
for(inti=0;i
{
if(s[i].flag==0)
flag0++;//查找标记为0的个数
}
fclose(fp);
while(1)
{
system("cls");
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* 欢迎使用学生管理系统 *\n");
printf("\t\t\t\t* 按键进入相应功能 *\n");
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ■1.输入学生数据 *\n");
printf("\t\t\t\t* ▼2.显示 *\n");
printf("\t\t\t\t* ▼3.回收站 *\n");
printf("\t\t\t\t* ■4.重置系统 *\n");
printf("\t\t\t\t* ●0.退出 *\n");
printf("\t\t\t\t******************************\n\n");
switch(getch())
{
case '1':input();break;
case '2':view();break;
case '3':recycle();break;
case '4':reset();break;
case '0':exit(1);
default :printf("输入有误!请重新输入。\n");Sleep(500);
}
}
}
输入数据
int input()//输入
{
FILE *fp;
fp=fopen("data.dat","ab+");
//system("cls");
printf("请输入【学号】【姓名】【C语言成绩】【英语成绩】【高数成绩】\n");
printf("(【学号】输入【0】保存并返回主菜单)\n");
for(inti=0;i
{
scanf("%s",s[i].num);
if(strlen(s[i].num)==1&&s[i].num[0]=='0') //如果输入的长度为1并且是0,退出
{
fclose(fp); return 0;//非正常退出关闭文件
}
scanf("%s%f%f%f",&s[i].name,&s[i].cpp,&s[i].eng,&s[i].math);
s[i].ave=(s[i].cpp+s[i].eng+s[i].math)/3;
s[i].no=++tot;
s[i].flag=0;//新增结构体自增,标记为0
flag0++;//标记0个数自增
fwrite(&s[i],stlen,1,fp);
}
fclose(fp);//正常退出关闭文件
printf("数据已超出,请删除后再添加。\n");
printf("正在返回主菜单...\n");Sleep(500);
}
显示数据以及下一步操作
int view()
{
if(flag0==0)
printf("无数据!\n");
else
{
display(0);
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆以上为学生数据: *\n");
printf("\t\t\t\t* ◆请选择操作: *\n");
printf("\t\t\t\t* ■1.多项删除 *\n");
printf("\t\t\t\t* ■2.全部删除 *\n");
printf("\t\t\t\t* ■3.修改 *\n");
printf("\t\t\t\t* ■4.插入 *\n");
printf("\t\t\t\t* ▼5.查找 *\n");
printf("\t\t\t\t* ▼6.排序 *\n");
printf("\t\t\t\t* ▼7.另存为... *\n");
printf("\t\t\t\t* ▲【其他键】返回主菜单 *\n");
printf("\t\t\t\t******************************\n");
switch(getch())
{
case '1'://多项删除
{
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆正在进行多项删除操作 *\n");
printf("\t\t\t\t* ◆输入【序号】删除 *\n");
printf("\t\t\t\t* ◆多项之间加【空格】 *\n");
printf("\t\t\t\t* ▲结束加【0】 *\n");
printf("\t\t\t\t******************************\n");
part(1);
}break;
case '2'://全部删除
{
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆确定【全部删除】吗? *\n");
printf("\t\t\t\t* ■【回车键】确认 *\n");
printf("\t\t\t\t* ▲【其他键】取消 *\n");
printf("\t\t\t\t******************************\n");
if(getch()==13)
{
all(1);
printf("全部删除成功!正在返回上一级。\n");
}
else
printf("您已取消全部删除,正在返回上一级。\n");
}break;
case '3'://数据修改
{
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆正在进行数据修改操作 *\n");
printf("\t\t\t\t* ■请输入要修改的【序号】*\n");
printf("\t\t\t\t* ▲【0】取消 *\n");
printf("\t\t\t\t******************************\n");
change();
}
case '4':
{
insert();
}break;
case '5':
{
find();
}break;
case '6':
{
sort();
}break;
case '7':
{
save();
}break;
}
}
Sleep(500);
return 0;
}
删除部分数据到回收站
int part(int t)//部分
{
int x[N],i=0,co=0;
while(1)
{
scanf("%d",&x[i]);co++;
if(x[0]==0)return 0;
if(x[i++]==0)break;
}
printf("操作的学生序号为:");
for(i=0;i
printf("%d ",x[i]);
printf("\n确认操作请按【回车键】,否则按【其他键】\n");
if(getch()==13)
{
if(t==1)flag0-=(co-1);
if(t==0)flag0+=(co-1);
FILE *fp;
fp=fopen("data.dat","wb+");
for(inti=0;i
s[x[i]-1].flag=t;//替换的值
fwrite(s,stlen,tot,fp);
fclose(fp);
}
else
return 0;
}
数据全部删除到回收站
int all(int t)//全部
{
if(getch()==13)
{
if(t==1)flag0=0;
if(t==0)flag0=tot;
FILE *fp;
fp=fopen("data.dat","wb+");
for(int j=0;j
s[j].flag=t;//替换的值
fwrite(s,stlen,tot,fp);
fclose(fp);
}
else
return 0;
}
修改某个数据
int change()
{
int no;
scanf("%d",&no);
if(no==0)return 0;
if(no>tot)
{
printf("未找到!\n");return 0;
}
if(no>0&&no<=tot)
{
inti=no-1;
printf("◆原数据为:\n");
printf("序号\t学号\t姓名\tC语言\t英语\t高数\t平均分\n");
printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",
s[i].no,s[i].num,s[i].name,s[i].cpp,s[i].eng,s[i].math,s[i].ave);
printf("◆请输入修改后的数据:\n");
printf("请输入【学号】【姓名】【C语言成绩】【英语成绩】【高数成绩】\n");
printf("(输入【0】取消并返回主菜单)\n");
scanf("%s",s[i].num);
if(strlen(s[i].num)==1&&s[i].num[0]=='0') return 0;
scanf("%s%f%f%f",&s[i].name,&s[i].cpp,&s[i].eng,&s[i].math);
s[i].ave=(s[i].cpp+s[i].eng+s[i].math)/3;
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆确定【修改数据】吗? *\n");
printf("\t\t\t\t* ◆修改后数据不可恢复 *\n");
printf("\t\t\t\t* ■【回车键】确认 *\n");
printf("\t\t\t\t* ▲【其他键】取消 *\n");
printf("\t\t\t\t******************************\n");
if(getch()==13)
{
FILE *fp;
fp=fopen("data.dat","wb+");
fwrite(s,stlen,tot,fp);
fclose(fp);
printf("修改成功!\n");
}
else
printf("您已取消修改,正在返回上一级。\n");
Sleep(500);
}
return 0;
}
从某个位置插入数据
int insert()
{
printf("请输入要插入的【序号】\n");
int no;
scanf("%d",&no);
if(no==0)return 0;
if(no>tot)
{
printf("输入有误!\n");return 0;
}
if(no>0&&no<=tot)
{
for(inti=tot+1;i>no-1;i--)
{
s[i]=s[i-1];
s[i].no++;
}
printf("请输入【学号】【姓名】【C语言成绩】【英语成绩】【高数成绩】\n");
printf("(输入【0】取消并返回主菜单)\n");
i=no-1;
scanf("%s",s[i].num);
if(strlen(s[i].num)==1&&s[i].num[0]=='0') return 0;
scanf("%s%f%f%f",&s[i].name,&s[i].cpp,&s[i].eng,&s[i].math);
s[i].ave=(s[i].cpp+s[i].eng+s[i].math)/3;
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆确定【修改数据】吗? *\n");
printf("\t\t\t\t* ◆修改后数据不可恢复 *\n");
printf("\t\t\t\t* ■【回车键】确认 *\n");
printf("\t\t\t\t* ▲【其他键】取消 *\n");
printf("\t\t\t\t******************************\n");
if(getch()==13)
{
FILE *fp;
fp=fopen("data.dat","wb+");
fwrite(s,stlen,tot+1,fp);
fclose(fp);
tot++;
flag0++;
printf("修改成功!\n");
}
else
printf("您已取消修改,正在返回上一级。\n");
}
return 0;
}
查找某个数据
int find()
{
while(1)
{
system("cls");
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆请选择查找方式 *\n");
printf("\t\t\t\t* ■1.学号 *\n");
printf("\t\t\t\t* ■2.姓名 *\n");
printf("\t\t\t\t* ▲0.返回主菜单 *\n");
printf("\t\t\t\t******************************\n\n");
switch(getch())
{
case '1':printf("请输入要查找的【学号】\n");findswitch(1);break;
case '2':printf("请输入要查找的【姓名】\n");findswitch(2);break;
case '0':return 0;break;
default :printf("输入有误!请重新输入。\n");Sleep(500);
}
}
}
按照学号查找
intfindswitch(int t)
{
inti;
charch[8];
gets(ch);
for(i=0;i
{
if(t==1&&strcmp(ch,s[i].num)==0)break;
if(t==2&&strcmp(ch,s[i].name)==0)break;
}
if(s[i].flag==0&&i
{
printf("已找到!\n");
printf("序号\t学号\t姓名\tC语言\t英语\t高数\t平均分\n");
printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",
s[i].no,s[i].num,s[i].name,s[i].cpp,s[i].eng,s[i].math,s[i].ave);
}
else
printf("未找到!\n");
system("PAUSE");
return 0;
}
按照姓名查找
对数据进行排序
int sort()//排序
{
while(1)
{
system("cls");
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆请选择排序方式(降序):*\n");
printf("\t\t\t\t* ■1.学号 *\n");
printf("\t\t\t\t* ■2.姓名(测试) *\n");
printf("\t\t\t\t* ■3.C语言成绩 *\n");
printf("\t\t\t\t* ■4.英语成绩 *\n");
printf("\t\t\t\t* ■5.高数成绩 *\n");
printf("\t\t\t\t* ■6.平均分 *\n");
printf("\t\t\t\t* ▲0.返回主菜单 *\n");
printf("\t\t\t\t******************************\n\n");
switch(getch())
{
case '1':printf("按照【学号】排序如下: \n");sortswitch(1);break;
case '2':printf("按照【姓名(测试)】排序如下:\n");sortswitch(2);break;
case '3':printf("按照【C语言成绩】排序如下: \n");sortswitch(3);break;
case '4':printf("按照【英语成绩】排序如下: \n");sortswitch(4);break;
case '5':printf("按照【高数成绩】排序如下: \n");sortswitch(5);break;
case '6':printf("按照【平均分】排序如下: \n");sortswitch(6);break;
case '0':return 0;break;
default :printf("输入有误!请重新输入。\n");Sleep(500);
}
}
}
按照学号排序
intsortswitch(int x)//子排序
{
structst t,s0[N];
inti,j,k=0;
FILE *fp;
fp=fopen("data.dat","rb");
fread(s,stlen,tot,fp);
fclose(fp);
for(i=0;i
{
if(s[i].flag==0)
s0[k++]=s[i];
}
for(i=0;i
{
k=i;
for(j=i+1;j
{
if(x==1&&strcmp(s0[k].num,s0[j].num)>0)k=j;
if(x==2&&strcmp(s0[k].name,s0[j].name)>0)k=j;
if(x==3&&s0[k].cpp
if(x==4&&s0[k].eng
if(x==5&&s0[k].math
if(x==6&&s0[k].ave
if(k!=i){t=s0[i];s0[i]=s0[k];s0[k]=t;}
}
}
printf("序号\t学号\t姓名\tC语言\t英语\t高数\t平均分\n");
for(i=0;i
printf("%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",
s0[i].no,s0[i].num,s0[i].name,s0[i].cpp,s0[i].eng,s0[i].math,s0[i].ave);
system("PAUSE");
return 0;
}
按照姓名排序
按照C语言排序
按照英语成绩排序
按照高数成绩排序
按照平均分排序
另存为文件
导出TXT文件类型
导出XLS文件类型
int save()//保存
{
system("cls");
while(1)
{
system("cls");
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆请选择导出方式: *\n");
printf("\t\t\t\t* ■1.txt文本文档 *\n");
printf("\t\t\t\t* ■2.xls表格文件 *\n");
printf("\t\t\t\t* ▲0.返回主菜单 *\n");
printf("\t\t\t\t******************************\n");
intch=getch();
if(ch=='0')return 0;
if(ch=='1'||ch=='2')
{
FILE *fp;
if(ch=='1')fp=fopen("data.txt","w");
if(ch=='2')fp=fopen("data.xls","w");
fprintf(fp,"序号\t学号\t姓名\tC语言\t英语\t高数\t平均分\n");
for(inti=0;i
if(s[i].flag==0)
fprintf(fp,"%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",
s[i].no,s[i].num,s[i].name,s[i].cpp,s[i].eng,s[i].math,s[i].ave);
fclose(fp);
printf("导出成功!\n");
}
if(!(ch=='0'||ch=='1'||ch=='2'))printf("输入有误!请重新输入。\n");
Sleep(500);
}
}
显示回收站数据,并进行操作
int recycle()//回收站
{
if(tot==flag0)
printf("无数据!\n");
else
{
display(1);
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆以上为回收站数据: *\n");
printf("\t\t\t\t* ◆请选择操作: *\n");
printf("\t\t\t\t* ■1.多项恢复 *\n");
printf("\t\t\t\t* ■2.全部恢复 *\n");
printf("\t\t\t\t* ■3.多项彻底删除 *\n");
printf("\t\t\t\t* ■4.清空回收站 *\n");
printf("\t\t\t\t* ▲【其他键】返回主菜单 *\n");
printf("\t\t\t\t******************************\n");
switch(getch())
{
case '1':
{
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆输入【序号】恢复 *\n");
printf("\t\t\t\t* ◆多项之间加【空格】 *\n");
printf("\t\t\t\t******************************\n");
part(0);
printf("数据恢复成功!正在返回上一级。\n");
}break;
case '2':
{
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆确定【全部恢复】吗? *\n");
printf("\t\t\t\t* ■【回车键】恢复 *\n");
printf("\t\t\t\t* ▲【其他键】取消恢复 *\n");
printf("\t\t\t\t******************************\n");
if(getch()==13)
{
all(0);
printf("全部恢复成功!正在返回上一级。\n");
}
else
printf("您已取消全部恢复,正在返回上一级。\n");
}break;
case '3':
{
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆输入【序号】彻底删除 *\n");
printf("\t\t\t\t* ◆多项之间加【空格】 *\n");
printf("\t\t\t\t******************************\n");
delpart();
printf("彻底删除成功!正在返回上一级。\n");
}break;
case '4':
{
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆确定【清空回收站】吗?*\n");
printf("\t\t\t\t* ■【回车键】确认 *\n");
printf("\t\t\t\t* ▲【其他键】取消 *\n");
printf("\t\t\t\t******************************\n");
if(getch()==13)
{
delall();
printf("清空回收站成功!正在返回上一级。\n");
}
else
printf("您已取消清空回收站,正在返回上一级。\n");
}break;
}
}
Sleep(500);
return 0;
}
多项恢复数据
int part(int t)//部分
{
int x[N],i=0,co=0;
while(1)
{
scanf("%d",&x[i]);co++;
if(x[0]==0)return 0;
if(x[i++]==0)break;
}
printf("操作的学生序号为:");
for(i=0;i
printf("%d ",x[i]);
printf("\n确认操作请按【回车键】,否则按【其他键】\n");
if(getch()==13)
{
if(t==1)flag0-=(co-1);
if(t==0)flag0+=(co-1);
FILE *fp;
fp=fopen("data.dat","wb+");
for(inti=0;i
s[x[i]-1].flag=t;//替换的值
fwrite(s,stlen,tot,fp);
fclose(fp);
}
else
return 0;
}
全部恢复数据
int all(int t)//全部
{
if(getch()==13)
{
if(t==1)flag0=0;
if(t==0)flag0=tot;
FILE *fp;
fp=fopen("data.dat","wb+");
for(int j=0;j
s[j].flag=t;//替换的值
fwrite(s,stlen,tot,fp);
fclose(fp);
}
else
return 0;
}
多项彻底删除数据
intdelpart()//部分
{
structst s2[N];
int x[N],i=0,j=0,co=0,k=1;;
while(1)
{
scanf("%d",&x[i]);co++;
if(x[0]==0)return 0;
if(x[i++]==0)break;
}
printf("操作的学生序号为:");
for(i=0;i
printf("%d ",x[i]);
printf("\n确认操作请按【回车键】,否则按【其他键】\n");
if(getch()==13)
{
for(i=0;i
s[x[i]-1].flag=2;//替换的值
for(i=0;i
{
if(s[i].flag!=2)
{
s2[j++]=s[i];
s2[j-1].no=k++;
}
}
tot=tot-co+1;
FILE *fp;
fp=fopen("data.dat","wb+");
fwrite(s2,stlen,tot,fp);
fclose(fp);
}
else
return 0;
}
清空回收站数据
intdelall()//全部
{
structst s2[N];
inti=0,j=0,k=1;
for(i=0;i
{
if(s[i].flag==0)
{
s2[j++]=s[i];
s2[j-1].no=k++;
}
}
tot=flag0;
FILE *fp;
fp=fopen("data.dat","wb+");
fwrite(s2,stlen,tot,fp);
fclose(fp);
return 0;
}
重置系统
int reset()//重置
{
printf("\t\t\t\t******************************\n");
printf("\t\t\t\t* ◆确定【重置系统】吗? *\n");
printf("\t\t\t\t* ◆重置后数据不可恢复 *\n");
printf("\t\t\t\t* ■【回车键】确认 *\n");
printf("\t\t\t\t* ▲【其他键】取消 *\n");
printf("\t\t\t\t******************************\n");
if(getch()==13)
{
FILE *fp;
fp=fopen("data.dat","w");
fclose(fp);
tot=0;
flag0=0;
printf("重置成功!正在返回上一级。\n");
}
else
printf("您已取消重置,正在返回上一级。\n");
Sleep(500);
return 0;
}
本学生管理系统模仿电脑操作系统设计,充分体现了此系统的人性化以及个性化。
本系统突出特点是添加了回收站功能,还增加了再次确认键,防止数据的误删。并且数据输入后立即保存到文件中去,不用再次选择保存,简化了操作。
本系统存在的缺陷是,每次输出显示时都需读取文件,延迟了显示速度,但也确保了数据的准确性。由于时间紧促,代码部分整理不够美观,但是不影响操作。未检查数据的输入是否合法,可能会出现乱码或死循环的情况。
本系统需要改进的方面是,代码可以简化一部分,并且需要加上判断,看数据输入是否合法。
课程感受是,编写此系统就花费了我接近48小时时间,中间的调试以及错误的修改浪费了大部分时间,做程序前需要把全部思路和机构图整理好在进行。否则,代码全是BUG。
链接:
http://pan.baidu.com/s/1kUPhq8v
文件:
1.杨路明 《C语言程序设计教程》(第3版)北京邮电大学出版社 2016.5
2.谭浩强 《C程序设计》(第四版)清华大学出版社 2014.4
3.谭浩强 《C程序设计题解和上机指导》(第四版) 2014.4
¥29.8
¥9.9
¥59.8