C语言学生管理系统
#include <stdio.h> #include<string.h> #include<stdlib.h> #define PRINT_ERROR_FILE(e)\ do\ {\ if(e==NULL)\ {\ printf("打开文件失败!\n");\ exit(-1);\ }\ }while(0) typedef struct _Grade { int id; //课程编号 char name[20]; //课程名称 double score;//学分 }Grade; typedef struct _Stu { Grade gb; int xuehao; char name[20]; char sex[5]; int Su_se; char dian_hua[12]; double normal_score; double lab_score; double shijuan_score; double sum_score; double result_xuefen; }Stu; typedef struct _Node { Stu s; struct _Node* next; }Node; Node* head=NULL; void Input_Message() { Node* cur=head; while(cur->next) { cur=cur->next; } if(head->next==NULL) { head->next=(Node*)malloc(sizeof(Node)); head->next->next=NULL; cur=head->next; } else { Node* temp=(Node*)malloc(sizeof(Node)); temp->next=NULL; cur->next=temp; cur=temp; } printf("请输入课程编号:"); scanf("%d",&cur->s.gb.id); printf("请输入课程名称:"); scanf("%s",cur->s.gb.name); printf("请输入课程学分:"); scanf("%lf",&cur->s.gb.score); printf("请输入学生姓名:"); scanf("%s",cur->s.name); printf("请输入学生学号:"); scanf("%d",&cur->s.xuehao); printf("请输入学生性别:"); scanf("%s",cur->s.sex); printf("请输入学生宿舍号码:"); scanf("%d",&cur->s.Su_se); printf("请输入学生电话:"); scanf("%s",cur->s.dian_hua); printf("请输入学生平时成绩:"); scanf("%lf",&cur->s.normal_score); printf("请输入学生实验成绩:"); scanf("%lf",&cur->s.lab_score); printf("请输入学生卷面成绩:"); scanf("%lf",&cur->s.shijuan_score); if(cur->s.lab_score==-1) { cur->s.sum_score=(cur->s.normal_score)*0.30+(cur->s.shijuan_score)*0.70; } else { cur->s.sum_score=(cur->s.normal_score)*0.15+(cur->s.lab_score)*0.15+(cur->s.shijuan_score)*0.7; } double t=cur->s.sum_score; if((t>=90)&&(t<=100)) { cur->s.result_xuefen=t; } else if ((t>=80)&&(t<90)) { cur->s.result_xuefen=t*0.8; } else if ((t>=70)&&(t<80)) { cur->s.result_xuefen=t*0.7; } else if ((t>=60)&&(t<70)) { cur->s.result_xuefen=t*0.6; } else if (t<60) { cur->s.result_xuefen=0.0; } } void Print_Info() { printf("课程编号 课程名称 课程学分 学号\t姓名\t性别\t宿舍\t电话\t\t平时成绩 实验成绩 卷面成绩 综合成绩 最后学分\n"); Node* cur=head->next; while(cur) { printf("%-8d %-8s %-8lf %-4d\t%-4s\t%-4s\t%-4d\t%-4s\t\t%-8.1lf %-8.1lf %-8.1lf %-8.1lf %-8.1lf\n",cur->s.gb.id,cur->s.gb.name, cur->s.gb.score, cur->s.xuehao,cur->s.name,cur->s.sex,cur->s.Su_se, cur->s.dian_hua,cur->s.normal_score,cur->s.lab_score,cur->s.shijuan_score, cur->s.sum_score,cur->s.sum_score); cur=cur->next; } } void Print_Single(Node* cur) { printf("课程编号 课程名称 课程学分 学号\t姓名\t性别\t宿舍\t电话\t\t平时成绩 实验成绩 卷面成绩 综合成绩 最后学分\n"); printf("%-8d %-8s %-8lf %-4d\t%-4s\t%-4s\t%-4d\t%-4s\t\t%-8.1lf %-8.1lf %-8.1lf %-8.1lf %-8.1lf\n",cur->s.gb.id,cur->s.gb.name, cur->s.gb.score, cur->s.xuehao,cur->s.name,cur->s.sex,cur->s.Su_se, cur->s.dian_hua,cur->s.normal_score,cur->s.lab_score,cur->s.shijuan_score, cur->s.sum_score,cur->s.sum_score); } void Find_Info() { Node* cur=head->next; printf("请输入要查询学生的姓名或者学号\n首先请选择查询方式:1.姓名. 2.学号\n"); int x; scanf("%d",&x); if(x==1) { printf("请输入要查询的学生姓名:"); char name[20]; scanf("%s",name); while(cur) { if(strcmp(name,cur->s.name)==0) { printf("找到了该学生,接下来打印该学生信息\n"); Print_Single(cur); return; } cur=cur->next; } printf("没有找到该学生信息\n"); return; } else { printf("请输入要查询的学生学号:"); int id; scanf("%d",&id); while(cur) { if(id==cur->s.xuehao) { printf("找到了该学生,接下来打印该学生信息\n"); Print_Single(cur); return; } cur=cur->next; } printf("没有找到该学生信息\n"); return; } } Node* Find_By_Number(int id) { Node* cur=head->next; while(cur) { if(cur->s.xuehao==id) { //Print_Single(cur); return cur; } cur=cur->next; } printf("找不到这个学号对应的学生信息\n"); return NULL; } Node* Find_By_Name(char * s) { Node* cur=head->next; while(cur) { if(strcmp(s,cur->s.name)==0) { //Print_Single(cur); return cur; } cur=cur->next; } printf("没有这位学生\n"); return NULL; } void Del_Stu(int id) { //删除的前提是你得必须先找到该学生. Node* cur=Find_By_Number(id); if(!cur)return; if(cur->next==NULL) { free(cur); printf("删除成功\n"); return; } //找到所查找节点的前一个节点 Node* temp=head; while(temp->next) { if(temp->next->s.xuehao==id) { temp->next=cur->next; cur->next=NULL; free(cur); printf("删除aaa成功\n"); return; } temp=temp->next; } } void Result(Node* head,int n) { Node* pre,*q,*p; for (int i=0;i<n-1;i++) { pre=head; p=head->next; q=p->next; for(int j=0;j<n-(i+1);j++) { if(p->s.result_xuefen>q->s.result_xuefen) { pre->next=q; p->next=q->next; q->next=p; pre=q; q=p->next; continue; } pre=pre->next; p=p->next; q=q->next; } } } int GetLength(Node* head) { Node* cur=head->next; int count=0; while(cur) { count++; cur=cur->next; } return count; } void Write_File(char * filename) { Node* cur=head->next; FILE* fs=fopen(filename,"w+"); PRINT_ERROR_FILE(fs); while(cur) { fwrite((void*)&cur->s,sizeof(Stu),1,fs); cur=cur->next; } printf("写入成功\n"); fclose(fs); } Node* Read_File(char* filename) { head=(Node*)malloc(sizeof(Node)); head->next=NULL; FILE* fs=fopen(filename,"r+"); PRINT_ERROR_FILE(fs); Node* cur=(Node*)malloc(sizeof(Node)); while(fread( ((void*)&cur->s),sizeof(Stu),1,fs ) ) { cur->next=head->next; head->next=cur; cur=(Node*)malloc(sizeof(Node)); } free(cur); return head; } int main() { int a; head=(Node*)malloc(sizeof(Node)); head->next=NULL; char filename[20]; while(1) { printf("\t\t\t\t\t\t学生单科成绩查询系统\n"); printf("请先选择功能:\n"); printf("1.录入学生信息\n"); printf("2.打印学生信息\n"); printf("3.查询学生信息\n"); printf("4.删除学生\n"); printf("5.综合排序\n"); printf("6.读数据到文件\n"); printf("7.读文件到内存\n"); char ch=getch(); switch(ch) { case '1': Input_Message(); break; case '2': Print_Info(); break; case '3': printf("请选择查询方式:1.通过学号查询.2.通过姓名查询\n"); int x; scanf("%x",&x); if(x==1) { int temp; printf("请输入学号:"); scanf("%d",&temp); Node*t= Find_By_Number(temp); if(t==NULL)break; printf("该学生信息情况如下\n"); Print_Single(t); } else { char name[20]; scanf("%s",name); Node*t= Find_By_Name(name); if(t==NULL)break; Print_Single(t); } break; case '4': printf("请输入要删除的学生学号:"); int id; scanf("%d",&id); Node *cur=Find_By_Number(id); if(cur==NULL)break; Del_Stu(id); break; case '5': a=GetLength(head); Result(head,a); break; case '6': printf("请输入文件的名字:"); scanf("%s",filename); Write_File(filename); break; case '7': Read_File(filename); Print_Info(); break; } } return 0; }