Какой тип в языке pascal имеет файловая переменная для обращения к текстовому файлу

#3 Типы данных в языке Pascal. Объявление переменных. Целые числа integer. Оператор присваивания. Инициализация в Паскаль

vedro-compota's picture

Примечание: далее мы начнём говорить о типах данных в Паскале. Выясним следующие:

  • все данные в паскале имеют в определённый момент времени выполнения программы какой-то тип (разные данные -разный);
  • узнаем какие конструкции обладают типом данных;
  • поговорим о первом типе данных, который служит для описания целых чисел и имеет название "integer". А о данный других типов поговорим уже в следующих уроках;

Деление данных на виды "по представлению в коде программы" на языке Pascal

Рассмотрим три вида представления данных в коде программы на языке Паскаль ("виды представления данных"):

  1. В виде литералов — т.е. быть явно записаны в программе, например, как числа или строки в кавычках.
  2. По именам переменных. Переменная — это псевдоним (имя) для хранящихся в ней данных (например, числа или строки).

Любая переменная похожа на звание чемпиона — конкретный человек носящий это звание меняется, но само звание звучит одинаково (не меняется) для разных людей в разные годы.

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

В отличие от литерала, переменная может сколько угодно раз в теле программы менять своё значение.

Подробнее о переменных мы поговорим далее в этом уроке.

Выражение — последовательность действий над фрагментами данных, приводящая к каком-то результату. В Паскале этот результат всегда имеет определённый тип. Выражения работающие с числами называют арифметическими выражениями. Существуют и другие типы выражений.

Подробнее о выражениях мы поговорим далее.

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

  • или к переменным
  • или к литералам
  • или к результатам выражений

Сильная типизация

Паскаль — язык т.н. статической ("сильной" ."постоянной") типизации. Это значит, что для каждой переменной требуется, чтобы переменная было объявлена с указанием к какому типу она принадлежит до использования этой переменной в теле программы. Далее мы изучим базовые типы данных и, как следствие, переменные, которые используются в Паскале.

Типы данных в Pascal

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

  1. integer — целые числа.
  2. real — вещественные числа.
  3. boolean — логический тип данных (значения типа да/нет, истина/лож).
  4. char — символьный тип.
  5. string — строковый тип.

В этом уроке мы будем говорить об понятия общих для всех типов данных на примере конкретного типа данных — integer (целые числа).

Чем отличаются "виды представления данных" от типов данных

Если виды представление данных — это просто различная форма записи обращения к какой либо информации в коде программы, то деление на типы данных — позволяет отнести к одной группе данные вне зависимости от их вида.

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

Объявление переменных

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

При объявлении переменной всегда указывают:

  1. Имя переменной.
  2. Тип переменной.

Объявление переменных происходит после ключевого слова var, до до тела программы.

В общем виде объявление переменной можно записать так (как схему):

Пример объявления переменных по одной:

То есть сначала идёт имя переменной, потом двоеточие, а потом один из типов данных (integer, string или иной — смотря какой требуется).

Объявление переменных списком

Также переменные можно объявлять списком (переменные одного типа можно просто перечислить через запятую, а потом после двоеточия указать типа):

— в списке имена переменных разделяются запятой, переносы строк между элементами списка значения не имеют.

В этом уроке мы поговорим о типе integer и рассмотрим примеры работы с этим типом данных.

Объявление целочисленных переменных

Integer — тип данных соответствующий целым числам.

Объявим переменную такого типа:

Можно объявить несколько переменных немного по-разному:

Перед запуском программы, все переменные которые используются в её теле необходимо объявить.
Если вы объявите какие-то переменные, но использовать их не будете, то к ошибке это не приведёт, но считается плохим стилем.

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

Оператор — это знак операции, например знак суммы это "$+$".

Оператор присваивания обозначается знаком (из двух символов):
$:=$
Этот оператор позволяет записывать значение в переменную ("запоминать это значение в переменной"), схема его работы такова:

Или, опять же схематично:

А теперь как это выглядит с конкрентыми именами переменных и значениями в коде (пример работы оператора присваивания):

Присваивание переменным литералов и вывод значений переменных на экран

Далее, в теле программы мы можем записывать в данную переменную значения, например:

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

Целый тип также поддерживает ноль и отрицательные значения:

Присваивание значений одних переменных другим переменным

Можно присваивать одним переменным значение других, например:

Вывод значений переменных на экран

Чтобы узнать чему стало равно значение переменной $a$ можно вывести её значение в консоль, передав как аргумент в стандартную процедуру writelen() или write(). Тогда наш код будет выглядеть так:

Что мы получим в консоли? Запустите код, объявив обе переменные и оформив тело программы (его содержимое это и есть последние 3 строчки).

Переменные тоже можно передавать во writeln() в любом количестве, разделяя запятой, например две шутки:

в том числе и вперемежку с литералами, например символьными:

Присваивание переменным результатов выражений

Переменным можно присваивать результаты выражений. Для для переменных числового типа (integer или real) такие выражения называются арифметическими.
Целочисленным переменным можно присваивать значения выражений, которые получаются в результате выполнения операций:

  1. $+$ суммы (сложения)
  2. $-$ разности (вычитание)
  3. $*$ произведения (умножение)

— так как эти операции возвращают тип integer. Операцию же деления $/$ использовать нельзя, так она возвращает другой тип — real (вещественные числа). В Паскале любая попытка присвоить переменной данные другого типа приводит к ошибке ("падению" программы).

Что определяет тип арифметических выражений

Также в выражения, значения которых можно присваивать переменным типа integer должны входить только:

  • целочисленные литералы
  • или целочисленные переменные.

Можно сказать что тип, который возвращается выражением (тип его результата) определяется двумя моментами:

  1. типом операций (допустимые перечислены выше)
  2. типом операндов. Операнды — это аргументы операций, подобно аргументам процедуры на их
    основе производятся какие-то действия. Но операнды операций, в отличие от аргументов процедур, записываются не в скобках, а справа и слева от знака операций, так как мы это делаем в математических выражениях:

Таким образом, допустимы выражения:

А также выражения с участием других переменных:

Работа с результатом выражений

Результат выражения представляет собой данные, которые в Паскале всегда обладают с каким-то конкретным типом, потому с выражениями можно делать то же что и с переменными и литералами, а именно:

  1. Присваивать их значения переменным, например: a := 22 + 3* 999;
  2. Делать одни выражения частью других (в этом случае части называют подвыражениями), например сделаем предыдущее выражение подвыражением:

Подвыражение — это любая часть основного выражения, в которой есть хотя бы один оператор (как и выражение всегда обладает каким-то возвращаемым значение известного типа). Например:

Это подвыражение выражения:

Во write() и writeln() также можно передавать любое количество аргументов-выражений, а также аргументов другого вида:

Инициализация переменной


Инициализация переменной
— это первое присваивание какого-то значения переменной. Это может быть:

  1. или значение литерала
  2. или считывание значения для переменной извне (например, пользователь может вводить значение переменных в консоли, но об этом мы поговорим в следующих уроках)
  3. или присваивание данной переменной значения другой, уже инициализированной переменной.
  4. или значение выражения, в котором или одни литералы или инициализированные переменные или и то и то

Таким образом один из примеров выше мы могли бы переписать с такими комментариями:

Программа выполняется сверху вниз построчно — перезапись значений переменных

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

Для одного из приведённых примеров справа в комментариях допишем чему оказываются равны переменные после выполнения очередной строки:

— то есть (во время выполнения программы) после её выполнения, например:

— с помощью комментариев для последней строки показано, что значение меняется после выполнения операции присваивания "сразу после точки с запятой", и если в следующих строках переменной не присваивают какое-то другое значение, то оно и не меняется.

Разбор практических примеров

Пример №1

У вас есть целочисленная переменная $a$ и два строковых литерала:

и второй:

Присвойте переменной $a$ значение и выведете на экран фразу с этим значением — используя указанные выше литералы (можно не только их, но их обязательно), например для:

Должно выводиться:

Начнём писать код, в теле программы:

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

— раз про груши ничего не сказано, то их число выводим просто в составе строкового литерала (оно не будет меняться пока мы не изменим сам литерал), а вот число яблок передаём в процедуру как значение переменной $a$.
Заметьте, что литерал:
‘ и 8 груш’
мы начали с пробела, чтобы при выводе он не "склеился" со словом "яблок".

Запустите последний код. Чего-то там не хватает? А именно — в консоли мы получим:

— почему склеилось имя и значения? Чтобы понять это нужно внимательно посмотреть на код вызова процедуры:

— как мы можем видеть, здесь в конце первого аргумента-литерала нет пробела, а значит значение переменной $a$ (которое есть само по себе просто число, а значит содержать пробелов не может) просто выведется вплотную к первому аргументу. Чтобы исправить эту ситуацию, можно было бы изменить первый литерал, добавив в его конец символ-пробел:

НО: таким образом мы бы не следовали строго условию задачи использовать указанные строковые литералы (‘У Коли’ и ‘ яблок’), так как фактически

— это разные литералы (в первом на один символ больше и этот символ — пробел). А значит, чтобы не модифицировать первый строковый литерал, просто добавим в вызов ещё один аргумент — символьный литерал (а точнее — пробел):

— что и будет подходящим вызовом процедуры writeln() для решения задачи.

Пример №2

Пусть у вас есть задача:

Васе $m$ лет, а Паше $k$ лет. Напишите программу, в которая считает разницу между возрастом Васи и Паши (то есть выясняет насколько Вася старше Паши).
Конкретные значения возрастов этих двух человек задайте в коде в виде двух переменных, которым присвойте целые численные значения (используя целочисленные литералы). Результат запишите в третью переменную и выведите значение на экран.

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

Далее разницу их возрастов просят записать в третью переменную, что ж сделаем и это:

В самом конце нас просили вывести значение разницы на экран, сделаем и это используя вызов стандартной процедуры writeln(), в качестве пояснения пользователю передав строковый литерал как аргумент перед вторым аргументом-переменной:

