IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> множества
Sqrin
сообщение 11.05.2005 0:05
Сообщение #1


Гость






Дана последовательность, содержащая от 2 до 50 слов, в каждом из которых от 1 до 8 строчных латинских букв; между соседними словами – запятая или не менее одного пробела, за последним словом - точка.
Напечатать те слова последовательности, которые отличны от последнего слова и
удовлетворяют следующему свойству:
- в слове гласные чередуются с согласными;
Напечатать те слова последовательности, которые отличны от последнего слова,
предварительно преобразовав каждое из них по следующему правилу:
- если слово нечетной длины, то удалить его среднюю букву.


напишите плиз
 К началу страницы 
+ Ответить 
volvo
сообщение 11.05.2005 0:18
Сообщение #2


Гость






Цитата(Sqrin @ 11.05.05 0:05)
напишите плиз

Помочь - пожалуйста, но писАть полностью :no:
Хоть что-нибудь уже начато?

Для начала можно прочитать здесь: FAQ: Множества, чтобы иметь представление о том, с чем придется иметь дело...
 К началу страницы 
+ Ответить 
asCOOLs
сообщение 17.05.2005 0:28
Сообщение #3


Гость






ето понятно ... вот тока определение согласные или не согласные ?
сделать отдельный блок данных с забитыми гласными и проверять? что не соглас то гласные ? или как лучше оформиь?
 К началу страницы 
+ Ответить 
volvo
сообщение 17.05.2005 0:33
Сообщение #4


Гость






const
glas = ['a', 'e', 'i']; { и так далее }
soglas = ['a' .. 'z'] - glas;
 К началу страницы 
+ Ответить 
Sqrin
сообщение 15.06.2005 9:19
Сообщение #5


Гость






как задатьмножество я понимаю
а вот....
Напечатать те слова последовательности, которые отличны от последнего слова и
удовлетворяют следующему свойству:
- в слове гласные чередуются с согласными;
Напечатать те слова последовательности, которые отличны от последнего слова,
предварительно преобразовав каждое из них по следующему правилу:
- если слово нечетной длины, то удалить его среднюю букву
сам алгоритм првореки не могу накатать
 К началу страницы 
+ Ответить 
volvo
сообщение 15.06.2005 9:27
Сообщение #6


Гость






Цитата(Sqrin @ 15.06.05 9:19)
Напечатать те слова последовательности, которые отличны от последнего слова

Ну, для этого допустим надо разбивать строку на слова, это тоже уже было: FAQ: Строки
А потом вот так:
Count := GetWords(s, arr, []);
for i := 1 to pred(Count) do
If (arr[i] <> arr[Count]) and ({ здесь проверяй чередование })
then writeln(arr[i]);


Цитата(Sqrin @ 15.06.05 9:19)
если слово нечетной длины, то удалить его среднюю букву
Элементарно:
If odd(length(s)) then delete(s, succ(length(s) div 2), 1);
 К началу страницы 
+ Ответить 
Sqrin
сообщение 15.06.2005 9:39
Сообщение #7


Гость






о елки .. оболдеть... что то я запутолся...
ксати насчет katrin это девушка из соседнией группы....

Program GlasSogas_lol;
Uses crt;
Const
n = 50;
Sogl : set of char = [,'Ь','Ъ','б','в','г', 'д','ж','з','й','к','л','м','н','п','р','с','т','ф',
'х','ц','ч','ш','щ','ь','ъ'];
Glas : set of char = ['а','е','и','о', 'у','ы','э','ю','я'];
Var
S, S_Glas, S_Sogl : string[n];
I : integer;
Begin
ClrScr;
Write('Введите строку (50 символов): ');

Readln(Stroka);
ето вроде начало... как терь сюда прикрипить
разбиение строки по словам?
 К началу страницы 
+ Ответить 
Archon
сообщение 15.06.2005 14:05
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 618
Пол: Мужской

Репутация: -  24  +


1. не 50 символов в строке, а 50 слов. Поставь просто string.
2. создай wrds : array [1..50] of string[8];
3. загоняй слова в массив. Перебирай все символы(при этом wrds[j]:=wrds[j]+Stroka[i], i - счётчик цикла, j - счётчик слов), если символ не в множестве гласных и не в множестве согласных, значит разделитель(j++ :D ).

добавлено:
Начало должно выглядеть так
Код

Uses crt;
Const
 Glas = ['A','E','I','O','U','Y'];
 Sogl = ['A'..'Z'] - Glas;
Var
 S : string;
 words : array [1..50] of string[8];
 I,j : integer;
 old : char;
