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

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

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

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

07.04.2012, 03:51. Просмотров 661. Ответов 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;
}
Как я понимаю ошибка еще на вводе, но не могу понять где именно и как ее исправить. Буду очень благодарен за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2012, 03:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу реализовать программу из ЕГЭ, ошибка на вводе. (C++):

Ошибка при вводе в программу количества чисел, равных единице - C++
#include &lt;iostream&gt; using namespace std; struct Spisok { int chislo; Spisok *sled, *pred; }; void main()

Не могу запустить программу. При вводе данных окно просто исчезает - C#
int m = 0; Console.Write(&quot;Введите значение m &quot;); m = Convert.ToInt32(Console.ReadLine()); ...

Ошибка при вводе данных в программу - C (СИ)
помогите, пжлста, ошибка при выводе(прога читает и выводит записи+создает новые) возможно из-за klient :gscratch: спасибо ...

Ошибка про вводе исходных данных в программу - VBA
постоянно происходит вывод сообщения error Dim k As Double ' Курс Dim c As Double ' Купонная ставка Dim n As Double ' Число лет ...

При вводе значения в программу возникает ошибка exitcode=216 - Turbo Pascal
есть программа, при вводе значения в программу она завершает свое действие и появляется окошко %disk%:\%путь к...

minmax из с2 егэ, не могу разобраться - Pascal
Дан целочисленный массив из 30 элементов. Элементы массива могут принимать значения от – 20 до 20 – сведения о температуре за каждый день...

7
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 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)
0
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 встречает первый не цифровой символ он же отдает управление следующему оператору?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
07.04.2012, 13:47 #4
Цитата Сообщение от GoodDay Посмотреть сообщение
Там просто в задачи условие, если таких школ больше одной вывести их количество, nmax за это отвечает.
Я прочитал это условие, вот только в твоём первом варианте программы, который я цитировал, количество школ суммируется не в nmax, а в n !!
Зачем ты две переменные ввёл. Чтобы себя запутать? Убирай или n или nmax и суммируй себе на здоровье количество школ.
0
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
0
Manok
21 / 21 / 1
Регистрация: 23.09.2010
Сообщений: 119
07.04.2012, 14:58 #6
Вывод идет такой: 10 -858993415
balls[10] = -858993415, значит, либо выход за пределы массива, либо balls[10] не задавалось значение.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 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])
/////////////................
0
GoodDay
0 / 0 / 0
Регистрация: 07.04.2012
Сообщений: 24
07.04.2012, 15:01  [ТС] #8
Да, действительно надо было обнулить массив, большое спасибо, все заработало
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2012, 15:01
Привет! Вот еще темы с ответами:

При вводе данных в программу возникает ошибка "индекс вне диапазона" - QBasic
При вводе данных в программу вылетает ошибка &quot;индекс вне диапазона&quot;.Помогите исправить пожалуйста. Вот текст программы CLS PRINT :...

Арифметический корень (книга Мальцев Математика ЕГЭ минимум Подготовка к ЕГЭ 2016) - Алгебра
Помогите, может у кого есть решибник к книге Мальцев Математика ЕГЭ минимум Подготовка к ЕГЭ 2016. Если кому то не жалко времени, решите....

Нужно написать программу С3 из ЕГЭ. - Pascal
Вообще С3 не подразумевает написание программы-нужно только нарисовать блок-схему, но вот нас заставили, идей никаких нет.Пожалуйста...

Как реализовать подсказки при вводе в input? - jQuery
Добрый день Киберовцы! =) Идея такая: Нужно чтоб при вводе в поле, всплывали подсказки(ну это видимо через поиск подстроки) как при вводе...


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
07.04.2012, 15:01
Ответ Создать тему
Опции темы

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