|
Вопрос # 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]
|
Егор (статус: 10-ый класс), 13 декабря 2009, 13:04 [#41]:
думаю, тут лучше всего использовать массив из трёх максимумов и при поступлении очередного числа смотреть - оно больше какого-либо из массива? если больше, то меньшее из массива удаляем, а вместо него записываем новый максимум. в конце массив сортируем.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
I{ () T (статус: Посетитель), 13 декабря 2009, 13:42 [#42]:
массивы...работоспособность программы уменьшается
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Егор (статус: 10-ый класс), 13 декабря 2009, 14:29 [#43]:
ты это с чего вдруг взял?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
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 (статус: Посетитель), 13 декабря 2009, 17:32 [#49]:
с массивами НАМНОГО легче работать, не спорю.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
Страницы: [« Предыдущая] [1] [2] [3]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|