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

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

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

Автор: BiZON 5.06.2011 23:11

Подскажите кто-нибудь: Как найти в файле слова, в в которых нечетное число гласных и чётное число согласных букв?

Автор: DarkWishmaster 6.06.2011 1:07

Цитата(BiZON @ 5.06.2011 19:11) *

Подскажите кто-нибудь: Как найти в файле слова, в в которых нечетное число гласных и чётное число согласных букв?

Укажи полажуйста как расположены слова в файле, чем разделены и.т
Вот например:
file TXT:
Forum
Pascal
net.ru
тут всё просто, читаем слово из файла, проверяем если подходит то выводим, нет - не выводим.
а если:
file TXT:
Forum Pascal net.ru
то тут уже надо читать всю строку, потом разбить на слова и проверять каждое слова.
Проверка осуществляется функцией:

function Yes(x:string):boolean;
var i:byte; gl,sn:byte;
begin
for i:=1 to lengh(x) do begin
if x[i] in glas then inc(gl);
if x[i] in soglasn then inc(sn);
end;
Yes:=(odd(gl) and not(odd(sn)));
end;


Где glas=['A','a','o' и.т ] множество гласных, а soglasn множество согласных.

Автор: BiZON 6.06.2011 1:27

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

Автор: DarkWishmaster 6.06.2011 1:51

Цитата(BiZON @ 5.06.2011 21:27) *

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

В турбо паскале нету русских (или у кого-то есть, у мя точно нету =) ). Free Pascal отоброжает русские, это 100%.

Ну допустим Текст:

Я помню чудное мгновенье:
Передо мной явилась ты,
Как мимолетное виденье,
Как гений чистой красоты.

читаем из файла:

assign(F, 'C:\Mgnovenie.TXT');
reset(F);
while not eof(F) do begin
readln(F, S);
Check(S);
end;
clsoe(F);


где Check(S) это процедура которая находит слова в строке.

procedure ChecK(S:string);
var P:String; r:byte;
begin
while S<>0 nil do begin
r:=pos(' ' , s);
//находим ближайший пробел ( это в случае что нормальной писатель и ставит только один пробел для разделения слов)
P:=copy(S, 1, r); //берем слово
delete(S, 1, r);
if Yes(P) then writeln(P); //если подходит то выводим)
end;
end;



P.S
может я что напутал, так как паскаля с собой нету ) и сразу на форум написал.

Автор: BiZON 6.06.2011 2:03

спасибо большое, сейчас попробую

Автор: IUnknown 6.06.2011 2:37

DarkWishmaster, вводишь человека в заблуждение. Я про функцию Yes. Подумай, что она вернет, если гласных будет четное количество, а согласных - нечетное? (кстати, результаты работы твоей функции могут быть вообще непредсказуемыми. Подумай, почему. Есть 2 причины...)

Автор: DarkWishmaster 6.06.2011 3:13

Цитата(IUnknown @ 5.06.2011 22:37) *

DarkWishmaster, вводишь человека в заблуждение. Я про функцию Yes. Подумай, что она вернет, если гласных будет четное количество, а согласных - нечетное? (кстати, результаты работы твоей функции могут быть вообще непредсказуемыми. Подумай, почему. Есть 2 причины...)


if x[i] in glas then inc(val);
if x[i] in soglasn then dec(val);
Аа извини, ошибься. Просто пробовал если делить нечетное на четное то результат будет нечетным, не учел то что если делить нечетное на четное то результат будет тоже нечетном так что ты прав, спасибо. Отредактировал.

Автор: IUnknown 6.06.2011 4:07

Это не все. Про один из тех 2 моментов, о которых я написал выше, ты не додумал...

Автор: DarkWishmaster 6.06.2011 17:56

Цитата(IUnknown @ 6.06.2011 0:07) *

Это не все. Про один из тех 2 моментов, о которых я написал выше, ты не додумал...

не обнулил gl и sn перед тем как считать? И вообще, почему в подпрограмы они понимают совершено разное значения а не как в главной програме где по умолчанью 0?

Автор: IUnknown 6.06.2011 18:16

Цитата
И вообще, почему в подпрограмы они понимают совершено разное значения а не как в главной програме где по умолчанью 0?
Вот именно потому, что это подпрограмма. Место, где расположена переменная - стек, который никем не чистится. Что было на том месте перед стартом подпрограммы, то значение и будет начальным для переменной. В общем, мусор.

А глобальные переменные - это сегмент данных программы, который принудительно обнуляется. Поэтому возьми себе за правило: всегда инициализировать переменную. Неважно, где она описана, локально или глобально. Сегодня у тебя переменная глобальная, завтра ты оформил этот кусок кода как подпрограмму и на ровном месте получил глюки. Это кому надо? А если все инициализировалось принудительно - то никаких проблем не будет, будет продолжать инициализироваться уже в подпрограмме и результаты будут ожидаемыми, такими же, как и раньше.

Автор: DarkWishmaster 6.06.2011 19:13

Цитата(IUnknown @ 6.06.2011 14:16) *

Вот именно потому, что это подпрограмма. Место, где расположена переменная - стек, который никем не чистится. Что было на том месте перед стартом подпрограммы, то значение и будет начальным для переменной. В общем, мусор.

А глобальные переменные - это сегмент данных программы, который принудительно обнуляется. Поэтому возьми себе за правило: всегда инициализировать переменную. Неважно, где она описана, локально или глобально. Сегодня у тебя переменная глобальная, завтра ты оформил этот кусок кода как подпрограмму и на ровном месте получил глюки. Это кому надо? А если все инициализировалось принудительно - то никаких проблем не будет, будет продолжать инициализироваться уже в подпрограмме и результаты будут ожидаемыми, такими же, как и раньше.

Спасибо за совет.