Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Помогите исправить программу!

Автор: SergSIS 26.05.2006 13:51

Написал программу по созданию множества из случайных чисел по заданному числу членов и выделению из него двух множеств делящихся на 3 и на 2.
в PascalABC программа работает, а в Turbo Pascal 7.0 выдает на 1 члена меньше и почемуто одни и те же числа.
Помогите найти ошибку. Заранее благодарен.

Код

program Lab8_2;
const m=200;
var h,h1,h2:set of 1..m; i,p,n,k,r:integer; x:1..200;
procedure wri (h:set of 1..m);
var x:1..200;
begin
  for x:=1 to 200 do
   if x in h then
   writeln(x);
  end;
begin
writeln('Введите количество членов!');
readln(n);
while i<n do
  begin
   p:=Random(200);
   h:=h+[p];
   i:=i+1;
  end;
writeln('Сформированное множество:');
wri(h);
k:=2;
while k<=200 do
  begin
   if k in h then
    h1:=h1+[k];
    k:=k+2;
  end;
writeln('в том числе кратные 2:');
wri(h1);
r:=3;
while r<=200 do
  begin
   if r in h then
    h2:=h2+[r];
    r:=r+3;
  end;
writeln('в том числе кратные 3:');
wri(h2);
end.

Автор: volvo 26.05.2006 14:31

SergSIS,
Твой код вообще в TP 7.0 не компилируется. Ибо тип не может определяться внутри заголовка процедуры...

Код
program Lab8_2;
const
  m=200;
type
  myset = set of 1 .. m;
var
  h, h1, h2: myset; { <--- Изменение }
  i, p, n, k, r: integer;
  x: 1 .. 200;

procedure wri (h: myset); { <--- Изменение }
var x:1..200;
begin
  for x:=1 to 200 do
    if x in h then
      writeln(x);
end;

begin
  writeln('Введите количество членов!'); readln(n);
  i := 1;
  while i<=n do { <--- Вот печему получал меньше на 1 элемент }
  begin
    p:=Random(200) + 1; { <--- Иначе можешь получить 0, а это некорректно}
    h:=h+[p];
    i:=i+1;
  end;
  writeln('Сформированное множество:'); wri(h);
  k:=2;
  while k<=200 do
  begin
    if k in h then
      h1:=h1+[k];
    k:=k+2;
  end;
  writeln('в том числе кратные 2:'); wri(h1);
  r:=3;
  while r<=200 do
  begin
    if r in h then
      h2:=h2+[r];
    r:=r+3;
  end;
  writeln('в том числе кратные 3:'); wri(h2);
end.

Автор: SergSIS 26.05.2006 15:08

Рано поблагодарил.
Ваши изменения проблему не устранили:
1.Сейчас выдается на 1 член больше чем запрашиваеш.
2.При повторных запусках выскакивают одни и те же числа (ваще неисправилось).
Ни чё не понимаю!

Автор: SergSIS 26.05.2006 16:21

Цитата(SergSIS @ 26.05.2006 13:08) *

Рано поблагодарил.
Ваши изменения проблему не устранили:
1.Сейчас выдается на 1 член больше чем запрашиваеш.
2.При повторных запусках выскакивают одни и те же числа (ваще неисправилось).
Ни чё не понимаю!

Почему в PascalABC работает, а в Turbo Pascal7.0 нет? Одна под Видос другая под Дос.
Ни чё не понимаю!?

Цитата(SergSIS @ 26.05.2006 13:08) *

Рано поблагодарил.
Ваши изменения проблему не устранили:
1.Сейчас выдается на 1 член больше чем запрашиваеш.
2.При повторных запусках выскакивают одни и те же числа (ваще неисправилось).
Ни чё не понимаю!

Почему в PascalABC работает, а в Turbo Pascal7.0 нет? Одна под Видос другая под Дос.
Ни чё не понимаю!?

Автор: volvo 26.05.2006 17:28

SergSIS, ну что, тебе тоже скриншот привести? Сколько запрашиваешь - столько и генерируется. А ты не учел, кстати, что если будут 3 единицы, например - то ты получишь на 2 меньше, чем запрашивал. Это ж СЛУЧАЙНЫЕ числа !!! А в множестве одно число хранится в одном экземпляре...

Цитата
При повторных запусках выскакивают одни и те же числа (ваще неисправилось).
Randomize первой строкой программы добавь... (я это и не исправлял, кстати. Help не просто так в Паскале существует)

Цитата
Почему в PascalABC работает, а в Turbo Pascal7.0 нет? Одна под Видос другая под Дос.
Всего-то разницы smile.gif А то, что синтаксис другой - тебе наплевать, правда? А вот TP - НЕТ.

Автор: Malice 26.05.2006 17:31

Цитата(SergSIS @ 26.05.2006 12:08) *

Рано поблагодарил.
Ваши изменения проблему не устранили:
1.Сейчас выдается на 1 член больше чем запрашиваеш.

Поставь i:=1; в начале программы
Цитата

2.При повторных запусках выскакивают одни и те же числа (ваще неисправилось).
Ни чё не понимаю!

Поставь Randomize; тоже в начале.

Автор: SergSIS 26.05.2006 21:13

Извиняюсь, господа модераторы, мозги просто уже горят (время поджимает) вот и леплю ошибки.
Буду пробовать, спасибо за помощь.
А кудаж нам бедным ещё обращатся за помощью, как не на любимый форум?

Автор: -Alexan- 29.04.2007 17:50

помогите сделать пограммы :определить максимальное целое n удовлетворяющее условию 3n2(в кв)-730n<5
#2:сформировать два массива целых чисел определенной длиныюВывести на печать числа,встречающиеся в каждом массиве. ПОМОГИТЕ ПОЖАЛУЙСТА НАДО СРОЧНО!!!!

 ! 
Не надо задавать свои вопросы в чужих темах, тем более в таких древних. Прежде чем создать свою тему, настоятельно рекомендую прочитать правила форума