成绩管理系统

这是一个基于C语言实现的学生信息管理系统,支持学生信息的增删改查等功能,并提供了成绩排序功能。系统采用链表来存储学生信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*为什么我的这个成绩管理系统  只要有两个人的成绩以后  再次使用add函数就不能添加了学生了*/
#include <stdlib.h>
#include<conio.h>
#include<string.h>

struct student
{
int number;
char name[20];
int score;
struct student *next;

}*head=NULL;
int N=0;

int couting(struct student *head);
struct student *creat();
void change(struct student *head);
void search(struct student *head);
//void add(struct student* head);
void add(void);
void delect(struct student *head);
void printlist(struct student *head);
void sort(struct student *head);
void login();
void select();
void menu();

int main()
{
login();
menu();
select();
return 0;

}
//创建链表(创建学生的信息)
struct student *creat()
{
printf("你想创建几个节点");
int n;
scanf("%d",&n);
struct student *head,*node,*end;
head=(struct student *)malloc(sizeof(struct student));
end=head;
while(0<n)
{
node=(struct student*)malloc(sizeof(struct student));
printf("请输入学生的学号,姓名和 ,成绩\n");
scanf("%d%s%d",&node->number,node->name,&node->score);
end->next=node;
end=node;
n--;
system("cls");
}

end->next=NULL;
return head;

};

//修改学生的信息

void change(struct student *head)

{

char key;
if(head==NULL)
{
printf("还没有学生数据,必须手动添加,按任意键返回主菜单\n");
getchar();
return ;
}
while(1)
{

char named[20];
printf("请输入你想修改的学生的名字\n");
scanf("%s",named);
struct student *p1=head->next;
while(strcmp(p1->name,named)!=0&&p1->next!=NULL)
{
  p1=p1->next;

}

if(strcmp(p1->name,named)==0)
{
  printf("这个学生的信息是\n");
  printf("%d\t%s\t%d\t\n",p1->number,p1->name,p1->score);
  printf("请输入你想修改的学生的信息,学号,姓名,和成绩\n");
  scanf("%d%s%d",&p1->number,p1->name,&p1->score);
  printf("修改成功是否继续 yes or no\n");
  setbuf(stdin,NULL);
  scanf("%c",&key);
  if(key=='Y'||key=='y')
  {
      change(head);
  }
  else
  {
      break;
  }
}

else
{
  printf("你输入的学生不存在,请重新查找");
  getch();
  system("cls");
}

}

};

//查找学生的信息,并且输出

void search(struct student *head)

{
if(head==NULL)
{
printf("还没有学生数据必须手动添加,按任意键返回主菜单");
getchar();
return ;
}
char key;
char named[20];
while(1)
{
printf("请输入你想查找的学生的姓名\n");
struct student *p1=head->next;
scanf("%s",named);
while(p1->name!=named&&p1->next!=NULL)
{
  p1=p1->next;

}

if(p1->name==named)
{
  printf("你想查找的学生的信息是\n");
  printf("%d%s%d\n",p1->number,p1->name,p1->score);
  printf("是否继续 yes or no\n");
  setbuf(stdin,NULL);
  scanf("%c",&key);
  if(key=='Y'||key=='y')
  {
      search(head);
  }
  else
  {
      break;
  }

}

else
{
  printf("找不到该学生,请重新查找");
  getch();
  system("cls");
}

}

};


//增加一个学生

//void add(struct student* head)
void add(void)
{
int n;
char key;
if(head==NULL)
{
struct student *p2=(struct student *)malloc(sizeof(struct student));
if(p2 == NULL)
{
  printf("申请内存空间失败!\n");
  exit(1);
}
printf("还没有学生的任何信息,是否手动添加一个Y or N");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
  //struct student *head=(struct student *)malloc(sizeof(struct student));
  head=(struct student *)malloc(sizeof(struct student));
  if(head == NULL)
{
  printf("申请内存空间失败!\n");
  exit(1);
}
  printf("请输入该学生的信息,依次为学号,姓名,成绩\n");
  setbuf(stdin,NULL);
  scanf("%d%s%d",&p2->number,p2->name,&p2->score);
  head->next=p2;
  p2->next=NULL;
  printf("插入完毕是否继续插入Y/N");
  setbuf(stdin,NULL);
  scanf("%c",&key);
  if(key=='y'||key=='Y')
  {
      //add(head);
      add();
  }
  else
  {
      printf("按任意键返回主菜单\n");
      setbuf(stdin,NULL);
      getchar();
      //free(p2);
      return;
  }
}
else
{
  printf("按回车键返回主菜单\n");
  setbuf(stdin,NULL);
  getchar();
  //free(p2);
  return;
}

}
struct student *p3=(struct student *)malloc(sizeof(struct student));
struct student *p1=head;
struct student *p2;
printf("你想在哪里增加节点的信息\n");
scanf("%d",&n);
if(n<=0)
{
printf("输入错误,按任意键返回菜单");
setbuf(stdin,NULL);
getchar();
return ;

}
for(int i=0;i<n;i++)
{
N=couting(head);
p2=p1;
p1=p1->next;
if(p1->next==NULL&&i==0)
{
  printf("这个链表只有一个学生,是否插在这个这个学生之前y or n\n");
  setbuf(stdin,NULL);
  scanf("%c",&key);
  if(key=='y'||key=='Y')
  {
      printf("请输入该学生的信息,依次为学号\t,姓名\t,成绩\n");
      scanf("%d%s%d",&p3->number,p3->name,&p3->score);
      p3->next=head->next;
      head->next=p3;
      printf("插入完毕,是否继续 Y or N");
      setbuf(stdin,NULL);
      scanf("%c",&key);
      if(key=='Y'||key=='y')
      {
          //add(head);
          add();
      }
      else
      {
          printf("按任意键返回");
          setbuf(stdin,NULL);
          getchar();
          return ;
      }

  }
  printf("是否愿意插在这个学生之后呢y or N");
  setbuf(stdin,NULL);
  scanf("%c",&key);
  if(key=='y'||key=='Y')
  {
      printf("请输入该学生的信息,依次为学号,姓名,成绩\n");
      scanf("%d%s%d",&p3->number,p3->name,&p3->score);
      p1->next=p3;
      p3->next=NULL;
      printf("插入完毕是否继续 Y OR N\n");
      setbuf(stdin,NULL);
      scanf("%c",&key);
      if(key=='Y'||key=='y')
      {
          //add(head);
          add();
      }
      else
      {
          printf("按任意键返回");
          setbuf(stdin,NULL);
          getchar();
          return ;
      }

  }

  else
  {
          printf("按任意键返回");
          setbuf(stdin,NULL);
          getchar();
          return ;
  }

}

if(N==n&&p1->next==NULL)
{
printf("您输入的位数恰好是倒数第二个节点,是否进行插入 y or n\n");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{

  printf("请依次输入该学生的学号\t姓名\t成绩\t,");
  scanf("%d%s%d",&p3->number,p3->name,&p3->score);
  p3->next=p2->next;
  p2->next=p3;
  printf("插入完毕,是否继续Y OR N\n");
  setbuf(stdin,NULL);
  scanf("%c",&key);
  if(key=='y'||key=='Y')
  {
      //add(head);
      add();

  }
  else
  {
      printf("按任意键返回菜单\n");
      setbuf(stdin,NULL);
      getchar();
      return ;
  }
}
else
{
  printf("按任意键返回菜单\n");
  setbuf(stdin,NULL);
  getchar();
  return ;
}

}
else

{
  printf("按任意键返回主菜单\n");
  setbuf(stdin,NULL);
  getchar();
  return ;

}


if(p1==NULL)
{

printf("您输入的位数太多,只能插在最后一个节点\n");
printf("是否进行插入 y or Y\n");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
  printf("请输入这个学生的各项信息,依次为学号姓名成绩\n");
  scanf("%d%s%d",&p3->number,p3->name,&p3->score);
  p1->next=p3;
  p3->next=NULL;
  printf("插入完毕,是否继续");
  setbuf(stdin,NULL);
  scanf("%c",&key);
  if(key=='y'||key=='Y')
  {
      //add(head);
      add();
  }
  else
  {
      printf("按任意键返回主菜单");
      setbuf(stdin,NULL);
      getchar();
      return ;
  }

}

else
{
  printf("按任意键返回菜单\n");
  setbuf(stdin,NULL);
  getchar();
  return ;
}

}

}

if(p1->next!=NULL)
{
printf("请输入你插入的这个学生的信息,依次为学号\t姓名\t成绩\n");
scanf("%d%s%d",&p3->number,p3->name,&p3->score);
p3->next=p2->next;
p2->next=p3;
printf("插入完毕,按任意键返回\n");
setbuf(stdin,NULL);
getch();
return ;
}

else
{
printf("666");
setbuf(stdin,NULL);
getchar();
}

};

//删除学生的信息

void delect(struct student *head)
{
if(head==NULL)
{
printf("还没有学生数据,必须手动添加,按任意键返回主菜单\n");
getchar();
return ;
}
char key;
if(head->next==NULL)
{
printf("请返回菜单进行学生信息插入");
getchar();
return ;
}

char names[20];
printf("请输入你查找的学生的名字\n");
scanf("%s",names);
struct student *p1=head->next,*p2=head;
while(strcmp(p1->name,names)!=0)
{

p2=p1;
p1=p1->next;
if(p1->next==NULL&&strcmp(p1->name,names)==0)
{

  printf("你要删除的学生是最后一个节点,是否进行删除y/n");
  setbuf(stdin,NULL);
  scanf("%c",&key);
  if(key=='Y'||key=='y')
  {

      free(p1);
      p2->next=NULL;
      printf("已删除该学生\n");
      getchar();
      return ;
  }

  else
  {
      printf("按任意键返回");
      getchar();
      return ;
  }

}

if(p1->next==NULL&&strcmp(p1->name,names)!=0)
{
  printf("找不到该学生,请按任意键返回");
  getchar();
  return ;
}

}

if(strcmp(p1->name,names)==0)
{
if(p1->next==NULL)
{
  printf("这是这个链表的唯一一个学生数据是否进行删除Y/N");
  setbuf(stdin,NULL);
  scanf("%c",&key);
  if(key=='y'||key=='Y')
  {
      free(p1);
      head==NULL;
  }

  else
  {
      printf("按任意键返回\n");
      getchar();
      return ;
  }

}
printf("找到该学生,是否现在删除该学生的信息\n(y/n)");
setbuf(stdin,NULL);
scanf("%c",&key);
if(key=='y'||key=='Y')
{
  p2->next=p1->next;
  free(p1);
  printf("已删除该学生信息,是否继续 yes or no(y/n)");
  setbuf(stdin,NULL);
  scanf("%c",&key);
  if(key=='y'||key=='Y')
  {
      delect(head);

  }

  else
  {
      return ;
  }

}
else
{
  printf("按任意键返回\n");
  getchar();
  return ;
}

}

};

//遍历链表,打印所有学生信息
void printlist(struct student *head)
{
if(head->next==NULL)
{
printf("还没有录入学生信息,请按任意键返回菜单进行插入");
getchar();
return ;
}
int n;
struct student *p1=(head->next);
printf("你想打印多少个学生的信息\n");
scanf("%d",&n);
if(n==0)
{
printf("输入错误,按任意键返回菜单");
setbuf(stdin,NULL);
getchar();
return ;

}
for(int i=0; i<n; i++)
{
printf("学号%d\t姓名%s\t成绩%d\n",p1->number,p1->name,p1->score);
p1=p1->next;
if(p1==NULL)
{
  break;
}
}
printf("打印完毕按任意键返回");
getchar();

}

void sort(struct student *head)
{
char demo[20];
if(head->next==NULL)
{
printf("占时还无学生数据,必须添加,按任意键返回主菜单");
getchar();
return ;
}
int i,j,temp,n;
printf("你想对几个学生的成绩进行排序\n");
scanf("%d",&n);
for(i=1; i<n; i++)
{
struct student *p1=head->next,*p2=p1->next;
for(j=i; j<n; j++)
{
  if(p1->score<p2->score)
  {
      temp=p1->score;
      p1->score=p2->score;
      p2->score=temp;
      temp=p1->number;
      p1->number=p2->number;
      p2->number=temp;
      strcpy(demo,p1->name);
      strcpy(p1->name,p2->name);
      strcpy(p2->name,demo);

  }
  if(p2->next==NULL)
  {
      break;
  }
  p1=p1->next;
  p2=p2->next;
}
}

printf("这些排序后的成绩是\n");
printlist(head);
getchar();
return ;
}


