Как передать массив в функцию паскаль
Перейти к содержимому

Как передать массив в функцию паскаль

  • автор:

Использование массивов и функций в качестве формального параметра.

Формальным параметром функции может быть не только переменная скалярного типа, но и идентификатор переменной структурированного типа данных.

Использование массива в качестве параметра.

Пример 3. Массивы X(k), Y(m), Z(n) представляют собой три выборки значений случайной величины из общей генеральной совокупности. Требуется для каждой из трех выборок X, Y и Z вычислить их эмпирическую среднюю М и несмещенную дисперсию D.
Для решения этой задачи нужно запрограммировать две групповые пользовательские функции Avg и VarD, которые описываются с помощью формул:

podprogrammih.

Функции Avg и VarD имеют в качестве параметра имя массива, содержащего значения случайной величины и объем выборки.

podprogrammih.

Для описания этого примера понадобилось целых три структурограммы, однако они просты, наглядны, компактны и легки для понимания. Для составления текста программы сделаем предположение, что объемы выборок не превосходят целого числа G: G= Sup.
Для передачи имени объекта в качестве параметра этот объект нужно в явном виде описать в разделе TYPE. Мы хотим в качестве параметра передавать имя одномерного массива, поэтому дадим этому типу идентификатор VEK.

PROGRAM PR3;
CONST G = 50;
TYPE VEK = ARRAY [ 1 .. G] OF REAL;
VAR X, Y, Z: VEK; I, К, M, N: INTEGER;
FUNCTION AVG(P: INTEGER; W: VEK): REAL;
VAR J: INTEGER; S: REAL;
BEGIN
S:=0;
FOR J := 1 TO P DO S := S + W[J];
AVG := S/P
END;
FUNCTION VARD(P: INTEGER; W: VEK): REAL;
VAR J: INTEGER; M, S: REAL;
BEGIN
M:= AVG(P, W); S := 0;
FOR J := 1 TO P DO S := S + SQR(W[J] — M);
VARD:=S/(P- 1)
END;
BEGIN
WRITELN(‘Укажите размерность К массива X ‘); READLN(K);
WRITELN(‘Введите массив X, из ‘, К:2,’ вещественных чисел’);
FOR I := 1 ТО К DO READ(X[I]);
WRITELN(‘Укажите размерность M массива Y ‘); READLN(M);
WRITELN(‘Введите массив Y, из ‘,M:2,’ вещественных чисел’);
FOR I := 1 ТО M DO READ(Y[I]);
WRITELN(‘Укажите размерность N массива Z ‘); READLN(N);
WRITELN(‘Введите массив Z, из ‘, N:2,’ вещественных чисел’);
FOR I := 1 ТО N DO READ(Z[I]);
WRITELN(‘M(X) = ‘, AVG(K, X) :10:6,’, D(X) = ‘, VARD(K, X) :10:6);
WRITELN(‘M(Y) = ‘, AVG(M, Y) :10:6,’, D(Y) = ‘, VARD(M, Y) :10:6);
WRITELN(‘M(Z) = ‘, AVG(N, Z) :10:6,’, D(Z) = ‘, VARD(N, Z) :10:6)
END.

Использование функций в качестве параметра.

Идентификатор функции или процедуры может использоваться в качестве параметра другой функции. Если такая необходимость появилась, то требуется соответствующим образом специфицировать каждый такой формальный параметр.
Спецификацией в этом случае являются: заголовок передаваемой функции, включающей имя функции, список формальных параметров и тип результата. Спецификация функции описывается в разделе TYPE следующим образом: TYPE = FUNCTION(): ;
Пример 4. В интервале [А, В] методом поразрядного приближения найти максимум функции
F(X) = 0.1Х 3 – 2Х 2 + 10Х.
Формульно-словесный алгоритм метода состоит в следующем.
1. Задается начальное приближение Х0= А слева от максимума F(X) и вычисляется F(X0). Задается D = h, где h = ?Х — начальный шаг поиска.
2. Полагаем G = F(Xn), где вначале F(Xn) = F(X0), задаем X = X + D и вычисляем F(Xn+1)=F(X).
3. Проверяем условие F(Xn+1) > G; если оно выполняется, то идем к п. 2, если нет – к п. 4.
4. Полагаем D = –D/4. Проверяем условие | D | >Е/4, где Е — заданная погрешность вычисления Хn в точке максимума. Если она выполняется, идем к п. 2, то есть обеспечиваем поиск максимума в другом направлении с шагом в четыре раза меньше прежнего. Если данное условие выполняется, заканчиваем счет, принимая за максимум X.
В этом известном алгоритме не учитывается тот факт, что в заданном интервале [А, В] нет экстремума (максимума). В этом случае максимум будет на границе интервала либо в точке А, либо в точке В. Учитывая простоту функции F(X) и основной программы, приведем структурограмму только функции PRP(A, В, Е, F), которая осуществляет поиск максимума функции F в интервале [А, В] с погрешностью приближения Е.
Структурограмма функции PRP(A, В, Е, F):

podprogrammih.

Задав значения [А, В] = [2,3], E = 10 -9 , получим X = 3,0; F(X) = 14.7. Очевидно, что экстремума в этом интервале нет, так как Хmax на границе интервала в точке В. Изменив исходные данные: [А, В] = [2, 5], Е = 10 -9 , получим Хmax = 3,333332149; F(Хmax)= 14.814814815.
В теле функции использован оператор EXIT, который обеспечивает нормальный выход из фун-ции в том случае, когда нет экстремума и максимальное значение — на границе интервала.
Замечание. Как правило, компилятор Паскаля автоматически подбирает метод адресации подпрограмм. Если подпрограмма находится в одном тексте с телом основной программы, то она компилируется с «ближним» (near) адресом входа и возврата, содержащим только величину смещения адреса внутри текущего сегмента памяти. Если подпрограмма находится в другом программном модуле, то генерируется «дальний» (far) адрес, содержащий адрес сегмента и смещения в сегменте. При передаче имени функции в качестве программы необходим «дальний» адрес, но компилятор этого не понимает. Поэтому необходимо использовать директиву компилятора . Действие этой директивы распространяется на все подпрограммы, описанные ниже по тексту программы, или до директивы .
Пример 5. Найти сумму

где Ui = F(i). Функция F(i) может быть различной: F1(i) = 1/i; F2(i) = i/(i + 1); F3(i) = Cos (?/i).
При решении этой задачи следует помнить, что передача в качестве параметров предопределенных (стандартных) функций, к которым относится и Cos(X), запрещена. Это ограничение обходится путем переопределения стандартной функции в пользовательскую функцию. Надежный сервис почтовых рассылок выполнит рассылку на электронные почтовые адреса быстро и недорого.

PROGRAM PR5;
TYPE FUN = FUNCTION(A: INTEGER): REAL;
VAR S1: REAL; M, N, K: INTEGER;

FUNCTION F1(I: INTEGER): REAL;
BEGIN Fl := 1/I
END;
FUNCTION F2(I: INTEGER): REAL;
BEGIN F2:= I/(I+1)
END;
FUNCTION F3(I: INTEGER): REAL; < Переопределение функции COS >
BEGIN F3 := COS(PI/I)
END;
FUNCTION SUM(F : FUN): REAL;
VAR I: INTEGER;
S: REAL;
BEGIN
S:=0;
FOR I:=M TO N DO S := S + F(I); SUM:=S END;

BEGIN
WRITELN(‘Задайте M, N и номер функции (1, 2, 3)’);
READ(M, N, К);
CASE К OF
1:S1:= SUM(Fl);
2: Sl:= SUM(F2);
3:S1:=SUM(F3)
END;
WRITELN(‘S = ‘,S1:8:5)
END.

Параметры M и N передаются в функцию SUM в качестве глобальных переменных. Фактическим параметром для этой функции является идентификатор одной из трех функций Fl, F2, F3.

Как передать массив в функцию паскаль

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

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

В процессе решения задачи для одного из страждущих возникла проблема: нужно как-то в Паскале передать двумерный массив в качестве параметра. В си это легко, а вот в Паскале. кто знает — просьба выложить код.

Дата 10.5.2007, 15:13 (ссылка) | (нет голосов) Загрузка .

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

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

В чем проблема в Паскале? Как описана матрица, которую хочешь передать как аргумент, покажи.

Дата 10.5.2007, 15:16 (ссылка) | (нет голосов) Загрузка .

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

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

Описана стандартно:

Код
var a: array[1. 3, 1. 3] of integer;

Вот её надо и передать как аргумент. В Си это как два пальца а в Паскале я не умею, а помочь хоцца

Дата 10.5.2007, 15:19 (ссылка) | (нет голосов) Загрузка .

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

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

В Паскале даже 2 пальца не понадобятся:

Код
type
matrix = array[1. 3, 1. 3] of integer;

procedure f(var mx: matrix);
begin
.
end;

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!

  • Название темы должно отражать её суть! (Не следует добавлять туда слова «помогите», «срочно» и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например «школьная задача», «задача из учебника» и т.п.), не нужно указывать ее сложность («простая задача», «легкий вопрос» и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку «Код»). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик — один вопрос!
  • В данном разделе запрещено поднимать темы , т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой «Пометить как решённый», которая находится под кнопками создания темы или специальным флажком при ответе.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

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

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

11. Процедуры и функции

Как вы знаете с отдельными элементами массивов можно работать также как с обычными (скалярными) переменными. Соответственно можно использовать их в качестве фактических параметров. Однако, может потребоваться передать процедуре не отдельные элементы, а весь массив целиком. При этом недопустим такой, например, способ описания параметра:

procedure P(a: array [1..10] of integer);

Тип параметра должен быть или скалярным или заранее определенным в разделе type. То есть правильным будет следующее описание:

type TArray = array [1..10] of integer; var x: TArray; procedure P(a: TArray);

Такую процедуру P можно вызывать, указав в качестве фактического параметра, например, глобальную переменную x.

Пример: Программа, вычисляющая сумму элементов массива.

const n = 10; type TArray = array [0..n-1] of integer; var x: TArray; i, sum: integer; procedure Summa(a: TArray; var s:integer); var i: integer; begin s:=0; for i:=0 to n-1 do s:=s+a[i]; end; begin for i:=0 to n-1 do readln(x[i]); Summa(x, sum); writeln(sum); end.

При вызове процедуры содержимое массива x будет скопировано в массив a. Глобальная переменная sum на время работы процедуры приобретет синоним s. То есть, присваивая что-то переменной s, мы тем самым изменяем и переменную sum. В итоге программа выведет сумму элементов введенного пользователем массива.

При передаче массива через параметр-значение происходит копирование его содержимого в новые ячейки памяти. При работе с массивами большого размера или при необходимости вызывать процедуру очень много раз это может привести к большим затратам времени. Чтобы этого избежать, можно передавать массивы через параметры-переменные. При этом фактического переноса содержимого массивов из одной области памяти в другую не происходит, и вызов процедуры занимает меньше времени. То есть при большом размере массива правильнее будет заголовок:

procedure Summa(var a: TMassive; var s: integer);

Как передать массив в функцию паскаль

Добрый день. Возникает ошибка при передаче массива в модуль (нельзя преобразовать тип array[1..10] of integer к array of integer)

Задача: Разработать модуль, содержащий подпрограмму суммирования элементов массива.

Решал задачи для самопроверки, ничего не получалось. В итоге взял переписал пример из учебника. Та же ошибка.

Учебник: Иванова Г.С. Основы программирования: Учебник для вузов. — 2-е изд., перераб. и доп. — М.: Изд-во МГТУ им. Н.Э. Баумана, 2002. ~ 416 с

Основная программа
___________________________________ __
PROGRAM EX;

VAR A:ARRAY[1..10] OF INTEGER;
I,N:INTEGER;

READLN(N);
FOR I:=1 TO N DO READ(A[I]);
READLN;
WRITELN(‘СУММА= ‘,SUM(A,N));

Модуль
___________________________________ __
UNIT R1;

FUNCTION SUM (B:ARRAY OF INTEGER;N:INTEGER):INTEGER;

FUNCTION SUM(B:ARRAY OF INTEGER;N:INTEGER):INTEGER;
VAR S,I:INTEGER;

S:=0;
FOR I:=1 TO N-1 DO S:=S+B[I];
SUM:=S;

Константин_В
Посмотреть профиль
Найти ещё сообщения от Константин_В

Регистрация: 09.01.2008
Сообщений: 26,238

первое. Очень не рекомендую использовать этот мутант Pascal ABC (как и его родственника — Pascal ABC.NET)
используйте FreePascal (или delphi)

второе.
когда Вы пишете

FUNCTION SUM(B:ARRAY OF INTEGER;N:INTEGER):INTEGER;

это в паскале называется передача т.н. открытого массива (open array)
если не знаешь, что это и как это работает, то лучше этим не пользоваться.

Лучше поступить так:
описать свой тип данных и передавать в процедуры/функции именно его
например,

type MyArrayType = ARRAY[1..10] OF INTEGER; . var A : MyArrayType; . function SUM(X:MyArrayType;N:integer):integer; . 
Serge_Bliznykov
Посмотреть профиль
Найти ещё сообщения от Serge_Bliznykov

Регистрация: 23.10.2010
Сообщений: 2,287
Позволю себе слегка подправить:

function SUM(var X:MyArrayType;N:integer):integer;

Вместо var можно и const.
Поскольку параметры передаются через стек, то для массивов лучше использовать указанные модификаторы.
Такие модификаторы позволяют передать в функцию ссылку на массив.
Во втором случае элементы массива могут быть использованы только в правой части операторов (элементы массива можно прочитать, но нельзя изменить).

Заблокирован
Регистрация: 17.06.2016
Сообщений: 62

А кто вам сказал, что в университетских книгах написано «как надо». Кто вам сказал, что эта программа вообще правильно написана? Программа жестко задает размер массива например 10, затем пользователь, который не знает какое ограничение у массива, задает какое-то число , например 15 и пытается записать в несуществующие ячейки свои числа! Где логика. Это простой пример как в университетах дурят студентов, вместо того, чтоб давать им знания.

Регистрация: 04.02.2009
Сообщений: 18,136

Кто вам сказал, что эта программа вообще правильно написана?

Я даже знаю как там материал собирается . Дается задача более менее адекватному старшекурснику за зачет, он и бацает всякий хлам . А вот описательная часть это сложней уже. Тут уже аспирантов напрягать любят. Потом уже вычитку делают и за свой пропихивают. Также и статьи в разные журналы набивают профессора.

Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Регистрация: 29.06.2016
Сообщений: 4

Благодарю за проявленный интерес к теме и за ответы.

Serge_Bliznykov
Я не студент, но хочу получить 2-ое высшее. Решил самостоятельно изучать основы программирования, взял за основу список литературы, предложенный на сайте ИТМО. Там в качестве основ рассматривается именно Pascal (не delphi или VBasic).

Предложенный Вами вариант, и еще ряд других комбинаций, пробовал на PascalABC, так ничего и не заработало. О нем узнал так сказать первым и поэтому установил и начал работать. До этого был лишь один глюк, точно не смогу его описать, но он отказывался нормально выдавать результат. Установил FreePascal, работать неудобно, НО! все варианты, включая исходный на нем исправно работают!

ur_naz
Иных вариантов кроме как изучать по учебникам просто не существует. Образование сейчас дорогое, поэтому что бы получить его эффективно, желательно уже быть образованным, как бы странно это не звучало.

Константин_В
Посмотреть профиль
Найти ещё сообщения от Константин_В

Заблокирован
Регистрация: 17.06.2016
Сообщений: 62

Иных вариантов кроме как изучать по учебникам просто не существует.

Учись на форумах, читай чужие коды, пиши свои и показывай их другим, получай пинки и затычины, сравнивай варианты, ищи причины и через пару лет придет понимание
В твоем случае ты в одном месте выделяешь выделяешь память для 10 целых чисел, а в другом нет. Следовательно это задача компилятора выделять память автоматически или не выделять. FreePascal выделил тебе нужную память и программа вроде сработала, а АВС не выделил и программа не скомпилировалась . у АВС другая философия и код на нем выглядит иначе, чем на турбопаскале и ли его преемнике фрипаскале. Насколько я знаю там связные списки доступны из коробки и многие другие вкусности .Net-платформы

Регистрация: 09.01.2008
Сообщений: 26,238
Сообщение от ur_naz

.у АВС другая философия и код на нем выглядит иначе, чем на турбопаскале и ли его преемнике фрипаскале. Насколько я знаю там связные списки доступны из коробки и многие другие вкусности .Net-платформы

Вы только не путайте Pascal ABC и Pascal ABC.NET — это АБСОЛЮТНО разные вещи!

Предложенный Вами вариант, и еще ряд других комбинаций, пробовал на PascalABC, так ничего и не заработало.

Если хотите, разберёмся и заставим заработать.
Только сообщите подробности, какой именно у Вас Pascal ABC, какой код пытались компилировать и какие ошибки выдались.
Хотя, с другой стороны, может быть, оно Вам и не надо?!

Установил FreePascal, работать неудобно

Поставьте IDE (например, Lazarus) — должно быть удобно!

Успехов в учёбе!

Serge_Bliznykov
Посмотреть профиль
Найти ещё сообщения от Serge_Bliznykov

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *