综合实验报告.docx
《综合实验报告.docx》由会员分享,可在线阅读,更多相关《综合实验报告.docx(31页珍藏版)》请在冰豆网上搜索。
综合实验报告
综合实验报告
(2011-2012年度第1学期)
实验名称:
C语言课程设计
题目:
学生简单成绩管理系统
院系:
控制与计算机学院
班级:
信安1101班
学号:
1111290103
姓名:
曹廷祥
指导教师:
郑玲
设计周数:
2周
成绩:
日期:
2012年1月30日
一.学生管理系统设计题目及要求
使用下面的数据,设计一个简单的学籍管理系统,实现出最基本的功能。
学生基本信息文件(A.TXT)及其内容:
A.TXT文件不需要编程录入数据,可用文本编辑工具直接生成
学号姓名性别宿舍号码电话号码
01张成成男50187732111
02李成华女10187723112
03王成凤女10187723112
04张明明男50287734333
05陈东男50187732111
06李果男50287734333
07张园园女10287756122
………………
学生成绩基本信息文件(B.TXT)及其内容:
学号课程编号课程名称学分平时成绩实验成绩卷面成绩综合成绩实得学分
01A01大学物理3667882
02B03高等数学478-190
01B03高等数学445-188
02C01VF3657666
…………………………
设计功能:
(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%。
(3)查询功能:
分为学生基本情况查询和成绩查询两种
A:
学生基本情况查询:
A1----输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。
A2---输入一个宿舍号码,可查询出本室所有的学生的基本信息并显示输出。
B:
成绩查询:
B1:
输入一个学号时,查询出此生的所有课程情况,格式如下:
学号:
xx姓名:
xxxxx
课程编号:
xxx课程名称:
xxxxx综合成绩:
xxxx实得学分:
xx
课程编号:
xxx课程名称:
xxxxx综合成绩:
xxxx实得学分:
xx
课程编号:
xxx课程名称:
xxxxx综合成绩:
xxxx实得学分:
xx
………………………
共修:
xx科,实得总学分为:
xxx
(4)删除功能:
当在A.TXT中删除一个学生时,自动地在B.TXT中删除此人所有信息。
(5)排序功能:
能实现选择按综合成绩或实得学分升序或降序排序并显示数据。
二.程序代码如下:
//密码123
#include"stdio.h"/*标准输入输出函数库*/
#include"stdlib.h"/*标准函数库*/
#include"string.h"/*字符串函数库*/
#include"conio.h"/*屏幕操作函数库*/
#defineHEADER1"---------------------------------学生成绩----------------------------------\n"
#defineHEADER2"|学号|姓名|C语言|数学|英语|总分|平均分|名次|\n"
#defineHEADER3"|---------------|---------------|-----|----|-----|--------|--------|-----|"
#defineFORMAT"|%-10s|%-15s|%4d|%4d|%4d|%4d|%.2f|%4d|\n"
#defineDATAp->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave,p->data.mingci
#defineEND"---------------------------------------------------------------------\n"
intsaveflag=0;/*是否需要存盘的标志变量*/
/*定义与学生有关的数据结构*/
typedefstructstudent/*标记为student*/
{
charnum[10];/*学号*/
charname[15];/*姓名*/
intcgrade;/*C语言成绩*/
intmgrade;/*数学成绩*/
integrade;/*英语成绩*/
inttotal;/*总分*/
floatave;/*平均分*/
intmingci;/*名次*/
};
/*定义每条记录或结点的数据结构,标记为:
node*/
typedefstructnode
{
structstudentdata;/*数据域*/
structnode*next;/*指针域*/
}Node,*Link;/*Node为node类型的结构变量,*Link为node类型的指针变量*/
voidmenu()/*主菜单*/
{
system("cls");/*调用DOS命令,清屏.与clrscr()功能相同*/
cprintf("学生成绩管理系统\n");
cprintf("#***************************菜单**************************#\n");
cprintf("*1输入成绩*2删除成绩*\n");
cprintf("*3查询成绩*4修改成绩*\n");
cprintf("*5插入成绩*6统计成绩*\n");
cprintf("*7成绩排序*8保存成绩*\n");
cprintf("*9显示成绩*0退出系统*\n");
cprintf("#*********************************************************#\n");
/*cprintf()送格式化输出至文本窗口屏幕中*/
}
voidprintheader()/*格式化输出表头*/
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
voidprintdata(Node*pp)/*格式化输出表中数据*/
{
Node*p;
p=pp;
printf(FORMAT,DATA);
}
voidWrong()/*输出按键错误信息*/
{
printf("\n\n\n\n\n***********输入有错!
按任意键继续!
**********\n");
getchar();
}
voidNofind()/*输出未查找此学生的信息*/
{
printf("\n=====>没有找到这名学生!
\n");
}
voidDisp(Linkl)/*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/
{
Node*p;
p=l->next;/*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/
if(!
p)/*p==NULL,NUll在stdlib中定义为0*/
{
printf("\n=====>没有学生记录!
\n");
getchar();
return;
}
printf("\n\n");
printheader();/*输出表格头部*/
while(p)/*逐条输出链表中存储的学生信息*/
{
printdata(p);
p=p->next;/*移动直下一个结点*/
printf(HEADER3);
}
getchar();
}
/*************************************************************
作用:
用于定位链表中符合要求的节点,并返回指向该节点的指针
参数:
findmess[]保存要查找的具体内容;nameornum[]保存按什么查找;
在单链表l中查找;
**************************************************************/
Node*Locate(Linkl,charfindmess[],charnameornum[])
{
Node*r;
if(strcmp(nameornum,"num")==0)/*按学号查询*/
{
r=l->next;
while(r)
{
if(strcmp(r->data.num,findmess)==0)/*若找到findmess值的学号*/
returnr;
r=r->next;
}
}
elseif(strcmp(nameornum,"name")==0)/*按姓名查询*/
{
r=l->next;
while(r)
{
if(strcmp(r->data.name,findmess)==0)/*若找到findmess值的学生姓名*/
returnr;
r=r->next;
}
}
return0;/*若未找到,返回一个空指针*/
}
/*输入字符串,并进行长度验证(长度voidstringinput(char*t,intlens,char*notice)
{
charn[255];
do{
printf(notice);/*显示提示信息*/
scanf("%s",n);/*输入字符串*/
if(strlen(n)>lens)printf("\n超过所需长度!
\n");/*进行长度校验,超过lens值重新输入*/
}while(strlen(n)>lens);
strcpy(t,n);/*将输入的字符串拷贝到字符串t中*/
}
/*输入分数,0<=分数<=100)*/
intnumberinput(char*notice)
{
intt=0;
do{
printf(notice);/*显示提示信息*/
scanf("%d",&t);/*输入分数*/
if(t>100||t<0)printf("\n评分必须在[0100]!
\n");/*进行分数校验*/
}while(t>100||t<0);
returnt;
}
/*增加学生记录*/
voidAdd(Linkl)
{
Node*p,*r,*s;/*实现添加操作的临时的结构体指针变量*/
charch,flag=0,num[10];
r=l;
s=l->next;
system("cls");
Disp(l);/*先打印出已有的学生信息*/
while(r->next!
=NULL)
r=r->next;/*将指针移至于链表最末尾,准备添加记录*/
while
(1)/*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/
{
while
(1)/*输入学号,保证该学号没有被使用,若输入学号为0,则退出添加记录操作*/
{
stringinput(num,10,"输入号码(按'0'返回菜单):
");/*格式化输入学号并检验*/
flag=0;
if(strcmp(num,"0")==0)/*输入为0,则退出添加操作,返回主界面*/
{return;}
s=l->next;
while(s)/*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/
{
if(strcmp(s->data.num,num)==0)
{
flag=1;
break;
}
s=s->next;
}
if(flag==1)/*提示用户是否重新输入*/
{getchar();
printf("=====>人数%s是不存在的,再试一次?
(y/n):
",num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
continue;
else
return;
}
else
{break;}
}
p=(Node*)malloc(sizeof(Node));/*申请内存空间*/
if(!
p)
{
printf("\n内存分配失败");/*如没有申请到,打印提示信息*/
return;/*返回主界面*/
}
strcpy(p->data.num,num);/*将字符串num拷贝到p->data.num中*/
stringinput(p->data.name,15,"Name:
");
p->data.cgrade=numberinput("C语言[0-100]:
");/*输入并检验分数,分数必须在0-100之间*/
p->data.mgrade=numberinput("数学Score[0-100]:
");/*输入并检验分数,分数必须在0-100之间*/
p->data.egrade=numberinput("英语Score[0-100]:
");/*输入并检验分数,分数必须在0-100之间*/
p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;/*计算总分*/
p->data.ave=(float)(p->data.total/3);/*计算平均分*/
p->data.mingci=0;
p->next=NULL;/*表明这是链表的尾部结点*/
r->next=p;/*将新建的结点加入链表尾部中*/
r=p;
saveflag=1;
}
return;
}
voidQur(Linkl)/*按学号或姓名,查询学生记录*/
{
intselect;/*1:
按学号查,2:
按姓名查,其他:
返回主界面(菜单)*/
charsearchinput[20];/*保存用户输入的查询内容*/
Node*p;
if(!
l->next)/*若链表为空*/
{
system("cls");
printf("\n=====>没有学生记录!
\n");
getchar();
return;
}
system("cls");
printf("\n=====>1按学号搜寻=====>2按名称搜索\n");
printf("pleasechoice[1,2]:
");
scanf("%d",&select);
if(select==1)/*按学号查询*/
{
stringinput(searchinput,10,"输入现有的学生学号:
");
p=Locate(l,searchinput,"num");/*在l中查找学号为searchinput值的节点,并返回节点的指针*/
if(p)/*若p!
=NULL*/
{
printheader();
printdata(p);
printf(END);
printf("按任意键返回");
getchar();
}
else
Nofind();
getchar();
}
elseif(select==2)/*按姓名查询*/
{
stringinput(searchinput,15,"输入现有的学生姓名:
");
p=Locate(l,searchinput,"name");
if(p)
{
printheader();
printdata(p);
printf(END);
printf("按任意键返回");
getchar();
}
else
Nofind();
getchar();
}
else
Wrong();
getchar();
}
/*删除学生记录:
先找到保存该学生记录的节点,然后删除该节点*/
voidDel(Linkl)
{
intsel;
Node*p,*r;
charfindmess[20];
if(!
l->next)
{system("cls");
printf("\n=====>没有该学生的记录\n");
getchar();
return;
}
system("cls");
Disp(l);
printf("\n=====>1按学号删除=====>2按姓名删除\n");
printf("请选择[1,2]:
");
scanf("%d",&sel);
if(sel==1)
{
stringinput(findmess,10,"输入现有的学生学号:
");
p=Locate(l,findmess,"num");
if(p)/*p!
=NULL*/
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;/*将p所指节点从链表中去除*/
free(p);/*释放内存空间*/
printf("\n=====>删除成功!
\n");
getchar();
saveflag=1;
}
else
Nofind();
getchar();
}
elseif(sel==2)/*先按姓名查询到该记录所在的节点*/
{
stringinput(findmess,15,"输入现有的学生姓名:
");
p=Locate(l,findmess,"name");
if(p)
{
r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>删除成功!
\n");
getchar();
saveflag=1;
}
else
Nofind();
getchar();
}
else
Wrong();
getchar();
}
/*修改学生记录。
先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改*/
voidModify(Linkl)
{
Node*p;
charfindmess[20];
if(!
l->next)
{system("cls");
printf("\n=====>没有该学生记录!
\n");
getchar();
return;
}
system("cls");
printf("修改学生记录");
Disp(l);
stringinput(findmess,10,"inputtheexistingstudentnumber:
");/*输入并检验该学号*/
p=Locate(l,findmess,"num");/*查询到该节点*/
if(p)/*若p!
=NULL,表明已经找到该节点*/
{
printf("Number:
%s,\n",p->data.num);
printf("Name:
%s,",p->data.name);
stringinput(p->data.name,15,"输入新姓名:
");
printf("C语言分数:
%d,",p->data.cgrade);
p->data.cgrade=numberinput("C语言分数[0-100]:
");
printf("数学分数:
%d,",p->data.mgrade);
p->data.mgrade=numberinput("数学分数[0-100]:
");
printf("英语分数:
%d,",p->data.egrade);
p->data.egrade=numberinput("英语分数[0-100]:
");
p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=(float)(p->data.total/3);
p->data.mingci=0;
printf("\n=====>修改成功!
\n");
Disp(l);
saveflag=1;
}
else
Nofind();
getchar();
}
/*插入记录:
按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。
*/
voidInsert(Linkl)
{
Linkp,v,newinfo;/*p指向插入位置,newinfo指新插入记录*/
charch,num[10],s[10];/*s[]保存插入点位置之前的学号,num[]保存输入的新记录的学号*/
intflag=0;
v=l->next;
system("cls");
Disp(l);
while
(1)
{stringinput(s,10,"请输入要输入号码插入的位置:
");
flag=0;v=l->next;
while(v)/*查询该学号是否存在,flag=1表示该学号存在*/
{
if(strcmp(v->data.num,s)==0){flag=1;break;}
v=v->next;
}
if(flag==1)
break;/*若学号存在,则进行插入之前的新记录的输入操作*/
else
{getchar();
printf("\n=====>学号%s是不存在的,再试一次吗?
(y/n):
",s);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{continue;}
else
{return;}
}
}
/*以下新记录的输入操作与Add()相同*/
stringinput(num,10,"输入新学号:
");
v=l->next;
while(v)
{
if(strcmp(v->data.num,num)==0)
{
printf("=====>对不起,新的学号%s已存在!
\n",num);
printheader();
printdata(v);
printf("\n");
getchar();
return;
}
v=v->next;
}
newinfo=(Node*)malloc(sizeof(Node));