0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 9
|
||||||
1 | ||||||
Вывести на экран фамилии и имена трех худших по среднему баллу учеников26.02.2012, 22:00. Показов 2112. Ответов 17
Метки нет Все метки)
(
задача
На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат: <Фамилия> <Имя> <оценки>, где <Фамилия> – строка, состоящая не более чем из 20 символов, <Имя> – строка, состоящая не более чем из 15 символов, <оценки> – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. <Фамилия> и <Имя>, а также <Имя> и <оценки> разделены одним пробелом. Пример входной строки: Иванов Петр 4 5 3 Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена трех худших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех худших, то следует вывести и их фамилии и имена. А вот мое "решение": Код:
0
|
|
26.02.2012, 22:00 | |
Ответы с готовыми решениями:
17
Вывести фамилии и имена трех худших по среднему баллу учеников
Вывести имена трех худших по баллу Вывести на экран фамилии и имена трех худших по среднему баллу учеников |
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
||||||
27.02.2012, 02:17 | 2 | |||||
для начала так:
1
|
0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 9
|
||||||
27.02.2012, 11:19 [ТС] | 3 | |||||
Спасибо! проглядел этот момент)
Подскажите еще, что в нижеприведенном коде не так?
Добавлено через 1 час 6 минут вот например, если после строки исходного когда: char *tmpData = new char[S] ; вставить : std::cin>>N; вылазит ошибка(
0
|
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
|
|
27.02.2012, 11:32 | 4 |
Нет ошибки:
http://liveworkspace.org/code/... f9cf10eafb И зачем вам stdafx.h? Добавлено через 1 минуту итераций
0
|
0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 9
|
|||||||||||
27.02.2012, 11:45 [ТС] | 5 | ||||||||||
Но если я добавляю 2 сточки:
вылазят ошибки( Добавлено через 4 минуты во всяком случае, на моем компиляторе так.. Добавлено через 2 минуты после ввода "числа участников" вылазит "Необработанное исключение в "0x1027d2f3 (msvcr100d.dll)" в "EVILcooky.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000"."
0
|
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
|
|
27.02.2012, 13:57 | 6 |
Код вообще бередовый. У тебя есть массив с данными, под который ты выделяешь память. У тебя сначало N = 5, затем ты выделяешь память под 5! элементов, а затем вводишь N. Т.е. ты выделил память под 5! элементов, затем ввел N = 100, начал перебор всех, и когда у тебя i становится >= 5, то понятное дело вылезет исключение, ведь массив у тебя всего на 5 элементов.
Тебе надо сначало запрашивать ввод N, а уже после этого выделять память под массив.
0
|
0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 9
|
||||||
27.02.2012, 14:09 [ТС] | 7 | |||||
Добавлено через 3 минуты а если я нициализирую N(любым значением) в самой программе, то все идет отлично...
0
|
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
|
|
27.02.2012, 14:22 | 8 |
Скинь заново весь подправленный код.
Добавлено через 5 минут Одна из твоих ошибок - ты неправильно используешь функцию strtok Добавлено через 4 минуты strcpy(pupin[i].user, strtok(tmpD," ")); Что тут получается? В строке tmpD ищется символ пробела, возращается на него указатель. А далее ты копируешь все, что стоит после пробела. А нужно наоборот копировать все что стоит до пробела. strtok(NULL," ") - Такая запись вообще не имее смысла, т.к. на месте NULL должна стоять строка, в которой выполняется поиск. А вообще советую читать MSDN! Добавлено через 45 секунд Я бы посоветовал сделать через потоки, либо используя функцию sscanf
1
|
0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 9
|
||||||||||||
27.02.2012, 14:41 [ТС] | 9 | |||||||||||
Вот "исправленный вариант".. а можете привести в качестве примера фрагмен кода с ипользованием "потоков" или ф-ции сканф только условие следующее: данные о участнике(фамилия имя оценка оценка оценка) вводятся в одну строку, как указано в задании выше Добавлено через 11 минут
0
|
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
|
||||||
28.02.2012, 08:36 | 10 | |||||
Приведи пример строки ввода.
Добавлено через 8 минут С использование sscanf получится вот так:
Ну и можешь попробовать через std::cin считать. Это тоже не сложно, писать пока не буду.
1
|
0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 9
|
|
28.02.2012, 08:37 [ТС] | 11 |
Ремизова Валерия 5 4 3
0
|
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
|
|
28.02.2012, 08:45 | 12 |
В моем примере, в строку имени занесется Валерия.
Вызов strtok(NULL," ") вызовет исключение(или просто вернет NULL) Эта функция ищет в строке первую встречу символов из другой строки. А то что ты написал, ты вместо строки передаешь NULL и ищешь пробел... В строке tmpD = "Ремизова Валерия 5 4 3" вызов char *a = strtok(tmpD, " ") Вернет указатель на пробел. Т.е. строка 'a' буде равна " Валерия 5 4 3" вызов a = strtok(a + 1, " ") Вернет указатель на второй пробел т.е. " 5 4 3". Пока все, потом смогу отписаться только вечером.
0
|
![]() 5827 / 3478 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
28.02.2012, 09:11 | 13 |
это не так. Советую почитать маны
Добавлено через 1 минуту нет, не вызовет, это вообще С-ая функция. И NULL она вернет только при определеном случае
0
|
0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 9
|
|
28.02.2012, 09:19 [ТС] | 14 |
strtok(stroka, " "); -вернет первую лексему строки
strtok(NULL, " "); -вторая лексема строки и работает моя программа именно так...выше есть рабочий вариант, проверь..
0
|
![]() 5827 / 3478 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
28.02.2012, 09:21 | 15 |
cooky, так я тебе ничего и не говорил. Я отвечал на необоснованные утверждения darkknight2008
0
|
0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 9
|
||||||
28.02.2012, 09:33 [ТС] | 16 | |||||
Nameless One, извиняюсь)
0
|
62 / 62 / 11
Регистрация: 16.10.2011
Сообщений: 200
|
|
28.02.2012, 15:16 | 17 |
Да, простите облажался(( После вызова std::cin >> N; в потоке ввода остается символ перевода строки. Поэтому при вызове std::cin.getline(tmpData,S); сразу ловится символ перевода строки и считается, что ввод закончен, т.е. строка остается пустой. Чтобы его отловить, можно после std::cin >> N; вставить getchar() либо std::cin.ignore();
1
|
0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 9
|
|
28.02.2012, 15:29 [ТС] | 18 |
Вот оно!))спасибо огромное)
0
|
28.02.2012, 15:29 | |
28.02.2012, 15:29 | |
Помогаю со студенческими работами здесь
18
Вывести на экран фамилии и имена трех худших по среднему баллу учеников Вывести на экран фамилии и имена трех худших по среднему баллу учеников Вывести на экран фамилии и имена трех лучших по среднему баллу учеников Вывести на экран фамилии и имена трех лучших по среднему баллу учеников Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |