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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2019, 15:39   #1
Loodzer
Новичок
Джуниор
 
Регистрация: 23.02.2019
Сообщений: 1
Злость Использование процедуры

Добрый день! Два дня пытаюсь разобраться в процедурах (задолбался) может кто нибудь помочь ? Задание:
Даны массивы В(16), С(20) целых чисел.Найти произведение и количество его четных элементов. Для вычисления произведения и количества использовать процедуру.
Код:
const
  n = 16; m = 20;

var
  B: array[1..n] of integer;
  C: array[1..m] of integer; 
  i, j, a, z, G: integer;

procedure PR(r: integer; var k: integer);

begin
  k := r * 1;
  
end;

begin
  for i := 1 to n do
  begin
    B[i] := random(1, 4);
    write(B[i], '(', i, ')', ' ');
  end;
  writeln;
  for i := 1 to m do
  begin
    C[i] := random(1, 4);
    write(C[i], '(', i, ')', ' ');
  end;
  writeln;
  for i := 1 to n do
    if B[i] mod 2 = 0 then 
    begin
      j := j + 1;
        PR(B[i], z);
        G:=z+G;    
    end;
  write('Масси B', '  ', 'колличество четных элементов':2, ':', j, '  ', 'Произведение', ' :', z);
  writeln;
  j:=0;
  for i := 1 to m do
    if C[i] mod 2 = 0 then 
    begin
      j := j + 1;
        PR(C[i],z);
        G :=z+G;
    end;
  write('Масси C', '  ', 'колличество четных элементов':2, ':', j, '  ', 'Произведение', ' :', z);
end.
Loodzer вне форума Ответить с цитированием
Старый 23.02.2019, 18:31   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Например, так:
Добавим тип
Код:
const
      n = 16; m = 20;
Type TMas = array[1..m] of integer; {по бОльшему}
Процедуру, которая считает ответ, можно сделать так:
Код:
procedure PR(var mas: TMas; k: integer; var sum, prz: integer);
var i: integer;
begin
   sum := 0; prz := 1;
   for i := 1 to k do
   begin
      if mas[i] mod 2 = 0 then 
      begin
         sum := sum + 1;
         prz := prz * mas[i];
      end;
   end;
end;
Вызов:
PR(B, n, sum, prz);
B - один из массивов, n - число элементов массива, sum и prz - возвращаемые значения: число чётных элементов и их произведение.

PS: Не проверял, но идея должна быть понятой.
var при описании первого параметра означает, что в процедуру будет передан адрес массива.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 24.02.2019, 10:58   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
var при описании первого параметра означает, что в процедуру будет передан адрес массива.
Если параметром яввлятся массив, то по любому в процедуру передается его адрес. Пример:

Код:
type mas = array[1..10] of integer ;
 
var i:integer;
    arr:mas;
procedure outmas(arg1:mas; n:integer) ;
begin
   writeln (arr[n])
end ;

begin
   for i := 1 to 10 do arr[i] := i*i ;
   outmas(arr,7) ;
   readln(i)
end.
49

Последний раз редактировалось digitalis; 24.02.2019 в 11:03.
digitalis вне форума Ответить с цитированием
Старый 24.02.2019, 11:13   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Если параметром яввлятся массив, то по любому в процедуру передается его адрес
Код:
procedure outmas(arg1:mas; n:integer) ;
begin
   arr[n]:=33;
   writeln (arr[n])
end ;
И все равно 49, так что адрес, но не того массива, а его копии
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.02.2019, 11:19   #5
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Можно еще проще сделать:
Код:
procedure PR(mas: array of integer; var sum, prz: integer);
var i: integer;
begin
   sum := 0; prz := 1;
   for i := Low(mas) to High(mas) do
   begin
      if mas[i] mod 2 = 0 then
      begin
         sum := sum + 1;
         prz := prz * mas[i];
      end;
   end;
end;

var B: array of integer;
    C: array of integer;
    i, sum, prz: integer;
begin
   Randomize;
   SetLength(B,16);
   for i := Low(B) to High(B) do
   begin
      B[i] := 1+random(10);
      write('(', i, ') = ', B[i], '  ');
   end;
   writeln;
   SetLength(C,20);
   for i := Low(C) to High(C) do
   begin
      C[i] := 1+random(10);
      write('(', i, ') = ', C[i], '  ');
   end;
   writeln;
   PR(B,sum,prz);
   Writeln('sum = ',sum,'; prz = ',prz);
   PR(C,sum,prz);
   Writeln('sum = ',sum,'; prz = ',prz);
   Readln;
end.
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 24.02.2019, 18:15   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Аватар
Действительно. "Попробовали - убедились" © О.Генри
Но в #2 массив используется для чтения, так что без разницы. И даже нет риска случайно "задеть плечом" что-нибудь в исходном массиве. Плата - накладные расходы на копирование массива.

Последний раз редактировалось digitalis; 24.02.2019 в 18:32.
digitalis вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование процедуры DrawGlassText kholoshchak Общие вопросы Delphi 0 09.10.2012 15:46
Использование процедуры в dll medved6216 Общие вопросы Delphi 2 10.10.2011 15:14
Использование имени процедуры в качестве параметра другой процедуры Alexey355 Помощь студентам 1 23.04.2011 13:59
Использование asm процедуры в Delphi Alex1991 Общие вопросы Delphi 4 08.02.2011 12:50