鱼C论坛

 找回密码
 立即注册
查看: 2709|回复: 3

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

[复制链接]
发表于 2022-5-20 16:21:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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[100];
char name[15];
float Cscore;
float Mscore;
float sum;
}stu[80];
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[i].num);
                for (j =0; j < i; j++)
                {
                     if(stu[i].num==stu[j].num)
                    {
                        printf("该学号已存在,请重新输入!\n");
                        flag = 1;
                        break;
                    }
                }
            }
            printf("请输入第%d位学生姓名:\n", i + 1);
            scanf("%s",&stu[i].name);
            printf("请输入第%d位学生语文成绩:\n", i + 1);
            scanf("%f", &stu[i].Cscore);
            printf("请输入第%d位学生数学成绩:\n", i + 1);
            scanf("%f", &stu[i].Mscore);
            printf("请输入第%d位学生总成绩:\n", i + 1);
            scanf("%f", &stu[i].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[i].num, stu[i].name,  stu[i].Cscore, stu[i].Mscore, stu[i].sum);
        }
    }
   system("pause");
}
void modify()    //修改学生信息
{
    int flag,num,i,m=0;
    char xm[100];
    float s1,s2,s3;
    printf("请输入需要修改的学生姓名:\n");
/*        do{
        for(m=0;m<=100;m++)
                scanf("%c",&xm[m]);
        }while(xm[m]!='#');*/
        gets(xm);
    while (1)
    {
        flag = 0;
                //m=1;
        for (i=0; i < n; i++)
        {
          //  if ("xm"==stu[i].name)
                        if(strcmp(xm,stu[i].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[i].Cscore=s1;
                    break;
                case 2:
                    printf("请输入新的数学成绩:\n");
                    scanf("%f", &s2);
                    stu[i].Mscore =s2;
                    break;
                case 3:
                    printf("请输入新的总成绩:\n");
                    scanf("%f", &s3);
                    stu[i].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[1000];
    printf("请输入要删除学生的学号:\n");
        gets(s1);
    flag = 0;
    for (i = 0; i < n; i++)
    {
if (strcmp(s1,stu[i].num) == 0)
        {
            flag = 1;
            for (j = i; j < n - 1; j++)
            {
                stu[j] = stu[j + 1];
            }
        }
        if (flag == 1) break;
    }
    if (flag == 0) printf("未找到该学生!\n");
    if (flag == 1)
    {
        printf("删除成功!\n");
        n--;
    }
    system("pause");
}
void search()    //查询学生信息
{
        char s1[100];
        int j,i;
        printf("请输入你要查找的学生姓名:\n");
        scanf("%s",&s1);
        while(1)
        {
                j=0;
                for(i=0;i<n;i++)
                {
                if(strcmp(s1,stu[i].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[i].num,stu[i].name,stu[i].Cscore,stu[i].Mscore,stu[i].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[i].sum>score)
                        {
                                s=score;
                                score=stu[i].sum;
                                stu[i].sum=s;
                                s=stu[i].sum;
                                stu[i].sum=score;
                                score=s;
                        }
                printf("%.2f\n",score);
                }
                }
                else
                        printf("没有学生信息\n");
}
最佳答案
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[j].sum < stu[j+1].sum){
                                stu[80] = stu[j]; //由于80这一位数据基本用不到,因此用以临时存储数据,即本系统一次最多能存储79位学生 
                                stu[j] = stu[j+1];
                                stu[j+1] = stu[80];
                        }
                } 
        }
        for(int i = 0; i < n;i++){
                printf("学生姓名:%s,总成绩:%.0f\n",stu[i].name,stu[i].sum);
        }
}
还有就是输入总成绩那里没必要再输入一次总成绩,总成绩可以通过数学成绩+语文成绩得到,我修改的代码如下:
//            printf("请输入第%d位学生总成绩:\n", i + 1);
//            scanf("%f", &stu[i].sum);
                        stu[i].sum = stu[i].Cscore + stu[i].Mscore; //总成绩等于数学成绩加语文成绩 
大致看了同学你好像不是很会用指针,你声明的结构体我在下面都用不了(可能是我太久没用C语言的缘故吧),所以借了一个最尾端的结构体元素作为临时存储单元,其他的还有挺多bug的我就先不说了,你可以再改改,期望你能够用起C语言的指针,只有学了指针你才能用C做很多事。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-20 22:34:57 | 显示全部楼层
是按照成绩从高到底依次向下排序的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[j].sum < stu[j+1].sum){
                                stu[80] = stu[j]; //由于80这一位数据基本用不到,因此用以临时存储数据,即本系统一次最多能存储79位学生 
                                stu[j] = stu[j+1];
                                stu[j+1] = stu[80];
                        }
                } 
        }
        for(int i = 0; i < n;i++){
                printf("学生姓名:%s,总成绩:%.0f\n",stu[i].name,stu[i].sum);
        }
}
还有就是输入总成绩那里没必要再输入一次总成绩,总成绩可以通过数学成绩+语文成绩得到,我修改的代码如下:
//            printf("请输入第%d位学生总成绩:\n", i + 1);
//            scanf("%f", &stu[i].sum);
                        stu[i].sum = stu[i].Cscore + stu[i].Mscore; //总成绩等于数学成绩加语文成绩 
大致看了同学你好像不是很会用指针,你声明的结构体我在下面都用不了(可能是我太久没用C语言的缘故吧),所以借了一个最尾端的结构体元素作为临时存储单元,其他的还有挺多bug的我就先不说了,你可以再改改,期望你能够用起C语言的指针,只有学了指针你才能用C做很多事。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-21 12:48:35 | 显示全部楼层
当初约定 发表于 2022-5-21 10:31
sort函数帮你修改成这样了,利用冒泡算法来进行排序:

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

好的,谢谢你的指导和意见。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 10:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表