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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
GoodDay
0 / 0 / 0
Регистрация: 07.04.2012
Сообщений: 24
#1

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

07.04.2012, 03:51. Просмотров 644. Ответов 7
Метки нет (Все метки)

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

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

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

На вход программе сначала подается число учеников,сдававших экзамен.В каждой из следующих 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++
#include &lt;iostream&gt; using namespace std; struct Spisok { int chislo; Spisok *sled, *pred; }; void main()

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

Составьте программу расчета суммы денег (Не могу понять в чем ошибка) - C++
Задача: Ежемесячная стипендия студента составляет А руб., а расходы на проживание превышают стипендию и составляют В руб. в месяц. Рост цен...

При вводе в командной строке некой функции должно выдавать правильный ответ. Как реализовать? - C++
Всем доброго времени суток нужна помощь по написанию программы в с++. Смысл программы в том чтобы при вводе в командной строке некого...

Ошибка на вводе данных - C++
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;ctype.h&gt; /* * В последовательности введенных символов...

Ошибка при вводе - C++
мне нужно записать числа с файла в список , подскажите что не так выводит последнее лишнее число не пойму откуда оно берется #include...

Непонятная ошибка при вводе - C++
Дана символьная строка. Слово - последовательность символов между пробелами, не содержащая пробелы внутри себя. Определить количество слов...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 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
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 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
21 / 21 / 1
Регистрация: 23.09.2010
Сообщений: 119
07.04.2012, 14:58     Не могу реализовать программу из ЕГЭ, ошибка на вводе. #6
Вывод идет такой: 10 -858993415
balls[10] = -858993415, значит, либо выход за пределы массива, либо balls[10] не задавалось значение.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 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++
При выводе элемента массива всегда значение ноль. Вероятно ввожу массив неправильно. Помогите пожалуйста найти ошибку. P.S. жел-но не...

Ошибка при вводе дерева - C++
В заданном непустом бинарном дереве найти длину (число ветвей) пути от корня до ближайшей вершины со значением, равным заданному....

Ошибка при вводе числа - C++
Подозреваю, что где-то нужно обнулить переменную rows. Потому что (как показано на скрине) число &quot;45&quot; всегда состоит из первой цифры кол-ва...

Ошибка при вводе строки ! - C++
Точнее не ошибка а не могу ввести строку(не вводится)! Подскажите в чём дело, заранее благодарен! Вот код, функция void vvod(char **D) ...


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

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

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