C语言课程设计教师签名:数学与信息科学学院班级学号08071207080712130807123008071231学生姓名田如雪刘哲强赵丹平胡意提交日期2010-11-29成绩C语言课程设计田如雪刘哲强赵丹平胡意1一、实践的目的和要求加深对C语言课程所学知识的理解,进一步巩固C语言算法规则.学会编制结构清晰.风格良好.数据结构适当的C程序,从而具备解决综合性问题的能力.二、内容在熟练掌握C语言的基础知识:数据类型(整型.实型.字符型.指针.数组.结构等);运算类型(算术运算.逻辑运算.自增自减运算.赋值运算等);程序结构(顺序结构.判断选择结构.循环结构);大程序的功能分解方法(即函数的使用)等.进一步掌握各种函数的应用以及文件的读写操作等.三、实验任务:学生成绩管理系统设计要求:实现菜单设计,使用数据文件保存和修改,应用结构体和指针功能要求:实现学生信息的输入,查询,插入,删除,排序,打印等操作。四、设计思路1.(需求分析或算法分析)学生的主要信息包括:学号、姓名、C语言成绩、数学成绩、英语成绩、总分、平均分、名次.2.(数据分析:包括所涉及的函数,数据结构等)用结构体数组来存储信息,用Add()函数来实现信息的录入,用Disp()函数来显示打印信息,用Qur()函数来查找信息,用Sort()函数来排序用Insert()函数来插入信息,用Modify()函数来修改信息,用Del()函数来删除信息,用Save()函数来保存信息,用Exit函数来退出通讯录.3.对小组进行分工,每个人分配至少两个函数的代码实现,其余的再按情况进行分配.C语言课程设计田如雪刘哲强赵丹平胡意2五、程序代码#includestdio.h/*标准输入输出函数库*/#includestdlib.h/*标准函数库*/#includestring.h/*字符串函数库*/#includeconio.h/*屏幕操作函数库*/#defineHEADER1|--------------------------------学生成绩表------------------------------|\n\n#defineHEADER2|学号|姓名|C语言|数学|英语|总分|平均分|名次|\n#defineHEADER3|---------------|---------------|-----|----|-----|---------|-------|-----|#defineFORMAT|%-10s|%-9s|%5d|%4d|%5d|%4d|%5.2f|%4d|\n#defineDATAp-data.num,p-data.name,p-data.cgrade,p-data.mgrade,p-data.egrade,p-data.total,p-data.ave,p-data.mingci#defineEND------------------------------------------------------------------------\nintsaveflag=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()功能相同*/printf(\n\n学生成绩管理系统\n);printf(*************************菜单*********************************\n);printf(*1输入数据6修改数据*\n);C语言课程设计田如雪刘哲强赵丹平胡意3printf(*2打印数据7插入数据*\n);printf(*3排序数据8删除数据*\n);printf(*4统计数据9保存数据*\n);printf(*5查找数据0退出系统*\n);printf(**************************************************************\n);}/*------------------printheader函数,格式化表头-------------------------*/voidprintheader()/*格式化输出表头*/{printf(HEADER1);printf(HEADER2);printf(HEADER3);}/*-----------------------printdata函数,格式化输出数据-----------------*/voidprintdata(Node*pp)/*格式化输出表中数据*/{Node*p;p=pp;printf(FORMAT,DATA);}/*------------------------------Wrong函数,输出按键错误信息---------------------*/voidWrong()/*输出按键错误信息*/{printf(\n\n\n\n\n***********错误!:输入发生错误!请按任意键继续**********\n);getch();}/*---------------------------NOfind函数,用于输出未查找此学生的信息-----------------------*/voidNofind()/*输出未查找此学生的信息*/{printf(\n=====没有找到此学生!\n);}/*----------------------------------------Disp函数---------------------------------*/voidDisp(Linkl)/*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/{Node*p;p=l-next;/*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/if(!p)/*p==NULL,NUll在stdlib中定义为*/{printf(\n=====没有学生数据!\n);C语言课程设计田如雪刘哲强赵丹平胡意4getch();return;}printf(\n);printheader();/*输出表格头部*/while(p)/*逐条输出链表中存储的学生信息*/{printdata(p);p=p-next;/*移动直下一个结点*/printf(HEADER3);}getch();}/*************************************************************作用:用于定位链表中符合要求的节点,并返回指向该节点的指针参数: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;/*若未找到,返回一个空指针*/}/*输入字符串,并进行长度验证(长度lens)*/C语言课程设计田如雪刘哲强赵丹平胡意5voidstringinput(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(t100||t0)printf(\n分数必须在[0,100]中!\n);/*进行分数校验*/}while(t100||t0);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)/*一次可输入多条记录,直至输入学号为的记录结点添加操作*/{while(1)/*输入学号,保证该学号没有被使用,若输入学号为,则退出添加记录操作*/{stringinput(num,10,\n输入学号(输入返回菜单):);/*格式化输入学号并检验*/flag=0;if(strcmp(num,0)==0)/*输入为,则退出添加操作,返回主界面*/{return;}s=l-next;while(s)/*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/C语言课程设计田如雪刘哲强赵丹平胡意6{if(strcmp(s-data.num,num)==0){flag=1;break;}s=s-next;}if(flag==1)/*提示用户是否重新输入*/{getch();printf(=====学号%s不存在,再试一次?(是(y)/否(n)):,num);scanf(%c,&ch);if(ch=='y'||ch=='Y')continue;elsereturn;}else{break;}}p=(Node*)malloc(sizeof(Node));/*申请内存空间*/if(!p){printf(\nallocatememoryfailure);/*如没有申请到,打印提示信息*/return;/*返回主界面*/}strcpy(p-data.num,num);/*将字符串num拷贝到p-data.num中*/stringinput(p-data.name,15,姓名:);p-data.cgrade=numberinput