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

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

Форум «Всё о Паскале» _ Задачи _ Формирование массивов

Автор: Домовой 3.04.2006 20:01

Здравствуйте.
У меня такое задание:
Дан одномерный массив A. Сформировать на его основе 2 одномерных массива B и C таким образом,
чтобы в B входили четные элементы с первой половины массива А, а в массив C - нечетные элементы со второй половины массива А.
Вроде задание то и не очень сложное,
вроде все написал... но почему-то ошибка,
помогите пожалуйста.

Код

program massive_2_5;
CONST
     from=1;
     exit=10;
     half=exit DIV 2;
var
   mass: ARRAY [from..exit] OF INTEGER; {Главный массив}
   b: ARRAY [from..half] OF INTEGER; {Массив B}
   c: ARRAY [half..exit] OF INTEGER; {массив C}
   i, context, fm, posb, posc: byte;

begin
fm:=1;
writeln('‚ўҐ¤ЁвҐ ', exit, ' §­ зҐ­Ё© ¬ ббЁў : '); {сообщение чтобы пользователь ввел значение главного массива}

  for i:=from TO exit DO
    begin
      readln(context);
      mass[i]:=context;
    end;
posb:=1;
  for i:=from TO (exit DIV 2) DO {Пробегаемся по первой половине главного массива}
    begin
      if (mass[i] MOD 2)=0 then {Если его элементы делятся на 2 без остатка}
        begin
          b[posb]:=mass[i]; {То сохраняем его в массив B}
          posb:=posb+1; {И добавляем индекс}
        end;
    end;

posc:=1;

  for i:=((exit DIV 2)+1) TO exit DO {Тоже самое и с C}
    begin
      if (mass[i] MOD 2)<>0 then
        begin
          c[posc]:=mass[i];
          posc:=posc+1;
        end;
    end;


   {Вывод результата, пока только B}
  writeln;
  writeln('Њ ббЁў B: ');
  for i:=from to half DO
    begin
      write(b[i], ' ');

    end;
  writeln;
  writeln(b[2]);
readln;

end.


Но е-мое smile.gif
Ведь массивы записываются неверно!
Ну, я в плане - когда берешься его показать - выдается правильно только перый элемент массива, а другие - беспоряждочно и не удовлетворяют условию.
Причем я проверил тока массив B smile.gif
Пробовал ставить, при проверке, что-то вроде writeln
в смысле "if (mass[i] MOD 2)=0 then" и писать просто результат - работает ведь!
Подскажите, в чем проблема,
буду признаетелен ))

Автор: volvo 3.04.2006 20:12

Цитата(Домовой @ 3.04.2006 16:01)
когда берешься его показать - выдается правильно только перый элемент массива, а другие - беспоряждочно и не удовлетворяют условию.

А вот так попробуй:
...
for i:=from TO exit DO
begin
readln(context);
mass[i]:=context;
end;

posb := 0; posc := 0;

for i := 1 to exit do begin
if odd(mass[i]) and (i > half) then begin
posc := posc + 1; c[posc] := mass[i];
end
else
if not odd(mass[i]) and (i <= half) then begin
posb := posb + 1; b[posb] := mass[i];
end
end;

writeln;
writeln('Array B: ');
for i:=1 to posb DO
write(b[i], ' ');
writeln;

{ здесь распечатаешь массив С так же, как и B }
readln;
...

Автор: Домовой 3.04.2006 20:28

Угу, сапсибо, volvo.
Попробую и так,
а вопрос - что за штука такая - odd, что-то я не припомню такой.
Это деление на 2?

Проверил, усё равно не работает ))
Т.е. работает, но так же - как и моя ))

Автор: volvo 3.04.2006 20:29

Не совсем... Это функция, возвращающая истину, если ее параметр НЕчетный (вместо того, чтобы делать

if X mod 2 = 1 then ...

делаем
if Odd(X) then ...
)

Автор: Домовой 3.04.2006 20:30

Гм... все равно не работает ))
т.е. работает, но так же как и у меня...
может это мой дружище Паскаль издевается?

Автор: volvo 3.04.2006 20:31

Цитата
Проверил, усё равно не работает ))


mad.gif Поймите же наконец, если бы оно не работало - я бы не запостил. Тебе что, скриншот привести? Я же ПРОВЕРЯЮ каждую программу, сколько повторять???

Исходные данные + полный текст программы + результат приведи!

Вот кстати скриншот:


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: Домовой 3.04.2006 20:40

Ладно ладно, зачем так нервничать то, я ж не хотел никого обидеть ))
Вот, полный код программы:

Код

program massive_2_5;
CONST
     from=1;
     exit=10;
     half=exit DIV 2;
var
   mass: ARRAY [from..exit] OF INTEGER;
   b: ARRAY [from..half] OF INTEGER;
   c: ARRAY [half..exit] OF INTEGER;
   i, context, fm, posb, posc: byte;

begin
fm:=1;
writeln('‚ўҐ¤ЁвҐ ', exit, ' §­ зҐ­Ё© ¬ ббЁў : ');

for i:=from TO exit DO
    begin
      readln(context);
      mass[i]:=context;
    end;

  posb := 0; posc := 0;

  for i := 1 to exit do begin
    if odd(mass[i]) and (i > half) then begin
      posc := posc + 1; c[posc] := mass[i];
    end
    else
      if not odd(mass[i]) and (i <= half) then begin
        posb := posb + 1; b[posb] := mass[i];
      end
  end;

  writeln;
  writeln('Array B: ');
  for i:=1 to posb DO
    write(b[i], ' ');
  writeln;
readln;

end.


Вот примеры ввхода данных для массива А:
4 8 12 3 9 1 7 3 10 2

Результат для массива B:
4 1 7
А по идее должно быть: 4 8 12

Видите, правильно только первая цифра.
Вот такой результат выдает мой паскаль
P.S. Скорее всего паскаль - сейчас проверил со скриншота -у меня другие результаты чем у тебя получаются sad.gif

Вот кстати тоже скриншот:


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: volvo 3.04.2006 20:50

Паскаль ни при чем...

var
b: ARRAY [from..half] OF INTEGER;
c: ARRAY [half..exit] OF INTEGER;
Замени на
var
b: ARRAY [from..half] OF INTEGER;
c: ARRAY [from..half] OF INTEGER;


(у тебя же в обоих случаях отсчет с 1 будет начинаться)...

Автор: Домовой 3.04.2006 20:55

Уфф...
Да, моя оплошность ))
Благодарю за помощь ))