мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
pascal:basics [06/10/2010 10:49] ocapascal:basics [04/07/2015 12:13] (текущий) oca
Строка 4: Строка 4:
 == Структура программы == == Структура программы ==
  
-Структура программы на языке Паскаль достаточно логична, но свободна, а потому сложно описать одновременно точно и доступно. +Общая структура программы на языке Паскаль задана жёстко и выглядит так: 
  
 <code pascal|Общая структура программы> <code pascal|Общая структура программы>
-Program <правильное имя>;               // Заголовок программы.  +Program <правильное имя>; 
-                                        // Данное предложение может отсутствовать,  +    // Предложение, содержащее **заголовок программы**.  
-                                        // поскольку в системе Free Pascal роли не играет. +    // Данное предложение может отсутствовать, поскольку в 
-                                        // Оно оставлено для совместимости с другими версиями языка+    // используемой нами системе Free Pascal 
 +    // и большинстве (во всех?) современных версий Паскаля  
 +    // никакой роли не играет. 
 +    // Оно оставлено для совместимости с другими версиями  
 +    // языка, которые его требуют. 
 +    // Например: 
 +Program ChoiseSort3v;  
 +    // Предложения заканчивается точкой с запятой     
  
-Uses <список подключаемых библиотек>;   // Раздел импорта +Uses <список подключаемых библиотек>;    
-                                        // Данное предложение может отсутствовать, если вы не используете  +    // **Раздел импорта**,  
-                                        // никаких дополнительных библиотек+    // который всегда состоит из одного предложения! 
 +    // Данное предложение может отсутствовать, если вы не  
 +    // используете никаких дополнительных библиотек
 +    // Например: 
 +Uses CRT, OGLgraph;   
 +    // Список разделяется запятыми,  
 +    // предложения заканчивается точкой с запятой  
                                                                                  
-<Раздел описаний>                       // Раздел глобальных описаний может состоять из нескольких подразделов, +<Раздел описаний>                        
-                                        // порядок следования которых довольно свободный,  +    // Раздел глобальных описаний может состоять из нескольких  
-                                        // но все они должны быть здесь - перед кодом.  +    // подразделов, порядок следования которых свободный,  
-                                        // Этот раздел содержит описание всего, что не задано изначально и не   +    // но все они должны быть здесь - перед кодом.  
-                                        // импортируется из  дополнительных библиотек.  +    // 
-                                        // В принципе, тоже может отсутствовать. +    // Этот раздел содержит описание всего, что  
 +    //   не задано изначально  
 +    //   не импортируется из библиотек, 
 +    //   не является локальным объектом внутри процедуры. 
 +    // А именно - именованные константы, пользовательские типы, 
 +    // переменные и наконец - имена меток.  
 +    // 
 +    // В принципе, этот раздел тоже может отсутствовать. 
                                                                                                                                                          
-Begin                                   // Обязательные операторные скобки Begin-end +Begin    // Обязательные операторные скобки Begin-end 
-  <Раздел кода>                         // Операторы, составляющие "главную процедуру" их тоже может не быть! +  <Раздел кода>                          
-End.                                    // Программа кончается точкой +    // Операторы, составляющие "главную процедуру"   
 +    // Чисто теоретически, их тоже может не быть! 
 +    // Тогда программа честно ничего не делает. 
 +    // Но "скобки" должны быть. 
 +End.     // Программа кончается точкой 
 </code> </code>
  
 +Текст в **угловых скобках** (символы < и >) требует замены "по смыслу". Не путайте с **операциями** < и >!
  
-Обратите внимание на жёсткий порядок следования частей программы на этом уровне детализации её структуры. Все части идут именно в этом порядке и не повторяются. Но некоторые могут отсутствовать совсем.+Ещё раз обратите внимание на жёсткий порядок следования частей программы на этом уровне детализации её структуры. Все части идут именно в этом порядке и не повторяются. Но некоторые могут отсутствовать совсем. 
  
 == Раздел описаний == == Раздел описаний ==
  
-Раздел описаний может состоять из нескольких подразделов, разбитых по категориям описываемых объектов - типов, переменных, меток и констант. Отдельными подразделами считаются каждая функция или процедура. +Раздел описаний может состоять из нескольких подразделов, разбитых по категориям описываемых объектов - типов, переменных, меток и констант. Отдельными подразделами считаются каждая функция или процедура.
  
-<code pascal|Пример раздела описаний> +<code pascal|Простой пример раздела описаний> 
-const  + 
-  n = 10;+const                    // Начался раздел констант 
 +  n = 10;                // Описание (именованной) константы
      
-var  +var                      // Начался раздел глобальных переменных,  
-  i, j : integer; +                         // значит - закончился раздел констант  
-  r, q : real;  +  i, j : integer;        // 1-е описание переменных 
 +  r, q : real;           // 2-е описание переменных 
 +  k, m : integer;        // 3-е описание переменных - снова integer.  
 +                         // Имеем право. 
 + 
 +Begin
      
 +  // Обязательный раздел кода
 +  ...
 +End.                  // Конец всему (в этой программе)!
 +
 </code> </code>
  
-Если что-то, описываемое вами, ссылается на что-то другое, то это другое должно быть описано ранее. Например, если вы используете константу для описания массива, то она должна быть описана заранее. Учтите, что библиотечные объекты, т.е. системные или описанные в библиотеках, подключённых с помощью //uses//, описывать не надо и на них можно ссылаться из любого места+Объекты программы могут быть связаны описанием.
  
 <code pascal|Cвязь между объектами> <code pascal|Cвязь между объектами>
Строка 56: Строка 91:
 </code> </code>
  
-Из этого правила есть единственное исключение, связанное с использованием указателей.+Запомните правило - **если что-то, описываемое вами, ссылается на что-то другое, то это другое должно быть описано заранее**. Например, если вы используете константу для описания массива (как в примере), то она должна быть описана выше по коду. Из этого правила есть единственное исключение, связанное с использованием указателей. 
 + 
 +Учтите, что библиотечные объекты, т.е. объекты системные или описанные в библиотеках, подключённых с помощью //uses//, описывать не надо и на них можно ссылаться из любого места. Но, как мы узнаем позже, их имена можно "перекрыть"
  
 Ниже приведён неправильный код, где ничего не описывается заблаговременно. Ниже приведён неправильный код, где ничего не описывается заблаговременно.
Строка 86: Строка 123:
   A,B : array[1 .. n] of integer;       // "Дописали" ещё часть переменных   A,B : array[1 .. n] of integer;       // "Дописали" ещё часть переменных
 </code> </code>
 +
 +=== Полный пример ===
 +
 +Подразделы могут следовать в любом порядке и повторяться. 
 +
 +В примере приводится "канонический" порядок следования подразделов - именованные константы, типы, переменные. За ними часто следуют описания одной или нескольких процедур и функций, которых в примере нет. Затем порядок может повториться. Это делается, чтобы разбить все объекты, используемые в программе "по смыслу" - типы, определённые пользователем, процедуры, работающие с этими типами и вспомогательные объекты - константы и служебные переменные. 
 +
 +Метки описываются там, где это удобно.
 +
 +<code pascal|Пример раздела описаний>
 +
 +...                      // Здесь могли бы быть заголовок и раздел импорта 
 +const                    // Начался 1-й раздел констант
 +  Pi = 4.0;              // Описание (именованной) константы
 +                         // Внимание - мы перекрыли системное определение Пи!
 +
 +var                      // Начался 1-й раздел глобальных переменных, 
 +                         // значит - закончился раздел констант 
 +  i, j : integer;        // 1-е описание переменных
 +  r, q : real;           // 2-е описание переменных
 +  k, m : integer;        // 3-е описание переменных - снова integer. Имеем право.
 +  
 +const                    // Начался 2-й раздел констант
 +  n = 10;                // Описание (именованной) константы
 +  
 +type                     // Начался раздел типов
 +  A10 = array[1..n] of integer;
 +                         // Это тип, определённый пользователем.  
 +                         // Обратите внимание - мы использовали 
 +                         // ранее описанную константу
 +                         
 +var                      // Начался раздел переменных, закончился раздел типов
 +  A,B  : A10;            // 4-е описание переменных пользовательского типа A10 
 +  
 +  ...                    // Что-то ещё, возможно - ничего
 +  
 +  // Где-то здесь кончается раздел переменных
 +
 +label                    // Раздел меток нужен редко
 +  1, endOfAll;           // список объявленных меток
 +                         // Теперь это "законные" метки
 +  
 +  ...                    // Что-то ещё, возможно - ничего
 +  
 +  Begin
 +  
 +  // Обязательный раздел кода
 +
 +  ...
 +  
 +  End.                  // Конец всему (в этой программе)!
 +</code>
 +
 +
  
  
Строка 94: Строка 185:
 <code pascal|Пример 1> <code pascal|Пример 1>
 Begin Begin
-                    // Если убрать этот комментарий, то получится  +   // Если убрать этот комментарий, то получится  
-                    // минимальная правильная программа на Паскале+   // минимальная правильная программа на Паскале 
 +   // Впрочем, для Паскаля его и нет.
 End. End.
 </code> </code>
  
-Данная программа работает (стирает с экрана следы работы предыдущих программ), но не содержит ни одного описания.+Данная программа действительно работает (стирает с экрана следы работы предыдущих программ), но не содержит ни одного описания. Её реальный аналог есть, например, в операционной системе ДОС.
  
 <code pascal|Пример 2> <code pascal|Пример 2>
Строка 120: Строка 212:
 Const               // Раздел констант  Const               // Раздел констант 
   n = 5;            // В данном случае n - не переменная, а другое обозначение 5.   n = 5;            // В данном случае n - не переменная, а другое обозначение 5.
-  m : integer = 6;  // Один из ужасов Паскаля. Это - статическая переменная! Без понимания, что к чему, лучше не использовать.+  m : integer = 6;  // Один из ужасов Паскаля. Это - статическая переменная!  
 +                    // Без понимания, что к чему, лучше не использовать
 +                    // но это - настоящая переменная
      
 Var                 // Раздел переменных Var                 // Раздел переменных
   i:integer;        // Запасная переменная - нам не потребуется   i:integer;        // Запасная переменная - нам не потребуется
      
-Label               // Раздел меток. У меток описывать нечего, но они должны быть перечислены. +Label               // Раздел меток.  
-  BeeginProgram,  EndProgram +  BeeginProgram,    // У меток описывать нечего, но они должны  
 +  EndProgram;       // быть перечислены. 
 +   
 +Type 
 +  S100 =  string[100]
  
 Procedure Proc(x:integer); Procedure Proc(x:integer);
 +// Данная процедура принимает параметр x
 +// после чего всегда печатает:  
 +// "Опять - 25. Не мешайте работать!"
  
 +Const 
 +  S2 = '. Не мешайте работать!'; 
 +Var   
 +  S1 : S100; 
 +  
 Begin: Begin:
-  writeln('Не мешайте работать!')+  x  := n;           // Для данной процедуры значения параметров не важны  
 +  S1 := 'Опять '
 +  writeln(S1, x, S2 );
 End; End;
  
-Begin +Begin                 
-BeginProgram:  +BeginProgram:        // Метка ничего не делает, но место указывает 
-  goto EndProgram;   // Хватит работать пошли домой +  ;                  // Отсюда собираемся работать 
-  Proc(n);  +  goto EndProgram;   // Хватит УЖЕ работатьпошли домой 
-EndProgram:           +  Proc(n);           // Здесь мы к счастью никогда не побываем, 
-  ;   +  goto BeginProgram; // иначе - никогда не выберемся  
-End.+EndProgram:          // Место у выхода 
 +  ;                  // Перекур после честной работы  
 +End.                 // Теперь - совсем всё 
 </code> </code>
  
Строка 201: Строка 310:
 end. end.
 </code> </code>
 +
 +Одним оператором (командой) ввода/вывода можно вводить/выводить значения нескольких аргументов, в том числе - разнотипных. 
 +
 +begin
 +  writeln("Полученное значение ", 0.3);       // Обратите внимание на пробелы
 +  
 +  writeln( 100.0:5:2,  '(км/ч)');                               //
 +  writeln( 200.0:5:2,  '(км/ч)');
 +  writeln( 300.0:5:2,  '(км/ч)');
 +  
 +  writeln( sin(3.14*1/2):8:4, 
 +           sin(3.14*1/4):8:4, 
 +           sin(3.14*1/8):8:4 );
 +end.
  
 == Распространённые ошибки == == Распространённые ошибки ==
Строка 216: Строка 339:
  
 begin begin
-  read (0.3);                            // чтение "в никуда" - нет переменной, которая примет значение. +  read (0.3);                            // чтение "в никуда" - нет переменной, которая примет введённое значение. 
   read (x);                              // тоже самое, но константа указана по имени   read (x);                              // тоже самое, но константа указана по имени
-  readln (0.15 * y);                     // тоже самое, +  readln (0.15 * y);                     // тоже самое, но вместо константы - целое выражение
   readln (A);                            // составной тип данных можно заполнять только по-элементно   readln (A);                            // составной тип данных можно заполнять только по-элементно
-  readln (F);                            // "неудачное" чтение из файла - и файл не открыт, и не указана переменная-приёмник +  readln (F);                            // "неудачное" чтение из файла - и файл не открыт, и не указана  
 +                                         // переменная-приёмник. Считать же саму файловую переменную F - нельзя!
 end. end.
 </code> </code>
  
 <code pascal|Бессмысленный вывод> <code pascal|Бессмысленный вывод>
-</code> +var  
- +  A : array[1..9] of integer; 
-Одним оператором (командой) ввода/вывода можно вводить/выводить значения нескольких аргументов, в том числе - разнотипных+  F : text;
- +
  
 +begin
 +  writeln (x, 0.15 * y, 0.3);             // Вывод - будет, но все выводимые значения сольются в нечто нечитаемое
 +  writeln (A);                            // составной тип данных можно выводить только по-элементно
 +  writeln (F);                            // "неудачнае" запись в файл F - и файл F не открыт, и не указано, 
 +                                          // что выводить. Выводить таким образом у файл F - нельзя!
 +end.
 +</code>