c语言学生成绩管理系统(c语言链表实现学生管理系统)

本代码供读者学习使用,请不要随意转载。一、设计题目:学生成绩管理系统二、目的与要求每位学生记录包含有学号、姓名、性别、出生日期、三门功课的成绩(高等数学、大学英语、C语言)、总分和平均分系统菜单:(1)录入学生记录(2)添加学生记录(3)删除学生记录(4)修改学生记录(要求输入密码)(5)查找学生记录(按学号、按姓名)(6)按总分对记录进行降序排列…

大家好,又见面了,我是你们的朋友全栈君。

本代码供读者学习使用,请不要随意转载。

一、设计题目:学生成绩管理系统

二、目的与要求
每位学生记录包含有学号、姓名、性别、出生日期、三门功课的成绩(高等数学、大学英语、C语言)、总分和平均分
系统菜单:
(1)录入学生记录
(2)添加学生记录
(3)删除学生记录
(4)修改学生记录(要求输入密码)
(5)查找学生记录(按学号、按姓名)
(6)按总分对记录进行降序排列
(7)将当前结果显示或打印,重新保存进数据文件中
(8)输出所有学生信息
(9)计算班级平均分
(10)修改管理员密码(未保存至文件,程序关闭后失效)
(11)C语言挂科人数
(0)结束程序

#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
#include<malloc.h>
#include<math.h>
#define LEN sizeof(struct student)
struct student
{
struct student *next;
long num;
char name[8];
char sex[4];
int year;
int month;
int day;
float c;
float math;
float eng;
float sum;
};
int n;
struct student * creat()          //建立基础的学生信息库 
{
struct student * head,*p1,*p2;
n=0;
p1=p2=(struct student *)malloc(LEN);
printf("输入学生的学号为0时,停止录入.\n");
printf("请输入学生学号:");
scanf("%ld",&p1->num);
if(p1->num!=0)
{
printf("请输入学生姓名:");scanf("%s",p1->name);
printf("请输入学生性别:");scanf("%s",p1->sex); 
printf("请输入学生生日:\n");
printf("年:");scanf("%d",&p1->year);
printf("月:");scanf("%d",&p1->month);
printf("日:");scanf("%d",&p1->day);
printf("c语言:");scanf("%f",&p1->c);
printf("高数:");scanf("%f",&p1->math);
printf("英语:");scanf("%f",&p1->eng);
p1->sum=p1->c+p1->eng+p1->math;
printf("\n");
}
while(p1->num!=0)
{
n=n+1;
if(n==1)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
p1=(struct student *)malloc(LEN);
printf("请输入学生学号:");
scanf("%ld",&p1->num);
if(p1->num!=0)
{
printf("请输入学生姓名:");scanf("%s",p1->name);
printf("请输入学生性别:");scanf("%s",p1->sex);
printf("请输入学生生日:\n");
printf("年:");scanf("%d",&p1->year);
printf("月:");scanf("%d",&p1->month);
printf("日:");scanf("%d",&p1->day);
printf("c语言:");scanf("%f",&p1->c);
printf("高数:");scanf("%f",&p1->math);
printf("英语:");scanf("%f",&p1->eng);
p1->sum=p1->c+p1->eng+p1->math;
printf("\n");
}
}
p2->next=NULL;
return head;
}
struct student * del(struct student *head,long num) //删除学生信息 
{
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("你删除的学生信息为:\n");
printf("学号:%ld\n",p1->num);
printf("姓名:%s\n",p1->name);
printf("性别:%s\n",p1->sex);
printf("生日:\n");
printf("年:%d\n",p1->year);
printf("月:%d\n",p1->month);
printf("日:%d\n",p1->day);
printf("c语言:%5.2f\n",p1->c);
printf("高数:%5.2f\n",p1->math);
printf("英语:%5.2f\n",p1->eng);
p1->sum=p1->c+p1->math+p1->eng;
printf("总分:%5.2f\n",p1->sum);
printf("\n");
n=n-1;
}
else
printf("输入有误!\n");
return head;
}
struct student * insert (struct student *head,struct student *stud) //添加学生信息 
{
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;
return head;
}
void sort(struct student  *head) //排序 
{
struct student *p, *q, *max;
long temp1;
char temp2[4],temp9[4];
int temp3,temp4,temp5;
float temp,temp6,temp7,temp8;
p = head;
while (p != NULL)
{
max = p;
q = p->next;
while (q != NULL)
{
if (max->sum < q->sum)
max = q;
q = q->next;
}
// 交换值
if (max != p)
{
temp = max->sum;max->sum = p->sum;p->sum = temp;
temp1=max->num;max->num=p->num;p->num=temp1;
strcpy(temp2,max->name);strcpy(max->name,p->name);strcpy(p->name,temp2);
temp3=max->year;max->year=p->year;p->year=temp3;
temp4=max->month;max->month=p->month;p->month=temp4;
temp5=max->day;max->day=p->day;p->day=temp5;
temp6=max->c;max->c=p->c;p->c=temp6;
temp7=max->math;max->math=p->math;p->math=temp7; 
temp8=max->eng;max->eng=p->eng;p->eng=temp8;
strcpy(temp9,max->sex);strcpy(max->sex,p->sex);strcpy(p->sex,temp9);
}
p = p->next;
}
printf("排序以后的学生信息为:\n"); 
struct student *p1;
p1 = head;
int count=1;
while(p1!=NULL)
{
printf("第%d名:\n",count);
printf("学号:%ld   ",p1->num);
printf("姓名:%s   ",p1->name);
printf("生日:");
printf("%d.",p1->year);
printf("%d.",p1->month);
printf("%d   ",p1->day);
printf("c语言:%5.3f   ",p1->c);
printf("高数:%5.3f   ",p1->math);
printf("英语:%5.3f   ",p1->eng);
printf("总分:%4.2f   ",p1->sum);
printf("\n");
count++;
p1=p1->next;   
}
}
float ave(struct student * head)//求平均数
{
int i;
float ave,sum=0;
struct student *p;
p=head;
for(i=0;p!=NULL;i++)
{
sum=sum+p->sum;
p=p->next;
}
ave=sum/i;
return ave;
}
void change(struct student *head,long num)//修改学生数据 
{
struct student *p;
p=head;
for(;p!=NULL;)
{
if(p->num==num)
{
printf("请输入学生姓名:");scanf("%s",p->name);
printf("请输入学生性别:");scanf("%s",p->sex);
printf("请输入学生生日:\n");
printf("年:");scanf("%d",&p->year);
printf("月:");scanf("%d",&p->month);
printf("日:");scanf("%d",&p->day);
printf("c语言:");scanf("%f",&p->c);
printf("高数:");scanf("%f",&p->math);
printf("英语:");scanf("%f",&p->eng);
p->sum=p->c+p->eng+p->math;
printf("\n");
break;
}
else
{
p=p->next;
} 
}
}
void filein(struct student *head)//保存到文件中 
{
FILE *fp;
struct student *p;
if((fp=fopen("D:\\20161181\\23\\student.dat","wb"))==NULL)//打开文件 
{
printf("can't open.\n");
exit(0);
}
p=head; 
while(p!=NULL)                //将链表的内容存储到文本文件中 
{
fwrite(p,LEN,1,fp);
printf("\n");
p=p->next;
}
fclose(fp);
printf("成功保存至D:\\20161181\\23\\student.dat\n");
}
struct student *fileout(struct student *head)
{
FILE *fp;
struct student *p,*s;
if((fp=fopen("D:\\20161181\\23\\student.dat","rb"))==NULL)
return NULL;
else if(fgetc(fp)==EOF)
return NULL;
rewind(fp);
head=(struct student *)malloc(LEN);
fread(head,LEN,1,fp);
p=head;
while(!feof(fp))
{
s=(struct student *)malloc(LEN);
if(fread(s,LEN,1,fp)==0)
break;
p->next=s;
p=s;
p->next=NULL;
}
return head;
fclose(fp);
}
struct student * locate(struct student *head,long num1)//按学号查找
{
struct student *p1,*p2;
p1=head;
if(head==NULL)    //空链表时返回
{
printf("/n链表为空!/n");
return(head);
}
else
{
while(num1!=p1->num && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->num==num1)//比较输入学号是否与链表中学生学号匹配 
{
printf("查找的学生信息为:\n");
printf("学号:%ld\n",p1->num);
printf("姓名:%s\n",p1->name);
printf("性别:%s\n",p1->sex);		                    		 					
printf("生日:\n");		                    
printf("年:%d\n",p1->year);		                   
printf("月:%d\n",p1->month);	                    
printf("日:%d\n",p1->day);	                    
printf("c语言:%5.3f\n",p1->c);		                    
printf("高数:%5.3f\n",p1->math);		                    
printf("英语:%5.3f\n",p1->eng);
p1->sum=p1->c+p1->eng+p1->math;
printf("总分:%5.2f\n",p1->sum);	                   
printf("\n");		                   
return head;
}
else
{
printf("无该学生数据\n");
return head;
}
}
}
struct student * locate1(struct student *head)//按姓名查找
{
char name[10];
printf("请输入要查询学生的姓名:");
scanf("%s",name); 
struct student *p1,*p2;
p1=head;
if(head==NULL)    //空链表时返回
{
printf("/n链表为空!/n");
return(head);
}
else
{
while(strcmp(name,p1->name)!=0 && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(name,p1->name)==0)//比较输入姓名与链表中学生姓名是否匹配 
{
printf("查找的学生信息为:\n");
printf("学号:%ld\n",p1->num);
printf("姓名:%s\n",p1->name);
printf("性别:%s\n",p1->sex);		                    		 					
printf("生日:\n");		                    
printf("年:%d\n",p1->year);		                   
printf("月:%d\n",p1->month);	                    
printf("日:%d\n",p1->day);	                    
printf("c语言:%5.3f\n",p1->c);		                    
printf("高数:%5.3f\n",p1->math);		                    
printf("英语:%5.3f\n",p1->eng);
p1->sum=p1->c+p1->eng+p1->math;
printf("总分:%5.2f\n",p1->sum);	                   
printf("\n");		                   
return head;
}
else
{
printf("无该学生数据\n");
return head;
}
}
}
//输出学生信息 
void print(struct student *head)
{
struct student *p;
p=head;
printf("现在链表里的数据为:\n");
while(p!=NULL)
{
printf("学号:%ld   ",p->num);
printf("姓名:%s   ",p->name);
printf("性别:%s   ",p->sex);
printf("生日:%d.",p->year);
printf("%d.",p->month);
printf("%d   ",p->day);
printf("c语言:%5.2f   ",p->c);
printf("高数:%5.2f   ",p->math);
printf("英语:%5.2f   ",p->eng);
printf("总分:%5.2f   ",p->sum);
printf("\n");
p=p->next;
}
printf("\n");
}
void sum(struct student *head)
{
int n=0;
struct student *p,*p1;
p=head;
while(p!=NULL)
{
if(p->c<60)
{
n++;	
}
p=p->next; 
}
if(n==0)
{ 
printf("(o^.^o)本次C语言无人挂科.\n");
}
if(n>0)
{ 
printf("本次C语言挂科人数有%d人\n\n",n);
printf("挂科人员的学号,姓名如下\n\n");
}
p1=head;
while(p1!=NULL&&p1->c<60)
{
printf("学号:%ld  ",p1->num);
printf("姓名:%s\n",p1->name);
p1=p1->next;
}
printf("\n");
}
int main()
{
int choose,n;
long number,e;
char name[6];
struct student *head,*p;
char password[10]={"123456"};
char password1[10],password2[10],password3[10],password4[10],num[12];
printf("请输入进入学生成绩管理系统的管理员代号和密码:\n系统默认登录密码为:123456.\n管理员代号:");
scanf("%s",num);
printf("密码:"); 
scanf("%s",password1);
printf("\n");
for(;;)
{
if(strcmp(password1,password)!=0)
{
printf("输入错误,请重新输入:\n管理员代号:");
scanf("%s",num);
printf("\n密码:"); 
scanf("%s",password1);
printf("\n");
}
else
{
printf("%s管理员成功登陆\n",num); 
break;
}	
}
printf("★★★★欢迎使用学生成绩管理系统★★★★\n\n");
printf("---------------------------------------\n");
printf("\t0.退出程序\n\t1.录入学生记录\n\t2.添加学生记录\n");
printf("\t3.删除学生记录\n\t4.修改学生记录\n");
printf("\t5.查找学生记录\n\t6.按总分对学生记录进行降序排序\n");
printf("\t7.将数据保存至文件\n\t8.输出所有学生信息\n\t9.计算班级平均分\n");
printf("\t10.修改管理员密码\n\t11.统计C语言挂科人数\n");
system("pause");
system("cls");
head=fileout(head);
choose=-1;
while(choose!=0)
{
printf("★★★★欢迎使用学生成绩管理系统★★★★\n");
printf("---------------------------------------\n");
printf("\t0.退出程序\n\t1.录入学生记录\n\t2.添加学生记录\n");
printf("\t3.删除学生记录\n\t4.修改学生记录\n");
printf("\t5.查找学生记录\n\t6.按总分对学生记录进行降序排序\n");
printf("\t7.将数据保存至文件\n\t8.输出所有学生信息\n\t9.计算班级平均分\n");
printf("\t10.修改管理员密码\n\t11.统计C语言挂科人数\n");
printf("请输入一个数字:\n");
scanf("%d",&choose);
system("cls");
switch(choose)
{
case 0:
printf("\n\n");
printf("★★★★期待您的下次使用★★★★");
printf("\n\n");
break;
case 1:
head=creat();
system("pause");
system("cls");
break;
case 2:
p=(struct student *)malloc(LEN);
printf("请输入要添加学生学号\n"); 
printf("学号:\n");
scanf("%ld",&p->num);
if(p->num!=0)
{
printf("请输入学生姓名:");scanf("%s",p->name);
printf("请输入学生性别:");scanf("%s",p->sex);
printf("请输入学生生日:\n");
printf("年:");scanf("%d",&p->year);
printf("月:");scanf("%d",&p->month);
printf("日:");scanf("%d",&p->day);
printf("c语言:");scanf("%f",&p->c);
printf("高数:");scanf("%f",&p->math);
printf("英语:");scanf("%f",&p->eng); 
p->sum=p->c+p->eng+p->math;
head=insert(head,p);
}
system("pause");
system("cls");
break;
case 3:
printf("输入您要删除的学号:\n");
scanf("%ld",&e);
if(e!=0)
head=del(head,e);
system("pause");
system("cls");
break;
case 4:
int num;
printf("请输入密码:\n");
scanf("%s",password4);
while(strcmp(password,password4)!=0)
{
printf("输入错误,请重输:\n");
scanf("%s",password4);
} 
printf("输入密码正确!\n");
printf("请输入要修改学生学号:");
scanf("%ld",&num);
change(head,num); 
system("pause");
system("cls");
break;
case 5:
int ch;
printf("输入您要查找的学生的内容:\n1.按学号查找\n2.按姓名查找\n");
scanf("%d",&ch);
if(ch==1)
{
printf("请输入要查询学生学号:");
scanf("%ld",&number);
head=locate(head,number);
printf("\n");
}
if(ch==2)
{
head=locate1(head);
printf("\n");
}
system("pause");
system("cls");
break;
case 6:
sort(head);
system("pause");
system("cls");
break;
case 7:
filein(head); 
system("pause");
system("cls");
break;					
case 8:
print(head);
system("pause");
system("cls");
break;
case 9:
float aver;
aver=ave(head);
printf("该班平均分为:%4.2f\n",aver);
system("pause");
system("cls");
break;
case 10:
printf("旧密码:");
scanf("%s",password1);
printf("新密码:");
scanf("%s",password2);
printf("请您确认新密码:"); 
scanf("%s",password3);
for(;;)
{
if(strcmp(password,password1)!=0)
{
printf("输入的旧密码有误\n");
printf("旧密码:");
scanf("%s",password1);
printf("新密码:");
scanf("%s",password2);
printf("请确认新密码:"); 
scanf("%s",password3);
}
if(strcmp(password2,password3)!=0)
{
printf("输入的新密码与确认的新密码不一致\n");
printf("旧密码:");
scanf("%s",password1);
printf("新密码:");
scanf("%s",password2);
printf("请确认新密码:"); 
scanf("%s",password3);
}
if(strcmp(password1,password)==0&&strcmp(password2,password3)==0)
{
printf("成功修改密码.\n");
break; 
}
}
strcpy(password,password2);
system("pause");
system("cls");
break;
case 11:
sum(head);
system("pause");
system("cls");
break;
}
}
return 0;
}

