Форум программистов, компьютерный форум CyberForum.ru

Не могу реализовать программу из ЕГЭ, ошибка на вводе. - C++

Восстановить пароль Регистрация
 
GoodDay
0 / 0 / 0
Регистрация: 07.04.2012
Сообщений: 24
07.04.2012, 03:51     Не могу реализовать программу из ЕГЭ, ошибка на вводе. #1
Во общем есть задача:
После единых выпускных экзаменов по информатике в район пришла информация о том,какой ученик,какой школы,сколько набрал баллов.
Районный методист решила выяснить номер школы,ученики которой набрали наибольший средний балл,с точностью до целых.

Программа должна вывести на экран номер такой школы и её средний балл.
Если наибольший средний балл набрало больше одной школы,вывести количество таких школ.

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

На вход программе сначала подается число учеников,сдававших экзамен.В каждой из следующих N строк находится информация об учениках в формате:
<Фамилия><Имя><Номер школы><Количество баллов>
<Фамилия>-строка,состоящая не более чем из 30 символов без пробелов,
<Имя>-строка,состоящая не более чем из 20 символов.
<Номер школы>-число в диапазоне от 1 до 99
<Количество баллов>-число в диапазоне от 1 до 100.
Эти данные записаны через пробел,то есть в каждой строке ровно 3 пробела.

Моя программа:
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
#include <iostream>
#include <string>
using namespace std;
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int students[100];
    int balls[101];
    string good;
    int n,nomer,ball,max;
        int nmax
    cout << "Введите количество учеников: ";
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        getline(cin, good, ' '); // Считываем фамилию
        getline(cin, good, ' '); // Считываем имя
        cin >> nomer; // Номер школы
        cin >> ball; // Количество баллов
        students[nomer]++;
        balls[nomer] = balls[nomer] + ball;
    }
    for (int i = 1; i < 100; i++)
    {
        if (students[i] > 0)
        {
            balls[i] = balls[i] / students[i]; 
        }
        
    }
        nmax = 1;
    max = 1;
    for (int i = 1; i < 101; i++)
    {
        if (balls[i] > balls[max])
        {
            max = i;
                        nmax = 1;
        }
        else if (balls[i] == balls[max])
        {
            n++;
        }
    }
    if (n == 1)
    cout << max << " " << balls[max];
    else
    cout << n;
    return 0;
}
Как я понимаю ошибка еще на вводе, но не могу понять где именно и как ее исправить. Буду очень благодарен за помощь
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2012, 03:51     Не могу реализовать программу из ЕГЭ, ошибка на вводе.
Посмотрите здесь:

C++ Ошибка при вводе
Составьте программу расчета суммы денег (Не могу понять в чем ошибка) C++
Ошибка на вводе данных C++
C++ Составить программу, которая при вводе символа с клавиатуры выво-дит "латинская буква" при вводе латинской буквы и "не латинская бук-ва" во всех остал
ошибка при вводе елементов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.04.2012, 10:47     Не могу реализовать программу из ЕГЭ, ошибка на вводе. #2
не знаю, что за ошибка. Надо указывать, что конкретно не так. С каким сообщением не запускается или запускается, но выдаёт не тот ответ. Тогда какой именно? какие входные данные

Явно бросающиеся в глаза ошибки nmax = 1;
Не знаю, что ты хранишь в этой переменной, но это и есть твоя основная ошибка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 n = 1;
    max = 1;
    for (int i = 1; i < 101; i++)
    {
        if (balls[i] > balls[max])
        {
            max = i;   n = 1;
        }
        else if (balls[i] == balls[max])
        {
            n++;
        }
    }
    if (n == 1)
    cout << max << " " << balls[max]<< " "<<nmax<<endl;
else
    cout << nmax;
Ты уж определись, зачем тебе n, а зачем nmax

Далее
int balls[101];
Средний бал лучше хранить во float, иначе у тебя практически весь этот массив округлится до троек.

Если хранишь средний бал во float сравнение такое 100% не сработает
C++
1
if (balls[i] == balls[max])
я бы сделал
C++
1
2
3
4
5
eps=0.05;
if (fabs(balls[i] - balls[max])<eps){
 
}else
if (balls[i]>balls[max])
(хотя может чтобы избежать таких сложностей и правда стоило хранить в int)
GoodDay
0 / 0 / 0
Регистрация: 07.04.2012
Сообщений: 24
07.04.2012, 13:40  [ТС]     Не могу реализовать программу из ЕГЭ, ошибка на вводе. #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 nmax = 1;
    max = 1;
    for (int i = 1; i < 101; i++)
    {
        if (balls[i] > balls[max])
        {
            max = i;   nmax = 1;
        }
        else if (balls[i] == balls[max])
        {
            nmax++;
        }
    }
    if (nmax == 1)
    cout << max << " " << balls[max]<< " "<<nmax<<endl;
else
    cout << nmax;
Там просто в задачи условие, если таких школ больше одной вывести их количество, nmax за это отвечает. При вводе данных когда cin встречает первый не цифровой символ он же отдает управление следующему оператору?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.04.2012, 13:47     Не могу реализовать программу из ЕГЭ, ошибка на вводе. #4
Цитата Сообщение от GoodDay Посмотреть сообщение
Там просто в задачи условие, если таких школ больше одной вывести их количество, nmax за это отвечает.
Я прочитал это условие, вот только в твоём первом варианте программы, который я цитировал, количество школ суммируется не в nmax, а в n !!
Зачем ты две переменные ввёл. Чтобы себя запутать? Убирай или n или nmax и суммируй себе на здоровье количество школ.
GoodDay
0 / 0 / 0
Регистрация: 07.04.2012
Сообщений: 24
07.04.2012, 14:10  [ТС]     Не могу реализовать программу из ЕГЭ, ошибка на вводе. #5
Да, я уже увидел, ночью писал мало уже чего соображал.
Вот программа с комментариями и исправленными ошибками
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
#include <iostream>
#include <string>
using namespace std;
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int students[100];
    int balls[101];
    string good;
    int n,nomer,ball,max;
    int nmax;
    cout << "Введите количество учеников: ";
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        getline(cin, good, ' '); // Считываем фамилию
        getline(cin, good, ' '); // Считываем имя
        cin >> nomer; // Номер школы
        cin >> ball; // Количество баллов
        students[nomer]++;
        balls[nomer] = balls[nomer] + ball;
    }
    for (int i = 1; i < 100; i++) // Вычисляем средний балл всех школ
    {
        if (students[i] > 0)
        {
            balls[i] = balls[i] / students[i]; 
        }
        
    }
    nmax = 1;
    max = 1;
    for (int i = 1; i < 101; i++)   // Находим максимальный(-ые) средний балл.
    {
        if (balls[i] > balls[max])
        {
            max = i;
            nmax = 1;
        }
        else if (balls[i] == balls[max])
        {
            nmax++;
        }
    }
    if (nmax == 1) // Вывод
    cout << max << " " << balls[max];
    else
    cout << nmax;
    return 0;
}
Добавлено через 16 минут
Но все равно идет неправильный вывод
Например входные данные такие:
Кол-во учащихся: 4
Гена Иванов 10 15
Вася Петров 10 15
Артур Пирожков 10 15
Гена Борщ 4 8
Вывод идет такой: 10 -858993415
Manok
 Аватар для Manok
21 / 21 / 1
Регистрация: 23.09.2010
Сообщений: 119
07.04.2012, 14:58     Не могу реализовать программу из ЕГЭ, ошибка на вводе. #6
Вывод идет такой: 10 -858993415
balls[10] = -858993415, значит, либо выход за пределы массива, либо balls[10] не задавалось значение.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.04.2012, 14:58     Не могу реализовать программу из ЕГЭ, ошибка на вводе. #7
что-то не верится,
из твоего примера следует, что balls[10]=-858993415
Скорее всего это какой-то мусор из неинициализированной части массива
Ведь ты хранишь 101 средний бал, а записываешь лишь 10. Ой, даже два! Остальные мусор в массиве, но ты их всё равно обрабатываешь в цикле for (int i = 1; i < 101; i++)

Я тебе настоятельно советую обнулить массив balls на всякий случай:
memset(balls, 0 , 101*sizeof(int));
Иначе в нём может содержаться мусор. Ведь ты записываешь в него балы для трёх школ, а ищешь максимальный балл для всей 101 школы
Другой, несколько более сложный вариант, создать массив номеров школ, которые есть в списке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int schools[101];
int schoolnum=0;
 
for(int i = 0; i < n; i++)
* * {
* * * * getline(cin, good, ' '); // Считываем фамилию
* * * * getline(cin, good, ' '); // Считываем им
        cin >>nomer;//введи номер школы в цикле чтения учеников
        for(int j = 0; j < schoolnum; j++)
              if (schools[j]==nomer) break;/// если уже есть такая школа, то не добавляем
        if (j==schoolnum) schools[schoolnum++]=nomer;// новая школа
//////...чтение имени и.т.п.
//////////////////////////////////////////////////
//позже идёт
for (int i = 1; i < schoolnum; i++)   // Находим максимальный(-ые) средний балл.
    {
        if (balls[schools[i]] > balls[max])
/////////////................
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2012, 15:01     Не могу реализовать программу из ЕГЭ, ошибка на вводе.
Еще ссылки по теме:

C++ Ошибка при вводе в программу количества чисел, равных единице
C++ Ошибка при вводе числа
C++ При вводе в командной строке некой функции должно выдавать правильный ответ. Как реализовать?

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

Или воспользуйтесь поиском по форуму:
GoodDay
0 / 0 / 0
Регистрация: 07.04.2012
Сообщений: 24
07.04.2012, 15:01  [ТС]     Не могу реализовать программу из ЕГЭ, ошибка на вводе. #8
Да, действительно надо было обнулить массив, большое спасибо, все заработало
Yandex
Объявления
07.04.2012, 15:01     Не могу реализовать программу из ЕГЭ, ошибка на вводе.
Ответ Создать тему
Опции темы

Текущее время: 09:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru