Как я могу отсортировать в порядке убывания? - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь отсортировать по верхнему и второму верхнему значению totalRevenue и его name. Я попытался отсортировать их в порядке убывания таким образом, но я не мог понять, как заставить это работать. Кто-нибудь может помочь мне? Первые две записи:

1002 Hammer  23.65  203 
1024 Nails  6.95  400

Вот код:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

// Structure to hold statistics
struct Selling {
    int productNumber;
    string name;
    double price;
    int soldNumber;
    double totalRevenue[];
};

int main()
{
    ifstream statFile;
    string productName;
    double price;
    int productNumber, soldNumber;
    Selling *productArray[100];
    Selling *aSelling;
    int numProduct = 0;
    int man = 0;

    statFile.open("sales.txt");

    while (numProduct < 100 && statFile >> productNumber >> productName >> price >> soldNumber)
    {
        Selling *aSelling = new Selling;
        aSelling->productNumber = productNumber;
        aSelling->name = productName;
        aSelling->price = price;
        aSelling->soldNumber = soldNumber;
        aSelling->totalRevenue[] = aSelling->price * aSelling->soldNumber;
        productArray[numProduct++] = aSelling;

        //cout << aSelling->productNumber<< " " << aSelling->name << " " << aSelling->price << " " << aSelling->soldNumber << " " << aSelling->totalRevenue << endl;
    }

    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            if (aSelling->totalRevenue[i] > aSelling->totalRevenue[j]) {
                man = aSelling->totalRevenue[i];
                aSelling->totalRevenue[i] = aSelling->totalRevenue[j];
                aSelling->totalRevenue[i] = man;
            }
        }
    }

    for (int i = 0; i < 2; i++) {
        cout << "The top selling product is " << aSelling->name << "with total sales of " << aSelling->totalRevenue[i] << endl;
        cout << "The second top selling product is " << aSelling->name << "with total sales of " << aSelling->totalRevenue[i - 1] << endl;
    }
}

И в строке aSelling->totalRevenue[] = aSelling->price * aSelling->soldNumber; есть неожиданная ошибка выражения, которую я не понимаю.

1 Ответ

1 голос
/ 09 октября 2019

Существует некоторая путаница в массивах для сортировки:

  • Вы должны определить totalRevenue как double, а не массив значений типа double,
  • следует отсортироватьПервые numProduct элементы массива productArray основаны на критериях totalRevenue и name, порядок определяется используемым оператором сравнения. Сравните только второй критерий, если первый критерий дает равные значения.

Вот модифицированная версия:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

// Structure to hold statistics
struct Selling {
    int productNumber;
    string name;
    double price;
    int soldNumber;
    double totalRevenue;
};

int compareSellings(const Selling *a, const Selling *b) {
    // sort in decreasing order of totalRevenue
    if (a->totalRevenue > b->totalRevenue) return -1;  // a comes before b
    if (a->totalRevenue < b->totalRevenue) return +1;  // b comes before a
    // sort in increasing order of name for the same totalRevenue
    if (a->name < b->name) return -1;  // a comes before b
    if (a->name > b->name) return +1;  // b comes before a
    return 0;
}

int main() {
    ifstream statFile;
    string productName;
    double price;
    int productNumber, soldNumber;
    Selling *productArray[100];
    int numProduct = 0;

    statFile.open("sales.txt");

    while (numProduct < 100 && statFile >> productNumber >> productName >> price >> soldNumber) {
        Selling *aSelling = new Selling;
        aSelling->productNumber = productNumber;
        aSelling->name = productName;
        aSelling->price = price;
        aSelling->soldNumber = soldNumber;
        aSelling->totalRevenue = price * soldNumber;
        productArray[numProduct++] = aSelling;

        //cout << aSelling->productNumber<< " " << aSelling->name << " " 
        //     << aSelling->price << " " << aSelling->soldNumber << " " 
        //     << aSelling->totalRevenue << endl;
    }

    for (int i = 0; i < numProduct; i++) {
        for (int j = 0; j < numProduct; j++) {
            if (compareSellings(productArray[i], productArray[j]) > 0) {
                Selling *aSelling = productArray[i];
                productArray[i] = productArray[j];
                productArray[j] = aSelling;
            }
        }
    }

    cout << "The top selling product is " << productArray[0]->name
         << ", with total sales of " << productArray[0]->totalRevenue << endl;
    cout << "The second selling product is " << productArray[1]->name
         << ", with total sales of " << productArray[1]->totalRevenue << endl;

    return 0;
}

Дополнительные замечания:

  • выВы можете использовать более эффективный метод сортировки
  • . Вы должны освободить выделенные объекты
  • . Вы должны использовать <algorithms> и динамические массивы объектов вместо выделения объектов с помощью new и манипулирования голыми указателями.
  • вы должны обрабатывать исключения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...