Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Пытаюсь разобраться с массивами в Free Pascal IDE (http://www.tehnari.ru/f41/t71230/)

Шипа 29.03.2012 16:13

Пытаюсь разобраться с массивами в Free Pascal IDE
 
Пожалуйста помогите с написать программу выполняющую :
"В одномерном массиве, состоящем из п целочисленных элементов, вычислить:
1. Номер максимального элемента массива.
2. Произведение элементов массива, расположенных между первым и вторым нулевыми элементами.
3. Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечетных позициях, а во второй половине — элементы, стоявшие в четных позициях."
Если можно приложите к своим действиям комментарий чтоб мне было проще разобраться что от куда

Шипа 29.03.2012 16:28

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[i]:=random(20)-10;
Write(a[i],' ');
end;
Writeln;
max:=a[1];
imax:=1;
for i:=2 to n do
if a[i]>max then
begin
max:=a[i];
imax:=i;
end;
for i:=1 to n do
if a[i]=0 then
begin
n1:=i;
break;
end;
for i:=n1+1 to n do
if a[i]=0 then
begin
n2:=i;
break;
end;
p:=1;
for i:=n1+1 to n2-1 do
p:=p*a[i];
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[i];
for j:=i downto k+1 do
a[i]:=a[j-1];
a[k]:=x;
end;
for i:=1 to n do
Write(a[i],' ');
Readln;
end.

Vladimir_S 29.03.2012 16:46

И что - не работает?
По тексту - вроде до перегруппировки (чет-нечет) всё правильно, за исключением того, что нужно предусмотреть ситуации, когда в массиве один ноль или нет нулей вовсе.
А вот тут:
Цитата:

for i:=1 to n do
if i mod 2<>0 then
begin
k:=k+1;
x:=a[i];
for j:=i downto k+1 do
a[i]:=a[j-1];
a[k]:=x;
end;
я что-то совсем разобраться не могу - уж очень мудрёно. Я бы действовал по рабоче-крестьянски: организовал второй массив да и перегнал бы в него элементы первого - сперва стоящие на четных, потом на нечетных позициях. Нет, я не утверждаю, что у Вас неправильно - просто пока понять алгоритм не могу. Кстати, исходное значение k не задано.

Vladimir_S 29.03.2012 16:57

Да, и еще замечание - произведение p лучше взять в формате Real: это может быть очень большое число, которое в размер Integer не влезет.

Шипа 29.03.2012 16:57

Ошибка есть только не знаю где при вводе числа n больше 29 программа завершается .

Шипа 29.03.2012 17:04

все разобрался пока

Шипа 29.03.2012 19:25

Vladimir_S у меня и моего преподавателя возникли проблемы с выполнением 3 пункта не могли бы вы посмотреть в чём ошибка

Vladimir_S 29.03.2012 20:12

Цитата:

Сообщение от Шипа (Сообщение 708939)
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, так что я предпочел, как попроще.


Часовой пояс GMT +4, время: 05:04.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.