То есть в данный момент мы имеем код:

Осталось объявить все используемые в теле программы переменные. В данном случае их 3 штуки, объявим их через запятую в секции var до начала тела программы:

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

Видео-пояснения

К этому уроку есть следующие видео:

Задачи для самостоятельного решения

Теоретические вопросы:

Объясните что здесь происходит.

И ещё один вопрос:
Будет ли работать код:

Объясните что здесь происходит.

Два задания к этому коду:

  • Ответьте на вопросы в комментариях письменно.
  • Запустите этот код, предварительно объявив используемые переменные, и выведите в консоль с write() или writeln() значения переменных, в строках, где в комментариях к коду задан вопрос.
  • Запишите строку, в которой с помощью одного writeln() выводятся результаты трёх разных (любых) арифметических выражений.
  • Сделайте то же самое, но выводя уже три переменные, каждой из которых предварительно присвойте значение одного из арифметических выражений.

Задачи:

(напишите код и продемонстрируйте его работу):

двумя способами (чтобы в консоли получилось оба варианта):

  • в столбик, разделив пробелами
  • в строчку

Присвойте переменной $a$ значение и выведете на экран фразу с этим значением — используя указанные выше литералы (можно не только их, но их обязательно), например для:

Файлы в Pascal. Понятия файла и файловой переменной. Внешние файлы

Файл – совокупность данных, записанная во внешней памяти под определенным именем.
Файловый тип переменной – структурированный тип, представляет собой совокупность однотипных элементов, количество которых заранее не определено.

  1. типизированные файлы – файлы, состоящие из компонентов одного типа, число которых заранее не определено;
  2. безтиповые файлы – файлы, где информация записывается и считывается блоками определенного размера, в них могут храниться данные любого вида и структуры;
  3. текстовые файлы – файлы, состоящие из любых символов. Они организуются по строкам, каждая из которых заканчивается символом «конец строки». В конце файла ставиться символ «конец файла». Информацию текстового файла можно просмотреть с помощью любого текстового редактора.
  1. как поименованная область данных на внешнем носители (внешний файл)
  2. как переменная файлового типа (внутренний файл)

Обработка типизированных файлов.

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

Стандартные процедуры и функции

— связывает файловую переменную f с физическим файлом, полное имя которого задано в строке x. Установленная связь будет действовать до конца работы программы, или до тех пор, пока не будет сделано переназначение.

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

открывает для чтения файл, с которым связана файловая переменная f. После успешного выполнения процедуры Reset файл готов к чтению из него первого элемента.
Если f — типизированный файл, то процедурой reset он открывается для чтения и записи одновременно.

открывает для записи файл и очищает его.

закрывает открытый до этого файл с файловой переменной f. EOF(f) возвращает значение TRUE, когда при чтении достигнут конец файла.

позволяет переименовать физический файл на диске, связанный с файловой переменной f. Переименование возможно после закрытия файла.

уничтожает физический файл на диске, который был связан с файловой переменной f. Файл к моменту вызова процедуры Erase должен быть закрыт.

Чтение из текстового файла

Процедуры читают информацию из файла f в переменные. Способ чтения зависит от типа переменных, стоящих в списке. Отличие ReadLn от Read в том, что в нем после прочтения данных пропускаются все оставшиеся символы в данной строке, включая метку конца строки. Если список переменных отсутствует, то процедура ReadLn(f) пропускает строку при чтении текстового файла.

Запись в текстовый файл

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

Организация ввода и вывода данных с использованием файлов

Сколько байтов памяти занимает признак конца строки в текстовом файле?

Вопрос 2

В каком виде хранятся данные на устройствах внешней памяти?

Варианты ответов
  • В виде информационных структур
  • В виде программ
  • В виде файлов
  • В виде текста
Вопрос 3

Без пробелов запишите условие описанного цикла для считывания массива чисел из файла?
while . do
read (f, a[i]);

Вопрос 4

Какое количество памяти занимает один символ в текстовом файле?

Варианты ответов
  • 1 бит
  • 1 байт
  • 6 байт
  • 2 байта
Вопрос 5

Укажите верный порядок следования операторов в программе?

Варианты ответов
  • assign (f, s);
  • reset (f);
  • read (f, s);
  • close (f);
Вопрос 6

Что будет записано в файл f при выполнении оператора writeln (f)?

Варианты ответов
  • Признак EOLN
  • Пробел
  • Ничего
  • Признак EOF
Вопрос 7

Укажите соответствие между операторами и их описаниями.

Варианты ответов
  • readln (f, s);
  • close (f);
  • assign (f, s);
  • reset (f);
Вопрос 8

При помощи какого оператора текстовый файл открывается для перезаписи?

Варианты ответов
  • assign (f, s);
  • eoln (f);
  • rewrite (f);
  • close (f);
Вопрос 9

Какие разновидности файлов существуют?

Варианты ответов
  • Текстовые
  • Рекурсивные
  • Типизированные
  • Нетипизированные
Вопрос 10

Какой тип в языке Pascal имеет файловая переменная, для обращения к текстовому файлу?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *