如何在同一数组索引下对结构成员进行排序?

时间:2019-06-14 10:32:05

标签: c++ arrays sorting struct dev-c++

我正在使用C ++程序,但是我发现用于对从文本文件传输来的数组结构成员进行排序的函数没有执行,最终显示了未排序的结构成员。

该程序用于我的大学课程的学期项目,在那里我编写了一个基于C ++的基本乘车共享程序。该程序必须读取包含驱动程序信息的文本文件,并将其传输到数组结构,然后在该文件中,它将从最低价到最高价开始排序,并显示已排序的结构成员。我对C ++教科书进行了一些研究,甚至在几个论坛上都找到了类似的问题,但是我得到的结果与文本文件最初的结果相同。

此处是文本文件的内容,仅供参考。

Annie Aliston
0174987723
Range Rover Evoque
60
6.00

Riley Winston
0174965739
Ford Everest
70
2.50

这是我的编码

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string.h>

using namespace std;

struct ProSort
{
    char nameProvider[10][40]; //40 character limit for nameProvider
    char numPhoneProvider[10][11]; //11 character limit for numPhoneProvider
    char nameVehicle[10][40]; //40 character limit for nameVehicle
    double KMh[10];
    double price[10];
};

ProSort sortingS[7]; //7 set of structs, but I'll put one of the said struct in the sorting function as an example below.

void sortS(ProSort, int);

void share_ride_sort_input(ProSort sortingS[], fstream& File)
{
    File.open("sList/s4-Wheels.txt", ios::in);
    {
        if (File.is_open())
        {
            int a = 0;
            while (!File.eof())
            {
                File >> ws;
                File.getline(sortingS[0].nameProvider[a], 40);
                File >> ws;
                File.getline(sortingS[0].numPhoneProvider[a], 11);
                File >> ws;
                File.getline(sortingS[0].nameVehicle[a], 40);
                File >> sortingS[0].KMh[a];
                File >> sortingS[0].price[a];

                //Contents of the text file will be assigned to the struct members above

                a++; //Array index number will increase until the end of the text file
            }
        }
    }
    File.close();
}

void sortS(ProSort sortingS, int SIZE) //The sorting function for said issue above
{
    int index;
    int smallestIndex;
    int location;
    char temp[100];
    double temp2;

    for (index = 0; index < SIZE - 1; index++)
    {
        smallestIndex = index;

        for (location = index + 1; location < SIZE; location++)
        {
            if (sortingS.price[index] > sortingS.price[smallestIndex]) 
            {
                smallestIndex = location;

                strcpy(temp, sortingS.nameProvider[smallestIndex]);
                strcpy(sortingS.nameProvider[smallestIndex], sortingS.nameProvider[index]);
                strcpy(sortingS.nameProvider[index], temp);

                strcpy(temp, sortingS.numPhoneProvider[smallestIndex]);
                strcpy(sortingS.numPhoneProvider[smallestIndex], sortingS.numPhoneProvider[index]);
                strcpy(sortingS.numPhoneProvider[index], temp);

                strcpy(temp, sortingS.nameVehicle[smallestIndex]);
                strcpy(sortingS.nameVehicle[smallestIndex], sortingS.nameVehicle[index]);
                strcpy(sortingS.nameVehicle[index], temp);

                temp2=sortingS.KMh[smallestIndex];
                sortingS.KMh[smallestIndex]=sortingS.KMh[index];
                sortingS.KMh[index]=temp2;

                temp2=sortingS.price[smallestIndex];
                sortingS.price[smallestIndex]=sortingS.price[index];
                sortingS.price[index]=temp2;

            // Basically all of the arrayed struct members with the same array index will move together as one whole set of driver info until every set of struct members is sorted
            }
        }
    }
}

void share_ride_output(ProSort sortingS[], fstream& File) //Function for displaying the sorted struct members by writing to a text file.
{
    File.open("sList/s4-Wheels-sorted.txt", ios::out);
    {
        if (File.is_open())
        {
            for(int i=0; i<2; i++)
            {
                File<<sortingS[0].nameProvider[i]<<endl;
                File<<sortingS[0].numPhoneProvider[i]<<endl;
                File<<sortingS[0].nameVehicle[i]<<endl;
                File<<sortingS[0].KMh[i]<<" km/h"<<endl;
                File<<"£"<<sortingS[0].charge[i]<<endl;
                File<<"\n";
            } //This is for writing 2 sets of struct members that was assigned in the share_ride_sort_input function to another text file.
        }
    }
    File.close();
}

int main()
{
    fstream File;
    const int SIZE = 7;

    share_ride_sort_input(sortingS, File);

    for(int i=0; i<7; i++) //Originally this was meant for 7 car classes, but only the struct members from the s4-wheels.txt file will be put as an example
    {
        sortS(sortingS[i], SIZE);
    }

    share_ride_output(sortingS, File); //Sorted struct members will be written to a text file.

    return 0;
}

我希望文本文件的输出为:

Riley Winston
0174965739
Ford Everest
70
2.50

Annie Aliston
0174987723
Range Rover Evoque
60
6.00

但是,相反,我得到的输出是未排序的,像这样:

Annie Aliston
0174987723
Range Rover Evoque
60
6.00

Riley Winston
0174965739
Ford Everest
70
2.50

由于程序在没有编译器任何警告的情况下运行,因此未显示任何错误消息。我以为我在排序公式中做错了什么,但我似乎也无法获得其他解决方案。

1 个答案:

答案 0 :(得分:0)

您的代码的主要问题是实际上它不是C ++。主要是C,很难处理。

由于有人在评论中指出了第二个问题,您撤消了任务提示。取而代之的是,在结构内部创建一个数组,在这种情况下,事情变得更加困难。

在编写C ++代码时,请不要使用C特性,例如:char[]用于字符串(使用std::string),C数组SomeType variable[number](使用std::vector或{{ 1}})。

从类似的内容开始,并使用std::array,结果会很容易:

std::sort