Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сгруппировать процедуры, выполн. одно и то только для разн массив 
:(
    Опции темы
digitech
Дата 25.12.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 1.4.2007

Репутация: нет
Всего: 1



Нельзя ли никак сгруппировать схожие процедуры, и оформить их в виде процедур с параметрами? 
Вот процедуры ввода, вывода, произвольного заполнения:
Код

procedure randomArrayA;         { произвольное заполнение массива A}
var i:integer;
begin
randomize;
for i:=1 to m do
  A[i]:=random(100)-random(50);
end;

procedure randomArrayB;         { произвольное заполнение массива B}
var i:integer;
begin
randomize;
for i:=1 to m do
  B[i]:=random(100)-random(50);
end;

Procedure enterArrayA;    { ввод элементов массива }
var i:integer;
begin
for i := 1 to m do
    Begin
    Write(' Введите элемент #',i,'  ');
    ReadLn(A[i]);
    end;
end;

Procedure enterArrayB;    { ввод элементов массива }
var i:integer;
begin
for i := 1 to m do
    Begin
    Write(' Введите элемент #',i,'  ');
    Readln(B[i]);
    end;
end;

Procedure writeArrayA;     { вывод содержимого массива А }
var i:integer;
begin
 for i :=1 to m do
 begin
Write(A[i],' ');
 end;
end;

Procedure writeArrayB;   { вывод содержимого массива В }
var i:integer;
begin
 for i :=1 to m do
 begin
Write(B[i],' ');
 end;
end;

Procedure writeArrayC;   { вывод содержимого массива C }
var i:integer;
begin
 for i :=1 to m do
 begin
Write(C[i],' ');
 end;
end;


Можно вот так сделать, чтобы, к примеру, выводить массив A      writeArray(A); {вывод массива A}  
типа такого что-нибудь?
PM MAIL   Вверх
volvo877
Дата 25.12.2007, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Код

Procedure enterArray(var Arr: array of integer);    { ввод элементов массива }
var i: integer;
begin
for i := 0 to m - 1 do
    Begin
    Write(' Введите элемент #',i + 1,'  ');
    ReadLn(Arr[i]);
    end;
end;
Остальные - аналогично...
PM MAIL   Вверх
digitech
Дата 22.1.2008, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 1.4.2007

Репутация: нет
Всего: 1



А как сделать процедуру с параметрами переменными для двумерного массива (матриц)?
Вот так не работает:
Код

Procedure ReadArray(massiv:array of integer; col,row:integer);
var i,g:integer;
begin
Writeln('Введите массив');
for i:=1 to col do
for g:=1 to row do
begin
Write('Элемент массива [',i,':',g,']');
Readln(massiv[i,g]);
end; end;

PM MAIL   Вверх
volvo877
Дата 22.1.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(digitech @  22.1.2008,  00:01 Найти цитируемый пост)
Вот так не работает:

Правильно, и не будет... Так можно передавать только одномерные массивы... Но можно чуть-чуть подкрутить, и оно заработает. Вот пример:

Код

procedure print(var arr: array of integer;
          const row, col: integer);

  function index(i, j: integer): integer;
  begin
    index := (i - 1) * col + (j - 1);
  end;
var i, j: integer;
begin
  for i := 1 to row do begin
    for j := 1 to col do write(arr[index(i, j)]:3);
    writeln;
  end;
end;

const
  arr: array[1 .. 2, 1 .. 3] of integer = (
    (1, 2, 3),
    (10, 20, 30)
  );

begin
  print(arr[1], 2, 3);
end.

PM MAIL   Вверх
digitech
Дата 23.1.2008, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 1.4.2007

Репутация: нет
Всего: 1



А что эта формула в функции делает. И как её вывели?
Код

function index(i, j: integer): integer;
  begin
    index := (i - 1) * col + (j - 1);
  end

Я понимаю что она передаёт строку/столбец массиву arr[index(i,j)], а почему именно через функцию, да и ещё вот так index[i,j]

Вобщем  я как-то не очень понял про функцию

Это сообщение отредактировал(а) digitech - 23.1.2008, 00:39
PM MAIL   Вверх
volvo877
Дата 23.1.2008, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Тебе надо из координат двумерного массива размером row на col получить порядковый номер элемента, считая слева - направо сверху - вниз (то есть, другими словами, в процедуру передается одномерный массив: исходный двумерный, "растянутый" строка за строкой: сначала col элементов первой строки, следом - еще col элементов второй, и так далее. Тебе надо по двумерным координатам вычислить, каким по счету будет этот элемент в одномерном массиве).

Как это сделать? Правильно, берем номер строки, отнимает от него 1 и умножаем на размер строки (т.о., посчитали, сколько элементов содержится в предыдущих строках...). Добавляем номер элемента в текущей строки, а поскольку индексация в одномерном массиве, передаваемом в процедуру, начинается с нуля (всегда!!! в случае открытого массива), то еще от всего этого отнимаем единицу...

А почему функция - чтобы минимизировать возможные изменения. Вот тебе сегодня надо работать с двумерным массивом, а завтра - понадобится одномерный. Поменяешь одну функцию, вычисляющую позицию элемента, и все будет так же работать. А послезавтра захочется работать с трехмерным массивом, и опять достаточно будет только изменить функцию, не прикасаясь к логике работы программы.
Цитата(digitech @  22.1.2008,  23:32 Найти цитируемый пост)
да и ещё вот так index[i,j]
Это ты у меня в программе где-то видел? Тогда покажи, где! У меня не было такого обращения к index, потому как это - функция, а не массив... Не надо приписывать мне то, что я не делал...

PM MAIL   Вверх
digitech
Дата 23.1.2008, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 1.4.2007

Репутация: нет
Всего: 1



Цитата(volvo877 @  23.1.2008,  01:22 Найти цитируемый пост)
Цитата(digitech @  22.1.2008,  23:32 )
да и ещё вот так index[i,j]

Это ты у меня в программе где-то видел? Тогда покажи, где! У меня не было такого обращения к index, потому как это - функция, а не массив... Не надо приписывать мне то, что я не делал...

Нет, я не приписаваю, просто не дописал, вот так у вас (arr[index(i, j)]). В след. раз буду дописывать
PM MAIL   Вверх
digitech
Дата 24.1.2008, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 1.4.2007

Репутация: нет
Всего: 1



А вот если используешь эту процедуру для одного массива и для другого, то оба массива получаются  одинаковы. Как можно исправить?
Код

Procedure enterArray(var Arr: array of integer);    
var i: integer;
begin
randomize;
for i := 0 to m - 1 do
        Arr[i]:=random(50);
end;


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0943 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.