1、int select; /保存选择结果变量*/char ch; /*保存(y,Y,n,N)*/int count=0; /*保存文件中的记录条数(或结点个数)*/Node *p,r; /*定义记录指针变量/l=(Node)malloc(sizeof(Node);if(!l) printf(”n 内存分配失败 ”); /*如没有申请到,打印提示信息/ return ; /返回主界面/ lnext=NULL;r=l;fp=fopen(”C:student”,ab+); /*以追加方式打开一个二进制文件,可读可写,若此文件不存在,会创建此文件*/if(fp=NULL) printf(”n=无法打开文
2、件!n exit(0);while(!feof(fp)p=(Node*)malloc(sizeof(Node);p) printf(” memory malloc failure!n”); /没有申请成功/ /退出/if(fread(p,sizeof(Node),1,fp)=1) /一次从文件中读取一条学生成绩记录*/ pnext=NULL; rnext=p; r=p; /r指针向后移一个位置/ count+;fclose(fp); /关闭文件/printf(n=打开文件成功,共记录的数目: d。n”,count);menu();while(1) system(cls”); menu(); p
3、=r; printf(”n 请输入您的选择 (09):”); /显示提示信息/ 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)case 1:Add(l);break; /增加学生记录*/case 2:Del(l); /删除学生记录/case 3:Qu
4、r(l);break; /*查询学生记录/case 4:Modify(l); /*修改学生记录/case 5:Insert(l); /*插入学生记录/case 6:Tongji(l); /统计学生记录*/case 7:Sort(l); /*排序学生记录*/case 8:Save(l); /*保存学生记录/case 9:system(”cls”);Disp(l); printf(”按任何键返回”); char a; scanf(”d”,a); /显示学生记录*/ default: Wrong();getchar(); /按键有误,必须为数值09/程序中建立了多个函数分别来完成每个所要求的功能:读
5、文件和写文件函数,建链表函数,插入、修改和删除函数,排序、统计和输出函数。程序利用各个函数来完成前面要求所需要的功能。二:程序调用图:三:功能菜单*菜单* ; 1 输入成绩 2 删除成绩 3 查询成绩 4 修改成绩 * 5 插入成绩 * 6 统计成绩 ” * 7 成绩排序 * 8 保存成绩 9 显示成绩 * 0 退出系统 * 四实验结果;(见程序运行)五:体会:做完这个c 语言程序设计的作业,我学会了很多新知识,对c语言有了更进一步的了解。开始时,我想用结构数组来做这个程序,但后来我发现用做它,修改数据和读取数据都显得很方便.于是,相比较之下,我便选择了链表。编程时会遇到一些困难,最令人头疼的
6、莫过于程序运行时出错了.有时 哪怕是一些很小的错误经常能导致难以预料到的后果,因此,编程时我尽量做到一丝不苟,不敢有丝毫疏忽。通过这次c语言编程的练习,我的编程水平有了进一步的提高,同时也使我对编程有了一个更清醒的了解和认识。六,程序。/密码123#include stdio.h” /标准输入输出函数库/stdlib。h” /标准函数库*/#include ”string。h /字符串函数库/include conio.h /屏幕操作函数库/define HEADER1 ” -学生成绩- ndefine HEADER2 学号 | 姓名 |C语言数学英语 总分 平均分 名次 | n”#defin
7、e HEADER3 -|-|-|-|- define FORMAT ” | 10s |%15s|4d 4d|%4d 4d | %.2f %4d n”#define DATA pdata。num,pdata.name,p-data。egrade,pdata。mgrade,pcgrade,p-data。total,pdata。ave,pdata.mingcidefine END ” - n”int saveflag=0; /是否需要存盘的标志变量*/定义与学生有关的数据结构*/typedef struct student /*标记为student*/char num10; /学号*/char na
8、me15; /*姓名/int cgrade; /*C语言成绩/int mgrade; /数学成绩/int egrade; /英语成绩/int total; /*总分*/float ave; /*平均分/int mingci; /*名次*/;/定义每条记录或结点的数据结构,标记为:node/typedef struct nodestruct student data; /数据域/struct node next; /*指针域/Node,Link; /*Node为node类型的结构变量,*Link为node类型的指针变量/void menu() /主菜单/system(cls”); /调用DOS命
9、令,清屏。与clrscr()功能相同/cprintf( 学生成绩管理系统 n #*菜单*n”); * 1 输入成绩 2 删除成绩 *n”); 3 查询成绩 4 修改成绩 *n”); * 5 插入成绩 6 统计成绩 n”); 7 成绩排序 * 8 保存成绩 *n”);cprintf(” 9 显示成绩 * 0 退出系统 *ncprintf(” *#n”);/cprintf()送格式化输出至文本窗口屏幕中/void printheader() /格式化输出表头/printf(HEADER1);printf(HEADER2);printf(HEADER3);void printdata(Node *p
10、p) /格式化输出表中数据/Node* p;p=pp;printf(FORMAT,DATA);void Wrong() /输出按键错误信息*/nnnnn*输入有错!按任意键继续!*ngetchar();void Nofind() /输出未查找此学生的信息/printf(”n=没有找到这名学生!n”);void Disp(Link l) /显示单链表l中存储的学生记录,内容为student结构中定义的内容/Node *p;p=lnext; /l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息/p) /p=NULL,NUll在stdlib中定义为0*/pri
11、ntf(”n=没有学生记录!return;nn”);printheader(); /输出表格头部/while(p) /逐条输出链表中存储的学生信息/printdata(p);p=pnext; /移动直下一个结点/printf(HEADER3);/*作用:用于定位链表中符合要求的节点,并返回指向该节点的指针参数:findmess保存要查找的具体内容; nameornum保存按什么查找; 在单链表l中查找;*/Node Locate(Link l,char findmess,char nameornum)Node *r;if(strcmp(nameornum,num”)=0) /按学号查询/r=l
12、next;while(r) if(strcmp(rdata。num,findmess)=0) /若找到findmess值的学号*/ return r; r=rnext;else if(strcmp(nameornum,”name”)=0) /按姓名查询*/r=lnext; if(strcmp(rdata.name,findmess)=0) /*若找到findmess值的学生姓名*/ return r; r=rreturn 0; /若未找到,返回一个空指针/输入字符串,并进行长度验证(长度lens)*/void stringinput(char *t,int lens,char notice)
13、char n255; do printf(notice); scanf(”s,n); /输入字符串/ if(strlen(n)lens)printf(”n 超过所需长度! n /*进行长度校验,超过lens值重新输入/ while(strlen(n)lens); strcpy(t,n); /将输入的字符串拷贝到字符串t中/*输入分数,0分数100)*/int numberinput(char *notice)int t=0; do printf(notice); /*显示提示信息/ scanf(d”,t); /*输入分数/ if(t100 | t0) printf(”n 评分必须在0100!
14、n”); /*进行分数校验/ while(t100 | tnext!=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) /*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*
15、/ if(strcmp(sdata。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(pdata。num,num); /将字符串num拷贝到p-data.num中*/stringinput(pdata。name,15,Name:pdata.cgrade=n
16、umberinput(”C语言0-100: /输入并检验分数,分数必须在0100之间*/p-data.mgrade=numberinput(”数学 Score0-100: /*输入并检验分数,分数必须在0100之间/pegrade=numberinput(”英语 Score0100:pdata.total=pdata。egrade+pdata.cgrade+p-data.mgrade; /计算总分/pdata.ave=(float)(p-data。total/3); /计算平均分*/p-data。mingci=0;pnext=NULL; /表明这是链表的尾部结点*/r /将新建的结点加入链表尾
17、部中/r=p;saveflag=1;void Qur(Link l) /按学号或姓名,查询学生记录/ /*1:按学号查,2:按姓名查,其他:返回主界面(菜单)/char searchinput20; /*保存用户输入的查询内容/Node p;l-next) /若链表为空/system(”clsprintf(”n=没有学生记录!system(”cls”);printf(”n =1按学号搜寻= 2按名称搜索nprintf(” please choice1,2:scanf(%d”,select);if(select=1) /按学号查询/stringinput(searchinput,10,输入现有的
18、学生学号:p=Locate(l,searchinput,”num/在l中查找学号为searchinput值的节点,并返回节点的指针/if(p) /若p!=NULL/ printheader(); printdata(p); printf(END); printf(”按任意键返回”);else Nofind();else if(select=2) /*按姓名查询/stringinput(searchinput,15,”输入现有的学生姓名:p=Locate(l,searchinput,”nameif(p) printf(END); printf(”按任意键返回 Nofind(); getchar(
19、);Wrong();/删除学生记录:先找到保存该学生记录的节点,然后删除该节点/void Del(Link l)int sel;Node p,r;char findmess20;l-next) system(”cls”);没有该学生的记录nreturn;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(rnext!=p)next;n
20、ext=p-next;/将p所指节点从链表中去除/ free(p); /释放内存空间/ printf(”n=删除成功! saveflag=1;else if(sel=2) /先按姓名查询到该记录所在的节点/stringinput(findmess,15,输入现有的学生姓名:p=Locate(l,findmess,”name r=rnext; rnext=p-next;/*修改学生记录。先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改/void Modify(Link l)char findmess20;l-next) system(n=没有该学生记录!printf(”修改学生记录”);stringinput(findmess,10,input the existing student number: /*输入并检验该学号*/p=Locate(l,findmess,num”); /查询到该节点/if(p) /*若p!=NULL,表明已经找到该节点/Number:%s,n”,pdata.num);printf(”Name:s,p-data.name);name,15,输入新姓名:printf(”C语言分数:%d,”,p-data。cgrade);data.cgrade=numberinput(”
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1