Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 4
Регистрация: 16.03.2013
Сообщений: 23
1

Вывести информацию о спортсменах, возраст которых не достиг 18 лет

09.05.2015, 19:43. Просмотров 2048. Ответов 8
Метки нет (Все метки)

Здравствуйте! Имеется задание:
Информация об участниках спортивных соревнований содержит название команды, ФИО игрока, возраст. Вывести информацию о спортсменах, возраст которых не достиг 18 лет.

Процесс шёл достаточно неплохо, но решил использовать динамический массив структур, тут и начались проблемы. Обратите внимание на функцию fillTeamInfo (55), передачу в нее аргументов (108), создание структуры (84) и выделение памяти под динамический массив из этих структур (91).

Проблема в том, что Microsoft Visual Studio 2015 RC выдает ошибку, когда я пытаюсь передать аргумент playerInfo в нашу функцию fillTeamInfo. Так же не могу считать строку (70) в нужную ячейку моей структуры, а именно на второй аргумент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void fillTeamInfo(FILE *teamInfoFile, string fileName, unsigned short int teamCount, struct teamInfo *playerInfo)
{
        ...
    for (int i(0); i < teamCount; i++)
    {
        for (int j(0); j < playersCount; j++)
        {
            cout << "Введите название команды: ";
            getline(cin, playerInfo[i]->playerName[j].c_str()); // Проблема тут
        }
    }
}
Ошибки компилятора
70(1)
C2027 | Строка 70 | использование неопределенного типа "teamInfo"

70(2)
C2227 | Строка 70 | выражение слева от "->playerName" должно указывать на тип класса, структуры или объединения либо на универсальный тип

70(3)
C2228 | Строка 70 | выражение слева от ".c_str" должно представлять класс, структуру или объединение

70(4)
C2780 | Строка 70 | std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &): требует аргументов: 2, имеется: 1

70(5)
C2780 | Строка 70 | std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem): требует аргументов: 3, имеется: 1

70(6)
C2780 | Строка 70 | std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &&,std::basic_string<_Elem,_Traits,_Alloc> &): требует аргументов: 2, имеется: 1

70(7)
C2780 | Строка 70 | std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &&,std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem): требует аргументов: 3, имеется: 1

70(8)
IntelliSense | Строка 70 | отсутствуют экземпляры перегруженная функция "getline", соответствующие списку аргументов, типы аргументов: (std::istream, <error-type>)

70(9)
IntelliSense | Строка 70 | выражение должно представлять собой указатель на полный тип объекта

108(1)
C2664 | Строка 108 | "void fillTeamInfo(FILE *,std::string,unsigned short,teamInfo *)": невозможно преобразовать аргумент 4 из "main::teamInfo *" в "teamInfo *"

108(2)
IntelliSense | Строка 108 | аргумент типа "teamInfo *" несовместим с параметром типа "teamInfo *"



Весь код
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
Информация об участниках спортивных соревнований содержит название команды, ФИО игрока, возраст.
Вывести информацию о спортсменах, возраст которых не достиг 18 лет.
*/
 
#include "stdafx.h"
 
int menu()
{
    cout << "Выберите нужный пункт:\n";
    cout << " > 1. Введите имя файла\n";
    cout << " > 2. Создать новый файл\n";
    cout << " > 3. Введите количество команд\n";
    cout << " > 4. Ввод информации о спортсменах\n";
    cout << " > 5. Открыть файл\n";
    cout << " > 6. Вывести результат на экран\n";
    cout << " > 7. Записать результат в файл\n";
    cout << " > 8. Выход\n";
    cout << " - > ";
 
    int userChoise;
    cin >> userChoise;
    cin.get();
    return userChoise;
}
 
int setTeamCount() //Спрашиваем у пользователя, сколько всего есть команд
{
    cout << "Введите количество команд: ";
    unsigned short int teamCount;
    cin >> teamCount;
    cout << "Готово! Количество команд принято.\n";
    return teamCount;
}
 
string newFileName() // Вводим с клавиатуры название файла
{
    cout << "Введите имя файла: ";
    string fileName;
    getline(cin, fileName);
    cout << "Готово! Имя \"" << fileName << "\" принято.\n";
    return fileName;
}
 
void newFileCreate(FILE *teamInfoFile, string fileName) // Создаем файл с указанным именем
{
    if ((teamInfoFile = fopen(fileName.c_str(), "w")) == NULL)
    {
        cout << "ОШИБКА! Файл не создан.\n";
        exit(1);
    }
    cout << "Готово! Файл с именем \"" << fileName << "\" успешно создан.\n";
}
 
void fillTeamInfo(FILE *teamInfoFile, string fileName, unsigned short int teamCount, struct teamInfo *playerInfo)
{
    if ((teamInfoFile = fopen(fileName.c_str(), "r+")) == NULL)
    {
        cout << "ОШИБКА! Невозможно записать данные в файл.\n";
        exit(1);
    }
    cout << "Введите количество игроков в команде (макасимум 5): ";
    int playersCount(0);
    cin >> playersCount;
    for (int i(0); i < teamCount; i++)
    {
        for (int j(0); j < playersCount; j++)
        {
            cout << "Введите название команды: ";
            getline(cin, playerInfo[i]->playerName[j].c_str());
        }
    }
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    // Variables
    string fileName;
    unsigned short int teamCount;
    FILE *teamInfoFile = NULL;
 
    struct teamInfo
    {
        string teamName;
        string playerName[5];
        unsigned short int playerAge[5];
    };
 
    teamInfo *playerInfo = new teamInfo[teamCount];
 
 
    while (true)
    {
        switch (menu())
        {
        case 1:
            fileName = newFileName();
            break;
        case 2:
            newFileCreate(teamInfoFile, fileName);
            break;
        case 3:
            teamCount = setTeamCount();
            break;
        case 4:
            fillTeamInfo(teamInfoFile, fileName, teamCount, playerInfo);
            break;
 
        case 5: // временная заглушка
 
        default:
            cout << "ОШИБКА! Выберите правильный вариант!\n";
        }
    }
 
    delete[] playerInfo;
    return 0;
}


stdafx.h
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
 
#define _CRT_SECURE_NO_WARNINGS
 
#include <stdio.h>
#include <iostream>
#include <string>
#include "targetver.h"
 
using namespace std;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2015, 19:43
Ответы с готовыми решениями:

Вывести информацию о спортсменах, возраст которых не достиг 18 лет
// KR_6.cpp: определяет точку входа для консольного приложения. // Информация об участниках...

Подсчитать количество людей, возраст которых находится в интервале 10 лет
Прошу помощи с переводом на С++, этого кода: function random(min,max,l) {var arr = ,m = ,n = 0;...

Вывести возраст пользователя, используя правильное слово год/года/лет
Вводим число от 1 до 100. В ответ выводится строка типа «Вам 76 лет». Или «Вам 3 года». То есть, в...

Вывести: список сотрудников, возраст которых не менее K лет и не превышает L лет
20.Дан список N сотрудников с указанием фамилии, точной даты рождения, стажа работы и заработной...

8
243 / 163 / 133
Регистрация: 30.09.2012
Сообщений: 690
09.05.2015, 21:21 2
Цитата Сообщение от Senpos Посмотреть сообщение
getline(cin, playerInfo[i]->playerName[j].c_str()); // Проблема тут
Замените на :
C++
1
getline(cin, playerInfo[i]->playerName[j]);
Скорее всего ругается из-за этого
0
1 / 1 / 4
Регистрация: 16.03.2013
Сообщений: 23
09.05.2015, 21:26  [ТС] 3
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
Скорее всего ругается из-за этого
Так тоже пробовал. Не из-за этого. Ошибка в работе с самой структурой, я думаю, недавно начал изучать.
Уж очень мусолят глаза ошибки 70(9) и 108(2).
0
243 / 163 / 133
Регистрация: 30.09.2012
Сообщений: 690
09.05.2015, 21:43 4
У вас точно в структуре переменная playerName должна быть массивом строк?
C++
1
2
3
4
5
6
7
8
9
10
11
    int playersCount(0);
    cin >> playersCount;
    for (int i(0); i < teamCount; i++)
    {
        for (int j(0); j < playersCount; j++)
        {
            cout << "Введите название команды: ";
            getline(cin, playerInfo[i]->playerName[j]);
        }
    }
}
Если у вас playersCount всегда равен 0, тогда смысл во 2м цикле пропадает

Добавлено через 8 минут
C++
1
 getline(cin, playerInfo[i].playerName[j]);
0
1 / 1 / 4
Регистрация: 16.03.2013
Сообщений: 23
09.05.2015, 21:54  [ТС] 5
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
У вас точно в структуре переменная playerName должна быть массивом строк?
playerName, как и playerAge - массивы, так как пользователь сам указывает сколько человек в одной команде.
Цитата Сообщение от Gr1f0nn Посмотреть сообщение
Если у вас playersCount всегда равен 0, тогда смысл во 2м цикле пропадает
Пользователь вводит значение с клавиатуры, оно не всегда равно нулю.

C++
1
getline(cin, playerInfo[i].playerName[j]);
Это тоже не работает. Компилятор сообщает об ошибке в этой строке, но я чувствую беда в оформлении структуры, а не в написании.
0
243 / 163 / 133
Регистрация: 30.09.2012
Сообщений: 690
09.05.2015, 22:09 6
Лучший ответ Сообщение было отмечено Senpos как решение

Решение

Цитата Сообщение от Senpos Посмотреть сообщение
Это тоже не работает. Компилятор сообщает об ошибке в этой строке, но я чувствую беда в оформлении структуры, а не в написании.
Странно, у меня это работает.

Добавлено через 57 секунд
Все верно. Вы структуру объявили в main().
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    setlocale(LC_ALL, "Russian");
 
    // Variables
    string fileName;
    unsigned short int teamCount;
    FILE *teamInfoFile = NULL;
 
    struct teamInfo
    {
        string teamName;
        string playerName[5];
        unsigned short int playerAge[5];
    };
...
}

Сделайте так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct teamInfo
{
    string teamName;
    string playerName[5];
    unsigned short int playerAge[5];
};
//.....
//some code
int main()
{
//...
return 0
}
И
C++
1
void fillTeamInfo(FILE *teamInfoFile, string fileName, unsigned short int teamCount,  teamInfo *playerInfo)
А не:
C++
1
void fillTeamInfo(FILE *teamInfoFile, string fileName, unsigned short int teamCount, struct /*<<<--- */ teamInfo *playerInfo)
1
1 / 1 / 4
Регистрация: 16.03.2013
Сообщений: 23
09.05.2015, 22:09  [ТС] 7
Работает! Спасибо.

Хочу уточнить - описание глобальной структуры это нормальная практика? Обычно читаю отзывы, что глобальные переменные - плохой тон и прочее прочее. Тут как-то по другому?
0
243 / 163 / 133
Регистрация: 30.09.2012
Сообщений: 690
09.05.2015, 22:20 8
В конечном итоге ,должно выглядеть так(логику и остальные ошибки, если они есть, не смотрел):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <iostream>
#include <cstdlib>
#include <string>
#include <stdio.h>
using namespace std;
 
 
struct teamInfo
{
    string teamName;
    string playerName[5];
    unsigned short int playerAge[5];
};
 
 
int menu()
{
    cout << "Выберите нужный пункт:\n";
    cout << " > 1. Введите имя файла\n";
    cout << " > 2. Создать новый файл\n";
    cout << " > 3. Введите количество команд\n";
    cout << " > 4. Ввод информации о спортсменах\n";
    cout << " > 5. Открыть файл\n";
    cout << " > 6. Вывести результат на экран\n";
    cout << " > 7. Записать результат в файл\n";
    cout << " > 8. Выход\n";
    cout << " - > ";
 
    int userChoise;
    cin >> userChoise;
    cin.get();
    return userChoise;
}
 
int setTeamCount() //Спрашиваем у пользователя, сколько всего есть команд
{
    cout << "Введите количество команд: ";
    unsigned short int teamCount;
    cin >> teamCount;
    cout << "Готово! Количество команд принято.\n";
    return teamCount;
}
 
string newFileName() // Вводим с клавиатуры название файла
{
    cout << "Введите имя файла: ";
    string fileName;
    getline(cin, fileName);
    cout << "Готово! Имя \"" << fileName << "\" принято.\n";
    return fileName;
}
 
void newFileCreate(FILE *teamInfoFile, string fileName) // Создаем файл с указанным именем
{
    if ((teamInfoFile = fopen(fileName.c_str(), "w")) == NULL)
    {
        cout << "ОШИБКА! Файл не создан.\n";
        exit(1);
    }
    cout << "Готово! Файл с именем \"" << fileName << "\" успешно создан.\n";
}
 
void fillTeamInfo(FILE *teamInfoFile, string fileName, unsigned short int teamCount,  teamInfo *playerInfo)
{
    if ((teamInfoFile = fopen(fileName.c_str(), "r+")) == NULL)
    {
        cout << "ОШИБКА! Невозможно записать данные в файл.\n";
        exit(1);
    }
    cout << "Введите количество игроков в команде (макасимум 5): ";
    int playersCount(0);
    cin >> playersCount;
    for (int i(0); i < teamCount; i++)
    {
        for (int j(0); j < playersCount; j++)
        {
            cout << "Введите название команды: ";
            getline(cin, playerInfo[i].playerName[j]);
        }
    }
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    // Variables
    string fileName;
    unsigned short int teamCount;
    FILE *teamInfoFile = NULL;
 
    teamInfo *playerInfo = new teamInfo[teamCount];
 
 
    while (true)
    {
        switch (menu())
        {
        case 1:
            fileName = newFileName();
            break;
        case 2:
            newFileCreate(teamInfoFile, fileName);
            break;
        case 3:
            teamCount = setTeamCount();
            break;
        case 4:
            fillTeamInfo(teamInfoFile, fileName, teamCount, playerInfo);
            break;
 
        case 5: // временная заглушка
 
        default:
            cout << "ОШИБКА! Выберите правильный вариант!\n";
        }
    }
 
    delete[] playerInfo;
    return 0;
}
Добавлено через 9 минут
Цитата Сообщение от Senpos Посмотреть сообщение
Хочу уточнить - описание глобальной структуры это нормальная практика? Обычно читаю отзывы, что глобальные переменные - плохой тон и прочее прочее. Тут как-то по другому?
Насчет глобальных переменных вы верно сказали. Их действительно лучше избегать и использовать только при крайней необходимости.
Насчет структур, то в данном случае вы объявляете не переменную, а новый тип данных, поэтому, чтобы использовать этот новый тип данных в своих функциях свободно, необходимо, чтобы эти функции знали о нем, а для этого объявить нужно именно таким образом (лично я в различных источниках не встречал иной записи). Другой вариант, это объявить вашу структуру в отдельном файле и потом подключить его к основной программе (в больших проектах, да и не очень больших тоже, это довольно-таки удобно).
Лучше, конечно, почитать о структурах в какой-нибудь литературе, так как у меня с правильными формулировками не совсем все гладко может быть, да и вам понятнее станет, если прочтете
1
1 / 1 / 4
Регистрация: 16.03.2013
Сообщений: 23
09.05.2015, 22:25  [ТС] 9
Видать, пришло время достать Шилдта из шкафа. Так и сделаю. Еще раз спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2015, 22:25

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

Вывести информацию о сотрудниках чей возраст от 40 до 50 лет
Сделать меню программы которое входит в него: Ввод данных в текстовый файл, чтение из текстового...

Дан список сотрудников: фамилия, возраст, должность, оклад. Оставить в списке только тех, кто не достиг возраста 60 лет.
Пожалуйста помогите решить задачи в паскаль вот одна из них. Дан список сотрудников: фамилия,...

Вывести сведения об автомобилях, возраст которых больше 10 лет
Составить программу, которая выводит сведения об автомобилях, возраст которых больше 10 лет, и...

Вывести на экран сотрудников мужского пола возраст которых выше 45 лет
Дан список сотрудников некой организации, вывести на экран сотрудников мужского пола возраст...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.