Страница 3 из 8

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

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

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

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

Добавлено: 03.05.2011 10:22:17
vada
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 всго один оператор. А вдруг вы потом еще парочку напишите?

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

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

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

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


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

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

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

Вот не стоет этого делать. Лишние скобки не всегда лишние для понимания кода.
Паскаль позволяет писать

Код: Выделить всё

if a > b

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


Это мелочи по сравнению с плохим использованием меток, break и continue,
Там такие путаные коды начинающие делают, потом и гуру не разобраться. :D

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

Добавлено: 03.05.2011 15:58:00
Padre_Mortius
informat
Изначально нужно иметь понимание вопросов работы подпрограммы, как общей сущности функции и процедуры. И необходимо уметь правильно использовать использовать функцию и процедуру в простых случаях. А тонкости, при использовании параметров-переменных, имхо, можно оставить и на более продвинутый уровень, когда появится понимание необходимости таких использований.

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

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

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

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

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

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

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

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

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

помню что ещё есть косинус,тангенс и катангенс.Что они означают не помню,знаю что с углом что-то связано.Помню ещё таблицы изучали связанные с этим.Один знакомый решал задачу за 8 класс,по алгебре.Блин,я её перечитывал раз 10,но даже не понял задания.

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

Добавлено: 03.05.2011 19:56:32
daesher
IMHO логично давать var- (а, может, даже и out-) параметр сразу после изучения функций в качестве ответа на вопрос: "А что, если из подпрограммы надо передать два или более значения, а новый временный тип изобретать не хочется".

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

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

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

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

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

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

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

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

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

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

Добавлено: 08.05.2011 09:47:46
Paster Fob
Привет всем.По-маленьку разбираюсь,не так страшен чёрт,как его малюют.Прочитал пару раз не много разобрался.Решаю задания.
значит дана процедура 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.

Программа работает.Так что прогресс в изучении на лицо.

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

Добавлено: 08.05.2011 13:09:45
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]= 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.


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

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

Добавлено: 08.05.2011 16:56:07
informat
Если писать для преподавателей, то одно дело.
Если для себя, чтобы было потом легче самому, то другое.

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

Добавлено спустя 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 - разные переменные.

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

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

Вижу преподавателя невооружённым глазом. :)

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

Добавлено: 08.05.2011 21:30:08
Paster Fob
И Вас все преподаватели полюбят, как родного сына.

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

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

Добавлено спустя 6 минут 11 секунд:
А изучаю я Паскаль,вот по этой книге:http://oleg-derevenets.narod.ru/