【问题标题】:Sorting a struct array isn't working as I expect it to work对结构数组进行排序无法正常工作
【发布时间】:2021-03-21 05:22:56
【问题描述】:

我在排序结构时遇到问题。

我有一个包含品牌('Marke')、型号('Modelis')和价格('Kaina')等信息的汽车结构。 当用户输入这个品牌、型号和价格时,程序应该根据价格从小到大对这些数组进行排序,并仅打印出排序后的数组char brandchar model

我首先用 10 个数组测试了我的排序脚本 - 工作正常。 然后我用 3 个价格排列如下的数组对其进行了测试:'200' '300' '100' - 也可以。 但是,一旦用户以降序方式输入价格,例如:'300' '200' '100' - 它的排序方式不正确,我得到的是:'100' '300' '200'。这是整个脚本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Automobiliai {

    char Marke[20];
    char Modelis[20];
    float Kaina;

};

struct Automobiliai Prijungti(char *_marke, char *_modelis){

    struct Automobiliai p;
    strcpy(p.Marke, _marke);
    strcpy(p.Modelis, _modelis);

    return p;

};

int main()
{

    struct Automobiliai automobilis[3];

    for(int i = 0; i < 3; i++){

        printf("%d automobilis: Marke Modelis Kaina \n", i+1);
        scanf("%s %s %f", automobilis[i].Marke, automobilis[i].Modelis, &automobilis[i].Kaina);

    }

    struct Automobiliai _automobilis[3];

    for(int i = 0; i < 3; i++){

        for(int j = i + 1; j < 3; j++){

            if(automobilis[i].Kaina > automobilis[j].Kaina){

                _automobilis[i] = Prijungti(automobilis[i].Marke, automobilis[i].Modelis);
                automobilis[i] = Prijungti(automobilis[j].Marke, automobilis[j].Modelis);
                automobilis[j] = Prijungti(_automobilis[i].Marke, _automobilis[i].Modelis);

            }

        }

    }

    printf("Automobiliu markes modelio kainos atzvilgiu tvarka: \n");
    for(int i = 0; i < 3; i++){

        printf("%s %s\n", automobilis[i].Marke, automobilis[i].Modelis);

    }

}

更具体地说,这是我遇到问题的代码部分:

for(int i = 0; i < 3; i++){

        for(int j = i + 1; j < 3; j++){

            if(automobilis[i].Kaina > automobilis[j].Kaina){

                _automobilis[i] = Prijungti(automobilis[i].Marke, automobilis[i].Modelis);
                automobilis[i] = Prijungti(automobilis[j].Marke, automobilis[j].Modelis);
                automobilis[j] = Prijungti(_automobilis[i].Marke, _automobilis[i].Modelis);

            }

        }

    }

我可以想象为什么会发生这种情况,我认为我应该在我的 if 中再添加一个条件,但我的头已经很痛了,除了在循环之前创建一个变量之外,我想不到太多:int a = 0; 和像这样重新制作循环:

for(int i = 0; i < 3; i++){

        for(int j = i + 1; j < 3; j++){

            if(automobilis[i].Kaina > a){

                a = automobilis[j].Kaina;
                _automobilis[i] = Prijungti(automobilis[i].Marke, automobilis[i].Modelis);
                automobilis[i] = Prijungti(automobilis[j].Marke, automobilis[j].Modelis);
                automobilis[j] = Prijungti(_automobilis[i].Marke, _automobilis[i].Modelis);

            }

        }

    }

但它并没有解决这个问题。

【问题讨论】:

  • 请看一下冒泡排序算法,点击这个链接programmingsimplified.com/c/source-code/c-program-bubble-sort(PD:这是我从谷歌得到的第一个结果)。有更高效的排序算法
  • @Nestor 结果对我来说是一样的。实际上,该链接中的方法与我的方法或多或少相同,只是如果您问我,它会更复杂。
  • 函数 Prijungti 正在创建并返回一个新结构,但它的三个成员之一 (Kaina) 未初始化。这是故意的吗?
  • @AndreasWenzel 哦?哪一个?如果你说的是struct Automobiliai p;,那么没有它char Marke[20]; 等就行不通,对吗?
  • @AndreasWenzel 是的。这是一项家庭作业,最后程序应该只打印出品牌和型号。可以这么说,价格只是用它来对它们进行排序。我创建了这个“函数”,以便我可以在 if 语句中调用它,编写 3 行代码而不是最少 9 行代码。更少的代码更好,更简单,对吗?

标签: arrays c sorting struct


【解决方案1】:

你只需使用一个临时变量来增加这样的顺序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Automobiliai
{
    char Marke[20];
    char Modelis[20];
    float Kaina;
}Automobiliai;

int main()
{
    Automobiliai automobilis[3];

    for(int i = 0; i < 3; i++)
    {
        printf("%d automobilis: Marke Modelis Kaina \n", i+1);
        scanf("%s %s %f", automobilis[i].Marke, automobilis[i].Modelis, &automobilis[i].Kaina);
    }
    
    Automobiliai temp;
    for(int i = 0; i < 3; i++)
    {
        for(int j = i + 1; j < 3; j++)
        {
            if(automobilis[i].Kaina > automobilis[j].Kaina)
            {
                temp = automobilis[j];
                automobilis[j]=automobilis[i];
                automobilis[i]=temp;
            }
        }
    }
    printf("Automobiliu markes modelio kainos atzvilgiu tvarka: \n");
    for(int i = 0; i < 3; i++)
    {
        printf("%s %s\n", automobilis[i].Marke, automobilis[i].Modelis);
    }
}

【讨论】:

  • 是的!就是这样,它可以工作,但这就是我第一次尝试制作这个循环的方式,但它没有用。你能解释一下typedef 对这个结构有什么不同吗?我知道如果不输入 }Automobiliai; 并且在循环的 Automobiliai temp; 之前输入错误,但为什么呢?
  • @AleksandrasVištorskij:使用typedef 允许您编写Automobiliai,而不必一直编写struct Automobiliai。这不是必需的,这只是一种方便。你不需要使用typedef 来让你的代码工作。如果您愿意,您可以继续在任何地方写 struct Automobiliai
  • @AndreasWenzel Riiiiight!明显地。谢谢!
  • typedef 意味着您不再需要到处写 struct Automobiliai。这不仅节省了击键次数,还可以使代码更简洁,因为它提供了更多的抽象。
猜你喜欢
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多