Begin
 ClrScr;
 Write('Введите строку : ');
 Readln(S);
 old := ' ';   {Тута пробел}
 j := 1;       {Первое слово}
 For i := 1 to length(S) do  {Сканируем строку}
 Begin
   if UpCase(S[i]) in Sogl + Glas then words[j] := words[j] + S[i]{если буква, добавляем к текущему слову}
   else if UpCase(old) in Sogl + Glas then Inc(j);{Если не буква, а предыдущий символ - буква, увеличиваем номер слова}
   old := S[i];  {Сохраняем символ, на следующем шаге он станет предыдущим}
 End;


Сообщение отредактировано: Archon - 15.06.2005 14:41


--------------------
Close the World...txeN eht nepO
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 16.06.2005 14:03
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Если я все правильно понял, то 50 слов * (8 символов +1 разделитель) = 450 символов максимум. Стрингом никак smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 16.06.2005 14:07
Сообщение #10


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата(Malice @ 16.06.05 14:03)
Если я все правильно понял, то 50 слов * (8 символов +1 разделитель) = 450 символов максимум.  Стрингом никак  smile.gif


что значит ? программа, описаная выше, видишь ? там объявлен массив строк по 8 символов

так что никаких проблем.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 16.06.2005 14:11
Сообщение #11


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(klem4 @ 16.06.05 14:07)
что значит ? программа, описаная выше, видишь ? там объявлен массив строк по 8 символов

так что никаких проблем.


Массив заполняется при вводе ? Нет. Там readln (s).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Archon
сообщение 16.06.2005 14:23
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 618
Пол: Мужской

Репутация: -  24  +


:D :D :D :D :D :D :D
Можно
S : string;
заменить на
S : array [1..450] of char;
только вводить сложнее.

И вообще, нефиг придираться, там ещё написано:
Цитата
между соседними словами – запятая или не менее одного пробела

Если пробелов ставить можно сколько угодно, нам придётся безразмерную строку делать что-ли? <_<


--------------------
Close the World...txeN eht nepO
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 16.06.2005 14:38
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(Archon @ 16.06.05 14:23)
Если пробелов ставить можно сколько угодно, нам придётся безразмерную строку делать что-ли? <_<


Зря ты так. Может в этом и суть smile.gif Описано уж больно все конкретно.
Придется заполнять массив при вводе, используя что-то типа RLe компресии smile.gif и array [1..499] Ж)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.06.2005 14:55
Сообщение #14


Гость






Цитата(Malice @ 16.06.05 14:38)
Может в этом и суть smile.gif Описано уж больно все конкретно.

Что именно КОНКРЕТНО описано? Я например виже только то, что есть ограничение на длину слова... С остальным никаких проблем нет, но если тебе так хочется поумничать, то просто напиши свою функцию ввода строки посимвольно... 10 минут работы вместе с отладкой...

В чем проблемы?
 К началу страницы 
+ Ответить 
klem4
сообщение 16.06.2005 14:55
Сообщение #15


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Можно вводить сразу массив слов :

uses crt;
const limits=[' ',',','.'];
var
s:string;
ch:char;
posl:array[1..50] of string[8];
i,j,n:integer;

Begin
clrscr;

write('n='); readln(n);

j:=0;
repeat
s:='';
i:=0;
repeat
inc(i);
ch:=readkey;
write(ch);
if not (ch in limits) then
s:=s+ch;
until (ch in limits)or(i=8);
inc(j);
posl[j]:=s;
until j=n;

readln;
end.



немного лагает, надо поправить

Сообщение отредактировано: klem4 - 16.06.2005 15:02


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Archon
сообщение 16.06.2005 14:59
Сообщение #16


Профи
****

Группа: Пользователи
Сообщений: 618
Пол: Мужской

Репутация: -  24  +


Да ну вас... Мы же с Malice пошутили... :p2:

У нас для этого есть раздел "ЮМОР"...
А сюда люди когда приходят, им не до шуток... angry.gif


Да, сэр, так точно, сэр! mellow.gif

Сообщение отредактировано: Archon - 16.06.2005 16:45


--------------------
Close the World...txeN eht nepO
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 16.06.2005 16:35
Сообщение #17


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Не уверен что отрабатывает полностью правильно, так что не бейте , здесь вариант с фиксированным числом записей, взгляните :

uses crt;
const
limits=[' ',',','.'];
glasn=['q','e','y','u','i','o','a'];
sogl=['a'..'z']-glasn;
var
s,ss:string;
ch:char;
posl:array[1..50] of string[8];
i,j,k,n:integer;
flag:boolean;

