Member 13770287 Ответов: 3

Способ добавить счет игрока в игре с помощью массивов и функций


Предположим, что у нас есть 3 массива: один для имен игроков,один для названий игр и один для результатов игр.Размер массивов определяется пользователем.
мы должны использовать функцию для добавления очков игроков в игре ,а затем отображать имена рядом с их соответствующим счетом, как мы можем ее закодировать?Мне нужен ответ как можно скорее.

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

То, что я написал до сих пор:
void pscore(char pname[])
    {
    int pcounter;
    int gscore[pcounter];
    for(int i=0;i<pcounter;i++)
        {
        cout<<"enter score for player number"<<i+1<<endl;
        cin>>gscore[i];
        }
    cout<<gscore[pcounter];
    }
int main()
    {
    int p;
    cout<<"How many games"<<endl;
    cin>>p;
    char gname[p],pname[p];
    int gscore[p];
    cout<<"enter names"<<endl;
    for(int i=0;i<p;i++)
        {
        cin.get(pname,550);
        }
    pscore(pname[p]);
    cout<<pname[p]<<"\t"<<gscore[p];
    return 0;
    }

Я всегда заканчиваю с недопустимым преобразованием из 'char' в 'char**' [-fpermissive] сообщение, и я не уверен, почему.

OriginalGriff

Код с отступом - всегда намеревайтесь даже тривиальный код - это делает его целой нагрузкой легче увидеть, что происходит...

3 Ответов

Рейтинг:
1

OriginalGriff

Я сделал отступ в вашем коде: никому нет дела, какую систему отступов вы используете: K&R, Whitesmiths, даже отвратительный 1TB в порядке, пока вы последовательны.

Теперь посмотрите на свой код и предположите, что пользователь вводит "2" в качестве количества игр.
Насколько он велик pname в результате?

char gname[p],pname[p];

Ответ: 2 символа.
Итак, когда вы пытаетесь прочитать 550 символов, что происходит?
cin.get(pname,550);

Ответ: он даже немного не подходит. Поэтому он случайным образом перезаписывает память.
Хуже того, вы делаете это неоднократно, перезаписывая ту же самую память, которую вы только что переписали.
А затем после цикла вы пытаетесь вычислить игровой счет для окончательного имени.
Но...у вас есть два разных gscore массивы, и они не являются одинаковыми, потому что они находятся в разных функциях.

Весь этот код демонстрирует явные признаки паники: вы не сели и не подумали о своей домашней работе, вы просто сложили какой-то код вместе и надеялись на лучшее. Это не сработает. Сядьте, подумайте о домашнем задании и о том, что вам нужно сделать, чтобы решить его, и спланируйте свой код. Затем попробуйте его вручную и посмотрите, будет ли он работать, прежде чем вы приблизитесь к клавиатуре.

Подсказка: Ваш "массив имен" должен быть массивом значений указателя на символ, и вам нужно выделить достаточно места для каждого имени, прежде чем читать его- посмотрите на malloc


Рейтинг:
1

KarstenK

Ваша идея не соответствует хорошему дизайну. В ваших заданиях игрок представляет собой класс с членами для имени и счета. И класс для игр с игроком и оценкой имени.

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

#include <vector>
#include <string>

class Player
{
  std::string name;
  int score;
}

class Game
{
  Player player;
  std::string name;
}

std::vector<Game> data;
Game game;
//fill game data
data.push_pack(game);// a game is stored
Вы также можете сделать реализацию с указателями, но тогда вам нужно будет перебалансировать alloc и free. И я думаю, что у вас есть другие приоритеты.

В настоящее время, означает, что ты пропустил свои временные рамки.


Рейтинг:
0

Rick York

Первая проблема заключается в такой последовательности кода :

void pscore(char pname[])
{
    int pcounter;
    int gscore[pcounter];
    ...
}
Это не будет компилироваться, потому что размер массива должен быть постоянным выражением. Если счетчик будет представлять собой переменное выражение (введенное пользователем), то вы должны динамически распределять массивы следующим образом :
int * gscore = new int[count];
Затем не забудьте освободить память, когда вы закончите с ней :
delete [] gscore;
Аналогичная проблема существует и в основной функции, и ее следует решать аналогичным образом.

Лучшим вариантом было бы использовать std::vector, если это разрешено для этого назначения.