2015-10-10 2 views
0

Итак, у меня есть этот проект, над которым я сейчас работаю. Программа считывает файл, который может иметь любое количество линий к нему, и каждый элемент в файле другого типа, например, так:Сортировка структуры данных, которая указывает на массив C++

1002 Hammer  23.65 203 
1024 Nails   6.95 400 
1276 Screwdriver 13.95 251 
1385 Elec_Drill 45.69 132 
1462 Air_Filter 7.95 500 

первый номер является номером продукта, который представляет собой тип двойной , вторая - строка типа, затем плавающая цена каждого и последующего числа проданных чисел. Программа читает их, затем сортирует их и выводит самые продаваемые и самые продаваемые товары.

Я работал над этим в течение недели, и это то, что у меня есть

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <sstream> 
#include <map> 
#include <algorithm> 

using namespace std; 

struct Sales 
{ 
    string prodName; 
    double proNum; 
    string price; 
    string sold; 
}; 

void sortArray(struct database, int); //Function prototypes 
void sortString(string[], int); 
void showArray(struct database[], int); 
bool sales_sorter(Sales const& lhs, Sales const& rhs); 

int main() 
{ 
    ifstream fin; 

    fin.open("sales.txt"); 

    if (fin.fail()) 
    { 
     cout << "Failed to open file" << endl; 
    } 


    vector<Sales> database(5); 
    string line; 

    int i = 0; 
    while (!fin.eof()) 
    { 
    for (int j = 0; j < 5; j++) 
    { 
     if (j == 0) // name 
     { 
      fin >> database[i].proNum; 
     } 
     else if (j == 1) // 
     { 
      fin >> database[i].prodName; 
     } 
     else if (j == 2) 
     { 
      fin >> database[i].price; 
     } 
     else if (j == 3) 
     { 
      fin >> database[i].sold; 
     } 
    } 
    i++; //move to next item 
    } 
} 

std::sort(sales.begin(), sales.end(), &sales_sorter); 

cout << &sales_sorter; 


/* for (int x = 0; x < 5; x++) //Just used to make sure the array is working 
{ 
    cout << database[x].proNum << endl; 
} 

for (int x = 0; x < 5; x++) 
{ 
    cout << database[x].prodName << endl; 
} 

for (int x = 0; x < 5; x++) 
{ 
    cout << database[x].price << endl; 
} 

for (int x = 0; x < 5; x++) 
{ 
    cout << database[x].sold << endl; 
} */ 
system("pause"); 


    return 0; 
} 

void sortArray(double database[], int) 
{ 
    bool swap; 
    int temp; 

    do 
    { 
    swap = false; 
    for (int count = 0; count < (5 - 1); count++) 
    { 
     if (database[count] > database[count + 1]) 
     { 
      temp = database[count]; 
      database[count] = database[count + 1]; 
      database[count + 1] = temp; 
      swap = true; 
     } 
    } 
    } while (swap); 
} 


void showArray(double database[], int) 
{ 
    for (int count = 0; count < 5; count++) 
    cout << database[count] << " "; 
    cout << endl; 
} 

bool sales_sorter(Sales const& lhs, Sales const& rhs) 
{ 
    if (lhs.prodName != rhs.prodName) 
    return lhs.prodName < rhs.prodName; 
    if (lhs.proNum != rhs.proNum) 
    return lhs.proNum < rhs.proNum; 
    if (lhs.price != rhs.price) 
    return lhs.price < rhs.price; 
    return lhs.sold < rhs.sold; 
} 

Теперь я получил сортировочную идею из этого thread но моя сортировка BOOL бросает эту ошибку: «Ошибка ожидала»; «но нет места, где можно положить это без каких-либо проблем, может кто-то, пожалуйста, помогите мне разобраться, как сортировать это. Я прошел через много разных потоков, но все эти предметы нужно сортировать, и я не могу найти что-нибудь о структурах данных, которые указывают на массив!

+0

Вы пытаетесь определить функцию 'sales_sorter' внутри' main'. Вы не можете этого сделать. – molbdnilo

+0

@molbdnilo Спасибо за это! Я не знал об этом – Destry

ответ

3

Есть, по крайней мере, несколько проблем с вашим кодом. Во-первых, вы не можете определять функции в рамках других функций, поэтому вы должны использовать функцию sales_sorter из основного. Во-вторых, у вас есть утечка - вы назначаете свой database, но вы никогда не освобождаете его. Я бы заменил это на std::array или std::vector. Например, вместо

Sales *database = new Sales[5]; 

вы будете иметь

std::array<Sales, 5> database; 

или

std::vector<Sales> database(5); 

Затем вам нужно передать свой контейнер функции сортировки:

std::sort(database.begin(), database.end(), &sales_sorter); 

Это должно начните.

+0

Привет за вашу помощь! Это помогло много, но я получаю сообщение об ошибке «sales_sorter»: uneclared identifier'. Вы знаете, почему это может сказать это? Я обновил свой код выше, чтобы отразить то, что вы сказали – Destry

+0

@DestryAmiott Ну, вы не написали его, добавив прототип перед main. – Rostislav

+0

Спасибо, я не знал, что вы можете объявить прототип bool, как вы могли бы с помощью 'void'. Спасибо за вашу помощь, я буду отмечать это как правильно, но я все еще получаю ошибки, поэтому я попытаюсь понять это. Это дает мне странное число, которого нет в файле, но спасибо за вашу помощь – Destry

Смежные вопросы