v.korleone
Помогающий
Offline
|
|
« : 04-10-2010 18:25 » |
|
Имеется вот такая программа на ТР (работа с множествами): const MAX_SET_ITEM_COUNT = 20;{Maksimalnoe kol-vo elementov mnojestvo}
type TSetItem = integer; {Tip elementov} TSet = record Count: integer; Items: array [1 .. MAX_SET_ITEM_COUNT] of TSetItem; end;
function IsItemInSet(Item: TSetItem; const Set: TSet): Boolean; var i: Integer; begin IsItemInSet := False;
for i := 1 to Set.Count do if Item = Set.Items[i] then begin IsItemInSet := True;
Break; end; end;
{Obedenenie} function GetSetsUnion(const InSet1, InSet2: TSet; var OutSet: TSet); Boolean; var i: Integer; begin OutSet.Count := InSet1.Count; for i := 1 to InSet1.Count do OutSet.Items[i] := InSet1.Items[i];
GetSetsUnion := True;
for i := 1 to InSet1.Count do if not IsItemInSet(InSet2.Items[i], InSet1) then begin if OutSet.Count = MAX_SET_ITEM_COUNT then begin GetSetsUnion := False;
Break; end;
Inc(OutSet.Count); OutSet.Items[OutSet.Count] := InSet2.Items[i]; end; end;
{vichitanie InSet2 iz InSet1 } procedure GetSetsSubstraction(const InSet1, InSet2: TSet; var OutSet: TSet); var i: Integer; begin OutSet.Count := 0;
for i := 1 to InSet1.Count do if not IsItemInSet(InSet1.Items[i], InSet2) then begin Inc(OutSet.Count); OutSet.Items[OutSet.Count] := InSet1.Items[i]; end; end;
{peresechenie} procedure GetSetsCross(const InSet1, InSet2: TSet; var OutSet: TSet); var i: Integer; begin OutSet.Count := 0;
for i := 1 to InSet1.Count do if IsItemInSet(InSet1.Items[i], InSet2) then begin Inc(OutSet.Count); OutSet.Items[OutSet.Count] := InSet1.Items[i]; end; end;
procedure PrintSet(const Set: TSet); var i: Integer; begin for i := 1 to Set.Count do Writeln(); end;
var A, B, res: TSet; begin A:=[1,2,3,4,5,6,7]; B:=[3,4,5,6,7,8,9,10];
Writeln('Obedenenie:'); if GetSetsUnion(A, B, res) then PrintSet(res) else Writeln('Slishkom mnogo elementov!');
Writeln('Vichitanie:'); GetSetsSubstraction(A, B, res); PrintSet(res);
Writeln('Peresechenie:'); GetSetsCross(A, B, res); PrintSet(res); end. Проблема, состоит в том, что при компиляции выдает ошибку 2. Identifier expected (Не указан идентификатор) относительно константы const Set: TSet в function IsItemInSet(Item: TSetItem; const Set: TSet): Boolean; .
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #1 : 04-10-2010 18:37 » |
|
А зачем такая хитрая работа с множествами в языке, который имеет встроенный тип множества, а также набор операций над множествами (объединение, пересечение, разность и т.д.)? Ладно бы еще это был С...
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #2 : 04-10-2010 18:44 » |
|
Потому что я чайник в этом деле Мне сказали нужно сделать программу для реализации ф-й работы с множествами: объединение, пересечение, вычитание. Не вопрос - загуглил, нашел вот эту. Скачал ТР, немного подправил, а она не работает Может быть подскажете, что сделать чтобы данный код заработал?
|
|
« Последнее редактирование: 04-10-2010 18:49 от v.korleone »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 04-10-2010 18:49 » |
|
мдаа, вот так нынче учат делать программы (( Не вопрос - загуглил, нашел вот эту. Скачал ТР, немного подправил, а она не работает
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #4 : 04-10-2010 18:49 » |
|
Тогда вот для начала руководство для чайников, как-то же самое сделать правильно: http://borlpasc.narod.ru/docym/Faronov/gl4/gl4_7.htmlПотому что эта программа даже до чайникового уровня сильно недотягивает. Ее нужно не ремонтировать, а скорее выкинуть.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #5 : 04-10-2010 19:22 » |
|
Спасибо. После просмотра приведенной ссылки имеем такой код: type digit = set of 1..10; var A,B,C,D,E: digit; begin A:=[1..7]; B:=[3..10]; C:=A+B; D:=A-B; E:=A*B; Writeln('Obedenenie:',C); Writeln('Vichitanie:',D); Writeln('Peresechenie:',E); end. Пишет 64. Cannot Read or Write variables of this type (Нет возможности считать или записать переменые данного типа) Это что цикл вывода массива писать нужно?
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #6 : 04-10-2010 19:25 » |
|
Это что цикл вывода массива писать нужно? Да, в цикле перебирать возможные элементы и через операцию принадлежности IN проверять, есть ли этот элемент в множестве. P.S. И верхнюю границу множества лучше объявить через константу, пригодится для организации цикла. P.P.S. Для типа digit все-таки уместнее было бы использовать диапазон 0...9
|
|
« Последнее редактирование: 04-10-2010 19:27 от Dale »
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #7 : 04-10-2010 19:47 » |
|
Благодарствую Операцию принадлежности пока не пробовал. Пытаюсь вывести массив: Program L; type digit = set of 0..9; const n = 10; var A,B,C,D,E: digit; i: integer; begin A:=[1..7]; B:=[3..9]; C:=A+B; D:=A-B; E:=A*B; Writeln('Obedenenie:'); for i:=0 to n do Write(C,' ');{Как здесь записать i-ый елемент массива С? Не работает если пробовать типа С[i] как обыкновенный массив} Writeln('Vichitanie:',D); Writeln('Peresechenie:',E); end.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #8 : 04-10-2010 20:30 » |
|
сначала надо разобраться что такое множество
Вопрос
мы определили множество set of digit Сколько максимальное количество элементов может быть в множестве?
для того чтобы проверить входят ли элементы в множество нужно проверять каждый элемент
пример a=[1,3,4] b=6 входит ли элемент b в множество А
с=1 Входит ли ?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Dale
|
|
« Ответ #9 : 04-10-2010 21:08 » |
|
... Пытаюсь вывести массив: ... {Как здесь записать i-ый елемент массива С? Не работает если пробовать типа С[i] как обыкновенный массив} ...
Никак, потому что никакого массива тут нет. Множество - это совершенно другая сущность, со своими методами работы с ней. Постарайтесь найти ответы на все вопросы Sla, тогда должна наступить ясность. Ну и два важных вывода напоследок: 1. Не доучив язык до конца, есть риск изобрести велосипед, причем не очень хороший. При умелом использовании встроенных в язык множеств программа стала гораздо компактнее и понятнее, не говоря уже об экономии времени на написание этих нескольких строчек. 2. Интернет - большая свалка. Как на всякой свалке, тут есть и жемчужины, и отбросы, причем примерно в тех же пропорциях, как и на любой другой свалке. Нельзя тащить первое попавшееся и принимать за истину, чему пример - первый вариант программы. Порой, как в данном случае, сделать самому и поучительнее, и результат качественнее.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #10 : 11-10-2010 16:39 » |
|
Спасибо! Все получилось! Но есть проблема. Если вводить элементы для множества А: 1,2,3,4,5,6,7,8 а для Б: 3,4,5,6,7,8,9,10 все работает нормально, если вводить другие числа не работает. Пробовал менять "m:set of 1..8" на "m:set of 1..50" и n,z,y,f тоже по этому принципу, все равно не работает. В чем проблема? Вопрос: Как сделать, чтобы можно было в каждое множество записать 8 элементов, со значениями не с 1-8 и с 3-10 а допустим 1,3,5,7,9,11,13,15,17 и 1,2,3,4,5,6,7,8? Program L; Uses Crt; var m:set of 1..8; n:set of 3..10; z,y,f: set of 1..10; i,j,x,k,a:integer; BEGIN ClrScr; m:=[]; for i:=1 to 8 do begin ClrScr; Write('Vvedite ',i,'-y element mnojestva A: '); readln(x); m:=m+[x]; end; n:=[]; for j:=1 to 8 do begin ClrScr; Write('Vvedite ',j,'-y element mnojestva B: '); readln(k); n:=n+[k]; end; Writeln('Elementi mnojestva A: '); for i:=1 to 8 do if i in m then write(i,' '); Writeln(''); Writeln('Elementi mnojestva B: '); for j:=1 to 10 do if j in n then write(j,' '); Writeln; z:=m+n;{Obedenenie mnojestv} y:=m*n;{Peresechenie mnojestv} f:=m-n;{Vichitanie mnojestv} Writeln('Obedenenie A+B:'); for i:=1 to 10 do if i in z then write(i,' '); writeln(''); Writeln('Peresechenie A*B:'); for i:=1 to 10 do if i in y then write(i,' '); writeln(''); Writeln('Vichitanie A-B:'); for i:=1 to 10 do if i in f then write(i,' '); writeln(''); readln; END.
|
|
« Последнее редактирование: 11-10-2010 17:24 от v.korleone »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #11 : 11-10-2010 18:31 » |
|
Сделать Set of Byte, например, и потом в самой программе добавить в каждое множество по 8 случайных элементов (используя Random). Что-то типа: var i: byte; s: set of byte; begin s:= []; for i := 1 to 8 do begin s := s + [random(256)] end; end.
(я паскаль плохо знаю и не проверял, могут быть ошибки)
|
|
|
Записан
|
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #12 : 11-10-2010 20:02 » |
|
Вад, спасибо за помощь. А можно чтобы пользователь, сам вводил эти элементы? Ответ: можно Вот код программы с наименьшими изменениями, поменял везде на 20 т.е. можно вписать 8 элементов со значениями 0..20. Program L; Uses Crt; var m:set of 1..20; n:set of 1..20; z,y,f: set of 1..20; i,j,x,k,a:integer; BEGIN ClrScr; m:=[]; for i:=1 to 8 do begin ClrScr; Write('Vvedite ',i,'-y element mnojestva A: '); readln(x); m:=m+[x]; end; n:=[]; for j:=1 to 8 do begin ClrScr; Write('Vvedite ',j,'-y element mnojestva B: '); readln(k); n:=n+[k]; end; Writeln('Elementi mnojestva A: '); for i:=1 to 20 do if i in m then write(i,' '); Writeln(''); Writeln('Elementi mnojestva B: '); for j:=1 to 20 do if j in n then write(j,' '); Writeln; z:=m+n;{Obedenenie mnojestv} y:=m*n;{Peresechenie mnojestv} f:=m-n;{Vichitanie mnojestv} Writeln('Obedenenie A+B:'); for i:=1 to 20 do if i in z then write(i,' '); writeln(''); Writeln('Peresechenie A*B:'); for i:=1 to 20 do if i in y then write(i,' '); writeln(''); Writeln('Vichitanie A-B:'); for i:=1 to 20 do if i in f then write(i,' '); writeln(''); readln; END.
|
|
« Последнее редактирование: 11-10-2010 20:17 от v.korleone »
|
Записан
|
|
|
|
Dale
|
|
« Ответ #13 : 12-10-2010 05:29 » |
|
...поменял везде на 20... Чтобы не "менять везде", в Паскале предусмотрена возможность определить константу и затем использовать ее по всей программе. Тогда, когда программа подрастет, не нужно будет искать 20 по всему тексту и каждый раз соображать, а те ли это 20 или просто совпадение. Вот тогда действительно изменения будут минимальными. То же самое относится и к магическому числу 8.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #14 : 12-10-2010 14:38 » |
|
Dele, спасибо! Заменил, по Вашему совету, числа на константы. Теперь новая задача, нужно чтобы можно было вводить вместо 8 числовых значений, 8 символьных значений, по 8 символов (a-z) в каждом сообщении. Как я думаю нужно поменять "m:set of 1..q;" на "m:set of 'a'..'z';" и для переменных n,z,y,f соответственно. Но как теперь записывать символы в ячейку вот здесь (?): m:=[]; for i:=1 to w do begin ClrScr; Write('Vvedite ',i,'-y element mnojestva A: '); readln(x); m:=m+[x];
И как их выводить на экран здесь (?): Writeln('Elementi mnojestva A: '); for i:=1 to q do if i in m then write(i,' '); Writeln('');
Код программы, которую нужно переделать. Program L; Uses Crt; const q=20; w=8; var m:set of 1..q; n:set of 1..q; z,y,f: set of 1..q; i,j,x,k,a:integer; BEGIN ClrScr; m:=[]; for i:=1 to w do begin ClrScr; Write('Vvedite ',i,'-y element mnojestva A: '); readln(x); m:=m+[x]; end; n:=[]; for j:=1 to w do begin ClrScr; Write('Vvedite ',j,'-y element mnojestva B: '); readln(k); n:=n+[k]; end; Writeln('Elementi mnojestva A: '); for i:=1 to q do if i in m then write(i,' '); Writeln(''); Writeln('Elementi mnojestva B: '); for j:=1 to q do if j in n then write(j,' '); Writeln; z:=m+n;{Obedenenie mnojestv} y:=m*n;{Peresechenie mnojestv} f:=m-n;{Vichitanie mnojestv} Writeln('Obedenenie A+B:'); for i:=1 to q do if i in z then write(i,' '); writeln(''); Writeln('Peresechenie A*B:'); for i:=1 to q do if i in y then write(i,' '); writeln(''); Writeln('Vichitanie A-B:'); for i:=1 to q do if i in f then write(i,' '); writeln(''); readln; END.
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #15 : 13-10-2010 00:33 » |
|
Dele, спасибо! Заменил, по Вашему совету, числа на константы. Замечательно. Теперь програма выглядит гораздо лучше, чем поначалу. Но можно сделать еще лучше. Как именно - скажу в конце поста. Теперь новая задача, нужно чтобы можно было вводить вместо 8 числовых значений, 8 символьных значений, по 8 символов (a-z) в каждом сообщении. Раз уж мы решили все делать правильно, давайте заодно разберемся и с терминологией. Понятие "символ" в программной инженерии применяется в другом значении, а именно - в контексте теории формальных языков. В данном случае лучше применить термин "литера". Как я думаю нужно поменять "m:set of 1..q;" на "m:set of 'a'..'z';" и для переменных n,z,y,f соответственно. Совершенно верно. Но как теперь записывать символы в ячейку вот здесь (?): Так же точно. Литерный тип можно считывать через readln. Операции над множествами литер также не отличаются от операций над числовыми множествами. И как их выводить на экран здесь (?): ... for i:=1 to q do if i in m then write(i,' '); ...
И здесь тоже никаких принципиальных отличий. Цикл for работает не только с целочисленными типами, но и с любыми перечислимыми, к которым относится и char: for с := 'a' to 'z' do ...
Параметр цикла c будет пробегать все значения из указанного диапазона. Процедура write также без проблем работает с литерным типом. Надеюсь, теперь понятно, в каком направлении двигаться дальше. Ну и напоследок, как обещал, рекомендации по стилю. Константы вместо магических чисел - это хорошо. Но у нас в программе в нескольких местах раскидано: m:set of 1..q; n:set of 1..q; z,y,f: set of 1..q;
Это не есть хорошо. Если понадобится изменить диапазон обрабатываемых значений, придется синхронно менять несколько строчек, и не дай бог хоть одну забыть. К счастью, в Паскале можно определять свои собственные типы данных. Введем тип "диапазон" ("Range"), и эта проблема уйдет: Теперь мы можем переписать предыдущий фрагмент таким образом: m: Range; n: Range; z,y,f: Range;
Теперь код и лучше воспринимается (сразу понятно, что все перечисленные множества принадлежат к одному типу), и гораздо проще модифицируется при необходимости. А теперь небольшой фокус. Переопределим наш тип: - и наша программа переделана под работу с множествами литер. Можно нанести еще немного глянца. Введем пару констант и определим наш тип через них: const MinRangeVal = 'a'; MaxRangeVal = 'z';
type Range = MinRangeVal .. MaxRangeVal;
Если теперь добавить понятные комментарии, будет очевидно, какие минимальные изменения нужно внести в программу, чтобы ориентировать ее на другой тип множеств. Ну и окончательный штрих - определим базовый тип для элемента нашего множества: Теперь наша программа практически универсальна: вместо var i: integer; ... Writeln('Elementi mnojestva A: '); for i:=1 to q do if i in m then write(i,' '); ...
имеем: var i: RangeItem; ... Writeln('Elementi mnojestva A: '); for i := MinRangeVal to MaxRangeVal do if i in m then write(i,' '); ...
P.S. Примеры не проверялись в среде ТурбоПаскаля, поэтому вполне возможны опечатки и ошибки.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #16 : 13-10-2010 17:22 » |
|
Dele, благодарю за столь подробное описание. Есть проблемы. Вот пока приведу кусок программы, который был переделан: Program L; Uses Crt; const q=8; MinRangeval = 'a'; MaxRangeval = 'z'; type Range = MinRangeval..MaxRangeval; type Rangeitem = char; var m:Range; n:Range; z,y,f:Range; i,j,x,k:Rangeitem; e,r:integer; BEGIN ClrScr; m:=[]; for е:=1 to q do begin ClrScr; Write('Vvedite ',е,'-y element mnojestva A: '); readln(x); m:=m+[x]; end;
Писал for e:=1 to q do т.к. нам нужно записать 8 элементов x. Проблема: вот здесь m:=[]; пишет "Error 26 : Type mismatch" т.е. "Несоответствие типов".
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #17 : 13-10-2010 17:34 » |
|
v.korleone, естественно
m - у тебя множество А где оно у тебя объявлено?
А то ч то объявлено - диапазон.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|
Dale
|
|
« Ответ #19 : 13-10-2010 17:57 » |
|
Точно. Еще можно в том же духе объявить тип type RangeSet = set of Range;
var m, n: RangeSet;
|
|
« Последнее редактирование: 13-10-2010 18:02 от Dale »
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #20 : 13-10-2010 18:16 » |
|
Sla, Dale Работает! Program L; Uses Crt; const q=8; MinRangeval = 'a'; MaxRangeval = 'z'; type Range = MinRangeval..MaxRangeval; type Rangeitem = char; var m,n,z,y,f:set of Range; i,j,x,k:Rangeitem; e,r:integer; BEGIN ClrScr; m:=[]; for e:=1 to q do begin ClrScr; Write('Vvedite ',e,'-y element mnojestva A: '); readln(x); m:=m+[x]; end; n:=[]; for r:=1 to q do begin ClrScr; Write('Vvedite ',r,'-y element mnojestva B: '); readln(k); n:=n+[k]; end; Writeln('Elementi mnojestva A: '); for i:=Minrangeval to Maxrangeval do if i in m then write(i,' '); Writeln(''); Writeln('Elementi mnojestva B: '); for j:=Minrangeval to Maxrangeval do if j in n then write(j,' '); Writeln; z:=m+n;{Obedenenie mnojestv} y:=m*n;{Peresechenie mnojestv} f:=m-n;{Vichitanie mnojestv} Writeln('Obedenenie A+B:'); for i:=Minrangeval to Maxrangeval do if i in z then write(i,' '); writeln(''); Writeln('Peresechenie A*B:'); for i:=Minrangeval to Maxrangeval do if i in y then write(i,' '); writeln(''); Writeln('Vichitanie A-B:'); for i:=Minrangeval to Maxrangeval do if i in f then write(i,' '); writeln(''); readln; END.
Но выводятся записи состоящие из одной литеры. Т.е. я вбиваю разное количество литер в запись, а в последствии, после расчетов, вижу только одну первую вбитую литеру.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #21 : 13-10-2010 18:50 » |
|
v.korleone, будь добр, отформатируй код
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Dale
|
|
« Ответ #22 : 13-10-2010 19:03 » |
|
v.korleone, такую колбасу очень трудно читать, на грани невозможного. Компилятору, конечно, все равно, но код пишется в первую очередь для людей. Нужно подчеркнуть структуру программы отступами. Скажем, так: Program L;
Uses Crt;
const q=8; MinRangeval = 'a'; MaxRangeval = 'z';
type Range = MinRangeval..MaxRangeval; Rangeitem = char;
var m,n,z,y,f: set of Range; i,j,x,k: Rangeitem; e,r: integer;
begin ClrScr;
m := []; for e := 1 to q do begin ClrScr; Write('Vvedite ', e, '-y element mnojestva A: '); readln(x); m := m + [x]; end;
n := []; for r := 1 to q do begin ClrScr; Write('Vvedite ', r, '-y element mnojestva B: '); readln(k); n := n + [k]; end;
Writeln('Elementi mnojestva A: '); for i := Minrangeval to Maxrangeval do if i in m then write(i,' '); Writeln('');
Writeln('Elementi mnojestva B: '); for j := Minrangeval to Maxrangeval do if j in n then write(j,' '); Writeln;
z:=m+n; {Obedenenie mnojestv} y:=m*n; {Peresechenie mnojestv} f:=m-n; {Vichitanie mnojestv}
Writeln('Obedenenie A+B:'); for i := Minrangeval to Maxrangeval do if i in z then write(i,' '); writeln('');
Writeln('Peresechenie A*B:'); for i := Minrangeval to Maxrangeval do if i in y then write(i,' '); writeln('');
Writeln('Vichitanie A-B:'); for i := Minrangeval to Maxrangeval do if i in f then write(i,' '); writeln('');
readln; end.
Не нужно экономить пробелы и пустые строки, это не столь ценный ресурс.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Sla
|
|
« Ответ #23 : 13-10-2010 19:19 » |
|
Вот еще какая штука, раз мы учимся писать код
Введите элементы множества A, а заполняем почему-то множество m Программа будет работать, но читать ее очень сложно Поэтому var SetA,SetB,SetComplement ,SetUnion, SetIntersection : typeSet
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Dale
|
|
« Ответ #24 : 13-10-2010 19:58 » |
|
Ну и заодно уж, раз пошла такая пьянка... В программе несколько раз повторяются почти одинаковые фрагменты кода. Например: Writeln('Elementi mnojestva A: '); for i := Minrangeval to Maxrangeval do if i in m then write(i,' '); Writeln;
С небольшими вариациями эта тема повторяется в теле программы 5 раз. Другие повторения тоже есть, несмотря на маленький размер программы. Чтобы избежать этого, в Паскале имеются подпрограммы и функции. Имея отлаженную подпрограмму, можно ее вызывать сколько угодно раз и быть уверенным в результате. Насчет программы, где подобные фрагменты клонируются через "копипасту", этого сказать нельзя. И обязательно прислушайтесь к совету Sla. Имя константы, типа, переменной и т.д. однозначно должно говорить об их назначении. Исключение вроде i, j и т.п. можно сделать только для локального параметра цикла в подпрограмме. Все глобальные объекты должны иметь значимые имена.
|
|
« Последнее редактирование: 14-10-2010 06:31 от Dale »
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #25 : 15-10-2010 04:40 » |
|
Dale, Sla согласен со всем, что вы написали выше. А есть какие-то соображения, относительно возникшей проблемы (?): Но выводятся записи состоящие из одной литеры. Т.е. я вбиваю разное количество литер в запись, а в последствии, после расчетов, вижу только одну первую вбитую литеру. Есть предположение, что я и на самом деле записываю только одну литеру т.к. переменная "х" типа "Rangeitem" и в конечном счете типа "char". Поэтому нужно сделать 8-ми литерный массив типа "Rangeitem". Теперь вопрос как это сделать?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #26 : 15-10-2010 06:13 » |
|
v.korleone, если ты напишешь процедуру вывода элементов множества, то и сам поймешь в чем проблема, или по крайней мере где она спрятана procedure OutPutSet(NameSet:char, SomeSet:set of Range) var i:RangeItem; begin /* Writeln('Elementi mnojestva ',NameSet,':');*/ for i := Minrangeval to Maxrangeval do if i in m then writeln(i,' vhodit vo mnojestvo ',NameSet) else writeln(i,' ne vhodit vo mnojestvo ',NameSet); Writeln; end; Есть предположение, что я и на самом деле записываю только одну литеру т.к. переменная "х" типа "Rangeitem" и в конечном счете типа "char". Поэтому нужно сделать 8-ми литерный массив типа "Rangeitem". Здесь ты глубоко заблуждаешься. RangeItem - литерный (символьный) тип. В него попадает ЛЮБОЙ символ.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Dale
|
|
« Ответ #27 : 15-10-2010 06:19 » |
|
А есть какие-то соображения, относительно возникшей проблемы (?) Есть соображение - сначала придать программе надлежащий вид, а потом отлаживать. Это будет гораздо проще, чем отладить небрежно написанную. Поэтому нужно сделать 8-ми литерный массив типа "Rangeitem". У нас уже есть нечто получше массива - множество. Осталось только заставить программу правильно с ним работать.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #28 : 15-10-2010 06:26 » |
|
Хорошо, по вашим советам, как приеду буду делать (переделывать). RangeItem - литерный (символьный) тип. В него попадает ЛЮБОЙ символ. Я понял что любой символ от а до z. Мне нужно таких символов/литер 8 в одной записи и таких записей 8. Пришла мысль зациклить ввод символа 8 раз. Или эту процедуру вывода procedure OutPutSet, любезно предоставленую Sla . Ну это так, что первое в голову пришло
|
|
« Последнее редактирование: 15-10-2010 06:31 от v.korleone »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #29 : 15-10-2010 06:38 » |
|
v.korleone, Давай еще усложним задачу Ты объявил Множество [a..z] Ты ограничиваешь себя только восемью элементами. А ведь их может быть Как угодно много... Предлагаю Написать процедуру ВВОДА элементов множества. Ввод элементов заканчивать Вводом Элемента не входящим во множество [a..z]. введите элемент множества А: b введите элемент множества А: c введите элемент множества А: r введите элемент множества А: i введите элемент множества А: A (конец ввода)
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|