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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2011, 19:31   #1
merch
Новичок
Джуниор
 
Регистрация: 16.05.2011
Сообщений: 16
По умолчанию [Pascal] Расстановка элементов в массиве

Доброго времени суток!

Прошу помочь с задачей:

В массиве X(3.5, -7.4, 1.7, 12.9, -5.6, 21.3, -8.6, 4.5, 0.6, 2.5) переставить элементы так, чтобы сначала стояли отридцательные элемены, а затем положительные. Группу положительных элементов расставьте в убывающем порядке. Напечатать исходный и измененный массивы.

Человек помог написать программу такого рода:
Код:
const
   CSize = 10;

type
   TArray = array[1..CSize] of real;

{-----------------------------------------------}
procedure ArrayCopy(theFromArray: TArray; var theToArray: TArray);
var
   i: integer;
begin
   for i:= 1 to CSize do
      theToArray[i]:= theFromArray[i];
end;
{-----------------------------------------------}
procedure ArrayPrint(theArray: TArray);
var
   i: integer;
begin
  for i:= 1 to CSize do
     write(theArray[i]:2:1, ' ');
  writeln;
end;
{-----------------------------------------------}
procedure Swap(var theFirst, theSecond: real);
var
   buff: real;
begin
   buff:= theFirst;
   theFirst:= theSecond;
   theSecond:= buff;
end;
{-----------------------------------------------}
procedure ArrayFirstNegativeNumber(var theArray: TArray);
var
   L, R: integer;
begin
   L:= 1;
   R:= CSize;

   while (L < R) do
   begin
      while ((L < R) and (theArray[L] < 0)) do
         inc(L);
      while ((L < R) and (0 <= theArray[R])) do
         dec(R);
      if (L < R) then
         Swap(theArray[L], theArray[R]);
   end;
end;
{-----------------------------------------------}
procedure ArraySortByDiminution(var theArray: TArray; thePosBegin, thePosEnd: integer);
var
   i, j: integer;
begin
   for i:= thePosBegin to thePosEnd do
      for j:= i to thePosEnd do
         if (theArray[i] < theArray[j]) then
            Swap(theArray[i], theArray[j]);
end;
{-----------------------------------------------}
function FindFirstPositiveNumber(theArray: TArray): integer;
var
   i: integer;
begin
   i:= 1;
   while ((i <= CSize) and (theArray[i] < 0)) do
      inc(i);

   if (i <= CSize) then
      FindFirstPositiveNumber:= i
   else
      FindFirstPositiveNumber:= 0;
end;
{-----------------------------------------------}

const
   CArr: TArray = (3.5, -7.4, 1.7, 12.9, -5.6, 21.3, -8.6, 4.5, 0.6, 2.5);

var
   arr: TArray;
   pos: integer;
begin
   {Копируем константные значения в массив}
   ArrayCopy(CArr, arr);

   {Печатаем на экран исходный массив}
   ArrayPrint(arr);

   {Перекидыаем а начало массива отрицательные элементы}
   ArrayFirstNegativeNumber(arr);

   {Ищем в массиве первое вхождение положительного числа}
   pos:= FindFirstPositiveNumber(arr);

   {В том случае если положительное число найдено, то}
   if (pos <> 0) then
      {Сортируем массив по убыванию с начала первого
       входжения положительного числа и до конца}
      ArraySortByDiminution(arr, pos, CSize);

   {Печатаем на экран исходный массив}
   ArrayPrint(arr);
end.
Все конечно работает, но должно выходить все как то проще.

Вот то что делал я:

Код:
Program lab_3;
uses crt;
const n=10;
a:array[1..n] of real=(3.5,-7.4,1.7,12.9,-5.6,21.3,-8.6,4.5,0.6,2.5);


var j,i,k:integer;

{-----------------------------------------------}
 
 procedure Swap(var g1, g2: real);
var
   buff: real;
begin
   buff:= g1;
   g1:= g2;
   g2:= buff;
end;

{-----------------------------------------------}

begin
for i:=1 to 10 do
if a[i]<0 then write(' ',a[i]);

begin
   for i:= 1 to n do
      for j:= i to n do
         if (a[i] < a[j]) then
            Swap(a[i], a[j]);
            
            end;
            end;

end.
В моем случае выдается ошибка : Параметр не может передаваться по ссылке ( параметр a[i] )

help!
merch вне форума Ответить с цитированием
Старый 16.05.2011, 19:40   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
Параметр не может передаваться по ссылке
потому что массив у тя константа) а в константе элементы не поменяешь)
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 16.05.2011, 19:42   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Массив мб после var надо объявлять, а не перед?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.05.2011, 19:55   #4
merch
Новичок
Джуниор
 
Регистрация: 16.05.2011
Сообщений: 16
По умолчанию

Ага, а как я задам нужный мне массив, если он будет висеть в разделе переменных?

Программа выдает ошибку при присваивании в разделе переменных a:array[1..n] of real=(3.5,-7.4,1.7,12.9,-5.6,21.3,-8.6,4.5,0.6,2.5);

Как присвоить, подскажите пожалуста
merch вне форума Ответить с цитированием
Старый 16.05.2011, 19:57   #5
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

для этого в проге №1 из поста 1 есть
Код:
procedure ArrayCopy(theFromArray: TArray; var theToArray: TArray);
она копирует константный массив в переменный)
Цитата:
можно ли присвоить значения массиву без использования процедур?
Конечно)
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"

Последний раз редактировалось Mad_Cat; 16.05.2011 в 20:16.
Mad_Cat вне форума Ответить с цитированием
Старый 16.05.2011, 20:15   #6
merch
Новичок
Джуниор
 
Регистрация: 16.05.2011
Сообщений: 16
По умолчанию

Это понял, с этим разобрался, вопрос стоит такой: можно ли присвоить значения массиву без использования процедур?
merch вне форума Ответить с цитированием
Старый 16.05.2011, 20:34   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Можно, конечно (если процедуры не рекурсивные): вставляете то, что делают процедуры в вашу программу (но скорее всего получится довольно много, ибо они пару раз вызывают друг друга).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.05.2011, 20:35   #8
merch
Новичок
Джуниор
 
Регистрация: 16.05.2011
Сообщений: 16
По умолчанию

Пытался сейчас делать, вышла такая бурда:

Код:
Program lab_3;
uses crt;
const n=10;
type mass = array[1..n] of real;

var j,i,k:integer;


{-----------------------------------------------}

procedure ArrayCopy(theFromArray: mass; var theToArray: mass);
var
   i: integer;
begin
   for i:= 1 to n do
      theToArray[i]:= theFromArray[i];
end;
{-----------------------------------------------}
 
 procedure Swap(var g1, g2: real);
var
   buff: real;
begin
   buff:= g1;
   g1:= g2;
   g2:= buff;
end;

{-----------------------------------------------}
const
   CArr: mass = (3.5, -7.4, 1.7, 12.9, -5.6, 21.3, -8.6, 4.5, 0.6, 2.5);
var arr:mass;
begin

ArrayCopy(CArr, arr);



for i:=1 to 10 do
if Arr[i]<0 then write(' ',Arr[i]);

   for i:= 1 to n do
      for j:= i to n do
         if (Arr[i] < Arr[j]) then
            Swap(Arr[i], Arr[j]);
            
writeln(Arr[i])
            
            end.
Выводит только половину массива измененного...

в этом месте что то напорол походу

Код:
for i:= 1 to n do
      for j:= i to n do
         if (Arr[i] < Arr[j]) then
            Swap(Arr[i], Arr[j]);
конкретно в этой строке

Код:
for j:= i to n do

Последний раз редактировалось merch; 16.05.2011 в 20:48.
merch вне форума Ответить с цитированием
Старый 16.05.2011, 21:34   #9
merch
Новичок
Джуниор
 
Регистрация: 16.05.2011
Сообщений: 16
По умолчанию

Ребят ну помогите хоть немного, может кто знает как методом "пузырька" расставлять элементы в массиве?
merch вне форума Ответить с цитированием
Старый 16.05.2011, 21:36   #10
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Пузырек - паскаль
зачем ты сортируешь весь массив полностью7
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"

Последний раз редактировалось Mad_Cat; 16.05.2011 в 21:39.
Mad_Cat вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В массиве из n элементов подсчитать количество четырёд идущих подряд одинаковых элементов ( Delphi7 ) Анастасья Помощь студентам 1 31.03.2011 19:23
Четность элементов в массиве Pascal Brian Spilner Помощь студентам 8 02.08.2010 21:22
В массиве из п элементов много совпадающих элементов. Найти количество различных элементов Strax Фриланс 11 12.06.2010 20:13
В массиве A, состоящем из 10 элементов, подсчитать количество положительных элементов Alex61 Помощь студентам 5 16.05.2009 23:06
В одномерном массиве, состоящем из n вещественных элементов, вычислить сумму элементов массива HazelHen Общие вопросы C/C++ 2 29.03.2009 15:16