C语言程序管理系统课程设计报告.docx
- 文档编号:7495344
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:31
- 大小:55.22KB
C语言程序管理系统课程设计报告.docx
《C语言程序管理系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《C语言程序管理系统课程设计报告.docx(31页珍藏版)》请在冰豆网上搜索。
C语言程序管理系统课程设计报告
C语言课程设计报告
实
验
报
告
专业:
班级:
姓名:
学号:
题目:
学生成绩管理程序
该程序是一个简单的学生成绩管理程序。
它可以录入多个同学的基本情况:
学号、姓名、数学,英语,C语言分数,同时还可以输出学生的平均,分总分,并且能够将所有学生的基本情况和各课的成绩作适当修改和删除以及统计与排名,同时能够将每个学生的成绩输出.
一:
数据结构设计及用法说明
在整个程序中采用了多种数据结构,包括有基本类型中的:
1:
整型int、char、long。
2:
浮点型:
double、float。
3:
导出类型:
指针、数组、结构(struct),链表。
程序中的几个主要的结构:
voidmain()
{
intmm;
for(;1;)
{printf("请输入密码\n");
scanf(”%d",&mm);
if(mm==123)break;
else
printf(”密码错误;请重输入密码\n”);
}
Linkl;/*定义链表*/
FILE*fp;/*文件指针*/
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));
if(!
p)
{
printf(”memorymallocfailure!
\n”);/*没有申请成功*/
exit(0);/*退出*/
}
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);break;/*删除学生记录*/
case3:
Qur(l);break;/*查询学生记录*/
case4:
Modify(l);break;/*修改学生记录*/
case5:
Insert(l);break;/*插入学生记录*/
case6:
Tongji(l);break;/*统计学生记录*/
case7:
Sort(l);break;/*排序学生记录*/
case8:
Save(l);break;/*保存学生记录*/
case9:
{system(”cls”);Disp(l);
printf(”按任何键返回”);
chara;
scanf(”%d”,&a);
break;
}/*显示学生记录*/
default:
Wrong();getchar();break;/*按键有误,必须为数值0—9*/
}
}
}程序中建立了多个函数分别来完成每个所要求的功能:
读文件和写文件函数,建链表函数,插入、修改和删除函数,排序、统计和输出
函数。
程序利用各个函数来完成前面要求所需要的功能。
二:
程序调用图:
三:
功能菜单
#***************************菜单**************************;
*1输入成绩*2删除成绩
*3查询成绩*4修改成绩
*5插入成绩*6统计成绩
”*7成绩排序*8保存成绩
*9显示成绩*0退出系统
#*********************************************************
四.实验结果;(见程序运行)
五:
体会:
做完这个c语言程序设计的作业,我学会了很多新知识,对c语言有了更进一步的了解。
开始时,我想用结构数组来做这个程序,但后来我发现用做它,修改数据和读取数据都显得很方便.于是,相比较之下,我便选择了链表。
编程时会遇到一些困难,最令人头疼的莫过于程序运行时出错了.有时哪怕是一些很小的错误经常能导致难以预料到的后果,因此,编程时我尽量做到一丝不苟,不敢有丝毫疏忽。
通过这次c语言编程的练习,我的编程水平有了进一步的提高,同时也使我对编程有了一个更清醒的了解和认识。
六,程序。
//密码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(”
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 程序 管理 系统 课程设计 报告