*版本号:V1.0
*项目描述:该项目是一个对学生的成绩进行管理的系统,可以对学生的成绩进行增加,删除,更改等操作。
主函数
#include<stdio.h> #include<conio.h> #include<malloc.h> #include<string.h> #include "student.h" #include <string> #include "stdlib.h" #include <windows.h> #define USERNAME "lzz" #define PASSWORD "123456" STUDENT *headLink;//链表表头指针 //以下是函数声明 void ReadInfoFormFile(void);//w读文件 void DesplayMenu(void);//主界面 void CreateHeadLink(void);//建立链表 STUDENT *MallocNode(void);//创建节点 void GetInformation(STUDENT *t);//获取学生信息 void OutputInformation(void);//输出学生信息 void DesplayInfoBystudentName(void);//按姓名输出信息 void DesplayOneNode(STUDENT *t);//输出一个节点 void InsertOneNode(STUDENT *t);//插入一个节点 void DeleteNodeBystudentNumber(void);//按学号删除节点 void ChangeMarkByName(void);//按姓名修改 void ChangeMarkByNumber(void);//按学号修改 void SaveLinkToFile(void);//保存文件 void DesplayMarkSegment(void);//打印分数 void CompositorByTotalMark(void);//最终结果 void login(void); int choose;/*用于接受用户的选择*/ /*主函数*/ int main() { login(); CreateHeadLink(); ReadInfoFormFile(); DesplayMenu(); } void login() { system("color fa"); char user[100]; char pass[100]; int counts = 0; printf("\n"); printf("----------------------Login-----------------------\n"); printf("-----------欢迎进入学生成绩管理系统---------------\n"); printf("~请输入用户名:\n"); scanf("%s",user); printf("~请输入密码:\n"); /* while((pass[counts++]=getch())!='\r') { putchar('*'); }*/ scanf("%s",pass); //pass[counts] = '\0'; printf("%s %s\n%d %d",user,pass,strcmp(user,USERNAME),strcmp(pass,PASSWORD)==0); if(strcmp(user,USERNAME)==0&&strcmp(pass,PASSWORD)==0) Sleep(50) ; else exit(1); } void ReadInfoFormFile(void)// 函数功能:从文件中读学生信息到链表中 { FILE *fp; STUDENT *p; fp=fopen("student.txt","r"); if(!fp) { printf("文件不存在\n"); return; } p=MallocNode(); while (fscanf(fp,"%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0) { InsertOneNode(p); p=MallocNode(); } fclose(fp); } void DesplayMenu(void)//函数功能:显示菜单,根据用户的输入 完成相应的功能 { system("cls"); STUDENT *p; printf("--------------------请选择相应功能--------------------\n\n"); printf("|-------------- 1 按班级输出学生成绩单 --------------|\n"); printf("| --------------2 按姓名查询 ------------- |\n"); printf("| --------------3 增加学生 -------------|\n"); printf("| --------------4 删除学生 -------------|\n"); printf("| --------------5 按班级修改学生成绩 -------------|\n"); // printf("| --------------6 按学期修改学生成绩 -------------|\n"); printf("| --------------6 保存所有学生信息 -------------|\n"); printf("| --------------7 显示不及格学生成绩 -------------|\n"); printf("| --------------8 按平均成绩排序并输出 -------------|\n"); printf("| --------------9 退出 ------------------|\n\n"); printf("-----------请输入你的选择,Enter确定\n"); scanf("%d",&choose);//取得用户的选择 switch(choose) { case 1: OutputInformation();//显示所有学生的信息 break; case 2: DesplayInfoBystudentName(); break; case 3: p=MallocNode();//先申请一个新结点 GetInformation(p);//要求用户输入信息到新结点中 InsertOneNode(p);//将新结点加到链表中 break; case 4: DeleteNodeBystudentNumber();//根据用户输入的学号删除该学生 break; case 5: ChangeMarkByName();//根据用户输入的姓名修改学生成绩 break; // case 6: // ChangeMarkByNumber();//根据用户输入的学号修改学生成绩 // break; case 6: SaveLinkToFile();//保存数据 break; case 7: DesplayMarkSegment();//显示不及格的学生成绩 break; case 8: CompositorByTotalMark();//按平均成绩排序 break; case 9: SaveLinkToFile();//保存数据后再退出 free(headLink); return ; break; default: break; } DesplayMenu();//递归调用 执行完上面的命令之后重新打印一下。 } void CreateHeadLink(void)//函数功能:建立链表表头 { STUDENT *p; p=(STUDENT*)malloc(sizeof(STUDENT)); headLink=p; p->next=NULL; } STUDENT *MallocNode(void)//函数功能:申请一个新结点,并将其初始化 { STUDENT *p; int i; p=(STUDENT*)malloc(sizeof(STUDENT)); if(p==NULL) return NULL; for(i=0; i<10; i++) p->studentNumber[i]='\0'; for(i=0; i<20; i++) p->studentName[i]='\0'; for(i=0; i<20; i++) p->className[i]='\0'; p->mark1=0.0; p->mark2=0.0; p->mark3=0.0; p->next=NULL; //数据初始化,保证不用的时候是0 return p; } void GetInformation(STUDENT *t)//函数功能:取得用户输入的学生信息 { printf("请输入学号:\n"); scanf("%s",t->studentNumber); printf("请输入姓名:\n"); scanf("%s",t->studentName); printf("请输入该生所在班级:\n"); scanf("%s",t->className); printf("请输入高数成绩:\n"); scanf("%f",&(t->mark1)); printf("请输入英语成绩:\n"); scanf("%f",&(t->mark2)); printf("请输入体育成绩:\n"); scanf("%f",&(t->mark3)); getch(); } /** //函数功能:在链表的结尾处增加一个节点 @t */ void InsertOneNode(STUDENT *t) { STUDENT *p; p=headLink; while(p->next) { p=p->next; } p->next=t;//遍历链表,尾插法,知道P的下一位是空,p的下一位是t } void DesplayInfoBystudentName(void)//函数功能:根据用户输入的学生姓名显示该学生的信息 { system("cls"); STUDENT *p; char studentName[20]; char flag=0; p=headLink->next; printf("请输入学生姓名:\n"); scanf("%s",studentName); while(p) { if(strcmp(p->studentName,studentName)==0) { printf("学号\t姓名\t班级\t高数\t英语\t体育\t总成绩\t平均成绩\n\n"); DesplayOneNode(p); flag=1; break; } p=p->next; } if(!flag) printf("对不起,不存在姓名为 %s 的学生\n",studentName); getch(); } void DesplayOneNode(STUDENT *t)//函数功能:输出一个结点的信息 { // system("cls"); printf("%s\t",t->studentNumber); printf("%s\t",t->studentName); printf("%s\t",t->className); printf("%.2f\t",t->mark1); printf("%.2f\t",t->mark2); printf("%.2f\t",t->mark3); printf("%.2f\t",t->mark1+t->mark2+t->mark3); printf("%.2f\t\n",(t->mark1+t->mark2+t->mark3)/3); } void DeleteNodeBystudentNumber(void)//函数功能:根据用户输入的学号删除该学生 { system("cls"); char studentNumber[10]; STUDENT *p,*q; char flag=0; printf("请输入要删除的学生学号:"); scanf("%s",studentNumber); p=headLink; q=headLink->next; while(q) { if(strcmp(q->studentNumber,studentNumber)==0) { p->next=q->next; free(q); flag=1; break; } p=p->next; q=q->next; } if(!flag) { printf("不存在该学号的学生\n"); getch(); return; } printf("成功删除\n"); getch(); } void OutputInformation(void)//函数功能:显示所有学生的信息 { system("cls"); STUDENT *p; p=headLink->next; if(p==NULL) { printf("现在没有该学生信息,请先输入学生信息\n\n"); getch(); return; } printf("学号\t姓名\t班级\t高数\t英语\t体育\t总成绩\t平均成绩\n\n"); while(p) { DesplayOneNode(p); p=p->next; } getch(); } void ChangeMarkByName(void)//函数功能:根据输入的班级修改成绩 { system("cls"); STUDENT *p; int a; char studentName[20]; char flag=0; float mark1,mark2,mark3; p=headLink->next; printf("请输入学生班级:\n"); scanf("%d",&a); printf("请输入学生姓名:\n"); scanf("%s",studentName); while(p) { if(strcmp(p->studentName,studentName)==0) { printf("请输入新的高数成绩:\n"); scanf("%f",&mark1); printf("请输入新的英语成绩:\n"); scanf("%f",&mark2); printf("请输入新的体育成绩:\n"); scanf("%f",&mark3); p->mark1=mark1; p->mark2=mark2; p->mark3=mark3; flag=1; printf("修改成功\n"); break; } p=p->next; } if(!flag) printf("对不起,不存在班级为 %s 的学生\n",studentName); getch(); } /*void ChangeMarkByNumber(void)//函数功能:根据输入的学期修改成绩 { system("cls"); STUDENT *p; int b; char studentNumber[20]; char flag=0; float mark1,mark2,mark3; p=headLink->next; printf("请输入学生所在学期:\n"); scanf("%d",&b); printf("请输入学生学号:\n"); scanf("%s",studentNumber); while(p) { if(strcmp(p->studentNumber,studentNumber)==0) { printf("请输入新的高数成绩:\n"); scanf("%f",&mark1); printf("请输入新的英语成绩:\n"); scanf("%f",&mark2); printf("请输入新的体育成绩:\n"); scanf("%f",&mark3); p->mark1=mark1; p->mark2=mark2; p->mark3=mark3; flag=1; printf("修改成功\n"); break; } p=p->next; } if(!flag) printf("对不起,不存在学期为 %s 的学生\n",studentNumber); getch(); }*/ void SaveLinkToFile(void)//函数功能:保存链表数据到文件中 { system("cls"); STUDENT *p; FILE *fp; p=headLink->next; if(p==NULL) { printf("现在没有学生信息,请先输入学生信息\n\n"); getch(); return; } fp=fopen("student.txt","w+"); if(!fp) { printf("文件不存在\n"); getch(); return; } while(p) { fprintf(fp,"%s %s %s %f %f %f\n",p->studentNumber,p->studentName,p->className,p->mark1,p->mark2,p->mark3); p=p->next; } fclose(fp); } void DesplayMarkSegment(void)//函数功能:不及格学生成绩 { system("cls"); STUDENT *p; int count=0; p=headLink->next; printf("60分以下(不及格)的学生成绩如下:\n"); printf("学号\t姓名\t班级\t高数\t英语\t体育\t总成绩\t平均成绩\n\n"); while(p) { if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10))))//只要有一科不及格就认为该生不及格 { count++; DesplayOneNode(p); } p=p->next; } printf("不及格的学生一共有%d人\n",count); getch(); } void CompositorByTotalMark(void)//函数功能:按平均成绩排序 { system("cls"); STUDENT exchange,*r,*p,*q; r=headLink->next; if(r==NULL) { printf("现在还没学生信息,请先输入学生信息\n"); getch(); return; } while(r)//两层while循环实现排序 { p=r; q=r->next; while(q) { if((q->mark1+q->mark2+q->mark3)>(p->mark1+p->mark2+p->mark3)) { strcpy(exchange.studentNumber,q->studentNumber);//先复制q结点信息到exchange strcpy(exchange.studentName,q->studentName); strcpy(exchange.className,q->className);//C语言风格字符串,用strcpy来交换 类似3个数交换 exchange.mark1=q->mark1; exchange.mark2=q->mark2; exchange.mark3=q->mark3;// 字符可以直接交换 strcpy(q->studentNumber,p->studentNumber);//再复制p结点信息到q strcpy(q->studentName,p->studentName); strcpy(q->className,p->className); q->mark1=p->mark1; q->mark2=p->mark2; q->mark3=p->mark3; strcpy(p->studentNumber,exchange.studentNumber);//最后复制exchange结点信息到p strcpy(p->studentName,exchange.studentName); strcpy(p->className,exchange.className); p->mark1=exchange.mark1; p->mark2=exchange.mark2; p->mark3=exchange.mark3; } q=q->next; } r=r->next; } OutputInformation(); }
#ifndef STUDENT_H_INCLUDED #define STUDENT_H_INCLUDED typedef struct STUDENT { char studentNumber[10];/*学生学号*/ char studentName[20];/*学生姓名*/ char className[20];/*班级名称*/ char yearName[20];/*学期名称*/ float mark1;/*高数成绩*/ float mark2;/*英语成绩*/ float mark3;/*体育 成绩*/ struct STUDENT *next; }STUDENT; #endif // STUDENT_H_INCLUDED