资源描述
学生学籍信息管理系统
目录
1.设计目的与要求
2.总体设计
3.详细设计
4.调试分析
5.总结
6.答辩记录
7.教师意见
8.附录主程序
33
1.设计目的与要求:
1.1 【要求】:
使用下面的数据,设计一个简单的学籍信息管理系统。学生基本信息文件(A.TXT)及其内容:A.TXT文件不需要编程录入数据,可用文本编辑工具直接生成
学号 姓名 性别 宿舍号码 电话号码
01 张成成 男 501 87732111
02 李成华 女 101 87723112
03 王成凤 女 101 87723112
04 张明明 男 502 87734333
05 陈东 男 501 87732111
06 李果 男 502 87734333
07 张园园 女 102 87756122
学生成绩基本信息文件(B.TXT)及其内容
学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 学分
01 A01 大学物理 3 66 78 82
02 B03 高等数学 4 78 -1 90
01 B03 高等数学 4 45 -1 88
02 C01 VF 3 65 76 66
功能要求及说明:
(1) 数据录入功能: 对B.TXT进行数据录入,只录入每个学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共7个数据. 综合成绩、学分由程序根据条件自动运算。
(2) 综合成绩的计算: 如果本课程的实验成绩为-1,则表示无实验,综合成绩=平时成绩*30%+卷面成绩*70%; 如果实验成绩不为-1,表示本课程有实验,综合成绩=平时成绩*15%+实验成绩*.15%+卷面成绩*70%。
实综合成绩在90-100之间 ,应得学分=学分*100%得学分的计算: 采用等级学分制.
综合成绩在80-90之间 ,应得学分=学分*80%
综合成绩在70-80之间 ,应得学分=学分*75%
综合成绩在60-70之间 ,应得学分=学分*60%
综合成绩在60以下 ,应得学分=学分*0%
(2)查询功能:分为学生基本情况查询和成绩查询两种
A:学生基本情况查询:
A1----输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。
A2---输入一个宿舍号码,可查询出本室所有的学生的基本信息并显示输出。
B:成绩查询:
B1:输入一个学号时,查询出此生的所有课程情况,格式如下:
学 号:xx 姓 名:xxxxx
课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx
课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx
课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx
共修:xx科,实得总学分为: xxx
(3)删除功能:当在A.TXT中删除一个学生时,自动地在B.TXT中删除此人所有信息。
(4)排序功能:能实现选择按综合成绩或实得学分升序或降序排序并显示数据
1.2 【目的】:实现对于学生学籍信息的查询以及管理。自动录入,方便快捷。数据录入功能,综合成绩的计算,查询功能(学生基本情况查询,成绩查询),删除功能,排序功能等为一体。使学生学籍和成绩等信息实现信息化快捷管理。
2.总体设计:
经过分析整个系统,可以将系统分为五大模块:信息输入模块,信息修改模块,信息排序模块,设备查找模块和退出模块。其中主要是前五大个模块。
所 用 到 的 各 个 子 函 数
读取数据、计算
菜 单 显 示
数 据 录 入
排 序
查 询
按 实 际 学 分
按 综 合 成 绩
查 询 成 绩
查询 学生 信息
3.详细设计:
3.1主函数:
//******主函数******
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <malloc.h>
void menu()
{
int c,w1;
do
{
puts("\t\t*********************MENU*********************\n\n");
puts("\t\t\t\t 1.Input data"); /*输入模块*/
puts("\t\t\t\t 2.Search data"); /*查找模块*/
puts("\t\t\t\t 3.Delete data"); /*删除模块*/
puts("\t\t\t\t 4.Sort data"); /*排序模块*/
puts("\t\t\t\t 5.Exit"); /*退出*/
puts("\n\n\t\t**********************************************\n");
printf("Choice number(1-5):[ ]\b\b");
scanf("%d",&c);
if(c<1||c>6)
{
w1=1;
getchar();
}
else w1=0;
}
while(w1==1);
switch(c)
{
case 1:enter();break;
case 2:search();break;
case 3:del();break;
case 4:sort();break;
case 5:exit(0);break;
}
}
void main()
{
menu();
}
3.2 公共函数:
所用到的六个公共函数
一个函数结束时的选择浏览还是返回的函数
显示数据结构项目的函数
保存文件B函数
加载文件B函数
保存文件A函数
加载文件A函数
int load_info() /*A文件加载函数*/
{
int i;
FILE *fp;
if((fp=fopen("A.txt","r"))==NULL)
{
printf("\nCannot open file\n");
return 0;
}
for(i=0;!feof(fp);i++)
fscanf(fp,"%s%s%s%s%s",stu[i].num,stu[i].name,stu[i].sex,stu[i].room,stu[i].tel);
fclose(fp);
return(i);
}
int save_info(int n) /*A文件保存函数*/
{
int i;
FILE *fp;
if((fp=fopen("A.txt","w"))==NULL)
{
printf("\nCannot open file\n");
return 0;
}
for(i=0;i<n;i++)
if(strcmp(stu[i].num,"-1")!=0)
fprintf(fp,"%s %s %s %s %s\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].room,stu[i].tel);
fclose(fp);
}
int load_score() /*B文件加载函数*/
{
float ca_mark(int i);void ca_score(int i);
int i,j;
FILE *fp;
if((fp=fopen("B.txt","r"))==NULL)
{
printf("\nCannot open file\n");
return 0;
}
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%s%s%s%d",scr[i].num,scr[i].subnum,scr[i].subject,&scr[i].oscore);
for(j=0;j<3;j++)
fscanf(fp,"%d",&scr[i].mark[j]);
ca_mark(i);
ca_score(i);
}
fclose(fp);
return(i);
}
int save_score(int m) /*B文件保存函数*/
{
int i,j;
FILE *fp;
if((fp=fopen("B.txt","w"))==NULL)
{
printf("\nCannot open file\n");
return 0;
}
for(i=0;i<m;i++)
{
if(strcmp(scr[i].num,"-1")!=0)
{
fprintf(fp,"%s %s %s %d %d %d %d %d %d\n",scr[i].num,scr[i].subnum,scr[i].subject,scr[i].oscore,scr[i].mark[0],scr[i].mark[1],scr[i].mark[2],(int)scr[i].totalmark,(int)scr[i].gscore);
}
}
fclose(fp);
}
void printone(int i) /*显示数据结构项目的函数(公共函数)*/
{ printf("\n\t%-4s\t%-6s\t%-4s\t%-8s\t%-8s",stu[i].num,stu[i].name,stu[i].sex,stu[i].room,stu[i].tel);
}
void printface() /*公共函数,一个函数结束时的选择浏览还是返回的函数*/
{
printf("\n\t学号\t姓名 \t性别\t宿舍号码\t电话号码\n");
}
3.3 功能模块的设计:
/////******* 信 息 删 除 模 块********
开始
数据删除
结束
输入学号
void del() //删除模块
{
void menu();
int i,j,c,flag=0;char s[6];
printface();
for(i=0;i<n;i++)
printone(i);
puts("\n\n");
printf("\nInput the delete number: ");
scanf("%s",s);
printf("\n\nSure?\t1).Sure\t2).No\t3).Back\t[ ]\b\b");
scanf("%d",&c);
if(c==1)
for(i=0;i<n;i++)
if(judge(s,stu[i].num))
{
flag=1;
strcpy(stu[i].num,"-1");
for(j=0;j<m;j++)
if(judge(s,scr[i].num)) strcpy(scr[i].num,"-1");
break;
}
if(flag==0) {puts("\n\tNot exist!\n");choice_menu(5);}
if(c==2) {puts("\n\n");del();}
if(c==3) {puts("\n\n");menu();}
save_info(n);
save_score(m);
load_info();
load_score();
puts("\n\n\tSuccessfully!.^_^.\n");
choice_menu(5);
}
/////******* 开始
数据排序
X=1?
实际学分排序
综合成绩排序
结束
Y
N
信 息 排 序 模 块********
void sort() //排序模块
{
void menu();
int c,k,v;
printf("\n\nChoice number: 1).综合成绩\t2).实得学分\t[ ]\b\b");
scanf("%d",&c);
list_subject();
scanf("%d",&k);
printf("\n\nChoice: 1).从高到低\t2).从低到高\t[ ]\b\b");
scanf("%d",&v);
sortmark(c,k,v);
}
void sortmark(int c,int k,int v)
{
char *num_name(char s[]);
int judge(char a[],char b[]);char s[4];
int i,j=0,i1,j1,k1;struct score *p[100],*t;
switch(k)
{
case 1:strcpy(s,"A01");break;
case 2:strcpy(s,"B03");break;
case 3:strcpy(s,"C01");break;
case 4:strcpy(s,"D02");break;
}
for(i=0;i<m;i++) p[i]=NULL;
for(i=0;i<m;i++)
if(judge(s,scr[i].subnum)) {p[j]=&scr[i];j++;}
for(i1=0;i1<j-1;i1++)
{
k1=i1;
if(c==1)
for(j1=i1+1;j1<j;j1++) if(p[k1]->totalmark<p[j1]->totalmark) k1=j1;
if(c==2)
for(j1=i1+1;j1<j;j1++) if(p[k1]->gscore<p[j1]->gscore) k1=j1;
if(i1!=k1){t=p[i1];p[i1]=p[k1];p[k1]=t;}
}
puts("\n名次 姓名\t平时成绩 实验成绩 卷面成绩 综合成绩 实得学分");
if(v==1)
for(i=0;i<j;i++)
printf("%-4d %-8s &%-8d %-8d %-8d %-8.2f %-4.2f",i+1,num_name(p[i]->num),p[i]->mark[0],p[i]->mark[1],p[i]->mark[2],p[i]->totalmark,p[i]->gscore);
if(v==2)
for(i=j-1;i>=0;i++)
printf("%-4d %-8s &%-8d %-8d %-8d %-8.2f %-4.2f",i+1,num_name(p[i]->num),p[i]->mark[0],p[i]->mark[1],p[i]->mark[2],p[i]->totalmark,p[i]->gscore);
}
4. 调试分析
4.1主函数:
4.2排序模块
4.3删除模块
4.4退出
5.总结
先就在本程序的编写过程中出现的问题进行说明:
首先,对于数据的删除存在一定的问题,这个问题是在老师的指导下又经过同学们的帮助才解决的,其间,我明白了结构体数组中数据删除的基本原理和删除的方法;
其次,在程序编写过程中,我忽视了几个需要注意的基本语法,比如,有的变量忘记了定义和标识符的使用等问题,这个是在同学的帮助下才检查出来改正的。这属于C语言运用的基础问题,也是因为平时的上机编程实习太少所致,以后还有待于改进;
第三,对于数组中数据的存储原理存在一定的疑问,这个是请同学讲解后才加深的理解;
第四,就是在程序开始编写时,整体思路框架的构思感觉无从下手,这是一个长期的问题,需要多多接触程序,理解更多的程序编写思路才能做到在白那些之前胸有成竹。这次是请教同学帮忙才得以解决的。
这是我第一次相对比较独立的编程,从中感受到了小小的进步所带来的喜悦,更重要的是,通过这次C语言课程设计我意识到了自己在学习上的许多不足,许多感觉会的知识在应用时还是有许多不确定,学习C语言,动手能力是很重要的,只要通过实践才能真正发现自己的不足,使自己的能力真正有所提高。俗话说:“万事开头难。”现在既然开头已经过去了,也大致了解了C语言的学习规律,课本虽然学完了,但自己需要加强与完善的还有很多。
首先,从这个程序说起。这个程序的编写过程中没有用到很特殊的算法,基本都是老师上课强调的一些基本算法,让人做起来感觉还是挺简单易懂的,这里也体会到了C语言的灵活性。
其次,我认为我这个程序的亮点在于它的整体结构清晰明朗,首先是两个结构体,然后就是声明函数,再往下是主函数选择执行命令,最后是几个用到的被调用函数。
再次,我体会到了计算机语言的严谨性,C语言课本上的许多微小知识看似微乎其微,实则作用巨大,在程序设计过程中,一处小小的知识死角就可能会使整个程序无法运行,所以计算机语言的学习容不得半点儿马虎,留不得半处死角,不能忽视任何一处知识。
此次课程设计,我在编写程序,修改程序进一步完成作业的同时,也深深感受到了计算机高级语言的清晰的层次性和运用的技巧性,我想这一点无论对于我们这些初涉计算机语言的学生而言,还是对于已在计算机专业任教多年的资深教师来说,都是必须认识到的。认识到这一点,计算机初学者可以在巩固基础的同时培养探索更加简洁的思路的意识,资深教师则可以在计算机语言教授过程中起到提纲挈领,诱思探究新的教学方法,使学生在学习计算机语言的时候抓住重点,理解难点,掌握要点。
姓名:黄樊
学号:05111127
2012-9-6
答辩记录
教师意见
附录一:
源程序代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <malloc.h>
int n,m;
struct student
{char num[6];
char name[20];
char sex[3];
char room[5];
char tel[10];
}stu[10];
struct score
{
char num[6];
char subnum[4];
char subject[10];
int oscore;
int mark[3];
float totalmark;
float gscore;
}scr[60];
float ca_mark(int i)
{
if(scr[i].mark[1]==-1)
scr[i].totalmark=0.3*scr[i].mark[0]+0.7*scr[i].mark[2];
else
scr[i].totalmark=0.15*(scr[i].mark[0]+scr[i].mark[1])+0.7*scr[i].mark[2];
return (scr[i].totalmark);
}
void ca_score(int i)
{
int c;
c=(int)ca_mark(i)/10;
if(c<6) c=5;
switch(c)
{
case 10:
case 9:scr[i].gscore=scr[i].oscore;break;
case 8:scr[i].gscore=0.8*scr[i].oscore;break;
case 7:scr[i].gscore=0.75*scr[i].oscore;break;
case 6:scr[i].gscore=0.6*scr[i].oscore;break;
case 5:scr[i].gscore=0;break;
}
}
int load_info() //加载函数
{
int i;
FILE *fp;
if((fp=fopen("A.txt","r"))==NULL)
{
printf("\nCannot open file\n");
return 0;
}
for(i=0;!feof(fp);i++)
fscanf(fp,"%s%s%s%s%s",stu[i].num,stu[i].name,stu[i].sex,stu[i].room,stu[i].tel);
fclose(fp);
return(i);
}
int save_info(int n) //保存函数
{
int i;
FILE *fp;
if((fp=fopen("A.txt","w"))==NULL)
{
printf("\nCannot open file\n");
return 0;
}
for(i=0;i<n;i++)
if(strcmp(stu[i].num,"-1")!=0)
fprintf(fp,"%s %s %s %s %s\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].room,stu[i].tel);
fclose(fp);
}
int load_score() //加载函数
{
float ca_mark(int i);void ca_score(int i);
int i,j;
FILE *fp;
if((fp=fopen("B.txt","r"))==NULL)
{
printf("\nCannot open file\n");
return 0;
}
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%s%s%s%d",scr[i].num,scr[i].subnum,scr[i].subject,&scr[i].oscore);
for(j=0;j<3;j++)
fscanf(fp,"%d",&scr[i].mark[j]);
ca_mark(i);
ca_score(i);
}
fclose(fp);
return(i);
}
int save_score(int m) //保存函数
{
int i,j;
FILE *fp;
if((fp=fopen("B.txt","w"))==NULL)
{
printf("\nCannot open file\n");
return 0;
}
for(i=0;i<m;i++)
{
if(strcmp(scr[i].num,"-1")!=0)
{
fprintf(fp,"%s %s %s %d %d %d %d %d %d\n",scr[i].num,scr[i].subnum,scr[i].subject,scr[i].oscore,scr[i].mark[0],scr[i].mark[1],scr[i].mark[2],(int)scr[i].totalmark,(int)scr[i].gscore);
}
}
fclose(fp);
}
void printone(int i)
{
printf("\n\t%-4s\t%-6s\t%-4s\t%-8s\t%-8s",stu[i].num,stu[i].name,stu[i].sex,stu[i].room,stu[i].tel);
}
void printface()
{
printf("\n\t学号\t姓名 \t性别\t宿舍号码\t电话号码\n");
}
void list_subject()
{
puts("\n\nChoice subject:\n");
printf("\t1).大学物理\t2).高等数学\t3).VF\t4).大学英语\n");
printf("\nChoice number(1-4): [ ]\b\b");
}
void sortmark(int c,int k,int v)
{
char *num_name(char s[]);
int judge(char a[],char b[]);char s[4];
int i,j=0,i1,j1,k1;struct score *p[100],*t;
switch(k)
{
case 1:strcpy(s,"A01");break;
case 2:strcpy(s,"B03");break;
case 3:strcpy(s,"C01");break;
case 4:strcpy(s,"D02");break;
}
for(i=0;i<m;i++) p[i]=NULL;
for(i=0;i<m;i++)
if(judge(s,scr[i].subnum)) {p[i]=&scr[i];j++;}
for(i1=0;i1<j-1;i1++)
{
k1=i1;
if(c==1)
for(j1=i1+1;j1<j;j1++) if(p[k1]->totalmark<p[j1]->totalmark) k1=j1;
if(c==2)
for(j1=i1+1;j1<j;j1++) if(p[k1]->gscore<p[j1]->gscore) k1=j1;
if(i1!=k1){t=p[i1];p[i1]=p[k1];p[k1]=t;}
}
puts("\n名次 姓名\t平时成绩 实验成绩 卷面成绩 综合成绩 实得学分");
if(v==1)
for(i=0;i<j;i++)
printf("%-4d %-8s &%-8d %-8d %-8d %-8.2f %-4.2f",i+1,num_name(p[i]->num),p[i]->mark[0],p[i]->mark[1],p[i]->mark[2],p[i]->totalmark,p[i]->gscore);
if(v==2)
for(i=j-1;i>=0;i++)
printf("%-4d %-8s &%-8d %-8d %-8d %-8.2f %-4.2f",i+1,num_name(p[i]->num),p[i]->mark[0],p[i]->mark[1],p[i]->mark[2],p[i]->totalmark,p[i]->gscore);
}
int judge(char a[],char b[])
{
if(strcmp(a,b)==0) return 1;
else return 0;
}
char *num_name(char s[])
{
char *p;
int i;
for(i=0;i<n;i++)
if(judge(s,stu[i].num))
{
p=stu[i].num+6;
return(p);
break;
}
}
void searchone(int k)
{
void choice_menu(int k);
char s[20];int i,flag=0;
if(k==1) {printf("\nInput the number: ");}
if(k==2) {printf("\nInput the name: ");}
scanf("%s",s);
for(i=0;i<n;i++)
{
if(k==1)
if(judge(s,stu[i].num))
{
printface();
printone(i);
flag=1;
puts("\n\n\tSuccessfully!\n");
choice_menu(k);
}
if(k==2)
if(judge(s,stu[i].name))
{
printface();
printone(i);
flag=1;
puts("\n\n\tSuccessfully!\n");
choice_menu(k);
}
}
if(flag==0&&k==1) puts("\n\n\tNot exist!\n");
if(flag==0&&k==2) puts("\n\n\tNot exist!\n");
choice_menu(k);
}
void searchroom() //按寝室查询
{
void choice_menu(int k);
int i,flag=0;
char s[3];
printf("\nInput the room number: ");
scanf("%s",s);
printface();
for(i=0;i<n;i++)
if(judge(s,stu[i].room)) {printone(i);flag=1;}
puts("\n");
if(flag==0)
puts("\n\n\tNot exist!\n");
choice_menu(3);
}
void search_onescore() //成绩查询
{
void choice_menu(int k);
int i,j=0,flag=0;
char s[6];float sum;
printf("\nInput the number: ");
scanf("%s",s);
for(i=0,sum=0;i<m;i++)
{
if(judge(s,scr[i].num))
{
if(j==0)
printf("\n\n学号:%-6s\t姓名:%s",s,num_name(s));
printf("\n课程编号:%-6s\t课程名称:%-10s\t综合成绩:%-6.2f\t实得学分:%-4.2f",scr[i].subnum,scr[i].subject,scr[i].totalmark,scr[i].gscore);
sum+=scr[i].gscore;flag=1;j++;
展开阅读全文