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

Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
pascal:basics [20/09/2010 12:17] 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>
 +
 +Объекты программы могут быть связаны описанием.
  
 <code pascal|Cвязь между объектами> <code pascal|Cвязь между объектами>
Строка 53: Строка 90:
   A,B : Arr10;                          // Используем описание типа Arr10 для описания переменных A, B    A,B : Arr10;                          // Используем описание типа Arr10 для описания переменных A, B 
 </code> </code>
 +
 +Запомните правило - **если что-то, описываемое вами, ссылается на что-то другое, то это другое должно быть описано заранее**. Например, если вы используете константу для описания массива (как в примере), то она должна быть описана выше по коду. Из этого правила есть единственное исключение, связанное с использованием указателей.
 +
 +Учтите, что библиотечные объекты, т.е. объекты системные или описанные в библиотеках, подключённых с помощью //uses//, описывать не надо и на них можно ссылаться из любого места. Но, как мы узнаем позже, их имена можно "перекрыть"
 +
 +Ниже приведён неправильный код, где ничего не описывается заблаговременно.
  
 <code pascal|Так нельзя! > <code pascal|Так нельзя! >
 +
 +var
 +  A,B : Arr10;                         // А что это?                 
 +  
 +type
 +  Arr10 = array[1 .. n] of integer;    // И сколько же это будет? 
 +    
 const  const 
   n = 10;   n = 10;
-type +    
-  Arr10 = array[1 .. 10] of integer;+</code> 
 + 
 +В раздел описаний может входить несколько "однотипных" подразделов описаний. 
 + 
 +<code pascal|"Одинаковые" подразделы> 
 var var
-  A,B : Arr10    +  i, j : integer;                       // Описали часть переменных 
 + 
 +const  
 +  n = 10;                               // Спохватились и описали константу n 
 + 
 +var 
 +  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>
 +
 +
 +
  
 == Примеры программ нелепых, но синтаксически грамотных == == Примеры программ нелепых, но синтаксически грамотных ==
Строка 69: Строка 185:
 <code pascal|Пример 1> <code pascal|Пример 1>
 Begin Begin
-                    // Если убрать этот комментарий, то получится  +   // Если убрать этот комментарий, то получится  
-                    // минимальная правильная программа на Паскале+   // минимальная правильная программа на Паскале 
 +   // Впрочем, для Паскаля его и нет.
 End. End.
 </code> </code>
  
-Данная программа работает (стирает с экрана следы работы предыдущих программ), но не содержит ни одного описания.+Данная программа действительно работает (стирает с экрана следы работы предыдущих программ), но не содержит ни одного описания. Её реальный аналог есть, например, в операционной системе ДОС.
  
 <code pascal|Пример 2> <code pascal|Пример 2>
Строка 95: Строка 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>
  
Строка 176: Строка 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.
  
 == Распространённые ошибки == == Распространённые ошибки ==
Строка 191: Строка 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>