1.先输入系统规定密码123456进入学生成绩管理系统。进入后能看到以下界面。
主界面
2.按照下图信息进行学生信息的录入。
学生信息录入
3.按3删除学号为3的学生信息。
这里写图片描述
再按8看看链表中的数据是不是被删除了。
这里写图片描述
4.按2添加学生为3的学生信息。
这里写图片描述
按8看看添加的效果,程序是按照学号排序的方式插入的。
这里写图片描述

5.按数字5查找学生记录。(两种方式。1.按照学号查询 2.按照姓名查询)
1.按照学号查询
这里写图片描述
2.按照姓名查询
这里写图片描述

6.按数字6根据总分对学生成绩进行排序。
这里写图片描述

7.按数字9计算班级平均分
8.按数字10进行密码修改(由于未存入文件,再次打开仍然要输入原始密码,此项密码修改只针对第4项功能的修改学生记录时的密码输入)
这里写图片描述
9.按数字4进行学生记录的修改(需要输入上次修改密码)
这里写图片描述

可以看到原始密码123456已经失效。
9.按数字11统计C语言挂科人数。
有挂科人员时,会输出挂科人员的学号和姓名。
这里写图片描述
10.按数字7将学生信息保存至文件(文件路径为D:\20161181\23\stu.dat)。
第二次打开程序时,原有数据会丢失,由于没有做读取文件的功能。

