Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на работу с текстовым файлом
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Доцент
Добрый день. Очень прошу помочь с такой задачей: "Составить программу решения задачи. Каждый из N (N задано) опрошенных членов жюри спортивного состязания назвал 5 фамилий возможных претендентов на первое место. Определить фамилию спортсмена, который является, по мнению жюри, наиболее вероятным победителем. Получить список фамилий, если несколько спортсменов получат равное количество голосов. Предусмотреть, что опрашиваемый должен назвать 5 разных фамилий."
Сдать должен работу 17-го января.
Вот то, что есть на сегодняшний день:
program laba;
uses crt;
var
ftxt:text;
i,j,cod:integer;
st:string;
st1,st2,st3,st4,st5,st6:string;
n:integer;
found:boolean;

begin
clrscr;
assign(ftxt,'Sports.txt');
{SI-} reset(ftxt); {SI+}
if IOResult<>0 then
begin
writeln('­Ґв д ©« ');
halt
end;

close(ftxt);
reset(ftxt);

while not eof(ftxt) do
begin
readln(ftxt,st);
st1:=copy(st,1,2); {номер жюри}
st2:=copy(st,4,8);
st3:=copy(st,13,8);
st4:=copy(st,22,8);
st5:=copy(st,31,8);
st6:=copy(st,40,8);
writeln(st1,' ',st2,' ',st3,' ',st4,' ',st5,' ',st6);
end;
close(ftxt);
end.

И сам текстовый файл...
Rian
Ну а в чём проблема?
Подсчитать количество появления каждой фамилии в файле,
Если опрашиваемый должен назвать пять разных фамилий то во первых не пускать дальше, пока не будет введена хоть одна буква и проверять вводил ли он такую фамилию.
Доцент
В том и дело что я не знаю как это реализовать. Программу, что я выложил выше, писал не я. Помоги пожалуйста.
Rian
pascal?-год не залазил. Попробую.
Rian
Вроде работает.
(без динамических массивов и автозавершения пальци как деревянные wacko.gif )

program zhuri;
uses crt;
const im=10;

type trec=record count:byte;ima:string[9]end;
var
ftxt:text;
mas:array[0..im]of trec;
sta:array[1..6]of string[9];

i,z,max:integer;
st:string;

begin
clrscr;
assign(ftxt,'c:\code-pas\Sports.txt');
reset(ftxt);
while not eof(ftxt) do
begin
readln(ftxt,st);
sta[1]:=copy(st,1,2);
sta[2]:=copy(st,4,8);
sta[3]:=copy(st,13,8);
sta[4]:=copy(st,22,8);
sta[5]:=copy(st,31,8);
sta[6]:=copy(st,40,8);
writeln(sta[1],' ',sta[2],' ',sta[3],' ',sta[4],' ',sta[5],' ',sta[6]);

for i:=2 to 6 do
for z:=0 to im do
if mas[z].ima<>'' then
begin
if mas[z].ima=sta[i] then
begin
mas[z].count:=mas[z].count+1;
break;
end;
end
else
begin
mas[z].ima:=sta[i];
mas[z].count:=mas[z].count+1;
break;
end;
end;
close(ftxt);
writeln;
{--------------------------------}
max:=mas[0].count;
for z:=0 to im do
if mas[z].count>max then max:=mas[z].count;
{--------------------------------}
for z:=0 to im do
begin
if mas[z].count=max then textcolor(12)
else textcolor(7);
write(z:2);write(' ');
write(mas[z].ima);
writeln(mas[z].count:2);

end;
readln;
end.




Доцент
Спасибо огромное. Вроде работает. Только не понятно, а как сделать тест, чтобы было два или три победителя...хорошо бы чтобы программа спрашивала сколько человек в жюри.
Но всеравно спасибо!!! good.gif
Rian
Цитата(Доцент @ 16.01.2008 1:26) *

Только не понятно, а как сделать тест, чтобы было два или три победителя...хорошо бы чтобы программа спрашивала сколько человек в жюри.


Два или три победителя? если в смысле того, что победители получат равное кол-во голосов, то оно уже работает, а если 1,2,3 места, то нужно находить не только максимальное кол-во, но и пред максимальное.

Для того что-бы прога спрашивала сколько человек в жури нужны были динамические массивы. можно...
Подожди, так она и спрашивает. Если в файле будет две строки, значит и жури два, если 15 то...
только количество имён не должно быть больше, чем задумано в программе.
Доцент
Ты не правильно меня понял. Я имел в виду чтобы сама прога спрашивала сколько жюри брать. Текстовый файл желательно больше не трогать. smile.gif

Еще хорошо бы сделать, чтобы ответ был не подсвечен красным цветом, а просто только имя победителя выдавалось.
Rian
Ну тогда так.
А условие отчёта сам правь.
Доцент
Спасибо огромное!!! good.gif 4.gif

Напиши пожалуйста, если не сложно, что означают эти переменные и операции в проге:
im, count, ima, sta, z, break
Yevgeny
trec=record count:byte;ima:string[9]end;
count и ima - поля данных записи Trec,
break означает - выход из цикла!!! Дальше не смотрел!
А вообще тебе не помешало бы хоть что-нить по паскалю почитать,
хотя бы про записи (типы данных) и основные операторы, а то завалиться можешь...


Добавлено через 3 мин.
sta:array[1..6]of string[9]; - вот тебе, что такое sta
im - константа, заданы в разделе констант, а z - обычный счётчик для фора!!! smile.gif
Rian
Цитата(Yevgeny @ 16.01.2008 22:13) *

trec=record count:byte;ima:string[9]end;
count и ima - поля данных записи Trec,
break означает - выход из цикла!!! Дальше не смотрел!
А вообще тебе не помешало бы хоть что-нить по паскалю почитать,
хотя бы про записи (типы данных) и основные операторы, а то завалиться можешь...
Добавлено через 3 мин.
sta:array[1..6]of string[9]; - вот тебе, что такое sta
im - константа, заданы в разделе констант, а z - обычный счётчик для фора!!! smile.gif


А тут тебе что не нравится? сдесь все работает и вполне нормально.
тут break при месте и выводит из внутреннего цикла, КУДА ТЫ СМОТРЕЛ
Для одарённых sta это массив строк.
а чего придираться к z
Доцент
Решил я остановиться на такой проге. Только препод сказал чтобы я добавил ситуацию выбора количества жюри и чтобы при двух победителях, выдавались фамилии обоих, а не одного как сейчас. Добавьте пожалуйста кто-нибудь это. Зараннее спасибо.
program zhuri;
{Раков А. В. 5ВТИ-042}
uses crt;
const m=10;
type
sport=record count:byte;
ma:string[9]
end;
var
f:text;
mas:array[0..m]of sport;
sta:array[1..6]of string[9];
i,k,max:integer;
st:string;
maxfam:string;
begin
clrscr;
writeln(‘Программа для нахождения фамилии победителя спортивного соревнования’);
assign(f,'Sports.txt');
reset(f);
while not eof(f) do
begin
readln(f,st);
sta[1]:=copy(st,1,2);
sta[2]:=copy(st,4,8);
sta[3]:=copy(st,13,8);
sta[4]:=copy(st,22,8);
sta[5]:=copy(st,31,8);
sta[6]:=copy(st,40,8);
writeln(sta[1],' ',sta[2],' ',sta[3],' ',sta[4],' ',sta[5],' ',sta[6]);
for i:=2 to 6 do
for k:=0 to m do
if mas[k].ma<>'' then
begin
if mas[k].ma=sta[i] then
begin
mas[k].count:=mas[k].count+1;
break;
end;
end
else
begin
mas[k].ma:=sta[i];
mas[k].count:=mas[k].count+1;
break;
end;
end;
close(f);
writeln;
max:=mas[0].count;
for k:=0 to m do
if mas[k].count>max then
begin
max:=mas[k].count;
maxfam:=mas[k].ma;
end;
write(maxfam);
readln;
end.

Michael_Rybak
Цитата
Добавьте пожалуйста кто-нибудь это.

А сам что-нибудь делать собираешься?
Доцент
Цитата(Michael_Rybak @ 18.01.2008 16:30) *

А сам что-нибудь делать собираешься?

Сравни текст проги что я выложил, и что мне написали...
Доцент
Я и сам делаю что могу...
Michael_Rybak
Цитата
Я и сам делаю что могу...


Откуда мне об этом знать? Ты пишешь - "добавили новое задание, сделайте кто нибудь пожалуйста". И ничего не пишешь по поводу того, что сделал на этот счет сам, и что не получается.
Доцент
ну мне не задание добавили. Просто сказали что я это пропустил. Я сижу и не знаю откуда начинать ввод количества жюри. Ставлю перед циклом, не считает, ставлю после, повторяется. В цикле я так понял надо на количество жюри(я сделал n) менять m. Так? Я просто пока тяжело понимаю эту тему с внешними файлами.


Так, ввод количества жюри я сделал smile.gif я в шоке))) Но вот чтобы ответ выдавал множественный (если два победителя то две фамилии) врядли сделаю. но попытаюсь smile.gif))

Добавлено через 5 мин.
Вот что теперь на данный момент у меня
program zhuri;
{Раков А. В. 5ВТИ-042}
uses crt;
const m=10;
type
sport=record count:byte;
ma:string[9]
end;
var
f:text;
mas:array[0..m]of sport;
sta:array[1..6]of string[9];
i,k,max,n:integer;
st:string;
maxfam:string;
begin
clrscr;
writeln('Программа для поиска победителя спортивного соревнования ');
writeln('Введите количество жюри');
readln(n);
assign(f,'Sports.txt');
reset(f);
while not eof(f) do
begin
readln(f,st);
sta[1]:=copy(st,1,2);
sta[2]:=copy(st,4,8);
sta[3]:=copy(st,13,8);
sta[4]:=copy(st,22,8);
sta[5]:=copy(st,31,8);
sta[6]:=copy(st,40,8);
writeln(sta[1],' ',sta[2],' ',sta[3],' ',sta[4],' ',sta[5],' ',sta[6]);
for i:=2 to 6 do
for k:=0 to n do
if mas[k].ma<>'' then
begin
if mas[k].ma=sta[i] then
begin
mas[k].count:=mas[k].count+1;
break;
end;
end
else
begin
mas[k].ma:=sta[i];
mas[k].count:=mas[k].count+1;
break;
end;
end;
close(f);
writeln;
max:=mas[0].count;
for k:=0 to m do
if mas[k].count>max then
begin
max:=mas[k].count;
maxfam:=mas[k].ma;
end;
write(maxfam);
readln;
end.

Доцент
Не получается. Поможет кто-нибудь?
Michael_Rybak
В конце вместо вывода maxfam сделай еще один цикл, и выводи каждого, у кого голосов ровно max.
Доцент
Ну а вывод как будет выглядеть?... blink.gif
Michael_Rybak
Напиши типа такого:

Цитата
Максимальное количество голосов, набранное кем-либо - 8. Это количество голосов получили следующие участники:

И дальше список, по одному в строке.

То есть сначала (как ты и делаешь) считаешь max (только уже не запоминаешь maxfam, т.к. оно тебе не понадобится), потом выводишь такое сообщение, а потом еще одним циклом выводишь тех, у кого .count = max
Rian
Цитата(Доцент @ 16.01.2008 15:37) *

Я имел в виду чтобы сама прога спрашивала сколько жюри брать. Текстовый файл желательно больше не трогать. smile.gif

Еще хорошо бы сделать, чтобы ответ был не подсвечен красным цветом, а просто только имя победителя выдавалось.

Брр. Теперь точно не понял. Ты же сказал, что файл больше не трогать?

Чтобы отчёт выводился, как тебе надо, нужно условие (if mas[z].count=max then)
в последнем блоке {------} вынести перед (begin end) и всё.
Michael_Rybak
Цитата
нужно условие (if mas[z].count=max then)
в последнем блоке {------} вынести перед (begin end) и всё.


Где ты видишь у него условие "(if mas[z].count=max then)"?
Rian
Цитата(Michael_Rybak @ 19.01.2008 15:10) *

Где ты видишь у него условие "(if mas[z].count=max then)"?


Не у него, в той проге, что я ему последней выкладывал (#9)
Michael_Rybak
Хм, Доцент, оказывается в проге, которую давал feniks25, уже сделано то, о чем ты спрашиваешь. Выводятся все победители.
Доцент
Да, только совместить у меня не получается. Как добавлю это условие, прога неадекватно работает.
Феник, на счет файла: он все таки нужен.
Rian
Цитата(Доцент @ 19.01.2008 16:58) *

Да, только совместить у меня не получается. Как добавлю это условие, прога неадекватно работает.
Феник, на счет файла: он все таки нужен.



{Поиск наибольшего количества фамилий в списке}
max:=mas[0].count;{берём для сравнения первый элемент}
for z:=0 to im do{цикл по всему списку отчёта}
if mas[z].count>max then max:=mas[z].count;{если текущий элемент больше то это максимальный}

{сам отчёт}
for z:=0 to im do
if mas[z].count=max then {если количество фамилий равно максимуму, то выводим надпись}
begin
write(z:2);write(' ');{порядковый номер фамилии в списке}
write(mas[z].ima);{сама фамилия}
writeln(mas[z].count:2);{количество этой фамилиии}
end;



Есть непонятные строчки?
Как именно надо использовать файл?
Доцент
Текстовый файл для того чтобы просто брать из него фамилии..
Спасибо!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.