Объясните новичку.

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Re: Объясните новичку.

Сообщение Paster Fob » 22.05.2011 09:44:36

informat,Здравствуйте.Запустил я вашу программку,ввёл цифру 9,пять раз подряд,вот что получилось:10,9,10,9,11.Теперь поясняю,формальный параметр а имеет ссылку на переменную х1,т.к перед а есть слово var.В теле процедуры выполняется действие a:=a+1=>9+1=10,результат возвращается через ссылку на переменную,поэтому в х1 попадает число 10.Формальный параметр b,не имеет ссылку на переменную,внутри процедуры будет подсчитано что 9+1=10,но результат из процедуры в главную программу не возвращается,поэтому в переменной х2 остаётся число 9.Формальный параметр с идентичен параметру а,а b идентичен d.Поэтому х3=10,а х4=9 соответственно.х5 как и все другие изначально равна 9,формальные параметры e и f имеют ссылку на одну и ту же переменную.е соответствует х5,в результате работы процедуры (е:=е+1=>9+1=10) через ссылку на переменную в x5 попадает 10.фактический параметр х5 используется дважды.Формальный параметр f соответствует х5,а т.к.х5 теперь равна 10,то в процедуре посчитается f:=f+1,т.е. 10+1=11.
Надеюсь что всё правильно написал и ничего не попутал.

Ещё пару задачек подкиньте... :wink:
Последний раз редактировалось Paster Fob 22.05.2011 11:49:38, всего редактировалось 1 раз.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Объясните новичку.

Сообщение Oleg_D » 22.05.2011 11:15:20

Хорошая задачка и ответ на 5+
:)
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Объясните новичку.

Сообщение Maxizar » 22.05.2011 12:24:10

Ещё пару задачек подкиньте...

Ну тогда вот:
Задача:
Даны два целых числа a и b. Если a делится на b (без остатка) или b делится на a (без остатка), то вывести 1, иначе - любое другое число. Условные операторы и операторы циклов не использовать.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Объясните новичку.

Сообщение informat » 22.05.2011 18:29:31

Ответ, действительно хороший, обстоятельный, но только на 5-.
Поясню.

Paster Fob писал(а):informat
...
формальные параметры e и f имеют ссылку на одну и ту же переменную.е соответствует х5,в результате работы процедуры (е:=е+1=>9+1=10) через ссылку на переменную в x5 попадает 10.фактический параметр х5 используется дважды.Формальный параметр f соответствует х5,а т.к.х5 теперь равна 10,то в процедуре посчитается f:=f+1,т.е. 10+1=11.
...


Получается, что программа как бы "возвращается" за каждым параметром.
По вашему, если описать процедуру:
Код: Выделить всё
procedure Plus_2(var a, b: integer;  c: integer; var d: integer);
  begin
    a:=a+1; b:=b+1; d:=c
  end;

x5:=1;
то после вызова
Plus_2(X5, X5, X5+1, Y)
Y примет значение 4.

А на самом деле 2.

Добавлено спустя 5 минут 6 секунд:
Задачку. Пожалуйста.

Не запуская нужно сказать что выдаст эта программа.
Код: Выделить всё
program Proc_3;
var
  x5,Y : integer;

procedure Plus_3(var a, b: integer;  var c: integer);
begin
    a:=a+1;
    b:=b+1;
    c:=a;
end;

begin
  x5:=1;
  Plus_3(X5, X5, Y);
  writeln(Y);
end.


Проверьте запуском.
Аватара пользователя
informat
новенький
 
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name

Re: Объясните новичку.

Сообщение Paster Fob » 22.05.2011 19:34:14

informat писал(а):Ответ, действительно хороший, обстоятельный, но только на 5-.
Поясню.

Paster Fob писал(а):informat
...
формальные параметры e и f имеют ссылку на одну и ту же переменную.е соответствует х5,в результате работы процедуры (е:=е+1=>9+1=10) через ссылку на переменную в x5 попадает 10.фактический параметр х5 используется дважды.Формальный параметр f соответствует х5,а т.к.х5 теперь равна 10,то в процедуре посчитается f:=f+1,т.е. 10+1=11.
...


Получается, что программа как бы "возвращается" за каждым параметром.
По вашему, если описать процедуру:
Код: Выделить всё
procedure Plus_2(var a, b: integer;  c: integer; var d: integer);
  begin
    a:=a+1; b:=b+1; d:=c
  end;

x5:=1;
то после вызова
Plus_2(X5, X5, X5+1, Y)
Y примет значение 4.

А на самом деле 2.

Почему это 4?перед с нет слова var,следовательно результат не возвращается,Х5=1,Х5+1=2,с=2,d=c,d=>Y.Получается 2.

Добавлено спустя 15 минут 8 секунд:
informat писал(а):Не запуская нужно сказать что выдаст эта программа.
Код: Выделить всё
program Proc_3;
var
  x5,Y : integer;

procedure Plus_3(var a, b: integer;  var c: integer);
begin
    a:=a+1;
    b:=b+1;
    c:=a;
end;

begin
  x5:=1;
  Plus_3(X5, X5, Y);
  writeln(Y);
end.


Проверьте запуском.

Я посчитал,что будет 2,на самом деле 3,ни как не пойму в чём прикол?
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Объясните новичку.

Сообщение Maxizar » 22.05.2011 20:33:30

Вот запутали поцана, зачем....
Paster Fob смотри, когда параметр передается как Var, Это значит, что ты передаешь в подпрограмму не переменную! (тут остановились и подумали)
Еще разок:
Код: Выделить всё
Procedure P1(var a:Integer);


////
var A1:Integer;
begin
A1:=12;
P1(A1);
end;

Вот в процедуру P1, пришла не цифра 12... а аддрес памяти (Оперативной Памяти) в которой записано число 12.
По этому имея функцию:
Код: Выделить всё
procedure Plus_3(var a, b: integer;  var c: integer);
begin
    a:=a+1;
    b:=b+1;
    c:=a;
end;

Мы передаем параметры(переменны) а, b, с не как цифры, а как аддреса ячеек ОЗУ в которых эти самые числа(переменные) записаны.
Теперь еще разок но за один присест.
Предположим что:
x5 - в ОЗУ лежит по аддресу 120.
чего нибудь еще - в ОЗУ лежит по аддресу 124.
Y - в ОЗУ лежит по аддресу 128.

Тобишь мы в процедуру Plus_3() передали эти аддреса.
Код: Выделить всё
  x5:=1;
  Plus_3(X5, X5, Y);
  writeln(Y);


что значит по строкам:
Код: Выделить всё
x5:=1;
в переменную х5 записали число 1. Но ведь где хранится это чило? правильно в памяти, а в какой памяти? правильно в ОЗУ, а где именно хранится переменная x5, ну мы (просто) предположили, что по аддресу 120. Тобишь мы Записали в ОЗУ по адресу 120 число равное 1.

Код: Выделить всё
Plus_3(X5, X5, Y);

Мы передаем (как уже было сказано выше) не переменны и числа, а адреса.
тобишь войдя в процедуру:
Код: Выделить всё
procedure Plus_3(var a, b: integer;  var c: integer);
begin
    a:=a+1;
    b:=b+1;
    c:=a;
end;

Мы по аддресу переменной (мы передали переменную x5) тобишь

a= адресу переменной x5 и этот адрес =120.
b= адресу переменной x5 и этот адрес =120.
c= адресу переменной Y и этот адрес =128

До этого у нас X5 = 1.
После
Код: Выделить всё
a:=a+1;
уже х5=2. Почему.. потому что мы сказали, взять из ячейки записанное туда число и прибавить к нему 1 и записать опять в эту же ячейку (ячейку с адресом 120)
после
Код: Выделить всё
b:=b+1;
3. так как b=адресу переменной x5, а по адресу (120) уже записано число 2. тобишь после +1 будет уже 3

Код: Выделить всё
c:=a;

Ты говоришь что переменная С должна быть равна числу которое лежит по адресу переменной b, а по этому адресу у нас лежит переменная какая? прально x5 а что записано по аддресу в котором лежит переменная x5, число 3.. Что и требовалось доказать.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Объясните новичку.

Сообщение Oleg_D » 22.05.2011 22:40:56

Maxizar писал(а):Вот запутали поцана, зачем....

И запутали еще больше :)
По сути Вы правы, но парень до адресов не добрался еще.
Код: Выделить всё
program Proc_3;
var  x5,Y : integer;

procedure Plus_3(var a, b: integer;  var c: integer);
begin
    a:=a+1;    b:=b+1;    c:=a;
end;

begin
  x5:=1;
  Plus_3(X5, X5, Y);
  writeln(Y);
end.

Попробую проще объяснить. Дело в том, что согласно вызову Plus_3(X5, X5, Y) параметры процедуры A и B ссылаются на одну и ту же переменную X5. После операторов a:=a+1; b:=b+1; она становится равной 3, а затем копируется в переменную Y оператором c:=a.
Поблагодарим автора за эти полезные примерчики!
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Объясните новичку.

Сообщение informat » 24.05.2011 14:35:20

Oleg_D писал(а):
Maxizar писал(а):Вот запутали поцана, зачем....

И запутали еще больше :)
По сути Вы правы, но парень до адресов не добрался еще.
Попробую проще объяснить. Дело в том, что согласно вызову Plus_3(X5, X5, Y) параметры процедуры A и B ссылаются на одну и ту же переменную X5. После операторов a:=a+1; b:=b+1; она становится равной 3, а затем копируется в переменную Y оператором c:=a.
Поблагодарим автора за эти полезные примерчики!


Спасибо.

Самое простое объяснение, которое я знаю, такое.
Переменные - это названия участка памяти. В последнем примере a, b и x5 - разные названия одного итого же участка памяти.
Это всё объясняет. А название в программе, в машинных кодах становится указателем на эту память (адресом).
Аватара пользователя
informat
новенький
 
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name

Re: Объясните новичку.

Сообщение Maxizar » 24.05.2011 15:06:26

:oops: да я наверное пересторался....

Paster Fob но это Вас не освобождает от моей задачи....
И ребята чур не подсказывать, пускай поломает голову над задачкой. :twisted:
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Объясните новичку.

Сообщение Oleg_D » 24.05.2011 17:27:08

Maxizar писал(а):Ну тогда вот:
Задача:
Даны два целых числа a и b. Если a делится на b (без остатка) или b делится на a (без остатка), то вывести 1, иначе - любое другое число. Условные операторы и операторы циклов не использовать.

Вы про эту задачку? Ну так она вроде не по теме передачи параметров в процедуры. Вы тогда сами намекните парнишке, из какой это оперы. А мы помолчим, конечно :)
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Объясните новичку.

Сообщение Maxizar » 24.05.2011 17:46:51

Oleg_D писал(а):Вы про эту задачку? Ну так она вроде не по теме передачи параметров в процедуры. Вы тогда сами намекните парнишке, из какой это оперы. А мы помолчим, конечно

Да про эту задачку. :D

Paster Fob
- эта задачка на целые числа, нужно ухитрится решить эту задачу без использования условных операторов и различного рода циклов. Как это сделать: Ну вы должны одними операторами исхитрится так, чтоб все работало.... Но это уже подсказка при чем очень большая :)... Так как вы дошли до подпрограмм, значит вы простые типы уже изучили. А целое число - это простой тип....

Задачка очень занимательная и очень поучительная, при этом она реально заставляет задуматься....
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Объясните новичку.

Сообщение Oleg_D » 26.05.2011 10:24:15

Maxizar писал(а):Так как вы дошли до подпрограмм, значит вы простые типы уже изучили. А целое число - это простой тип....

Paster Fob, если Вы работаете по книге Песни о Паскале, то ищите нужные для задачи сведения в главах 32 и 33 - типы данных и их преобразования.
Впрочем, если не сможете решить эту задачку, не слишком огорчайтесь, - далеко не всякий "профи", зарабатывающий программированием, способен на такие трюки. :) Все приходит со временем.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Объясните новичку.

Сообщение Paster Fob » 26.05.2011 17:39:17

Я и не растраиваюсь.Что учусь по вашей книге,вы и так прекрасно знаете.Сейчас принялся за главу 24.Что бы решить задачку от Maxizar,нужно ещё немного подучиться,пока я не знаю как это сделать.Но в скором времени постараюсь,а вы не подсказывайте.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Объясните новичку.

Сообщение minoshi » 27.05.2011 18:04:40

Paster Fob писал(а):Но в скором времени постараюсь,а вы не подсказывайте.


Искренне и от всей души : "Рекспект!"
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

Re: Объясните новичку.

Сообщение Brainenjii » 27.05.2011 19:21:09

Oleg_D: не знаю, считается ли это подсказкой, но если судить по книге - то к 24 главе Maxizar'овскую задачку решить вполне себе можно ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Пред.След.

Вернуться в Обучение Free Pascal

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

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

Рейтинг@Mail.ru