Старый 06.03.2012, 12:33   #1   
Форумец
 
Сообщений: 119
Регистрация: 01.06.2010
Возраст: 31

Brick вне форума Не в сети
Помогите с задачей на паскале

В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) Сумму элементов массива с нечетными номерами.
2) Сумму элементов массива, расположенных между первым и последним отрицательным элементом.
3) Сжать массив, удалив из него все элементы, модуль которых не превышает 1.
Освободившиеся в конце массива элементы заполнить нулями.
Вот что наделал, с типами никак не разберусь и не получается сделать последний шаг, объясните как, это сделать.

program Project2;
uses
SysUtils;
type a=array of real;
var
z:a;
i,n,otr1,otr2,p: integer;
s1,s2: real;
begin
//определение размерности массива
writeln('vvedite coli4estvo 4isel');
readln(n); setlength(z,n);
//заполнение массива
writeln('vvedite 4isla');
for i := 1 to n do
readln(z[i]);
s1 := 0;
//Сумма элементов на нечетных местах
for i := 1 to n do
if i mod 2 <> 0 then s1 := s1 + z[i];
//Первый отрицательный элемент
for i := 1 to n do
if z[i] < 0 then
begin
otr1 := i; break;
end;
//Второй отрицательный элемент
for i := n downto 1 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);
readln;
for i:=0 to n-1 do
if abs(z[i])<=1 then ....................
end.
  Ответить с цитированием
Старый 06.03.2012, 14:19   #2   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Цитата:
Сообщение от Brick Посмотреть сообщение
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) Сумму элементов массива с нечетными номерами.
2) Сумму элементов массива, расположенных между первым и последним отрицательным элементом.
3) Сжать массив, удалив из него все элементы, модуль которых не превышает 1.
Освободившиеся в конце массива элементы заполнить нулями.
Вот что наделал, с типами никак не разберусь и не получается сделать последний шаг, объясните как, это сделать.
Код:
program Soft;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
  n=10;

var
  arr:array[1..n] of double;
  sum:double;
  i, j, first, last:integer;
begin
  randomize();
  writeln('Source array');

  //Заполняем массив
  for I := 1 to n do
  begin
    arr[i]:=random(50)/( random(50)+1)-random(10);
    write(arr[i]:8:2);
  end;

  //Получаем сумму элементов стоящих на нечётных позициях
  j:=1; sum:=0;
  while j<=n do
  begin
    sum:=sum+arr[j];
    j:=j+2;
  end;
  writeln;
  writeln('The sum of elements with odd positions = ',sum:8:2);

  //ищем первый отрицательный элемент
  first:=1;
  while (first<=n) and (arr[first]>=0) do inc(first);

  //ищем последний отрицательный элемент
  last:=n;
  while (last>0) and (arr[last]>=0) do dec(last);

  writeln('First elem = ',first,' last element = ',last);
  if last>first then
  begin
    i:=first+1;
    sum:=0;
    while i<last do
    begin
      sum:=sum+arr[i];
      i:=i+1;
    end;
    writeln('Sum between first and last negative elements = ',sum:8:2);
  end
  else
    writeln('Sum = 0');

  //Собственно сжимаем массив
  i:=1;
  last:=n;
  while i<=last do
  begin
    if abs(arr[i])<=1 then
    begin
      //Сдвигаем
      for first := i to last-1 do
        arr[first]:=arr[first+1];
      arr[last]:=0.0;
      dec(last)
    end;
    i:=i+1;
  end;
  writeln('Array after pack');

  //Печатаем массив
  for I := 1 to n do write(arr[i]:8:2);
  readln;
end.
Как-то так...Если что - пиши

Последний раз редактировалось Hopkroft; 06.03.2012 в 17:50.
  Ответить с цитированием
Старый 06.03.2012, 14:28   #3   
como estas?
 
Сообщений: 133
Регистрация: 23.06.2007
Возраст: 35

Luko_Brazi вне форума Не в сети
Если я не ошибаюсь, то в последнем шаге находишь элемент по модулю больше единицы, после него все элементы двигаешь на позицию вперед и последнему элементу присваиваешь ноль.
if abs(z[i])<=1 then
begin
for j:=i to n-1 do
z[j]:=z[j+1];
z[n] := 0;
end;
Вроде так, соответственно это внутри ещё одного цикла. А с типами что?
ЗЫ. У авторы выше получче код)
  Ответить с цитированием
Старый 06.03.2012, 14:40   #4   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Brick, что тебе с типами не понятно?
В таких прогах(учебных) лучше делай заполнение по рандому или с "заготовками" - что-бы на ввод много времени не тратить.
Ручной ввод нужен если что-то конкретное вводишь или когда отлаживаешь
Ну и смекалку проявляй. Зачем тебе пробегаться по всему массиву в 1-ом задании если тебе всё равно только элементы с нечётными индексами нужны.
  Ответить с цитированием
Старый 06.03.2012, 21:47   #5   
Форумец
 
Сообщений: 119
Регистрация: 01.06.2010
Возраст: 31

Brick вне форума Не в сети
Преподаватель придирается, спасибо, завтра попробую переделать задачку, отпишусь. С типами разобрался, динамический массив немного с толку сбивал, так как я раньше о нем не знал, а преподаватель сказал делать через него.
  Ответить с цитированием
Старый 06.03.2012, 22:42   #6   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Там переделывать немного.
Выделил память.
Заполнил по рандому или вручную.
сделал так что-бы все обращения к массиву начинались с 0 а не с 1.
под конец освободил память
тебе работы на 10-15 минут.
справишься!
  Ответить с цитированием
Старый 09.03.2012, 14:46   #7   
Форумец
 
Сообщений: 119
Регистрация: 01.06.2010
Возраст: 31

Brick вне форума Не в сети
Код:
program Project4nep;
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, но чет недопетрю, никак немогу сделать последний шаг, туплю, хотя наверняка все просто

Последний раз редактировалось Spectator; 09.03.2012 в 15:21.
  Ответить с цитированием
Старый 09.03.2012, 15:14   #8   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Можно переоформить с тегом [code]? Если здесь вдруг, например, где-то пропущен begin/end, при таком форматировании этого никто не увидит.
  Ответить с цитированием
Старый 09.03.2012, 15:19   #9   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,860
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Что-то мне лень сегодня думать, но попробуй тут:

//Сжимаем массив
for i:=0 to n-1 do

сделать цикл до n

и во вложенном цикле тоже с границами поэкспериментируй. Ошибка наверняка с этим связана.

Цитата:
Сообщение от silly Посмотреть сообщение
Можно переоформить с тегом [code]? Если здесь вдруг, например, где-то пропущен begin/end, при таком форматировании этого никто не увидит.
Я отредактировал.

2 Brick: пользуйтесь тэгом CODE. Когда вставляете текст программы, обрамляйте его тэгами, которые написал silly. Нажмите кнопку "редактировать" на своем сообщении, которое я поправил, и посмотрите - как именно это делается.

Последний раз редактировалось Spectator; 09.03.2012 в 15:37.
  Ответить с цитированием
Старый 09.03.2012, 15:38   #10   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Кстати, во избежание дальнейшей путаницы, здесь 0 — начало массива, n - 1 — последний элемент. Строки z[j]:=z[j+1]; и z[n] := 0; надо соответственно исправить.
  Ответить с цитированием
Старый 09.03.2012, 15:47   #11   
Форумец
 
Аватар для Spectator
 
Сообщений: 39,860
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от silly Посмотреть сообщение
Кстати, во избежание дальнейшей путаницы, здесь 0 — начало массива, n - 1 — последний элемент. Строки z[j]:=z[j+1]; и z[n] := 0; надо соответственно исправить.
Я очень давно (со студенческой скамьи) не программировал на Pascal, но, насколько я помню по умолчанию там границы от 1 до n, а не от 0 до n-1, как в сях. Разве нет?
И точно помню что границы можно указывать явно при объявлении. Лучше это сделать, чтобы было наверняка известно - в каких пределах индексы изменяются.
  Ответить с цитированием
Старый 09.03.2012, 16:20   #12   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
В iso pascal, если я ничего не путаю, есть только статические массивы, в них действительно можно использовать произвольные числа (не только 0 и 1) для начального индекса и выход за пределы вроде как тоже проверяется. Здесь используются динамические массивы из дельфей, эквивалентные сишным.
  Ответить с цитированием
Старый 09.03.2012, 18:40   #13   
Форумец
 
Сообщений: 18
Регистрация: 13.07.2010

spirochaete вне форума Не в сети
http://codepaste.ru/9615/
  Ответить с цитированием
Старый 09.03.2012, 18:52   #14   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Цитата:
Сообщение от spirochaete Посмотреть сообщение
Здесь реализована смена найденного и соответствующего по счету элемента с конца местами, должен быть сдвиг. И, да, http://www.freepascal.org/docs-html/...setlength.html .
  Ответить с цитированием
Старый 09.03.2012, 20:19   #15   
Форумец
 
Сообщений: 18
Регистрация: 13.07.2010

spirochaete вне форума Не в сети
http://codepaste.ru/9626/

Последний раз редактировалось spirochaete; 09.03.2012 в 22:23.
  Ответить с цитированием
Старый 09.03.2012, 20:48   #16   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 35

silly вне форума Не в сети
Мне кажется, я четко написал, что в динамическом массиве нумерация идет с 0. Еще чуть выше об этом написал Hopkroft. В документации функции SetLength написано то же самое:
Цитата:
In the case of a dynamical array A, setlength sets the number of elements. The elements are numbered from index 0, so the count runs from 0 to Len-1. If Zero is specified, the array is cleared.

Последний раз редактировалось silly; 09.03.2012 в 22:58.
  Ответить с цитированием
Старый 09.03.2012, 23:36   #17   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Brick, я тебе выслал кусок отлаженного кода!
Теперь твоя задача была переделать её для работы с динамическим массивом. Зачем ты туда свой первоначальный код пихаешь?
Я про этот ужасный кусок...
Цитата:
//Сумма элементов на нечетных местах
for i := 0 to n-1 do
if i mod 2 = 0 then s1 := s1 + z[i];
Написал же код который решает твои задачи. Плюс сделал его так, что препод(адекватный), не придерётся. А ты опять свой ужасный код пихаешь и просишь что-бы в нём разобрались!
Тебе не стыдно?
P.S. переделай тот кусок который я тебе прислал. по крайней мере он работает

Последний раз редактировалось Hopkroft; 10.03.2012 в 20:25.
  Ответить с цитированием
Старый 09.03.2012, 23:37   #18   
Registered User
 
Сообщений: 1,114
Регистрация: 23.06.2007
Возраст: 56

Hopkroft вне форума Не в сети
Цитата:
Сообщение от Spectator Посмотреть сообщение
Я очень давно (со студенческой скамьи) не программировал на Pascal, но, насколько я помню по умолчанию там границы от 1 до n, а не от 0 до n-1, как в сях. Разве нет?
И точно помню что границы можно указывать явно при объявлении. Лучше это сделать, чтобы было наверняка известно - в каких пределах индексы изменяются.
Это динамический массив, в нём номерация от 0.
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind