Помощь - Поиск - Пользователи - Календарь
Полная версия: Типизированный файл
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
-Анюта-
Люди, пожалуйста, помогите решить задачу! Угроза недопуска к экзаменам sad.gif


Организовать типизированный файл, в котором находятся данные об участниках соревнований по многоборью: фамилия, имя, страна, массив результатов. Найти победителя – участника, набравшего наибольшее количество баллов. Напишите встроенную подпрограмму-процедуру для организации безопасного ввода фамилии и имени участника, а также страны.
volvo
Поиск по ключевому слову "типизированный"...
Гость
Спасибо, только вот не могу понять как написать встроенную подпрограмму-процедуру для организации безопасного ввода фамилии и имени участника, а также страны.
Гость
Попыталась решить - вот что получилось:
Код
type
base=record
fam, name, strana:string;
rez:real;
end;
var
igrok:array[1..10] of base;
i,p:integer;
begin
writeln('‚ўҐ¤ЁвҐ ¤ ­­лҐ ®Ў гз бв­ЁЄ е б®аҐў­®ў ­Ё©');
for i:=1 to 10 do
with igrok[i] do begin
writeln ('‚ўҐ¤ЁвҐ д ¬Ё«Ёо гз бв­ЁЄ ');
readln(fam);
Writeln ('‚ўҐ¤ЁвҐ Ё¬п гз бв­ЁЄ ');
readln(name);
Writeln('‚ўҐ¤ЁвҐ бва ­г. Є®в®аго ЇаҐ¤бв ў«пҐв гз бв­ЁЄ');
readln (strana);
writeln('‚ўҐ¤ЁвҐ Є®«ЁзҐбвў® Ў ««®ў, ­ Ўа ­­ле гз бв­ЁЄ®¬');
readln(rez);
end;
writeln('€Ја®Є. ­ Ўа ўиЁ© ­ ЁЎ®«м襥 Є®«ЁзҐбвў® Ў ««®ў:');
for i:=1 to 10 do
with igrok[i] do begin
rez:=p;
for i:=1 to 10 do
with igrok[i] do begin
if rez>p then
rez:=p;
end;
writeln (fam,' ',name, ' -  ',strana);
end;
readln
end.


Но что-то в концовке не получается, плюс несмогла придумать подпрограмму-процедуру. Если кому нетрудно - пожалуйста, помогите.
Заранее благодарна.
Анюта.
Анютка
Ребят, ну помогите мне, пожалуйста...
Завтра сдавать уже sad.gif
volvo
Цитата
для организации безопасного ввода
Вот это можно пояснить? Что значит "безопасного"? Какие опасности могут тебя подстерегать при вводе строки? Понятно, что при вводе чисел подводных камней может быть много... Но строка ?
Анютка
я узнала: нужно написать такую подпрограмму-процедуру, которая бы проверяла написаны ли фамилия, имя и страна русскими буквами. Если присутствуют какие-либо символы и не русские буквы, то выводить ошибку.
И еще я не разобралась: как найти участника, набравшего максимальное количество баллов?
volvo
Procedure GetInput(Var s: string);
Var i: Integer;
Begin
Repeat
Write('s = '); ReadLn(s);
i := 1;
While
(i <= Length(s)) and
(s[i] in ['а'..'п', 'р'..'я', 'А'..'П', 'Р'..'Я']) Do Inc(i);
If i <= Length(s) Then WriteLn('Error...');
Until i > Length(s);
End;

Эта процедура будет запрашивать ввод строки заново до тех пор, пока в строке не введены ТОЛЬКО русские символы.
Анютка
Большое спасибо! А как найти участика, набравшего больше всех баллов?
Анютка
Блин! Я соовсем запуталась! Ничего не получаетсяsad.gif
Volvo, пожалуйста, скинь мне решение этой задачи целиком... Очень тебя прошу... В четверг сдавать (крайний срок)...
Romtek
Точно также, как ищут максимальное число в обычном массиве, сравнивается конкретное поле rez.
Анютка
Я знаю, что точно так же, но ничего не получается sad.gif Я пол дня пыталась написать эту программу...
Lapp
Заводишь real переменную, скажем MaxRez.
Кладешь туда 0 (ноль)
Читаешь файл, проходишься по всем записям, читаешь число rez.
Сравниваешь его с MaxRez.
Если оно меньше, чем MaxRez - ничего не делаешь, переходишь к следующей записи
Если оно больше либо равно MaxRez - присваиваешь его значения переменной MaxRez
В конце цикла максимальный результат лежит в MaxRec
volvo
lapp, ну и что это тебе даст? Задание в чем заключается, ты внимательно прочел? Перечитай:
Цитата
А как найти участика, набравшего больше всех баллов?
Понимаешь, НЕ число баллов, а участника... Так что кроме maxRez надо еще и Record сохранять...
Lapp
Извини, спутал.
Интересно, что ведь сначала написал все, чтоб искать именно участника (в качестве доказательства - наличие слов "либо равно"), а потом вдруг решил, что это не надо (стукнуло в голову!) и убрал лишние строки.. sad.gif
Вот исправленный вариант.

Заводишь переменную типа base, скажем Winner
Заводишь real переменную, скажем MaxRez.
Кладешь туда 0 (ноль)
Читаешь файл, проходишься по всем записям, читаешь число rez.
Сравниваешь его с MaxRez.
Если оно меньше, чем MaxRez - ничего не делаешь, переходишь к следующей записи
Если оно больше либо равно MaxRez - присваиваешь его значения переменной MaxRez, а значение всего рекорда присваиваешь переменной Winner.
В конце цикла максимальный результат лежит в MaxRec, а победитель - в Winner.

