Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 07.01.2010, 21:03   #11 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

я бы предпочел использовать разные имена переменных в функциях и программе
MrSTEP вне форума   Ответить с цитированием

Старый 07.01.2010, 21:03
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Рекомендую почитать содержимое этих топиков

Задачка с функциями файловой системы ввода-вывода
Работа с текстовым файлом, Pascal

Старый 07.01.2010, 21:05   #12 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Dram Посмотреть сообщение
так вроде как разобрался. Но мы написали вункцию S в дальнейшем её вызываем для переменной (х). И что то я не очень понял ведь в саму функцию запихан весь пример.
разве нельзя написать просто y:=S
а если у меня будет не (х) переменная а допустим (z) . Как эта функция вызовется для нескольких переменных?
Точно так же, как и ЛЮБАЯ СТАНДАРТНАЯ ФУНКЦИЯ Паскаля. После того, как функция S определена и описана, с ней можно обращаться (внутри программы, естественно) так же, как, например, с функцией Sin. Т.е. корректными являются ЛЮБЫЕ конструкции типа
y:=S(z);
r:=S(t)+S(q)-S(5);
и т.п.
Vladimir_S вне форума   Ответить с цитированием
Старый 07.01.2010, 21:08   #13 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

Цитата:
Сообщение от AlexZir Посмотреть сообщение
вот так:
s(z,i)
но если будете передавать в функцию две переменных, то и сама функция должна подразумевать прием двух переменных. В данном случае заголовок функции должен принять вид:
Код:
Function s(x,y:integer):real;
MrSTEP вне форума   Ответить с цитированием
Старый 07.01.2010, 21:14   #14 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Естественно, только у меня описаны переменные типа real и integer , так как переменная x может принимать действительные значения
__________________
Убить всех человеков!
AlexZir вне форума   Ответить с цитированием
Старый 07.01.2010, 21:20   #15 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

ну я особо не обращал внимания, просто общий пример привел. каждая функция пишется с учетом выполняемых функций и особенностей программы
MrSTEP вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 08.01.2010, 06:22   #16 (permalink)
Dram
Экономичный вид памяти
 
Аватар для Dram
 
Регистрация: 19.02.2008
Сообщений: 2,632
Записей в дневнике: 1
Сказал(а) спасибо: 6
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2794
По умолчанию

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

Последний раз редактировалось Dram; 08.01.2010 в 06:30
Dram вне форума   Ответить с цитированием
Старый 08.01.2010, 09:59   #17 (permalink)
Dram
Экономичный вид памяти
 
Аватар для Dram
 
Регистрация: 19.02.2008
Сообщений: 2,632
Записей в дневнике: 1
Сказал(а) спасибо: 6
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2794
По умолчанию

Помогите... кто может? всетаки неиразобрался я до конца в этих функциях

Найти наибольший элемент каждой стороки матрицы 5х5(нахождение наибольшего элемента строк оформить в виде функции)
Dram вне форума   Ответить с цитированием
Старый 08.01.2010, 10:42   #18 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Dram Посмотреть сообщение
Помогите... кто может? всетаки неиразобрался я до конца в этих функциях

Найти наибольший элемент каждой стороки матрицы 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 вне форума   Ответить с цитированием
Старый 10.01.2010, 18:13   #19 (permalink)
Dram
Экономичный вид памяти
 
Аватар для Dram
 
Регистрация: 19.02.2008
Сообщений: 2,632
Записей в дневнике: 1
Сказал(а) спасибо: 6
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2794
По умолчанию

Vladimir_S а почему недопустима? FUN(A:ARRAY[1..10] of Integer):Real
Мне учитель сказал так именно и задавать... И тогда программу можно реализовать с 2 мерным массивом только вызывать тогда функцию придется для каждой строки массива. или я не прав???
И еще вопрос? я не очень понял превращение 2 мерного массива в одномерный. LNS:ARRAY[1..M] of AR это что правило паскаля какое то?

Последний раз редактировалось Dram; 10.01.2010 в 18:16
Dram вне форума   Ответить с цитированием
Старый 10.01.2010, 19:45   #20 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Dram Посмотреть сообщение
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] тоже абсолютно эквивалентны.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 14:14.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.