IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> функция
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


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

uses crt;
label 0; {описываем метку}
var
rez:real;
m,n:longint; {описали глобальные переменные, используемые в программе}
function fact(z: longint): real; {заголовок функции с формальным параметром-
значением, типом}
var
y: real; {описали локальную переменную}
begin
y:=1; {для получения результата необходимо присвоить у значение 1. также
при помощи этого реализуется вычисление 0! и 1!}
while z>1 do {запускаем цикл в обратную сторону, для упрощения опустим
множитель 1}
begin
y:=y*z;
z:=z-1
end;
fact:=y{вычисляем факториал, присваиваем его значение функции}
end; {конец функции}
begin{начало тела программы}
writeln('введите неотрицательные числа'); {для удобства пользователя просим
ввести числа}
0:readln(m,n); {в память вводятся числа}
if m or n <0 then begin
writeln(‘вы ошиблись, вводите неотрицательные числа’);
goto 0 {при ошибке пользователя предотвращаем выдачу неверного результата}
end;
rez:=(fact(m)+fact(n))/fact(m+n); {вычисляется значение данного выражения}
writeln('результат: ',rez) {выводим на экран результаты счета}
readkey
end.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Z - это формальный параметр, с которым работает подпрограмма.

Ты передаешь в функцию какое-то значение, внутри функции оно доступно под именем Z.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


так я же ни где z н присваиваю значение. А Z здесь параметр-переменная или параметр-константа?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской
Реальное имя: Neymanov Tural

Репутация: -  0  +


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


--------------------
Смейся и весь мир будет смеяться вместе с тобой, плачь и ты будешь плакать в одиночестве (Old Boy)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
А Z здесь параметр-переменная или параметр-константа?
Просто параметр... Был бы параметр-переменная, его изменение передалось бы в основную программу - этого не происходит. Был бы параметр-константа, ты бы вообще не откомпилировал программу, потому как нельзя менять константу, ты меняешь - значит, не константа...

Цитата
я же ни где z н присваиваю значение.
Повторяю: ты передаешь значение (неважно какое, КАКОЕ-ТО) в функцию? Вот функция ПРИНИМАЕТ его как Z (ты не должен ничего присваивать, за тебя это делает компилятор)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


спасибо за помощь
У меня еще вопрос
Почему эти 2 примера работают одинаково
uses crt;
var
x,y:byte;
z:real;
function qw(a:byte):real;
begin
z:=(x+y)*2/y;
qw:=z;
writeln(z:0:9)
end;
begin
clrscr;
write(' vvwdite a i b ');
read(x,y);
qw(x);
writeln(' (x+y)*2/y= ',qw(x):0:13);
readkey
end.


и
Добавлено через 5 мин.

uses crt;
var
x,y:byte;
z:real;
function qw{(a:byte)}:real;
begin
z:=(x+y)*2/y;
qw:=z;
writeln(z:0:9)
end;
begin
clrscr;
write(' vvwdite a i b ');
read(x,y);
qw;
writeln(' (x+y)*2/y= ',qw:0:9);
readkey
end.



Если у кого-нибудь есть материал про функции и процедуры, просьба, дайте ссылку

Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Client @ 11.11.2007 7:17) *

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Цитата
writeln(' (x+y)*2/y= ',qw(x):0:13);

вот здесь опять вызывается функция? или нет
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Client @ 11.11.2007 8:20) *

вот здесь опять вызывается функция? или нет

Да.
Иначе говоря, предыдущий вызов (на отдельной строчке) - лишний.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


я вот понимаю функцию так: в теле функции пишем операторы, имени функции присваиваем значение. потом при вызове функции используется ее значение. Вот например я делал программу, там надо найти дату на к дней назад с учетом висогного года. Значит можно сделать функцию логического типа и если год високосный то ей присвоить значение TRUE иначе FALSE. а потом в самой программе при проверке условия просто подтавляем
IF ИМЯ ФУНКЦИИ THEN в феврале 29 дней...
я правильно понял?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата
я правильно понял?
В основном... Только надо бы еще функции передать год, который ты собрался проверять на високосность, вот тогда будет совсем правильно...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


function visgod:longint{хотя можно integer};
begin
if (god mod 4=0) and not((god mod 100=0) and (god mod 400<>0)) then
visgod:=god;
end
Вроде того?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Я вот тут: помогите плиз
тебе уже показывал, КАК ИМЕННО, а не "вроде того"...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


всегда прокалываюся здесь
еще в тетради записывал, что не надо логич переменной присваивать значение с промощью условного оператора.
эх..
спасибо за ответы

Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


у меня еще вопрос
Function f(a:'a'..'z'):boolean;
Почему так нельзя описывать параметры?? Обязательно надо создать свой диапазонный тип??
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






Цитата
Почему так нельзя описывать параметры??
Потому что Паскаль (Турбо и Object, помнится, что Extended вроде бы все-же разрешает) не позволяет конструировать типы в заголовках подпрограмм, а ты именно это и пытаешься сделать...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


не позволяет конструировать типы в заголовках подпрограмм
Ясно, т.е. можно использовать только уже описанные типы. А вот здесь
procedure(const A: array of mas_type; const size: integer);
при описание массива?? И еще, как еще можно описать параметры, кроме как через VAR,CONST?? или это все способы??

Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






А вот здесь - ты не конструируешь новый тип, ты используешь открытый массив - их возможно использовать только в качестве параметров подпрограммы. Даже если в 32-битных компиляторах ты создашь динамический массив через
type
T = array of integer;

, то это будет совсем не то, что
procedure p(var arr: array of integer);


Цитата
как еще можно описать параметры, кроме как через VAR,CONST??
Можно вообще без ничего передавать, "по значению". Можно сделать бестиповый параметр:
procedure p(var v);
begin
end;

, тогда туда можно передать все, что угодно (фактически - это указатель (нетипизированный, pointer) на область памяти, занимаемой объектом). Пример использования я приводил здесь: Задача... вообщем не пойму на что
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Спасибо volvo
помог как всегда smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Можно еще вопрос?
Вот в основной программе можно сделать так
n:=f(z);
А в самой функции f как-нибудь можно написать
k:=f;
Чтоб в К лежало значение этой функции, но чтоб при этом не было рекурсии, чтоб здесь компилятор не просил параметр. Если можно, то как?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 5:31
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name