Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Поясните работу с множествами   Найти похожие ветки 

 
Андрей Миронов   (2010-01-24 16:11) [0]

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


 
xayam ©   (2010-01-24 16:15) [1]

а что непонятно? делаешь множество согласных букв и ищешь пересечения с каждым словом из непустой последовательности из стpочных pусских букв


 
Андрей Миронов   (2010-01-24 16:17) [2]

То есть я должен пробежаться по каждому символу текущего слова и добавить его в отдельное множество, так? А как затем понять, что данный член из множества (буква) входила только в одно слово?


 
xayam ©   (2010-01-24 16:26) [3]


> Андрей Миронов   (24.01.10 16:17) [2]
> То есть я должен пробежаться по каждому символу текущего
> слова и добавить его в отдельное множество, так?

множество согласных - это ведь константа. Все буквы известны же?

> А как затем понять, что данный член из множества (буква)
> входила только в одно слово?

видимо должен быть цикл по всем элементам непустого множества и внутри цикла - нахождение пересечения текущего элемента с константой согласных, и там уже что хочешь делай с полученным пересечением. Кстати скорей всего проще использовать массивы, хотя я не уверен.


 
Андрей Миронов   (2010-01-24 16:29) [4]

Я не совсем понимаю ход ваших объяснений. Да, я могу сделать множество известных мне букв. И вот в цикле по элементам строки я нашел пересечение? Это ведь одна буква. Поясните подробнее, если возможно.


 
xayam ©   (2010-01-24 16:44) [5]


> И вот в цикле по элементам строки я нашел пересечение? Это
> ведь одна буква.

ну е-мое теория то вообще проще пареной репы, почитал бы уже где :)
скажем, есть множество всех согласных  S = ["б", "в", "г", "д" ...] и множество или массив заданных слов М = ["буква", "слово", "предложение"]. Тогда пересечение множества/массива S с множеством/массивом М будет равно для первого элемента "бкв", для второго - "слв" и т.д. Другое дело на каком языке это реализовывать, если php - там есть специальные функции для работы с несколькими массивами, delphi - для работы со множествами in (проверка вхождения) и * (пересечение множеств) и т.д.


 
palva ©   (2010-01-24 20:55) [6]

Вам надо завести несколько переменных типа множество символов.
ss - в начале обработки занесите туда все согласные буквы.
s1 - здесь будет ответ, сначала будет пустым множеством.
и другие переменнные будут того же типа.
Цикл по словам
 w := множество букв очередного слова; (вы должны обработать слово вручную)
 t := ss*w; // кандидаты на добавление
 sp := t - s1; // эти буквы вы действительно добавите
 sm := t*s1; // эти буквы встретились уже во втором слове и их придется исключить из s1
 ss := ss - sm // не будем больше иметь с этими буквами дела.
 s1 :=s1 - sm + sp;
Конец цикла по словам
Печатаете результат s1 - опять цикл вручную.


 
Андрей Миронов   (2010-01-24 21:34) [7]

xayam, я это понял. Вопрос в том, как определить, что, скажем, в приведенном вами примере б,к,с и л встречаются всего один раз, а "в" - дважды?


 
Андрей Миронов   (2010-01-24 21:43) [8]

palva, поясните, пожалуйста, эти строки и поправьте меня:
sp := t - s1; // эти буквы вы действительно добавите
sm := t*s1; // эти буквы встретились уже во втором слове и их придется исключить из s1
ss := ss - sm // не будем больше иметь с этими буквами дела.
s1 :=s1 - sm + sp;

Предположим, t равно "бкв", тогда sp = бкв-пустое множество=бкв,
sm = бкв * пустое множество = пустое множество, ss = вновь все буквы и s1 = s1 + sp = бкв

Не ясно, что тут и зачем.


 
palva ©   (2010-01-24 22:00) [9]


> Не ясно, что тут и зачем.


Ну значит все согласные буквы первого слова попали в s1.
Дальше посмотрите, что будет со вторым словом, в котором, предположим, тоже есть буква "б".
А если в третьем слове есть буква "б"? Попадет ли эта буква в s1, а если не попадет, то почему?

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


 
Андрей Миронов   (2010-01-24 22:12) [10]

Мне кажется, тут просто ваши комментарии не вполне ясны. Ну вот как понять "вы действительно добавите"? Куда? И почему "встретились уже во втором слове" и как их "придется исключить", если там просто пересечение? Далее зачем-то убираете что-то из начального множества букв и делаете малопонятную операцию с результатом. Поясните, если можете, почему написано именно так и что значат эти операции?


 
xayam ©   (2010-01-24 22:17) [11]


> Андрей Миронов   (24.01.10 22:12) [10]
> Мне кажется, тут просто ваши комментарии не вполне ясны.
>  Ну вот как понять "вы действительно добавите"? Куда? И
> почему "встретились уже во втором слове" и как их "придется
> исключить", если там просто пересечение? Далее зачем-то
> убираете что-то из начального множества букв и делаете малопонятную
> операцию с результатом. Поясните, если можете, почему написано
> именно так и что значат эти операции?

слушай, palva расписал тебе уже всю поднаготную, пора говорить ему спасибо и  в остальном самому разбирать. Операции то должен осилить? :)


 
Андрей Миронов   (2010-01-24 22:20) [12]

Простите, я, конечно, премного благодарен, но я не могу понять логику программы, а не операции с множествами. Если несложно, уделите мне немного времени и опишите смысл операций в алгоритме palva.


 
palva ©   (2010-01-24 22:26) [13]

Вы алгоритм-то покрутили? Работает или нет?

"Вы действительно добавите", значит эти буквы прибавятся к s1 при обработке данного слова. - Не всех же кандидатов добавлять.

> и как их "придется исключить", если там просто пересечение?

Это сначала пересечение. А потом мы это пересечение вычитаем из s1, то есть исключаем.

> Далее зачем-то убираете что-то из начального множества букв

Затем, чтобы если буква "б" встретилась в третий раз, чтобы она не добавилась к s1

А написал я так потому, что мне показалось, что это будет работать. Могу в этом и ошибаться. И написать можно по-другому, очень многими способами и с множествами, и без множеств.


 
Андрей Миронов   (2010-01-24 22:45) [14]

Мне все равно осталось непонятно ваше решение, поэтому я сделал свое:

результат = [], цикл по словам
символы текущего слова = []
берем все согласные текущего слова (согласные)
находим пересечение р-та и этих символов - это и будет символы, что уже были, а на первом шаге соотно это пустое мн-во, т.к. р-т пуст
добавляем в р-т символы текущего и вычитаем р-т пересечения

Нормально?


 
palva ©   (2010-01-24 23:26) [15]

Хорошо делаете, что пишете свое. Вы алгоритм на бумажке прокручивать умеете? Неужели не учили? А отладчиком пользоваться? В конечном счете на вопрос "Нормально?" вам должен ответить не я а компьютер на прогоне теста. Напишите программу, придумайте достаточно большой тест, чтобы все случаи проверить, и вперед.

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


 
korneley ©   (2010-01-24 23:39) [16]


> Андрей Миронов   (24.01.10 22:45) [14]
> Нормально?

Нет. Отсутствует история дублей. См [6]
ss := ss - sm // не будем больше иметь с этими буквами дела.

А то на втором слове удалишь, а на третьем опять добавишь.


 
Андрей Миронов   (2010-01-24 23:40) [17]

Вы имеете ввиду, что я неверно написал? А как же тогда сделать, чтобы уж точно не добавлялось вновь то, что уже удалилось? Удалять непосредственно из константного множества согласных букв?


 
Андрей Миронов   (2010-01-24 23:46) [18]

korneley, так а как еще можно решить эту проблему? Может, просто завести дополнительное множество, в котором буду собирать все ранее добавленные множества, и перед добавлением в р-т проверять, есть ли уже такие?


 
korneley ©   (2010-01-24 23:49) [19]


> Андрей Миронов   (24.01.10 23:40) [17]
>  А как же тогда сделать,
>  чтобы уж точно не добавлялось вновь то, что уже удалилось?

Бли-и-ин!!! Ну какой вы... непонятливый... Исключи их из множества согласных и всё.


 
Андрей Миронов   (2010-01-24 23:52) [20]

Простите, что раздражаю вас, просто очень хотелось бы понять. Возможно, конечно, вам эта тема сразу легко далась, но не для всех людей все сразу становится ясно. Я, к сожалению, отношусь ко вторым. В общем, просто в свой алгоритм я добавляю Sogl = Sogl - CurrSogl, где Sogl - общее множество согласных, а CurrSogl - множество согласных текущего слова. Так?


 
korneley ©   (2010-01-25 00:07) [21]

Для ясности позволю прозволю себе прокомментировать [6]

1. w := множество букв очередного слова; (вы должны обработать слово вручную)
2. t := ss*w; // кандидаты на добавление
Это, надеюсь понятно

3. sp := t - s1; // эти буквы вы действительно добавите
Буквы еще не присутствующие в результате, стало быть реально добавляемые.

4. sm := t*s1; // эти буквы встретились уже во втором слове и их придется исключить из s1
Буквы присутствующие в результате, а даже точнее, второй раз встреченные, дальше будет ясно почему именно второй.

5. ss := ss - sm // не будем больше иметь с этими буквами дела.
Вот! Убираем дубли из проверочного множества, дабы дальше в п.2 на следующем слове они вообще не выбирались. Зачем они нам?

6. s1 :=s1 - sm + sp;
Собственно результат вычитаем дубли и добавляем чего вообще в нем не было


 
sniknik ©   (2010-01-25 00:38) [22]

> как определить, что, скажем, в приведенном вами примере б,к,с и л встречаются всего один раз, а "в" - дважды?

procedure TForm1.Button1Click(Sender: TObject);
type TSet = set of char;
var
 s1, s2, s3: TSet;
 ch: char;
 cl: integer;
begin
 s1:= ["б","у","к","в","а"];
 s2:= ["с","л","о","в","о"];
 s3:= ["п","р","е","д","л","о","ж","е","н","и","е"];
 for ch:= "а" to "я" do begin
   cl:= 0;
   if ch in s1 then inc(cl);
   if ch in s2 then inc(cl);
   if ch in s3 then inc(cl);
   ListBox1.Items.Add(ch + " = " + IntToStr(cl))
 end;
end;


 
Германн ©   (2010-01-25 01:08) [23]


> sniknik ©   (25.01.10 00:38) [22]

Значит типизированные константы побоку?
Следование "дурным" рекомендациям или жизненная позиция?


 
картман ©   (2010-01-25 01:12) [24]


> sniknik ©   (25.01.10 00:38) [22]


>  for ch:= "а" to "я" do begin


ему ж только согласные нужны


 
korneley ©   (2010-01-25 01:21) [25]


> sniknik ©   (25.01.10 00:38) [22]

Так ему придётся ещё цикл внутри по словам лепить :) Я бы вообще взял массив типа CharCount : array["а".."я"] of integer и одним проходом по входному массиву посчитал кто и сколько раз в (разных словах) встречался
что-то типа

 fillchar(CharCount, sizeof(CharCount), 0);
 TempSet := [];
 for i := 1 to Length(s) do begin
   if s[i] in [" ", ","] then
     TempSet := []
   else
   if (s[i] in Consonants) and not (s[i] in TempSet) then begin
     inc(CharCount[s[i]]);
     TempSet := TempSet + [s[i]];
   end;
 end;


 
korneley ©   (2010-01-25 01:36) [26]


> ему ж только согласные нужны

А гласных всё равно меньше, примерно раза в два :))

> Германн ©   (25.01.10 01:08) [23]
> Значит типизированные константы побоку?


Как это! У меня, в [25] подразумевается

const
 Consonants : set of char = ["б", "в", "г", "д", "й", "ж", "з", "к", "л", "м",
                             "н", "п", "р", "с", "т", "ф", "х", "ц", "ч", "ш",
                             "щ"];
 
:)))


 
Германн ©   (2010-01-25 01:40) [27]


> Как это! У меня, в [25]

Ну я же не тебе адресовал вопрос. А Николаю.


 
sniknik ©   (2010-01-25 08:03) [28]

код для понимания должен быть простым, и очевидным (т.е. никаких операций по умолчанию и "за кадром"), т.что можете считать это жизненным принципом.

> Так ему придётся ещё цикл внутри по словам лепить :)
если поймет, то не придется. код не готовый для задачи, а для понимания принципа.
в данном случае
> как определить, что, скажем, в приведенном вами примере б,к,с и л встречаются всего один раз, а "в" - дважды?
т.е. сколько вхождений символов в наборах.
а уж разделить на гласные не гласные, проблем не должно быть (спрашивал то не это, значит вроде знает).



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.068 c
15-1270102589
AlexDan
2010-04-01 10:16
2010.08.27
Думаю поспамить


2-1274637067
REX
2010-05-23 21:51
2010.08.27
Печать


15-1264519606
Igor_guest
2010-01-26 18:26
2010.08.27
распространение продукта на Delphi


15-1264718996
Германн
2010-01-29 01:49
2010.08.27
Странно работает "Показать мои вопросы"


6-1218807638
_koha
2008-08-15 17:40
2010.08.27
Падает сокет усервера на WinAPI - не могу разобраться





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский