Форум «Всё о Паскале» _ Задачи _ Формирование массивов
Автор: Домовой 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;
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.
Но е-мое Ведь массивы записываются неверно! Ну, я в плане - когда берешься его показать - выдается правильно только перый элемент массива, а другие - беспоряждочно и не удовлетворяют условию. Причем я проверил тока массив B Пробовал ставить, при проверке, что-то вроде 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
Цитата
Проверил, усё равно не работает ))
Поймите же наконец, если бы оно не работало - я бы не запостил. Тебе что, скриншот привести? Я же ПРОВЕРЯЮ каждую программу, сколько повторять???
Исходные данные + полный текст программы + результат приведи!
Вот кстати скриншот:
Эскизы прикрепленных изображений
Автор: Домовой 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;
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. Скорее всего паскаль - сейчас проверил со скриншота -у меня другие результаты чем у тебя получаются
Вот кстати тоже скриншот:
Эскизы прикрепленных изображений
Автор: 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
Уфф... Да, моя оплошность )) Благодарю за помощь ))