Экспертная система 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]

Егор

Егор (статус: 10-ый класс), 13 декабря 2009, 13:04 [#41]:

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

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

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

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

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

I{ () T (статус: Посетитель), 13 декабря 2009, 14:53 [#44]:

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

Егор (статус: 10-ый класс), 13 декабря 2009, 15:03 [#45]:

училка гонит - фигню говорит
какая разница - три переменных maxSum3, maxSum2 и maxSum1 или один массив из 3-х элементов? памяти займут одинаково - под три элемента. но к элементу массива можно обращаться по индексу - а это очень удобно. Меняем в одном месте размерность массива и можем выдавать не три, а десять максимумов
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 13 декабря 2009, 15:04 [#46]:

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

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

примерно вот так:
      b:=mark1+mark3+mark2;
      if b>maxSum1 then
        begin
          maxSum3:=maxSum2;
          maxFam3:=maxFam2;
          maxSum2:=maxSum1;
          maxFam2:=maxFam1;
          maxSum1:=b;
          maxFam1:=fam;
        end
      else
        if b>maxSum2 then
          begin
            maxSum3:=maxSum2;
            maxFam3:=maxFam2;
            maxSum2:=b;
            maxFam2:=fam;
          end
        else
          if b>maxSum3 then
            begin
              maxSum3:=b;
              maxFam3:=fam;
            end;
    end;
а с массивами было бы короче, особенно, если бы надо было найти большее число максимумов
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 13 декабря 2009, 16:59 [#48]:

вот так с массивами:

procedure TForm1.Button2Click(Sender: TObject);
const
  MaxCount = 3;
var
  k, k1, b, i, j : integer;
  maxSum : array [1..MaxCount] of integer;
  mark1, mark2, mark3 : integer;
  f1,f2 : TextFile;
  fam, Str : string;
  maxFam : array [1..MaxCount] of string;
begin
  for i:=1 to MaxCount do maxSum[i]:=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;
 
      // начнём поиск максимумов
      for i:=1 to MaxCount do
      begin
        if b>maxSum[i] then
        begin
          for j:=MaxCount downto i+1 do
          begin
            maxSum[j]:=maxSum[j-1];
            maxFam[j]:=maxFam[j-1];
          end;
          maxSum[i]:=b;
          maxFam[i]:=fam;
          break;
        end;
      end;
      // конец поиска максимумов
 
    end;
  for i:=1 to MaxCount do
    writeln(f2,maxFam[i],' ', maxSum[i] div 3);
  closeFile(f1);closeFile(f2);
end;

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

I{ () T (статус: Посетитель), 13 декабря 2009, 17:32 [#49]:

с массивами НАМНОГО легче работать, не спорю.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......

Страницы: [« Предыдущая] [1] [2] [3]

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

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