• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Pascal, работа с функциями.

  • Автор темы Автор темы Dram
  • Дата начала Дата начала

Dram

Экономичный вид памяти
Почётный участник
Регистрация
19 Фев 2008
Сообщения
2,632
Реакции
34
Баллы
0
Pascal, работа с функциями.

Расскажите мне пожалуйста как правильно объявляется функция и еще кое какие нюансы.
скажем мне надо написать прогу с использованием функции y=cosx+ cos2x....cos10x
Как она на пишется с функцией?
 
Функции и процедуры-это подпрограммы,имеет структуру очень схожую с программой.
Функции описываются так
Function имя(параметр - переменная:тип переменной):тип, в котором функция будет возращать своё значение;
var ...;
begin
...
имя функции :=...;
end;

Ваш пример(примерно)
Код:
var y:real;x:integer;
 Function s(x:integer):real;
    Begin
    s:=cos(x)+cos(x*2)+cos(x*3)+...+cos(x*10);
    end;
Begin
  read(x);
  y:=s(x);
  writeln(y:5:2);
 End.
 
Последнее редактирование:
Функции и процедуры-это подпрограммы,имеет структуру очень схожую с программой.
Функции описываются так
Function имя(параметр - переменная:тип переменной):тип, в котором функция будет возращать своё значение;
var ...;
begin
...
имя функции :=...;
end;
А как в моем варианте она как может пригодится?
Я просто что то не очень место её нахожу когда и для чего её втыкать
 
Последнее редактирование:
Я уже подредактировал свой предыдуший пост.
 
Лучше так:
Код:
program func1;
var y,x:real; i:integer;

Function s(xx:real, k:integer):real;
    Begin
    s:=cos(xx*k);
    end;
 
Begin
  read(x);
  y:=0;
  for i:=1 to 10 do
  y:=y+s(x,i);
  writeln(y:5:2);
 End.
В данном случае в функции последовательно вычисляется 10 значений cos(i*x)
 
Конечно вариант от AlexZir лучше, от более удобный и продуманный.
Я же писал просто пример использования функции.
 
Вот выдержка из моего отчета по практике, краткое описание процедур и функций:
Подпрограмма – самостоятельный программный блок.
Часто во время задач требуется несколько раз повторить одну и ту же группу команд. Такие группы команд принято оформлять самостоятельными блоками и называть подпрограммами. Подпрограммы являются основой модульного программирования.
К каждой подпрограмме можно обратиться по имени. Использование подпрограмм имеет ряд преимуществ, например, такие как: самостоятельный характер, позволяющий поручить их написание отдельным программистам; четкая логическая структура, позволяющая облегчить их отладку, и множество других. Подпрограммы делятся на процедуры пользователя и функции пользователя.
Процедура – это независимая, именованная часть программы, которую после однократного написания можно многократно вызывать по имени (использовать) их последующих частей программы. Процедура не может выступать как операнд в выражении. По структуре процедура повторяет основную программу, то есть состоит из заголовка и блока. В заголовке после имени через запятую приводится список формальных параметров. Но в некоторых процедурах формальные параметры могут отсутствовать.
Если результатом работы подпрограммы является только одно значение, то эту подпрограмму лучше оформить как функцию. Функция аналогична процедуре, но имеет два основных отличия: 1) функция в качестве результата своей работы передает одно значение; это значение присваивается имени функции. 2) функция может выступать как операнд в выражении, при этом она вернет свое значение в точку вызова.
В заголовке функции после имени и списка формальных параметров через двоеточие указывается тип функции (или сразу после имени, если формальных параметров нет). В блоке функции должен быть хотя бы один оператор, присваивающий имени функции значение, в противном случае значение функции считается неопределенным. Если таких операторов несколько, то в точку вызова вернется последнее присвоенное значение.
 
Все правильно, в приведенном примере функция возвращает только одно значение, равное вычисленному s, совпадающему с именем функции. В примере от DDS к функции обращение 1 раз, в моем к функции 10 обращений внутри цикла. В принципе, оба варианта правильные.
 
Ваш пример(примерно)
Код:
var y:real;x:integer;
 Function s(x:integer):real;
    Begin
    s:=cos(x)+cos(x*2)+cos(x*3)+...+cos(x*10);
    end;
Begin
  read(x);
  y:=s(x);
  writeln(y:5:2);
 End.
так вроде как разобрался. Но мы написали вункцию S в дальнейшем её вызываем для переменной (х). И что то я не очень понял ведь в саму функцию запихан весь пример.
разве нельзя написать просто y:=S
а если у меня будет не (х) переменная а допустим (z) . Как эта функция вызовется для нескольких переменных?
 
Мы должны передать в функцию значения для вычисления, если же вы напишите без x, это будет неопределенной функцией и может выдать ошибку в вычислениях (тут действует принцип "вассал моего вассала - не мой вассал!").
В моем примере функция как раз вызывается для 2-х переменных, причем имена переменных при описании функции во избежание конфликтов определены отличные от имен переменных в основной программе.
 
я бы предпочел использовать разные имена переменных в функциях и программе
 
так вроде как разобрался. Но мы написали вункцию S в дальнейшем её вызываем для переменной (х). И что то я не очень понял ведь в саму функцию запихан весь пример.
разве нельзя написать просто y:=S
а если у меня будет не (х) переменная а допустим (z) . Как эта функция вызовется для нескольких переменных?

Точно так же, как и ЛЮБАЯ СТАНДАРТНАЯ ФУНКЦИЯ Паскаля. После того, как функция S определена и описана, с ней можно обращаться (внутри программы, естественно) так же, как, например, с функцией Sin. Т.е. корректными являются ЛЮБЫЕ конструкции типа
y:=S(z);
r:=S(t)+S(q)-S(5);
и т.п.
 
но если будете передавать в функцию две переменных, то и сама функция должна подразумевать прием двух переменных. В данном случае заголовок функции должен принять вид:
Код:
Function s(x,y:integer):real;
 
Естественно, только у меня описаны переменные типа real и integer :), так как переменная x может принимать действительные значения
 
ну я особо не обращал внимания, просто общий пример привел. каждая функция пишется с учетом выполняемых функций и особенностей программы :)
 
Точно так же, как и ЛЮБАЯ СТАНДАРТНАЯ ФУНКЦИЯ Паскаля. После того, как функция S определена и описана, с ней можно обращаться (внутри программы, естественно) так же, как, например, с функцией Sin. Т.е. корректными являются ЛЮБЫЕ конструкции типа
y:=S(z);
r:=S(t)+S(q)-S(5);
и т.п.
Значит..... если мы описали функцию 's:=x+2x+3' то в дальнейшем если мы вызываем эту функцию скажем для (z) то программа будет считать таким образом "s:=z+2z+3"
Я правильно все понял?
Все разобрался окончательно, Спасибо всем!!! :)
 
Последнее редактирование:
Помогите... кто может? всетаки неиразобрался я до конца в этих функциях :(

Найти наибольший элемент каждой стороки матрицы 5х5(нахождение наибольшего элемента строк оформить в виде функции)
 
Помогите... кто может? всетаки неиразобрался я до конца в этих функциях :(

Найти наибольший элемент каждой стороки матрицы 5х5(нахождение наибольшего элемента строк оформить в виде функции)

Да, Леша... Ведь вот давал себе зарок - больше не заниматься поисками максимальных и минимальных элементов массивов - достали! Но, видно, судьба такая, от которой не уйдешь.
Код:
CONST
 M=5; {Number of lines}
 N=5; {Number of columns}

TYPE
 AR=ARRAY[1..N] of BYTE;

VAR
 LNS:ARRAY[1..M] of AR;
 MAX:ARRAY[1..M] of BYTE;
 i,j:INTEGER;

Function Find_Max(Lfm:AR):BYTE;
 var M:BYTE; i:INTEGER;
 begin
  M:=Lfm[1];
  For i:=1 TO N DO
   If Lfm[i]>M then M:=Lfm[i];
  Find_Max:=M;
 end;

BEGIN
 Randomize;
 For i:=1 to M do
  begin
   For j:=1 to N do
    begin
     LNS[i,j]:=Random(256);
     Write(LNS[i,j]:4);
    end;
   Writeln;
  end;
 WriteLn;
 For i:=1 to M do
  begin
   MAX[i]:=Find_Max(LNS[i]);
   WriteLn('Maximum element of line ',i,' is equal to ',MAX[i]);
  end;
 ReadLn;
END.

Тут надо кое-что пояснить. Непосредственная передача массива в качестве аргумента функции по правилам Паскаля не допускает описания в явном виде. Т.е. конструкция типа
function FUN(A:ARRAY[1..10] of Integer):Real
некорректна. Поэтому приходится вводить промежуточный новый тип данных:
TYPE
ARR=ARRAY[1..10] of Integer;
И уже теперь можно оформить функцию правильно:
function FUN(A:ARR):Real
Нечто вроде этого применено и в данной программе. Это же обстоятельство вынудило не совсем обычно задать двумерный массив. Вместо
LNS:ARRAY[1..M,1..N] of BYTE
здесь задано
LNS:ARRAY[1..M] of AR;
где тип AR определен, как одномерный массив. Такое описание делает более наглядным передачу массива-строки в функцию Find_Max.
 
Vladimir_S а почему недопустима? FUN(A:ARRAY[1..10] of Integer):Real
Мне учитель сказал так именно и задавать... И тогда программу можно реализовать с 2 мерным массивом только вызывать тогда функцию придется для каждой строки массива. или я не прав???
И еще вопрос? я не очень понял превращение 2 мерного массива в одномерный. LNS:ARRAY[1..M] of AR это что правило паскаля какое то?
 
Последнее редактирование:
Vladimir_S а почему недопустима? FUN(A:ARRAY[1..10] of Integer):Real
Мне учитель сказал так именно и задавать... И тогда программу можно реализовать с 2 мерным массивом только вызывать тогда функцию придется для каждой строки массива. или я не прав???
И еще вопрос? я не очень понял превращение 2 мерного массива в одномерный. LNS:ARRAY[1..M] of AR это что правило паскаля какое то?

Вот черт, вечно я отстаю от жизни. В каких-то реализациях Паскаля, с которыми я имел дело, задавать в явном виде массив в качестве аргумента функции было нельзя, вот я с тех пор и не задаю. Надо будет попробовать - может быть на современных пакетах и можно.
В принципе это не "превращение двумерного массива в одномерный", а просто чуть иное описание двумерного массива. Вот представьте себе, например, матрицу (двумерный массив), имеющую 3 строки и 4 столбца. Ее можно описать, как
A:ARRAY[1..3,1..4] of REAL;
Но если в той же матрице каждую строку рассматривать как одномерный массив, то можно записать и так:
A:ARRAY[1..3] of ARRAY[1..4] of REAL;
И, наконец, если в начале программы массив-строка был объявлен типом, т.е.
TYPE
AR=ARRAY[1..4] of REAL;
то массив может быть задан, как
A:ARRAY[1..4] of AR;
А теперь - внимание! ВСЕ ТРИ ЗАПИСИ МАССИВА А АБСОЛЮТНО ЭКВИВАЛЕНТНЫ! Просто, поскольку аргументом функции в программе выступали строки, то мне показалось, что так нагляднее. Если запутал, извините.
Между прочим, при обращении к элементу двумерного массива выражения A[2,3] и A[2][3] тоже абсолютно эквивалентны.
 
  • Like
Реакции: Dram
Назад
Сверху