void menu()

{
printf("1录入学生成绩\n");
printf("2添加学生信息\n");
printf("3修改学生信息\n");
printf("4删除学生信息\n");
printf("5打印学生信息\n");
printf("6对学生成绩进行排名\n");

}

void login()

{
int i=3;
int j=0;
char nameme[20],passward[20];
while(i)
{
printf("欢迎来到学生成绩管理系统\n");
printf("请输入用户名\n");
scanf("%s",nameme);
printf("请输入密码\n");
while(1)
{
  passward[j]=getch();
  if(passward[j]=='\r')
  {
      passward[j]='\0';
      break;

  }
  j++;
  printf("*");
}

if(strcmp(nameme,"1")==0&&strcmp(passward,"1")==0)
{
  printf("登陆成功\n");
  printf("请选择你想要的功能\n");
  break;

}
else
{
  printf("登陆失败,请重新输入,你还有%d次机会\n",i);
  system("pause");
  i--;
  getchar();
  system("cls");
  if(i==0)
  {
      printf("您输入的错误次数过多,按任意键,退出系统\n");
      getchar();
      exit(0);
  }
}
}

}

int couting(struct student *head)
{
struct student *p1=head;
while(p1->next!=NULL)
{
N++;
p1=p1->next;
}
return N;
}


void select()

{
int demo;
scanf("%d",&demo);
switch(demo)
{
case 1:
head=creat();
printf("按任意键返回\n");
setbuf(stdin,NULL);
getch();
system("cls");
menu();
select();

case 2:
//add(head);
add();
printf("按任意键返回\n");
setbuf(stdin,NULL);
getch();
system("cls");
menu();
select();

case 3:
change(head);
printf("按任意键返回\n");
setbuf(stdin,NULL);
getchar();
system("cls");
menu();
select();


case 4:
delect(head);
printf("按任意键返回\n");
setbuf(stdin,NULL);
getch();
system("cls");
menu();
select();

case 5:
printlist(head);
printf("按任意键返回\n");
setbuf(stdin,NULL);
getch();
system("cls");
menu();
select();


case 6:
sort(head);
printf("按任意键返回\n");
setbuf(stdin,NULL);
getch();
system("cls");
menu();
select();
}
}
学生成绩管理系统是一个学校不可缺少的重要部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生成绩管理系统应该为用户提供充足的信息和快捷的查询手段。当前成教学院没有一个完善的成绩信息管理平台,计算机使用主要基于Microsoft Office,不能发挥有效的作用。而且随着我国教育改革的不断深入以及自学教育的不断扩招,参加考试的人越来越多,考试科目的多样化,使得成教学院对自学考试成绩的管理越趋繁琐、复杂,工作业务繁杂,工作量大,这种传统的学生管理模式已经暴露出种种弊端:难以统一调配和处理,效率极低,缺乏科学性以及合理性。随着计算机应用的普及与深入,利用计算机能够对所有自学考试成绩进行统一管理,并进行分析,大大减少教学秘书的工作量,提高工作效率,为教学办公带来了极大的方便。通过操作手册,使用者可以了解本软件的基本工作原理及使用说明。操作人员只需输入一些简单的汉字、数字,就可以存储、查找、修改、打印学生成绩信息等。本系统开发的总体任务是实现学生成绩管理的系统化、规范化、自动化、达到提高学生成绩管理效率的目的,本系统本着实用性、通用、开放和安全的原则,使数据库开发软件开发制作,实现了学生信息管理、课程信息管理、学生成绩管理、成绩查询等功能。该设计方法易于推广至其它信息化管理系统的设计,充分利用计算机作为辅助工具,实现学生考试成绩从传统的手工管理到计算机管理,对提高管理效率和节约大量的人力、物力有一定的推动作用。本系统一切从实际出发,充分考虑了成绩的内部管理、信息交流等方面的复杂需求,实现成绩的有效管理,真正为学生成绩管理提供一个电子平台。 因此为了充分利用成教学院现有的计算机硬件资源,做好 学生成绩管理工作,提高办事效率,实现全面的、相对集中的办公自动化,开发本系统就成了当务之急,其目的主要为了彻底改变这种繁杂的管理模式,实现全面的、相对集中的、智能化的信息综合管理,为成教学院的教学管理工作带来方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值