链表数据库(模拟)

综合实验二 学生成绩管理系统

1. 实验说明

设某班有n位同学,每位同学的数据包括以下内容:学号(长整型或字符串)、姓名(字符串)、数学成绩(整型)、程序设计成绩(整型)。设计程序完成以下五项功能:新建数据档案、添加数据、删除数据、对输入的数据进行排序和查询。

2. 实验要求

(一)程序运行时,首先显示主菜单如下:

1.新建数据

2.添加数据

3.删除数据

4.排序

5.查询

6.退出

屏幕提示:请输入序号选择相应操作。

要求当用户输入任一序号后,程序都能进行相应操作。

(二)在主菜单中选择序号4,弹出子菜单选择排序方式,子菜单如下:

  1.数学成绩排序

2.程序设计成绩排序

3.总分排序。

4.返回主菜单

请按序号选择相应操作。

   选择子菜单的序号后,程序能正确运行并在屏幕上显示按要求排序后的相关信息。

(三)在主菜单中选择序号5,弹出子菜单选择查询方式,子菜单如下:

1.学号查询

2.姓名查询

3.数学成绩查询

4.程序设计成绩查询

5.总分查询

6.返回主菜单

请按序号选择相应操作。 

  在子菜单中选择序号后,程序按以下方式工作:

1)学号查询:输入学号后,若该学号存在则显示与其相关的所有信息,否则显示找不到的提示信息;(提示:查询到满足条件的结果后,查询即可结束)

2)姓名查询:输入姓名后,若该姓名存在则显示与其相关的所有信息,否则显示找不到的提示信息;(提示:使用字符串比较函数进行比较)

3)按科目查询:输入指定分数,程序运行后显示该科目中考试成绩大于等于指定分数的同学的学号、姓名以及该科成绩并统计满足条件的人数;

4)总分查询:输入指定分数,程序运行后显示总分成绩大于等于指定分数的同学的学号、姓名以及各科成绩并统计满足条件的人数。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define len sizeof(struct stu)
int total=0;
struct stu
{
    long num;
    char name[10];
    int score1,score2;
    int sum;
    struct stu* next;
};
struct stu *head1;
void px()
{
    int n;
    struct stu *p1,*p2,*p,t;
    while(1)
    {
    printf("1.数学成绩排序\n2.程序设计成绩排序\n3.总分排序\n4.返回主菜单\n请输入序号\n选择相应操作\n");
    scanf("%d",&n);
    if(n==1) 
    {
        p1=head1;
        for(int i=0;i<total-1;i++)
        {
            p2=p1->next;
            p=p1;
            for(int j=i+1;j<total;j++)
            {       
                if(p->score1>p2->score1) p=p2;
                p2=p2->next;
            }
            if(p!=p1){t=*p1;*p1=*p;*p=t;p2=p1->next;p1->next=p->next;p->next=p2;}
            p1=p1->next;
        }
    }
    else if(n==2) { 
        p1=head1;
        for(int i=0;i<total-1;i++)
        {
            p2=p1->next;
            p=p1;
            for(int j=i+1;j<total;j++)
            {       
                if(p->score2>p2->score2) p=p2;
                p2=p2->next;
            }
            if(p!=p1){t=*p1;*p1=*p;*p=t;p2=p1->next;p1->next=p->next;p->next=p2;}
            p1=p1->next;
        }
    }
    else if(n==3) {
        p1=head1;
        for(int i=0;i<total-1;i++)
        {
            p2=p1->next;
            p=p1;
            for(int j=i+1;j<total;j++)
            {       
                if(p->sum>p2->sum) p=p2;
                p2=p2->next;
            }
            if(p!=p1){t=*p1;*p1=*p;*p=t;p2=p1->next;p1->next=p->next;p->next=p2;}
            p1=p1->next;        
        }
    }
    else break;
        p=head1;
        while(p!=NULL){printf("%ld %s %d %d %d\n",p->num,p->name,p->score1,p->score2,p->sum);p=p->next;}
    }
}
void cx()
{
    int n;
    while(1)
    {
    printf("1.学号查询\n2.姓名查询\n3.数学成绩查询\n4.程序设计成绩查询\n5.总分查询\n6.返回主菜单\n请输入序号选择相应操作\n");
    scanf("%d",&n);
    if(n==1) {
      struct stu *p;
      int tag;
      printf("请输入:");
      scanf("%d",&tag);
      p=head1;
      while(p!=NULL)
      {
          if(p->num==tag) {printf("%ld %s %d %d %d\n",p->num,p->name,p->score1,p->score2,p->sum);break;}
          else p=p->next;
      }
      if(p==NULL)printf("NO Founed\n");
    }
    else if(n==2) {
      struct stu *p;
      char nam[10];
      printf("请输入:");
      scanf("%s",nam);
      p=head1;
      while(p!=NULL)
      {
          if(strcmp(p->name,nam)==0) {printf("%ld %s %d %d %d\n",p->num,p->name,p->score1,p->score2,p->sum);break;}
          else p=p->next;
      }
      if(p==NULL)printf("NO Founed\n");
    }
    else if(n==3) {
        struct stu *p;
      int tag,l;l=0;
      printf("请输入:");
      scanf("%d",&tag);
      p=head1;
      while(p!=NULL)
      {
          if(p->score1>=tag) {printf("%ld %s %d %d %d\n",p->num,p->name,p->score1,p->score2,p->sum);l++;}
          p=p->next;
      }
      printf("%d\n",l);
    }
    else if(n==4) {
              struct stu *p;
      int tag,l;l=0;
      printf("请输入:");
      scanf("%d",&tag);
      p=head1;
      while(p!=NULL)
      {
          if(p->score2>=tag) {printf("%ld %s %d %d %d\n",p->num,p->name,p->score1,p->score2,p->sum);l++;}
          p=p->next;
      }
      printf("%d\n",l);
    }
    else if(n==5) {
              struct stu *p;
      int tag,l;l=0;
      printf("请输入:");
      scanf("%d",&tag);
      p=head1;
      while(p!=NULL)
      {
          if(p->sum>=tag) {printf("%ld %s %d %d %d\n",p->num,p->name,p->score1,p->score2,p->sum);l++;}
          p=p->next;
      }
      printf("%d\n",l);
    }
    else break;
    }
}
//----------------------------------------
struct stu * add1(struct stu *head)
{
    struct stu *p1,*p;
    p1=(struct stu *)malloc(len);
    scanf("%ld%s%d%d",&p1->num,&p1->name,&p1->score1,&p1->score2);
    p1->sum=p1->score1+p1->score2;
    if(head==NULL) {head=p1;p1->next=NULL;}
    else{
    p=head;
    while(p->next!=NULL) {p=p->next;}
    p->next=p1;
    p1->next=NULL;
    }
    total++;
    return head;
}
void creat(int n)
{
    for(int i=1;i<=n;i++)
    {
        printf("input:\n");
        head1=add1(head1);
    }
}
//----------------------------------------------
struct stu* del(struct stu *head,long id)
{
    struct stu *p1,*p2;
    p1=head;
    while(p1!=NULL&&p1->num!=id)
    {
        p2=p1;
        p1=p1->next;
    }
    if(p1!=NULL)
    {
        total--;
        if(p1==head) {p1=p1->next;free(head); return p1;}
        else {p2->next=p1->next;free(p1);}
    }
    else printf("NO Founed");
    return head;
}
struct stu *DELL(struct stu *head)
{
    struct stu *p1,*p2;
    p1=head;
    while(p1!=NULL)
    {
        p2=p1;
        p1=p1->next;
        free(p2);
    }
    return NULL;
}
int main()
{
    int n,k;
    long id;
    head1=NULL;
    struct stu *p;
    while(1)
    {
        printf("1.新建数据\n2.添加数据\n3.删除数据\n4.排序\n5.查询\n6.退出\n请输入序号选择相应操作\n");
        scanf("%d",&k);
        if(k==6) {break;}
        if(k==1) {head1=DELL(head1);printf("已新建\n");}
        else if(k==2) {creat(1);}
        else if(k==3) {printf("请输入删除的学号:");scanf("%ld",&id);head1=del(head1,id);}
        else if(k==4) {px();}
        else if(k==5) {cx();}    
        printf("----------------------\n");   
    }
    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L.K.2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值