Как мне объявить функцию, которая сортирует массивы строк и int вместе? - PullRequest
0 голосов
/ 08 декабря 2011

Я объявил функцию sort, которая должна сортировать мои массивы строк и чисел, но когда я ее вызываю, я получаю неверную инициализацию неконстантной ссылки типа 'std :: string &' из временного тип 'std :: string *'.

Мне также нужно получить его, чтобы синхронизировать numoftoys массива с этим при сортировке.

#include <iostream>     //Basic input/output
#include <iomanip>      //Manipulators
#include <string>       //String stuff 
#include <fstream>      //File input/output

using namespace std;

void instruct ();     //Function Declaration for printing instructions 
void input (ifstream &infile, string &names, int &numoftoys);    //Function declaration for getting data from file
void sort (string &names, int &numoftoys, int i);
void rating (string names, int numoftoys, string &raiting);
void headers ();     //Prints headers

int main()
{

  string names [50];       //Array for storing names
  int numoftoys [50];      //Array for storing the number of toys made
  string raiting [50];     //Array for raiting
  int i = 0;
  int p = 0;

  ifstream infile("elves.dat"); //Opens input file "elves.dat"

  instruct();     //Function call to print instructions

  while ((infile >> names[i]) && (infile >> numoftoys[i]))
    {

      ++i;
    }

  sort (names, numoftoys, i);

  for (int p = 0; p<i; p++)
    {
      cout << names[p] << " " << numoftoys[p] << " " << raiting[p] << "\n";
    }



  return 0;
}




/***************************************************/
/* Name: instruct                                  */
/* Description: Prints instructions to user        */
/* Parameters: N/A                                 */
/* Return Value: N/A                               */
/***************************************************/

void instruct ()                                   
{
  cout << "\n" << "This program will calculate the toys made by santas elfs and assign" << "\n";
  cout << "a rating to each elf. It will also sort them and print average, min and max." << "\n";
  cout << "\n" << "Make sure you have a file named elves.dat in the same directory as";
  cout << " this porgram or you will recieve errors.";
  cout << "\n" << "\n";

  return;
}


/***************************************************/
/* Name: input                                     */
/* Description: Reads from file                    */
/* Parameters: N/A                                 */
/* Return Value: N/A                               */
/***************************************************/

void input (ifstream &infile, string &names, int &numoftoys)
{
  infile >> names;
  infile >> numoftoys;


  return;
}


/***************************************************/
/* Name: sort                                      */
/* Description: Sorts Data                         */
/* Parameters: N/A                                 */
/* Return Value: N/A                               */
/***************************************************/
void sort (string &names, int &numoftoys, int i)
{
  bool swapped = true;
  int j = 0;
  int tmp;
  int t = 0;
  while (swapped) {
    swapped = false;
    j++;
    for (int t = 0; t<i-j; t++);{
    if (names[t] > names[t + 1]){
      tmp = names[t];
      names[t] = names[t + 1];
      names[t+1] = tmp;
      swapped = true;
    }
      }
  }
}

Ответы [ 3 ]

2 голосов
/ 08 декабря 2011

Вы пытаетесь передать массив из 50 string s в sort, который принимает ссылку на один string.

Попробуйте объявить сортировку одним из следующих:

void sort( string names[50], int numoftoys[50], int i)
void sort( string names[], int numoftoys[], int i)
void sort( string* names, int* numoftoys, int i)

Если вы сделаете что-то из этого, вам вообще не придется менять вызов функции:

sort (names, numoftoys, i);

Но, на самом деле, просто прекратите использовать необработанные массивы и указатели, как только вы обнаружитеstd::vector<> в учебе.

РЕДАКТИРОВАТЬ : 2-ой баг.

По какой-то причине у вас есть этот код:

int tmp;
 ...
tmp = names[t];

Вы объявили tmp одним типом (int), но использовали его, как если бы это был другой тип (string).Нет смысла говорить: «Назначьте копию этого string внутри этого int.

. Вы должны объявить tmp, чтобы иметь соответствующий тип для его использования.

Ps. Как только вы узнаете о std::swap(), вы можете полностью избавиться от переменной tmp.

0 голосов
/ 08 декабря 2011

Я не понимаю упражнения, но поскольку имя и номер связаны между собой, ваша структура данных должна отражать это.Проще всего было бы просто использовать std::pair.

#include<string>
#include<list>
#include<utility>

int main()
{
  typedef std::pair<std::string, int> name_and_number_t;
  std::list<name_and_number_t> names_and_numbers;

  //...
  name_and_number_t name_and_number;
  while ((infile >> name_and_number.first) && (infile >> name_and_number.second))
  {
    names_and_numbers.push_back(name_and_number);
  }
  names_and_numbers.sort();
  //...
}

Я не знаю достаточно о рейтинге.Может быть, я бы пошел на

// maybe this
struct number_and_rating; 
// or that
typedef std::pair<int, string> number_and_rating;
// for
typedef std::map<std::string, number_and_rating> toy_container_t;
0 голосов
/ 08 декабря 2011

Вы передаете массив строк (строку *) в функцию, ожидающую ссылку на строку. Либо сделайте ссылку на имя константой (что вы не можете сделать, когда вы изменяете оригинал, либо передайте его как указатель.

Или используйте контейнер лучше, чем прямой массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...