Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2012, 20:22   #1
Brick029
 
Регистрация: 02.04.2012
Сообщений: 5
По умолчанию Задача с динамическим массивом Pascal

В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) Сумму элементов массива с нечетными номерами.
2) Сумму элементов массива, расположенных между первым и последним отрицательным элементом.
3) Сжать массив, удалив из него все элементы, модуль которых не превышает 1.
4) Освободившиеся в конце массива элементы заполнить нулями.
Вот что наделал, с типами никак не разберусь и не получается сделать последний шаг, объясните как, это сделать.
Код:
program 123;
type a=array of real;
var
 z:a;
 i,j,n,otr1,otr2,k: integer;
 s1,s2: real;
begin
  //определение размерности массива
  writeln('vvedite coli4estvo 4isel');
  readln(n); setlength(z,n);
  //заполнение массива
  writeln('vvedite 4isla');
  for i := 0 to n-1 do
    readln(z[i]);
  s1 := 0;
  //Сумма элементов на нечетных местах
  for i := 0 to n-1 do
    if i mod 2 = 0 then s1 := s1 + z[i];
  //Первый отрицательный элемент
  for i := 0 to n-1 do
    if z[i] < 0 then
      begin
        otr1 := i; break;
      end;
  //Второй отрицательный элемент
  for i := n-1 downto 0 do
    if z[i] < 0 then
      begin
        otr2 := i ; break;
      end;
  s2 := 0;
  //Сумма элементов между отрицательными элементами
  for i := otr1 + 1 to otr2 - 1 do s2 := s2 + z[i];
    writeln;
  writeln('S1=',s1:0:2);
  writeln('S2=',s2:0:2);

  //Сжимаем массив
  for i:=0 to n-1 do
  if abs(z[i])<=1 then
begin
for j:=i to n-1 do
z[j]:=z[j+1];
z[n] := 0;
    end;
    for i := 0 to n - 1 do
    write(' ',z[i]:2:1);
    readln;
end.
Так как массив динамический, который от 0 до n-1, это вызывает у меня некие проблемы, в частности не могу сделать последние два шага 3 и 4. Буду очень благодарен если поможете и немного объясните, хочеться разобраться... От более удобных переделок в коде тоже не откажусь, но это не столь важно.
Brick029 вне форума Ответить с цитированием
Старый 02.04.2012, 20:33   #2
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Код:
  Ind := 0;
  //Сжимаем массив
  for i:=0 to n-1 do
  if abs(z[i])<=1 then
    begin
      z[IND] := z[i];
      Ind := Ind + 1;
    end;

  for i := Ind to n - 1 do
    z[i] := 0;
либо вовсе:
Код:
  Ind := 0;
  //Сжимаем массив
  for i:=0 to n-1 do
  begin
    Value := z[i];
    z[i] := 0;
  if abs(Value)<=1 then
    begin
      z[IND] := Value;
      Ind := Ind + 1;
    end;
  end;
GreenWizard вне форума Ответить с цитированием
Старый 02.04.2012, 20:55   #3
Brick029
 
Регистрация: 02.04.2012
Сообщений: 5
По умолчанию

Вроде работает, получилось в итоге как-то так, может еще что переделать? посоветуйте, а то препод больно придирчивый)))
Код:
program Project4nep;
type a=array of real;
var
 z:a;
 i,Ind,n,otr1,otr2,k: integer;
 s1,s2: real;
begin
  //определение размерности массива
  writeln('vvedite coli4estvo 4isel');
  readln(n); setlength(z,n);
  //заполнение массива
  for i := 0 to n-1 do
   begin
    z[i]:=random(50)/( random(50)+1)-random(10);
    write(z[i]:8:2);
  end;
  s1 := 0;
  //Сумма элементов на нечетных местах
  for i := 0 to n-1 do
    if i mod 2 = 0 then s1 := s1 + z[i];
  //Первый отрицательный элемент
  for i := 0 to n-1 do
    if z[i] < 0 then
      begin
        otr1 := i; break;
      end;
  //Второй отрицательный элемент
  for i := n-1 downto 0 do
    if z[i] < 0 then
      begin
        otr2 := i ; break;
      end;
  s2 := 0;
  //Сумма элементов между отрицательными элементами
  for i := otr1 + 1 to otr2 - 1 do s2 := s2 + z[i];
    writeln;
  writeln('S1=',s1:0:2);
  writeln('S2=',s2:0:2);

Ind := 0;
  //Сжимаем массив
  for i:=0 to n-1 do
  if abs(z[i])>=1 then
    begin
      z[IND] := z[i];
      Ind := Ind + 1;
    end;

  for i := Ind to n - 1 do
    z[i] := 0;
      writeln('Array after pack');

  //Печатаем массив
  for i := 0 to n-1 do write(z[i]:8:2);
  readln;
end.
И СПАСИБО ЗА ПОМОЩЬ)))

Последний раз редактировалось Brick029; 02.04.2012 в 20:58.
Brick029 вне форума Ответить с цитированием
Старый 02.04.2012, 21:24   #4
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

1) имена дать вменяемые.. не "a = array....", a "AReal = array of Real"... не otr, a "first_neg/last_neg"
2) код:
Код:
  //Первый отрицательный элемент
  for i := 0 to n-1 do
    if z[i] < 0 then
      begin
        otr1 := i; break;
      end;
  //Второй отрицательный элемент
  for i := n-1 downto 0 do
    if z[i] < 0 then
      begin
        otr2 := i ; break;
      end;
я бы заменил на:
Код:
otr1 := 0;
while (otr1 < n) and (z[otr1] > 0) do
  otr1 := otr1 + 1;

otr2 := n - 1;
while (otr2 >= 0) and (z[otr2] > 0) do
  otr2 := otr2 - 1;
короче, красивее и "внушает трепет" =)
3) форматирование... если бы я был преподом, то за каждый пробел лишний/недостающий убивал бы)) ладно ещё тут, на форуме, но в исходниках должно быть идеально всё) не "х+1", а "х + 1"... не "write(a,b);", a "write(a, b);".... частая ошибка: "x + y * z"... надо "x + (y * z)", даже если готов жизнью поклясться, что приоритеты там и всё верно посчитает!

Последний раз редактировалось GreenWizard; 02.04.2012 в 21:34.
GreenWizard вне форума Ответить с цитированием
Старый 02.04.2012, 21:29   #5
Brick029
 
Регистрация: 02.04.2012
Сообщений: 5
По умолчанию

GreenWizard
Спасибо за совет)))
Brick029 вне форума Ответить с цитированием
Старый 02.04.2012, 21:33   #6
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

не за что)
я там добавил п.3
GreenWizard вне форума Ответить с цитированием
Старый 02.04.2012, 21:36   #7
Brick029
 
Регистрация: 02.04.2012
Сообщений: 5
По умолчанию

Да, за это тоже пилит))) я уже все подредактировал))) Огромное спасибо))) Посмотрим что скажет препод))))

Все, спасибо, тему можно закрыть

Последний раз редактировалось Brick029; 03.04.2012 в 20:31.
Brick029 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с динамическим массивом на С 4eburator Помощь студентам 4 30.09.2010 17:12
Проблема с динамическим массивом zumm Общие вопросы Delphi 3 09.07.2010 20:20
Управление динамическим массивом abr_question Общие вопросы C/C++ 12 18.12.2009 22:01
Проблема с динамическим массивом TheKnyazz Общие вопросы C/C++ 3 28.04.2009 18:37
проблема с динамическим массивом romeo007.06 Общие вопросы Delphi 1 03.04.2008 20:18