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

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

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

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

Сообщение Padre_Mortius » 03.05.2011 10:07:29

спешу Вас уведомить, что в Паскале у процедуры есть как параметры-значения, так и параметры-переменные. Последние в описании процедуры оформляются с использованием ключевого слова var.

Для начального уровня это может быть очень сложно для понимания. Поэтому прежде чем лезть в дебри стоит ознакомиться с функциями и понять чем они отличаются от процедур.
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

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

Сообщение vada » 03.05.2011 10:22:17

devels писал(а):На счет скобок и and, or и т.п., не во всех языках приоритет операций у них больше чем у других, в таких языках можно скобки опускать.

Вот не стоет этого делать. Лишние скобки не всегда лишние для понимания кода.
Паскаль позволяет писать
Код: Выделить всё
if a > b

Я стараюсь писать
Код: Выделить всё
if (a > b)

Именно потому, что потом может быть добалено еще условие, которое по каким-то причинам не было в первоначальном коде. Например:
Код: Выделить всё
if (a > b) and (c < b)

Паскаль позволяет не ставить точку с запятой перед end, но лучше ставить - вдруг вы еще оператор вставите, получите досадную синтаксическую ошибку.
Стараюсь всегда писать
Код: Выделить всё
if (a > b)
then begin
...
end
else begin
...
end;

даже если между begin end всго один оператор. А вдруг вы потом еще парочку напишите?

Вообще много подобных приемов для удобства чтения и редактирования своего-же кода.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

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

Сообщение informat » 03.05.2011 15:18:05

Padre_Mortius писал(а):
спешу Вас уведомить, что в Паскале у процедуры есть как параметры-значения, так и параметры-переменные. Последние в описании процедуры оформляются с использованием ключевого слова var.

Для начального уровня это может быть очень сложно для понимания. Поэтому прежде чем лезть в дебри стоит ознакомиться с функциями и понять чем они отличаются от процедур.


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

Могу посоветовать блоки моего курса "Базовое программирование" раздел "Подпрограммы", Там есть не только голая теория, а ещё и задачи показывающие проблемные места.

Добавлено спустя 5 минут 40 секунд:
vada писал(а):
devels писал(а):На счет скобок и and, or и т.п., не во всех языках приоритет операций у них больше чем у других, в таких языках можно скобки опускать.

Вот не стоет этого делать. Лишние скобки не всегда лишние для понимания кода.
Паскаль позволяет писать
Код: Выделить всё
if a > b

Я стараюсь писать
...
Вообще много подобных приемов для удобства чтения и редактирования своего-же кода.


Это мелочи по сравнению с плохим использованием меток, break и continue,
Там такие путаные коды начинающие делают, потом и гуру не разобраться. :D
Аватара пользователя
informat
новенький
 
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name

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

Сообщение Padre_Mortius » 03.05.2011 15:58:00

informat
Изначально нужно иметь понимание вопросов работы подпрограммы, как общей сущности функции и процедуры. И необходимо уметь правильно использовать использовать функцию и процедуру в простых случаях. А тонкости, при использовании параметров-переменных, имхо, можно оставить и на более продвинутый уровень, когда появится понимание необходимости таких использований.
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

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

Сообщение Paster Fob » 03.05.2011 17:11:54

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

Могу посоветовать блоки моего курса "Базовое программирование" раздел "Подпрограммы", Там есть не только голая теория, а ещё и задачи показывающие проблемные места.

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

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

Сообщение Vadim » 03.05.2011 18:09:01

Paster Fob писал(а):А вот описаний происходящих процессов внутри программы практически нет.

Программа - это и есть описание хода действия какого-либо процесса. Причём не теоретического описанияЮ а именно практического. ;)
А как же научиться понимать, что происходит в программе, какой процесс там описывается? Это довольно просто. Вы изучаете язык программирования. Ключевое слово - язык. Значит нужно применять те же самые методы, которые применяются при изучении иностранного языка. Что же нужно для этого? Как минимум - словарь, чтобы понимать, что же оначает то или иное слово в незнакомом пока языке. Далее - учебник языка, чтобы понимать, в каком случае нужно применять то или иное слово, каким образом из слов выстраивать предложения, чтобы по этим предложениям компьюер Вас понял, а что же Вы ему хотели сказать.
Но всё вышеописанное будет полной фигнёй, пылью по одной простой причине - если Вы не умеете чётко и логически мысли сами и уметь илгать свои мысли хотя бы на том языке, которым уже владеете (или думаете, что владеете :) ).
Возвращаясь к непонятным, покуда, подпрограммам, надо сначала выяснить - зачем они нужны вообще? Подпрограммы делятся на две категории:
1. Когда работа внутри подпрограммы Вас совершенно не интересует, но зато страшно интересен возвращаемые ею после работы результат. Такой вид подпрограмм называется функция. Как пример - вычисление синуса угла.
2. Вас интересует сам процесс деятельности подпрограммы, а результат не имеет никакого значения. Такие подпрограммы называются процедуры. Как пример - вывод вычесленного значения синуса на экран.
Как управлять деятельностью подпрограм? С помощью параметров, которые ы ей передаёте в скобках. Например, значение угла, в градусах, при вычислении синуса. Причём параметры эти бывают трёх видов:
1. Параметр просто так. Это когда Вы передаёте в подпрограмму какое-то значение, с которым подпрограмма внутри себя может делать всё, что угодно. Однако за пределами подпрограммы эти изменения абсолютно ни на что не влияют.
2. Параметр-константа. Это когда подпрограмма со значением параметра ничего не может сделать, значение всегда, во всё время работы подпрограммы имеет одно и то же значение. Такие параметры предваряются слубным словом const.
3. Параметры, с которыми подпрограмма может делать всё, что угодно, изменять значения в предела определения типа параметра и эти изменения будут действовать не только внутри подпрогрограммы, но и после её окончания где-то ещё. Такие параметры предваряются служебным словом var.
Так для чего же нужны подпрограммы вообще? Представьте, Вам нужно в Вашей программе 174 раза вычислить значения синуса. Достоверно известно, что синус всегда вычисляется по одной и той же формуле. Будете мазохистом и писать 174 раза один и тот же код? Не верю. Уморитесь. И наделаете кучу ошибок именно по присине уморения. :) Вместо этого код можно написать один раз, обозвать его каким-то именем и во всех остальных случаях обращаться к этому участку коа только по его короткому имени.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение Paster Fob » 03.05.2011 18:50:43

Большая беда в том что после окончания средней школы я пошёл работать,учиться не было возможности.И всё что изучали дальше 5-го класса не помню вообще,хотя учился не плохо.
вычислить значения синуса

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

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

Сообщение daesher » 03.05.2011 19:56:32

IMHO логично давать var- (а, может, даже и out-) параметр сразу после изучения функций в качестве ответа на вопрос: "А что, если из подпрограммы надо передать два или более значения, а новый временный тип изобретать не хочется".
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

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

Сообщение Vadim » 04.05.2011 02:32:18

Paster Fob писал(а):Большая беда в том что после окончания средней школы я пошёл работать,учиться не было возможности.И всё что изучали дальше 5-го класса не помню вообще,хотя учился не плохо.

Когда Вы собираетесь решать какую-либо задачу, не решайте абстрактну задачу, смысла которой Вы не понимаете, а решайте задачу, которую Вам остро необходимо решить. Тогда стимула учиться будет намного больше. ;)
Зачем нужен синус и косинус? Представьте себе часы со стрелками. За определённое время конец стрелки описывает круг в своём движении. Вы захотели написать программу-часы, следовательно встаёт вопрос о вычислении координат следующего положения стрелок. У стрелки два конца: у одного конца координаты всегда одни и те же (центр круга), а вот у второго конца положение постоянно менется. Так вот, положением этого самого движущегося конца на круге заведуют синус и косинус, вычисляя поправочный коэффициент к предыдущей координате от 0 до 1 и от 1 до 0. ;)

Добавлено спустя 6 минут 39 секунд:
daesher писал(а):"А что, если из подпрограммы надо передать два или более значения, а новый временный тип изобретать не хочется".

А почему это вдруг не хочется? :) Есть логика, ей надо и следовать. Например, если подпрограмма вычисляет и возвращает значение плоской координаты, то логично использовать специальный тип - TPoint. Это мало того, что логично, но и программа будет у Вас в 1000 раз понятнее, если, вместо использования X и Y, Вы будете использовать Point.X и Point.Y. При этом сразу же понятно, о чём в этих переменных идёт речь. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение daesher » 04.05.2011 09:55:07

Vadim писал(а):А почему это вдруг не хочется? :) Есть логика, ей надо и следовать.

Безусловно.
Например, если подпрограмма вычисляет и возвращает значение плоской координаты, то логично использовать специальный тип - TPoint. Это мало того, что логично, но и программа будет у Вас в 1000 раз понятнее, если, вместо использования X и Y, Вы будете использовать Point.X и Point.Y. При этом сразу же понятно, о чём в этих переменных идёт речь. ;)

Это как раз пример того, когда новый (а в данном случае даже и не новый) тип нужен и логичен. Возьмём другой пример: подпрограмме во что бы то ни стало надо отчитаться о своей работе (т.е. она должна выглядеть function F(...):boolean, чтобы в итоге её можно было помещать, например, в if), а также передать, допустим, разнородные результаты. Можно изобрести тип (ту же запись), но это будет неудобно
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

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

Сообщение Paster Fob » 08.05.2011 09:47:46

Привет всем.По-маленьку разбираюсь,не так страшен чёрт,как его малюют.Прочитал пару раз не много разобрался.Решаю задания.
значит дана процедура Calc,которая подсчитывает заданный символ в введённой строке.
Код: Выделить всё
procedure Calc(arg:string; ch:char; var res:integer);
var k:integer;
begin
  res:=0;
  for k:=1 to length(arg) do
    if arg[k]= ch1 then res:= Res+1;
end;

Задание такое:нужно написать программу к этой процедуре.Вот что у меня получилось.
Код: Выделить всё
procedure Calc(arg:string; ch:char; var res:integer);
var k:integer;
begin
  res:=0;
  for k:=1 to length(arg) do
    if arg[k]= ch then res:= res+1;
end;
var s:string;
    n:integer;
Begin
  writeln('Введите строку');
  readln(s);
    Calc(s,'a',n);
  writeln('В строке ',n,' символов `a`');
  readln;
end.

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

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

Сообщение Vadim » 08.05.2011 13:09:45

Paster Fob
Поскольку у Вас процедура возвращает один единственный результат (количество заданных символов), логичнее было бы написать функцию:
Код: Выделить всё
Fuction Calc(arg:string; ch:char): integer;
Var
  k: integer;
Begin
  Calc:=0;
  For k:=1 To length(arg) Do
    If arg[k]= ch Then
      Calc:= Calc+1;
end;

Смотрите, здесь название функции Calc одновременно служит и переменной, куда помещается результат работы функции. Для Delphi и FreePascal (в режиме компиляции objfpc и delphi), можно использовать специальную служебную переменную - Result, которая полностью эквивалентна переменной с названием функции:
Код: Выделить всё
Fuction Calc(arg:string; ch:char): integer;
Var
  k: integer;
Begin
  Result:=0;
  For k:=1 To length(arg) Do
    If arg[k]= ch Then
      Result:= Result+1;
end;

При такой форме процедуры, главная программа принимает более короткий и, может быть, более ясный вид:
Код: Выделить всё
var
  s: string;

Begin
  writeln('Введите строку');
  readln(s);
  writeln('В строке ', Calc(s,'a'), ' символов `a`);
  readln;
end.

И вот здесь сразу же возникает один очень интересный вопрос - а как определить, что именно выполняет данная функция? Как минимум, ей надо дать "говорящее" название. Например, я говорю "яблоня" и Вы сразу же себе представляете яблоню. Говорю "экскаватор" - и у Вас сразу же в уме возникает изображение экскаватора. :) Когда Вы читаете название функции, у Вас в уме сразу же должно сформироваться понимание, для чего нужна эта функция. Вот, например:
Код: Выделить всё
Fuction CountOfCharInString(arg:string; ch:char): integer;
Var
  k: integer;
Begin
  CountOfCharInString:=0;
  For k:=1 To length(arg) Do
    If arg[k]= ch Then
      CountOfCharInString:= CountOfCharInString+1;
end;

И тут же второй, очень важный момент - на каждый кусок кода нужно писать комментарии, что этот код делает:
Код: Выделить всё
//Подсчёт количества заданных символов в строке
//arg - строка, в которой идёт подсчёт
//ch - заданный символ
Fuction CountOfCharInString(arg:string; ch:char): integer;
Var
  k: integer;
Begin
  CountOfCharInString:=0;
  //Цикл, в котором идёт сравнение каждого символа строки с заданным
  For k:=1 To length(arg) Do
    If arg[k]= ch Then
      //Если совпало, прибавление к результату единички
      Inc(CountOfCharInString);
end;

var
  s: string;

Begin
  writeln('Введите строку');
  readln(s);
  writeln('В строке ', CountOfCharInString(s,'a'), ' символов `a`);
  readln;
end.


И Вас все преподаватели полюбят, как родного сына. :)
Последний раз редактировалось Vadim 08.05.2011 17:30:57, всего редактировалось 1 раз.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение informat » 08.05.2011 16:53:03

Если писать для преподавателей, то одно дело.
Если для себя, чтобы было потом легче самому, то другое.

Изучать самостоятельно, конечно можно всё. Но сколько "шишек можно набить" за это время и сколько это займёт времени.
Я проблема в том, что некоторые вещи мало прочитать, их нужно ПОЧУВСТВОВАТЬ.
Для этого нужно решить правильные задачи.

Добавлено спустя 3 минуты 4 секунды:
Vadim писал(а):Paster Fob
Поскольку у Вас процедура возвращает один единственный результат (количество заданных символов), логичнее было бы написать функцию:
Код: Выделить всё
Fuction Calc(arg:string; ch:char): integer;
Var
  k: integer;
Begin
  Calc:=0;
  For k:=1 To length(arg) Do
    If arg[k]= ch1 Then
      Calc:= Calc+1;
end;


...


Кстати, функция уже не работает. CH и CH1 - разные переменные.
Аватара пользователя
informat
новенький
 
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name

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

Сообщение Vadim » 08.05.2011 17:28:54

informat писал(а):Кстати, функция уже не работает. CH и CH1 - разные переменные.

Вижу преподавателя невооружённым глазом. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение Paster Fob » 08.05.2011 21:23:57

И Вас все преподаватели полюбят, как родного сына.

У меня нет преподавателей,я изучаю всё самостоятельно и об этом уже ни раз писал.Записаться на курсы не представляется возможным,т.к. живу не в городе,а в райцентре.А у нас такого ничего нет.В школе на информатике ученики либо в игры играют,либо в Ворде тексты пишут,вот такое обучение.Когда я в школе учился у нас вообще информатики не было,как и компов.
Поскольку у Вас процедура возвращает один единственный результат (количество заданных символов), логичнее было бы написать функцию

Это как урок на будущее,до функций я ещё не дошёл.

Добавлено спустя 6 минут 11 секунд:
А изучаю я Паскаль,вот по этой книге:http://oleg-derevenets.narod.ru/
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Пред.След.

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

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

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

Рейтинг@Mail.ru