Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача на работу с текстовым файлом

Автор: Доцент 15.01.2008 21:12

Добрый день. Очень прошу помочь с такой задачей: "Составить программу решения задачи. Каждый из 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.

И сам текстовый файл...


Прикрепленные файлы
Прикрепленный файл  Sports.txt ( 470 байт ) Кол-во скачиваний: 286

Автор: feniks25 15.01.2008 22:14

Ну а в чём проблема?
Подсчитать количество появления каждой фамилии в файле,
Если опрашиваемый должен назвать пять разных фамилий то во первых не пускать дальше, пока не будет введена хоть одна буква и проверять вводил ли он такую фамилию.

Автор: Доцент 15.01.2008 22:47

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

Автор: feniks25 15.01.2008 23:47

pascal?-год не залазил. Попробую.

Автор: feniks25 16.01.2008 1:10

Вроде работает.
(без динамических массивов и автозавершения пальци как деревянные 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.





Автор: Доцент 16.01.2008 6:26

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

Автор: feniks25 16.01.2008 13:23

Цитата(Доцент @ 16.01.2008 1:26) *

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


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

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

Автор: Доцент 16.01.2008 20:37

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

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

Автор: feniks25 16.01.2008 21:59

Ну тогда так.
А условие отчёта сам правь.


Прикрепленные файлы
Прикрепленный файл  ZHURI.PAS ( 1.65 килобайт ) Кол-во скачиваний: 258

Автор: Доцент 16.01.2008 22:12

Спасибо огромное!!! good.gif 4.gif

Напиши пожалуйста, если не сложно, что означают эти переменные и операции в проге:
im, count, ima, sta, z, break

Автор: Yevgeny 17.01.2008 3: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

Автор: feniks25 17.01.2008 3:37

Цитата(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

Автор: Доцент 18.01.2008 20:22

Решил я остановиться на такой проге. Только препод сказал чтобы я добавил ситуацию выбора количества жюри и чтобы при двух победителях, выдавались фамилии обоих, а не одного как сейчас. Добавьте пожалуйста кто-нибудь это. Зараннее спасибо.

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 18.01.2008 20:30

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

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

Автор: Доцент 18.01.2008 20:42

Цитата(Michael_Rybak @ 18.01.2008 16:30) *

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

Сравни текст проги что я выложил, и что мне написали...

Автор: Доцент 18.01.2008 21:08

Я и сам делаю что могу...

Автор: Michael_Rybak 18.01.2008 21:30

Цитата
Я и сам делаю что могу...


Откуда мне об этом знать? Ты пишешь - "добавили новое задание, сделайте кто нибудь пожалуйста". И ничего не пишешь по поводу того, что сделал на этот счет сам, и что не получается.

Автор: Доцент 18.01.2008 21:33

ну мне не задание добавили. Просто сказали что я это пропустил. Я сижу и не знаю откуда начинать ввод количества жюри. Ставлю перед циклом, не считает, ставлю после, повторяется. В цикле я так понял надо на количество жюри(я сделал 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.


Автор: Доцент 19.01.2008 2:30

Не получается. Поможет кто-нибудь?

Автор: Michael_Rybak 19.01.2008 3:01

В конце вместо вывода maxfam сделай еще один цикл, и выводи каждого, у кого голосов ровно max.

Автор: Доцент 19.01.2008 15:14

Ну а вывод как будет выглядеть?... blink.gif

Автор: Michael_Rybak 19.01.2008 16:40

Напиши типа такого:

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

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

То есть сначала (как ты и делаешь) считаешь max (только уже не запоминаешь maxfam, т.к. оно тебе не понадобится), потом выводишь такое сообщение, а потом еще одним циклом выводишь тех, у кого .count = max

Автор: feniks25 19.01.2008 19:42

Цитата(Доцент @ 16.01.2008 15:37) *

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

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

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

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

Автор: Michael_Rybak 19.01.2008 20:10

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


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

Автор: feniks25 19.01.2008 20:52

Цитата(Michael_Rybak @ 19.01.2008 15:10) *

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


Не у него, в той проге, что я ему последней выкладывал (#9)

Автор: Michael_Rybak 19.01.2008 21:19

Хм, Доцент, оказывается в проге, которую давал feniks25, уже сделано то, о чем ты спрашиваешь. Выводятся все победители.

Автор: Доцент 19.01.2008 21:58

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

Автор: feniks25 19.01.2008 22:19

Цитата(Доцент @ 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;



Есть непонятные строчки?
Как именно надо использовать файл?

Автор: Доцент 19.01.2008 22:31

Текстовый файл для того чтобы просто брать из него фамилии..
Спасибо!!!