Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 29.03.2012, 16:13   #1 (permalink)
Шипа
Новичок
 
Регистрация: 01.12.2011
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Question Пытаюсь разобраться с массивами в Free Pascal IDE

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

Старый 29.03.2012, 16:13
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Похожие темы встречались на нашем форуме, посмотрите

Помогите решить три задачи в Free Pascal
Pascal. Работа с одномерными массивами
Помогите с матрицами по Free Pascal
Пожалуйста, помогите с программой. Free Pascal
Помогите решить задачу в Free Pascal
Помогите решить задачу в Free Pascal

Старый 29.03.2012, 16:28   #2 (permalink)
Шипа
Новичок
 
Регистрация: 01.12.2011
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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.
Шипа вне форума   Ответить с цитированием
Старый 29.03.2012, 16:46   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

И что - не работает?
По тексту - вроде до перегруппировки (чет-нечет) всё правильно, за исключением того, что нужно предусмотреть ситуации, когда в массиве один ноль или нет нулей вовсе.
А вот тут:
Цитата:
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   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Да, и еще замечание - произведение p лучше взять в формате Real: это может быть очень большое число, которое в размер Integer не влезет.
Vladimir_S вне форума   Ответить с цитированием
Старый 29.03.2012, 16:57   #5 (permalink)
Шипа
Новичок
 
Регистрация: 01.12.2011
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 29.03.2012, 17:04   #6 (permalink)
Шипа
Новичок
 
Регистрация: 01.12.2011
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

все разобрался пока
Шипа вне форума   Ответить с цитированием
Старый 29.03.2012, 19:25   #7 (permalink)
Шипа
Новичок
 
Регистрация: 01.12.2011
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Vladimir_S у меня и моего преподавателя возникли проблемы с выполнением 3 пункта не могли бы вы посмотреть в чём ошибка
Шипа вне форума   Ответить с цитированием
Старый 29.03.2012, 20:12   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Шипа Посмотреть сообщение
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, так что я предпочел, как попроще.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.