Теоретический материал (Паскаль)

Множества в Паскале основываются на представлении конечных множеств в математике. Конечные множества — ограниченная последовательность разнообразных элементов. Чтобы построить конкретный множественный тип, пользуются перечисляемым, либо интервальным типом данных. Напомним, что базовым типом называется тип элементов, которые составляют данное множество. Давайте узнаем, как записываются множества Паскаль. Множества Паскаль. Структура: Множественный тип описывают с использованием зарезервированных слов set of:…

Множества Паскаль. Структура:

Множественный тип описывают с использованием зарезервированных слов set of:

где A — множественный тип, а B обозначает базовый тип. Для описания переменной с множественным типом приведем следующий пример:

type
Alfa = set of ‘A’..’Z’
var
Gr: Alfa;

Можно определить принадлежность переменных к данному множественному типу прямо в разделе var:

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

[‘a’..’z’]
[1,4,6]
[2,6,12..23]

Пустое подмножество в Паскале обозначают символом «[ ]». Число базовых элементов не может быть больше 256. Инициализацию величин множественного типа можно произвести при помощи типизированных констант:

const
pust: set of ‘A’..’Z’=[ ];

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

В состав множества входят:

  • элементы базового типа,
  • все подмножества рассматриваемого множества,
  • пустое подмножество

Например, переменная T множественного типа

может принять 8 разных значений:

  • [ ] [1] [2] [3] [1,2] [1,3] [2,3] [1,2,3]

Записи в Паскале

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

Описание записи в Паскале

Общий вид описания типа record в Паскаль:

12345 var <имя_записи> = record <имя_поля1>:<тип_поля1>; <имя_поля2>:<тип_поля2>; end;

var <имя_записи> = record <имя_поля1>:<тип_поля1>; <имя_поля2>:<тип_поля2>; …end;

Но лучше создавать пользовательский тип записи и использовать переменную данного типа:

123456 type <имя_записи> = record <имя_поля1>:<тип_поля1>; <имя_поля2>:<тип_поля2>; end;var <имя_переменной>: <имя_записи>;

type <имя_записи> = record <имя_поля1>:<тип_поля1>; <имя_поля2>:<тип_поля2>; …end;var <имя_переменной>: <имя_записи>;

Рассмотрим примеры объявления и создания записи в Паскале.

Пример: создать запись для работы с датами. Запись должна быть с тремя полями, соответствующими месяцу, дню и году.

123456 type mydate = record month: 1..12; day: 1..31; year: integerend;var d: mydate;

type mydate = record month: 1..12; day: 1..31; year: integerend;var d: mydate;

В примере переменная mydate — запись, состоящая из трех полей: month, day и year. Каждое поле содержит соответственно данные: целое число в пределах от 1 до 12 — номер месяца (интервальный тип), целое число от 1 до 31 — число месяца (интервальный тип), целое число — год.

Обращение к полям записи

Пример: Для записи из предыдущего примера задать конкретное значение и вывести его на экран в удобочитаемом виде.

123456789101112 type mydate = record month: 1..12; day: 1..31; year: integerend;var d: mydate;begin d.day:=1; d.month:=12; readln(d.year); writeln(d.day,‘/’,d.month,‘/’,d.year);end.

type mydate = record month: 1..12; day: 1..31; year: integerend;var d: mydate;begin d.day:=1; d.month:=12; readln(d.year); writeln(d.day,’/’,d.month,’/’,d.year);end.

record 1. Создать анкетные данные о студенте(type anketa):
запись с полями: Ф.И.О. (fio — строковый тип), дата рождения (birth — строковый тип), курс (kurs — значения 1..5). Создать переменную student созданного типа. Выводить значения полей на экран.

Записи в виде двумерной таблицы

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

Рассмотрим пример использования записи-таблицы:

Пусть дана таблица хранения дней рождения разных людей:

1 2 3
Day 2 14 14
Month 1 2 12
Year 1985 1987 1989

Задать данные таблицы в виде записи. Объявить массив дней рождения и вывести дату первого дня рождения.

12345678910111213141516171819 type zap1= record day:1..31; month: 1..12; year: 1900..2100;  end;var birthdays:array[1..100] of zap1;begin birthdays[1].day:=2; birthdays[2].day:=14; birthdays[3].day:=14; birthdays[1].month:=1; birthdays[2].month:=2; birthdays[3].month:=12; birthdays[1].year:=1985; birthdays[2].year:=1987; birthdays[3].year:=1989; writeln(birthdays[1].day);end.

type zap1= record day:1..31; month: 1..12; year: 1900..2100; end;var birthdays:array[1..100] of zap1;begin birthdays[1].day:=2; birthdays[2].day:=14; birthdays[3].day:=14; birthdays[1].month:=1; birthdays[2].month:=2; birthdays[3].month:=12; birthdays[1].year:=1985; birthdays[2].year:=1987; birthdays[3].year:=1989; writeln(birthdays[1].day);end.

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

Использование конструкции with при работе с записями

При работе с записями есть возможность избавиться от постоянного префикса в виде обращения к названию переменной. Сравним два примера:

  1. 12345678910111213 type zap1= record day:1..31; month: 1..12; year: 1900..2100;  end;var my_birthday: zap1;begin my_birthday.day:=17; my_birthday.month:=4; my_birthday.year:=1993;end.

    type zap1= record day:1..31; month: 1..12; year: 1900..2100; end;var my_birthday: zap1;begin my_birthday.day:=17; my_birthday.month:=4; my_birthday.year:=1993;…end.

  2. 12345678910111213141516 type zap1= record day:1..31; month: 1..12; year: 1900..2100;  end;var my_birthday: zap1;beginwith my_birthday dobegin day:= 17; month:= 3; year:= 2004;end;end.

    type zap1= record day:1..31; month: 1..12; year: 1900..2100; end;var my_birthday: zap1;beginwith my_birthday dobegin day:= 17; month:= 3; year:= 2004;end;…end.

Во втором примере значительно проще обращаться к полям записи, избавившись от префикса, благодаря with

record 3.

Создать запись 

toy 

с информацией об имеющихся в продаже игрушках (название товара (

name

), цена товара (

price

) и возрастной диапазон (

age

), для которого игрушка предназначена). Заполнить несколько товаров. Вывести данные на экран. Использовать массив и конструкцию

with

.

Внимание: Ключевое слово with при работе с массивами:

with <название массива>[1] dobegin <поле1>:=…; <поле2>:=…; end;

with <название массива>[1] dobegin <поле1>:=…; <поле2>:=…; …end;

Записи при работе с файлами

Пример: Пусть требуется создать файл из записей, данные которых вводятся с клавиатуры.
Структура записи файла следующая:
— фамилия;
— телефон.

Показать решение:
12345678910111213141516171819202122232425 type t_subscriber = record surname: string[20]; tel: LongInt; end; var subscriber: t_subscriber; f: file of t_subscriber; i: Integer; begin Assign(f,‘notebook.dat’); Rewrite(f); for i:=1 to 5 do begin with subscriber do begin Write(‘Surname: ‘); ReadLn(surname); Write(‘Phone: ‘); ReadLn(tel); end; Write(f, subscriber); end; Close(f);end.

type t_subscriber = record surname: string[20]; tel: LongInt; end;var subscriber: t_subscriber; f: file of t_subscriber; i: Integer;begin Assign(f,’notebook.dat’); Rewrite(f); for i:=1 to 5 do begin with subscriber do begin Write(‘Surname: ‘); ReadLn(surname); Write(‘Phone: ‘); ReadLn(tel); end; Write(f, subscriber); end; Close(f);end.

record 4.

Выполнить предыдущее задание с игрушками (запись

toy

), записывать данные в файл, а затем считывать их из файла и выводить на экран.

Внимание: При записи в файл и считывании из него не нужно обращаться к конкретным полям созданной записи. При считывании нельзя использовать оператор ReadLn, необходимо использовать Read. Например, при работе с массивом:

// Запись в файл:write(f, toys[1]);// Считывание из файла:read(f,toys_1[1]);

// Запись в файл:write(f, toys[1]);// Считывание из файла:read(f,toys_1[1]);

Рассмотрим пример последовательного доступа к типизированному файлу с использованием записей:

Пример: В анкету подписчиков сначала записать данные (фамилия, телефон), а затем считать эти данные. Если номер телефона указан без двойки впереди, то добавить к нему двойку: если номер 236244475 — ничего с ним не делать, если же номер 36233357, то необходимо получить номер 236233357. Исправленную информацию выводить на экран.

1234567891011121314151617181920212223242526272829303132333435 type t_subscriber = record surname: string[20]; tel: integer; end; var subscriber: t_subscriber; f: file of t_subscriber; s: string; begin Assign(f,‘z:pascal.dat’); rewrite(f); subscriber.surname:=‘ivanov’; subscriber.tel:=36233357; write(f,subscriber); subscriber.surname:=‘petrov’; subscriber.tel:=236244475; write(f,subscriber); close(f); Reset(f); while not Eof(f) do begin Read(f, subscriber); with subscriber do begin Str(tel,s); if Copy(s,1,3) = ‘362’ then tel := tel+2000000; end; Seek(f,FilePos(f)1); // возврат указателя назад Write(f,subscriber); Writeln(subscriber.surname, ‘ ‘,subscriber.tel); end; Close(f);end.

type t_subscriber = record surname: string[20]; tel: integer; end;var subscriber: t_subscriber; f: file of t_subscriber; s: string;begin Assign(f,’z:pascal.dat’); rewrite(f); subscriber.surname:=’ivanov’; subscriber.tel:=36233357; write(f,subscriber); subscriber.surname:=’petrov’; subscriber.tel:=236244475; write(f,subscriber); close(f); Reset(f); while not Eof(f) do begin Read(f, subscriber); with subscriber do begin Str(tel,s); if Copy(s,1,3) = ‘362’ then tel := tel+2000000; end; Seek(f,FilePos(f)-1); // возврат указателя назад Write(f,subscriber); Writeln(subscriber.surname, ‘ ‘,subscriber.tel); end; Close(f);end.

Массивы [ править ]

Массивы — это именованный список элементов одного типа.

P. S. Для работы с массивами существует учебный модуль Arrays.

Статические [ править ]

Статические массивы имеют фиксированный размер. Общий синтаксис объявления данных массивов выглядит так:

, где N — длина массива.

Матрицы [ править ]

Двумерные [ править ]

Матрица — это n-мерный список значений, имеющий свой тип и ограниченный некоторыми значениями. Пока будем рассматривать только статические двухмерные и трехмерные матрицы. Перед тем, как перейти к их изучению вспомни таблицы в Excel. Каждая таблица имеет свой размер — ширину и длину. Возьмем за правило ассоциировать двухмерные матрицы с таблицами. Объявление матрицы:

, где N, M — количество строк и столбцов соответственно.

Трехмерные [ править ]

Трехмерный матрицы обладают третьим измерением:

N-мерные матрицы [ править ]

Декларация N-мерной матрицы:

, где A..Z означают количество элементов в соответствующем измерении.

Статические и динамические массивы [ править ]

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

Пример объявления массива: Статический Динамический Вызов SetLength (для динамического массива)
Векторный

ДвумерныйТрехмерный

Понятие индекса массива [ править ]

Индекс массива — это номер элемента массива. Индекс может принимать значения [0, N — 1], где N — количество элементов некоторой размерности. Обращение к элементу одномерного массива с некоторым индексом:

Составим таблицу, которую следует запомнить:

N-мерный массивОбщий синтаксис указания элемента массиваПримерВекторныйДвумерныйТрехмерный

Где i, j, k — индексы.

Индекс в виде значения элемента массива [ править ]

Индексом может быть значение элемента массива:

Математическое вступление

Чтобы определить, что число является положительным или отрицательным нужно сравнить его с нулем:

a>0 – положительное число;a<0 – отрицательное число.

Случай a=0 рассматривать не будем, хотя можно для более точного решения задачи заменить строгое сравнение на нестрогое. >=

Можно пойти и другим путем, например, проверяя наличие знака у числа, но это будет уже сложнее.

Функции [ править ]

Общий синтаксис описания функции:

Можно устанавливать значение переменной Result для указания возвращаемого значения.

8989870.png

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

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

История изучаемого языка не так проста: Паскаль претерпел множество изменений, прежде чем школьники увидели его в том виде, в каком его преподают на уроках. Это был самый первый простой язык (ord pascal) для программирования, помогающий решить множество практических задач прошлого столетия (1970 год). Он был разработан группой ученых.

С расширением платформ были созданы новые версии этой программы, а Паскаль стал классическим языком программирования.

Ниже разберемся: что такое Паскаль, каковы его основные инструменты. Рассмотрим операции и функции программы, ее специфические особенности. На примерах поймем, как она работает. Научимся писать и работать на языке Паскаль.

Строки

Введение

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

Основная причина – многие методы строк в .NET считают, что строки индексируются с нуля, а в Паскале строки индексируются с 1.

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

Индексация строк

Строки в Паскале индексируются с 1. К символам строк можно обращаться по индексам – s[i].

Например:

begin var s: string; s := ‘тор’; Print(s[1],s[2],s[3]);end.

Символы строк можно менять:

begin var s := ‘пир’; s[1] := ‘м’; Print(s); // мирend.

Можно использовать индексацию с конца: s[^i] обозначает i-тый символ с конца

begin var s := ‘мир’; s[^1] := ‘г’; Print(s); // мигend.

Циклы по строкам

begin var s := ‘привет’; for var i:=1 to s.Length do s[i] := Chr(Ord(s[i])+1); Print(s);end.
foreach var c in s do Print(c);

Операции +, *n и in

Строки можно складывать и умножать на целое положительное число

Пример. Генерация строки ‘abcdefghijklmnopqrstuvwxyz’

Идея. Начать с пустой строки. Всякий раз в цикле добавлять к строке символы от ‘a’ до ‘z’

Код

begin var s := ; for var c := ‘a’ to ‘z’ do s += c;end.

Методы Count, CountOf, Where

Чтобы посчитать количество символов в строке, удовлетворяющих определённому условию, используется метод Count. Если нужно посчитать, сколько раз встречается определенный символ, используется более простой метод CountOf

begin var s := ‘абракадабра’; s.CountOf(‘а’).Print; s := ‘а123бр45а67к89адабра’; s.Count(c -> c.IsDigit).Print;end.

Если в строке надо отфильтровать только определенные символы, используется метод Where. Он возвращает последовательность символов, которую можно назад преобразовать к строке, используя метод JoinToString:

begin var s := ‘а123бр45а67к89адабра’; s := s.Where(c -> c.IsLetter).JoinToString;end.

s.ToWords и разбиение строки на слова

Метод s.ToWords разбивает строку на массив слов, используя пробел в качестве разделителя. Полученный массив можно преобразовать и слить в строку, используя метод JoinToString:

begin var s := ‘как однажды жак звонарь головой сломал фонарь’; var a := s.ToWords; Sort(a); s := a.JoinToStringend.

По умолчанию JoinToString разделяет слова пробелами

Функция Pos и процедуры Delete, Insert

Pos(subs,s) возвращает позицию первого вхождения подстроки subs в сторке s или 0 если подстрока не найдена

Pos(subs,s,from) начинает искать подстроку в строке с позиции from.

Следующий код выводит позиции всех вхождений s1 в s:

begin var s := ‘абракадабра’; var s1 := ‘бра’; var p := Pos(s1,s); while p>0 do begin Print(p); p := Pos(s1,s,p+s1.Length); end;end.

Действия над множествами

Объединение, пересечение и разность множеств

Над множествами выполнимы объединение (+), пересечение (*) и разность (-).

Объединение двух множеств A и B (A + B) – это новое множество, состоящее из элементов, принадлежащих множеству A или B, либо тому и другому одновременно.

Результат: chs3 = [ ‘a’ , ‘b’ , ‘d’ , ‘m’ , ‘e’ , ‘k’ , ‘n’ ] .

Пересечение двух множеств A и B (A * B) – это множество, состоящее из элементов, одновременно принадлежащих множествам A и B.

Результат: chs3 = [‘d’].

Разность двух множеств A и B (A – B) – это новое множество, состоящее из элементов множества A, не вошедших в множество B.

Манипулируя операциями над множествами, можно добавлять элементы к множествам или удалять их.

Для вставки и удаления элементов при работе с множествами в Pascal введены две процедуры:

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

Примеры решения задач на применение множеств

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

Зададим тип Letters – множество букв русского языка, затем опишем переменные этого типа: Glasn – множество гласных букв, Sogl – множество согласных букв. Вводимое с клавиатуры предложение опишем переменной Text типа String. Для указания номера символа в строке Text применим переменную i типа byte. Для подсчета количества гласных и согласных букв опишем переменные G и S. Проверку принадлежности символов, составляющих предложение, множеству гласных или согласных букв русского языка организуем с использованием оператора цикла For. Параметр цикла i, изменяясь от 1 до значения длины предложения, будет указывать порядковый номер символа в предложении. Принадлежность очередного символа предложения множеству гласных или согласных букв проверим с помощью операции in. Если выполняется условие Text[i] in Sogl, тогда увеличивается на 1 счетчик S. Если выполняется условие Text[i] in Glasn, тогда увеличивается на 1 счетчик G. Если не выполняется ни первое, ни второе условие, значит, очередной символ в предложении не является гласной или согласной буквой русского языка.

Теперь рассмотрите текст программы:

Program GlasnSogl;
Type
  Letters = set of ‘A’..’я’;
Var
  Glasn, Sogl : Letters;
  Text : String;
  i, G, S : byte;
Begin
  Glasn := [‘A’, ‘а’, ‘Е’, ‘е’, ‘И’, ‘и’, ‘О’, ‘о’, ‘У’, ‘у’, ‘ы’,’Э’, ‘э’, ‘Ю’, ‘ю’, ‘Я’, ‘я’, ‘Ё’, ‘ё’];
  Sogl := [‘Б’..’Д’, ‘б’..’д’, ‘Ж’, ‘ж’, ‘З’, ‘з’, ‘К’..’Н’, ‘к’..’н’, ‘П’..’Т’, ‘п’..’т’, ‘Ф’..’Щ’, ‘ф’..’щ’, ‘ь’, ‘ъ’];
  Write(‘Введите предложение ‘);
  Readln(Text);
  G := 0;
  S := 0;
  For i := 1 to Length(Text) do
    Begin
      If Text[i] in Glasn
        Then
          G := G+1;
      If Text[i] in Sogl
        Then
          S := S+1;
    End;
  Write(‘В предложении ” ‘, Text, ‘ ” ‘, G, ‘ гласных и ‘, S, ‘ согласных букв’);
End.

Задание. Усовершенствуйте программу, дополните комментарием. Если у Вас возникла идея решения этой задачи с помощью другого алгоритма, – дерзайте.

Пример 2. Поиск простых чисел с помощью решета Эратосфена в числовом промежутке [1 .. N].

В теме “Целочисленная арифметика” Вы решали задачи на поиск простых чисел в заданном диапазоне различными способами. Здесь мы рассмотрим ту же задачу, но применим для ее решения знания, полученные при изучении темы “Множества”.

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

Идея метода “решета Эратосфена” заключается в следующем: сформируем множество М, в которое поместим все числа заданного промежутка. Затем последовательно будем удалять из него элементы, кратные 2, 3, 4, и так далее до целой части числа [N/2], кроме самих этих чисел. После такого “просеивания” в множестве М останутся только простые числа.

Рассмотрите вариант решения этой задачи.

Program Resheto;
Var
  M : set of byte;
  i, k, N : Integer;
Begin
  Writeln(‘Введите размер промежутка (до 255) ‘);
  Readln(N);
  M := [2..N];
  For k := 2 to N div 2 do
    For i := 2 to N do
      If (i mod k=0) and (i<>k)
        Then
          M := M-[i];
  For i := 1 to N do
    If i in M
      Then
        Write(i:3);
  Readln;
End.

Ответьте на вопросы:

  1. Как сформировано множество М?
  2. Как организован просмотр элементов этого множества?
  3. Как организован просмотр делителей?
  4. Как удаляется элемент множества?
  5. Как организован вывод “просеянного” множества?

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

Задание. Улучшите алгоритм решения предложенной задачи. Протестируйте программу и дополните ее комментариями.

Примечание. Если Вы затрудняетесь при выполнении задания, то вот Вам подсказки:

  1. Например, вы знаете, что если из множества М удалены все элементы, делящиеся на 2, то нет смысла проверять, делятся ли оставшиеся числа на 4, 6, 8, 10, и т.д.

Когда программа проверяет делимость, например, на 50, то она проверяет и числа до 50, что не имеет смысла.

Пример 3. Разгадывание ребусов.

+ МУХА
   МУХА
   СЛОН

Каждая буква – это цифра, разным буквам соответствуют разные цифры. Необходимо заменить буквы цифрами так, чтобы получилось верное равенство. Найти все решения. Для решения этой задачи используется метод перебора с возвратом. Используем множество S1 для хранения цифр слова МУХА, причем будем вносить в него цифры последовательно, учитывая уже внесенные цифры. Начальное значение S1 – пустое множество. После выбора всех цифр первого слова создаем его числовой эквивалент и числовой образ слова СЛОН. Выделяем цифры СЛОНа (множество S2), и если слова состоят из разных цифр (то есть пересечение S1 и S2 пустое), и все цифры СЛОНа разные, то выводим решение на экран. Если же нет, то идет возврат – удаляем из множества S1 последнюю внесенную цифру и пытаемся выбрать еще одно значение. Таким образом, мы перебираем все возможные варианты и выводим на экран только те, которые удовлетворяют равенству.

Заметим, что значение буквы М в слове МУХА может иметь значения от 1 до 4, а буква А в этом же слове не может быть равна 0.

Рассмотрите решение задачи.

Program Rebus;
Type
  MN = set of 0..9;
Var
  digit, m, u, h, a : 0..9;
  i, n1, n2 : Integer;
  S1, S2 : MN;
  f : boolean;
Procedure Print(x, y : Integer);
Begin
  write(x);
  write(‘ + ‘);
  write(x);
  write(‘ = ‘);
  writeln(y);
  writeln;
End;
Begin
  S1 := [ ];
  for m := 1 to 4 do
    begin
      S1 := S1+[m];
      for u := 0 to 9 do
        if Not(u in S1)
          then
            begin
              S1 := S1+[u];
              for h := 0 to 9 do
                if Not (h in S1)
                  then
                    begin
                      S1 := S1+[h];
                        for a := 1 to 9 do
                          if Not (a in S1)
                            then
                              begin
                                S1 := S1+[a];
                                n1 := 1000*m+100*u+10*h+a; {число MUHA}
                                n2 := 2*n1; {число SLON}
                                f := true;  {все цифры в числе SLON – разные}
                                S2 := [ ];
                                for i := 1 to 4 do
                                  begin
                                    digit := n2 mod 10; {выделяем цифру числа SLON}
                                    n2 := n2 div 10;
                                    f := f and not (digit in s2); {цифра повторяется?}
                                    S2 := [digit] + S2;
                                  end;
                                if (S1*S2=[ ]) and f {если все цифры в примере разные}
                                  then
                                    Print (n1, 2 * n1);
                                S1 := S1-[a];
                              end;
                     S1 := S1-[h];
                end;
            S1 := S1-[u];
        end;
      S1 := S1-[m];
    end;
  Readln;
End.

Задание. Решите один из ребусов:

  1. П Ч Ё Л К А x 7 = ЖЖЖЖЖЖ
  2. ТОРГ x Г = ГРОТ
  3. ЛАДЬЯ+ЛАДЬЯ = ФЕРЗЬ
  4. М3 = КУБ
  5. СМ3 = КУБИК
  6. МАТЕ * М = АТИКА
  7. ПРОП * О = РЦИЯ
  8. ПРОП : О = РЦИЯ
  9. (М + О + С +К + В + А)4 = МОСКВА
  10. ВЕТКА + ВЕТКА = ДЕРЕВО
  11. САР = АТОВ
  12. ПЛОМБА * 5 = АПЛОМБ
  13. НИКЕЛЬ * 6 = ЕЛЬНИК
  14. КВАНТ * 30 = ЖУРНАЛ
  15. КАПЛЯ + КАПЛЯ + КАПЛЯ + = ОЗЕРКО
  16. СОРОК * 5 = ДВЕСТИ
  17. SIX * TWO = TWELVE
  18. ДВЕСТИ * 5 = ТЫСЯЧА
  19. НАТАША + ТОНЯ = СЁСТРЫ
  20. БРА2 = БОМДОР

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

Procedure ReadWord(Var Result : Word; x, y, MaxLength : byte);
Const
  ValidSymbol : set of char=[‘0’..’9′,#8,#13];
Var
  Str : string;
  Code : integer;
  Key : char;
Begin
  GoToXY(x, y);{курсор – в заданную позицию}
  Str := ”; {строка пустая}
  repeat {начало бесконечного цикла}
    {проверка вводимых символов на допустимость}
    repeat
      Key := ReadKey
    until Key in ValidSymbol;
    case Key of {анализ вводимых символов}
      ‘0’..’9′ : {нажата цифра}
        if Length(Str)>=MaxLength {если длина больше заданной}
          then
            begin
              Sound(100); {звуковой сигнал}
              Delay(200);
              NoSound;
            end
          else {если длина меньше заданной}
            begin
              write(Key);
              Str:=Str+Key; {добавление символа в строку}
            end;
      #8 : {нажата клавиша BackSpace}
        if Length(Str)>0 {если строка не пустая}
          then
            begin
              Delete(Str, Length(Str),1); {удаление из строки}
              GoToXY(WhereX-1, WhereY); {возврат курсора}
              write(‘ ‘); {запись пробела вместо символа}
              GoToXY(WhereX-1, WhereY); {возврат курсора}
            end
          else {если строка пустая}
            begin
              Sound(100); {звуковой сигнал}
              Delay(200);
              NoSound;
            end;
      #13 : {нажата клавиша Enter}
        begin
          Val(Str, Result, Code); {преобразование строки в целое число}
          Exit {выход из подпрограммы}
        end;
      end; {конец оператора Case}
  until False; {бесконечный цикл}
End;

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

В начале программы курсор направляется в заданную точку, и текстовой строке присваивается пустое значение. Далее начинается бесконечный цикл, заданный оператором Repeat … Until False. Выход из цикла происходит вместе с выходом из процедуры по команде Exit. “Бесконечность” цикла обеспечивает произвольное число повторов и исправлений при вводе числа.

Процедура реагирует только на нажатие цифровых клавиш, клавиш Enter и BackSpace. Назначение клавиш – традиционное: Enter используется для завершения процедуры, BackSpace – для стирания последнего введенного символа.

Цикл

  repeat
    Key := ReadKey
  until Key in ValidSymbol;

проверяет вводимые символы на допустимость. Множество допустимых символов ValidSymbol определено в процедуре как константа, оно включает цифровые символы и символы, соответствующие клавишам Enter и BackSpace. Первая имеет символьный код #13, вторая – #8.

Далее оператор Case производит выбор одного из трех направлений – обработка нажатой цифры, обработка клавиши BackSpace или обработка клавиши Enter. При нажатой цифре сначала проверяют, не достигло ли число цифр максимального значения. Число цифр определяется функцией Length, аргумент которой – редактируемая строка. Если длина уже достигла максимального значения, выдается звуковой сигнал. Если длина вводимой строки меньше максимальной, то в строку дописывается символ, и он же выводится на экран процедурой Write.

При нажатии клавиши BackSpace должен быть стерт последний введенный символ. Вначале производится проверка, есть ли в строке символы. Если строка пуста, подается звуковой сигнал, если нет – начинается удаление символа. Для этого строка уменьшается на один элемент процедурой Delete, курсор возвращается назад на одну позицию, на место стираемой цифры записывается символ пробела, затем курсор снова возвращается на позицию назад. Возврат курсора обеспечивается оператором GoToXY(WhereX-1, WhereY), который использует функции WhereX и WhereY для определения текущего положения курсора и уменьшает координату х на 1.

После нажатия Enter строка преобразуется в целочисленную переменную процедурой Val, и происходит выход из процедуры ReadWord по команде Exit.

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

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

Задание*. Составьте программу для проверки входных данных другого типа.

Функции управления программой

img2-4.jpg

Какие еще существуют процедуры:

  • Inc – увеличение числа;
  • Clrscr – очистка предыдущих результатов работы программы;
  • Uses crt – запуск clscr;
  • Length – возвращение длины строки;
  • Val – преобразование строки в число;
  • Pos – отыскать в строке первое преобразование;
  • Assign – связывание переменной с файлом;
  • Upcase — перевод строчных букв в заглавные.
Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...