您好,欢迎光临本网站![请登录][注册会员]  
文件名称: 从零开始学C语言(八)​.pdf
  所属分类: 其它
  开发工具:
  文件大小: 5mb
  下载次数: 0
  上传时间: 2019-09-13
  提 供 者: weixin_********
 详细说明:从零开始学C语言(八)​pdf,从零开始学C语言(八)​第18章学生成绩管理系统设计293 18.2.1 score* statistics( score*head成绩统计 该函数主要实现了对学生成绩统计的几种方式:统计个人总分和平均分、统计单科平均分、 统计总分最高分和最低分,如图18-12~图18-15所示。 head=sNULL 否 是 switch-case语句匹配 当pll=NULL 输出pl结点总分与平均分 输出提示信息 匚进入相应的模块执行 输出错误提示 l=pl->next 返回执行操作后的链表首地址head 返回执行操作后的链表首地址head 图18-12成绩函数执行NS图 图1813统计个人总分和平均分 head==NULL head==NULL 否 是 否 是 当p1=NUL 当pl!=NULL 输出单科平均分 输出提示信息 输出总分最高分和最低分 输出提示信息 pl=pI->next: pl=pl→>next 返回执行操作后的链表首地址 head 返回执行操作后的链表首地址head 图18-14统计单科平均分 图18-15统计总分最高分和最低分 18.2.12 int menu(intk)菜单 该函数主要提供一个系统显示的界面,对系统模块进行介绍,便于用户进行操作。系统界 面如图1816所示 182.13用到的头文件和全局变量 排 include< malloc.h> include 排inc1ude #include #define LEN sizeof(struct scorenode) #define DEBUG int n, k: /*n,k为全局变量,本程序中的函数均可以使用它,分别用于记数 和标记* 图18-16系统界面 (18.3)程序代码 上一节对学生成绩管理系统的数据结构的模块功能的分析,并列出了实现各个模块功能的 函数以及它们的程序执行NS图,下面是实现各个函数的程序代码以及程序运行后的结果。 183.1主函数 maino代码 主函数 maino的功能是通过调用 creato, search(, deleo, addOprinto, statistics, save, sortdatao等函数,实现学生成绩查询系统功能 首先,函数体中调用 menu函数,提供一个系统显示的界面,对系统模块进行介绍,便于用 户进行操作。然后使用 switch-case语句根据用户的不同选择来进入相应的模块,执行不同的操作。 menu函数代码如下: 294 雪从零开始学c语冒 int menu (int k) Int i printf(" t\t\t\t学生成绩管理系统\n"); /*打印出系统标题* printf("\n”) for(i=0;i<80;i++) printf("*" printf("1编辑学生的成绩\ttt2显示学生的成绩\tt\t3查询学生的成绩\n") printf(·4添加学生的成绩vttt5删除学生的成绩tt6学生成绩排序n}/ printf("7保存学生的资料\ttt8统计学生的成绩ttt9读取学生的成绩\n"); for(i=0;i<80:++ printf("*" print£("欢迎进入学生成绩管理系统,请选择您所要的操作(选择(0)退出):"); scanf("暑d”,&k】; /*选择操作* getchar()t return (k)i main函数代码如下: void main() int k: score *head=0, *stu=0 while (1) k=menu(k) switch(k) /*用 switch语句实现功能选择* [case 1: head=creatlink(), break /*调用创建链表函数* case 2: print (head)i breaki /*调用显示学生资料函数* case 3: head=search (head): break /*调用成绩查询函数* case 4: head=add(head, stu),: 调用追加学生资料函数* case 5: head=dele (head)i breaki /*调用删除学生资料函数*/ case 6: sortdata (head): break: /★调用排序函数* case 7: save (head): break; /*调用保存函数* case 8: statistics (head), breaki /*调用统计函数*/ case 9: head=loadfile(head); break; /*从文件调入记录函数* case0;exit(0);/*退出系统,返回主界面* default: printf("输入错误,请重试!n”); 程序运行时,出现学生成绩管理系统的主界面,如图 18-17所示。 18.32创建链表函数 creatlinko 函数 creatin0的功能是创建链表,此函数带回一个指 向链表头的指针。函数体中使用了goto语句,方便程序执 行过程中的跳转。 函数 creatlinko代码如下: 图18-17系统界面 score *creatlink( score*head score *p1,*p2,*p3,*max; int 1,i float fen: char t[1017 第18章学生成绩管理系统设计295 p1=p2=p3=(score *)malloc(LEN); head=p3: /*开辟一个新单元* printf("请输入学生资料,输0退出!n"); repeat1: print f("请输入学生学号(学号应大于0):"); /*输入学号,学号应大于0*f scanf("sd",&pl->number while(pl->number<0) getchar()i print f("输入错误,请重新输入学生学号:甲); scanf("号d",&p1-> number;}/*输入学号为字符或小于0时,程序报错,提示重新输入学号★/ if(pl->number==0) goto end; /*当输入的学号为0时,转到末尾,结束创建链表* else p3-head; if(n>0) (for(i=0i inumber!=p3->number p3=p3->next; else printf("学号重复,请重输!n"); goto repeal; /*当输入的学号已经存在时,程序报错,返回前面重新输入* 】 printf("请输入学生姓名:"); scanf("s",&pl->name); 输入学生姓名* printf("请输入语文成绩(0-100):")/*输入语文成绩,成绩应在0~100* scant(“暑fm,p1-> chinese); while(pl->chinesec0l Ipl->chinese>100) getchar(): print f("输入错误,请重新输入语文成绩");/*输入错误,重新输入语文成绩直到正确为止* scanf("%",&pl->chinese); print f("请输入数学成绩(0-100):"); *输入数学成绩,成绩应在0~100* scanf("f",&pl->mathmatic)i while(pl->mathmatic<0l Ipl->mathmatic>100) getchar()i print f("输入错误,请重新输入数学成绩"); /*输入错误,重新输入数学成绩直到正确为止*f scanf("%f", &p1->mathmatic)i1 printf("请输入英语成绩(0-100):”); /*输入英语成绩,成绩应在0~100*f scant("暑”,p1->eng1ish); while(p1->english<01lp1->english>100) get char (); printf("输入错误,请重新输入英语成绩"); scanf("f",&pl->english);1 /*输入错误,重新输入英语成绩直到正确为止 head=NULL while(pl->number!=0) n=n+1 if(n==1) head=p1 else p2->next=pl: 2=p1 pl=(score *)malloc(LEN); 296 m从零开始学C语曹 -------------m---- printf("请输入学生资料,输0退出!\n”); repeat2: print f("请输入学生学号(学号应大于0):) scanf("id",&pl->number ): /*输入学号,学号应大于0* while(pl->number<0 getchar(); printf("输入错误,请重新输入学生学号:“); scanf(";a",6p1- number);}/*输入学号为字符或小于0时,程序报错,提示重新输入学号* if(pl->number==0) goto end; /*当输入的学号为0时,转到末尾,结束创建链表* else p=headp if(n>0) (for (i=0; inumber !=p3->number p3=p3->nexti se printf("学号重复,请重输!\n”); goto repeat; /*当输入的学号已经存在时,程序报错,返回前面重新输入* printf("请输入学生姓名:"); scanf("&s",&pl->name); /*输入学生姓名* printf("请输入语文成绩(0~100):"); scanf("f",&pl->chinese) /*输入语文成绩,成绩应在0~100* while(pl->chinese<0| lp1-schineses100) getchar() printf("输入错误,请重新输入语文成绩"); scanf("f",&pl->chinese):) /*输入错误,重新输入语文成绩直到正确为止* printf("请输入数学成绩(0~100):”); scanf(%f",&pl->mathmatic)i /*输入数学成绩,成绩应在0~100*/ while(pl->mathmatic<0l lpl->mathmatics100) getchar( printf(·输入错误,请重新输入数学成绩") scanf ("f",&pl->mathmatic)i) /*输入错误,重新输入数学成绩直到正确为止* printf("请输入英语成绩(0~100):"); scanf("gf",&pl->english); /*输入英语成绩,成绩应在0~100* while(pl->english<0llpl->english>100) [getchar( printf("输入错误,请重新输入英语成绩"); scanf("gf", &p1->english)i) /*输入错误,重新输入英语成绩直到正确为止*/ end: pithead; p3=p1 for(=1;inexti if(max-number>p1->number) f k=max->number; 第18章学生成绩管理系统设计297 max->number=p1->number; pl->number=k; /*交换前后结点中的学号值,使得学号大者移到后面的结点中* strcpy (t, max->name) strcpy (max->name, pl->name )i strcpy(pl->name, t) /*交换前后结点中的姓名,使之与学号相匹配*/ fen=max->chinese max->chinese=pl->chinese; p1->chinese=fen; /*交换前后结点中的语文成绩,使之与学号相匹配* Een=max->mathmatic max->mathmatic=p1->mathmatic; pl->mathmatic=fen; /*交换前后结点中的数学成绩,使之与学号相匹配* fen=max->english: max->english=pl->english: p1->english=fen; /*交换前后结点中的英语成绩,使之与学号相匹配*/ max=head plshead i /*重新使max,p指向链表头*/ p2->next=NULLi /*链表结尾* printf("输入的学生数为:号a个!n”,n); return(head) 在输入学生的姓名和各科成绩时,采用使用逐一提示的输入方法,用回车确定。考虑到学 生的学号不可能为0,所以当输入的学号数为0时,把表尾结点的指针变量置NULL,输入结束。 在输入结束时,该函数对已经输入的学生按照学号进行排序存放。因此, creatin0所创建的链 表是一个有序的链表。 18.33显示学生信息函数 print( 函数 printO的功能是显示学生成绩,即将所建立的学生成绩链表打印出来。如果链表不为空, 逐个打印出学生的学号、姓名和各科成绩。 printo函数代码如下: void print (score *head) score Pi if(head==NULL) printf("n没有任何学生资料!n");} else printf("岩d\n",n); printf("一----------------------- -1n"); printf("|学号t|姓名t|话文\t|数学t英语tn"); printf("---------------------n"); /*打印表格域* p=head; do [printf("18a\ti8st18.1ft18.1ftI8.1ft L\n".p->number, p->name, p->chinese, p->mathmati c, p->english)i printf(n ----------n"); /*打印表格域*/ p=p->next; )while (p!=NULL); /*打印完成了*/ 18.34向链表中添加学生数据函数addO 函数add的功能是向已经建立的链表中追加学生资料,并且将所有学生资料按学号排序。 函数adO代码如下: 298从零开始学c语會 score *add(score *head, score *stu) score *po, *pl,*p2,*p3, *maxi int 1. j float fen; char t[10]: p3=stug(score *)malloc(LEN) *开辟一个新单元*/ printf l"a输入要增加的学生的资料!")大于0)") repeat4: printf("请输入学生学号(学号 scanf("id",&stu->number /*输入学号,学号应大于0* while(stu->number<0) getchar ( printf("输入错误,请重新输入学生学号:"); scanf(sd",&stu->number)i I /*输入错误,重新输入学号 if(stu->number==0) goto end2: /*当输入的学号为0时,转到末尾,结束追加* else p3=head; if(n0) 【for(i=0;inumber !=p3->number p3=p3->next i else printf("学号重复,请重输!Vn”) goto repeat 4; /*当输入的学号已经存在,程序报错,返回前面重新输入* } printf("输入学生姓名:“); scanf("常s”,stu->name); /*输入学生姓名★/ printf("请输入语文成绩(0-100):"); scanf("f",&stu->chinese); /*输入语文成绩,成绩应在0~100* while(stu->chinese
    chinese>100) getchar ()i printf("输入错误,请重新输入语文成绩"); scanf("f, &stu->chinese):) *输入错误,重新输入语文成绩直到正确为止* printf("请输入数学成绩(0-100):"); scanf("bf",&stu->mathmatic)i 输入数学成绩,成绩应在0~100*/ while(stu->mathmatic
      mathmatic>100) I getchar(); printf("输入错误,请重新输入数学成绩"); scant(“暑f“,&st-> mathmatic); /*输入错误,重新输入数学成绩直到正确为止* printf("请输入英语成绩(0~100):") scanf("of",&stu->english)i /*输入英语成绩,成绩应在0~100*/ while(stu->english<0l I stu->english>100) getchar(); printf("输入错误,请重新输入英语成绩”); scanf("sf", &stu->english)i /*输入错误,重新输入英语成绩直到正确为止 pl=head; po=stui if(head==NULL) I head=p0: p0->next=NULL; /*当原来链表为空时,从首结点开始存放资料+f else /*链表不为空* if(pl->next==NULL) /*找到原来链表的末尾* pl->next=p0: 第18章学生成绩管理系统设计299 m加m=m+ p0->next=NULL; /*将它与新开单元相连接*/ else while(pl->next!=NULL /*还没找到末尾,继续找*/ p2=pl:pl=pl->next i pl->next=po; pO->next=NULL; n=n+1 pl=head; p0=stui for (i=l:inext i if(max->number>pl->number) k=max->number; max->number=pl->number; pl->number=k: /*交换前后结点中的学号值,使得学号大者移到后面的结点中* strcpy(t, max->name)i strcpy(max->name, p1l->name )i strcpy (pl->name, t); *交换前后结点中的姓名,使之与学号相匹配* fen=max->chinese max->chinese=p1->chinese pl->chinese=fen; /*交换前后结点中的语文成绩,使之与学号相匹配* fen=max->mathmatic max->mathmatic=pl->mathmatic; p1->mathmatic=fen /太交换前后结点中的数学成绩,使之与学号相匹配* fensmax->english max->english=p1->english: pl->english=fen; /*交换前后结点中的英语成绩,使之与学号相匹配* } max=head; pl=head i /*重新使max,p指向链表头*/ 1 end2: printf("现在的学生数为:d个!n”,n); return(head) 18.35查询学生成绩函数 search 函数 search的功能是从链表中查询输入学号的学生信息 由于在向链表中输入数据、添加数据的时候,已经对链表按学号从大到小排好序了,因此 在进行查找时,只需要从链表的表头开始进行查询。如果没有查询到结果,则给出反馈信息, 如果查找到,则打印出结果。 函数 search代码如下 score *search(score *head) int number i score *pl, *p2; printf("输入要查询的学生的学号:); 300m从零开始学c语會 =+++-+-======== scanf ("Bd",&number); while(number!=0) if(head==NULL) printf("n没有任何学生资料!n"); return(head):] printf("-------m---- ---------------------\n"); printf("|学号t姓名t|语文tl数学\t|英语\tn”); printf("- -------1n");/*打印表格域* pithead; while(number!=p1->number&&cpl->next !=NULL) D2=p1 pl=p1->next i } if(number==pl->number) printf(”|d\t|8\t|,1ft|.1f18,1ft|n",p1->number,p1->name,p1->chinese,p1->mathma tic, pl->english) printf("- -----\n”) /*打印表格域* else printf("号d不存在此学生!n", number); printf("输入要查询的学生的学号,"); scanf("gd",&number print f("已经退出了!\n") return(head) 18.3.6删除数据函数dele 函数dele的功能是删除输入学号的学生信息。 score *dele(score *head) score *pl, *p2 int number; printf("输入要删除的学生的学号(输入0时退出):"); scanf("Bd",&number )i getchar()i while(number!=0 /*输入学号为0时退出*/ if(head==NULL) printf("n没有任何学生资料!n"); return(head)i pl=head; while( number!=p1-> number&&p1->next!=NUL)/*p1指向的不是要找的首结点,并且后面还有结点* 2=p1;pl=pl->next i /*p1后移一个结点* if(number==pl->number) /*找到了*/ if(p1==head) head=pl->next: /*若p1指向的是首结点,把第二个结点地址赋 予head*
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 输入关键字,在本站1000多万海量源码库中尽情搜索: