为了简化设计.docx
《为了简化设计.docx》由会员分享,可在线阅读,更多相关《为了简化设计.docx(48页珍藏版)》请在冰豆网上搜索。
为了简化设计
为了简化设计,此管理系统程序能够完成以下12种功能:
1)学生注册登记;
2)追加学生成绩;
3)删除学生资料;
4)插入学生成绩
5)查看所有在册学生的成绩
6)对全班同学按总成绩高低排序
7)求出每个学生一学期中各科的总成绩;
8)求出全班同学总成绩
9)保存学生成绩
10)从文件中读取学生成绩
11)复制文件
12)退出程序
关键词 计算机,C语言,数组,成绩管理
(二) 设计任务书
我们这次实习的课题是“学生成绩管理系统”,下面我对本次设计课题进行自己的阐述,并表达自己的理解:
1、 我们设计的思路:
程序设计一般由两部分组成:
算法和数据结构,合理地选择和实现一个数据结构与处理这些数据结构具有同样的重要性。
在编写管理系统是有的是使用静态数组保存数据,要求占用连续的存储空间。
他的缺点是需要预先估计记录大小,如果估计过大,则浪费空间,如果过小则不容易扩充。
特别是当需要动态变化时,例如插入数据和删除数据等操作时需要移动记录数据,容易出错。
而使用单链表结构管理学生成绩,不用事先估计学生人数,方便随时插入和删除学生记录,且不必移动数据,实现动态管理。
代价是牺牲一部分空间来存放表示结点关系的指针。
连表的灵活性也带来了管理的复杂性。
2、设计的结果及达到的标准:
更好的适合销费者的使用,更方便,更省时,不容易丢失数据。
能很好的实现输入、显示、删除、保存、复制、读取、排序、插入、追加、计算等功能。
3、 编程中的主要算法:
编程中主要的算法为:
单链表的运用,结构体的运用,能够灵活运用数据的输入与输出、查找和删除等。
4、设计的运行:
按照后面第五章的说明书来操作此程序软件。
简单步骤进行如下:
一、进入菜单界面
二、按照菜单说明选择你自己想要的功能
三、功能运行完后保存文件并拷贝
四、退出程序界面
5、设计的目的:
该程序是一些学校常用的功能系统软件,它可以提供给用户良好的使用环境、达到简易操作的目的。
用户可以更好地管理学生成绩及其基本信息,并对学生的相关信息进行录入、存取、读取和编辑或者按学号或学生姓名来查询学生的相关信息,还可按照总成绩算出的平均分的高低进行排序。
(三)附录
源程序
#include /*I/O函数*/
#include /*其他说明*/
#include /*字符串函数*/
#include /*动态地址分配函数*/
#defineN3 /*定义常数*/
typedefstructstudent /*定义数据结构*/
{
charno[11];
charname[15];
intscore[N];
floatsum;
floataverage;
intorder;
structstudent*next;
}STUD;
#include"file1.c"
#include"file2.c"
#include"file3.c"
#include"file4.c"
menu()
{
chars[3];
inti;
printf("\n\t\tpressanykeyentermenu........\n");
getch();
system("cls");
printf("\n\t\t\tPleaseselectfollowingfountion\n\n");
printf("\t\ta.initlianbiao\n\n");
printf("\t\tb.enterinfo\n\n");
printf("\t\tc.deletearecordbeforeyousave\n\n");
printf("\t\td.insertarecordbeforeyousave\n\n");
printf("\t\te.sortbeforeyousave\n\n");
printf("\t\tf.searchrecordonname\n\n");
printf("\t\tg.printstudentinfo\n\n");
printf("\t\th.savethefile\n\n");
printf("\t\ti.loadthefile\n\n");
printf("\t\putethescore\n\n");
printf("\t\tk.copythefiletothenewfile\n\n");
printf("\t\tl.appendrecordtofile\n\n");
printf("\t\tm.exitthefile\n\n");
do{
printf("\n\t\tEnteryourchoice(a~m):
");
scanf("%s",s);
}while(cm);
returns;
}
voidmain()
{
inti;
STUD*head; ; /*链表定义头指针
head=init(); /*初始化链表*/
system("cls"); /*清屏*/
do{
switch(menu())
{
case‘a’:
head=init(); /*执行初始化*/
break;
case‘b’:
head=create(); /*创建链表*/
break;
case‘c’:
head=delete(head); /*删除记录*/
break;
case‘d’:
head=insert(head); /*显示全部记录*/
break;
case‘e’:
head=sort(head); /*查找记录*/
break;
case‘f’:
search(head); /*保存文件*/
break;
case‘g’:
print(head); /*读文件*/
break;
case‘h’:
save(head); /*计算总分和平均分*/
break;
case‘i’:
head=load(); /*插入记录*/
break;
case‘j’:
compute(head); /*复制文件*/
break;
case‘k’:
copy(); /*排序*/
break;
case‘l’:
append(); /*追加记录*/
break;
case‘m’:
exit(0); /*如果菜单返回值为12,则程序结束*/
}
}while
(1);
}
file1文件
inputs(char*info,char*s,intcount)
{
charp[255];
do{
printf("\n\t\tenter%sofstudent:
\t",info);
scanf("%s",p);
if(strlen(p)>count) /*进行长度校验,超过count值重输入*/
printf("\t\ttoolong!
\n");
}while(strlen(p)>count);
strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}
/*初始化链表*/
STUD*init()
{
returnNULL;
}
/*创建链表*/
voidappend()
{
FILE*fp; /*定义指向文件的指针*/
STUD*info; /*新记录指针*/
ints1,i;
charinfile[10]; /*保存文件名*/
system("cls");
printf("\n\t\tpleaseinputnewrecord\n");
info=(STUD*)malloc(sizeof(STUD)); /*申请空间*/
printf("\t\tEnterinfilename,forexampleD:
\\file1\n");
scanf("%s",infile); /*输入文件名*/
if((fp=fopen(infile,"ab"))==NULL) /*向二进制文件尾增加数据方式打开文件*/
{
printf("\t\tcannotopenfile!
!
\n"); /*显示不能打开*/
exit
(1); /*退出程序*/
}
if(!
info)
{
printf("\t\t outofmemory\t"); /*没有申请到,内存溢出,本函数结束*/
return;
}
inputs("no",info->no,11); /*调用inputs输入函数*/
inputs("name",info->name,15); /*调用inputs输入姓名*/
printf("\t\tpleaseinput%dscore\n",N); /*提示输入成绩*/
s1=0;
for(i=0;i {
printf("\t\t\tscore%d:
",i+1);
scanf("%d",&info->score[i]); /*输入成绩*/
if(info->score[i]>100||info->score[i]<0) /*成绩数据验证*/
{
printf("\t\tbaddata,repeatinputscore%d\n",i+1);
i--;
continue;
}
s1=s1+info->score[i]; /*求总分*/
}
info->sum=s1; /*保存总分*/
info->average=(float)s1/N; /*求平均分*/
info->order=0; /*名次初始值为0*/
info->next=NULL; /*将新记录后继指针赋值为空*/
printf("\t\tAppendingrecord!
!
\n");
if(1!
=fwrite(info,sizeof(STUD),1,fp)) /*写文件操作*/
{
printf("\t\tfilewriteerror...\n");
return; /*返回*/
}
printf("\t\tappendsuccess!
!
\n");
fclose(fp); /*关闭文件*/
}
/*从文件读入数据*/
STUD*load()
{
STUD*p,*q,*h=NULL; /*定义记录指针变量*/
FILE*fp; /*定义指向文件的指针*/
charinfile[10]; /*保存文件名*/
system("cls"); /*清屏*/
printf("\t\tEnterinfilename,forexampleD:
\file1\n");
printf("\t\tinfilenameis:
");
scanf("%s",infile); /*输入文件名*/
if((fp=fopen(infile,"rb"))==NULL) /*打开一个二进制文件,为读方式*/
{
printf("\t\tcannotopenfile!
!
\n"); /*如果不能打开,则结束程序*/
exit
(1);
}
printf("\t\tLoadingrecord!
!
\n");
p=(STUD*)malloc(sizeof(STUD)); /*申请空间*/
if(!
p)
{
printf("\t\toutofmemory!
!
...\n"); /*如果没有申请到,则内存溢出*/
returnh; /*返回空头指针*/
}
h=p; /*申请到空间,将其作为头指针*/
while(!
feof(fp)) /*循环读数据,直到文件尾结束*/
{
if(1!
=fread(p,sizeof(STUD),1,fp))
break; /*如果没有读到数据,则跳出循环*/
p->next=(STUD*)malloc(sizeof(STUD)); /*为下一个结点申请空间*/
if(!
p->next)
{
printf("\t\toutofmemory!
!
...\n");
returnh;
}
fprintf(fp," no\t name \tsc1\tsc2\tsc3\tsum\taverage\torder\n");
printf("\n%-11s%-15s%-8d%-8d%-7d%-4.2f %-4.2f\t%-3d",p->no,p->name,p->score[0],
p->score[1],p->score[2],p->sum,p->average,p->order);
q=p; /*保存当前结点的指针,作为下一结点的前趋*/
p=p->next; /*指针后移,新读入的数据链到当前表尾*/
}
q->next=NULL; /*最后一个结点的后继指针为空*/
fclose(fp); /*关闭文件*/
printf("\t\tYouhavesuccessreaddataformfile!
!
!
\n");
returnh; /*返回头指针*/
}
fle2文件
/*创建链表*/
STUD*create()
{
inti;
ints;
STUD*h=NULL,*info; /*STUD指向结构体的指针*/
system("cls"); /*清屏*/
for(;;)
{
info=(STUD*)malloc(sizeof(STUD)); /*申请空间*/
if(!
info) /*如果指针info为空*/
{
printf("\n\t\toutofmemory...\n"); /*输出内存溢出*/
returnNULL; /*返回空指针*/
}
printf("\t\tEndentertherecordaboutstudentpleaseenter'a'\n");
/*如果学号首字符为’a’则结束输入*/
inputs("no",info->no,11); /*输入学号并校验*/
if(info->no[0]=='a')
break;
inputs("na