Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 431

/ вопрос открыт /

Здравствуйте, эксперты!
НА ВХОДЕ подаются сведения о сдаче 3-х экзаменов: русский язык, матем и ивт. в первой строке n- количество абитуриентов. каждая из следующих n строк имеет формат "Ф_И_балл1_балл2_балл3", (Ф_И)<50 символов
0<каждый балл<100
НА ВЫХОДЕ "Ф_И_max средний балл".
застрял на том, что не получается обработать баллы. помогите пожалуйта.

I{ () T Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: I{ () T (статус: Посетитель)
Вопрос отправлен: 22 ноября 2009, 13:12
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Егор

Здравствуйте, I{ () T!
Можно сделать так:
1) сначала считываем количество студентов
2) в цикле считываем фамилию, имя и оценки (всё в одну строчку)
3) находим первый, а затем второй пробел - выделяем фамилию и имя
4) находим третий пробел - между вторым и третьим пробелами находим оценку1
5) находим четвёртый пробел - между третьим и четвёртым пробелами находим оценку2
6) между четвёртым пробелом и концом строки находим оценку3
7) суммируем оценки. если оценка больше максимальной, то запоминаем текущую фамилию и сумму оценок
8) после выхода из цикла выводим запомненную фамилию и сумму оценок, делённую на три.

недостаток:
программа умеет работать только с данными, введёнными именно в таком формате, который был приведён в примере. т.е. не допускаются два-три или больше пробела вместо одного.

Приложение:
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils, StrUtils;
  7.  
  8. var
  9. i, k, k1, n, maxSum, mark1, mark2, mark3 : integer;
  10. fam, maxFam, tmpStr : string;
  11. begin
  12. maxSum:=0;
  13. readln(n);
  14. for i:=1 to n do
  15. begin
  16. readln(tmpStr);
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24. k:=k1;
  25.  
  26.  
  27.  
  28. k:=k1;
  29.  
  30.  
  31.  
  32. if maxSum<(mark1+mark2+mark3) then
  33. begin
  34. maxFam:=fam;
  35. maxSum:=mark1+mark2+mark3;
  36. end;
  37. end;
  38. writeln;
  39. writeln(maxFam, ' ', maxSum div 3);
  40. readln;
  41. 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

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

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&lt;(mark1+mark2+mark3) then
    begin
      maxFam1:=fam;
      b:=mark1+mark2+mark3;
    end;
 
    if b&gt;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

I{ () T (статус: Посетитель), 7 декабря 2009, 19:41 [#25]:

нет у условии сказано что макс средний балл ТОЛЬКО У ОДНОГО ЧЕЛОВЕКА.
нужно вывести первые три макс балла ПО УБЫВАНИЮ.
то есть самый макс, потом второе значение которое меньше только первого и третье.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 7 декабря 2009, 19:59 [#26]:

я бы поспорил с преподом, что условие неправильное. Почему оно неправильное - я приводил пример. Остальное - на ваше усмотрение. Я вообще люблю отстаивать свои права :-). Даже когда учился в институте это удавалось. И сейчас удается, получая второе высшее
Егор

Егор (статус: 10-ый класс), 7 декабря 2009, 22:58 [#27]:

Мережников Андрей:
Андрей, в жизни бывает разное. Вот есть условие - имеются такие данные, что в них только один максимум.
Зачем спорить? Это же не реальная задача, а учебная. Там всё возможно. Данные-то и подобрать можно.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
I{ () T

I{ () T (статус: Посетитель), 11 декабря 2009, 21:26 [#28]:

господа, аховая ситуация!!! help!!!!!!!!! помогите решить задачу пожалуйста!
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Егор

Егор (статус: 10-ый класс), 11 декабря 2009, 21:49 [#29]:

что за оффтоп?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
I{ () T

I{ () T (статус: Посетитель), 11 декабря 2009, 21:57 [#30]:

2 егор
просветите меня, где вы увидели оффтоп?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Егор

Егор (статус: 10-ый класс), 11 декабря 2009, 22:14 [#31]:

Цитата (I{ () T):

господа, аховая ситуация!!! help!!!!!!!!! помогите решить задачу пожалуйста!

где задача?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
I{ () T

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

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

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

I{ () T (статус: Посетитель), 12 декабря 2009, 16:55 [#38]:

окай=)
а мысль с вот этим
maxSum3:=maxSum2;
maxFam3:=maxFam2;
maxSum2:=maxSum1;
maxFam2:=maxFam1;
maxSum1:=b;
maxFam1:=fam;
плохая? мне кажется и код короче и ОЗУ прога меньше займет? с помощью метода который предложили сначала тоже хотел так сделать. вопрос: если в задаче приводится ограничение, что есть порог на озу используемое, например 16 мб. то как узнать перешел порог иль нет?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Егор

Егор (статус: 10-ый класс), 12 декабря 2009, 21:00 [#39]:

I{ () T:
у меня в коде ошибка :)
не надо его использовать :)
завтра напишу новый код :)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 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] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 апреля 2026, 01:07
Выполнено за 0.04 сек.