|
Вопрос # 3 431/ вопрос открыт / |
|
Здравствуйте, эксперты!
НА ВХОДЕ подаются сведения о сдаче 3-х экзаменов: русский язык, матем и ивт. в первой строке n- количество абитуриентов. каждая из следующих n строк имеет формат "Ф_И_балл1_балл2_балл3", (Ф_И)<50 символов
0<каждый балл<100
НА ВЫХОДЕ "Ф_И_max средний балл".
застрял на том, что не получается обработать баллы. помогите пожалуйта.
 |
Вопрос задал: I{ () T (статус: Посетитель)
Вопрос отправлен: 22 ноября 2009, 13:12
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Егор
Здравствуйте, I{ () T!
Можно сделать так:
1) сначала считываем количество студентов
2) в цикле считываем фамилию, имя и оценки (всё в одну строчку)
3) находим первый, а затем второй пробел - выделяем фамилию и имя
4) находим третий пробел - между вторым и третьим пробелами находим оценку1
5) находим четвёртый пробел - между третьим и четвёртым пробелами находим оценку2
6) между четвёртым пробелом и концом строки находим оценку3
7) суммируем оценки. если оценка больше максимальной, то запоминаем текущую фамилию и сумму оценок
8) после выхода из цикла выводим запомненную фамилию и сумму оценок, делённую на три.
недостаток:
программа умеет работать только с данными, введёнными именно в таком формате, который был приведён в примере. т.е. не допускаются два-три или больше пробела вместо одного.
Приложение: Переключить в обычный режим- program Project1;
-
- {$APPTYPE CONSOLE}
-
- uses
- SysUtils, StrUtils;
-
- var
- i, k, k1, n, maxSum, mark1, mark2, mark3 : integer;
- fam, maxFam, tmpStr : string;
- begin
- maxSum:=0;
- readln(n);
- for i:=1 to n do
- begin
- readln(tmpStr);
-
-
-
-
-
-
-
- k:=k1;
-
-
-
- k:=k1;
-
-
-
- if maxSum<(mark1+mark2+mark3) then
- begin
- maxFam:=fam;
- maxSum:=mark1+mark2+mark3;
- end;
- end;
- writeln;
- writeln(maxFam, ' ', maxSum div 3);
- readln;
- end.
 |
Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 22 ноября 2009, 15:28
Оценка за ответ: 5
Комментарий к оценке: no comments
|
Мини-форум вопроса
Всего сообщений: 49; последнее сообщение — 13 декабря 2009, 17:32; участников в обсуждении: 5.
Страницы: [« Предыдущая] [1] [2] [3] [Следующая »]
|
Вадим К (статус: Академик), 7 декабря 2009, 19:17 [#21]:
Я не собираюсь устраивать. я объяснил свою точку зрения.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
I{ () T (статус: Посетитель), 7 декабря 2009, 19:23 [#22]:
2 Мережников Андрей.
извините. не увидел вашего вопроса.
задача такая.
на входе подаются данные об абитуриентах. формат "Ф_И_балл1_балл2_балл3", (Ф_И)<50 символов
МАКСИСАЛЬНЫЙ СРЕДНИЙ БАЛЛ МОЖЕТ БЫТЬ Т О Л Ь К О ОДИН!!!!
надо вывести три следующих друг за другом макс балла в формате
"Ф_И_max средний балл".
пример входа
ivanov ivan 99 99 90
petrov petr 25 25 99
timofeev timofei 50 50 59
kozlov oleg 69 70 81
ВЫВЕСТИ НУЖНО В ПОРЯДКЕ УБЫВАНИЯ
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
I{ () T (статус: Посетитель), 7 декабря 2009, 19:27 [#23]:
то есть следуя из примера на выходе должно быть
ivanov ivan 96
kozlov oleg 73
timofeev timofei 51
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
StrUtils;
var
f1,f2:text;
i, k, k1, n, maxSum1,maxSum2,maxSum3, mark1, mark2, mark3,b:integer;
fam, maxFam1,maxfam2,maxfam3, str,s,s1,s2 : string;
begin
maxSum1:=0;
maxSum2:=0;
maxSum3:=0;
assignFile(f1,'f1.txt');reset(f1);
assignFile(f2,'f2.txt');rewrite(f2);
while not eof(f1) do
begin
readln(f1,Str);
k:=Pos(' ',Str);
k:=PosEx(' ',Str,k+1);
fam:=Copy(Str,1,k-1);
k1:=PosEx(' ',Str,k+1);
mark1:=StrToInt(Copy(Str,k,k1-k));
k:=k1;
k1:=PosEx(' ',Str,k+1);
mark2:=StrToInt(Copy(Str,k,k1-k));
k:=k1;
k1:=length(Str);
mark3:=StrToInt(Copy(Str,k+1,k1-k));
//----------------------------------------
if maxsum1<(mark1+mark2+mark3) then
begin
maxFam1:=fam;
b:=mark1+mark2+mark3;
end;
if b>maxSum1 then
begin
maxSum3:=maxSum2;
maxFam3:=maxFam2;
maxSum2:=maxSum1;
maxFam2:=maxFam1;
maxSum1:=b;
maxFam1:=fam;
end;
end;
writeln(maxFam1,' ',maxSum1);
writeln(maxFam2,' ',maxSum2);
writeln(maxFam3,' ',maxSum3);
//writeln(maxFam, ' ', maxSum div 3);
close(f1);close(f2);
readln;
end. в чем неисправность?(( первое нормально выводит а остальные 2 по нулям
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Мережников Андрей (статус: Абитуриент), 7 декабря 2009, 19:36 [#24]:
to I{}T максимальный балл действительно может быть только один, но этот балл может быть у нескольких человек. В том числе и больше, чем у трех. Об этом я писал раньше. Если это непонятно, то дальнейший разговор - полная бессмыслица.
|
|
I{ () T (статус: Посетитель), 7 декабря 2009, 19:41 [#25]:
нет у условии сказано что макс средний балл ТОЛЬКО У ОДНОГО ЧЕЛОВЕКА.
нужно вывести первые три макс балла ПО УБЫВАНИЮ.
то есть самый макс, потом второе значение которое меньше только первого и третье.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Мережников Андрей (статус: Абитуриент), 7 декабря 2009, 19:59 [#26]:
я бы поспорил с преподом, что условие неправильное. Почему оно неправильное - я приводил пример. Остальное - на ваше усмотрение. Я вообще люблю отстаивать свои права . Даже когда учился в институте это удавалось. И сейчас удается, получая второе высшее
|
|
Егор (статус: 10-ый класс), 7 декабря 2009, 22:58 [#27]:
Мережников Андрей:
Андрей, в жизни бывает разное. Вот есть условие - имеются такие данные, что в них только один максимум.
Зачем спорить? Это же не реальная задача, а учебная. Там всё возможно. Данные-то и подобрать можно.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
I{ () T (статус: Посетитель), 11 декабря 2009, 21:26 [#28]:
господа, аховая ситуация!!! help!!!!!!!!! помогите решить задачу пожалуйста!
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Егор (статус: 10-ый класс), 11 декабря 2009, 21:49 [#29]:
что за оффтоп?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
I{ () T (статус: Посетитель), 11 декабря 2009, 21:57 [#30]:
2 егор
просветите меня, где вы увидели оффтоп?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Егор (статус: 10-ый класс), 11 декабря 2009, 22:14 [#31]:
Цитата (I{ () T):
господа, аховая ситуация!!! help!!!!!!!!! помогите решить задачу пожалуйста!
где задача?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
I{ () T (статус: Посетитель), 11 декабря 2009, 22:18 [#32]:
"где задача?"
задача такая.
на входе подаются данные об абитуриентах. формат "Ф_И_балл1_балл2_балл3", (Ф_И)<50 символов
МАКСИСАЛЬНЫЙ СРЕДНИЙ БАЛЛ МОЖЕТ БЫТЬ Т О Л Ь К О ОДИН!!!!
надо вывести три следующих друг за другом макс балла в формате
"Ф_И_max средний балл".
пример входа
ivanov ivan 99 99 90
petrov petr 25 25 99
timofeev timofei 50 50 59
kozlov oleg 69 70 81
ВЫВЕСТИ НУЖНО В ПОРЯДКЕ УБЫВАНИЯ
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
I{ () T (статус: Посетитель), 11 декабря 2009, 22:20 [#33]:
begin
maxSum1:=0; b:=0;
maxSum2:=0;
maxSum3:=0;
assignFile(f1,'f1.txt');reset(f1);
assignFile(f2,'f2.txt');rewrite(f2);
while not eof(f1) do
begin
readln(f1,Str);
k:=Pos(' ',Str);
k:=PosEx(' ',Str,k+1);
fam:=Copy(Str,1,k-1);
k1:=PosEx(' ',Str,k+1);
mark1:=StrToInt(Copy(Str,k,k1-k));
k:=k1;
k1:=PosEx(' ',Str,k+1);
mark2:=StrToInt(Copy(Str,k,k1-k));
k:=k1;
k1:=length(Str);
mark3:=StrToInt(Copy(Str,k+1,k1-k));
b:=mark1+mark3+mark2;
if b>maxSum3 then
begin
maxSum3:=maxSum2;
maxFam3:=maxFam2;
maxSum2:=maxSum1;
maxFam2:=maxFam1;
maxSum1:=b; в этом районе ошибка. все выводит правильно но не по порядку убывания
maxFam1:=fam;
end;
end;
writeln(f2,maxFam1,' ',maxSum1 div 3);
writeln(f2,maxFam2,' ',maxSum2 div 3);
writeln(f2,maxFam3,' ',maxSum3 div 3);
close(f1);close(f2);
readln;
end.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
I{ () T (статус: Посетитель), 11 декабря 2009, 22:35 [#34]:
maxSum3:=maxSum2;
maxFam3:=maxFam2;
maxSum2:=maxSum1;
maxFam2:=maxFam1;
maxSum1:=b; в этом районе ошибка. все выводит правильно но не по порядку убывания
maxFam1:=fam;
ну почему он вразброс выводит?(((((
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Егор (статус: 10-ый класс), 11 декабря 2009, 22:52 [#35]:

а если ввести в первый файл что-то подобное:
ivanov ivan 99 99 90
petrov petr 25 25 99
timofeev timofei 10 5 5
kozlov oleg 10 10 10
то получим вообще ошибочный вывод
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Егор (статус: 10-ый класс), 11 декабря 2009, 22:54 [#36]:
отладчиком пройдись - посмотри, поймёшь, как максимумы заполняются
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Егор (статус: 10-ый класс), 11 декабря 2009, 22:58 [#37]:
если заниматься перебором всех вариантов, то можно написать так:
while not eof(f1) do
begin
readln(f1,Str);
k:=Pos(' ',Str);
k:=PosEx(' ',Str,k+1);
fam:=Copy(Str,1,k-1);
k1:=PosEx(' ',Str,k+1);
mark1:=StrToInt(Copy(Str,k,k1-k));
k:=k1;
k1:=PosEx(' ',Str,k+1);
mark2:=StrToInt(Copy(Str,k,k1-k));
k:=k1;
k1:=length(Str);
mark3:=StrToInt(Copy(Str,k+1,k1-k));
b:=mark1+mark3+mark2;
if b>maxSum1 then
begin
maxSum1:=b;
maxFam1:=fam;
end;
if (b>maxSum2) and (b<maxSum1) then
begin
maxSum2:=b;
maxFam2:=fam;
end;
if (b>maxSum3) and (b<maxSum2) then
begin
maxSum3:=b;
maxFam3:=fam;
end;
end;
зы I{ () T: оформляй свои тексты тегом { { code } }, а то читать неудобно, ладно?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
I{ () T (статус: Посетитель), 12 декабря 2009, 16:55 [#38]:
окай=)
а мысль с вот этим maxSum3:=maxSum2;
maxFam3:=maxFam2;
maxSum2:=maxSum1;
maxFam2:=maxFam1;
maxSum1:=b;
maxFam1:=fam; плохая? мне кажется и код короче и ОЗУ прога меньше займет? с помощью метода который предложили сначала тоже хотел так сделать. вопрос: если в задаче приводится ограничение, что есть порог на озу используемое, например 16 мб. то как узнать перешел порог иль нет?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Егор (статус: 10-ый класс), 13 декабря 2009, 11:40 [#40]:
I{ () T:
твой код как бы логичен, но вот представь - идёт последовательность баллов (сразу пусть будет сумма баллов):
100
5
6
80
90
50
Понятно, что максимумы должны быть 100, 90 и 80
Но твой код запомнит 100 в первый максимум, а потом будет передвигать его к 3-му, получим
maxSum3:=100;
maxSum2:=5;
maxSum1:=6;
после этого заполнение максимумов закончится
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
Страницы: [« Предыдущая] [1] [2] [3] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|