牛肉我刚开始 发表于 2022-5-20 16:21:24

学生管理系统的排序函数该怎么做呀?家人可以直接把代码拉到最后看下!万分感谢!!!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void menu();
void add();
void showall();
void modify();
void dlt();
void search();
void sort();
int n=0;
struct student
{
char num;
char name;
float Cscore;
float Mscore;
float sum;
}stu;
void main()
{
int x=0,z,p=1;
menu();
while(p)
{
printf("请输入你要选择的服务:\n");
scanf("%d",&z);

switch (z)
{
case 1:add();break;
case 2:showall();break;
case 3:modify();break;
case 4:;dlt();break;
case 5:search();break;
case 6:sort();break;
case 7:p=0;break;
}
}
}
void menu()
{
system("cls");//清空屏幕
printf("\n");
printf("\t\t --------------学生成绩管理系统--------------\n");
printf("\t\t︱\t\t 1 添加记录               ︱\n");
printf("\t\t︱\t\t 2 显示记录               ︱\n");
printf("\t\t︱\t\t 3 修改记录               ︱\n");
printf("\t\t︱\t\t 4 删除记录               ︱\n");
printf("\t\t︱\t\t 5 查找记录               ︱\n");
printf("\t\t︱\t\t 6 排序记录               ︱\n");
printf("\t\t︱\t\t 0 退出系统               ︱\n");
printf("\t\t --------------------------------------------\n");
printf("\t\t请选择(0-6):\n");
}
void add()   //增加学生信息
{
    int m, flag, i = n, j;
        char c;
    printf("请输入待添加的学生人数:\n");
    scanf("%d", &m);
    if (m > 0)
    {
      do
      {
            flag = 1;
            while (flag != 0)
            {
                flag = 0;
                printf("请输入第%d位学生的学号:\n", i + 1);
                                scanf("%s",&stu.num);
                for (j =0; j < i; j++)
                {
                     if(stu.num==stu.num)
                  {
                        printf("该学号已存在,请重新输入!\n");
                        flag = 1;
                        break;
                  }
                }
            }
            printf("请输入第%d位学生姓名:\n", i + 1);
            scanf("%s",&stu.name);
            printf("请输入第%d位学生语文成绩:\n", i + 1);
            scanf("%f", &stu.Cscore);
            printf("请输入第%d位学生数学成绩:\n", i + 1);
            scanf("%f", &stu.Mscore);
            printf("请输入第%d位学生总成绩:\n", i + 1);
            scanf("%f", &stu.sum);
            i++;
      } while (i < m + n);
      n += m;
      printf("添加完成!");
                system("pause");
    }
        printf("继续添加按Y,否则按任意键\n");
        c=getchar();
        if(c=='Y')
        add();
}
void showall()
{ //显示当前信息
    int i;
    if (n == 0)
      printf("您好,现在暂无学生信息,请先添加学生信息!\n");
    else
    {
      printf("现在共有%d名学生\n", n);
      printf("学号\t\t姓名\t\t语文\t\t高数\t\t总成绩\n");
      for (i = 0; i < n; i++)
      {
            printf("%.2s\t\t%s\t\t%.2f\t\t%.2f\t\t%.2f\n", stu.num, stu.name,stu.Cscore, stu.Mscore, stu.sum);
      }
    }
   system("pause");
}
void modify()    //修改学生信息
{
    int flag,num,i,m=0;
    char xm;
    float s1,s2,s3;
    printf("请输入需要修改的学生姓名:\n");
/*        do{
        for(m=0;m<=100;m++)
                scanf("%c",&xm);
        }while(xm!='#');*/
        gets(xm);
    while (1)
    {
      flag = 0;
                //m=1;
      for (i=0; i < n; i++)
      {
          //if ("xm"==stu.name)
                        if(strcmp(xm,stu.name)==0)
            {
                flag = 1;
                printf("***************************************************\n");
                printf("*--- ------1.修改语文成绩-------*\n");
                printf("*----2.修改数学成绩--------------3.修改总成绩--*\n");
                printf("*-------------------4.退出本菜单------------------*\n");
                printf("***************************************************\n\n");
                printf("请输入菜单编号:\n");
                scanf("%d", &num);
                switch (num)
                {
                case 1:
                  printf("请输入新的语文成绩\n");
                                        scanf("%f",&s1);
                  stu.Cscore=s1;
                  break;
                case 2:
                  printf("请输入新的数学成绩:\n");
                  scanf("%f", &s2);
                  stu.Mscore =s2;
                  break;
                case 3:
                  printf("请输入新的总成绩:\n");
                  scanf("%f", &s3);
                  stu.sum =s3;
                  break;
                case 4:return;
                default:printf("请输入1--5之间的数字!\n");
                }
                       
                if (num > 0 && num < 5)
                  printf("修改成功!\n");
                break;
            }
                /*        else
                                flag=0;*/
      }
      if (flag == 0)
      {
            printf("未找到该学生,请重新输入学生姓名:\n");
            gets(xm);
      }
    }
    system("pause");
}
void dlt()   //删除信息
{
    int flag, i, j;
    char s1;
    printf("请输入要删除学生的学号:\n");
        gets(s1);
    flag = 0;
    for (i = 0; i < n; i++)
    {
if (strcmp(s1,stu.num) == 0)
      {
            flag = 1;
            for (j = i; j < n - 1; j++)
            {
                stu = stu;
            }
      }
      if (flag == 1) break;
    }
    if (flag == 0) printf("未找到该学生!\n");
    if (flag == 1)
    {
      printf("删除成功!\n");
      n--;
    }
    system("pause");
}
void search()    //查询学生信息
{
        char s1;
        int j,i;
        printf("请输入你要查找的学生姓名:\n");
        scanf("%s",&s1);
        while(1)
        {
                j=0;
                for(i=0;i<n;i++)
                {
                if(strcmp(s1,stu.name)==0)
                {
                        j=1;
                        printf("学号:\t\t姓名:\t\t数学成绩:\t\t语文成绩:\t\t总成绩:\n");
                        printf("%s\t\t%s\t\t%.2f\t\t%13.2f\t\t%13.2f\n",stu.num,stu.name,stu.Cscore,stu.Mscore,stu.sum);
                }
                }
                if(j==0)
                        printf("没有找到该生的信息:\n");break;
        }
}
void sort()                  //函数意义:通过先使用选项一输入学生信息后然后选择选项6进行排序,函数里的'n'是人数。我下面这个是错误的。
{
        int i=0,j=0;
        float score=0,s;
        if(n>0)
                for(j;j<n;j++){
                for(i;i<n;i++)
                {
                if(stu.sum>score)
                        {
                                s=score;
                                score=stu.sum;
                                stu.sum=s;
                                s=stu.sum;
                                stu.sum=score;
                                score=s;
                        }
                printf("%.2f\n",score);
                }
                }
                else
                        printf("没有学生信息\n");
}

牛肉我刚开始 发表于 2022-5-20 22:34:57

是按照成绩从高到底依次向下排序的

当初约定 发表于 2022-5-21 10:31:00

sort函数帮你修改成这样了,利用冒泡算法来进行排序:
void sort()// 排序函数,利用冒泡排序算法实现成绩由高到低排序
{
        for (int i = 0; i < n; i++)
        {
                for(int j = 0;j < n-1;j++){
                        if(stu.sum < stu.sum){
                                stu = stu; //由于80这一位数据基本用不到,因此用以临时存储数据,即本系统一次最多能存储79位学生
                                stu = stu;
                                stu = stu;
                        }
                }
        }
        for(int i = 0; i < n;i++){
                printf("学生姓名:%s,总成绩:%.0f\n",stu.name,stu.sum);
        }
}
还有就是输入总成绩那里没必要再输入一次总成绩,总成绩可以通过数学成绩+语文成绩得到,我修改的代码如下:
//            printf("请输入第%d位学生总成绩:\n", i + 1);
//            scanf("%f", &stu.sum);
                        stu.sum = stu.Cscore + stu.Mscore; //总成绩等于数学成绩加语文成绩
大致看了同学你好像不是很会用指针{:10_277:},你声明的结构体我在下面都用不了(可能是我太久没用C语言的缘故吧),所以借了一个最尾端的结构体元素作为临时存储单元,其他的还有挺多bug的我就先不说了,你可以再改改,期望你能够用起C语言的指针,只有学了指针你才能用C做很多事。

牛肉我刚开始 发表于 2022-5-21 12:48:35

当初约定 发表于 2022-5-21 10:31
sort函数帮你修改成这样了,利用冒泡算法来进行排序:

还有就是输入总成绩那里没必要再输入一次总成绩, ...

好的,谢谢你的指导和意见。
页: [1]
查看完整版本: 学生管理系统的排序函数该怎么做呀?家人可以直接把代码拉到最后看下!万分感谢!!!