Квант

50

φ=arcsin⁡mgNsin⁡α.\varphi = \arcsin \frac{mg}{N} \sin \alpha.

Найдем теперь радиус кривизны траектории точки. Как мы уже говорили, в неподвижной системе координат скорость точки v⃗\vec{v} складывается из скоростей ее поступательного и врашательного движения (см. рис. 4). По теореме косинусов квадрат модели скорости равен
v2=v02+v02−2v02cos⁡(180∘−α)=2v02(1+cos⁡α).v^2 = v_0^2 + v_0^2 - 2v_0^2 \cos(180^\circ - \alpha) = 2v_0^2(1 + \cos \alpha).
Проекция ускорения точки на направление, перpendикулярное к скорости, равна

Задача
для исследования

Рассмотрим такую задачу: Плоскость замошена конгузтивными прямоуольниками, не имеющими общих внутренних точек, причем любой из них можно совместить с любым другом таким перемещением плоскости, что все остальные прямоуольники совмещаются. Чему может равнять число к соседей каждой прямоуольника (то есть число прямоуольников, имеющих с данным хотя бы одну общую точку)? Сколько различных типов таких замошений существует для каждой k?

Подумайте над ее решением и… ее формулировкой (второй вопрос сформулирован несколько нечетко; прежде чем на него ответать, нужно уточнить смысл выражения «различных типов») и напишите нам. Найболее интересные ответы будут опубlikованы.

В. Сапич,
В. Чванов

Задачи
наших читателей

  1. Из точки A и B при молинейной дороги одновременного трояются с места два автоматила и движутся с одним и тем же постоянным ускорением a⃗\vec{a}. В некоторых точке C дороги начинается участок, покрытый ледной коркой (где трене отсутствует). Каково расстояние от точки B до точки C, если известно, что первый автоматиль, стартовавший из точки A, догнал вторый автоматиль через промежуток времени t после прохождения первого точки C?

Г. Левин

  1. Как вы думаете, в каком случае вода закипит быстрее: если стакан с опущенным в него электрокипилком поставить на батарею или на подоконник? Казалось бы — в первом, поскольку воздух над батареей теплее, чем над подоконником. Однако дает детатировать. Эффект невыкления (около 10%), но достоверен. Чем он может быть вызван?

Л. Ашкинзи

  1. Замечательный русский физик П. Н. Лебедев доказал, что свет при взаимодействии с веществом оказывает на него давление. Какую массу может управляться лучлазera мощностью N?

А. Королевский

52

дельно и может быть использовано неределенно. Программа на Паскале записьается в память ЭВМ полностью и только после этого может быть использована. Каждая программа на Паскале представляет собой процессура, которое называют основной процессурой. Как и всякая процессура, программа на Паскале имеет имя, а ее предписания называют операторами.

Текст любой программы на Паскале состоит из нескольких разделов:

  1. Заголовок программы
  2. Раздел описания меток
  3. Раздел описания константы
  4. Раздел описания типов данных
  5. Раздел описания переменных
  6. Раздел описания функций и процедур
  7. Раздел операторов
    Tri раздела, выделенные жирным шрифтом, является обязательными для любой программы. Начиные остальных разделов в программе необязательно. О назначении и правилах записи каждого раздела мы рассскажем по мере изучения языка. Каждый раздел программы начинается со своего ключевого слова. Разделы отделяются друг от друга точкой с запятой (;). Ключевые слова — английские. В конце каждого урока мы будем приводить слова — список ключевых слов, впервые встретились в данном уроке. Советем вам выписывать все ключевые слова (вместе с переводом) в отдельную тердаль. Мы будем выделять ключевые слова жирным шрифтом*); при оформлении ваших работ их следует подчеркивать прямой чертой. Для удобства чтения имена в программах мы будем выделять курсивом, а вы должны их подчеркивать волнистой линейей.

Заголовок программы
Его синтаксическая диаграмма имеет вид:

Именем программы и, вообще, именем в Паскале может быть лю-
*) Иногда в печатных изданиях их выделяют курсивом.

бая последовательность букв и цифр, начинающаяся с буквы. Имена различются по первым восьми символам. Слово output, указанное в заголовке программы, сообщает машине о том, что в программе предустана печать результат, а слово input — о том, что некоторые величины будут присвоены значения во время использования программы (об этой возможности будет сказано ниже).

Раздел операторов
Раздел операторов — основной раздел программы. Его синтаксическая диаграмма имеет вид:

Раздел состоит из последовательности операторов, заключенных между ключевыми словами begin и end, называемых в дальнейшем операторными скобками. Друг от друга операторы отделяются точкой с запятой (;). В конце программы ставится точка (.). В одной строке можно записать любое количество операторов.

Выражения
В языке Паскаль используется следующие знаки арифметических операций (такие же, как в Папире):

  • сложение,
  • вычитание,
  • умножение,
    / деление.

Операция «возведение в степень» в языке не предусмотрена. Зато в Паскале есть еще две арифметические операции, примененные к целым числам:
div — целочисленное деление (вычисляется частное от деления двух натуральных чисел),
mod — вычисление остатка от целочисленного деления*)
При этом, как обычно, учитывает наличие скобок. Например, что при

*) Например, 25 div 6=4, a 25 mod 6=1.

53

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

Оператор присваивания

Оператор присваивания описывается следующей diagramмой:

Например, x:=3x := 3; читается так: «имени xx присвоить значение 3» (обратите внимание, что, по сравнению с Рапирой, имя и выражение помещались местами!).

Вычисление значения выражения
z=x2+y2xyz = \frac{x^2 + y^2}{xy} при x=3,y=5x = 3, y = 5 может быть выполено с помощью следующей последовательности операторов:
x:=3;y:=5;x := 3; y := 5;
z:=(x∗x+y∗y)/(x∗y);z := (x*x + y*y) / (x*y);

Процедуры печати

Для печати в Паскале есть две процедуры writeln* и write. Каждый из них может иметь любое количество параметров. В результате использования этих процедур значения всех параметров будут отпечатны на одной строке. Разница между этих процедурами состоит в следующем: после выполнения процедуры writeln происходит переход на новую строку (как в процедуре ПЕЧАТЬ в языке Рапира), а после выполнения процедуры write переход на новую строку не происходит и печать по последующим процедурам печати writeln или write будет произходить на той же строке. При вызове процедуры writeln без параметров произходит переход на новую строку, то есть теперь вызов любой из процедур печати обеспечит печать с новой строки.

Например, результатом выполнения последовательности операторов
a:=3;b:=6;a := 3; b := 6;
write(′A=′,a,′B=′,b);write ('A=', a, ' B=', b);
write(′BCE′);writeln;write (' BCE'); writeln;

будет строка A=3A = 3 B=6B = 6 BCEBCE, а результатом последовательности операторов
a:=3;b:=6;a := 3; b := 6;
writeln(′A=′,a,′B=′,b);writeln ('A=', a, ' B=', b);
write(′BCE′);writeln;write (' BCE'); writeln;

будет печать двух строк
A=3B=6A = 3 \quad B = 6
BCEBCE

Обратите внимание на то, что в обихх примерах в конце последовательности процедур печати стоит writeln. Это не случайно: процедура writeln всегда завершает формирование печатаемой строки и выводит ее на печатающее устройство. Без этой процедуры в нашем примере последнее BCEBCE может оказаться неапретаатным.

Данные. Процедуры ввода

Как уже отмечалось, программа на Паскале начинает исполнять только после того, как будет целиком введена в память ЭВМ. А как бы, если некоторым именам нужно присвоить значения во время исполнения программы? В Рапире для этого была предусмотрена процедура BVOД (см. «Квант», 1980, № 7), с помощью которого необходимо значение можно было задать во время диалога. В Паскале возможно также диалога отсутствует. Поэтому нужно заранее, до начала исполнения программы, «заготовить» все данные (числа, тексты,…), которые необходимо для ее работы. Но где записать эти данные и как машина узнет, каким именам нужно присвоить те или иные значения?

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

В Паскале вместе процедуры BVOД применяют процедуры read и readln*. Каждый из них может иметь любое число параметров, которые обязательно должны быть именами. Механизм работы обеих

*) writeln — «слияние» двух англійских слов write и line.

*) readln — «слияние» двух англійских слов read и line.

54

процедур следующий: первое значение, указанное в списках данных, «считывает» и присваивается перому имену, записанному в списке параметров процедуры, затем будет «прочитано» и присвоено второму имену следующое значение и т. д., пока всем именам не будут присвоены значения. Понятно, что количество данных должно соответствовать числу имен, указанных при вызове процедуры ввода (или, по крайней мере, не быть меньше). В одной программе может быть записано несколько вывовов процедур read и readln. В этом случае список данных должны содержать данные, необходимые для успешной работы всех процедур ввода.

Разница между работой процедур read и readln состоит в следующем: после выполнения процедуры read значение следующого данного считывания с этой же строки, а после выполнения процедуры readln — с новой строки. (Сравните с работой процедур write и writeln!) Например, если в программе записано read (a, b, c), а список данных состоит из чисел 5,7 и 13, то при использовании программы будет выполнен присаивание: a:=5; b:=7; c:=13. Числовые данные в списке данных отделяются друг от друга только пробелами. При подготовке программы к вводу в память машинных список данных отделяют от основного текста программы записью специальной строки. Мы условиями отделять список данных от текста программы горизонтальной чертой.

Рассмотрим пример. Пусть в память машинны нужно ввести три цифры a1, a2, a3, являющиеся последовательными цифрами десятичной записи неокоторого числа, и запись последовательность операторов для нахождения и печати этого числа.

begin

read (a1, a2, a3);
x:=100*a1+10*a2+a3;
writeln ('X=', x)
end.

507

В результате исполнения этой по-closedовательности операторов будет отпечатано X=507.

Описания

При изучении языка Робик мы говорили о том, что каждому имену, используемого в программе, отводится блок памяти ЭВМ. При этом возникают вопросы: когда происходит это распределение памяти? Сколько места нужно отвести для хранения значений различных имен? Как ЭВМ узнет, какие значения (например, числа или тексты) может принять то или иное имя?

При написании программы на некоторых языках программирования (например, на Робике или на Рапире) ЭВМ сама «отвечает» на эти вопросы. Для этого ей нужно, например, просмотреть весь текст программы и проследить, какие значения может принять каждое из имен и изменяются ли эти значения во время выполнения программы. При таком анализе программы требуются дополнительное время и место в памяти.

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

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

Константы — это неизменные величины. Различают две категории константа. Одна из них не предусматривает никакого дополнительного описания: константа определяется своим изобразением. Например, 5 — это числовая константа, которая, будучи употреблен в любом месте программы, представляет

55

ляет число пять; ‘олубой’ — это текстовая константа; далее мы еще познакомимся с константими иной природы.

Другая категория констант — это так называемые именованные константы. Любой константе можно дать имя, и тогда в программе употребление этого имени будет обозначать обращение к константе. Если, например, величины 3.1415926 называются именем nu, то программист имеет право писать

l:=2∗nu∗rl := 2 * nu * r

где ll и rr — переменные, а nunu — именованная константа. Соответствие между именованным константими и их именами устанавливается в разделе описания констант.

Раздел описания констант может быть описан диаграммой:

Diagram of a control system with inputs and outputs

Важнейшим свойством имен в Паскале является понятие типа. Тип задает некоторое упорядоченное множество значений и набор допустимых операций над этим значениями.

Описание скалярного типа задается диаграммой:

Diagram of a control system with inputs and outputs

Сам же раздел описания типов данных можно задать диаграммой:

Diagram of a control system with inputs and outputs

Здесь const, type, var — ключевые слова разделов описания констант, типов и переменных соответственно.

Тепер возникают два вопроса: как правильно задать типы данных в программе и каким удобным образом можно представить данные каждойТОПа в памяти машины?

Все типы данных можно разбить на два больших класса — скачярные и структурные. Если значения переменных данного типа составят из отдельных компонент (как, например, множество и кортежи в Рапире), то такой тип называется структурным, в противном случае — скачярным.

На этом уроке мы будем рассмотреть только скачярные типы данных. Описанию структурных типов данных будет посвязываться следующим.

Например, раздел описания типов данных в программе может быть таким:

цвет=(красный, желтый, зеленый, голубой);\text{цвет} = (\text{красный, желтый, зеленый, голубой});

физура=(треугольник, прямоугольник, круг);\text{физура} = (\text{треугольник, прямоугольник, круг});

Здесь красный, круг,… — константы, определяемые своим представлением.

Описем теперь переменную x типа цвет и переменную a типа физура.

х: цвет; а: физура;

Это означает, что переменная x может принимать одно из значений красный, желтый, зеленый, голубой, а переменная a — одно из значений треугольник, прямоугольник, круг. Заметим, что имя типа можно не указывать, если обединить описание переменных и определение типа, то есть мы могли переменные x и a описать так:

х: (красный, желтый, зеленый, голубой);
а: (треугольник, прямоугольник, круг);

Однако, если таких описаний не сколько (например, в разных проедурах), то лучше все-taki описать тип и дать ему имя.

Описанные таким образом типы не должны содержать одинаковых константы.

Кроме типов, описываемых в программе, существует стандартные τι-