标题:请教:用冒泡排序法整理信息(可实现功能,其它排序法也可以)
只看楼主
sky8558
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2018-2-1
结帖率:100%
 问题点数:0 回复次数:4 
请教:用冒泡排序法整理信息(可实现功能,其它排序法也可以)
程序代码:
//这是一个销售管理系统,其它功能正常,排序方面(程序用冒泡排序)不能完全实现,请教问题出在那里?
#include <stdio.h>

struct SSell                    //定义结构体含序号、日期、姓名及销售面积
{
    int nNum;
    int nDate;
    char sName[20];
    float nArea;
};
SSell sl[100];
int g_Num;                       //定义一个全局变量,用来统计已录入信息数量,做为冒泡排序基数

void Print()                     //输出显示函数
{
    int i = 0;

    printf("序号\t 日   期 \t姓名\t面积\n");

    while(sl[i].nNum)
    {
        if(sl[i].nNum != -1)
        {
        printf("%d\t%d\t%s\t%0.2f\n",sl[i].nNum, 
            sl[i].nDate, sl[i].sName, sl[i].nArea);    
        }
        i++;
    }
    printf("\n");
}

void Add()                    //添加信息函数
{
    int i = 0;
    
    while(sl[i].nNum)
    {
        i++;    
    }
    printf("请输入序号:");
    scanf("%d", &sl[i].nNum);

    printf("请输入日期(格式:20100101):");
    scanf("%d", &sl[i].nDate);

    printf("请输入姓名:");
    scanf("%s", sl[i].sName);

    printf("请输入面积:");
    scanf("%f", &sl[i].nArea);

    Print();

    printf("\n");

}

void Del()                         //删除信息函数
{
    int i = 0;
    int Temnum;
    printf("请输入要删除的序号:");
    scanf("%d", &Temnum);

    while(sl[i].nNum)
    {
        if(sl[i].nNum == Temnum)
        {
            sl[i].nNum = -1;            
        }
    i++;
    }
    Print();
}

void Modify()                     //修改信息函数
{
    int i = 0;
    int Temp;
    printf("请输入要修改的序号:");
    scanf("%d", &Temp);
    
    while(sl[i].nNum)
    {
        if(sl[i].nNum == Temp)
        {    
            printf("请输入新的日期:");
            scanf("%d", &sl[i].nDate);
            
            printf("请输入新的姓名:");
            scanf("%s", sl[i].sName);
            
            printf("请输入新的面积:");
            scanf("%f", &sl[i].nArea);            
        }
        i++;
    }
    Print();
}

void SortNum()                    //按序号排序函数,问题就出在这里
{
    int i = 0;
    int j = 0;
    SSell Tsell;

    for(; i < g_Num -1; i++)       //此处使用全局变量g_Num,统计总信息数量(共几条)
    {
        for(; j < g_Num - 1 - i; j++)
        {
            if(sl[j].nNum > sl[j+1].nNum)
            {
            Tsell = sl[j];
            sl[j] = sl[j+1];
            sl[j+1] = Tsell;
            }        
        }    
    }
}

void SortDate()                    
{

}

void SortName()
{

}

void SortArea()
{

}

void Sort()                 //排序函数
{
    int i;

    puts("1、按序号排列");
    puts("2、按日期排列");
    puts("3、按姓名排列");
    puts("4、按面积排列");
    printf("请选择排序方式:");
    scanf("%d", &i);

    switch(i)
    {
    case 1:
        SortNum();            //按序号排序函数,也是本题要请教之处。
        break;                //原程序的运行结果最后一条信息无法排序
    case 2:                   //为了方便,2-4的其它排序函数暂时没写
        SortDate();
        break;
    case 3:
        SortName();
        break;
    case 4:
        SortArea();
        break;
    }
    Print();
}

void Find()                  //查找函数
{
    int i = 0;
    int Tnum;
    
    printf("请输入要查找的序号:");
    scanf("%d", &Tnum);

    if(sl[i].nNum == 0)              //记录为空的判读
    {
        puts("");
        puts("记录为空,无法查找!");
        puts("");
    }

    while(sl[i].nNum)                 //记录不为空时的判断
    {
        if(sl[i].nNum == Tnum)
        {
            puts("");
            puts("以下是查找结果:");
            puts("");
            printf("序号\t 日   期 \t姓名\t面积\n");
            printf("%d\t%d\t%s\t%0.2f\n",sl[i].nNum, 
                sl[i].nDate, sl[i].sName, sl[i].nArea);    
            printf("\n");
        }
        else
        {    
            puts("");
            puts("没有找到相关记录,请重新核对后再次查找!");
            puts("");
            
        }
        i++;
    }


}

int Menu()                       //菜单选择函数
{
    int i;

    puts("1、浏览信息");
    puts("2、添加信息");
    puts("3、删除信息");
    puts("4、修改信息");
    puts("5、排序信息");
    puts("6、查找信息");
    puts("0、退出");

    printf("请选择(0-6):");
    scanf("%d", &i);

    switch(i)
    {
        case 1:
            Print();
            break;
        case 2:
            Add();
            ++g_Num;            //每录入一条信息全局变量g_Nume加一
            break;
        case 3:
            Del();
            --g_Num;            //每删除一条信息全局变量g_Nume减一
            break;
        case 4:
            Modify();
            break;
        case 5:
            Sort();
            break;
        case 6:
            Find();
            break;
        case 0:    
            break;
    }
    return i;
}

void main()
{
    while (Menu())
    {

    }    
}


[此贴子已经被作者于2018-4-28 09:28编辑过]

搜索更多相关主题的帖子: 信息 int printf scanf puts 
2018-04-28 09:20
尘安
Rank: 2
等 级:论坛游民
威 望:1
帖 子:19
专家分:55
注 册:2018-8-9
得分:0 
在void SortNum()函数里
把SSell Tsell;改为struct SSell Tsell;
2018-08-14 18:16
尘安
Rank: 2
等 级:论坛游民
威 望:1
帖 子:19
专家分:55
注 册:2018-8-9
得分:0 
还有
把SSell sl[100];也同样的改为struct SSell sl[100];
2018-08-14 18:18
kfyniriu
Rank: 6Rank: 6
等 级:侠之大者
威 望:9
帖 子:105
专家分:426
注 册:2018-7-6
得分:0 
for(i=0;i<n-1;i++)
    for(j=i+1;j<n;j++)
    {
       .....   
    }

j不是从0开始,是从i的下一位开始。
2018-08-14 19:45
masterl
Rank: 2
等 级:论坛游民
威 望:1
帖 子:16
专家分:31
注 册:2017-10-12
得分:0 
int i,j;
for(int i=0;i<n;i++)
   for(j=i+1;j<n;j++)
{
   ......
}

冒泡排序,内循环比外循环少一次。
2018-08-18 18:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-486461-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.333145 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved