C语言程序管理系统课程设计报告Word文件下载.docx
《C语言程序管理系统课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《C语言程序管理系统课程设计报告Word文件下载.docx(31页珍藏版)》请在冰豆网上搜索。
intselect;
/*保存选择结果变量*/
charch;
/*保存(y,Y,n,N)*/
intcount=0;
/*保存文件中的记录条数(或结点个数)*/
Node*p,*r;
/*定义记录指针变量*/
l=(Node*)malloc(sizeof(Node));
if(!
l)
{
printf(”\n内存分配失败”);
/*如没有申请到,打印提示信息*/
return;
/*返回主界面*/
}
l—〉next=NULL;
r=l;
fp=fopen(”C:
\\student”,"
ab+"
);
/*以追加方式打开一个二进制文件,可读可写,若此文件不存在,会创建此文件*/
if(fp==NULL)
printf(”\n=====〉无法打开文件!
\n"
exit(0);
}
while(!
feof(fp))
{
p=(Node*)malloc(sizeof(Node));
p)
printf(”memorymallocfailure!
\n”);
/*没有申请成功*/
/*退出*/
if(fread(p,sizeof(Node),1,fp)==1)/*一次从文件中读取一条学生成绩记录*/
p—>
next=NULL;
r—>
next=p;
r=p;
/*r指针向后移一个位置*/
count++;
}
fclose(fp);
/*关闭文件*/
printf("
\n=====〉打开文件成功,共记录的数目:
%d。
\n”,count);
menu();
while
(1)
system("
cls”);
menu();
p=r;
printf(”\n请输入您的选择(0~9):
”);
/*显示提示信息*/
scanf(”%d”,&select);
if(select==0)
if(saveflag==1)/*若对链表的数据有修改且未进行存盘操作,则此标志为1*/
{getchar();
printf(”\n=====〉是否保存修改记录文件?
(y/n):
scanf(”%c”,&ch);
if(ch=='
y'
||ch=='
Y’)
Save(l);
printf(”=====〉谢谢使用!
"
getchar();
break;
switch(select)
case1:
Add(l);
break;
/*增加学生记录*/
case2:
Del(l);
/*删除学生记录*/
case3:
Qur(l);
break;
/*查询学生记录*/
case4:
Modify(l);
/*修改学生记录*/
case5:
Insert(l);
/*插入学生记录*/
case6:
Tongji(l);
/*统计学生记录*/
case7:
Sort(l);
/*排序学生记录*/
case8:
Save(l);
/*保存学生记录*/
case9:
{system(”cls”);
Disp(l);
printf(”按任何键返回”);
chara;
scanf(”%d”,&a);
}/*显示学生记录*/
default:
Wrong();
getchar();
/*按键有误,必须为数值0—9*/
}程序中建立了多个函数分别来完成每个所要求的功能:
读文件和写文件函数,建链表函数,插入、修改和删除函数,排序、统计和输出
函数。
程序利用各个函数来完成前面要求所需要的功能。
二:
程序调用图:
三:
功能菜单
#***************************菜单**************************;
*1输入成绩*2删除成绩
*3查询成绩*4修改成绩
*5插入成绩*6统计成绩
”*7成绩排序*8保存成绩
*9显示成绩*0退出系统
#*********************************************************
四.实验结果;
(见程序运行)
五:
体会:
做完这个c语言程序设计的作业,我学会了很多新知识,对c语言有了更进一步的了解。
开始时,我想用结构数组来做这个程序,但后来我发现用做它,修改数据和读取数据都显得很方便.于是,相比较之下,我便选择了链表。
编程时会遇到一些困难,最令人头疼的莫过于程序运行时出错了.有时哪怕是一些很小的错误经常能导致难以预料到的后果,因此,编程时我尽量做到一丝不苟,不敢有丝毫疏忽。
通过这次c语言编程的练习,我的编程水平有了进一步的提高,同时也使我对编程有了一个更清醒的了解和认识。
六,程序。
//密码123
#include"
stdio.h”/*标准输入输出函数库*/
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—>
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"
#***************************菜单**************************#\n”);
*1输入成绩*2删除成绩*\n”);
*3查询成绩*4修改成绩*\n”);
*5插入成绩*6统计成绩*\n”);
*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()/*输出按键错误信息*/
\n\n\n\n\n***********输入有错!
按任意键继续!
**********\n"
getchar();
voidNofind()/*输出未查找此学生的信息*/
printf(”\n=====〉没有找到这名学生!
\n”);
voidDisp(Linkl)/*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/
Node*p;
p=l—〉next;
/*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/
p)/*p==NULL,NUll在stdlib中定义为0*/
printf(”\n=====〉没有学生记录!
return;
\n\n”);
printheader();
/*输出表格头部*/
while(p)/*逐条输出链表中存储的学生信息*/
printdata(p);
p=p—〉next;
/*移动直下一个结点*/
printf(HEADER3);
/*************************************************************
作用:
用于定位链表中符合要求的节点,并返回指向该节点的指针
参数:
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;
if(strcmp(r—>
data.name,findmess)==0)/*若找到findmess值的学生姓名*/
returnr;
r=r—>
return0;
/*若未找到,返回一个空指针*/
/*输入字符串,并进行长度验证(长度<
lens)*/
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];
s=l—〉next;
system(”cls”);
/*先打印出已有的学生信息*/
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;
while(s)/*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/
{
if(strcmp(s—〉data。
num,num)==0)
flag=1;
break;
s=s-〉next;
}
if(flag==1)/*提示用户是否重新输入*/
printf("
=====〉人数%s是不存在的,再试一次?
(y/n):
”,num);
scanf(”%c”,&ch);
y’||ch=='
continue;
return;
{break;
p=(Node*)malloc(sizeof(Node));
/*申请内存空间*/
/*返回主界面*/
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—>
egrade=numberinput(”英语Score[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—>
/*将新建的结点加入链表尾部中*/
r=p;
saveflag=1;
voidQur(Linkl)/*按学号或姓名,查询学生记录*/
/*1:
按学号查,2:
按姓名查,其他:
返回主界面(菜单)*/
charsearchinput[20];
/*保存用户输入的查询内容*/
Node*p;
l-〉next)/*若链表为空*/
system(”cls"
printf(”\n=====>
没有学生记录!
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(”按任意键返回”);
else
Nofind();
elseif(select==2)/*按姓名查询*/
stringinput(searchinput,15,”输入现有的学生姓名:
p=Locate(l,searchinput,”name"
if(p)
printf(END);
printf(”按任意键返回"
Nofind();
getchar();
Wrong();
/*删除学生记录:
先找到保存该学生记录的节点,然后删除该节点*/
voidDel(Linkl)
intsel;
Node*p,*r;
charfindmess[20];
l-〉next)
{system(”cls”);
没有该学生的记录\n"
return;
Disp(l);
printf(”\n=====>
1按学号删除=====〉2按姓名删除\n"
请选择[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)
next;
next=p-〉next;
/*将p所指节点从链表中去除*/
free(p);
/*释放内存空间*/
printf(”\n=====〉删除成功!
saveflag=1;
elseif(sel==2)/*先按姓名查询到该记录所在的节点*/
stringinput(findmess,15,"
输入现有的学生姓名:
p=Locate(l,findmess,”name"
r=r—〉next;
r—〉next=p-〉next;
/*修改学生记录。
先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改*/
voidModify(Linkl)
charfindmess[20];
l->
next)
{system("
\n=====>
没有该学生记录!
printf(”修改学生记录”);
stringinput(findmess,10,"
inputtheexistingstudentnumber:
/*输入并检验该学号*/
p=Locate(l,findmess,"
num”);
/*查询到该节点*/
if(p)/*若p!
=NULL,表明已经找到该节点*/
Number:
%s,\n”,p—〉data.num);
printf(”Name:
%s,"
,p-〉data.name);
name,15,"
输入新姓名:
printf(”C语言分数:
%d,”,p-〉data。
cgrade);
data.cgrade=numberinput(”