Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Не работает программа на Turbo Pascal  (Прочитано 41870 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
v.korleone
Помогающий

ua
Offline 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
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 04-10-2010 18:37 » 

А зачем такая хитрая работа с множествами в языке, который имеет встроенный тип множества, а также набор операций над множествами (объединение, пересечение, разность и т.д.)? Ладно бы еще это был С...
Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #2 : 04-10-2010 18:44 » 

Потому что я чайник в этом деле Улыбаюсь Мне сказали нужно сделать программу для реализации ф-й работы с множествами: объединение, пересечение, вычитание. Не вопрос - загуглил, нашел вот эту. Скачал ТР, немного подправил, а она не работает Жаль  
Может быть подскажете, что сделать чтобы данный код заработал?
« Последнее редактирование: 04-10-2010 18:49 от v.korleone » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 04-10-2010 18:49 » 

мдаа, вот так нынче учат делать программы ((
Цитата
Не вопрос - загуглил, нашел вот эту. Скачал ТР, немного подправил, а она не работает
Записан

Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 04-10-2010 18:49 » 

Тогда вот для начала руководство для чайников, как-то же самое сделать правильно: http://borlpasc.narod.ru/docym/Faronov/gl4/gl4_7.html

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

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
v.korleone
Помогающий

ua
Offline 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
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Помогающий

ua
Offline 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
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 04-10-2010 20:30 » 

сначала надо разобраться что такое множество

Вопрос

мы определили множество set of digit
Сколько максимальное количество элементов может быть в множестве?

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

пример
a=[1,3,4]
b=6
входит ли элемент b в множество А

с=1
Входит ли ?

 
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 04-10-2010 21:08 » new

... Пытаюсь вывести массив:
Код:
...
{Как здесь записать i-ый елемент массива С? Не работает если пробовать типа С[i] как обыкновенный массив}
...

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

Постарайтесь найти ответы на все вопросы Sla, тогда должна наступить ясность.

Ну и два важных вывода напоследок:

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

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

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
v.korleone
Помогающий

ua
Offline 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 » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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
Помогающий

ua
Offline 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
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 12-10-2010 05:29 » 

...поменял везде на 20...

Чтобы не "менять везде", в Паскале предусмотрена возможность определить константу и затем использовать ее по всей программе. Тогда, когда программа подрастет, не нужно будет искать 20 по всему тексту и каждый раз соображать, а те ли это 20 или просто совпадение. Вот тогда действительно изменения будут минимальными.

То же самое относится и к магическому числу 8.
Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
v.korleone
Помогающий

ua
Offline 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
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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(x);
m:=m+[x];

Так же точно. Литерный тип можно считывать через 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"), и эта проблема уйдет:

Код:
type
    Range = 1 .. q;

Теперь мы можем переписать предыдущий фрагмент таким образом:

Код:
    m: Range;
    n: Range;
    z,y,f: Range;

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

Код:
type
    Range = 'a' .. 'z';

- и наша программа переделана под работу с множествами литер.

Можно нанести еще немного глянца. Введем пару констант и определим наш тип через них:

Код:
const
    MinRangeVal = 'a';
    MaxRangeVal = 'z';

type
    Range = MinRangeVal .. MaxRangeVal;

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

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

Код:
type
    RangeItem = char;

Теперь наша программа практически универсальна: вместо 

Код:
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
Помогающий

ua
Offline 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
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 13-10-2010 17:34 » 

v.korleone, естественно

m - у тебя множество
А где оно у тебя объявлено?

А то ч то объявлено - диапазон.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #18 : 13-10-2010 17:48 » 

Код:
m,n:set of Range
верно?
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 13-10-2010 17:57 » 

Код:
m,n:set of Range
верно?

Точно.

Еще можно в том же духе объявить тип

Код:
type
    RangeSet = set of Range;

var
    m, n: RangeSet;
« Последнее редактирование: 13-10-2010 18:02 от Dale » Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
v.korleone
Помогающий

ua
Offline 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
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 13-10-2010 18:50 » 

v.korleone, будь добр, отформатируй код
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 13-10-2010 19:19 » 

Вот еще какая штука, раз мы учимся писать код

Введите элементы множества A,
 а заполняем почему-то множество m
Программа будет работать, но читать ее очень сложно
Поэтому
var SetA,SetB,SetComplement ,SetUnion, SetIntersection : typeSet

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Помогающий

ua
Offline Offline

« Ответ #25 : 15-10-2010 04:40 » 

Dale,  Sla согласен со всем, что вы написали выше. А есть какие-то соображения, относительно возникшей проблемы (?):
Цитата
Но выводятся записи состоящие из одной литеры. Т.е. я вбиваю разное количество литер в запись, а в последствии, после расчетов, вижу только одну первую вбитую литеру.
Есть предположение, что я и на самом деле записываю только одну литеру т.к. переменная "х" типа "Rangeitem" и в конечном счете типа "char". Поэтому нужно сделать 8-ми литерный массив типа "Rangeitem". Теперь вопрос как это сделать?
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 15-10-2010 06:19 » 

А есть какие-то соображения, относительно возникшей проблемы (?)

Есть соображение - сначала придать программе надлежащий вид, а потом отлаживать. Это будет гораздо проще, чем отладить небрежно написанную.

Поэтому нужно сделать 8-ми литерный массив типа "Rangeitem".

У нас уже есть нечто получше массива - множество. Осталось только заставить программу правильно с ним работать.
Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #28 : 15-10-2010 06:26 » 

Хорошо, по вашим советам, как приеду буду делать (переделывать).  
Цитата
RangeItem - литерный (символьный) тип. В него попадает ЛЮБОЙ символ.
Я понял что любой символ от а до z. Мне нужно таких символов/литер 8 в одной записи и таких записей 8.
Пришла мысль зациклить ввод символа 8 раз. Или эту процедуру вывода procedure OutPutSet, любезно предоставленую Sla  Класс!. Ну это так, что первое в голову пришло Улыбаюсь
« Последнее редактирование: 15-10-2010 06:31 от v.korleone » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #29 : 15-10-2010 06:38 » 

v.korleone,
Давай еще усложним задачу Улыбаюсь

Ты объявил Множество [a..z]

Ты ограничиваешь себя  только восемью элементами. А ведь их может быть Как угодно много...

Предлагаю
Написать процедуру ВВОДА элементов множества.
Ввод элементов заканчивать Вводом Элемента не входящим  во множество [a..z].

введите элемент множества А: b
введите элемент множества А: c
введите элемент множества А: r
введите элемент множества А: i
введите элемент множества А: A (конец ввода)
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines