Member 13479017 Ответов: 2

Программа неправильно хранит информацию из файла в массивы?


Моя программа компилирует и форматирует выходные данные правильно, но выходная информация неверна. Там нет имен, и цифры неверны.
Вот моя программа.
/*  Program:	prog6.cpp
	By:		Mackenzie Ritter
	Last Modified:	Dec 3, 2017
	Purpose:	To provide a rating for each elf based on their toy production and output all information.
	Notes:
 */
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>

using namespace std ;

string* elfRating (int, int[], string[]) ;

int main ()
{
    int SIZE = 50 ;
    string* names = new string[SIZE] ;		// Elf's name
    int numToys[SIZE] ;		// Number of toys made by each elf
    string* rating = new string[SIZE] ;		// Rating for elves based on number of toys
    string line = " " ;
    ifstream ins ;
    ins.open ("elves.dat") ;
    int i = 0 ;
    istringstream iss (line) ;
    while (getline(ins, line))
    {
        istringstream iss (line) ;
        iss >> names [i] >> numToys [i] ;
        i++ ;
    }
    int total = 0 ;
    for (int num = 0; num < SIZE; num++)
    {
        total += numToys[num] ;
    }
    int cnt = 0 ;
    int max = numToys [0] ;
    while (cnt < SIZE)
    {
        if (numToys[cnt] > max)
        {
            max = numToys [cnt] ;
            cnt++ ;
        }
        else
        {
            cnt++ ;
        }
    }
    int count = 0 ;
    int min = numToys [0] ;
    while (count < SIZE)
    {
        if (numToys[count] < min)
        {
            min = numToys [count] ;
            count++ ;
        }
        else
        {
            count++ ;
        }
    }
    int ii = 0 ;
    while (ii < 50)			//printout of arrays
    {
        rating = elfRating(SIZE, numToys, rating) ; 
        cout << setw(20) << left << "Elves name:" << names[ii]
        << setw(20) << left << "Number of Toys Produced:" << numToys[ii]
        << setw(10) << left << "Rating:" << rating[ii] << endl ;
        ii++ ;
    }
    cout << "Total number of toys created by all elves: " << total <<endl;
    cout << "The greatest number of toys created is: " << max << endl ;
    cout << "The lowest number of toys created is: " << min << endl ;
    
    cin.ignore () ;
}

/*  Program:	prog6.cpp
	By:		Mackenzie Ritter
	Last Modified:	Dec 3, 2017
	Purpose:	To provide a rating for each elf based on their toy production.
	Notes:
 */

string* elfRating (int SIZE, int numToys[], string rating[])
{
    int t = 0 ;
    for (t=0;t<SIZE;t++)
    {
        if (numToys [t] < 200)
        {
            rating[t] = "-" ;
        }
        else if (numToys [t] < 300)
        {
            rating[t] = "*" ;
        }
        else if (numToys [t] < 500)
        {
            rating[t] = "***" ;
        }
        else if (numToys [t] >= 500)
        {
            rating[t] = "*****" ;
        }
        else
        {
            cout << "Error" << endl ;
        }
    }
    
    return rating;
}


Любая помощь будет очень признательна.

Что я уже пробовал:

Я исправлял этот код так много раз, потому что он продолжал производить ошибки. Теперь, когда он компилируется правильно, информация не является правильной. Предполагается, что он берет файл и хранит информацию в двух массивах: имена и numToys. По какой-то причине имена не выводятся, а цифры крайне неверны.

2 Ответов

Рейтинг:
2

Richard MacCutchan

Это рабочий образец (хотя cout форматирование нужно привести в порядок. Внимательно посмотрите на это и попытайтесь понять логику, но не представляйте это как свою собственную работу, так как она значительно отличается от того, что вы написали.

/*  Program:	prog6.cpp
By:		Richard MacCutchan
Last Modified:	Dec 3, 2017
Purpose:	To provide a rating for each elf based on their toy production and output all information.
Notes:
*/
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>

using namespace std;

string elfRating(int);
#define SIZE 50

int main()
{
	string names[SIZE];		// Elf's name
	int numToys[SIZE];		// Number of toys made by each elf
	string rating[SIZE];		// Rating for elves based on number of toys
	string line = " ";
	ifstream ins;
	ins.open("elves.dat");
	int total = 0;
	int max = 0;
	int min = INT32_MAX;
	istringstream iss(line);
	int count = 0;
        // collect all records and calculate the different values
	while (getline(ins, line))
	{
		istringstream iss(line);
		iss >> names[count] >> numToys[count];
		total += numToys[count];
		if (max < numToys[count])
			max = numToys[count];
		if (min > numToys[count])
			min = numToys[count];
		rating[count] = elfRating(numToys[count]);
		count++;
	}
        // count now contains the number of records that were read in
	int i = 0;
	while (i < count)			//printout of arrays
	{
		cout << setw(20) << left << "Elves name:" << names[i]
			<< setw(20) << left << "Number of Toys Produced:" << numToys[i]
			<< setw(10) << left << "Rating:" << rating[i] << endl;
		i++;
	}
	cout << "Total number of toys created by all elves: " << total << endl;
	cout << "The greatest number of toys created is: " << max << endl;
	cout << "The lowest number of toys created is: " << min << endl;

	cin.ignore();
}

/*  Program:	prog6.cpp
By:		Richard MacCutchan
Last Modified:	Dec 3, 2017
Purpose:	To provide a rating for each elf based on their toy production.
Notes:
*/

string elfRating(int numberOfToys)
{
	string rating = "None";
	if (numberOfToys < 200)
	{
		rating = "-";
	}
	else if (numberOfToys < 300)
	{
		rating = "*";
	}
	else if (numberOfToys < 500)
	{
		rating = "***";
	}
	else if (numberOfToys >= 500)
	{
		rating = "*****";
	}
	else
	{
		cout << "Error" << endl;
	}

	return rating;
}


Рейтинг:
18

Richard MacCutchan

Вы уже несколько раз публиковали этот вопрос и получили несколько полезных предложений по адресу Помощь в понимании ошибок?[^]. Вы добьетесь гораздо большего прогресса, если не будете использовать старые массивы в стиле C, а перейдете к некоторым классам STL. Кроме того, вы можете создать класс для вашего типа Elf, который будет содержать всю информацию, необходимую для управления программой. Ваш класс эльфов может быть чем-то вроде:

class Elf
{
    string name;
    int numberOfToys;
    int rating;
// constructors helpers etc.
};

Тогда вы могли бы использовать std::vector<T> чтобы держать все ваши эльфийские предметы.


CPallini

Скажи ему, скажи ему!
Мой 5.

Member 13479017

Я пишу эту программу для класса. В этом классе мне нужно использовать массивы, которые он учил нас использовать. Может быть, это и не самое лучшее, но именно этим меня учат пользоваться. Кроме того, моя проблема заключается в том, что когда файл читается, имена, кажется, исчезают. Файл, который он читает, содержит такую информацию::
Смайлик 662
Кудряш 88
Клементина 335
Джаспер 105

CPallini

Вы не используете должным образом классы. Например, лучше (как я уже показал вам) сделать один массив объектов класса Elf, а не помещать свойства elf в разные массивы.

Member 13479017

Все, что я говорю, это то, что меня не учили использовать "std::vector<t>". Я не знаю, что это такое. Так что, извините, я просто не понимаю кодирования. Мне это дается нелегко.

CPallini

Вы не должны использовать вектор. Однако создайте класс для хранения всех свойств на elf, а затем создайте массив таких объектов класса.

Richard MacCutchan

Вы используете размер для объявления ваших массивов, а затем предполагаете, что вы получите это количество записей из вашего файла, поэтому вы продолжаете обработку после окончания ваших данных. Вы также можете упростить процесс, собирая свои общие и максимальные значения по мере чтения каждой записи. Я бы посоветовал потратить больше времени на чтение ваших заметок по курсу и получить хорошее представление о том, как использовать массивы и значения индексов. Если необходимо, поговорите со своим учителем, вы не можете учиться, размещая вопросы здесь.