Подскажите кто-нибудь: Как найти в файле слова, в в которых нечетное число гласных и чётное число согласных букв?
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;
beginfor i:=1to lengh(x) dobeginif x[i] in glas then inc(gl);
if x[i] in soglasn then inc(sn);
end;
Yes:=(odd(gl) andnot(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%.
Ну допустим Текст:
Я помню чудное мгновенье: Передо мной явилась ты, Как мимолетное виденье, Как гений чистой красоты.
где Check(S) это процедура которая находит слова в строке.
procedure ChecK(S:string);
var P:String; r:byte;
beginwhile S<>0nildobegin
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)
Вот именно потому, что это подпрограмма. Место, где расположена переменная - стек, который никем не чистится. Что было на том месте перед стартом подпрограммы, то значение и будет начальным для переменной. В общем, мусор.
А глобальные переменные - это сегмент данных программы, который принудительно обнуляется. Поэтому возьми себе за правило: всегда инициализировать переменную. Неважно, где она описана, локально или глобально. Сегодня у тебя переменная глобальная, завтра ты оформил этот кусок кода как подпрограмму и на ровном месте получил глюки. Это кому надо? А если все инициализировалось принудительно - то никаких проблем не будет, будет продолжать инициализироваться уже в подпрограмме и результаты будут ожидаемыми, такими же, как и раньше.
Спасибо за совет.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.