【发布时间】:2021-03-21 05:22:56
【问题描述】:
我在排序结构时遇到问题。
我有一个包含品牌('Marke')、型号('Modelis')和价格('Kaina')等信息的汽车结构。
当用户输入这个品牌、型号和价格时,程序应该根据价格从小到大对这些数组进行排序,并仅打印出排序后的数组char brand和char 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 行代码。更少的代码更好,更简单,对吗?