Member 13479017 Ответов: 2

Помощь в понимании ошибок?


Я получаю несколько ошибок, которые сбивают меня с толку. Я пробовал менять переменные, но это не помогло. Я буду публиковать свой код и ошибки. Любая помощь приветствуется. Я знаю, что мой код совсем не велик. Честно говоря, я совсем не силен в программировании.
Извиняюсь.

<pre>/*  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 [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 i = 0 ;
	istringstream iss (line) ;
	while (getline(ins, line))
	{
		istringstream iss (line) ;
		iss >> *names [i] >> numToys [i] ;
		i++ ;
	}
	int total = 0 ;
	string* rate = elfRating (SIZE, numToys, rating) ;
	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 CNT = 0 ;
	int goodElves = 0 ;
	while (CNT < SIZE)
	{
		if (numToys[CNT] > 500)
		{
			goodElves = goodElves + 1 ;
			CNT++ ;
		}
		else 
		{
			CNT++ ;
		}
	}
	int ii = 0 ;
	while (ii < 50)			//printout of arrays
	{
		cout << setw(30) << left << "Elves name:" << names[ii]
			<< setw(20) << left << "Number of Toys Produced:" << numToys[ii]
			<< setw(10) << left << "Rating:" << rating[ii] ;
		ii++ ;
	}
	cout << "Total number of toys created by all elves: " << total ;
	cout << "The number of elves that have produced over 500 toys: " << goodElves ;
	cout << "The elf who made the greatest number of toys: " << names[cnt] ;
	cout << "The elf who made the lowest number of toys: " << names[count] ;
	
	
	cin.ignore () ;
}

/*  Function:		elfRating
	Last Modified:	Dec 3, 2017
	Purpose:		To provide a rating for each elf based on their toy production.
	In Parameters:	None
	Out Parameters:	None
	Return Value:	None 
*/

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


Вот ошибки, которые я получаю.

prog6.cpp: In function ‘int main()’:
prog6.cpp:35: error: cannot convert ‘std::string**’ to ‘std::string*’ for argument ‘3’ to ‘std::string* elfRating(int, int*, std::string*)’


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

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

2 Ответов

Рейтинг:
2

CPallini

Эй, парень, это так C++ У вас есть мощная стандартная библиотека.

Следующая программа получает данные из стандартного ввода, используйте его таким образом:

elfrating < elves.dat



#include <iostream>
#include <iomanip>
#include <algorithm>
#include <numeric>
#include <vector>
#include <sstream>
#include <string>

using namespace std;

struct ElfInfo
{ 
  string name;
  int toys;
  
  string to_string() const
  { 
    ostringstream oss; 
    oss << setw(30) << left << "Elf name:" << name
      << setw(20) << left << " Number of Toys Produced:" << toys
      << setw(10) << left << " Rating:" << rating();
    return oss.str();
  }
  string rating() const
  { 
    if (toys < 200 )
      return "-";
    else if ( toys < 300)
      return "*"; 
    else if (toys < 500)
      return "***";
    else
      return "*****";
  }
};

int main()
{
  vector <ElfInfo> vei;
  string line;
  while ( getline(cin, line))
  {
    ElfInfo ei;
    istringstream iss(line);
    iss >> ei.name >> ei.toys;
    vei.push_back(ei);
  }

  int total_toys, min_toys, max_toys;

  const auto & itmax = max_element( vei.cbegin(), vei.cend(), [](const auto & e1, const auto & e2) {return (e1.toys < e2.toys);});
  max_toys = itmax->toys;

  const auto & itmin  = min_element( vei.cbegin(), vei.cend(), [](const auto & e1, const auto & e2) {return (e1.toys < e2.toys);});
  min_toys = itmin->toys;

  total_toys = accumulate( vei.cbegin(), vei.cend(), 0,  [](int t, const auto & ei) -> int { return t +ei.toys;});

  for (const auto & ei : vei)
    cout << ei.to_string() << endl;

  cout << "total number of created toys " << total_toys << endl;
  cout << "maximum number of created toys " << max_toys << endl;
  cout << "minimum number of created toys " << min_toys << endl;
}


Рейтинг:
15

Mohibur Rashid

объявить размер с помощью макроса
как и в этом случае
#определите размер 50

способ, которым вы объявили elfRating, вызовет ошибку, либо вы объявите массив как указатель, либо с литеральным значением; вероятно, c++14 имеет другой способ объявления;

кроме того, вы можете написать if else cascade следующим образом

if (numToys [t] < 200)
{
    rating = "-" ;
}
else if (numToys [t] < 300)
{
    rating = "*" ;
}
else if (numToys [t] < 500)
{
    rating = "***" ;
}
else
{
    rating = "*****" ;
}

нет никакого способа, вы получите другую ценность

в первом цикле while main
у тебя есть
cout << names [10] << endl ; // until array index 9, you will get empty, from 10 you will get same value printed;


в цикле for основной функции
вы заявили:
Итого в блоке for loop. общая переменная не существует вне цикла. А также вы устанавливаете total обратно на ноль в каждом цикле;

в функции elfRating вы отправили рейтинг в виде массива std::string; вы пытаетесь установить строку в массиве; компилятор C++ должен выдать ошибку.
Предложение:
1.
менять
рейтинг="**** строка";
к
рейтинг[t]="**** строка";
2.
измените тип возврата elfRating на void, удалите возврат;
3.
во втором цикле while удалите вызов функции elfRating
перемещение elfRating выше для цикла;

Вы тоже должны закрыть входы;

И я чувствую, что вы не очень хорошо изучили программирование на c++ или любое другое программирование, вам нужно больше учиться

--edit: добавить полное исправление ошибок и с примером--
/*  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>
#define SIZE 50                 // new line
using namespace std ;
 
void elfRating (int[], string[]) ; // modified
 
int main () 
{
	//int SIZE = 50 ;               // removed
	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 i = 0 ;
	istringstream iss (line) ;
	while (getline(ins, line))
	{
		istringstream iss (line) ;
		iss >> names [i] >> numToys [i] ;
		i++ ;
	}
	int total = 0 ;
	elfRating (numToys, rating) ; // edited
	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
	{
		
		cout << setw(30) << left << "Elves name:" << names[ii]
			<< setw(20) << left << "Number of Toys Produced:" << numToys[ii]
			<< setw(10) << left << "Rating:" << rating[ii] ;
		ii++ ;
	}
	cout << "Total number of toys created by all elves: " << total ;
	cout << "The greatest number of toys created is: " << max ;
	cout << "The lowest number of toys created is: " << min ;
	
	cin.ignore () ;
}
 
/*  Function:		elfRating
	Last Modified:	Dec 3, 2017
	Purpose:		To provide a rating for each elf based on their toy production.
	In Parameters:	None
	Out Parameters:	None
	Return Value:	None 
*/
 
void elfRating (int numToys [SIZE], string rating [SIZE]) 
{
	int t = 0 ;
	for (t=0;t<50;t++)
	{
		if (numToys [t] < 200)
		{
			rating [t] = "-" ;
		}
		else if (numToys [t] < 300)
		{
			rating [t] = "*" ;
		}
		else if (numToys [t] < 500)
		{
			rating [t] = "***" ;
		}
		else
		{
			rating [t] = "*****" ;
		}
	}
}


Member 13479017

Я знаю, у меня это совсем не получается. Но все же большое вам спасибо за всю эту помощь.
Где ты хотел, чтобы я перенес свое призвание в эльфратинг?

Mohibur Rashid

прямо над вторым циклом while, поскольку функция elfRrating устанавливает массив рейтингов, она делает это сразу.
Кстати, есть еще несколько логических ошибок, но я думаю, что вы узнаете со временем

Member 13479017

Спасибо. Я передвинул ее. Я все еще получаю ошибки, которые я перечислил выше для строки 61, но я уверен, что вы помогли мне очистить ее.
Не могли бы вы поделиться со мной еще несколькими ошибками? Если нет, то спасибо вам уже за вашу помощь.

Mohibur Rashid

Обновите свой код

Mohibur Rashid

У меня есть обновленный ответ, это не гарантирует, что ваша логика верна. Я не проверял твою логику. Я только что исправил ошибку. Пожалуйста отладьте и выясните это