Но тут есть одно но: результаты нескольких участников могут быть равны, тогда победитель не один (именно поэтому я проверяю равенство с большестью, а не с меньшестью, что было бы рациональнее, если ищется только максимальный результат). Выход отсюда не совсем тривиален. Нужно либо завести еще один массив типа base, но непонятки возникают с его размерностью. Можно положить ее такой же, как у исходного массива, но если волнует проблема минимизации памяти, то лучше сделать список.
Правда, в задании не сказано, что делать с найденными победителями. Если просто печатать их данные, то можно избежать многих проблем smile.gif.

И еще раз извиняюсь за отъезд крыши в неподходящий момент..
Анютка
Задачу сегодня не сдала sad.gif Объявили строгий выговор и дали время до вторника...
Ребят, может поможете бедной девушке сдать, наконец, эту задачу? Нужен полный текст программы. Ну пожалуйста-а-а....


ПС: После того, как будет найден участник с максимальным количеством баллов, нужно вывести на экран всю информацию о нём.
Lapp
Ок, Анютка сделаем. Сейчас настучу че-нть.
Только скажи- что у тебя за кодировка такая была? Я пробовал подобрать, но максимум, чего добился - это по нескольку русских букв от каждого слова.. Это что, украинский или еще что-то? Я все это заменю на нормальную виндусовую кодировку, если нужно другую - сама меняй. Ок?
Lapp
Ну вот, кажется готово..
Я попытался максимально сохранить твою прогу, но кое-что все же пришлось изменить.
Например, вместо фиксированной размерности 10 я ввел константу M, в файле она равна 10. Просто в отладке вводить все десять записей было в лом..
Далее, твое поле name я заменил на поле imq (имя).
Но главное - рекордсменов (т.е. тех, кто набрал максимальный балл) может быть несколько. Поэтому программа усложнилась. Я снабдил ее подробными коментариями, так что думаю, ты разберешься.
Если есть вопросы - задавай.

uses CRT;
const
M=10;
type
base=record
fam, imq, strana:string;
rez:real;
end;
var
igrok:array[1..M] of base;
i,p:integer;
MaxRez:real;
w:array[1..M] of integer;

begin
writeln('ввдите данные об участниках соревнований');
for i:=1 to M do with igrok[i] do begin
writeln ('введите фамилию участника:');
readln(fam);
Writeln ('введите имя участника:');
readln(imq);
Writeln('введите страну. которую представляет участник:');
readln (strana);
writeln('введите количество баллов, набранных участником:');
readln(rez);
WriteLn('-----------------------');
end;
MaxRez:=0; {Подготавливаем переменную для максимального результата}
{Поиск максимального результата}
for i:=1 to M do with igrok[i] do if rez>MaxRez then begin {Найден новый рекорд}
p:=1; {Рекорд пока один}
w[1]:=i; {Запоминаем номер рекордсмена}
MaxRez:=rez; {Запоминаем рекорд}
end
else if rez=MaxRez then begin {Найден результат, равный рекорду}
Inc(p); {Увеличиваем количество рекордсменов}
w[p]:=i; {Запоминаем номер нового рекордсмена}
end;
{Вывод окончательных данных}
WriteLn('Максимальный результат: ',MaxRez);
WriteLn('Всего игроков набрало максимальный результат: ',p);
for i:=1 to p do with igrok[w[i]] do writeln (fam,' ',imq, ' - ',strana); {Цикл по номерам рекордсменов}
readln
end.
Анютка
Огромное тебе спасибо!!! smile.gif
Встроенную подпрограмму-процедуру попробую написать сама.
volvo
lapp, а ты в курсе, что вот эту конструкцию:
  else if rez=MaxRez then begin
...
end;

любой здравомыслящий преподаватель зарубит на корню? Я, например, такое бы не пропустил... Ну нельзя так сравнивать вещественные числа..

Анютка, так что будь готова к дополнительным вопросам в эту сторону...
Lapp
Хорошо, согласен smile.gif
По-хорошему, надо исправить строчку.
Совсем правильную науку я тут разводить все же не стал бы, что-то вроде такого:
else if 0.0001>Abs(MaxRez-rez) then begin

- думаю, осмысленно.
Анютка, смысл в том, что если с этими числами (результатами) будут производиться какие-то действия (сложения, умножения..), то единица вполне может превратиться в 0.9999999 (количество девяток зависит от точности представления действительных чисел в машине). И хотя по смыслу они равны, строгое сравнение выдаст false.
Анютка
А может вас не затруднит выложить здесь полностью рабочую версию с подпрограммой-процедурой этой программы?
volvo
Аппетит приходит во время еды, правда? Сначала:
Цитата(-Анюта- @ 12.12.2005 18:02)
Люди, пожалуйста, помогите решить задачу!

Ну, а теперь -
Цитата(Анютка @ 15.12.2005 15:46)
А может вас не затруднит выложить здесь полностью рабочую версию с подпрограммой-процедурой этой программы?
dry.gif
И это при всем том, что ты практически ничего не сделала сама (по крайней мере, мы этого не видели)... Это не называется "помочь", это называется "решить ЗА тебя"...
Lapp
Попробуй сама. Не получится - спрашивай снова.
Но - предметно.
Успехов!
Анютка
Задачу доделала сама и сдала на отлично smile.gif
Огромное спасибо lapp(у), за помощь!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.