武汉轻工大学数计学院C语言课程设计报告班级:计算机类1307班学号: **********姓名:**指导教师:***日期:2014年6月18日一、实验目的1.在编辑应用程序过程中,逐步加深对C语言编程的理解;2.加强实践的能力,动手能力,同时进一步对所学的知识进行巩固;3.培养初步编程的能力,为以后的学习奠定基础。
二、实验内容运用所学的C语言知识编辑应用程序:班级成绩管理系统以及运动的时钟三.系统软件环境:本程序主要运行在: Visual C++ 6.0Turbo C/C++ 3.0四.课程设计题目:1.必做题:班级成绩管理系统对一个有N个学生的班级,每个学生有M门课程。
该系统实现对班级成绩的录入、显示、修改、排序、保存、查询等操作的管理。
功能要求:(1)本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。
(2)本系统显示这样的菜单:请选择系统功能项:a、成绩录入b、成绩显示c、成绩保存d、成绩排序e、成绩修改(要求先输入密码)f、成绩统计1)显示每门课程成绩最高的学生的基本信息。
2)显示每门课程的平均成绩,柱状图显示。
3)显示超过某门课程平均成绩的学生人数。
4)显示某门课程每个分数段区间的人数,用饼状图显示。
g、退出系统(3)执行一个具体的功能之后,程序将重新显示菜单。
(4)将学生成绩保存到文件中。
五.数据结构设计描述:(一)班级成绩管理系统↓↓六.源程序(一)班级成绩管理系统#include <string.h>#include <stdio.h>#include <stdlib.h>#include<graphics.h>#include<conio.h>#define _COURSES 3//定义科目数#define _LEN sizeof(student)//定义结构体大小//枚举返回值情况enum status{OVERFLOW = -1, //内存(溢出)问题DONE = 0, //成功NOFOUND = 1, //不存在OPENFAIL = 2, //打开(文件)失败BACK = 3 //返回};//end//定义学生信息结构体typedefstructStudentInfo{//数据域unsigned intnum;//学号char name[11];//姓名float scores[_COURSES];//各科成绩//指针域structStudentInfo *next;//存放下一节点的地址}student;//endstudent *head=NULL;//声明链表头结点student *curr=NULL;//声明指向当前节点的指针int total = 0;//声明当前节点个数intinit();//初始化链表intadd_stu();//添加新节点intshow_all();//显示所有学生信息intfind_stu();//查找指定信息节点intmodify_stu();//修改指定信息节点intremove_stu();//删除指定信息节点intsort_list();//对链表排序intsave_to_file();//将所有信息保存至文件intread_from_file();//从文件中读取信息int picture();//画分布图int quit();//释放所有节点空间int entering(student *input);//录入学生信息void menu();void show_stu(student *show, int serial);//显示指定学生信息void start();//程序开始界面void change(student *former, student *latter, student *temp);//交换两个节点的数据域void main(){int h,flag1,flag2;char name[20]="hyw",password[10]="hyw";char person[20],password1[10];printf ("\t\t ******** 欢迎进入学生成绩管理系统!********\n\n");printf ("\t\t\t 用户登录\n\n");for(h=0;h!=5;){printf("\t\t\t\t 用户名:");gets(person);flag1=strcmp(person,name);printf("\t\t\t\t 密码:");gets(password1);flag2=strcmp(password,password1);if(flag1==0 && flag2==0){printf("\t\t\t\t 登陆成功!\n\n");menu();break;}else{printf ("\t\t\t 用户名或密码错误!\n\n");printf ("\t\t\t 请注意:您还剩%d次机会!\n\n",4-h);}}if (h=5)printf ("对不起,您输入的用户名或密码有误,已被强制退出。
\n"); }void menu(){int choice=0;init();while(1){system("cls");//清屏start();printf("请选择:");scanf("%d",&choice);fflush(stdin);//清空缓冲区switch (choice){case 1: add_stu(); break;case 2: show_all(); break;case 3: find_stu(); break;case 4: modify_stu(); break;case 5: remove_stu(); break;case 6: sort_list(); break;case 7: save_to_file(); break;case 8: read_from_file(); break;case 9: picture(); break;case 0: quit();exit(0); break;default: break;}system("pause");//暂停批文件的处理并显示消息}intinit(){head = (student *)malloc(_LEN);//为头结点申请空间if (!head){//如果申请空间失败,返回return OVERFLOW;}head->next = NULL;//指向下一节点(空)curr = head->next;//当前节点指针指向第一个结点total = 0;//当前节点个数初始化为0(头结点不计算在内) return DONE;}/*功能:头插法添加新节点,并刷新学生人数 */ intadd_stu(){student *add = (student *)malloc(_LEN);curr = head->next;//当前节点指针指向第一个节点printf("\t====当前已存入 %d 个同学\n",total);printf("请输入第 %d 个学生的信息\n",total+1);if (BACK == entering(add)){free(add);return BACK;}head->next = add;//头结点指针域指向新建的节点add->next = curr;//新建节点指针域指向第一个节点curr = add; //当前节点指向新建的节点total += 1; //更新学生总人数return DONE;}/*功能:显示所有学生信息 */intshow_all(){if ( 0 == total ){printf("\t====没有可供显示的学生信息!\n");return NOFOUND;}curr = head->next;//当前节点指针指向第一个节点printf("\t%4s%12s%12s","序号","学号","姓名");for (int m=0; m<_COURSES; m++){printf("%7s","科目");}printf("\n");printf("\t-------------------------------------------------------------\n");for (inti=1; i<=total; i++){show_stu(curr,i);curr = curr->next;//当前节点指针后移}printf("\t-------------------------------------------------------------\n");return DONE;}/*功能:查找指定学生信息 */intfind_stu(){charstu_name[11];int flag=1;printf("请输入要查找的学生姓名:");scanf("%s",stu_name);curr = head->next;//指向第一个节点while (curr != NULL){if (strcmp(stu_name,curr->name) == 0){printf("\t%4s%12s%12s","序号","学号","姓名");for (int m=0; m<_COURSES; m++){printf("%7s","科目");}printf("\n");printf("\t-------------------------------------------------------------\n");show_stu(curr,flag);return DONE;}curr = curr->next;++flag;}printf("\t====没有找到 %s !请仔细核对姓名再查找\n",stu_name);return NOFOUND;}/*功能:修改指定学生的所有信息 */intmodify_stu(){charstu_name[11];int flag=1;curr = head->next;//指向第一个节点printf("请输入要修改的学生的姓名:");scanf("%s",stu_name);while (curr != NULL){if (strcmp(stu_name,curr->name) == 0){printf("\t%4s%12s%12s","序号","学号","姓名");for (int m=0; m<_COURSES; m++){printf("%7s","科目");}printf("\n");printf("\t-------------------------------------------------------------\n");show_stu(curr,flag);entering(curr);printf("\t====成功修改了 %s 的所有信息!\n",stu_name);return DONE;}curr = curr->next;++flag;}printf("\t====没有找到 %s !请仔细核对姓名\n",stu_name);return NOFOUND;}/*功能:删除指定学生 */intremove_stu(){student *pre=head;charstu_name[11];curr = head->next;//指向第一个节点printf("请输入要删除的学生的姓名:");scanf("%s",stu_name);while (curr != NULL){if (strcmp(stu_name,curr->name) == 0){pre->next = curr->next;free(curr);--total;printf("\t====已成功删除\"%s\"\n",stu_name);return DONE;}pre = pre->next;curr = curr->next;}printf("\t====没有找到 %s !请仔细核对姓名\n",stu_name);return NOFOUND;}/*功能:对所有学生排序 */intsort_list(){student *temp = (student *)malloc(_LEN);student *curr_i = head->next;student *curr_j = NULL;char choice='0';printf("\t \t1----按学号排序 .\t2----按姓名排序 . \n");printf("\t \t3----按科目排序 .\t0----退出排序. \n");printf("请选择:");scanf("%c",&choice);fflush(stdin);switch (choice){case '1':{while(curr_i->next != NULL){curr_j = curr_i->next;while (curr_j != NULL){if (curr_i->num>curr_j->num){change(curr_i,curr_j,temp);}curr_j = curr_j->next;}curr_i = curr_i->next;}printf("\t====排序成功!\n");break;}case '2':{while(curr_i->next != NULL){curr_j = curr_i->next;while (curr_j != NULL){if (strcmp(curr_i->name , curr_j->name) > 0){change(curr_i,curr_j,temp);}curr_j = curr_j->next;}curr_i = curr_i->next;}printf("\t====排序成功!\n");break;}case '3':{while(curr_i->next != NULL){curr_j = curr_i->next;while (curr_j != NULL){if (curr_i->scores[0] <curr_j->scores[0]){change(curr_i,curr_j,temp);}curr_j = curr_j->next;}curr_i = curr_i->next;}printf("\t====排序成功!\n");break;}case '0':{free(temp);return BACK;}default:{printf("\t====输入有误!\n");break;}}free(temp);return DONE;}/*功能:保存数据到文件 */ intsave_to_file(){curr=head->next;if (total == 0){printf("\t====目前还没有任何信息,不用保存!\n");return BACK;}FILE *fp;if((fp=fopen("record.dat","wb"))==NULL){printf("\t====文件打开失败!\n");return OPENFAIL;}while (curr != NULL){//将数据成块写入文件fwrite((char *)curr, _LEN, 1, fp);curr=curr->next;}fclose(fp);printf("\t====信息已成功保存至文件\"record.dat\"文件中\n");return DONE;}/*功能:从文件中读取数据 */ intread_from_file(){char judge='y';FILE *fp;if((fp=fopen("record.dat","r"))==NULL){printf("文件不存在或者打开失败!\n");return OPENFAIL;}printf("\t====读取文件会覆盖当前信息!是否确定载入文件?(y/n):");scanf("%c",&judge);if (judge=='n' || judge=='N'){return BACK;}quit();//释放以前所有信息的空间init();//重新初始化链表curr = head;//当前节点指针指向头结点student *add=(student *)malloc(_LEN);//申请空间存放读取的信息while (fread((char *)add, _LEN, 1, fp)){//由于存储的信息是最新的信息在前,所以读取的时候将其添加在链表尾add->next=curr->next;curr->next=add;curr=add;add=(student *)malloc(_LEN);++total;}fclose(fp);printf("\t====文件载入成功!当前已有%d个学生。