• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

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

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Пытаюсь разобраться с массивами в Free Pascal IDE

Шипа

Ученик
Регистрация
1 Дек 2011
Сообщения
11
Реакции
0
Баллы
0
Пытаюсь разобраться с массивами в Free Pascal IDE

Пожалуйста помогите с написать программу выполняющую :
"В одномерном массиве, состоящем из п целочисленных элементов, вычислить:
1. Номер максимального элемента массива.
2. Произведение элементов массива, расположенных между первым и вторым нулевыми элементами.
3. Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечетных позициях, а во второй половине — элементы, стоявшие в четных позициях."
Если можно приложите к своим действиям комментарий чтоб мне было проще разобраться что от куда
 
uses crt;
var a:array[1..100] of integer;
i,j,n,max,imax,n1,n2,p,x,k:integer;
begin
ClrScr;
Randomize;
Writeln('Vvedite kol-vo elementov: ');
repeat
Write('n=');
Readln(n);
until n in [1..100];
for i:=1 to n do
begin
a:=random(20)-10;
Write(a,' ');
end;
Writeln;
max:=a[1];
imax:=1;
for i:=2 to n do
if a>max then
begin
max:=a;
imax:=i;
end;
for i:=1 to n do
if a=0 then
begin
n1:=i;
break;
end;
for i:=n1+1 to n do
if a=0 then
begin
n2:=i;
break;
end;
p:=1;
for i:=n1+1 to n2-1 do
p:=p*a;
Writeln('Max ',max,' [',imax,']');
Writeln('P=',p);
for i:=1 to n do
if i mod 2<>0 then
begin
k:=k+1;
x:=a;
for j:=i downto k+1 do
a:=a[j-1];
a[k]:=x;
end;
for i:=1 to n do
Write(a,' ');
Readln;
end.
 
И что - не работает?
По тексту - вроде до перегруппировки (чет-нечет) всё правильно, за исключением того, что нужно предусмотреть ситуации, когда в массиве один ноль или нет нулей вовсе.
А вот тут:
for i:=1 to n do
if i mod 2<>0 then
begin
k:=k+1;
x:=a;
for j:=i downto k+1 do
a:=a[j-1];
a[k]:=x;
end;

я что-то совсем разобраться не могу - уж очень мудрёно. Я бы действовал по рабоче-крестьянски: организовал второй массив да и перегнал бы в него элементы первого - сперва стоящие на четных, потом на нечетных позициях. Нет, я не утверждаю, что у Вас неправильно - просто пока понять алгоритм не могу. Кстати, исходное значение k не задано.
 
Да, и еще замечание - произведение p лучше взять в формате Real: это может быть очень большое число, которое в размер Integer не влезет.
 
Ошибка есть только не знаю где при вводе числа n больше 29 программа завершается .
 
все разобрался пока
 
Vladimir_S у меня и моего преподавателя возникли проблемы с выполнением 3 пункта не могли бы вы посмотреть в чём ошибка
 
Vladimir_S у меня и моего преподавателя возникли проблемы с выполнением 3 пункта не могли бы вы посмотреть в чём ошибка
Знаете... ну вот решительно не могу уловить смысла Вашего алгоритма. Поэтому всё, чем могу помочь - предложить свой вариант.

Вместо
Код:
a:array[1..100] of integer;
пишем
Код:
a,b:array[1..100] of integer;
Дальше выполняем пп 1,2, а затем:

Код:
k:=0;
for i:=1 to N do
 if (i mod 2)=1 then
  begin
   Inc(k);
   b[k]:=a[i];
  end;
for i:=2 to N do
 if (i mod 2)=0 then
  begin
   Inc(k);
   b[k]:=a[i];
  end;
a:=b;
Можно было бы конечно и покрасивее, в одном цикле, но тогда возникают заморочки с четностью числа N, так что я предпочел, как попроще.
 
Назад
Сверху