2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Метод конечных разностей
Сообщение15.06.2009, 22:38 


15/06/09
6
ну по формулам получается p=k-x ... а тут получается вместо x нич его нет! и p состоит только их k

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 14:05 


15/06/09
6
никто не ответит на мой вопрос?

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 14:50 
Заслуженный участник


28/04/09
1933
21rus
21rus в сообщении #222394 писал(а):
ну по формулам получается p=k-x ... а тут получается вместо x нич его нет! и p состоит только их k

Где конкретно Вы увидели такую глупость? В тексте программы было четко и ясно:
Код:
function p (var cof:real):real;
begin
     p:=k1-cof;
end;

Сравните с формулой
$p(x)=k_1-x$
Быть может, Вас смутило то, что автор программы перепутал $p(x)$ и $f(x)$ (по сравнению с условием они действительно перепутаны, но это, в общем-то, ерунда)?
Или сбил с толку несколько неудачный выбор наименования формального параметра cof?
А может быть (боюсь предположить страшное) Вы просто не знаете, каким образом в Pascal'е организуется возврат значения из функции?

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 15:38 


15/06/09
6
прав не знаю я паскаля=) просто интеерсно стало вмевсто x использовал cof ... просто перевел на си это все а откуда и как берется cof не понял

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 16:02 
Заслуженный участник


28/04/09
1933
Вы вообще знаете, что такое формальные параметры функции? Вот cof - как раз он самый...

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 17:59 


15/06/09
6
объясните

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 18:40 
Заслуженный участник


28/04/09
1933
Формальный параметр - это та переменная, которая объявляется в заголовке функции и может использоваться только в теле этой функции. При вызове функции в эту "переменную" копируется значение той переменной (или константы), которая указана в скобках на соответствующей позиции после наименования функции (в месте ее вызова в тексте программы). В реальности это скорее не настоящая переменная, а кусок памяти, выталкиваемый из стека в начале работы подпрограммы.
В C следовало бы записать что-то вроде
Код:
float p(float cof)
{
return k1-cof;
}

или:
Код:
double p(const double& cof)
{
return k1-cof;
}

Как-то так. По-моему, это перевод "строчка-в-строчку".

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 18:51 


15/06/09
6
ясна спасибо

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 19:20 
Заслуженный участник


11/05/08
32166
EtCetera в сообщении #222609 писал(а):
При вызове функции в эту "переменную" копируется значение той переменной (или константы), которая указана в скобках на соответствующей позиции после наименования функции (в месте ее вызова в тексте программы).

Зависит от того, как вызывается эта переменная -- "по имени" или "по значению". Если "по имени" (по-паскалевски -- с префиксом "var "), то в стек копируется не конкретное значение величины, а её адрес. (Константа "по имени" вызываться, естественно, не может, при трансляции выдаётся сообщение об ошибке.)

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 19:47 
Заслуженный участник


28/04/09
1933
Так и думал, что на мою недоговорку кто-нибудь набежит... При том, что к сути дела она отношения не имела...
ewert
Спасибо за разъяснения. Но я, в общем-то, в курсе. И второй пример кода иллюстрирует Ваши слова.
Строго говоря, такой случай передачи параметров в подпрограмму только в Pascal'e называется "по имени". Обычно его все же кличут "по ссылке".
И, кстати, Вы зря думаете, что по ссылке нельзя передать константу (в Pascal'e для этого можно использовать префикс const).

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 20:23 
Заслуженный участник


11/05/08
32166
EtCetera в сообщении #222624 писал(а):
такой случай передачи параметров в подпрограмму только в Pascal'e называется "по имени". Обычно его все же кличут "по ссылке".

(извините за буквоедство)

Не помню точно, где как кличут. Есть смутное детское воспоминание, что именно "по имени" кликали ещё в Фортране. А в Паскале -- ну, может, уже и "по ссылке". Не имеет значения, потому и не помню.

EtCetera в сообщении #222624 писал(а):
Вы зря думаете, что по ссылке нельзя передать константу (в Pascal'e для этого можно использовать префикс const).

Не припомню такого в Паскале. И во всяком случае это противоречит идеологии языка. Если константа обычная, то её пересылать по ссылке бессмысленно, да и запрещено -- ведь передача по ссылке подразумевает возможность изменения изнутри процедуры, что для константы низзя. Если же она типизированная, то фактически -- она просто переменная, только инициализируемая.

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 20:42 
Заслуженный участник


28/04/09
1933
ewert
ewert в сообщении #222635 писал(а):
Не помню точно, где как кличут. Есть смутное детское воспоминание, что именно "по имени" кликали ещё в Фортране. А в Паскале -- ну, может, уже и "по ссылке".

Нет, я имел в виду как раз то, что в Pascal'е и Fortran'е они именуются "по имени", а во всех языках, так или иначе произошедших от C - "по ссылке".
ewert в сообщении #222635 писал(а):
Если константа обычная, то её пересылать по ссылке бессмысленно, да и запрещено -- ведь передача по ссылке подразумевает возможность изменения изнутри процедуры, что для константы низзя.

Передача по ссылке предназначена прежде всего не для возможности изменения данных изнутри подпрограммы, а для минимизации данных, пропускаемых через стек (при ее вызове). Для изменения достаточно передать указатель на переменную в качестве параметра подпрограммы - такое и в Pascal'е будет работать. Просто в Pascal'е, в дополнение к такому (естественному) механизму ввели (на уровне языка) префиксы формальных параметров var и const, которые очень сходны со ссылками ...&... (и const...&..., соответственно) в C++. Эти высокоуровневые механизмы замещают явную передачу адреса в качестве параметра.
Дабы не лжесвидетельствовать, я еще перед предыдущим постом не поленился откопать у себя на компьютере старинный компилятор Pascal'я и набрать вот такую программку:
Код:
Procedure proc
  (
    const d : Real
  );
begin
  write(d:6);
end;

begin
  proc(3.14);
  readln;
end.

...которая успешно откомпилировалась и запустилась.
ewert в сообщении #222635 писал(а):
Если же она типизированная, то фактически -- она просто переменная, только инициализируемая.

Разумеется, но не о них речь.

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 21:04 
Заслуженный участник


11/05/08
32166
Ну вот наваял на коленке:

Код:
type  a = array[1..10] of integer;

const  x: a = (1,2,3,4,5,6,7,8,9,10);

procedure  y(const aa: a);
var  i,k: integer;
begin   for i:=1 to 10 do k:=k+aa[i];    end;

procedure  z(var aa: a);
var  i,k: integer;
begin   for i:=1 to 10 do k:=k+aa[i];    end;


begin
  end.

И впрямь, трансляция проходит. Но вот чего я в упор не понимаю -- каков глубокий философский смысл игрека по сравнению с зетом.

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 21:26 
Заслуженный участник
Аватара пользователя


18/05/06
13438
с Территории
Дык, теперь если попробовать в теле функции менять сам аргумент, то - - -

 Профиль  
                  
 
 Re: Метод конечных разностей
Сообщение16.06.2009, 21:41 
Заслуженный участник


28/04/09
1933
ewert
ewert в сообщении #222643 писал(а):
Но вот чего я в упор не понимаю -- каков глубокий философский смысл игрека по сравнению с зетом.

Смысл есть, хотя для Pascal'я он действительно довольно глубок. Просто когда пишутся более-менее большие программы, хорошим тоном считается все параметры, которые слишком велики для проталкивания в стек, но значение которых не должно меняться в ходе выполнения подпрограммы, объявлять как константную ссылку (const), а не как параметр-переменную (var). Иначе очень легко при внесении изменений в подпрограмму "забыться" и менять те данные, которые меняться не должны. А искать в большой программе внезапно возникшую ошибку (которая может и не вдруг себя проявлять) - дело затратное и утомительное... При использовании же префикса const и попытке изменения значения такого параметра ошибка выдается еще на этапе компиляции, что разом отсекает множество ненужных проблем.
В Pascal'е про const частенько забывают, так как на нем, все-таки, особо крупные программы не пишутся. Да и создавался он не для промышленных целей, а, скорее, для учебных (и с этой своей ролью он неплохо справляется)...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group