学生成绩管理(链表)
超好的学生成绩管理系统实验报告顺序表链表
数据结构实验报告一.具体设计Ⅰ顺序表㈠存储结构定义采用了两个结构体,其中Student结构体用于存储学生的各项信息,包括学号int num;姓名char name[20];英语成绩float english;数学成绩float math;数据结构成绩float database;总分float sum;平均分float average; 顺序表的结构体sqlist中包含的数据项是Student结构体,还有存储当前长度的int length;及当前分配的存储容量的int listsize;㈡函数功能定义及具体功能介绍⑴录入信息int Input(sqlist *L)每次输入学生的所有信息,输入完后提示是否继续输入⑵显示所有学生信息int Display(sqlist *L)⑶插入一条记录到表尾void Insert(sqlist *L)⑷删除一条记录int Delete(sqlist *L)包括1.按姓名删除2.按学号删除⑸统计成绩int Statistic(sqlist *L)包括全班平均成绩,各科平均成绩,总分最高分,总分最低分,各科最高分,各科最低分以及各科及格率⑹查找int Search(sqlist *L)查找方法包括1.顺序查找2.二分查找按查找内容又包括1.按学号查找2.按姓名查找,若查找成功则显示查找到的学生信息,若查找失败则提示“查找失败!”⑺排序int Sort(sqlist *L)排序方法包括1.直接插入排序2.折半插入排序3.冒泡排序4.直接选择排序,排序内容包括1.按学号排序2.按英语成绩排序3.按高数成绩排序4.按数据结构成绩排序5.按总分排序(0)退出程序void tuichu(sqlist *L)释放占用的内存空间,显示"谢谢使用!",然后关闭所有文件,终止正在进行的程序(9) 主菜单int menu(),每次进行完一次功能实现后再次弹出,方便用户使用(10) 主函数int main(),用switch语句根据用户的选择进行相应的操作㈢具体设计思路及过程⑴录入信息int Input(sqlist *L),初始length为0,每录入一个学生length加一,然后显示提示信息是否继续,若继续则要再录入,所以要把这个整体的外面再套一层while循环,但是在写的过程中也遇到了一个困难,还没有输入继续y,就让输入学生信息,通过百度,知道了C有一个输入的缓冲区,所以在每次输入前都请空了缓冲区,防止读入缓冲区余下的内容。
双向链表做学生分数管理
/**************************************************双向循环链表的操作**************************************************/#include<stdio.h>#include<malloc.h>#define LEN sizeof(struct student)struct student /*双向循环链表*/{long num;float score;struct student *last, *next;/*last、next指向前、后一个链表地址*/};/*创建有n个节点的链表*/struct student *creat(){int i, n;struct student *head, *p1, *p2; //p1当前指针printf("\n请输入要创建的学生成绩个数n:");scanf("%d", &n);printf("\n请输入学号分数\n");for (i = 0; i < n; i++){if (i == 0){p1 = p2 = (struct student*)malloc(LEN);head = p1;if (head == NULL) /*检测动态存储空间是否开辟成功*/ printf("创建失败\n");else{scanf("%ld %f", &p1->num, &p1->score);p2->last = NULL;p2->next = NULL;}}else{p1 = (struct student*)malloc(LEN);if (p1 == NULL) /*检测动态存储空间是否开辟成功*/ printf("创建失败\n");else{scanf("%ld %f", &p1->num, &p1->score);p2->next = p1;p1->last = p2;p2 = p1;p2->next = NULL;}}}if (i == n) /*成功创建n组数据*/{printf("成功创建%d个学生成绩\n", n);head->last = p2;p2->next = head;}elseprintf("创建%d个学生成绩失败\n", n);return(head);};/*打印链表*/void print(struct student *head){struct student *p;printf("学生成绩记录为:\n");printf("学号分数\n");p = head;if (head != NULL) /*检测当前链表是否为空*/do{printf("%ld %f\n", p->num, p->score);p = p->next;} while (p != head);elseprintf("没有学生数据\n");}/*查询分数*/void search(struct student *head){struct student *p = head;long n = 0;int flag = 0; /*flag标志位,n需要查询的学号*/printf("请输入要查询学生的学号:");scanf("%ld", &n);if(p==NULL)printf("这是一个空表");else{do{if (p->num == n){flag = 1; /*成功找到*/break;}elseflag = 0;p = p->next;} while (p != head);if (flag == 1)printf("学号为%ld的学生的成绩为:%f\n", n, p->score);elseprintf("没有学号为%ld的学生的成绩\n", n);}}/*修改分数*/void modify(struct student *head){struct student *p = head;long n = 0, flag = 0;printf("请输入要修改学生的学号:");scanf("%ld", &n);do /*查找需要修改的学号*/{if (p->num == n){flag = 1;break;}elseflag = 0;p = p->next;} while (p != head);if (flag == 1){printf("学号为%ld的学生的当前成绩为:%f\n", n, p->score);printf("请输入修改后的学生成绩score:");scanf("%f", &p->score);printf("修改后学号为%ld的学生的成绩为:%f\n", n, p->score);}elseprintf("没有学号为%ld的学生的数据\n", n);}/*插入数据*/struct student *insert(struct student *head){struct student *p1, *p2, *p = head;long n;int flag = 0, fangshi = 0;/*flag查找标志位,m为0在表头插入,m为1在学号n后插入*/ loop:printf("fangshi为0在表头插入,fangshi为1在学号n后插入。
学生成绩管理链表C代码
学生成绩管理#include <stdio.h>#include <stdlib.h>#include <Windows.h>#include <string.h>#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef struct{char num[10]; // 学号char name[20]; // 姓名float score; // 成绩}student;typedef student ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;typedef LinkList Sta;//创建一个空表Sta CreateList_L(LinkList L){L=(LinkList)malloc(sizeof(LNode));if(!L) return OVERFLOW;L->next=NULL;return L;}Status ListInsert_L(LinkList L,int i,ElemType e)//在带头结点的单链表L中第i个位置前插入某个学生的信息{LinkList p,s;p=L;int j=0;while(p&&j<i-1){p=p->next;++j;}if(!p||j>i-1) return ERROR;s=(LinkList)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;return OK;}//删除学生信息Status ListDelete_L(LinkList L,int i,ElemType *e) {LinkList p=L;int j=0;while(p->next&&j<i-1){p=p->next;++j;}if(!(p->next)||j>i-1)return ERROR;LinkList q=NULL;q=p->next;p->next=q->next;*e=q->data;free(q);return OK;}Status LocateElem_L(LinkList L,student e){if(L==NULL)printf("OK");LinkList p=L->next;if(p==NULL)printf("OK");int i=1;while(p){if(strcmp(p->data.num,e.num)==0) return i;p=p->next;i++;}return 0;}Status GetElem(LinkList L,int i,ElemType *e) // 访问链表,找到i位置的数据域,返回给e {LinkList p;p=L->next;int j=1;while(p&&j<i){p=p->next;++j;}if(!p||j>i) return ERROR;*e=p->data;return OK;}Status ListLength(LinkList L){int i=0;LinkList p=L->next;while(p){i++;p=p->next;}return i;}Status input(char *stu,LinkList L){int n;student s;FILE *fp;fp=fopen(stu,"w");if(fp == NULL){perror("fopen"); // 文件打开失败,打印错误信息return -1;}printf("\n\t请输入学生人数:");scanf("%d",&n);printf("\n\t请输入学生学号、姓名和成绩\n");for(int i=1;i<=n;i++){printf("\n\t学号:");scanf("%s",s.num);printf("\t姓名:");scanf("%s",);printf("\t成绩:");scanf("%f",&s.score);printf("\n");fprintf(fp,"%s %s %f\n",s.num,,s.score);ListInsert_L(L,i,s);}printf("\n\t输入完毕!\n\t");system("pause");fclose(fp);return OK;}void load(char *stu,LinkList L){student s;int i=1;FILE *fp;fp=fopen(stu,"r");if(fp == NULL){printf("can't open file!") ; // 文件打开失败,打印错误信息exit(0);}printf("\n\t\t----学生成绩信息表----\n\n");printf("\n\t\t学号\t姓名\t成绩\n");while(fscanf(fp,"%s%s%f",s.num,,&s.score)!=EOF){ListInsert_L(L,i,s);printf("\n\t\t%s\t%s\t%f\n",s.num,,s.score);i++;}fclose(fp);}//保存Status save(char *stu,LinkList L){LinkList p=L->next;FILE *fp;fp=fopen(stu,"w");if(fp == NULL){perror("fopen"); // 文件打开失败,打印错误信息return -1;}while(p){fprintf(fp,"%s\t%s\t%f\n",p->data.num,p->,p->data.score);p=p->next;}fclose(fp);return OK;}//输出单个学生信息Status Single_Out(student *e){printf("\n\t%s\t%s\t%f",e->num,e->name,e->score);return OK;}//遍历链表并输出void Listtraverse(LinkList L){int i=1;LinkList s=L->next;if(s==NULL)printf("\n用户尚未录入任何数据!!\n");else{printf("\n\t\t--当前全部学生信息如下--\n");printf("\n\t\t学号\t姓名\t成绩\n");while(s){printf("\n\t%d\t",i);printf(s->data.num);printf("\t");printf(s->);printf("\t");printf("%f",s->data.score);printf("\n");s=s->next;i++;}}}int main(){int ID;int keywords;printf("\n\n\t用户名:");scanf("%d",&ID);printf("\n\n\t用户密码:");scanf("%d",&keywords);if(ID==123&&keywords==123){fun();}else{printf("\n\n\t用户名或密码输入错误,系统拒绝访问\n\t请按任意键退出");}system("pause");return 0;}void fun(){system("cls");student s;LinkList L=CreateList_L(L);int i,a;char c;int flag=1;char addlist[30];printf("\n\n\t请输入成绩表的文件名:");scanf("%s",addlist);FILE *fp;fp=fopen(addlist,"r");if(fp == NULL){printf("\n\n\t成绩表不存在,建立一个新的成绩表(Y/N)?");scanf(" %c",&c);if(c=='Y'||c=='y'){fclose(fp);input(addlist,L);}}else{fclose(fp);load(addlist,L);printf("\t\t\n");system("pause");}while(flag){system("cls"); //清屏printf("\n\t---\t 欢迎使用学生管理系统\t---\t\n\n");printf("\n\t\t -------------------- \t\t\n\n");printf("\t|*\t 1 输入学生信息\n\n");printf("\t|*\t 2 删除学生信息\n\n");printf("\t|*\t 3 修改学生信息\n\n");printf("\t|*\t 4 按学号查找学生\n\n");printf("\t|*\t 5 输出成绩表\n\n");printf("\t|*\t 6 保存\n\n");printf("\t|*\t 7 退出\n\n");printf("\t请输入序号选择功能:");scanf("%d",&a);switch(a){case 1:system("cls");printf("\n\t请输入插入位置:");scanf("%d",&i);printf("\n\t请输入学生信息");printf("\n\t学号:");scanf("%s",s.num);printf("\n\t姓名:");scanf("%s",);printf("\n\t成绩:");scanf("%f",&s.score);if(ListInsert_L(L,i,s)){printf("\n\t插入成功\n");}else printf("\n\t插入失败\n");system("pause");break;case 2:system("cls");printf("\n\t请输入要删除的学生学号:");scanf("%s",s.num);i=LocateElem_L(L,s);if(i){if(ListDelete_L(L,i,&s))printf("\n\n\t删除成功!");else printf("\n\n\t删除失败!");}else printf("\n\n\t学号不存在,请核对后输入!");system("pause");break;case 3:system("cls");printf("\n\t请输入要修改的学生学号:");scanf("%s",s.num);i=LocateElem_L(L,s);if(i){printf("\n\n\t确实要修改么Y/N?");scanf(" %c",&c);if(c=='y'||c=='Y'){ListDelete_L(L,i,&s);printf("\n\n\t请输入修改后的信息:\n");printf("\n\t学号:");scanf("%s",s.num);printf("\t姓名:");scanf("%s",);printf("\t成绩:");scanf("%f",&s.score);ListInsert_L(L,i,s);printf("\n\t修改成功!\n\t");}}else printf("\n\n\t学号为%s的学生不存在!!\n",s.num);system("pause");break;case 4:system("cls");printf("\n\n\t请输入要查找的学生学号:");scanf("%s",s.num);i=LocateElem_L(L,s);GetElem(L,i,&s);if(i){Single_Out(&s);system("pause");}else{printf("\n\n\n\t学号为%s的学生不存在,请核对后输入!!\n",s.num);system("pause");}break;case 5:system("cls");Listtraverse(L);system("pause");break;case 6:system("cls");printf("\n\n\t请输入文件名称:");scanf("%s",addlist);save(addlist,L);printf("\n\n\t保存成功!\n\n\t");system("pause");break;case 7:flag=0;break;}}}。
学生成绩管理系统(链表版)
《C语言应用》实验报告题目学生成绩管理系统(链表版)(1)能完成学生成绩的插入、查询、修改、删除、输出等功能;(2)采用单链表存储结构实现;(3)所有数据以外部文件方式保存第2章第2章总体设计2。
1 系统的程序流程图绘制一个系统的总体程序流程图,主要展示系统从开始以后,可以经过哪些流程,最后结束。
按姓名修改某位同学的成绩按姓名修改某位同学的成绩输出链表内容输出链表内容2。
2系统的全局变量和常量系统全局变量int n;char a;头文件:#include "stdio.h"#include ”time。
h"#include "string。
h”#include ”stdlib.h"#include ”conio。
h"2。
3系统的函数介绍把系统中的每个函数的原型列出来,解释一下函数的返回值及形式参数的含义;最后,再介绍一下每个函数的功能。
void Create(int n)//创建链表void List()//输出链表内容void list()//输出链表所有内容void save()//文件保存void save1() //文件保存void read()//文件读取void read1()//文件读取void SA VE(){ //保存到可浏览文件void SA VE1() //保存到可浏览文件void sort_data_copy(Lstu *p,Lstu *s)//交换排序时的值void sort()//对初始成绩进行排序void sort1()//对所有数据进行排序void search_print(Lstu *p)//输出查找信息void search_choose()//选择按分数段查找方式void search()//查找void modify_choose(Lstu *p,int n)//选择修改方式void modify()//按姓名修改void Insert()//按序号插入void del() //按姓名删除void statistics()//成绩统计int menu() //菜单(主界面)第3章第3章详细设计按函数,写出函数的原型声明,并画出每个函数的程序流程图。
C语言写的学生成绩管理系统(链表)
#include<stdio.h>#include<string.h>#include<stdlib.h>struct stud{long num;char name[20];float sx;float dx;float ts;float dl;float cx;float zf;float pj;};struct studcode{struct stud student;struct studcode *next;};void menu();void input(struct studcode **);void output(struct studcode *);void binsearch(struct studcode *);void insert(struct studcode **);void delet(struct studcode **);void good(struct studcode *);void fail(struct studcode *);void sort(struct studcode *);void back();void main(){char choose;int flag=1;struct studcode *head;head=NULL;printf("请先录入学生成绩信息\n");printf("输入学生学号姓名高数、英语读写、英语听说、计算机导论和程序设计的成绩\n");input(&head);while (flag){system("cls");menu();printf("请选择:");getchar();choose=getchar();switch(choose){case '1':output(head);back();break;case '2':binsearch(head);back();break;case '3':insert(&head);output(head);back();break;case '4':delet(&head);output(head);back();break;case '5':good(head);back();break;case '6':fail(head);back();break;case '7':sort(head);output(head);back();break;case '0':flag=0;printf("\n *** The End! ***\n");printf("\n ####感谢使用,欢迎再次登录,拜拜!####\n");break;default: printf("\n Wrong Selection !(选择错误,请重选)\n");back();}}}void menu(){printf(" \n 学生成绩统计与分析系统\n");printf(" \n 菜单\n\n");printf(" \n 1. 显示所有学生的信息\n");printf(" \n 2. 查找某学号的学生信息\n");printf(" \n 3. 插入某学生的信息 \n");printf(" \n 4. 删除某学号学生的信息\n");printf(" \n 5. 统计各门课程成绩在90分以上学生所占百分比\n");printf(" \n 6. 统计各门课程成绩在60分以下学生所占百分比 \n");printf(" \n 7. 按总分降序排序,依高低排出名次 \n");printf(" \n 0. 退出 \n\n");}void back(){int x;printf("\n");do{printf("按1返回菜单界面:");scanf("%d",&x);}while(x!=1);}void input(struct studcode **headp){struct studcode *p;while(1){p=(struct studcode *)malloc(sizeof(struct studcode));scanf("%ld",&p->student.num);if(p->student.num==0) break;scanf("%s%f%f%f%f%f",&p->,&p->student.sx,&p->student.dx,&p->stu dent.ts,&p->student.dl,&p->student.cx);p->student.zf=p->student.sx+p->student.dx+p->student.ts+p->student.dl+p->st udent.cx;p->student.pj=p->student.zf/5;p->next=*headp;*headp=p;}}void output(struct studcode *head){struct studcode *p;p=head;printf("学号\t姓名\t高数\t读写\t听说\t导论\t程序\t总分\t平均分\n");while(p!=NULL){printf("%-ld\t%-4s\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\ n",p->student.num,p->,p->student.sx,p->student.dx,p->student.ts,p-> student.dl,p->student.cx,p->student.zf,p->student.pj);p=p->next;}printf("\n");}void binsearch(struct studcode *head){struct studcode *p;int k=1;long x;p=head;printf("请输入需要查找的学生的学号:");scanf("%ld",&x);printf("\n");while(p!=NULL){if(p->student.num==x){printf("该学生信息如下:\n");printf("学号\t姓名\t高数\t读写\t听说\t导论\t程序\t总分\t平均分\n");printf("%-ld\t%-4s\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\n",p ->student.num,p->,p->student.sx,p->student.dx,p->student.ts,p->student.dl,p->stude nt.cx,p->student.zf,p->student.pj);k=0;break;}p=p->next;}if(k) printf("没有此学生的信息\n");}void insert(struct studcode **headp){struct studcode *p;p=(struct studcode *)malloc(sizeof (struct studcode));printf("请输入你想插入的学生的信息\n");scanf("%ld%s%f%f%f%f%f",&p->student.num,&p->,&p->student.sx,&p->student.dx,&p->student.ts,&p->student.dl,&p->student.cx);p->student.zf=p->student.sx+p->student.dx+p->student.ts+p->student.dl+p->st udent.cx;p->student.pj=p->student.zf/5;p->next=*headp;*headp=p;printf("*****插入成功*****\n");}void delet(struct studcode **headp){struct studcode *p,*last;long x;p=*headp;printf("请输入你要删除的学生的学号:");scanf("%ld",&x);while(p->student.num!=x&&p->next!=NULL){last=p;p=p->next;}if(p->student.num==x){if(p==*headp)*headp=p->next;elselast->next=p->next;free(p);printf("\n*****删除成功*****\n");}else printf("\n***删除失败,无该学生信息***\n");}void good(struct studcode *head){struct studcode *p;int x1,x2,x3,x4,x5,k;float y1,y2,y3,y4,y5;x1=x2=x3=x4=x5=k=0;p=head;while(p!=NULL){k++;if(p->student.sx>=90) x1++;if(p->student.dx>=90) x2++;if(p->student.ts>=90) x3++;if(p->student.dl>=90) x4++;if(p->student.cx>=90) x5++;p=p->next;}y1=(float)x1/k;y2=(float)x2/k;y3=(float)x3/k;y4=(float)x4/k;y5=(float)x5/k;printf("高数\t读写\t听说\t导论\t程序\n");printf("%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\n",y1,y2,y3,y4,y5); }void fail(struct studcode *head){struct studcode *p;int x1,x2,x3,x4,x5,k;float y1,y2,y3,y4,y5;x1=x2=x3=x4=x5=k=0;p=head;while(p!=NULL){k++;if(p->student.sx<60) x1++;if(p->student.dx<60) x2++;if(p->student.ts<60) x3++;if(p->student.dl<60) x4++;if(p->student.cx<60) x5++;p=p->next;}y1=(float)x1/k;y2=(float)x2/k;y3=(float)x3/k;y4=(float)x4/k;y5=(float)x5/k;printf("高数\t读写\t听说\t导论\t程序\n");printf("%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\n",y1,y2,y3,y4,y5); }void sort(struct studcode *head){struct stud temp;int i,j,n;struct studcode *p,*p1,*p2;n=0;p=head;while(p!=NULL){n++;p=p->next;}for(p1=head,i=0;i<n-1;i++,p1=p1->next)for(p2=p1->next,j=i+1;j<n;j++,p2=p2->next)if(p1->student.zf<p2->student.zf){temp=p2->student;p2->student=p1->student;p1->student=temp;}printf("\n*****排序成功*****\n"); }。
学生成绩链表处理
学生成绩链表处理
学生成绩链表处理是一种重要的数据处理任务,它允许学校查看和管理学生的成绩。
学校根据成绩决定学生是否能够参加课程,或者是否可以获得奖学金或毕业文凭。
在学校领域,以链表形式记录学生成绩是一种常用的数据处理方式,它可以方便地存储管理大量学生成绩。
链表概述
链表是一种常用的数据结构,其中的每个数据元素称为结点,结点中存储有具体的信息,比如学生的姓名、学号、考试及其他成绩等。
各个结点之间以“指针”的形式相互关联,形成一个有序的链表,可以实现快速地查询和处理学生成绩。
数据入口和处理
在实际操作中,数据的输入是非常重要的。
首先,可以通过学校或教育局提供的网上入口,将学生的考试成绩及其他信息输入到链表中。
此外,还可以利用软件编程的方式手动进行输入,以达到快速建模的目的。
完成输入后,学校可以利用现代计算技术将学生的考试成绩和其他信息链接起来,组成一个完整的链表。
链表中的结点可以按照每个学生的考试成绩,按年级或班级进行排序,便于学校评估和管理各个学生的表现。
总结
学生成绩链表处理是一种重要的数据处理工作,它可以帮助学校
管理记录学生的考试成绩及其他信息。
链表是数据处理的常用数据结构,其中的结点可以按照每个学生的考试成绩,按年级或班级进行排序。
通过网络和编程手段,可以将学生成绩存储在链表中,以便学校可以便捷地管理学生成绩。
c语言学生成绩治理系统(链表版)
#include <>#include <>#include <>#include <>#include <>#include <>#define YES 1#define NO 0typedef struct{int num;float math_score;float engl_score;float chin_score;float phy_score;float chem_score;double aver_score;double sum_score;char sex;}StudentDate;...");printf("\n\n\n\n\t\t\t┏━━━━━━━━━━┓\n");printf("\t\t\t┃┃\n");printf("\t\t\t┗━━━━━━━━━━┛\n");gotoxy(26, 7);for ( i = 0; i < 10; i++){printf("█");Sleep(100);}pHead = createListHead();readListWithFile(pHead, "");return pHead;}Student *createListHead(void){Student *pHead;pHead = (List)malloc(sizeof(Student));pHead->next = NULL;return pHead;}void readListWithFile(Student *pHead, char *file_name) {FILE *fp;Student *p1, *p2;int count, rank = 0;StudentDate dat;char stu_name[20];fp = fopen(file_name, "r");if (fp == NULL){fp = fopen(file_name, "w");fclose(fp);return;}fseek(fp, 0L, 2);count = ftell(fp);p1 = pHead;fp = fopen(file_name, "r");while (!feof(fp)){p2 = (List)malloc(sizeof(Student));fscanf(fp, "%d%s %c%f%f%f%f%f\n", &p2->, p2->name, &p2->, &p2->, &p2->, &p2->, &p2->, &p2->;p2-> = (double)(p2-> + p2-> + p2-> +p2-> + p2->;p2-> = p2-> / 5;p2->next = NULL;p1->next = p2;p1 = p2;if (ftell(fp) == count){break;}}f %.1f %.1f %.1f %.1f\n", p1->, p1->name, p1->, p1->,p1->, p1->, p1->, p1->;printf("是不是继续添加?(Y/N)");bum = getch();if (bum == 'n' || bum == 'N'){break;}}f %.1f %.1f %.1f %.1f\n", pHead->, pHead->name, pHead->, pHead->,pHead->, pHead->, pHead->, pHead->;pHead = pHead->next;}fclose(fp);}void alterStudentInfo(Student *pHead){int bum, count = 0, j = 0;int num;char student_name[20];Student *p1 = pHead->next;system("title 学生成绩统计系统-修改");f,没有达抵达到平均分的学生有┃\n", aver_score[0]);printf(" ┣━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┫\n");printf(" ┃学号┃姓名┃性别┃语文┃数学┃英语┃化学┃物理┃平均分┃总分┃名次┃\n");printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");while (p1){if (p1-> < aver_score[0]){if (bad == 0){printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}else{printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}bad = 1;}p1 = p1->next;}bad = 0;p1 = pHead->next;printf(" ┣━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┫\n");printf(" ┃\t\t\t数学的平均分为:%.1f,没有达抵达到平均分的学生有┃\n", aver_score[1]);printf(" ┣━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┫\n");printf(" ┃学号┃姓名┃性别┃语文┃数学┃英语┃化学┃物理┃平均分┃总分┃名次┃\n");printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");while (p1){if (p1-> < aver_score[1]){if (bad == 0){printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}else{printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}bad = 1;}p1 = p1->next;}bad = 0;p1 = pHead->next;printf(" ┣━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┫\n");printf(" ┃\t\t\t英语的平均分为:%.1f,没有达抵达到平均分的学生有┃\n", aver_score[2]);printf(" ┣━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┫\n");printf(" ┃学号┃姓名┃性别┃语文┃数学┃英语┃化学┃物理┃平均分┃总分┃名次┃\n");printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");while (p1){if (p1-> < aver_score[2]){if (bad == 0){printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}else{printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}bad = 1;}p1 = p1->next;}bad = 0;p1 = pHead->next;printf(" ┣━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┫\n");printf(" ┃\t\t\t化学的平均分为:%.1f,没有达抵达到平均分的学生有┃\n", aver_score[3]);printf(" ┣━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┫\n");printf(" ┃学号┃姓名┃性别┃语文┃数学┃英语┃化学┃物理┃平均分┃总分┃名次┃\n");printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");while (p1){if (p1-> < aver_score[3]){if (bad == 0){printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}else{printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}bad = 1;}p1 = p1->next;}bad = 0;p1 = pHead->next;printf(" ┣━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┫\n");printf(" ┃\t\t\t物理的平均分为:%.1f,没有达抵达到平均分的学生有┃\n", aver_score[4]);printf(" ┣━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┫\n");printf(" ┃学号┃姓名┃性别┃语文┃数学┃英语┃化学┃物理┃平均分┃总分┃名次┃\n");printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");while (p1){if (p1-> < aver_score[4]){if (bad == 0){printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}else{printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}bad = 1;}p1 = p1->next;}printf(" ┗━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┛\n");printf("\t\t\t\t\t\t该班一共%d个人!", count);}else{if (bum == 2){bad = 0;printf("\n\n ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf(" ┃\t\t\t\t语文成绩大于90分或小于60的学生有┃\n");printf(" ┣━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┫\n");printf(" ┃学号┃姓名┃性别┃语文┃数学┃英语┃化学┃物理┃平均分┃总分┃名次┃\n");printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");p1 = pHead->next;while (p1){if (p1-> < 60 || p1-> >= 90){if (bad == 0){printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}else{printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}bad = 1;}p1 = p1->next;}bad = 0;printf(" ┣━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┫\n");printf(" ┃\t\t\t\t数学成绩大于90分或小于60的学生有┃\n");printf(" ┣━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┫\n");printf(" ┃学号┃姓名┃性别┃语文┃数学┃英语┃化学┃物理┃平均分┃总分┃名次┃\n");printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");p1 = pHead->next;while (p1){if (p1-> < 60 || p1-> >= 90){if (bad == 0){printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}else{printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}bad = 1;}p1 = p1->next;}bad = 0;printf(" ┣━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┫\n");printf(" ┃\t\t\t\t英语成绩大于90分或小于60的学生有┃\n");printf(" ┣━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┫\n");printf(" ┃学号┃姓名┃性别┃语文┃数学┃英语┃化学┃物理┃平均分┃总分┃名次┃\n");printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");p1 = pHead->next;while (p1){if (p1-> < 60 || p1-> >= 90){if (bad == 0){printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}else{printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}bad = 1;}p1 = p1->next;}bad = 0;printf(" ┣━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┫\n");printf(" ┃\t\t\t\t化学成绩大于90分或小于60的学生有┃\n");printf(" ┣━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┫\n");printf(" ┃学号┃姓名┃性别┃语文┃数学┃英语┃化学┃物理┃平均分┃总分┃名次┃\n");printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");p1 = pHead->next;while (p1){if (p1-> < 60 || p1-> >= 90){if (bad == 0){printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃%┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}else{printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}bad = 1;}p1 = p1->next;}bad = 0;printf(" ┣━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┫\n");printf(" ┃\t\t\t\t物理成绩大于90分或小于60的学生有┃\n");printf(" ┣━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┫\n");printf(" ┃学号┃姓名┃性别┃语文┃数学┃英语┃化学┃物理┃平均分┃总分┃名次┃\n");printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");p1 = pHead->next;while (p1){if (p1-> < 60 || p1-> >= 90){if (bad == 0){printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}else{printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");printf(" ┃%-5d┃%-6s ┃%c ┃% ┃% ┃% ┃% ┃% ┃% ┃% ┃%-3d┃\n", p1->,p1->name, p1->, p1->, p1->,p1->, p1->, p1->, p1->, p1->, p1->rank);}bad = 1;}p1 = p1->next;}printf(" ┗━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┛\n");}else{if (bum == 3){return;}else{statisStudentInfo(pHead);}}}getch();}int statisMenu(void){int bum;system("CLS");printf("\n\n\n");printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("\t\t┃以什么方式统计学生信息?┃\n");printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");printf("\t\t┃ 1 按平均分┃\n");printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");printf("\t\t┃ 2 按是不是合格┃\n");printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");printf("\t\t┃ 3 返回主菜单┃\n");printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请按键选择:");bum = (int)(getch() - '0');system("CLS");return bum;}void inputData(Student *pHead, Student *node){Student *p1 = node, *p2, *p3 = pHead;system("CLS");printf("\n\n\t请依次输入学生的学号、姓名、性别、语文、数学、英语、化学、物理成绩\n");printf("\t注意:姓名不能有空格,性别男用M表示,女佣W表示,\n\t各科成绩应该大于0小于100,输入数据时请用空格隔开\n");scanf("%d%s %c%f%f%f%f%f", &p1->, p1->name, &p1->, &p1->, &p1->, &p1->, &p1->, &p1->;// 判定输入的学号是不是已经存在p2 = p3->next;while (1){if (p2 == NULL){break;}if (p2-> == p1-> && p2 != node){printf("该学号已存在,请从头输入学号:");scanf("%d", &p1->;p2 = p3->next;}else{p2 = p2->next;}}//性别是不是合法while (1){if (p1-> != 'W'&& p1-> != 'M'){p1-> = getchar();printf("性别输入不合法,请从头输入: ");p1-> = getchar();}else{break;}}//成绩是不是合法while (1){if (p1-><0 || p1-> >100){printf("语文成绩输入不合法,请从头输入:");scanf("%f", &p1->;}if (p1-><0 || p1-> >100){printf("数学成绩输入不合法,请从头输入:");scanf("%f", &p1->;}if (p1-><0 || p1-> >100){printf("英语成绩输入不合法,请从头输入:");scanf("%f", &p1->;}if (p1-><0 || p1-> >100){printf("化学成绩输入不合法,请从头输入:");scanf("%f", &p1->;}if (p1-><0 || p1-> >100){printf("物理成绩输入不合法,请从头输入:");scanf("%f", &p1->;}if (p1-> >= 0 && p1-> <= 100 && p1-> >= 0&& p1-> <= 100&& p1-> >= 0 && p1-> <= 100&& p1-> >= 0 && p1-> <= 100&& p1-> >= 0 && p1-> <= 100){break;}}p1-> = (double)(p1-> + p1-> + p1-> +p1-> + p1->;p1-> = p1-> / 5;}。
成绩查询系统(链表实现)
成绩查询系统(链表实现)问题数学⽼师⼩y 想写⼀个成绩查询系统,包含如下指令:insert [name] [score],向系统中插⼊⼀条信息,表⽰名字为name的学⽣的数学成绩为score。
find [name],表⽰查找名字为name的学⽣的数学成绩。
注意有些同学可能会为了刷分多次选课,查询的时候给出最⼤成绩即可。
学⽣的名字是由⼩写字母组成。
成绩是⼀个 0 …100 的整数。
⽼师找到你,想你帮他完成这个系统。
输⼊格式输⼊若⼲⾏,每⾏都是insert [name] [score]或者find [name]的形式,或⼀⾏end表⽰输⼊结束。
输⼊⾏数不⼤于 1000,每个学⽣名字长度不⼤于 20 个字符。
输出格式对于每个查询,输出查询的学⽣的最⾼成绩,如果系统中不存在该学⽣,输出 -1。
样例输⼊insert zhangsan 90insert lisi 78insert xiaoming 86find xiaomingfind jackend样例输出86-11 #include<iostream>2 #include<algorithm>3 #include<stdio.h>4 #include<stdlib.h>5 #include<string.h>6 #include<malloc.h>7using namespace std;89//定义链表结构10 typedef struct Node{11char name[20]; //姓名12int score; //分数13struct Node *next; //指针域14 }Node,*List;1516//初始化,创建⼀个头结点,并使L指向此头结点17int Init_L(List &L){18 L = (List)malloc(sizeof(Node));19if( !L )20return0;21 L->next = NULL;22return0;23 }2425bool complare(int a,int b){26return a>b;27 }2829int main(){30 List L;31 Init_L(L);32string operate;//记录所要进⾏的操作,insert、find33string name;//⽤于查找34 List r,p; //临时变量35 r = L; //保存头结点36while( cin>>operate ){37if( operate == "end" )38break ;39else if( operate == "insert" ){40char nam[20];41int sco;42 p = (List)malloc(sizeof(Node));//创建临时结点43 scanf("%s%d",nam,&sco);44 strcpy( p->name , nam );//将⽤户输⼊的姓名复制到p->name中,不能直接⽤ =45 p->score = sco;//将⽤户输⼊的分数赋给p->score46 r->next = p; //将头结点的指针域指向新创建的结点p47 r = p; //r向后移动到p的位置(尾插法)48 r->next = NULL;49 }50else if( operate == "find" ){51 cin>>name; //⽤户输⼊要查找的姓名52 List x; //定义⼀个临时Node结构指针变量x53 x = L->next;//找到头结点,因为链表的查找只能从头开始往后查找54int sign = 0;55int array[10] = {0};56int i = 0;57int max=0;58while(x){59if( name == x->name ){60 array[i] = x->score;61if(max<array[i])62 max = array[i];63 i++;64 sign = 1;65 }66 x = x->next;67 }68if(sign == 1)69 cout<<max<<endl;70if(sign == 0)//如果没有就输出-171 cout<<"-1"<<endl;72 }73 }74return0;75 }。
学生成绩管理系统-双向链表
if(insertLinkList(L,x,pos))break;
}
break;
case 3: while(1){
printf("请输入待删除学生的位置(1-%d):",linklen(L));
}
return num;
}
/*初始化函数*/
int initLinkList(LinkList &L){
申请头结点
判断申请是否成功
如果成功,置头结点的尾标志为空
返回成功
}
/*插入函数*/
int insertLinkList(LinkList L,STU x,int i){
case 0: exit(0);
case 1: if(initLinkList(L)){
printf("请输入现在需要创建的学生人数:");
scanf("%d",&m);
creatLinkList(L,m);
}
posp->data.cj[0],posp->data.cj[1],posp->data.cj[2]);
}
else
printf("该学生的成绩不存在\n");
printf("按任意键继续!");
/*预编译命令*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
课程设计,学生成绩管理(链表操作)
printf(" 2,删除某一个学生的信息\n");
printf(" 3,查询一个指定学生的信息\n");
break;
}
p=p->next;
}
}
void main()
{
srand((unsigned int)(time(NULL)));
snode *head=NULL;
head=cjlb();
menu(head);
}
cout<<"\n此学生的姓名是?请输入:\n";
cin>>n;
while(p!=NULL)
{
if(p->name==n)
{
printf("姓名 学号 性别 英语 数学\n\n");
printf(" %c\t",p->name);
}
}
else
cout<<"\n没有学生的信息\n";
}
//删除一个学生
void shanchu(snode *l)
{
long n;
snode *s=l,*q;
shuchu(l);
printf("\n删除哪个学生?请输入学号:\n");
cin>>n;
cin>>newp->xuehao;
cout<<endl<<"输入学生的性别(1男/0女):\n";
采用链表与文件实现一个简单的学生成绩管理系统
附录1:结构化设计源程序清单// 程序名称:Student.CPP// 程序功能:采用链表与文件实现一个简单的学生成绩管理系统。
// 程序作者:李卉// 最后修改日期:2008-9-10#include <iostream>#include <fstream>#include<cstring>#include<conio.h>#include <ctime>using namespace std;struct Class //结构体结构成员{ int Chinese;int Math;int English;};class Student{public:Student();void Ofile(ofstream &of); //从文件中提取数据void Infile(ifstream &f); //将数据输入到文件void Out();void Set(char *name,int no,Class score);char *GetName();int GetNo();Student *Next;protected:char Name[20];int No;Class Score ;};Student::Student():Next(0){} // 构造函数char *Student::GetName(){return Name;}int Student::GetNo(){return No;}void Student::Set(char *name,int no,Class score){ strcpy(Name,name);No=no;Score=score;}void Student::Infile(ifstream &f){ f>>Name>>No>>Score.Chinese>>Score.Math>>Score.English; //将数据输入到文件}void Student::Ofile(ofstream &of){ of<<" "<<Name<<" "<<No<<" "<<Score.Chinese<<" "<<Score.Math<<" "<<Score.English; //从文件中提取数据}void Student::Out(){ cout<<Name<<"\t"<<No<<"\t"<<Score.Chinese<<"\t\t"<<Score.Math<<"\t\t"<<Score.English <<"\t"<<endl;}class Function //功能类{public:Function(); //构造函数~Function(); //析构函数void Menu(); //菜单函数void Add(); //录入学生成绩函数void Search(); //查询学生成绩函数void Delete(); //删除学生成绩函数void Modify(); //修改学生成绩函数void Show(); //显示学生成绩函数private:Student *Student_First;void Read(); //读取学生成绩函数void Save(); //保存学生成绩信息函数};Function::Function(){ Student_First=new Student;Read();}Function::~Function(){ delete Student_First;}void Function::Add() //录入学生成绩信息函数{ char name[20];int no;Class score;char choose;Student *f1,*p,*f2;system("cls");f1=Student_First;f2=Student_First->Next;while(f1->Next)f1=f1->Next;do{ p=new Student;cout<<"请输入您要添加的学生成绩信息:"<<endl;cout<<"请输入学生姓名:";cin>>name;while(f2){ if(strcmp(f2->GetName(),name)==0){ cout<<"该学生已存在,请确定姓名!\n\n";cout<<"请输入姓名:";cin>>name;break;}f2=f2->Next;}cout<<"请输入学号:";cin>>no;cout<<"请输入语文成绩:";cin>>score.Chinese;cout<<"请输入数学成绩:";cin>>score.Math;cout<<"请输入英语成绩:";cin>>score.English;p->Set(name,no,score);f1->Next=p; //指针跳到下一链表p->Next=NULL;f1=f1->Next;cout<<"是否继续输入信息?(Y\\N) "<<endl;cin>>choose;}while(choose=='y'||choose=='Y');Save();cout<<"1.返回主菜单"<<endl;cin>>choose;while(choose!='1'){ cout<<"1.返回主菜单"<<endl;cin>>choose;}Menu();//菜单函}void Function::Delete() //删除信息函数{ char name[20];int no;char choose;Student *temp,*p;system("cls");p=temp=Student_First->Next;cout<<"请输入姓名:";cin>>name;cout<<"输入学号:";cin>>no;while(temp)//temp用于存放从键盘输入的字符{ if(strcmp(temp->GetName(),name)==0&&temp->GetNo()==no) //判断该学生信息是否存在{ cout<<"姓名\t学号\t语文成绩\t数学成绩\t英语成绩\n";temp->Out();cout<<"\n是否删除(Y/N)";cin>>choose;if(choose=='y'||choose=='Y'){ p->Next=temp->Next;delete temp;cout<<"删除成功:\n";}break;}p=temp;temp=temp->Next;}Save();cout<<"1.返回主菜单\n2.继续删除"<<endl;cin>>choose;while(choose!='1'&&choose!='2'){ cout<<"1.返回主菜单\n2.继续删除"<<endl;cin>>choose;}if(choose=='1')Menu();else if(choose=='2')Delete();}void Function::Modify() //修改学生信息函数{ char choose,name[20];Student *temp,*p;int no;Class score;system("cls");temp=p=Student_First;cout<<"请输入您要修改的学生姓名:";cin>>name;while(temp){ if(strcmp(temp->GetName(),name)==0){ cout<<"姓名\t学号\t语文成绩\t数学成绩\t英语成绩\n";temp->Out();cout<<"请输入姓名:";cin>>name;cout<<"请输入学号:";cin>>no;cout<<"请输入语文成绩:";cin>>score.Chinese;cout<<"请输入数学成绩:";cin>>score.Math;cout<<"请输入英语成绩:";cin>>score.English;temp->Set(name,no,score);break;}temp=temp->Next;}Save();cout<<"修改成功!"<<endl;cout<<"1.返回主菜单\n2.继续修改"<<endl;cin>>choose;while(choose!='1'&&choose!='2'){ cout<<"1.返回主菜单\n2.继续修改"<<endl;cin>>choose;}if(choose=='1')Menu();else if(choose=='2')Modify();}void Function::Read() //读取信息函数{ Student *p,*p2;p=Student_First;long t;ifstream is("Student.txt",ios::in);if(!is){ ofstream os("Student.txt",ios::out);os.close();return ;}while(!is.eof()){ p2=new Student;p2->Infile(is);p->Next=p2;p2->Next=NULL;p=p->Next;}}void Function::Save() //保存学生成绩信息函数{ ofstream of("Student.txt",ios::out);Student *p=Student_First->Next;while(p){ p->Ofile(of);p=p->Next;}of.close();}void Function::Search(){ int flag(0);char choose;char t1[20];int t2;system("cls");Student *temp=Student_First->Next;do{ cout<<"输入查询方式:\n1.按姓名查询\n2.按学号查询\n";cin>>choose;if(choose=='1'){ cout<<"请输入您要查询的姓名:";cin>>t1;while(temp){ if(strcmp(t1,temp->GetName())==0){ flag=1;break;}temp=temp->Next;}if(flag==0)cout<<"\n无该学生的信息\n"<<endl;else{ cout<<"姓名\t学号\t语文成绩\t数学成绩\t英语成绩\n";temp->Out();}break;}else if(choose=='2'){ cout<<"请输入您要查询的学号";cin>>t2;while(temp){ if(t2==temp->GetNo()){ flag=1;break;}temp=temp->Next;}if(flag==0)cout<<"\n无该学生的信息\n"<<endl;else{ cout<<"姓名\t学号\t语文成绩\t数学成绩\t英语成绩\n";temp->Out();}break;}}while(choose!='1'||choose!='2');cout<<"\n1.返回主菜单\n2.继续查询"<<endl;cin>>choose;while(choose!='1'&&choose!='2'){ cout<<"1.返回主菜单\n2.继续查询"<<endl;cin>>choose;}if(choose=='1')Menu();else if(choose=='2')Search();}void Function::Show(){ char choose;Student *temp;system("cls");temp=Student_First->Next;if(!temp){ cout<<"文件无数据\n\n "<<endl;cout<<"1.返回主菜单"<<endl;cin>>choose;while(choose!='1'){ cout<<"1.返回主菜单"<<endl;cin>>choose;}Menu();}else{ cout<<"姓名\t学号\t语文成绩\t数学成绩\t英语成绩\n";while(temp!=NULL){ temp->Out();temp=temp->Next;}}cout<<"1.返回主菜单"<<endl;cin>>choose;while(choose!='1'){ cout<<"1.返回主菜单"<<endl;cin>>choose;}Menu();}void Function::Menu(){ time_t t;time(&t);char choose;system("cls");cout<<" ------------------------版权所有:李卉-------------------------"<<endl;cout<<endl;cout<<"***********************************************************"<<endl;cout<<" 长沙理工大学欢迎你"<<endl<<endl;cout<<" 学生成绩信息管理系统"<<endl<<endl;cout<<" 显示系统时间和日期: "<<ctime(&t)<<endl;cout<<"*********************************************************"<<endl<<endl;cout<<"请选择您需要的操作,选择相关操作请输入相对的括号里的阿拉伯数字!"<<endl;cout<<"\n";cout<<" 1 录入学生成绩信息:\n"<<endl;cout<<" 2 查询学生成绩信息:\n"<<endl;cout<<" 3 删除学生成绩信息:\n"<<endl;cout<<" 4 修改学生成绩信息:\n"<<endl;cout<<" 5 显示全部学生成绩信息:\n"<<endl;cout<<" 6 退出系统"<<endl;cout<<"\n";cin>>choose;switch(choose){ case '1': Add();break;case '2': Search();break;case '3': Delete();break;case '4': Modify();break;case '5': Show();break;case '6': exit(1);break;default:{ cout<<"请按规定输入选择项!"<<endl;Menu();}}}void main(){ Function function; //定义功能接口function.Menu(); //调用主菜单}。
学生成绩管理系统 c语言 链表
程序代码如下:#include<stdio.h>#include<malloc.h>#define LEN sizeof(struct student)struct student \\首先,建立一个结构体,包括成员学号和3个成绩{int num;float s1;float s2;float s3;struct student * next; \\ 指针来创建单向链表};int n; \\ n是链表中节点的数目struct student * creat() \\这是链表的创建函数,用于录入学生成绩{struct student *head,*p1,*p2;n=0;p1=p2=(struct student*)malloc(LEN);scanf("%d,%f,%f,%f",&p1->num,&p1->s1,&p1->s2,&p1->s3);head=NULL;while(p1->num!=0){n=n+1;if(n==1) head=p1;else p2->next=p1;p2=p1;p1=(struct student*)malloc(LEN);scanf("%d,%f,%f,%f",&p1->num,&p1->s1,&p1->s2,&p1->s3);}p2->next=NULL;return (head);}void print (struct student * head) \\ 这是链表的输出,用于查看整个学生成绩{void menufunction(struct student * p3);struct student * p;printf("\n学生成绩如下:\n");printf("学号语文数学英语\n");p=head;if(head!=NULL)do{printf("%d %5.1f %5.1f %5.1f\n",p->num,p->s1,p->s2,p->s3);p=p->next;}while(p!=NULL);menufunction(head); \\菜单功能的一个函数,用它来控制整个菜单界面的进行}struct student * del(struct student * head, int num) \\ del函数用作删除节点{void menufunction(struct student * p3);struct student *p1, *p2;if(head==NULL){printf("\nlist null! \n");return(head);}p1=head;while(num!=p1->num && p1->next!=NULL){p2=p1;p1=p1->next;}if(num==p1->num){if(p1==head) head=p1->next ;else p2->next=p1->next ;printf("delete:%d\n",num);n=n-1;}else printf("%d can't been found!\n",num);return(head);menufunction(head);}struct student *insert (struct student * head,struct student * stud) \\ insert函数用作创建节点{void menufunction(struct student * p3);struct student * p0,*p1,*p2;p1=head;p0=stud;if(head==NULL){head=p0;p0->next =NULL;}else {while((p0->num>p1->num)&&(p1->next!=NULL)){p2=p1; p1=p1->next ;}if(p0->num <=p1->num){if(head==p1) head=p0;else p2->next =p0;p0->next =p1;}else {p1->next=p0;p0->next=NULL;}}n=n+1;menufunction(head);return(head);}void x() \\用于界面制作的函数{ printf(" \n");printf("**********************************************************\n");}void s(struct student * head,int nu) \\这是一个查找的函数{struct student *p;void menufunction(struct student * p3);for(p=head;p->next!=NULL;p=p->next ){if(p->num==nu){printf("%d %5.1f %5.1f %5.1f\n",p->num,p->s1,p->s2,p->s3); break;}}if(p->num==nu)printf("%d %5.1f %5.1f %5.1f\n",p->num,p->s1,p->s2,p->s3); menufunction(head);}void menufunction(struct student * p3) \\用作界面菜单的函数{struct student * stu;int del_num,i,j; \\创建一个菜单,具有良好界面printf("**********************************************************\n"); printf(" 1.查看所有学生成绩\n");printf(" 2.删除个人成绩\n");printf(" 3.增加个人成绩\n");printf(" 4.查找个人成绩\n");printf(" 0.返回\n");printf("请选择要执行的功能0~4:");scanf("%d",&i);switch(i) \\wsitch语句来控制数字功能{case 1: x();print(p3);break;case 2: x(); printf("\n输入要删除的学号(如110):");scanf("%d",&del_num);while(del_num!=0){p3=del(p3,del_num);print(p3);printf("确认退出0:");scanf("%d",&del_num);} break;case 3: x(); printf("\n输入要插入的信息(如110,1,2,3):");stu=(struct student * )malloc(LEN);scanf("%d,%f,%f,%f",&stu->num,&stu->s1,&stu->s2,&stu->s3);while(stu->num!=0){p3=insert(p3,stu);print(p3);printf("确认退出0:");stu=(struct student * )malloc(LEN);scanf("%d,%f,%f,%f",&stu->num,&stu->s1,&stu->s2,&stu->s3);}break;case 4: x(); printf("输入要查找的学号(如110):");scanf("%d",&j);printf("学号语文数学英语\n");s(p3,j);break;case 0 : x(); printf("返回\n");break;default : printf("error!\n"); break;}}void main() \\main函数{struct student * head,* p3;printf("**************欢迎来到学生成绩管理系统**************:\n"); printf("请先输入学生成绩(如110,1,2,3):\n");head=creat();p3=head;menufunction(p3);printf(" 0.退出\n");}测试结果如图:先录入了5个学生的成绩良好的操作界面查看所有成绩(输出整个链表)现在删除学号为105的学生成绩,并查看成绩(增加个人成绩类似)查找个人成绩,输入学生学号,输出其成绩选0 返回菜单,再输入,则退出系统。
学生成绩管理系统C(链表)语言
学⽣成绩管理系统C(链表)语⾔#include"stdio.h"#include"stdlib.h"#include"string.h"//⽤于调⽤⼀些函数struct person {char name[20];int ID;int chinese;int english;int math;struct person *next; //连接处的指针}; //由于create⾥⾯就有initialize所以先把initialize放在前⾯void initialize(struct person *p, int num) { //初始化链表⾥⾯的值printf("innitialize person %d\n name is:", num); //num⽤于计⼊输⼊的第⼏个同学scanf_s("%s", &p->name, sizeof(p->name));getchar();printf("ID:");scanf_s("%d", &p->ID);getchar();printf("chinese:");scanf_s("%d", &p->chinese);getchar();printf("math:");scanf_s("%d", &p->math);getchar();printf("english:");scanf_s("%d", &p->english);getchar();}struct person *create(int len) {int num = 0;struct person *h = 0, *c, *pre = 0;while (num < len) {c = (struct person*)malloc(sizeof(struct person)); //malloc取内存 sizeof为这个内存的⼤⼩然后转化成指针if (num == 0) { h = c; pre = c; } // 如果num=0 h存下了⾸地址为以后拿做准备c->next = NULL;if (num) {pre->next = c; //pre为前⼀块内存的地址把后⼀块的⾸地址赋给前⼀块的尾pre = c; //收尾连接后 pre指前⼀块的功能就完成了然后再指向现在的内存为下⼀次拿内存、赋地址做准备}initialize(c, num); //每取⼀块地址就去输⼊⼀次++num;}return h;}void traverse(struct person *head) {int index = 1; // ⽤于计数第⼏个学⽣while (head != NULL) { //同样⼀直到后⾯没有地址结束printf("name is: %s\t ID is:%d\t chinese is:%d\t englishi is:%d\t math is:%d\n", head->name, head->ID, head->chinese, head->english, head->math); head = head->next; //前⼀个输完后就要指向下⼀块地址++index;}}int getlength(struct person *head) {int num = 0;while (head != NULL) { //当head指向后⾯没有了它就是NULL 结束++num;head = head->next; //如果head 不是NULL ++num后要把head指针指向最后}return num;}//增加学⽣信息void append_node(struct person *h) {struct person *t = h, *p;while (t->next != NULL) {t = t->next;}p = (struct person *)malloc(sizeof(struct person));initialize(p, 0);p->next = NULL;t->next = p;traverse(h);}//删除struct person * delete_ID(struct person *head, int ID, int len) {struct person *t = head;struct person *temp;for (int i = 0; i < (len - 1); ++i) {if (i == 0) {if (head->ID == ID) { head = head->next; free(t); traverse(head); return head; }if ((t->next)->ID == ID) {temp = t->next;t->next = (t->next)->next;free(temp); traverse(head); return head;}}if (i != 0) {if ((t->next)->ID == ID) {temp = t->next;t->next = (t->next)->next;free(temp); traverse(head); return head;}t = t->next;}}return head;}//学号查询void search_ID(struct person *head, int ID) {while (head != NULL) {if (head->ID == ID) {printf("name is: %s\t ID is:%d\t chinese is:%d\t englishi is:%d math is:%d\n", head->name, head->ID, head->chinese, head->english, head->math);}head = head->next;}}//姓名查询void search_name(struct person *head, char name[20]) {while (head != NULL) {if ((strcmp(head->name, name)) == 0) { printf("name is: %s\t ID is:%d\t chinese is:%d\t englishi is:%d math is:%d\n", head->name, head->ID, head->chinese, head->english, head->math); } head = head->next;}}//指定学⽣修改void change(struct person *head, char name[20]) {while (head != NULL) {if (strcmp(head->name, name) == 0) {printf(" name is:");scanf_s("%s", &head->name, sizeof(head->name));getchar();printf("ID:");scanf_s("%d", &head->ID);getchar();printf("chinese:");scanf_s("%d", &head->chinese);getchar();printf("english:");scanf_s("%d", &head->english);getchar();printf("math:");scanf_s("%d", &head->math);getchar();}head = head->next;}traverse(head);}//数学分数平均数int average_math(struct person *head, int len) {int i = 0, sum = 0, average;struct person *t = head;while (t != NULL) {sum += t->math;t = t->next;}average = (sum / len);return average;}//英语分数平均数int average_english(struct person *head, int len) {int i = 0, sum = 0, average;struct person *t = head;while (t != NULL) {sum += t->english;t = t->next;}average = (sum / len);return average;}//语⽂分数平均数int average_chinese(struct person *head, int len) {int sum = 0, average;struct person *t = head;while (t != NULL) {sum += t->chinese;t = t->next;}average = (sum / len);return average;}//成绩区间统计int statistics_math(struct person*head, int min, int max) {int conter = 0;while (head!= NULL) {if (head->math >= min&&head->math <= max) {++conter;printf("name:%s math score:%d\n", head->name, head->math);}head = head->next;}return conter;}int statistics_chinese(struct person*head, int min, int max) {int conter = 0;while (head != NULL) {if (head->chinese >= min&&head->chinese <= max) {++conter;printf("name:%s chinese score:%d\n", head->name, head->chinese);}head = head->next;}return conter;}int statistics_english(struct person*head, int min, int max) {int conter = 0;while (head != NULL) {if (head->english >= min&&head->english <= max) {++conter;printf("name:%s english score:%d\n", head->name, head->english);}head = head->next;}return conter;}//某名学⽣的平均成绩int average_name(struct person*head, char name[20]) {int av = 0;while (head != NULL) {if (strcmp(head->name, name) == 0) { av += head->math; av += head->chinese; av += head->english; } head = head->next;}av = av / 3;return av;}//排序数学void rank_math(struct person *h, int len) {struct person *t = h, *pre = h;int i, math, chinese, english,ID;char name[20];t = t->next;for (i = 0; i < (len - 1); ++i) {while (t != NULL) {if ((t->math) >(pre->math)) {ID = t->ID; t->ID = pre->ID; pre->ID = ID;math = t->math; t->math = pre->math; pre->math = math;strcpy_s(name, t->name); strcpy_s(t->name, pre->name); strcpy_s(pre->name, name);chinese = t->chinese; t->chinese = pre->chinese; pre->chinese = chinese;english = t->english; t->english = pre->english; pre->english = english;}t = t->next;}pre = pre->next; t = pre->next;}traverse(h);}//排序语⽂void rank_chinese(struct person *h, int len) {struct person *t = h, *pre = h;int i, math, chinese, english,ID;char name[20];t = t->next;for (i = 0; i < (len - 1); ++i) {while (t != NULL) {if ((t->chinese) >(pre->chinese)) {ID = t->ID; t->ID = pre->ID; pre->ID = ID;math = t->math; t->math = pre->math; pre->math = math;strcpy_s(name, t->name); strcpy_s(t->name, pre->name); strcpy_s(pre->name, name);chinese = t->chinese; t->chinese = pre->chinese; pre->chinese = chinese;english = t->english; t->english = pre->english; pre->english = english;}t = t->next;}pre = pre->next; t = pre->next;}traverse(h);}//排序英语void rank_english(struct person *h, int len) {struct person *t = h, *pre = h;int i, math, chinese, english,ID;char name[20];t = t->next;for (i = 0; i < (len - 1); ++i) {while (t != NULL) {if ((t->english) >(pre->english)) {ID = t->ID; t->ID = pre->ID; pre->ID = ID;math = t->math; t->math = pre->math; pre->math = math;strcpy_s(name, t->name); strcpy_s(t->name, pre->name); strcpy_s(pre->name, name);chinese = t->chinese; t->chinese = pre->chinese; pre->chinese = chinese;english = t->english; t->english = pre->english; pre->english = english;}t = t->next;}pre = pre->next; t = pre->next;}traverse(h);}void release(struct person *head) {struct person *n; //需要⼀个指针存着下⼀个地址while (head != NULL) {n = head->next; //把n指向下⼀块要释放的地址free(head);head = n; //然后再把head从前⼀个地址移到下⼀个地址}}//取长度int getlen(struct person *head) {int conter = 0;struct person*t = head;while (t != NULL) {++conter;t = t->next;}return conter;}//存⼊⽂件void openfile(struct person *head, int len) {FILE *fp;struct person*t = head;errno_t err;int temp;char str[100];char s[10];if ((err = fopen_s(&fp, "D:\\学⽣信息", "w")) != 0){printf("⽂件打开错误\n");}else{printf("⽂件打开成功\n");}for (int i = 0; i < len; ++i) {strcpy_s(str, t->name);fputs("name:", fp);fputs(str, fp);fputs(": ", fp);fputs("ID:", fp);sprintf_s(s, "%d", t->ID);fputs(s, fp);fputs("", fp);sprintf_s(s, "%d", t->chinese);fputs("chinese:", fp);fputs(s, fp);fputs("", fp);sprintf_s(s, "%d", t->math);fputs("math:", fp);fputs(s, fp);fputs("", fp);sprintf_s(s, "%d", t->english);fputs("english:", fp);fputs(s, fp);fputs("\n", fp);t = t->next;}return;}void menu(struct person *head, int len) {int m = 0;int min, max;int ID = 0;int conter = 0;char name[20];while (1) {printf(" 请选择您需要的操作:\n");printf(" 0. 遍历学⽣信息\n");printf(" 1. 增加学⽣信息\n");printf(" 2. 删除学⽣信息\n");printf(" 3. 修改学⽣信息\n");printf(" 4. 按姓名查询\n");printf(" 5. 按学号查询\n");printf(" 6. 语⽂成绩在某个区间段的⼈数以及学⽣\n"); printf(" 7. 数学成绩在某个区间段的⼈数以及学⽣\n"); printf(" 8. 英语成绩在某个区间段的⼈数以及学⽣\n"); printf(" 9. 语⽂平均分\n");printf(" 10. 数学平均分\n");printf(" 11. 英语平均分\n");printf(" 12. 某个学⽣的三科平均成绩\n");printf(" 13. 按语⽂成绩从⾼到低排序\n");printf(" 14. 按数学成绩从⾼到低排序\n");printf(" 15. 按英语成绩从⾼到底排序\n");printf(" 16. 结束功能并把信息写⼊⽂件中\n");scanf_s("%d", &m);switch (m) {case0: traverse(head); break;case1: append_node(head); break;case2: {printf("要删除学⽣信息的学号:");scanf_s("%d", &ID);head=delete_ID(head, ID, getlen(head)); }break;case3: {printf("需要修改学⽣信息的同学姓名:");scanf_s("%s", &name, sizeof(name));change(head, name); }break;case4: {printf("search by name:");scanf_s("%s", &name, sizeof(name));search_name(head, name); }break;case5: {printf("学号查询:");scanf_s("%d", &ID);search_ID(head, ID); }break;case6: {printf("请输⼊语⽂成绩的区间:");printf("min=");scanf_s("%d", &min);printf("max=");scanf_s("%d", &max);printf("语⽂成绩在区间%d到%d之间的学⽣:%d⼈\n", min, max, statistics_chinese(head, min, max)); }break;case7: {printf("请输⼊数学成绩的区间:");printf("min=");scanf_s("%d", &min);printf("max=");scanf_s("%d", &max);printf("数学成绩在区间%d到%d之间的学⽣:%d⼈\n", min, max, statistics_math(head, min, max)); }break;case8: {printf("请输⼊英语成绩的区间:");printf("min=");scanf_s("%d", &min);printf("max=");scanf_s("%d", &max);printf("英语成绩在区间%d到%d之间的学⽣:共有%d⼈\n", min, max, statistics_english(head, min, max)); }break;case9: { printf("average of chinese is%d", average_chinese(head, getlen(head))); }break;case10: { printf("average of math is%d", average_math(head, getlen(head))); }break;case11: { printf("average of english is%d", average_english(head, getlen(head))); }break;case12: {printf("请输⼊学⽣的姓名:");scanf_s("%s", &name, sizeof(name));printf("%s 的平均成绩为:%d", name, average_name(head, name)); }break;case13: {printf("按照语⽂成绩从⾼到底排序:");rank_chinese(head, getlen(head)); }break;case14: {printf("按照数学成绩从⾼到底排序:");rank_math(head, getlen(head)); }break;case15: {printf("按照英语成绩从⾼到底排序:");rank_english(head, getlen(head)); }break;case16: openfile(head, getlen(head)); return;}}}int main() {struct person *head;int len;int min, max;int ID = 0;char name[20];printf("请输⼊学⽣信息");printf("学⽣⼈数:");scanf_s("%d", &len); //输⼊要取的地址多少head = create(len); // 创建地址在create⾥⾯就有初始复制函数嵌套traverse(head); //遍历menu(head, getlen(head));release(head); //释放内存system("pause");return0;}。
学生成绩管理程序及链表管理程序模板
学生成绩管理程序及链表管理程序《程序设计基础》课程设计题目: 1. 学生成绩管理程序2. 链表信息管理姓名___ ____________ __班次_________________学号__ _ ____________指导教师___________________成绩__________________计算机与信息工程学院年 10 月 20 日题目1: 学生成绩管理程序[问题描述]设计一个实用的小型学生成绩管理程序, 它要求不用链表, 而用数组来设计这个程序。
它有查询和检索等功能, 而且能够对指定文件操作, 也可将多个文件组成一个文件。
[基本要求]1.功能要求( 包括输入、输出、精度等方面的要求)设计要求实现的功能较多, 因此将它们分为几个部分叙述。
1.建立文件(1)能够使用默认文件名或指定文件名将记录存储到文件;(2)文件保存成功返回0, 失败返回-1;(3)设置保存标志savedTag作为是否已对记录进行存储操作的信息;(4)写同名文件将覆盖原来文件的内容;2.增加学生记录(1)可在已有记录后面追加新的记录;(2)能够随时用它增加新的记录, 它们仅保存在结构数组中;(3)能够将一个文件读入, 追加在已有记录之后;(4)如果已经采取用文件追加的方式, 在没有保存到文件之前, 将继续保持文件追加状态, 以便实现连续文件追加操作方式;(5)如果没有记录存在, 给出提示信息。
3.新建学生信息文件(1)用来重新建立学生信息记录;(2)如果已经有记录存在, 能够覆盖原记录或者在原记录后面追加, 也能够将原有记录信息保存到一个指定文件, 然后重新建立记录;(3)给出相应的提示信息。
4.显示记录(1)如果没有记录可供显示, 给出提示信息;(2)能够随时显示内存中的记录;(3)显示表头。
5.文件存储(1)能够按默认名字或指定名字存储记录文件;(2)存储成功返回0, 否则返回-1;(3)更新存储标志。
6.读取文件(1)能够按默认名字或指定名字将记录文件读入内存;(2)读取成功返回0, 否则返回-1;(3)能够将指定或默认文件追加到现有记录的尾部;(4)能够将文件连续追加到现有记录并更新记录的名次。
用链表实现学生成绩信息管理
【摘要】计算机已经成为我们学习和工作的得力助手。
今天,计算机的价格已经十分低廉,性能有了长足的进步,它已经被应用于许多领域。
另外,信息技术在管理方面也有了越来越深入而广泛的应用,信息管理系统的实施在技术上已逐步成熟。
信息管理系统是一个不断发展的新型学科,任何一个单位要生存要发展,要高效率地把内部活动有机地组织起来,就必须建立与自身特点相适应的信息管理系统。
尤其是在学校里,要处理海量的学生数据相当麻烦,为了解决传统学生成绩管理所面临着的这些问题,学生成绩管理系统也就应运而生了。
本文阐述了学生成绩管理工作与信息化紧密结合的管理系统的背景和意义,对该系统的总体结构和各功能模块进行了详细的论述。
系统包括了学生成绩查询模块、学生成绩修改和录入模块、学生成绩求总和排序模块等等。
在各个功能模块中对各种信息进行编辑,具体包括添加、修改、删除、查询等基本操作。
把学生成绩管理简单化,以节省更多的人力和不必要的工作。
【关键词】学生成绩管理系统;VC++6.0;指针,链表,类,文件存储与读取目录1系统概述 (3)1.1系统的设计需求 (3)1.2 系统的功能模块划分 (3)2需求分析 (3)2.1系统需求分析 (3)2.2系统数据流图 (4)2.3系统功能介绍 (4)2.4系统功能模块图 (5)3详细设计 (5)3.1程序设计原理 (5)3.2主要代码描述 (5)3.3各功能模块代码 (15)4系统测试 (21)4.1调试过程 (21)4.2调试结果说明 (26)结束语 (26)参考文献 (26)1系统概述该系统实现对若干大学生的学习成绩进行管理,能实现按学期、按班级完成对学生成绩的录入、修改,能按班级统计学生的成绩,求学生的总分及平均分,并能根据学生的平均成绩进行排序能查询学生成绩,不及格科目及学生名单,能按班级输出学生的成绩单等。
1.1系统的设计需求整个系统用VC++进行实现,用指针、链表来实现学生成绩的数据结构设计,系统具有录入、修改、求总、求平均分、输出等功能。
c语言学生成绩管理系统(链表版)
#include <stdio。
h〉#include 〈stdlib.h>#include 〈string。
h>#include 〈conio.h〉#include 〈windows.h〉#include 〈ctype。
h〉#define YES 1#define NO 0typedef struct{int num;float math_score;float engl_score;float chin_score;float phy_score;float chem_score;double aver_score;double sum_score;char sex;}StudentDate;//学生基本信息typedef struct student{char name[20];//学生姓名StudentDate one;//学生其他信息int rank;//成绩排名struct student *next;}Student, *List;Student *startCheck(void);//开始检查Student *createListHead(void);//创建链表的头void menu(void);//主菜单void sortList(Student *pHead);//排序链表void readListWithFile(Student *pHead,char *file_name);//从文件中读取数据,并保存在链表中void sorttList(Student *pHead);//排序链表int userChioce(Student *pHead);//用户选择int sortMenu(void);//打印选择菜单void passwordCheck(void);//密码检测void correctWord(void);//修改密码void addStudentInfo(Student *pHead);//向链表的末尾添加数据int scanMenu(void);//浏览菜单void findStudentInfo(Student *pHead);//查找学生信息void delStudentInfo(Student *pHead);//删除某一个学生信息void alterStudentInfo(Student *pHead);//修改学生信息void saveList(Student *pHead);//将链表保存在文件里void printList(Student *pHead);//打印链表void statisStudentInfo(Student *pHead);//查看学生信息int statisMenu(void);//查看菜单void gotoxy(int x, int y);//改变光标位置函数void inputData(Student *pHead,Student *node);//输入信息,并检测是否合法int main(void){Student *pHead;HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//得到窗口句柄SMALL_RECT rc = { 0, 0, 94 —1,30 - 1 };//{Y位置,X位置,宽,高}SetConsoleWindowInfo(hOut, true,&rc);// 重置窗口位置和大小system("color 5B");//设置控制台颜色pHead = startCheck();//读取信息while (1){if (9 == userChioce(pHead))//按9时退出系统{break;}}return 0;}void menu(void){system(”CLS”);//清屏printf(”\n\n\n\t\t\t\t┌─────────────────┐\n”);printf("\t\t\t\t│学生成绩统计系统│\n”);printf("\t\t\t\t├─────────────────┤\n”);printf(”\t\t\t\t│ 1 增加学生记录│\n”);printf("\t\t\t\t├─────────────────┤\n");printf("\t\t\t\t│ 2 删除学生记录│\n”);printf(”\t\t\t\t├─────────────────┤\n”);printf("\t\t\t\t│ 3 修改学生记录│\n");printf(”\t\t\t\t├─────────────────┤\n”);printf("\t\t\t\t│ 4 查找学生信息│\n”);printf("\t\t\t\t├─────────────────┤\n”);printf(”\t\t\t\t│ 5 统计学生成绩│\n");printf(”\t\t\t\t├─────────────────┤\n”);printf("\t\t\t\t│ 6 查看学生成绩│\n");printf(”\t\t\t\t├─────────────────┤\n”);printf("\t\t\t\t│7 修改登陆密码│\n”);printf(”\t\t\t\t├─────────────────┤\n”);printf("\t\t\t\t│8 关于│\n”);printf("\t\t\t\t├─────────────────┤\n”);printf(”\t\t\t\t│9 退出系统│\n”);printf("\t\t\t\t└─────────────────┘\n”);}void gotoxy(int x, int y)//x为列坐标,y为行坐标{COORD pos = {x,y };HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOut,pos);}Student *startCheck(void){Student *pHead;FILE *fp1;char password[20]= "123456”;int i;if ((fp1 = fopen("password。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
---------------------------------------------------------------最新资料推荐------------------------------------------------------学生成绩管理(链表)实验一线性表学生成绩管理(链表) 05111341 班李凌豪1120191263 1.需求分析 1.1.问题重述(1)问题描述设计一个学生成绩管理系统。
主要实现学生信息的录入、添加、修改、删除、排序和查看等基本功能。
(2)具体要求编写一个学生成绩管理程序。
学生成绩以一个学生一条记录的形式存储,每个学生记录包含的信息有序号、学号、姓名及 5 门功课的成绩。
具体功能如下:a. 获取学生成绩。
可以从文件中读取成绩,也可直接录入。
查询学生成绩,输入学生学号或姓名等信息后,显示学生在成绩单中的位置及所有信息。
b. 添加学生成绩,在学生成绩单的指定位置添加学生成绩信息。
c. 修改学生成绩,在学生成绩单中,修改指定学生的成绩信息。
d. 删除学生成绩,在学生成绩单中,删除指定学生的成绩信息。
e. 保存文件。
当学生成绩单发生添加、修改、删除等变化后,都要对最终结果进行保存。
1/ 12(3)数据结构及算法分析学生成绩可以用单链表存储,方便随时插入和删除学生成绩记录,实现动态管理。
一个学生作为一个结点。
使用链表的基本算法实现学生成绩单的各项管理功能。
1.2.问题分析本题要求用单链表的知识编程实现对学生成绩的管理。
要求既要能从文件读取学生成绩,也可以手动键入学生成绩,要建立单链表来储存获取的学生成绩。
然后,要对获取的学生成绩单进行添加、修改、删除等操作,在操作完后,还要进行保存,保存修改后的成绩单至文件。
2.概要设计 2.概要设计 2.1.抽象数据类型的定义根据链表的特点,本程序将一个学生的成绩及信息作为一个节点,并以此作为本程序的抽象数据类型,具体定义语句如下:struct stu{ char name[20]; char xuehao[10]; int pro1,pro2,pro3,pro4,pro5; struct stu *next; }; 一个节点包括的内容有:字符型数组 name,用于存放学生的姓名;字符型数组 xuehao 用于存放学生的学号;整形变量 pro1,pro2,pro3,pro4,pro5,用于存储学生的五科成绩(本程序假设各科成绩均为整数);指针变量 next 为节点的指针域,用于存储所指向的下一个节点的地址。
考虑到序号在修改添加等操作时变动较大,故不作为链表节点的数据域内容,而是以节点的序号来作为一个隐藏的数据。
---------------------------------------------------------------最新资料推荐------------------------------------------------------ 2.2.主程序流程主函数主要分三大操作步骤:生成或读取成绩单;查看及修改操作;保存操作。
生成或读取成绩单可实现从文件中读取学生成绩数据或者手动键入学生成绩数据的操作。
在完成第一大步的操作后,学生成绩已经以链表的形式存在在程序内存空间中,紧接着进行查看及修改操作,这一步主要是对已经读取的学生成绩表进行修改、添加、删除、查看等操作。
可实现查询单个学生成绩,添加学生成绩,修改学生成绩,删除学生信息,查看当前成绩单,保存成绩单等六种操作。
之后进入保存操作步骤,用户可以选择保存并退出,直接退出或者回到’查看及修改操作步骤。
回到查看及修改操作步骤实现了程序运行一次进行多次操作的功能。
具体操作由子函数实现。
2.3.程序模块之间的调用关系主函数作为用户界面与用户交互,得到指令后由主函数来调用相应功能的子函数来实现操作。
同时,修改、删除操作函数要首先调用查询操作函数来查询对应的学生。
3.详细设计 3.1.主函数的具体实现主函数主要分三大操作步骤:生成或读取成绩单;查看及修改操作;保存操作。
3/ 12并且作为用户界面与用户交互,得到指令后由主函数来调用相应功能的子函数来实现操作。
运用 switch 语句来实现操作的选择,调用相应子函数来实现操作,运用 goto 语句来使输入错误指令时返回相应的步骤,以及运用goto 语句来实现返回上一步操作。
3.2.子函数的具体实现 struct stu *duquwenjian(); 此函数的功能是从文件中读取学生成绩数据,并生成成绩链表。
该函数位于生成或读取成绩单操作步骤。
由于是读取操作,主函数无需向其传递参数,而该子函数返回的是生成成绩链表的头指针(由于本程序建立的是不带头结点的指针,头指针便指的是指向首元节点的指针,下同)。
用 fscanf 函数来格式化地读取文件数据。
struct stu *jianru(); 此函数的功能是手动键入学生成绩数据,生成成绩链表。
该函数位于生成或读取成绩单操作步骤。
由于是初步操作,主函数不向其传递参数,该子函数返回的也是生成成绩链表的头指针。
int chaxun(struct stu *e); 此函数的功能是查询单个学生成绩,并显示出该学生的成绩及信息。
分两种查询方法:按姓名查询和按学号查询。
struct stu *tianjia(struct stu *e); 添加一个学生信息,---------------------------------------------------------------最新资料推荐------------------------------------------------------ 运行时先要输入想要添加的位置,然后键入想要添加的学生的信息,添加完成后会提示添加成功。
由于没有实际的头节点,在此函数内实际上是添加了头结点,之后返回的仍是添加后的首元节点,以此保证在添加位置为链表头时不出错。
void xiugai(struct stu *e,int i); 修改一个已经在表内的学生信息。
此函数内部首先调用了 chaxun(struct stu *e)函数,来查询需要修改信息的学生的位置,然后找到相应位置进行修改。
void shanchu(struct stu *e,int i); 删除一个已经有的学生成绩。
此函数内部同样调用了 chaxun(struct stu *e)函数,来查询需要删除的学生的位置。
如果表内没有该学生,则会显示查无该生,然后返回到查看及修改操作选择指令阶段;如果查到该学生,则将其删除,若删除成功,则会提示已成功删除。
void grades(struct stu *e); 此函数用来打印当前成绩单。
调用该函数会打印当前链表所存储的完整的成绩单。
考虑到可能会存在数据很多即链表很长的情况,所以除读取及键入操作完成时自动打印成绩单以外,此函数只在用户发送相应操作指令要求打印当前成绩单时才会执行。
5/ 12int save(struct stu *e); 保存成绩单至文件。
用 fprintf 来格式化地输出成绩单保存到文件中。
4.调试分析 4.1.难点以及遇到的困难本次编程及调试遇到的困难主要来自文件的读取及存储操作。
由于 c 语言课程中,我对文件的认识很浅,也没有做过相应的编程练习,所以从文件中读取成绩以及向文件存储成绩表对我来说算是一个挑战。
最终,通过查找资料,运用fscanf,fprintf 这两个对文件的格式输入输出函数解决了文件的读取及存储问题。
刚开始,我的思路是将序号也作为链表的数据域内容,但是在实现过程中发现了这样并不是很可行。
考虑到序号在修改添加等操作时变动较大,最后并没有将它作为链表节点的数据域内容,而是以节点的序号来作为一个隐藏的数据,即运用其逻辑结构中的位置来表征其序号。
4.2.经验及体会本次实验是我第一次真正意义上运用 C 语言来解决实际问题,而且是具有一定工程量的问题。
通过这次实验,我已经可以熟练地进行函数的调用、链表的建立以及修改操作、文件的读取存储。
这个程序总共编了 234 行,完全是我在自学文件相关知识后独立完成的,这也极大地增加了我对自己编程能力的自信心,是我相信自己完全有能力编出较长的程序解决复杂的问题。
5.测试结果 5.1.读取文件数据 5.2.手动键入成绩 5.2.手---------------------------------------------------------------最新资料推荐------------------------------------------------------ 动键入成绩 5.3.查询单个学生成绩 5.3.查询单个学生成绩用学号查询:用姓名查询:5.4.添加学生成绩 5.5.修改学生成绩 5.5.修改学生成绩5.6.删除学生成绩 5.6.删除学生成绩 5.7.显示当前成绩单5.7.显示当前成绩单 5.8.保存成绩单 5.8.保存成绩单修改并保存后的文本文件内容如下:6.附录#includestdio.h #includestring.h #includestdlib.h struct stu{ char name[20]; char xuehao[10]; int pro1,pro2,pro3,pro4,pro5; struct stu *next; }; //函数的声明 struct stu *duquwenjian();//从文件中读取学生成绩数据,生成成绩链表 struct stu *jianru();//手动键入学生成绩数据,生成成绩链表 int chaxun(struct stu *e);// 查询单个学生成绩struct stu *tianjia(struct stu *e);//添加一个学生信息 void xiugai(struct stu *e,int i);//修改一个已经在表内的学生信息 void shanchu(struct stu *e,int i);//删除一个已经有的学生成绩 void grades(struct stu *e);//打印成绩单 int save(struct stu *e);//保存成绩单至文件 int main() { struct stu *f,*h; int n; printf(生成或读取成绩单:7/ 12\n 1 从文件中读取学生成绩数据\n 2 手动键入学生成绩数据\n); int caozuo,caozuo2,caozuo3; scanf(%d,caozuo);for(;caozuo!=1caozuo!=2;){printf(输入有误,请重新输入:\n);scanf(%d,caozuo);} switch (caozuo) {case 1:f=duquwenjian();break; case 2: f=jianru();break; }printf(当前成绩单如下:\n); grades(f); s:printf(查看及修改操作:\n 1 查询单个学生成绩\n 2 添加学生成绩\n 3 修改学生成绩\n 4 删除学生信息\n 5 查看当前成绩单\n 6 保存成绩单\n); k:scanf(%d,caozuo2); switch(caozuo2){case 1:chaxun(f);break; case 2:f=tianjia(f);break;case 3:{n=chaxun(f);if(n!=0){xiugai(f,n);printf( 已成功修改\n);}}break; case4:{n=chaxun(f);if(n!=0){if(n!=1)shanchu(f,n); else{h=f;f=f-next;free(h); } printf(已成功删除该学生\n);}}break; case5:grades(f);break; case 6:{n=save(f);if(n==0)printf(已成功保存\n);else {printf(未成功保存\n);goto s;}} break;default :{printf(输入有误,请重新输入:\n);goto k; } } z:printf(是否保存:\n 1 保存并退出\n 2 直接退出\n 3 回到’查看及修改---------------------------------------------------------------最新资料推荐------------------------------------------------------操作步骤’\n); scanf(%d,caozuo3); switch(caozuo3) {case 1:{n=save(f);if(n!=0){printf( 未成功保存 \n);gotoz;}}break; case 2:break; case 3:goto s; } return 0; } struct stu *duquwenjian()//读取文件中的数据,建立链表,返回头结点{ FILE *fp; struct stu*head=NULL,*pnew=NULL,*pold=NULL;if((fp=fopen(stud.txt,rt))==NULL) {printf(文件打开失败\n); return NULL; } head=pnew=(structstu*)malloc(sizeof(struct stu)); while (!feof(fp)) {fscanf(fp,%s %s %d %d %d %d %d\n,pnew-name,pnew-xuehao,pnew-pro1,pnew-pro2,pnew-pro3,pnew-pro4,pnew-pro5);pnew-next=(struct stu *)malloc(sizeof(struct stu));pold=pnew; pnew=pnew-next; } pold-next=NULL; fclose(fp); printf(学生成绩读取完毕\n); returnhead; } struct stu *jianru()//键入数据,建立链表,返回头结点canf(%s%s%d%d%d%d%d,na,xue,pro1,pro2,pro3,pro4,pro5)!=EOF){ q=(struct stu *)malloc(sizeof(struct stu)); if(i==1){ strcpy(q-name,na); strcpy(q-xuehao,xue);q-pro1=pro1;q-pro2=pro2;q-pro3=pro3;q-pro4=pro4;q-pro5=pro5; q-next=NULL; a=q; head=a; i++; } else9/ 12{strcpy(q-name,na);strcpy(q-xuehao,xue);q-pro1=pro1;q-pro2=pro2;q-pro3=pro3;q-pro4=pro4;q-pro5=pro5; q-next=NULL; a-next=q;a=a-next; } } q=head; printf(键入成功!\n); return head; } int chaxun(struct stu *e)// 查询单个学生成绩{ int f,i,flag,ji; charxuehao[10],name[20]; struct stu *q; q=e;printf( 1.用学号查询\n 2.用姓名查询\n );n:scanf(%d,f); if(f==1) { printf(输入学号\n); scanf(%s,xuehao);for(i=1,flag=0;q!=NULL;q=q-next,i++){ if(strcmp(q-xuehao,xuehao)==0) {printf(序号姓名学号一二三四五\n%3d %-15s %-12s %3d %3d %3d %3d %3d\n,i,q-name,q-xuehao,q-pro1,q-pro2,q-pro3,q-pro4,q-pro5);flag=1;ji=i; } }if(flag==0)printf(查无此学生\n); } else if(f==2){ printf(输入姓名\n); scanf(%s,name);for(i=1,flag=0;q!=NULL;q=q-next,i++){ if(strcmp(q-name,name)==0) {printf(序号姓名学号一二三四---------------------------------------------------------------最新资料推荐------------------------------------------------------五\n%3d %-15s %-12s %3d %3d %3d %3d %3d\n,i,q-name,q-xuehao,q-pro1,q-pro2,q-pro3,q-pro4,q-pro5);flag=1;ji=i; } }if(flag==0)printf(查无此学生\n); } else {printf(输入有误,请重新输入\n);goto n;} if(flag==0)return 0;else return ji; } struct stu *tianjia(struct stu *e)//添加一个学生信息 { int i,t; struct stu*head,*q,*n; a:printf(插入到序号为几的位置?\n); scanf(%d,t); head=(struct stu *)malloc(sizeof(structstu)); head-next=e; q=e;for(i=1;q!=NULL;q=q-next,i++);if(t=i+1||t==0){printf(输入位置有误,请重新输入\n);goto a;}else {q=head; for(i=1;it;q=q-next,i++);n=(struct stu *)malloc(sizeof(struct stu)); printf(输入添加的学生信息\n 姓名学号成绩一二三四五\n); scanf(%s%s%d%d%d%d%d,n-name,n-xuehao,n-pro1,n-pro2,n-pro3,n-pro4,n-pro5); n-next=q-next;q-next=n; } q=head-next; printf(成功添加该学生\n); return q; } void xiugai(struct stu*e,int i) { int t; for(t=1;ti;t++,e=e-next); printf(输入11/ 12该学生新的信息\n 姓名学号成绩一二三四五\n); scanf(%s%s%d%d%d%d%d,e-name,e-xuehao,e-pro1,e-pro2,e-pro3,e-pro4,e-pro5); } void shanchu(struct stu *e,int i)//删除一个已经有的学生成绩 { int t; struct stu *head,*q,*n; head=(struct stu *)malloc(sizeof(struct stu)); head-next=e; q=head; for(t=1;ti;q=q-next,t++); n=q-next;q-next=q-next-next; free(n); } voidgrades(struct stu *e) { int i; printf(序号姓名学号一二三四五\n);for(i=1;e!=NULL;e=e-next,i++)printf(%3d %-15s %-12s %3d %3d %3d %3d %3d\n,i,e-name,e-xuehao,e-pro1,e-pro2,e-pro3,e-pro4,e-pro5); } intsave(struct stu *e) { FILE *fp;if((fp=fopen(stud.txt,wt))==NULL) { return 1; }while(e!=NULL){ fprintf(fp,%s %s %d %d %d %d %d\n,e-name,e-xuehao,e-pro1,e-pro2,e-pro3,e-pro4,e-pro5); e=e-next; } fclose(fp); return 0; }。