复制时运行出错请看这里:c语言学生成绩管理系统
完整代码点击这里:github免费完整代码
github不能访问请点击这里 gitee链接
c语言学生成绩管理系统(增、删、查、改、排序、分析优秀及格率等)详细内容 一、功能描述
实现学生基本信息的管理,包括学生资料的录入、查询、修改、删除、浏览等操作,实现学生成绩信息的管理,包括学生成绩的录入、查询、修改、删除、浏览等操作。学生的基本信息包括:学号、姓名、班级、所选科目等,程序应提供班级与科目信息的录入功能。分析每个班单科成绩。(排序,最高分,最低分,及格率(60以上),优秀率(90以上))。保存信息到c盘目录下,以txt文件保存
文章图片
文章图片
文章图片
1、总体设计
1)分析程序的功能
用户录入信息,实现增删查改和分析(排序)。信息保存到c盘
2)系统总体结构:
分为9个结构。用户实现学生成绩的增删查改,并在用户输入指令后,实现成绩
的分析。
模块 函数名称
录入学生的资料和成绩 input
//01录入学生的资料和成绩.
struct node*input(node *head){
int i=0,j=1;
struct node *p,*n;
p=(struct node*)malloc(sizeof(struct node));
p=head;
while(1){
if(j>0){
i++;
n=(struct node*)malloc(sizeof(struct node));
printf("请输入第%d个学生的学号,姓名\n",i);
scanf("%d %s",&n->date,&n->name);
getchar();
printf("请输入科目(文或理)和班级(1或者2)\n");
scanf("%s %d",&n->kemu,&n->me_class);
fflush(stdin);
printf("请输当前学生的语文,数学,英语成绩\n");
scanf("%lf %lf %lf",&n->yuwen,&n->shuxue,&n->yingyu);
getchar();
n->num=n->yuwen+n->shuxue+n->yingyu;
n->avg=(p->num)/3;
p->next=n;
p=n;
printf("是否继续输入下一个同学的信息?输入 1 继续,输入0就停止输入\n");
fflush(stdin);
scanf("%d",&j);
fflush(stdin);
}
else {
p->next=last=NULL;
p=last;
break;
}
}
free(p);
//释放p
return head;
}
增加学生信息及成绩 add
struct node*add(struct node*head){
if(head->next==NULL){
printf("还没有存储数据,请先存储数据");
return head;
}
else{
struct node*head1,*p;
head1=(struct node*)malloc(sizeof(struct node));
printf("正在添加学生信息及成绩\n");
head1=input(head1);
//插入的节点用链表的方式存储.
p=head->next;
while(p->next!=NULL){
p=p->next;
}
p->next=head1->next;
//因为头结点是空的所以应该链接头结点的下一个节点。
return head;
}
}
【项目|c语言学生成绩管理系统(增、删、查、改、排序、分析优秀及格率等)】查询学生信息及成绩 find
struct node*find(struct node*head){
int i;
struct node*p;
if(head==NULL){
printf("还没有存储数据,请先存储数据\n");
}
else{
printf("请输入你要找查的学号:");
scanf("%d",&i);
p=head->next;
while(p->date!=i&&p->next!=NULL){
p=p->next;
}
if(p->date==i){
printf("学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n");
printf("%d\t%s\t%d\t%s\t%lf\t%lf\t%lf",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu);
printf("\n");
return p;
}
else{
printf("没有找到你要查找的同学\n");
return NULL;
}
}
}
删除学生信息及成绩 del
void del(struct node*head){
int key,j=0;
struct node*p,*s;
s=head->next;
p=head;
printf("请输入你要删除学生的学号");
fflush(stdin);
//删除缓存的数据。
scanf("%d",&key);
while(s!=NULL){
if(s->date!=key){
p=s;
s=s->next;
}
else
break;
}
if(s!=NULL){
p->next=s->next;
free(s);
printf("删除成功\n");
}
else
printf("删除失败\n");
}
修改学生信息和成绩 change
struct node*change(struct node*head){
struct node*p=NULL;
p=find(head);
if(p==NULL){
printf("修改失败\n");
return head;
}
else{
printf("请输入修改的学生信息\n");
printf("姓名 班级 科目\n");
scanf("%s %d %s",&p->name,&p->me_class ,&p->kemu);
fflush(stdin);
printf("请输入修改的学生成绩\n");
printf("语文 数学 英语\n");
scanf("%lf %lf %lf",&p->yuwen,&p->shuxue,&p->yingyu);
fflush(stdin);
//getchar()
printf("\n学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n");
printf("%d\t%s\t%d\t%s\t%lf\t%lf\t%lf\n",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu);
return head;
}
}
浏览学生信息及成绩 output
struct node* output(struct node*head)
{
if(head==NULL)
printf("还没有数据请先输入数据\n");
else
{
struct node *p;
p=head->next;
printf("学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n");
while(p!=NULL)
{printf("%d\t%s\t%d\t%s\t%lf\t%lf\t%lf",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu);
p=p->next;
printf("\n");
}
printf("\n");
}
return head;
}
文件夹操作 file
void file(struct node*head)
{
int i=0;
FILE *fp;
struct node*p=head->next;
fp=fopen("C:\\学生成绩单.txt","wt");
fprintf(fp,"学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n");
while(p!=NULL)
{
fprintf(fp,"%d\t%s\t%d\t%s\t%lf\t\t%lf\t\t%lf\n",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu);
p = p->next;
i++;
}
if(i>0)
printf("\t\t\t\t\t—————成功保存c盘—————\n");
else printf("\t\t\t\t\t—————没有数据保存失败到桌面—————\n");
fclose(fp);
}
输出成绩统计 Outtj
void Outtj(struct node1 stu[50],int si,int n)
{
doubleavg1=0,avg2=0,avg3=0;
doublek1=0,k2=0,k3=0;
//及格率
doublej1=0,j2=0,j3=0;
//优秀率
doublemax1;
doublemin1;
int j;
max1=stu[0].yuwen;
min1=stu[0].yuwen;
for(j=0;
j;
j++)
{
avg1+=stu[j].yuwen;
if(stu[j].yuwen>=60) k1++;
if(stu[j].yuwen>=90) j1++;
if(stu[j].yuwen>max1) max1=stu[j].yuwen;
if(stu[j].yuwen=60)k2++;
if(stu[j].shuxue>=90)j2++;
if(stu[j].shuxue>max1) max1=stu[j].shuxue;
if(stu[j].shuxue=60) k3++;
if(stu[j].yingyu>=90)j3++;
if(stu[j].yingyu>max1) max1=stu[j].yingyu;
if(stu[j].yingyu
输出成绩排序 OutPx
void OutPx(struct node*head,struct node1 stu[],int si,int n){//stu[50]数组,int si长度,int n班级。
int j,k=0;
int i,h;
//控制学科。
struct xueke
{
char aa[15];
}km[4]={{"语文"},{"数学"},{"英语"},{"总成绩"}};
lbzsz(head);
printf("\t\t%d班的成绩排序\n",n);
for(i=0,h=1;
i<4;
i++,h++){//for1
for(j=0;
j;
j++){//for2
for(k=0;
k-1-j;
k++){//for3
if(h==1){
if(stu[k].yuwen[k+1].yuwen){
t=stu[k+1];
stu[k+1] =stu[k] ;
stu[k]=t;
}
}
if(h==2){
if(stu[k].shuxue[k+1].shuxue){
t =stu[k+1];
stu[k+1] =stu[k] ;
stu[k] =t ;
}
}
if(h==3){
if(stu[k].yingyu[k+1].yingyu){
t=stu[k+1];
stu[k+1] =stu[k] ;
stu[k] =t ;
}
}
if(h==4){
if(stu[k].num[k+1].num){
t =stu[k+1];
stu[k+1] =stu[k] ;
stu[k] =t ;
}
}
}//for3结束
}//for2结束
printf("%s排名\n学号\t姓名\t班级\t%s成绩\t排名\n",km[i].aa,km[i].aa);
if(h==1){
for(j=0,k=1;
j;
j++,k++)
printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].yuwen,k);
}
if(h==2){
for(j=0,k=1;
j;
j++,k++)
printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].shuxue ,k);
}
if(h==3){
for(j=0,k=1;
j;
j++,k++)
printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].yingyu ,k);
}
if(h==4){
for(j=0,k=1;
j;
j++,k++)
printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].num,k);
}
}
}
三、总程序清单
#include
#include
#include"stdd.h"
#include
#include"cjfx.h" int main()
{
int i,j=1;
struct node*head;
last=NULL;
head=(struct node*)malloc(sizeof(struct node));
head->next =NULL;
printf("\t\t---欢迎使用学生成绩管理系统---\n");
while(j){
i= menu();
switch(i){
case 0:
j=0;
printf("退出成功");
break;
case 1:
head=input(head);
system("pause");
break;
//创建节点函数
case 2:
head=add(head);
system("pause");
break;
//增加学生信息及成绩
case 3:
find(head);
system("pause");
break;
//查询学生信息及成绩
case 4:
del(head);
system("pause");
break;
//删除学生信息及成绩;
case 5:
head=change(head);
system("pause");
break;
//05修改学生信息和成绩
case 6:
output(head);
system("pause");
break;
//浏览学生信息及成绩
case 7:
file(head);
system("pause");
break;
//(自己创新)保存到桌面
case 8:
main1(head);
system("pause");
break;
//(创新)学生成绩分析
default:break;
}
printf("\n");
printf("\t\t——————————————\n");
}//while结束
system("pause");
}
#include
#include
#include
struct node1
{
int date;
//学号
int me_class;
//班级
double yuwen;
//语文成绩
double shuxue;
//数学成绩
double yingyu;
//英语成绩
double num;
//总分
double avg;
//平均分
char name[20];
//姓名
char kemu[20];
//所选科目
}stu1[50],stu2[50],t;
int si1=0,si2=0;
void lbzsz(struct node*head);
void OutPx(struct node*head,struct node1 stu[50],int si,int n);
//输出成绩排序//输出成绩统计
void Outtj(struct node1 stu[50],int si,int n);
//输出成绩统计
int cjmenu(){
int i=1;
printf("\t\t 1.1班成绩排序\n");
printf("\t\t 2.2班成绩排序\n");
printf("\t\t 3.1班成绩统计\n");
printf("\t\t 4.2班成绩统计\n");
printf("\t\t 0.退出\n");
printf("\t\t-----------------------------\n");
printf("\t请选择序号\n");
scanf_s("%d",&i);
while(1)
{
if(i<0||i>4)
{
printf("***没有此选项。请重新选择***\n");
system("pause");
}
break;
} return i;
}
void main1(struct node*head)
{
int i,j=1;
printf("\t\t---成绩分析系统---\n");
while(j){
i= cjmenu();
lbzsz(head);
switch(i){
case 0:
j=0;
printf("退出成功");
break;
case 1:
OutPx(head,stu1,si1,1);
system("pause");
break;
system("pause");
case 2:
OutPx(head,stu2,si2,2);
system("pause");
break;
system("pause");
case 3:
Outtj(stu1,si1,1);
system("pause");
break;
system("pause");
case 4:
Outtj(stu2,si2,2);
system("pause");
break;
system("pause");
default:break;
}
printf("\n");
printf("\t\t——————————————\n");
}//while结束
}
//链表存入两个数组
void lbzsz(struct node*head)
{
struct node*p;
p=head;
if(head->next==NULL)
{printf("没有数据请先存入数据");
}
if(head->next)
{
for(si1=0,si2=0;
p->next !=NULL;
)
{
p=p->next ;
if(p->me_class %2==0)
{
stu2[si2].avg =p->avg ;
//平均分
stu2[si2].date=p->date;
//学号
strcpy(stu2[si2].kemu,p->kemu);
//字符串要用strcpy
stu2[si2].me_class=p->me_class;
strcpy(stu2[si2].name,p->name);
stu2[si2].num=p->num;
stu2[si2].shuxue=p->shuxue;
stu2[si2].yingyu=p->yingyu;
stu2[si2].yuwen=p->yuwen;
si2++;
}
else
{
stu1[si1].avg =p->avg ;
//平均分
stu1[si1].date=p->date;
//学号
strcpy(stu1[si1].kemu,p->kemu);
stu1[si1].me_class=p->me_class;
strcpy(stu1[si1].name,p->name);
stu1[si1].num=p->num;
stu1[si1].shuxue=p->shuxue;
stu1[si1].yingyu=p->yingyu;
stu1[si1].yuwen=p->yuwen;
si1++;
}
}
}
/******************************************************/
}//链表存入两个数组
//输出成绩排序
void OutPx(struct node*head,struct node1 stu[],int si,int n){//stu[50]数组,int si长度,int n班级。
int j,k=0;
int i,h;
//控制学科。
struct xueke
{
char aa[15];
}km[4]={{"语文"},{"数学"},{"英语"},{"总成绩"}};
lbzsz(head);
printf("\t\t%d班的成绩排序\n",n);
for(i=0,h=1;
i<4;
i++,h++){//for1
for(j=0;
j;
j++){//for2
for(k=0;
k-1-j;
k++){//for3
if(h==1){
if(stu[k].yuwen[k+1].yuwen){
t=stu[k+1];
stu[k+1] =stu[k] ;
stu[k]=t;
}
}
if(h==2){
if(stu[k].shuxue[k+1].shuxue){
t =stu[k+1];
stu[k+1] =stu[k] ;
stu[k] =t ;
}
}
if(h==3){
if(stu[k].yingyu[k+1].yingyu){
t=stu[k+1];
stu[k+1] =stu[k] ;
stu[k] =t ;
}
}
if(h==4){
if(stu[k].num[k+1].num){
t =stu[k+1];
stu[k+1] =stu[k] ;
stu[k] =t ;
}
}
}//for3结束
}//for2结束
printf("%s排名\n学号\t姓名\t班级\t%s成绩\t排名\n",km[i].aa,km[i].aa);
if(h==1){
for(j=0,k=1;
j;
j++,k++)
printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].yuwen,k);
}
if(h==2){
for(j=0,k=1;
j;
j++,k++)
printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].shuxue ,k);
}
if(h==3){
for(j=0,k=1;
j;
j++,k++)
printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].yingyu ,k);
}
if(h==4){
for(j=0,k=1;
j;
j++,k++)
printf("%d\t%s\t%d\t%lf\t%d\n",stu[j].date,stu[j].name,stu[j].me_class,stu[j].num,k);
}
}
}
//输出成绩统计
void Outtj(struct node1 stu[50],int si,int n)
{
doubleavg1=0,avg2=0,avg3=0;
doublek1=0,k2=0,k3=0;
//及格率
doublej1=0,j2=0,j3=0;
//优秀率
doublemax1;
doublemin1;
int j;
max1=stu[0].yuwen;
min1=stu[0].yuwen;
for(j=0;
j;
j++)
{
avg1+=stu[j].yuwen;
if(stu[j].yuwen>=60) k1++;
if(stu[j].yuwen>=90) j1++;
if(stu[j].yuwen>max1) max1=stu[j].yuwen;
if(stu[j].yuwen=60)k2++;
if(stu[j].shuxue>=90)j2++;
if(stu[j].shuxue>max1) max1=stu[j].shuxue;
if(stu[j].shuxue=60) k3++;
if(stu[j].yingyu>=90)j3++;
if(stu[j].yingyu>max1) max1=stu[j].yingyu;
if(stu[j].yingyu
#include
//结构体
struct node
{
int date;
//学号
int me_class;
//班级
double yuwen;
//语文成绩
double shuxue;
//数学成绩
double yingyu;
//英语成绩
double num;
//总分
double avg;
//平均分
char name[20];
//姓名
char kemu[20];
//所选科目
struct node *next;
};
struct node*input(struct node*head);
//01录入学生的资料和成绩.
struct node*add(struct node*head);
//02增加学生信息及成绩
struct node*find(struct node*head);
//3.查询学生信息及成绩
void del(struct node*head);
//04删除学生信息及成绩;
struct node*change(struct node*head);
//05修改学生信息和成绩
struct node* output(struct node*head);
//06浏览学生信息及成绩
void file(struct node*head);
//文件夹操作。 //主菜单
int menu(){
int i=1;
printf("\t\t 1.录入学生信息及成绩\n");
printf("\t\t 2.增加学生信息及成绩\n");
printf("\t\t 3.查询学生信息及成绩\n");
printf("\t\t 4.删除学生信息及成绩\n");
printf("\t\t 5.修改学生信息及成绩\n");
printf("\t\t 6.浏览学生信息及成绩\n");
printf("\t\t 7.保存学生成绩到c盘\n");
printf("\t\t 8.成绩分析系统\n");
printf("\t\t 0.退出\n");
printf("\t\t-----------------------------\n");
printf("\t请选择序号\n");
scanf_s("%d",&i);
while(1)
{
if(i<0||i>8)
{
printf("***没有此选项。请重新选择***\n");
system("pause");
}
break;
} return i;
}
struct node *last;
//尾节点
//01录入学生的资料和成绩.
struct node*input(node *head)//
{
int i=0,j=1;
struct node *p,*n;
p=(struct node*)malloc(sizeof(struct node));
p=head;
while(1)
{if(j>0)
{
i++;
n=(struct node*)malloc(sizeof(struct node));
printf("请输入第%d个学生的学号,姓名\n",i);
scanf("%d %s",&n->date,&n->name);
getchar();
printf("请输入科目(文或理)和班级(1或者2)\n");
scanf("%s %d",&n->kemu,&n->me_class);
fflush(stdin);
printf("请输当前学生的语文,数学,英语成绩\n");
scanf("%lf %lf %lf",&n->yuwen,&n->shuxue,&n->yingyu);
getchar();
n->num=n->yuwen+n->shuxue+n->yingyu;
n->avg=(p->num)/3;
p->next=n;
p=n;
printf("是否继续输入下一个同学的信息?输入 1 继续,输入0就停止输入\n");
fflush(stdin);
scanf("%d",&j);
fflush(stdin);
}
else
{
p->next=last=NULL;
p=last;
break;
}
}
free(p);
//释放p
return head;
}
//02增加学生信息及成绩
struct node*add(struct node*head)
{
if(head->next==NULL)
{
printf("还没有存储数据,请先存储数据");
return head;
}
else
{
struct node*head1,*p;
head1=(struct node*)malloc(sizeof(struct node));
printf("正在添加学生信息及成绩\n");
head1=input(head1);
//插入的节点用链表的方式存储.
p=head->next;
while(p->next!=NULL)
{
p=p->next;
}
p->next=head1->next;
//因为头结点是空的所以应该链接头结点的下一个节点。
return head;
}
}
//3.查询学生信息及成绩
struct node*find(struct node*head)
{
int i;
struct node*p;
if(head==NULL)
{
printf("还没有存储数据,请先存储数据\n");
}
else
{
printf("请输入你要找查的学号:");
scanf("%d",&i);
p=head->next;
while(p->date!=i&&p->next!=NULL)
{
p=p->next;
}
if(p->date==i)
{
printf("学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n");
printf("%d\t%s\t%d\t%s\t%lf\t%lf\t%lf",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu);
printf("\n");
return p;
}
else
{
printf("没有找到你要查找的同学\n");
return NULL;
}
}
}
//04删除学生信息及成绩;
void del(struct node*head)
{
int key,j=0;
struct node*p,*s;
s=head->next;
p=head;
printf("请输入你要删除学生的学号");
fflush(stdin);
//删除缓存的数据。
scanf("%d",&key);
while(s!=NULL)
{
if(s->date!=key)
{
p=s;
s=s->next;
}
else
break;
}
if(s!=NULL)
{
p->next=s->next;
free(s);
printf("删除成功\n");
}
else
printf("删除失败\n");
}
//05修改学生信息和成绩
struct node*change(struct node*head)
{
struct node*p=NULL;
p=find(head);
if(p==NULL)
{
printf("修改失败\n");
return head;
}
else
{
printf("请输入修改的学生信息\n");
printf("姓名 班级 科目\n");
scanf("%s %d %s",&p->name,&p->me_class ,&p->kemu);
fflush(stdin);
printf("请输入修改的学生成绩\n");
printf("语文 数学 英语\n");
scanf("%lf %lf %lf",&p->yuwen,&p->shuxue,&p->yingyu);
fflush(stdin);
//getchar()
printf("\n学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n");
printf("%d\t%s\t%d\t%s\t%lf\t%lf\t%lf\n",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu);
return head;
}
}
//06浏览学生信息及成绩(测试)
struct node* output(struct node*head)
{
if(head==NULL)
printf("还没有数据请先输入数据\n");
else
{
struct node *p;
p=head->next;
printf("学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n");
while(p!=NULL)
{
printf("%d\t%s\t%d\t%s\t%lf\t%lf\t%lf",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu);
p=p->next;
printf("\n");
}
printf("\n");
}
return head;
}
void file(struct node*head)
{
int i=0;
FILE *fp;
struct node*p=head->next;
fp=fopen("C:\\学生成绩单.txt","wt");
fprintf(fp,"学号\t姓名\t班级\t科目\t语文\t\t数学\t\t英语\n");
while(p!=NULL)
{
fprintf(fp,"%d\t%s\t%d\t%s\t%lf\t\t%lf\t\t%lf\n",p->date,p->name,p->me_class,p->kemu,p->yuwen,p->shuxue,p->yingyu);
p = p->next;
i++;
}
if(i>0)
printf("\t\t\t\t\t—————成功保存c盘—————\n");
else printf("\t\t\t\t\t—————没有数据保存失败到桌面—————\n");
fclose(fp);
}
复制时运行出错请看这里:c语言学生成绩管理系统
推荐阅读
- 算法笔记|bfs之解救小哈
- C语言|【sm2算法】基于mbedtls开源库国密算法的使用(二)
- #|《大话数据结构》从零开始 —— 第三章(线性表之链式存储结构 (单链表、静态链表、双向链表、循环链表))
- 项目|python之逻辑回归项目实战——信用卡欺诈检测
- 数据结构|数据结构基本概念以及线性表的基本操作
- #|数据结构与算法(2-2)线性表之链式存储(单链表、静态链表、循环链表、双向循环链表)
- 课程设计实验报告|本科课程【数据结构与算法】实验2——单链表与双向循环链表的插入、删除操作(C++实现)
- #|C语言
- c++编程|教你了解什么是C语言(快来看看吧)