#3 Типы данных в языке Pascal. Объявление переменных. Целые числа integer. Оператор присваивания. Инициализация в Паскаль
Примечание: далее мы начнём говорить о типах данных в Паскале. Выясним следующие:
- все данные в паскале имеют в определённый момент времени выполнения программы какой-то тип (разные данные -разный);
- узнаем какие конструкции обладают типом данных;
- поговорим о первом типе данных, который служит для описания целых чисел и имеет название "integer". А о данный других типов поговорим уже в следующих уроках;
Деление данных на виды "по представлению в коде программы" на языке Pascal
Рассмотрим три вида представления данных в коде программы на языке Паскаль ("виды представления данных"):
- В виде литералов -- т.е. быть явно записаны в программе, например, как числа или строки в кавычках.
- По именам переменных. Переменная -- это псевдоним (имя) для хранящихся в ней данных (например, числа или строки).
Любая переменная похожа на звание чемпиона -- конкретный человек носящий это звание меняется, но само звание звучит одинаково (не меняется) для разных людей в разные годы.
Здесь звание чемпиона - это имя переменной, а конкретный человек -- данные, в данный момент записанные в неё. Значения переменных в программе можно менять сколько угодно раз.
В отличие от литерала, переменная может сколько угодно раз в теле программы менять своё значение.
Подробнее о переменных мы поговорим далее в этом уроке.
Выражение -- последовательность действий над фрагментами данных, приводящая к каком-то результату. В Паскале этот результат всегда имеет определённый тип. Выражения работающие с числами называют арифметическими выражениями. Существуют и другие типы выражений.
Подробнее о выражениях мы поговорим далее.
Таким образом, любые данные к коде программы на языке Паскаль можно отнести к одному из трёх видов:
- или к переменным
- или к литералам
- или к результатам выражений
Сильная типизация
Паскаль -- язык т.н. статической ("сильной" ."постоянной") типизации. Это значит, что для каждой переменной требуется, чтобы переменная было объявлена с указанием к какому типу она принадлежит до использования этой переменной в теле программы. Далее мы изучим базовые типы данных и, как следствие, переменные, которые используются в Паскале.
Типы данных в Pascal
В Паскале выделяют 5 типов данных (в списке сразу укажем ключевые слова, с помощью которых обозначаются эти типы в программном коде):
- integer -- целые числа.
- real -- вещественные числа.
- boolean -- логический тип данных (значения типа да/нет, истина/лож).
- char -- символьный тип.
- string -- строковый тип.
В этом уроке мы будем говорить об понятия общих для всех типов данных на примере конкретного типа данных -- integer (целые числа).
Чем отличаются "виды представления данных" от типов данных
Если виды представление данных - это просто различная форма записи обращения к какой либо информации в коде программы, то деление на типы данных - позволяет отнести к одной группе данные вне зависимости от их вида.
Как мы увидим позднее одного и того же типа могут быть и переменные и литералы и результаты выражений, а , в связи с чем, можно нарисовать такую диаграмму, иллюстрирующую соотношение между типами данных и видами представления данных:
Объявление переменных
Объявление переменных -- это уведомление компилятора Паскаль о том, что в вашей программе будут использоваться переменные с указанными именами, каждая из которых имеет определённый (указанный в секции объявления) тип.
При объявлении переменной всегда указывают:
- Имя переменной.
- Тип переменной.
Объявление переменных происходит после ключевого слова var, до до тела программы.
В общем виде объявление переменной можно записать так (как схему):
Пример объявления переменных по одной:
То есть сначала идёт имя переменной, потом двоеточие, а потом один из типов данных (integer, string или иной -- смотря какой требуется).
Объявление переменных спискомТакже переменные можно объявлять списком (переменные одного типа можно просто перечислить через запятую, а потом после двоеточия указать типа):
-- в списке имена переменных разделяются запятой, переносы строк между элементами списка значения не имеют.
В этом уроке мы поговорим о типе integer и рассмотрим примеры работы с этим типом данных.
Объявление целочисленных переменных
Integer -- тип данных соответствующий целым числам.
Объявим переменную такого типа:
Можно объявить несколько переменных немного по-разному:
Перед запуском программы, все переменные которые используются в её теле необходимо объявить. Если вы объявите какие-то переменные, но использовать их не будете, то к ошибке это не приведёт, но считается плохим стилем.
Оператор присваивания
Оператор -- это знак операции, например знак суммы это "$+$".
Оператор присваивания обозначается знаком (из двух символов): $:=$ Этот оператор позволяет записывать значение в переменную ("запоминать это значение в переменной"), схема его работы такова:
Или, опять же схематично:
А теперь как это выглядит с конкрентыми именами переменных и значениями в коде (пример работы оператора присваивания):
Присваивание переменным литералов и вывод значений переменных на экран
Далее, в теле программы мы можем записывать в данную переменную значения, например:
-- если это литералы, то они должны быть целочисленными, так как типы данных при присваивании в Паскаль всегда должны совпадать. После операции присваивания ставится точка с запятой.
Целый тип также поддерживает ноль и отрицательные значения:
Присваивание значений одних переменных другим переменным
Можно присваивать одним переменным значение других, например:
Вывод значений переменных на экран
Чтобы узнать чему стало равно значение переменной $a$ можно вывести её значение в консоль, передав как аргумент в стандартную процедуру writeln() или write(). Тогда наш код будет выглядеть так:
Что мы получим в консоли? Запустите код, объявив обе переменные и оформив тело программы (его содержимое это и есть последние 3 строчки).
Переменные тоже можно передавать во writeln() в любом количестве, разделяя запятой, например две шутки:
в том числе и вперемежку с литералами, например символьными:
Присваивание переменным результатов выражений
Переменным можно присваивать результаты выражений. Для для переменных числового типа (integer или real) такие выражения называются арифметическими. Целочисленным переменным можно присваивать значения выражений, которые получаются в результате выполнения операций:
- $+$ суммы (сложения)
- $-$ разности (вычитание)
- $*$ произведения (умножение)
-- так как эти операции возвращают тип integer. Операцию же деления $/$ использовать нельзя, так она возвращает другой тип -- real (вещественные числа). В Паскале любая попытка присвоить переменной данные другого типа приводит к ошибке ("падению" программы).
Что определяет тип арифметических выражений
Также в выражения, значения которых можно присваивать переменным типа integer должны входить только:
- целочисленные литералы
- или целочисленные переменные.
Можно сказать что тип, который возвращается выражением (тип его результата) определяется двумя моментами:
- типом операций (допустимые перечислены выше)
- типом операндов. Операнды -- это аргументы операций, подобно аргументам процедуры на их основе производятся какие-то действия. Но операнды операций, в отличие от аргументов процедур, записываются не в скобках, а справа и слева от знака операций, так как мы это делаем в математических выражениях:
Таким образом, допустимы выражения:
А также выражения с участием других переменных:
Работа с результатом выражений
Результат выражения представляет собой данные, которые в Паскале всегда обладают с каким-то конкретным типом, потому с выражениями можно делать то же что и с переменными и литералами, а именно:
- Присваивать их значения переменным, например: a := 22 + 3* 999;
- Делать одни выражения частью других (в этом случае части называют подвыражениями), например сделаем предыдущее выражение подвыражением:
Подвыражение -- это любая часть основного выражения, в которой есть хотя бы один оператор (как и выражение всегда обладает каким-то возвращаемым значение известного типа). Например:
Это подвыражение выражения:
Во write() и writeln() также можно передавать любое количество аргументов-выражений, а также аргументов другого вида:
Инициализация переменной
Инициализация переменной -- это первое присваивание какого-то значения переменной. Это может быть:
- или значение литерала
- или считывание значения для переменной извне (например, пользователь может вводить значение переменных в консоли, но об этом мы поговорим в следующих уроках)
- или присваивание данной переменной значения другой, уже инициализированной переменной.
- или значение выражения, в котором или одни литералы или инициализированные переменные или и то и то
Таким образом один из примеров выше мы могли бы переписать с такими комментариями:
Программа выполняется сверху вниз построчно -- перезапись значений переменных
Программа выполняется сверху вниз построчно, т. е. сначала первая строка тела программы потом вторая и т.д. -- а потому значение переменной в каждой строке программы (по мере её достижения) меняется в случае если очередной раз присваивается какое-то другое значение, отличное от того, что было раньше.
Для одного из приведённых примеров справа в комментариях допишем чему оказываются равны переменные после выполнения очередной строки:
-- то есть (во время выполнения программы) после её выполнения, например:
-- с помощью комментариев для последней строки показано, что значение меняется после выполнения операции присваивания "сразу после точки с запятой", и если в следующих строках переменной не присваивают какое-то другое значение, то оно и не меняется.
Разбор практических примеров
Пример №1У вас есть целочисленная переменная $a$ и два строковых литерала:
и второй:
Присвойте переменной $a$ значение и выведете на экран фразу с этим значением -- используя указанные выше литералы (можно не только их, но их обязательно), например для:
Должно выводиться:
Начнём писать код, в теле программы:
-- таким образом мы выполнили первое требование задачи, присвоив значение переменной. Далее от нас хотят, чтобы программа выводила фразу, где число яблок зависит от значения переменной $a$ (а точнее равно ему), при этом про число груш ничего не сказано. Второй момент -- необходимо использовать литералы в точности так как они приведены в условии, что ж попробуем вывести фразу, используя значение переменной и указанные литералы:
-- раз про груши ничего не сказано, то их число выводим просто в составе строкового литерала (оно не будет меняться пока мы не изменим сам литерал), а вот число яблок передаём в процедуру как значение переменной $a$. Заметьте, что литерал: ' и 8 груш' мы начали с пробела, чтобы при выводе он не "склеился" со словом "яблок".
Запустите последний код. Чего-то там не хватает? А именно -- в консоли мы получим:
-- почему склеилось имя и значения? Чтобы понять это нужно внимательно посмотреть на код вызова процедуры:
-- как мы можем видеть, здесь в конце первого аргумента-литерала нет пробела, а значит значение переменной $a$ (которое есть само по себе просто число, а значит содержать пробелов не может) просто выведется вплотную к первому аргументу. Чтобы исправить эту ситуацию, можно было бы изменить первый литерал, добавив в его конец символ-пробел:
НО: таким образом мы бы не следовали строго условию задачи использовать указанные строковые литералы ('У Коли' и ' яблок'), так как фактически
-- это разные литералы (в первом на один символ больше и этот символ -- пробел). А значит, чтобы не модифицировать первый строковый литерал, просто добавим в вызов ещё один аргумент -- символьный литерал (а точнее - пробел):
-- что и будет подходящим вызовом процедуры writeln() для решения задачи.
Пример №2Пусть у вас есть задача:
Васе $m$ лет, а Паше $k$ лет. Напишите программу, в которая считает разницу между возрастом Васи и Паши (то есть выясняет насколько Вася старше Паши). Конкретные значения возрастов этих двух человек задайте в коде в виде двух переменных, которым присвойте целые численные значения (используя целочисленные литералы). Результат запишите в третью переменную и выведите значение на экран.
Начнём решать данную задачу. В начале условия сказано, что возраста обоих героев надо задать как значения переменных, давайте сделаем это с помощью оператора присваивания:
Далее разницу их возрастов просят записать в третью переменную, что ж сделаем и это:
В самом конце нас просили вывести значение разницы на экран, сделаем и это используя вызов стандартной процедуры writeln(), в качестве пояснения пользователю передав строковый литерал как аргумент перед вторым аргументом-переменной:
То есть в данный момент мы имеем код:
Осталось объявить все используемые в теле программы переменные. В данном случае их 3 штуки, объявим их через запятую в секции var до начала тела программы:
Запустите этот код и посмотрите как он работает, если консоль закрывается сразу после выполнения кода, используйте вызов для задержки консоли.
Видео-пояснения
К этому уроку есть следующие видео:
Задачи для самостоятельного решения
Теоретические вопросы:Объясните что здесь происходит.
И ещё один вопрос: Будет ли работать код:
Объясните что здесь происходит.
Два задания к этому коду:
- Ответьте на вопросы в комментариях письменно.
- Запустите этот код, предварительно объявив используемые переменные, и выведите в консоль с write() или writeln() значения переменных, в строках, где в комментариях к коду задан вопрос.
- Запишите строку, в которой с помощью одного writeln() выводятся результаты трёх разных (любых) арифметических выражений.
- Сделайте то же самое, но выводя уже три переменные, каждой из которых предварительно присвойте значение одного из арифметических выражений.
(напишите код и продемонстрируйте его работу):
двумя способами (чтобы в консоли получилось оба варианта):
- в столбик, разделив пробелами
- в строчку
Подсказка: если не получается решить самостоятельно и/или есть желание посмотреть на другие варианты решения - смотрите этот разбор.
Присвойте переменной $a$ значение и выведете на экран фразу с этим значением -- используя указанные выше литералы (можно не только их, но их обязательно), например для:
Подсказка: если не получается решить самостоятельно и/или есть желание посмотреть на другие варианты решения - смотрите этот разбор.