c语言 - 对结构数组进行排序无法正常工作,因为我希望它能正常工作



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

我有一个汽车结构,其中包含品牌("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 %sn", 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);
}
}
}

然而,它并不能解决这个问题。

你只需要使用一个临时变量来增加订单,就像这个

#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 %sn", automobilis[i].Marke, automobilis[i].Modelis);
}
}

最新更新