Begin
clrscr;

write('n='); readln(n);

j:=0;
repeat
s:='';
i:=0;
repeat
inc(i);
ch:=readkey;
write(ch);
if not (ch in limits) then
s:=s+ch;
until (ch in limits)or(i=8);
inc(j);
posl[j]:=s;
until j=n;

writeln;

for i:=1 to n do
if (posl[i]<>posl[n])or(n=1) then begin
ss:=posl[i];
if odd(length(ss)) then
delete(ss,length(ss) div 2 + 1,1);

flag:=true;

k:=1;

case ss[k] in glasn of
True : begin

while(k<=length(ss))and(flag) do
if not((ss[k] in glasn)and(ss[k+1] in sogl)) then
flag:=false
else inc(k,2);

if flag then
writeln('YES : ',posl[i]);
end;

False : begin
while(k<=length(ss))and(flag) do
if not((ss[k] in sogl)and(ss[k+1] in glasn)) then
flag:=false
else inc(k,2);

if flag then
writeln('YES : ',posl[i]);
end;
end;
end;

readln;
end.



если надо, можно сделать такойже ввод, только без фиксированного числа последовательностей

Сообщение отредактировано: klem4 - 16.06.2005 19:08


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Guest
сообщение 16.06.2005 22:57
Сообщение #18


Гость






Цитата(volvo @ 16.06.05 14:55)
Что именно КОНКРЕТНО описано? Я например виже только то, что есть ограничение на длину слова... С остальным никаких проблем нет, но если тебе так хочется поумничать, то просто напиши свою функцию ввода строки посимвольно... 10 минут работы вместе с отладкой...

В чем проблемы?


Нежнее, volvo, нежнее. Работа программиста приучает к буквоедству, если в задании возможны разночтения - я всегда уточняю. Эти цифры просто режут глаз. Почему именно 50, а на пример не 10 ? Сложнее программа от этого не становится, а за 255 выталкивает. И окончание ввода конкретным символом тоже подводит к посимвольному вводу (это к until ch='.'). И ни каких проблем в этом нет. Говорю-что думаю. Ни каких шуток - все серьезно.
 К началу страницы 
+ Ответить 
volvo
сообщение 17.06.2005 12:08
Сообщение #19


Гость






Цитата(klem4 @ 16.06.05 16:35)
Не уверен что отрабатывает полностью правильно

Вот этот кусок вызывает сомнения:
   clrscr;

write('n='); readln(n);

j:=0;
repeat
s:='';
i:=0;
repeat
inc(i);
ch:=readkey;
write(ch);
if not (ch in limits) then
s:=s+ch;
until (ch in limits)or(i=8);
inc(j);
posl[j]:=s;
until j=n;

writeln;
{ Добавлено мной }
for i := 1 to n do writeln(posl[i]);

Вот что я вводил:
n=3
start<пробел>finish<пробел><пробел>

... на этом ввод прерывается и мне распечатывает:
Цитата
start
finish
<пустая строка или пробел>


А у меня получилось вот такое (для ввода слов):
uses crt;

const
maxlen = 8;
maxwords = 10;
var
words: array[1 .. maxwords] of
string[maxlen];

function get_words: integer;
const
_delimit = [' ', ','];
_endstr = ['.'];
var
ch: char;
word_count: integer;
begin
word_count := 1;
repeat
ch := readkey;
if not (ch in (_delimit+_endstr)) then begin
if length(words[word_count]) < maxlen then begin
words[word_count] := words[word_count] + ch; write(ch)
end;
end
else
if ch in _delimit then begin
write(ch);
while ch in _delimit do ch := readkey;

if not (ch in _endstr) then begin
inc(word_count); words[word_count] := ch; write(ch);
end;
end;
until ch in _endstr;
writeln;
get_words := word_count;
end;

var
i: integer;
begin
for i := 1 to get_words do
writeln(words[i])

{ и пошла обработка }
end.
 К началу страницы 
+ Ответить 
klem4
сообщение 17.06.2005 13:05
Сообщение #20


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


А если так :

write('n='); readln(n);

j:=0;

repeat
s:='';
i:=0;

flag:=false;
repeat
inc(i);
ch:=readkey;
write(ch);
if not (ch in limits) then begin
flag:=true;
s:=s+ch;
end;

until (ch in limits)or(i=8);

if flag then begin
inc(j);
posl[j]:=s;
end;
until j=n;


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 19:23
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"