读者可以自行完善文件的读取功能

这里写图片描述
11.按数字0退出程序。

经测试,上述代码未出现问题。

关注公众号,获取更多资源。在后台回复学生成绩管理系统,即可获取源码。
在这里插入图片描述

每天进步一点点,开心也多一点点

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127432.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 服务器加网站防盗链,网站防盗链的设置方法介绍(适用于IIS和Apache)[通俗易懂]

    服务器加网站防盗链,网站防盗链的设置方法介绍(适用于IIS和Apache)[通俗易懂]这篇文章主要为大家详细介绍了网站防盗链的设置方法介绍(适用于IIS和Apache),具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴。做网站的朋友一般都会遇到这样的一种情况,就是别人的网站经常会调用我们自己网站的图片或者文件,这无形之中会增加我们的服务器的压力,尤其是对于一些服务器带宽并不是十分富裕的网站来说就更是雪上加霜。因此我们需要学会设置防盗链来应对或者说来…

  • inner join on, left join on, right join on的区别与介绍

    TableA aidadate 1a1 2a2 3a3 TableB bidbdate 1b1 2b2&

    2021年12月26日
  • java定时执行任务CRON表达式[通俗易懂]

    java定时执行任务CRON表达式[通俗易懂]CRON表达式在线验证网址:http://cron.qqe2.com/在类上使用@Scheduled注解例子:packagecom.mxx.demo;@Scheduled(cron="0/5****?")//定时执行任务注解publicclassQuartzDemo{类中方法省略}##以下为CRON表达式规则正文:…

  • 指针基础知识笔记

    指针基础知识笔记指针式C语言中的重要概念,也是C语言的一个重要特色,C的精华所在吧。1.指针-内存地址;2.指针变量:定义为,存放指向存储什么数据类型的地址的变量;它的值就是地址; 定义指针变量: 类型名*指针变量名;//类型名就是指向地址上的数据的类型; 例如: char*pa; int*pb;(注意的是):避免访问未初始化的指针; 3.取地址运算符:&获取某个变量的地址;//初始化指针; 例如:(chara;intb); char

  • c++发送post请求_request的post方法作用

    c++发送post请求_request的post方法作用介绍:RestSharpRestSharp是一个轻量的,不依赖任何第三方的组件或者类库的Http的组件。RestSharp具体以下特性;1、通过NuGet方便引入到任何项目(Install-Packagerestsharp)支持net4.0++2、可以自动反序列化XML和JSON3、支持自定义的序列化与反序列化4、自动检测返回的内容类型5、支持HTTP的GET,POST,PUT,HEAD,OPTIONS,DELETE等操作…

  • ZTE E700 自用感受及软件推荐

    ZTE E700 自用感受及软件推荐ZTEE700自用感受及软件推荐声明声明:此帖是转的  前两天看到移动08年新出的承诺话费换手机业务,换了个折扣最高的ZTEE700,首先声明我用的手机并不是很多,所以说错了希望大家见谅。这个机器我非常满意,非常好用!质量没得说,我从手里掉到水泥地上机器翻了3个跟头拿起来一点问题都没有。内置功能很强大,不过扩展功能则比较残废,好在机器本身的功能就能满足90%以上人的需求了,游戏…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号