Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа 11

Работа добавлена на сайт samzan.net:


Е.С. Охотников, Е.С. Охотникова

Лабораторный практикум по дисциплине «Языки программирования» (Паскаль)

Тюмень, 2008
Содержание

[0.1] Лабораторный практикум по дисциплине «Языки программирования» (Паскаль)

[0.1.1] Тюмень, 2008
Содержание

[1]
Лабораторная работа №1. Стандартные типы данных языка программирования Паскаль

[1.1] Требования к лабораторной работе

[1.2] Задания к лабораторной работе

[1.2.1] Группа А

[1.2.2] Группа В

[1.2.3] Группа С

[1.3] Теоретический материал и методические указания

[1.3.1] Знакомство со средой программирования

[1.3.2] Открытие и сохранение проекта

[1.3.3] Запуск и завершение работы программы

[1.3.4] Работа с русским алфавитом

[1.3.5] Понятие переменной, стандартные типы данных

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

[1.3.7] Процедуры ввода – вывода

[1.3.8] Арифметические операции

[1.3.9] Стандартные функции

[1.3.10] Стандартные ошибки

[1.4] Контрольные вопросы

[1.5] Примерный вариант контрольной работы

[2]
Лабораторная работа №2. Логический тип данных. Операторы ветвления в языке программирования Паскаль

[2.1] Требования к лабораторной работе

[2.2] Задания к лабораторной работе

[2.2.1] Группа А

[2.2.2] Группа В

[2.2.3] Группа С

[2.3] Теоретический материал и методические указания

[2.3.1] Логический тип boolean

[2.3.2] Логические операции

[2.3.3] Полная форма условного оператора

[2.3.4] Краткая форма условного оператора

[2.3.5] Оператор выбора

[2.4] Контрольные вопросы

[2.5] Примерный вариант контрольной работы

[3]
Лабораторная работа №3. Операторы цикла в языке программирования Паскаль

[3.1] Требования к лабораторной работе

[3.2] Задания к лабораторной работе

[3.2.1] Группа А

[3.2.2] Группа В

[3.2.3] Группа С

[3.3] Теоретический материал и методические указания

[3.3.1] Цикл с параметром

[3.3.2] Цикл с предусловием

[3.3.3] Цикл с постусловием

[3.3.4] Связь цикла с параметром и цикла с предусловием

[3.4] Контрольные вопросы

[3.5] Примерный вариант контрольной работы

[4]
Лабораторная работа №4. Структурированные типы данных. Одномерные и двумерные массивы

[4.1] Требования к лабораторной работе

[4.2] Задания к лабораторной работе

[4.2.1] Группа А

[4.2.2] Группа В

[4.2.3] Группа С

[4.3] Теоретический материал и методические указания

[4.3.1] Объявление переменной типа одномерный массив

[4.3.2] Обращение к элементу одномерного массива

[4.3.3] Заполнение одномерного массива

[4.3.4] Вывод одномерного массива на экран

[4.3.5] Объявление переменной типа двумерный массив

[4.3.6] Обращение к элементу двумерного массива

[4.3.7] Заполнение двумерного массива

[4.3.8] Вывод элементов двумерного массива на экран

[4.4] Контрольные вопросы

[4.5] Примерный вариант контрольной работы

[5]
Лабораторная работа №5. Структурированные типы данных. Строковый тип

[5.1] Требования к лабораторной работе

[5.2] Задания к лабораторной работе

[5.2.1] Группа А

[5.2.2] Группа В

[5.2.3] Группа С

[5.3] Теоретический материал и методические указания

[5.3.1] Объявление и инициализация строковых переменных

[5.3.2] Обращение к элементу строки

[5.3.3] Процедуры и функции для работы со строками

[5.3.4] Массивы строк

[5.4] Контрольные вопросы

[5.5] Примерный вариант контрольной работы

[6]
Лабораторная работа №6. Структурированные типы данных. Множества и записи

[6.1] Требования к лабораторной работе

[6.2] Задания к лабораторной работе

[6.2.1] Группа А

[6.2.2] Группа В

[6.2.3] Группа С

[6.3] Теоретический материал и методические указания

[6.3.1] Тип множество

[6.3.2] Операции над множествами

[6.3.3] Заполнение множества с клавиатуры

[6.3.4] Вывод множества на экран

[6.3.5] Тип запись

[6.3.6] Правила работы с переменными типа запись

[6.3.7] Массивы переменных типа запись

[6.4] Контрольные вопросы

[6.5] Примерный вариант контрольной работы

[7]
Лабораторная работа №7. Подпрограммы в языке программирования Паскаль

[7.1] Требования к лабораторной работе

[7.2] Задания к лабораторной работе

[7.2.1] Группа А

[7.2.2] Группа В

[7.2.3] Группа С

[7.3] Теоретический материал и методические указания

[7.4] Контрольные вопросы

[7.5] Примерный вариант контрольной работы

[8]
Список вопросов к экзамену (зачету)

[9]
Рекомендуемая литература

[10]
Использованная литература


Введение

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

В каждой теме представлены задачи для написания программ, сгруппированные по степени сложности. Задания группы А предназначены для проверки знания сущности изучаемого понятия, его определение, установление его простейших связей с другими понятиями, а также умения решать практические задания «по образцу». Задания группы В направлены на проверку умения анализировать понятия и связи между ними, применять теоретические знания в стандартных ситуациях, а также в практической деятельности. Задания группы С предназначены на формирование глубокого владения понятийно-логическим  аппаратом, умения анализировать понятия и связи и оперировать ими в нестандартных ситуациях. Каждое задание состоит из шести аналогичных вариантов. По выбору преподавателя обучаемому могут быть назначены или все варианты задания, или только некоторые из них.

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


Лабораторная работа №1. Стандартные типы данных языка программирования Паскаль

Требования к лабораторной работе

После выполнения лабораторной работы обучаемый должен:

  •  иметь представление о структуре программы на языке программирования Паскаль;
    •  иметь представление об стандартных числовых типах данных языка программирования Паскаль, диапазонах значений и допустимых операциях;
    •  научиться оперировать стандартными математическими функциями языка программирования Паскаль;
    •  научиться пользоваться процедурами ввода-вывода данных, познакомиться с особенностями вывода переменных различных типов.

Задания лабораторной работы должны быть выполнены в консольном приложении среды программирования Borland Delphi 7 (или следующих версиях) в отдельных проектах.

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

Задания к лабораторной работе

Группа А

Задание №1

Найдите периметр:

  1.  Прямоугольника (ширину и длину вводить с клавиатуры).
  2.  Треугольника (длины всех сторон вводить с клавиатуры).
  3.  Равнобокой трапеции (длины сторон вводить с клавиатуры).
  4.  Неравнобокой трапеции (длины сторон вводить с клавиатуры).
  5.  Параллелограмма (длины сторон вводить с клавиатуры).
  6.  Ромба (длины сторон вводить с клавиатуры).

Задание №2

Найдите площадь:

  1.  Прямоугольника (ширину и длину вводить с клавиатуры).
  2.  Треугольника (длины всех сторон вводить с клавиатуры).
  3.  Равнобокой трапеции (длины сторон вводить с клавиатуры).
  4.  Параллелограмма (длины сторон вводить с клавиатуры).
  5.  Ромба (длины сторон вводить с клавиатуры).
  6.  Прямоугольного треугольника (с клавиатуры вводится длина гипотенузы и одного из катетов).

Задание №3

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

Напишите программу для вычисления значения функции, x и  t  вводить с клавиатуры:

  1.  .
  2.  .
  3.  .
  4.  .
  5.  .
  6.  .

Задание №4

Найдите значения выражений:

  1.  , при х=-3; х=3.
  2.  , при х=-2; х=1.
  3.  , при х=-2; х=1.
  4.  , при х=-2; х=4.
  5.  , при х=-1; х=1.
  6.  , при х=-3; х=2;

Задание №5

  1.  Дано расстояние в сантиметрах. Найти число полных метров в нем.
  2.  Дана масса в килограммах. Найти число полных центнеров в ней.
  3.  Дана масса в килограммах. Найти число полных тонн в ней.
  4.  Дано расстояние в метрах. Найти число полных километров в нем.
  5.  Дано натуральное число n (n > 99). Найти число сотен в нем.
  6.  Дано натуральное число n (n > 99). Найти число десятков в нем.

Задание №6

Задание выполняется для всех вариантов полностью.

Дано трехзначное число. Найти:

  1.  Сумму его цифр.
  2.  Произведение его цифр.
  3.  Остаток от деления первой цифры числа на последнюю.

Группа В

Задание №1

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

  1.  Прямоугольного параллелепипеда.
  2.  Треугольной призмы.
  3.  Призмы, основанием которой является прямоугольник.
  4.  Призмы, основанием которой является квадрат.
  5.  Конуса.
  6.  Шара.

Задание №2

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

Задание №3

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

Напишите программу для вычисления значения функции, x и  t вводить с клавиатуры:

  1.  .
  2.  .
  3.  .
  4.  .
  5.  .
  6.  .

Задание №4

  1.  Дано трехзначное число. Найти число, полученное при прочтении его цифр справа налево.
  2.  Дано трехзначное число. В нем зачеркнули первую слева цифру и приписали ее в конце. Найти полученное число.
  3.  Дано трехзначное число. В нем зачеркнули последнюю справа цифру и приписали ее в начале. Найти полученное число.
  4.  Дано трехзначное число. Найти число, полученное при перестановке первой и второй цифр заданного числа.
  5.  Дано трехзначное число. Найти число, полученное при перестановке второй и третьей цифр заданного числа.
  6.  Дано целое число, большее 99. Найти третью от конца его цифру.

Задание №5

Задание выполняется для всех вариантов полностью.

С начала суток прошло n секунд. Определить:

  1.  Сколько полных часов прошло с начала суток.
  2.  Сколько полных минут прошло с начала очередного часа.
  3.  Сколько полных секунд прошло с начала очередной минуты.

Группа С

Задание №1

При выполнении задания не разрешается использовать функции power() и exp().

Вычислить за наименьшее количество операций

  1.  .
  2.  .
  3.  .
  4.  .
  5.  .
  6.  .

Задание №2

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

Задание №3

Напишите программу для вычисления значения функции, x и  t вводить с клавиатуры:

  1.  .
  2.  .
  3.  .
  4.  .
  5.  .
  6.  .

Задание №4

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

  1.  Усеченного конуса;.
  2.  Цилиндра, внутри которого вырезан шар.
  3.  Усеченного тетраэдра.
  4.  Шара, в центре которого вырезан шар меньшего радиуса.
  5.  Усеченной пирамиды, основанием которой является прямоугольник.
  6.  Усеченной пирамиды, основанием которой является квадрат.

Задание №5

Задание выполняется для всех вариантов полностью.

  1.  Дан прямоугольник с размерами 543130 мм. Сколько квадратов со стороной 130 мм можно отрезать от него?
  2.  Дано четырехзначное число. Найти число, образованное перестановкой первой и второй, третьей и четвертой цифр заданного числа. Например, 1234 2143.
  3.  С начала суток часовая стрелка повернулась на у градусов (0 < у < 360, у - целое число). Определить число полных часов и число полных минут, прошедших с начала суток.

Теоретический материал и методические указания

Знакомство со средой программирования

Для того чтобы открыть среду программирования Borland Delphi 7, обычно нужно выбрать «Пуск – Программы - Borland Delphi 7 – Delphi 7», хотя в зависимости от настроек, заданных при установке Delphi 7, на разных компьютерах пути могут несколько отличаться.

Для создания нового консольного приложения нужно выбрать пункты главного меню среды программирования «FileNew - Other».

На экране отобразится следующее окно. На закладке «New» нужно выбрать элемент «Console Application».

На экране появится окно, которое содержит заготовку программы.

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

  •  program Project1; - заголовок программы, т.е. ее название, вместо слова Project1; можно написать свое название, только оно должно отвечать правилам составления идентификаторов языка программирования Паскаль;
    •  {$APPTYPE CONSOLE} – директива препроцессора, здесь она говорит о том, что предстоит работа с консольным приложением;
    •  uses SysUtils; - после слова uses перечисляются подключаемые к программе модули;
    •  begin end. - между этими словами заключается тело программы;
    •  { TODO -oUser -cConsole Main : Insert code here } – в фигурных скобках записывается комментарий, т.е. текст, игнорируемый компилятором.

Открытие и сохранение проекта

Все написанные в Delphi 7 программы принято называть проектами. По умолчанию новая программа будет называться Project1, Project2 и т.п. Это можно увидеть в заголовке окна консольного приложения на этапе разработки и в заголовке окна исполняемого приложения.

Для сохранения проекта нужно выбрать пункт главного меню «File – Save Project As». На экране появится окно стандартного диалога для сохранения файла.

Название файла можно изменить. По умолчанию Delphi предлагает сохранить файл в папку С:\Program Files\Borland Delphi 7\Projects.

При сохранении проекта в действительности сохраняется не один файл, а несколько файлов с различными расширениями. Если требуется перенести проект на компьютер, на котором установлена Delphi 7, то достаточно оставить файл с расширением *.dpr, т.е. файл проекта.

Открыть проект также можно несколькими способами:

  •  двойным щелчком по файлу с расширением *.dpr, если до этого среда не была открыта, то она откроется; при запущенном приложении Delphi 7 откроется только выбранный файл проекта.
    •  через пункт главного меню «File –Open…», здесь также нужно выбрать файл с расширением *.dpr.

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

Пример 1.

Требуется вывести на экран фразу «My first program».

Информация выводится на экран с помощью операторов вывода write() или writeln(). Их отличия будут рассмотрены далее.

Все команды пишутся внутри тела программы, они отделяются друг от друга знаком «;». Принято каждую следующую команду начинать с новой строки. В скобках оператора writeln записывается то, что должно быть выведено на экран, текст должен быть заключен в одинарные кавычки. Второй оператор программы – readln, в такой форме он выполняет функцию задержки экрана. Без его использования исполняемое приложение появится на экране на мгновение и закроется. Чтобы увидеть результаты работы программы и используется оператор readln. В этом случае программа закрывается только после того как пользователь нажал клавишу Enter на клавиатуре.

Запуск и завершение работы программы

Программу можно запустить несколькими способами:

  •  клавишей F9;
    •  кнопкой на панели инструментов или через меню Run.

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

которое можно закрыть или соответствующей кнопкой заголовка окна, или нажатием клавиши Enter на клавиатуре.

Если же программа завершила свою работу с ошибкой, например:

В этом случае следует нажать кнопку «OК», затем, чтобы вернуться в среду разработки нужно выбрать пункт главного меню «Run – Program Reset» или воспользоваться сочетанием клавиш «Ctrl+F2».

Работа с русским алфавитом

Стандартные настройки консольного приложения Delphi 7 не позволяют корректно работать с русскими буквами. Если же задание подразумевает работу с ними, нужно воспользоваться стандартными процедурами SetConsoleCP(1251); и SetConsoleOutputCP(1251);.

Обратите внимание, что для использования этих процедур нужно подключить модуль под названием Windows.

Далее следует запустить приложение, правой кнопкой мыши щелкнуть по заголовку окна, в появившемся контекстном меню выбрать пункт «Свойства».

В появившемся окне на закладке «Шрифт» нужно выбрать тип шрифта Lucida Console. Теперь русские буквы будут отображаться корректно.

Понятие модуля

Модуль – автономно компилируемая программная единица, включающая в себя различные компоненты раздела описаний: типы, константы, переменные, процедуры и функции.

В отдельном модуле обычно описываются типы данных, реализация процедур и функций, относящихся к конкретной задаче или области. Например, существует модуль Math, содержащий описание более сложных математических функций (чем, например, sin(x)). Можно провести аналогию: в жизни вряд ли можно встретить учебник, содержащий информацию по всем, изучаемым в институте Математики и Компьютерных Наук дисциплинам (алгебре, физике, теории вероятности, русскому языку, философии и т.п.). Даже в рамках одного предмета можно выделить различные разделы, которым будут соответствовать различные учебники. Очевидно, если нужно узнать, что такое частная производная, будет гораздо проще искать определение в учебнике по математическому анализу, а за определением понятия «материя » обратиться к философскому словарю, чем искать нужный текст в огромной общей книге, а представьте, что эту книгу нужно постоянно носить с собой на все занятия.

Так и в программах, модули (кроме SysUtils, содержащего описание стандартных типов данных, процедур ввода – вывода и др.) подключаются только по мере необходимости.

Понятие переменной, стандартные типы данных

Параметры программы, значения которых могут изменяться в процессе ее выполнения, называются переменными. Переменные в языке программирования Паскаль объявляются в строго определенной части программы – разделе объявления переменных. Этот раздел начинается с ключевого слова varvariable» в переводе с английского означает «переменная величина»). Раздел объявления переменных расположен перед телом программы. В примере объявлена одна переменная MyVar типа byte.

Тип данных определяет диапазон значений переменной (переменная MyVar может быть равна любому числу из диапазона 0..255), размер выделяемой памяти (здесь 1 байт) и операции, которые допустимы для данной переменной.

Запись  var MyVar:byte;  означает, что в памяти компьютера под эту переменную выделится ячейка размером 1 байт, в которой может быть размещено некоторое значение, а обращаться к этой ячейке можно через имя MyVar.

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

После объявления переменной под нее выделяется соответствующего размера ячейка памяти, при этом содержание этой ячейки, вообще говоря, не определено. Хорошим стилем программирования считается явная инициализация переменной до ее первого использования. Считается, что компилятор языка программирования Паскаль инициализирует все глобальные переменные (т.е. описанные в разделе var основной программы) нулями. Но при изменении настроек компилятора такие переменные могут быть проинициализированы и произвольными значениями, кроме того не инициализируются нулями и локальные переменные (т.е. переменные, описанные внутри подпрограмм).

В программе может быть объявлено произвольное количество переменных различных типов.

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

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

Присвоить переменной некоторое значение можно с помощью оператора присваивания, в языке программирования Паскаль он имеет вид « := ».

Запись MyVar:=5; читается: «переменной MyVar присвоить значение пять». Это означает, что теперь в ячейке памяти с именем MyVar записано значение 5 .

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

Процедуры ввода – вывода

Как уже упоминалось ранее, процедура writeln() предназначена для вывода информации на экран. С помощью процедуры writeln() на экран можно выводить текст (он должен быть заключен в одинарные кавычки) и значения переменных. Например, результатом выполнения оператора writeln(‘Моя программа’); будет вывод на экран соответствующей строки, а результатом выполнения writeln(MyVar); - вывод значения переменной MyVar. Причем данная процедура может иметь произвольное количество параметров, которые следует перечислять через запятую. На рисунке ниже приведен результат выполнения программы

var MyVar:byte;

begin

 MyVar:=5;

 writeln('MyVar= ', MyVar);

 readln;

end.

Текст, передаваемый в процедуру writeln(), выводится без изменения, а вместо имени переменной выводится ее значение.

Для вывода информации предназначена еще одна процедура write(). Результатом выполнения обеих процедур является вывод на экран параметров, указанных в скобках, только writeln() еще переводит курсор на новую строку. Сравните:

begin

 writeln('1');

 writeln('2');

 writeln('3');

 readln;

end.

begin

 write('1');

 write('2');

 write('3');

 readln;

end.

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

Запись readln(MyVar); означает, что число, введенное пользователем, поместиться в ячейке памяти с именем MyVar. При этом если пользователь введет данные, не являющиеся целым числом, то программа закончит свое выполнение с ошибкой.

При запуске программы

uses  SysUtils,Windows;

var MyVar:byte;

begin

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 writeln('Введите число');

 readln(MyVar);

 writeln('Вы ввели число ', MyVar);

 readln;

end.

На экране появится строка:

Знак курсора во второй строке означает, что программа ожидает ввода. Предположим, пользователь ввел число 34, на экране отобразится еще одна строка:

Если пользователь ошибся и ввел, например, некоторую строку, то программа «выпадет» с ошибкой.

EInOutError – ошибка ввода – вывода, в данном примере введенная строка не может интерпретироваться как целое число.

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

Использование нескольких операторов readln

Использование оператора readln с несколькими параметрами.

uses  SysUtils,Windows;

var x:byte;

   y:real;

   s:integer;

begin

  SetConsoleCP(1251);

  SetConsoleOutputCP(1251);

  writeln('Введите целое число, действительное число, целое число');

  readln(x);

  readln(y);

  readln(s);

  writeln('целое число =', x, ' действительное   число =',y);

 writeln(' целое число =',s );

  readln;

end.

uses  SysUtils,Windows;

var x:byte;

   y:real;

   s:integer;

begin

  SetConsoleCP(1251);

  SetConsoleOutputCP(1251);

  writeln('Введите целое число, действительное число, целое число');

  readln(x,y,s);

  writeln('целое число =', x, ' действительное число =',y);

  writeln(' целое число =',s );

  readln;

end.

Различия

Значения переменных должны вводиться через «Enter». Поскольку операторы выполняются последовательно, то сначала должно быть введено значение для переменной х, нажата клавиша «Enter» и т.д.

Значения переменных могут вводиться через пробел, знак табуляции или «Enter». При этом важен порядок ввода параметров: первое введенное значение помещается в переменную х, второе – в переменную у, третье – в переменную s.

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

В Паскале существует понятие формата вывода числа. Для целых чисел предусмотрен следующий формат: writeln(s : 4); - указывается имя переменной, затем ставится знак двоеточия и указывается количество экранных позиций, выделяемых под выводимое число. Даже если выделенных позиций не хватает для вывода числа, то их количество автоматически увеличивается до нужного и число выводится корректно.

Для вывода действительных чисел следует указывать общее количество выводимых цифр и количество цифр после запятой, например: writeln('целое число =', x : 4, ' действительное число =',y:3:2); при этом если у числа количество цифр после запятой меньше, чем указано в формате вывода, оставшиеся позиции будут заполнены нулями, если больше – число будет округлено до этого количества знаков.

Арифметические операции

Для величин целого и вещественного типов данных в Паскале определены стандартные арифметические операции +, -, *, /. Для целых чисел определены еще две операции div и mod. Div – это результат целочисленного деления, например, 9 div 4=2,  5 div 3=1. Мod – это остаток от деления нацело: 9 mod 4=1, 5 mod 3=2.

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

Например, переменной вещественного типа можно присвоить целое значение, при этом в переменную целого типа нельзя поместить вещественное число.

Пример 2.

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

uses  SysUtils,Windows;

var z : real;

     x, y, mult : integer;

begin

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 writeln('Введите два целых числа');

 readln(x,y);

 mult:=x*y;

 z:=x/y;

 writeln('произведение равно ', mult,  '  частное равно ', z : 2 : 2);

 readln;

end.

В программе объявлены следующие переменные: x, y – целочисленные переменные, которые будут содержать значения, введенные пользователем,  mult – переменная для хранения произведения, она также целого типа, т.к. произведение целых чисел – целое число. z – переменная, в которой будет храниться частное от деления. Она относится к действительному типу, т.к. при делении одного целого числа на другое, вообще говоря, получается вещественное число.

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

writeln('Введите два целых числа'); - на экран выводится текст, указанный в кавычках.

readln(x,y); - происходит считывание значений, введенных с клавиатуры, первое помещается в переменную х, а второе - в переменную у.

mult:=x*y; - переменной mult присваивается результат вычисления выражения.

z:=x/y; - переменной z присваивается результат вычисления выражения.

writeln('произведение равно ', mult, ' частное равно ', z : 2 : 2); - произведение и частное выводятся на экран, с соответствующим текстовым сопровождением.

readln; - задержка экрана.

Пример 3.

Пользователем вводится радиус круга. Определить площадь круга по его радиусу, считать .

uses  SysUtils;

var area:real;

     radius:integer;

begin

 writeln('Введите радиус');

 readln(radius);

 area:=radius*radius*3.14;

 writeln('площадь круга равна  ', area:3:2);

 readln;

end.

Первый оператор программы выводит на экран информацию для пользователя. Процедура readln(radius); считывает число, введенное пользователем, и размещает его в ячейке памяти с именем radius. Далее переменной area присваивается результат вычисления выражения  radius*radius*3.14. Затем значение переменной area выводится на экран с соответствующим текстовым сопровождением. Последний оператор программы выполняет функцию задержки экрана.

Обратите внимание, что в этом примере не использовались процедуры SetConsoleCP(1251);  SetConsoleOutputCP(1251);  в дальнейших примерах они также будут опускаться для краткости.

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

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

Таблица 1.1

Стандартные функции языка Паскаль

Название функции

Назначение

Тип аргумента

Тип возвращаемого значения

abs(x)

модуль аргумента

целый (вещественный)

целый (вещественный)

cos(x)

косинус аргумента

целый (вещественный)

вещественный

exp(x)

значение

целый (вещественный)

вещественный

odd(x)

проверка на четность

целый

логический

sin(x)

синус аргумента

целый (вещественный)

вещественный

sqr(x)

квадрат аргумента

целый (вещественный)

целый (вещественный)

sqrt(x)

квадратный корень из аргумента

целый (вещественный)

вещественный

tan(x)

тангенс аргумента

целый (вещественный)

вещественный

Таблица 1.2

Стандартные процедуры языка Паскаль

Название процедуры

Назначение

Тип аргумента

inc(x)

увеличивает значение аргумента на 1

целый

dec(x)

уменьшает значение аргумента на 1

целый

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

Пример 4.

Вычислить: .

Необходимо объявить три переменные: x, t – могут быть целого типа, их значения будут запрашиваться у пользователя, у – действительного типа, ее значение будет вычислено в программе.

var y:real;

     x,t:integer;

begin

 writeln('Введите x и t ');

 readln(x,t);

 y:=sqrt(x-sin(3*t));

 writeln('y=',y:3:2);

 readln;

end.

Первый оператор программы выводит на экран информацию для пользователя. Процедура readln(x,t); считывает два числа, введенные пользователем, и размещает их в соответствующих ячейках памяти.

Для вычисления значения у были использованы две стандартные функции sqrt() и sin(). Обратите внимание, что аргументы (параметры) функции записываются в круглых скобках после названия функции. Также нельзя пропускать знаки арифметических операций. Нельзя писать  y:=sqrt(x-sin3t); т.к. запись sin3t будет воспринята программой как имя некоторой переменной, а не как функция с параметрами.

Пример 5.

Вычислить:  при х=2.

Можно ввести две переменные, одна будет играть роль параметра, другая результата. Обратите внимание, что названия переменных не обязательно должны совпадать с именами в формулировке задания, так в примере переменная, отвечающая за результат, названа z. Как видно из формулировки задания, переменные х и z будут одного типа.

Т.к. в задании сказано вычислить результат выражения при х=2, то значение переменной х не запрашивается у пользователя, а задается в программе (x:=2;). Далее вычисляется результат и выводится на экран.

var  z, x:integer;

begin

 x:=2;

 z:=abs(sqr(x)-7)+1;

 writeln('y=', z);

 readln;

end.

Пример 6.

Часто при решении задач требуется поменять местами значения переменных. Как это сделать? Зависит от формулировки задания, иногда требуется поменять местами значения без использования дополнительной переменной, но чаще используется другой способ – с использованием дополнительной переменной.

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

var x,y,temp:integer;

begin

{ инициализация переменных}

  x:=3;  y:=11;

{ изменение значений,  temp – вспомогательная переменная (пустой стакан)}

 temp:=x;

 x:=y;

 y:=temp;

 writeln('x=',x,' y=',y);

 readln;

end.

Единственное отличие от аналогии со стаканами состоит в том, что дополнительный стакан после обмена содержимым остается пустым, а в переменной temp после обмена значениями содержится первоначальное значение переменной х. Добавим в программу строчку writeln('temp=', temp); получим результат:

Стандартные ошибки

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

Наиболее часто встречающиеся ошибки рассмотрены ниже.

Сообщение об ошибке находится в нижней секции окна. Оно начинается со слова Error (в пер. с англ. «ошибка»), далее указывается название файла проекта Project5.dpr и номер строки с ошибкой (в примере 13), причем считаются все строки подряд, включая пустые, начиная с заголовка программы. Далее расшифровывается, в чем состоит ошибка: «Undeclared identifier: ‘z’». Это означает, что в программе используется имя переменной (идентификатор), которая не была объявлена в разделе var.

Фраза «Missing operator or semicolon» чаще всего означает, что в предыдущей строке пропущен знак « ; ». Действительно, после оператора х:=2 знак «точка с запятой» отсутствует.

Ошибка «Incompatible types: ‘IntegerandExtended’» в данном случае означает, что происходит попытка присвоения целочисленной переменной у вещественного значения (а результат вычисления выражения действительно может быть дробным).

Все ошибки, начинающиеся словами «Incompatible types:» означают несовместимость типов. Это может быть присвоение переменной несвойственного ей значения, использование в выражении переменных несовместимых типов (нельзя, например, складывать число и символ) и т.п.

«Error» - это синтаксические ошибки, их найти и исправить наиболее просто. Кроме сообщений об ошибках компилятор выдает предупреждения «Warning» и подсказки «Hint». «Warning» и «Hint» не мешают запуску программы, но они содержат информацию, которая поможет исправить потенциальные, не синтаксические ошибки.

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

В следующих «Warning» говорится о том, что переменные x и t используются в программе, при этом они не были проинициализированы. Действительно, в данной программе пропущен либо оператор readln(x,t); либо операторы присваивания (например, x:=2; t:=1;).

Контрольные вопросы

  1.  Из каких символов может состоять идентификатор языка программирования Паскаль?
  2.  С помощью какого ключевого слова в программе объявляются константы?
  3.  С какого ключевого слова начинается раздел объявления переменных?
  4.  Что такое переменная?
  5.  Между какими ключевыми словами заключается тело программы (раздел операторов)?
  6.  Какой раздел программы начинается со слова uses?
  7.  Верно ли утверждение: язык программирования Паскаль не чувствителен к регистру?
  8.  Какой знак предназначен для разделения операторов?
  9.  Каким знаком при объявлении переменных отделяется имя переменной от типа данных?
  10.  Можно ли при объявлении переменных одного типа перечислить их имена через запятую, а потом через двоеточие указать тип данных?
  11.  Какой модуль нужно подключить для использования математических функций?
  12.  С помощью какой процедуры можно вывести на экран значение переменной? константы?
  13.  Чем отличаются процедуры write() и writeln()?
  14.  Оператор  :=  называется оператором ___.
  15.  Может ли переменная типа byte принимать отрицательные значения?
  16.  Перечислите вещественные типы данных языка Паскаль.
  17.  К какому типу относится результат выражения (x+y)/z, где x, y, z – переменные любого целого типа.
  18.  Как в языке программирования Паскаль указать формат вывода для переменных вещественного типа?
  19.  К переменным какого типа применимы операции div и mod? Результатом этих операций являются значения ___ типа.

Примерный вариант контрольной работы

  1.  Какие целочисленные типы данных могут хранить только неотрицательные значения?
  2.  Дано трехзначное число. Найти число десятков в нем и произведение его цифр.
  3.  Вычислить значение функции z. Значения x и у  ввести с клавиатуры.

  1.  Указать значения вещественных переменных а и b после выполнения следующих операторов присваивания:

    а := 5.8; 

    b := -7.9; 

    b := а ;

    а := b ;

  1.  Треугольник задан координатами своих вершин. Найти периметр и площадь треугольника.


Лабораторная работа №2. Логический тип данных. Операторы ветвления в языке программирования Паскаль

Требования к лабораторной работе

После выполнения лабораторной работы обучаемый должен:

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

Задания, начинающиеся со слов «С помощью логической переменной проверьте…» следует выполнять без использования операторов ветвления.

Задания №8-№9 групп А и В и Задание №6 группы С следует выполнять с применением оператора выбора, остальные задания нужно решать с помощью условного оператора.

Задания к лабораторной работе

Группа А

Задание №1

С помощью логической переменной проверьте:

  1.  (а+4) – отрицательное число.
  2.  a*b – четное.
  3.  (a+b) кратно 7.
  4.  а меньше 21;.
  5.  (а-5) – положительное число.
  6.  а – делится на (b+1).

Задание №2

С помощью логической переменной проверьте:

  1.  В двузначном числе  ab=a*10+b.  (a+b) и (a-b) - четные числа.
  2.  В двузначном числе ab=a*10+b хотя бы одно из двух выражений (a+b) и (a*b)  - нечетное число.
  3.  В двузначном числе ab=a*10+b   a=b и  a- кратно 4.
  4.  В двузначном числе ab=a*10+b остаток от деления первой цифры на 2 равен 1, а остаток от деления второй цифры на 3 равен 2.
  5.  Остаток от деления хотя бы одной цифры двузначного числа ab=a*10+b на 3 равен 1.

Задание №3

С помощью логической переменной проверьте, что число х принадлежит промежутку:

  1.  .
  2.  .
  3.  .
  4.  .
  5.  .
  6.  .

Задание №4

С помощью логической переменной проверьте, что число х не принадлежит промежутку:

  1.  .
  2.  .
  3.  .
  4.  .
  5.  .
  6.  .

Задание №5

  1.  Даны два числа a и b, если a>b, то вычислить их сумму, иначе – их произведение.
  2.  Если целое число М делиться нацело на целое число N, то вывести на экран частное от деления, в противном случае - сообщение «M на N нацело не делиться».
  3.  Даны два числа, если они положительны, вычислить их произведение, в противном случае – частное от деления первого числа на второе.
  4.  Даны вещественные числа a, b, c. Если a+b >=c, то найти сумму этих чисел, в противном случае найти сумму квадратов чисел.
  5.  Вычислите значение функции (с помощью полной формы условного оператора):

.

  1.  Вычислите значение функции (с помощью полной формы условного оператора):

.

Задание №6

  1.  Даны три числа. Подсчитать количество чисел равных 0.
  2.  Найдите количество отрицательных чисел среди четырех целых чисел.
  3.  Составить программу, которая из трех введенных с клавиатуры чисел возводит в квадрат положительные, а отрицательные оставляет без изменения.
  4.  Для трех вещественных чисел возвести в квадрат те из них, которые неотрицательны.
  5.  Для 4 целых чисел возвести в квадрат те, которые нечетные отрицательные.
  6.  Для четырех целых чисел извлечь корень из чисел, которые неотрицательны и четны.

Задание №7

  1.  Для целых x, y, z выбрать те, которые принадлежат интервалу [0.5,9.3] и кратны 3.
  2.  Для целых x, y, z выбрать те, которые не принадлежат интервалу [5,13] и четные.
  3.  Для вещественных x, y, z выбрать те, которые принадлежат интервалу (1,3) и положительны.
  4.  Для вещественных x, y, z выбрать те, которые не принадлежат интервалу [10,18] и отрицательны.
  5.  Для целых x, y, z вычислить max (x+y, z - x*y).
  6.  Для целых x, y, z вычислить min (x/y, x*z-2).

Задание №8

  1.  Составить программу, которая в зависимости от порядкового номера дня недели (1, 2, ..., 7) выводит на экран его название (понедельник, вторник, ..., воскресенье).
  2.  Составить программу, которая в зависимости от порядкового номера месяца (1, 2, ..., 12) выводит на экран его название (январь, февраль, .... декабрь).
  3.  Мастям игральных карт условно присвоены следующие порядковые номера: «пики» — 1, «трефы» — 2, «бубны» — 3, «червы» — 4. По заданному номеру масти m (1 < m < 4) определить название соответствующей масти.
  4.  Игральным картам условно присвоены следующие порядковые номера в зависимости от их достоинства: «валету» — 11, «даме» — 12, «королю» — 13, «тузу» — 14. Порядковые номера остальных карт соответствуют их названиям («шестерка», «девятка» и т. п.). По заданному номеру карты k (6 < k < 14) определить достоинство соответствующей карты.
  5.  Составить программу, которая в зависимости от порядкового номера месяца выводит на экран название соответствующего времени года.
  6.  Составить программу, которая в зависимости от порядкового номера месяца выводит на экран номер соответствующего квартала.

Задание №9

  1.  Составить программу, которая в зависимости от порядкового номера месяца (1, 2, ..., 12) выводит на экран количество дней в этом месяце. Рассмотреть два случая:
    •  год не является високосным;
    •  год високосный (информация об этом вводится с клавиатуры).
  2.  Мастям игральных карт условно присвоены следующие порядковые номера: «пики» — 1, «трефы» — 2, «бубны» — 3, «червы» — 4. Достоинству карт присвоены следующие номера: «валету» — 11, «даме» — 12, «королю» — 13, «тузу» — 14 (порядковые номера карт остальных достоинств соответствуют их названиям: «шестерка», «девятка» и т. п.). По заданным номеру масти m ( 1 < m < 4 ) и номеру достоинства карты k (6 < k < 14) вывести на экран полное название (масть и достоинство) соответствующей карты в виде: «дама пик», «шестерка бубен» — и т. п.
  3.  С начала 1990 года по некоторый день прошло n месяцев и 2 дня (n >= 20). Определить название месяца (январь, февраль и т. п.) этого дня.
  4.  Дата некоторого дня определяется двумя натуральными числами m (порядковый номер месяца) и n (число). По заданным n и m определить:
    •  дату предыдущего дня (принять, что n и m не определяют 1 января);
    •  дату следующего дня (принять, что n и m не определяют 31 декабря).

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

  1.  Дата некоторого дня определяется тремя натуральными числами: g (год), m (порядковый номер месяца) и n (число). По заданным g, n и m определить:
    •  дату предыдущего дня;
    •  дату следующего дня.

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

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

Группа В

Задание №1

Заданы два (х и у) или три (х, у, с) целых числа, с помощью логической переменной проверьте:

  1.  Оба числа являются четными.
  2.  Оба выражения  являются положительными числами.
  3.  Оба произведения  являются отрицательными числами.
  4.  Хотя бы одно из двух чисел является отрицательным.
  5.  Хотя бы одно из выражений  кратно 5.
  6.  Хотя бы одно из произведений  является положительным числом.

Задание №2

С помощью логической переменной проверьте, что число х принадлежит промежутку:

  1.  .
  2.  .
  3.  .
  4.  .
  5.  .
  6.  .

Задание №3

С помощью логической переменной проверьте, что число х не принадлежит промежутку:

  1.  .
  2.  .
  3.  .
  4.  .
  5.  .
  6.  .

Задание №4

С помощью логической переменной проверьте, что точка с координатами (x,y) принадлежит заданной области.

Геометрические фигуры задаются точкой на плоскости и длинами (-ой)

сторон (-ы) (радиус для круга). Эти параметры задаются пользователем с клавиатуры.

Фигура 1

Фигура 2

Выражение

  1.  

  1.  

  1.  

  1.  

  1.  

  1.  

Задание №5

  1.  Даны вещественные x, y, z. Найти max( x*y*z, xy/z, x-z ).
  2.  Даны вещественные x, y, z. Найти min( (x+y+z)/3, xy/(z*z), (x+y)*z  )+27.
  3.  Даны три целых числа, найти среднее из них (средним назовем число, которое больше наименьшего из данных чисел, но меньше наибольшего).
  4.  Даны три целых числа, найти произведение двух наибольших чисел.
  5.  С помощью сокращенной формы оператора условия найти наименьшее из четырех заданных чисел.
  6.  С помощью сокращенной формы оператора условия найти наибольшее из четырех заданных чисел.

Задание №6

Решить неравенства:

  1.  .
  2.  .
  3.  .
  4.  .
  5.  .
  6.  .

Задание №7

  1.  Водятся длины сторон треугольника, определить является ли он прямоугольным.
  2.  Водятся длины сторон треугольника, определить является ли он равносторонним.
  3.  Водятся длины сторон треугольника, определить является ли он равнобедренным.
  4.  Вводятся координаты четырех точек на плоскости A, B, C, D,  определить, являются ли вектора  и коллинеарными.
  5.  Вводятся координаты четырех точек на плоскости A, B, C, D,  определить, являются ли вектора  и ортогональными.
  6.  Даны три вещественных числа a, b, c, определить существует ли треугольник с такими сторонами.

Задание №8

  1.  Составить программу, которая в зависимости от порядкового номера дня недели (1, 2, ..., 7) выводит на экран его название (понедельник, вторник, ..., воскресенье).
  2.  Составить программу, которая в зависимости от порядкового номера месяца (1, 2, ..., 12) выводит на экран его название (январь, февраль, .... декабрь).
  3.  Мастям игральных карт условно присвоены следующие порядковые номера: «пики» — 1, «трефы» — 2, «бубны» — 3, «червы» — 4. По заданному номеру масти m (1 < m < 4) определить название соответствующей масти.
  4.  Игральным картам условно присвоены следующие порядковые номера в зависимости от их достоинства: «валету» — 11, «даме» — 12, «королю» — 13, «тузу» — 14. Порядковые номера остальных карт соответствуют их названиям («шестерка», «девятка» и т. п.). По заданному номеру карты k (6 < k < 14) определить достоинство соответствующей карты.
  5.  Составить программу, которая в зависимости от порядкового номера месяца выводит на экран название соответствующего времени года.
  6.  Составить программу, которая в зависимости от порядкового номера месяца выводит на экран номер соответствующего квартала.

Задание №9

  1.  Составить программу, которая в зависимости от порядкового номера месяца (1, 2, ..., 12) выводит на экран количество дней в этом месяце. Рассмотреть два случая:
    •  год не является високосным;
    •  год високосный (информация об этом вводится с клавиатуры).
  2.  Мастям игральных карт условно присвоены следующие порядковые номера: «пики» — 1, «трефы» — 2, «бубны» — 3, «червы» — 4. Достоинству карт присвоены следующие номера: «валету» — 11, «даме» — 12, «королю» — 13, «тузу» — 14 (порядковые номера карт остальных достоинств соответствуют их названиям: «шестерка», «девятка» и т. п.). По заданным номеру масти m ( 1 < m < 4 ) и номеру достоинства карты k (6 < k < 14) вывести на экран полное название (масть и достоинство) соответствующей карты в виде: «дама пик», «шестерка бубен» — и т. п.
  3.  С начала 1990 года по некоторый день прошло n месяцев и 2 дня (n >= 20). Определить название месяца (январь, февраль и т. п.) этого дня.
  4.  Дата некоторого дня определяется двумя натуральными числами m (порядковый номер месяца) и n (число). По заданным n и m определить:
    •  дату предыдущего дня (принять, что n и m не определяют 1 января);
    •  дату следующего дня (принять, что n и m не определяют 31 декабря).

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

  1.  Дата некоторого дня определяется тремя натуральными числами: g (год), m (порядковый номер месяца) и n (число). По заданным g, n и m определить:
    •  дату предыдущего дня;
    •  дату следующего дня.

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

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

Группа С

Задание №1

Даны целые числа х и у. С помощью логической переменной проверьте:

  1.  Они имеют разные знаки, и при этом оба числа являются четными.
  2.  Они имеют одинаковые знаки, и при этом оба числа являются нечетными.
  3.  Оба числа являются положительными и хотя бы одно из них нечетное.
  4.  Оба числа являются отрицательными и хотя бы одно из них кратно 5.
  5.  Они  имеют разные знаки, и при этом хотя бы одно из них кратно 3.
  6.  Они  имеют одинаковые знаки, и при этом хотя бы одно из них четное.

Задание №2

С помощью логической переменной проверьте, что точка с координатами (x,y)  принадлежит  заданной области.

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

Пример:

Фигура 1

Фигура 2

Фигура 3

Выражение

Фигура1

Фигура2

Фигура 3

Выражение

  1.  

  1.  

или

  1.  

  1.  

  1.  

или

  1.  

Задание №3

  1.  Провести полное исследование квадратного уравнения (рассмотреть все случаи a=0, b=0, c=0, коэффициенты вводятся с клавиатуры).
  2.  Найти количество корней биквадратного уравнения (коэффициенты вводятся с клавиатуры).
  3.  Составьте программу для решения неравенства .
  4.  Составьте программу для решения неравенства .
  5.  Составьте программу для решения систем неравенств

.

  1.  Составьте программу для решения систем неравенств

.

Задание №4

  1.  Водятся длины сторон треугольника, определить является ли он прямоугольным.
  2.  Водятся длины сторон треугольника, определить является ли он равносторонним.
  3.  Водятся длины сторон треугольника, определить является ли он равнобедренным.
  4.  Вводятся координаты четырех точек на плоскости A, B, C, D,  определить, являются ли вектора  и коллинеарными.
  5.  Вводятся координаты четырех точек на плоскости A, B, C, D,  определить, являются ли вектора  и ортогональными.
  6.  Даны три вещественных числа a, b, c, определить существует ли треугольник с такими сторонами.

Задание №5

  1.  Вводятся координаты четырех точек на плоскости, проверить является ли полученная фигура прямоугольником.
  2.  Вводятся координаты четырех точек на плоскости, проверить является ли полученная фигура ромбом.
  3.  Вводятся координаты четырех точек на плоскости, проверить является ли полученная фигура параллелограммом.
  4.  Водятся координаты трех точек на плоскости, определить является ли полученная фигура прямоугольным треугольником.
  5.  Водятся координаты трех точек на плоскости, определить является ли полученная фигура равносторонним треугольником.
  6.  Водятся координаты трех точек на плоскости, определить является ли полученная фигура равнобедренным треугольником.

Задание №6

Задание выполняется для всех вариантов полностью.

  1.  Дано натуральное число n (1  n  9999), определяющее стоимость товара в копейках. Выразить стоимость в рублях и копейках, например, 3 рубля 21 копейка, 15 рублей 5 копеек, 1 рубль ровно и т. п.
  2.  Дано натуральное число  (1  n  1188), определяющее возраст человека (в месяцах). Выразить возраст в годах и месяцах, например, 21 год 10 месяцев, 52 года 1 месяц, 46 лет ровно и т. п.
  3.  В старояпонском календаре был принят 60-летний цикл, состоящий из пяти 12-летних подциклов. Подциклы обозначались названиями цветов: зеленый, красный, желтый, белый и черный. Внутри каждого подцикла годы носили названия животных: крыса, корова, тигр, заяц, дракон, змея, лошадь, овца, обезьяна, курица, собака и свинья. Например, 1984 год — год начала очередного цикла — назывался Годом Зеленой Крысы. Составить программу, которая по заданному номеру года нашей эры  n   печатает его название по старояпонскому календарю.

Теоретический материал и методические указания

Логический тип boolean

Переменные логического типа boolean могут принимать только два значения true и false – истина и ложь. Их объявление также происходит в разделе объявления переменных и имеет вид:  var t : boolean;

Начиняя работу с логическим типом, следует вспомнить об операциях отношения, т.е. операциях . Эти операции применимы к переменным многих типов данных, при этом результат их применения относится к логическому типу. Например, результат выражения  a*b>c   (где  a, b и c – вещественные переменные) будет истинным при наборе значений a=2.3, b=7, c=3.5  и ложным при наборе чисел  a=2.3, b=7, c=20.5.

Поскольку результат таких выражений будет логическим, то его можно присвоить переменной логического типа:  t:=( a*b>c);  при различных значениях переменных a, b и c переменная t будет принимать значения true или false.

Значение переменных логического типа можно вывести на экран с помощью оператора writeln().

Пример 1.

Пользователь вводит два числа, проверить, равны ли эти числа.

var t:boolean;

    a,b:integer;

begin

 writeln('Введите два числа');

 readln(a,b);

 t:=(a=b);

 writeln('Числа равны?   ', t);

 readln;

end.

В программе объявлены две переменные целого типа и одна – логического. Значения целочисленных переменных вводятся с клавиатуры, а логической переменной присваивается результат вычисления выражения  a=b, результат будет истинным, если два числа равны и ложным в противном случае. Далее значение переменной t выводится на экран с соответствующим текстовым сопровождением.

Результат работы программы:

Логические операции

К переменным логического типа можно применять следующие операции: and, or, not, xor. Пусть А и В – переменные типа boolean. Далее приведена таблица истинности для логических операций. Для удобства вместо значения false в ней используется 0, а вместо  true – 1.

А

В

А and В

А or В

А xor В

not А

0

0

0

0

0

1

0

1

0

1

1

1

1

0

0

1

1

0

1

1

1

1

0

0

Пример 2.

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

var t1,t2,t:boolean;

     x:integer;

begin

 writeln('Введите число');

 readln(x);

 t1:=(x>0);

 t2:=(x mod 2 =0);

 t:=t1 and t2;

 writeln('Число четно и положительно  ',t);

 readln;

end.

В программе объявлены три переменные логического типа, переменной t1 присваивается результат вычисления выражения (x>0), это означает, что t1 примет значение «истина», если х – положительно, и «ложь» – в противном случае. Переменная t2 примет значение «истина», если х – четно, т.е. остаток от деления числа х на 2 равен 0,  и «ложь» –если х нечетно. Следующий оператор программы  -   t:=t1 and t2; переменная t будет истинной, если обе переменные t1 и t2 истинны одновременно (т.е. одновременно выполняются условия положительности и четности) и ложной – в противном случае.

В данной программе переменные t1 и t2 являются вспомогательными и без них можно обойтись.

var t:boolean;

     x:integer;

begin

 writeln('Введите число');

 readln(x);

 t:=(x>0) and (x mod 2 =0);

 writeln('Число четно и положительно  ',t);

 readln;

end.

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

Результат работы программы:

Обратите внимание, что при записи составных условий, например,  (x>0) and (x mod 2 =0) оба условия должны быть заключены в скобки. Записи t:=(x>0 and  x mod 2 =0); или t:=x>0 and  x mod 2 =0; вызовут ошибку:

Пример 3.

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

Из формулировки задачи ясно, что логическая переменная должна принимать значение истина, если

  •  условию отвечает только первая цифра;
    •  условию отвечает только вторая цифра;
    •  условию отвечают обе цифры.

Ложь – если обе цифры условию не отвечают. Такой результат дает применение логической операции or.

var t:boolean;

   x,a1,a10:integer;

begin

 writeln('Введите число');

 readln(x);

 a1:=x mod 10;

 a10:=x div 10;

 t:=(a1  mod  3 =1) or (a10  mod  3 =1);

 writeln(' Остаток от деления хотя бы одной цифры на 3 равен 1   ', t);

 readln;

end.

В программе использовались две дополнительные переменные a1 и a10, a1 – количество единиц двузначного числа, a10 – количество десятков двузначного числа. Если в условии задачи встречаются слова «…хотя бы одна…»  - это означает, что нужно использовать операцию or. Переменная t примет значение истина, если результат хотя бы одного выражения  (a1  mod  3 =1) или  (a10  mod  3 =1) будет истинным.

Пример 4.

С помощью логической переменной проверить, принадлежит ли число х, введенное пользователем,  промежутку  [-3, 10).

Т.е. число должно быть не меньше левой границы и не превышать правой границы промежутка (одновременное выполнение двух условий).

var t:boolean;

     x:integer;

begin

 writeln('Введите число');

 readln(x);

 t:=(x>=-3) and (x<10);

 writeln('Число х= ', x ,' принадлежит промежутку [-3,10)?   ', t);

 readln;

end.

Обратите внимание, что понятию «объединение» в математике соответствует логическая операция OR, а понятию «пересечение» - операция AND.

Пример 5.

С помощью логической переменной определить, принадлежит ли точка с координатами (х, у) заданной области.

Во-первых, нужно запросить координаты точки у пользователя. Далее нужно проверить попадает ли точка в эту область. Выделенная область представляет собой пересечение трех областей:

  •  единичная окружность с центром в начале координат;
    •  правая полуплоскость относительно оси ординат  (т.е. прямой х=0);
    •  верхняя полуплоскость относительно оси абсцисс (т.е. прямой у=0).

Чтобы точка попала в верхнюю полуплоскость ее координата у должна быть положительна, в правую полуплоскость – положительна координата х. Чтобы попасть во внутрь окружности координаты точки должны удовлетворять условию: , где R – радиус окружности,  - координаты центра окружности. Пересечение областей находится с помощью логической операции AND.

var x,y : real;

     res : boolean;

begin 

  writeln(‘Введите координаты точки на плоскости’);

  readln(x, y);

  res:=(0 < x) and (0 < y) and ((sqr(x) + sqr(y)) < 1);

  writeln(‘Точка принадлежит области?  ’, res);

  readln;

end.

Полная форма условного оператора

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

Синтаксис условного оператора:

if <выражение> then <оператор_1> else <оператор_2>;

Результат вычисления выражения, которое следует за ключевым словом if, должен быть логического типа. Т.е. <выражение> представляет собой  условие, которое может быть как простым, например, x>0  или t=true,  так и составным с использованием логических операций.

Если перевести ключевые слова условного оператора на русский язык, то получится следующее: если (if) выражение истинно, то (then) выполняется один набор операторов, иначе (else) выполняется другой набор операторов.

Обратите внимание:

  •  перед словом else точка с запятой не ставится;
    •  по ветви  then и по ветви else может быть использован только один оператор, если требуется, чтобы выполнялось несколько операторов их необходимо заключать в операторные скобки (begin..end).

Пример 6.

Найти модуль числа, введенного пользователем.

var x,modul:real;

begin

 writeln('Введите число х');

 readln(x);

 if (x>=0) then modul:=x else modul:=-x;

 writeln('|x|=', modul:0:2);

 readln;

end.

Пример 7.

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

var a,b, s1,s2:real;

begin

 writeln('Введите числа а и b ');

 readln(a,b);

 if (a>b) then begin

   s1:=a-b;

   writeln('Разность чисел равна  ', s1:0:2);

 end

 else begin

   s2:=a*b;

   writeln('Произведение чисел равно  ', s2:0:2);

 end;

 readln;

end.

Пользователь вводит два числа. Затем в условном операторе проверяется условие: первое число больше второго? В случае когда условие истинно (т.е. по ветви then ), вычисляется разность чисел и  присваивается переменной s1, на экран выводится значение переменной s1 и текстовое сопровождение. Если условие ложно (второе число больше первого или числа равны), то высчитывается произведение чисел, присваивается переменной s2, значение  переменной s2 выводится на экран. Обратите внимание, при таком решении задачи по ветви then и по ветви else должно выполняться по два оператора, а, значит, их следует заключить в операторные скобки, если операторные скобки не будут расставлены, то компилятор выдаст ошибку:

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

  •  слово begin ставится непосредственно после ключевых слов (then, else) до операторов, которые должны быть выполнены по данной ветви;
    •  слово end должно располагаться за последним оператором, который необходимо выполнить по данной ветви.

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

var a,b:real;

begin

 writeln('Введите числа а и b ');

 readln(a,b);

   if (a>b) then   writeln('Разность чисел равна  ', a-b:0:2)

        else   writeln('Произведение чисел равно  ', a*b:0:2);

 readln;

end.

Пример 8.

В примере №5 требовалось определить, принадлежит ли точка с координатами (х, у) заданной области (с помощью логической переменной).

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

var x,y : real;

   t1,t2 : boolean;

begin

  writeln('Введите координаты точки на плоскости');

  readln(x, y);

  t1:=(0 < x) and (0 < y);         { принадлежность точки первой четверти}

  t2:=(sqr(x) + sqr(y)) < 1;      { принадлежность точки окружности}

  if (t1=true) and (t2=true) { если точка принадлежит пересечению областей}

    then writeln('Точка принадлежит области')

    else writeln(' Точка не принадлежит области ');

  readln;

end.

Запись   if (t1=true) and (t2=true)  … эквивалентна записи   if  t1 and  t2  …  

Краткая форма условного оператора

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

if  <выражение> then <оператор_1>;

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

var x,cub:integer;

begin

 writeln('Введите число ');

 readln(x);

 if (x>0) then begin

    cub:=x*sqr(x);

    writeln('x*x*x= ',cub);

 end;

readln;

end.

Если операторные скобки не поставить, то по ветви then выполнится только один оператор, а именно cub:=x*sqr(x); а значение переменной cub будет выводиться на экран в любом случае.

var x,cub:integer;

begin

 writeln('Введите число ');

 readln(x);

 if (x>0) then

    cub:=x*sqr(x);

    writeln('x*x*x= ',cub);

readln;

end.

При этом компилятор выдает предупреждение о том, что переменная cub может быть не проинициализирована, такая ситуация возникнет, если пользователь введет отрицательное число или 0.  В этом случае компилятор (в зависимости от настроек) может проинициализировать переменную cub нулем или другим произвольным значением, и при вводе пользователем, например, числа -3 на экран может быть выведена запись «х*х*х=1».

Пример 9.

Заданы три целых числа, необходимо возвести в квадрат отрицательные числа.

В задании требуется возвести в квадрат числа удовлетворяющие условию, т.е. изменения должны произойти с самими переменными. Если значение переменной отрицательно, то переменная должна принять новое значение, равное квадрату предыдущего значения  (a:=sqr(a);).

var a,b,c:integer;

begin

 write('a=');   readln(a);

 write('b=');   readln(b);

 write('c=');   readln(c);

 if (a<0) then begin

     a:=sqr(a);

     writeln('a*a=',a);

 end;

 if (b<0) then begin

     b:=sqr(b);

     writeln('b*b=',b);

 end;

 if (c<0) then begin

     c:=sqr(c);

     writeln('c*c=',c);

 end;

 readln;

end.

Если в задании требуется только вывести на экран квадраты отрицательных чисел, то код программы упростится:

var a,b,c:integer;

begin

 write('a='); readln(a);

 write('b='); readln(b);

 write('c='); readln(c);

 if (a<0) then writeln('a*a=',a*a);

 if (b<0) then writeln('b*b=',b*b);

 if (c<0) then writeln('c*c=',c*c);

 readln;

end.

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

Но в первом варианте значения переменных a, b и c меняются,  если переменные удовлетворяют условию, а во втором варианте – остаются неизменными.

Пример 10.

Заданы три целых числа, следует подсчитать количество четных чисел.

var a,b,c,count:integer;

begin

 write('a='); readln(a);

 write('b='); readln(b);

 write('c='); readln(c);

 count:=0;

 if (a mod 2=0) then inc(count);

 if (b mod 2=0) then inc(count);

 if (c mod 2=0) then inc(count);

 writeln('Количество четных чисел равно  ', count);

 readln;

end.

В переменной count будет храниться количество четных чисел. Перед проверкой введенных чисел на четность, переменную count следует проинициализировать: count:=0;. Затем каждое из трех чисел проверяется на четность, если  число является таковым – значение переменной count увеличивается на единицу с помощью процедуры inc(). После проверки всех чисел, значение count выводится на экран.

Пример 11.

Заданы три целых числа, проверить, есть ли среди них четные числа.

Данную задачу можно решить аналогично предыдущей,  следует только проверить в конце значение переменной count, если оно положительно, значит, такие числа есть, если равно нулю – значит, четных чисел нет. Но обычно задачи, в которых требуется ответить на вопрос «есть ли…?», «является ли…?» решаются с помощью переменных логического типа. Эти переменные до начала проверки должны быть явно проинициализированы (например, t:=false;), затем в процессе проверки могут изменить свое значение.

var a,b,c:integer;

   t:boolean;

begin

 write('a='); readln(a);

 write('b='); readln(b);

 write('c='); readln(c);

 t:=false;

 if (a mod 2=0) then t:=true;

 if (b mod 2=0) then t:=true;

 if (c mod 2=0) then t:=true;

 if t then writeln('есть четные числа ') else writeln('нет четных чисел');

 readln;

end.

Оператор выбора

При разветвлении процесса вычислений на множество направлений используется оператор выбора.

Синтаксис оператора выбора имеет вид:

 case  <выражение>  of

   <значение_1> : <оператор_1>;

   <значение_2> : <оператор_2>;

    <значение_n> : <оператор_n>;

 else <оператор>;

 end;

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

<значение_1>…<значение_n> - некоторые константы, возможные значения переменной или результаты  вычисления выражения.

<оператор_1>; -оператор, который необходимо выполнить, если результат <выражения> равен  <значению_1>   и т.д.

По ветви else прописывается оператор, выполняемый, когда результат <выражения> не совпадает ни с одним из возможных значений. Ветвь else может отсутствовать. Перед словом else знак «;» может присутствовать, в отличие от условного оператора, это не является ошибкой.

Оператор выбора обязательно оканчивается ключевым словом end;

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

Пример 12.

Пользователь вводит номер дня недели, следует вывести на название этого дня (1 – понедельник, 3 – среда и т.п.). Чтобы решить эту задачу с помощью условного оператора, потребуется семикратное  использование сокращенной формы оператора if.

var x:byte;

begin

 writeln('Введите номер дня недели');

 readln(x);

 if (x=1) then writeln('Понедельник');

 if (x=2) then writeln('Вторник');

 if (x=3) then writeln('Среда');

 if (x=4) then writeln('Четверг');

 if (x=5) then writeln('Пятница');

 if (x=6) then writeln('Суббота');

 if (x=7) then writeln('Воскресенье');

 readln;

end.

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

var x:byte;

begin

 writeln('Введите номер дня недели');

 readln(x);

 case x of

   1:writeln('Понедельник');

   2:writeln('Вторник');

   3:writeln('Среда');

   4:writeln('Четверг');

   5:writeln('Пятница');

   6:writeln('Суббота');

   7:writeln('Воскресенье');

 else writeln('нет дня недели с таким номером');

 end;

 readln;

end.

Если пользователь введет число 3, на экран выведется текст «среда» и т.п.

Пример 13.

Пользователь вводит два числа и знак математической операции (+, -, *, /), на экран должен быть выведен результат взаимодействия чисел в зависимости от операции (если пользователь вводит «+», то на экране должна отобразиться сумма чисел).

var a,b,s1:integer;

   s2:real;

   ch:char;

begin

 writeln('Введите два числа ');

 readln(a,b);

 writeln(' Введите знак арифметической операции');

 readln(ch);

 case ch of

   '+': begin

            s1:=a+b;

            writeln('a+b= ',s1);

        end;

   '-': begin

           s1:=a-b;

            writeln('a-b= ',s1);

        end;

   '*': begin

            s1:=a*b;

            writeln('a*b= ',s1);

        end;

   '/': begin

            s2:=a/b;

            writeln('a/b= ',s2:0:2);

        end;

 else writeln('это не знак арифметической операции ');

 end;

 readln;

end.

Контрольные вопросы

  1.  Какие значения могут принимать переменные логического типа?
  2.  Сколько логических типов есть в языке программирования Паскаль?
  3.  Верно ли, что  true>false?
  4.  Можно ли переменной логического типа присвоить результат вычисления выражения:  
    •  (x+y)/z, где x,y,z – переменные вещественного типа,
    •  x div 2 =7  ?
  5.  Какие операции применимы к переменным логического типа?
  6.  Приведите таблицу истинности для операции xor.
  7.  Какое количество байт выделяется в памяти под переменную типа boolean?
  8.  Допустимо ли выражение t1+t2 , где t1 и t2 – переменные логического типа?
  9.  Относится ли логический тип к перечисляемым типам данных?
  10.  В каких ситуациях применяются операторы ветвления?
  11.  Каков синтаксис условного оператора?
  12.  Как выглядит краткая форма условного оператора? В каких случаях она применяется?
  13.  Что такое вложенные условные операторы, в каких случаях они применяются?
  14.  Что такое оператор выбора? В чем его отличие от условного оператора?
  15.  Каков синтаксис оператора выбора?
  16.  Какие типы данных называют порядковыми?
  17.  Какое количество операторов можно выполнить по каждой ветви условного оператора? Оператора выбора?

Примерный вариант контрольной работы

  1.  Вычислить значение логического выражения: А или В и не С, если А = Истина, В = Ложь, С = Ложь.
  2.  Составить программу решения линейного уравнения ах+b=0, рассмотреть случай  а=0.
  3.  С помощью логической переменной проверить, что точка с координатами (х,у) попадает в заштрихованную область.

  1.  Даны три вещественных числа а, b, с. Определить, имеется ли среди них хотя бы одна пара равных между собой чисел.


Лабораторная работа №3. Операторы цикла в языке программирования Паскаль

Требования к лабораторной работе

После выполнения лабораторной работы обучаемый должен:

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

Задания №1-№3 из Группы А, №1-№4 Группы В, №1-№4 Группы С должны быть выполнены с использованием цикла с параметром. Остальные задания должны быть выполнены в двух вариантах: с использованием циклов с предусловием и постусловием.

Для получения требуемой степени числа функции power() и exp() не использовать.

Задания групп В и С следует решать без использования вложенных циклов.

Задания к лабораторной работе

Группа А

Задание №1.

  1.  Напечатать таблицу соответствия между весом в фунтах и весом в килограммах для значений 1, 2, ..., 10 фунтов (1 фунт = 453 г).
  2.  Напечатать таблицу соответствия расстояний в дюймах расстояниям в сантиметрах для значений 10, 11, ..., 22 дюйма (1 дюйм = 25,4 мм).
  3.  Распечатать в «столбик» таблицу умножения на число n (значение n вводится с клавиатуры; 1 < n < 9).
  4.  Рассчитать значения у для значений х, равных 4, 5, ..., 28, если у задается следующей формулой
  5.  Рассчитать значения  z для значений х, равных 2, 3,..., 17, если z задается следующей формулой:
  6.  Напечатать таблицу стоимости 50, 100, 150, ..., 1000 г сыра (стоимость 1 кг сыра вводится с клавиатуры).

Задание №2.

Найти:

  1.  Сумму квадратов всех чисел кратных 3 в промежутке от а до b (значения а и b вводятся с клавиатуры; b > а).
  2.  Произведение всех нечетных чисел от а до 20 (значение а вводится с клавиатуры;   1 < а < 20).
  3.  Произведение всех четных чисел от а до b (значения а и b вводятся с клавиатуры; b > a).
  4.  Среднее арифметическое квадратов всех нечетных чисел от а до 200 (значение а и b вводится с клавиатуры; а < 200).
  5.  Среднее арифметическое квадратов всех целых чисел от а до b (значения а и b вводятся с клавиатуры; b > а).
  6.  Количество  чисел кратных 7 в промежутке от 1 до n (значение n вводится с клавиатуры; 1 < n < 100).

Задание №3.

  1.  Пользователь вводит N произвольных чисел, определить сумму четных чисел.
  2.  Пользователь вводит N произвольных чисел, определить среднее арифметическое нечетных чисел.
  3.  Пользователь вводит N произвольных чисел, определить есть ли среди введенных чисел 0.
  4.  Пользователь вводит N произвольных чисел, вывести на экран квадраты этих чисел.
  5.  Пользователь вводит N произвольных чисел, вывести на экран числа кратные трем.
  6.  Пользователь вводит N произвольных чисел, вывести на экран числа, большие 45.

Задание №4.

  1.  Среди чисел 1, 4, 9, 16, 25, ... найти первое число, большее  ( вводится пользователем).
  2.  Пользователь вводит натуральное число . Напечатать те натуральные числа, квадрат которых не превышает .
  3.  Найти первое натуральное число, квадрат которого больше .
  4.  Пользователь вводит натуральное число . Из чисел 1, 4, 9, 16, 25, ... напечатать те, которые не превышают .
  5.  Дана последовательность натуральных чисел 1, 3, 5, 7… и число вещественное число , вывести все числа последовательности, меньшие .
  6.  Пользователь вводит натуральное число . Напечатать те натуральные числа, куб которых не превышает .

Задание №5.

Пользователь вводит натуральное число   и целые числа . Определить:

  1.  Количество чисел , которые больше некоторого числа  р.
  2.  Сумму чисел , которые оканчиваются цифрой «5».
  3.  Произведение чисел , которые кратны числу k.
  4.  Количество положительных чисел .
  5.  Есть ли среди чисел  нули.
  6.  Сумму отрицательных чисел .

Задание №6.

Дано натуральное число. Определить:

  1.  Количество цифр в нем.
  2.  Сумму его цифр.
  3.  Произведение его цифр.
  4.  Сумму квадратов его цифр.
  5.  Есть ли в числе цифра «3».
  6.  Сумму кубов его цифр.

Группа В

Задание №1.

  1.  Одноклеточная амеба каждые три часа делится на 2 клетки. Определить, сколько клеток будет через 3, 6, 9…24 часа, если считать, что вначале была одна амеба.
  2.  Гражданин 1 марта открыл счет в банке, вложив 1000р. Через каждый месяц размер вклада увеличивается на 2% от имеющейся суммы. Определить прирост суммы вклада за первый, второй, …, десятый месяц.
  3.  Начав тренировки, лыжник пробежал в день 10 км. Каждый следующий день он увеличивал пробег на 10%. Определить пробег лыжника за второй, третий, …, десятый день тренировок.
  4.  Начав тренировки, лыжник пробежал в день 10 км. Каждый следующий день он увеличивал пробег на 10%. Определить суммарный пробег лыжника за первые 7 дней.
  5.  В некотором году на участке 100 га урожайность ячменя составила 20 центнеров с гектара. После этого каждый год площадь участка увеличивалась на 5%, а средняя урожайность на 2%. Определить урожайность за второй, третий, …, восьмой год (с общей площади);
  6.  В некотором году на участке 100 га урожайность ячменя составила 20 центнеров с гектара. После этого каждый год площадь участка увеличивалась на 5%, а средняя урожайность на 2%. Определить площадь участка на четвертый, пятый,…, восьмой год.

Задание №2.

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

  1.  ;.
  2.  .
  3.  .
  4.  .
  5.  .
  6.  .

Задание №3.

Вводится N произвольных чисел от 0 до 255. Определить для соответствующих им по кодам символов:

  1.  Количество русских букв.
  2.  Есть ли хоть одна латинская буква.
  3.  Есть ли среди введенных чисел коды цифр.
  4.  Количество букв «л» и «т».
  5.  Есть ли хотя бы одна буква «А» (не зависимо от регистра).
  6.  Каких букв больше - русских или латинских.

Задание №4.

Пользователь вводит N произвольных чисел, определить:

  1.  Есть ли среди введенных чисел двузначное.
  2.  Количество чисел, оканчивающихся на 3.
  3.  Произведение чисел кратных 7.
  4.  Есть ли среди введенных чисел степени числа 5 (считаем, что числа находятся в диапазоне от 0..1000).
  5.  Есть ли числа по модулю большие 73.
  6.  Среднее арифметическое четных, положительных чисел.

Задание №5.

Дано натуральное число. Определить:

  1.  Количество цифр «3» в нем.
  2.  Сколько раз в нем встречается цифра, равная последней.
  3.  Количество четных цифр в нем.
  4.  Сумму его цифр, больших пяти.
  5.  Произведение его цифр, больших семи.
  6.  Сколько раз в нем встречаются цифры «0» и «5».

Задание №6.

  1.  Найти сумму ряда с точностью е, общий член которого равен  . Точность считается достигнутой, если следующий член последовательности меньше заданного е.
  2.  Найти сумму ряда с точностью е, общий член которого равен  . Точность считается достигнутой, если следующий член последовательности меньше заданного е.
  3.  Найти сумму ряда с точностью е, общий член которого равен  . Точность считается достигнутой, если следующий член последовательности меньше заданного е.
  4.  Найти сумму ряда с точностью е, общий член которого равен  . Точность считается достигнутой, если следующий член последовательности меньше заданного е.
  5.  Найти сумму ряда с точностью е, общий член которого равен  . Точность считается достигнутой, если следующий член последовательности меньше заданного е.
  6.  Найти сумму ряда с точностью е, общий член которого равен  . Точность считается достигнутой, если следующий член последовательности меньше заданного е.

Задание №7.

  1.  Пользователь вводит оценки  по информатике каждого ученика класса (в классе n учеников). Определить общее количество пятерок.
  2.  Пользователь вводит данные о температуре воздуха в течение месяца (n - измерений). Определить, сколько раз температура опускалась ниже 0°С.
  3.  Пользователь вводит оценки по химии каждого ученика класса (в классе n учеников). Определить общее количество пятерок и количество двоек.
  4.  Пользователь вводит год рождения каждого человека из группы (в группе n человек). Определить общее число людей, родившихся до 1985 года, и число людей, родившихся после 1990 года.
  5.  Пользователь вводит данные для  каждой команды - участницы чемпионата по футболу - ее количество выигрышей и количество проигрышей (количество команд равно n).  Определить, сколько команд имеет больше выигрышей, чем проигрышей.
  6.  Пользователь вводит оценки каждого студента из группы по двум экзаменам (в группе n человек).  Определить количество студентов группы, получивших на двойку  хотя бы на одном экзамене.

Группа С

Задание №1.

Написать программу для вычисления выражений. Операцию возведения в степень и вложенные циклы не использовать!

  1.  Составить программу для расчета степени n (n- натуральное число) вещественного числа a.
  2.  Вычислить сумму . Условный оператор не использовать.
  3.  Вычислить сумму  .
  4.  Вычислить сумму . Условный оператор не использовать.
  5.  Вычислить сумму   при . Условный оператор не использовать.
  6.  Вычислить значение выражения .

Задание №2.

Написать программу для вычисления выражений. Операцию возведения в степень и вложенные циклы не использовать!

  1.  .
  2.  .
  3.  .
  4.  
  5.  
  6.  

Задание №3.

Вводится N произвольных чисел от 0 до 255. Определить для соответствующих им по кодам символов:

  1.  Количество русских букв.
  2.  Есть ли хоть одна латинская буква.
  3.  Есть ли среди введенных чисел коды цифр.
  4.  Количество букв «л» и «т».
  5.  Есть ли хотя бы одна буква «А» (не зависимо от регистра).
  6.  Каких букв больше - русских или латинских.

Задание №4.

Пользователь вводит N произвольных чисел, определить:

  1.  Есть ли среди введенных чисел двузначное.
  2.  Количество чисел, оканчивающихся на 3.
  3.  Произведение чисел кратных 7.
  4.  Есть ли среди введенных чисел степени числа 5 (считаем, что числа находятся в диапазоне от 0..1000).
  5.  Есть ли числа по модулю большие 73.
  6.  Среднее арифметическое четных, положительных чисел.

Задание №5.

  1.  Напечатать минимальное число, большее 200, которое нацело делится на 17.
  2.  Гражданин 1 марта открыл счет в банке, вложив 1000 руб. Через каждый месяц размер вклада увеличивается на 2% от имеющейся суммы. Определить: через сколько месяцев размер вклада превысит 1200 руб.
  3.  Начав тренировки, лыжник в первый день пробежал 10 км. Каждый следующий день он увеличивал длину пробега на 10% от пробега предыдущего дня. Определить: в какой день (первый, второй, третий…) он пробежит больше 20 км.
  4.  Дано натуральное число. Найти число, получаемое удалением из исходного всех цифр а (например, ).
  5.  В некотором году (назовем его условно первым) на участке в 100 гектаров средняя урожайность ячменя составила 20 центнеров с гектара. После этого каждый год площадь участка увеличивалась на 5%, а средняя урожайность — на 2%. Определить: в каком году средняя урожайность превысит 22 центнера с гектара.
  6.  Найти максимальное из натуральных чисел, не превышающих 5000, которое нацело делится на 39.

Задание №6.

  1.  Дано число  (1 <  < 1,5). Из чисел: напечатать те, которые не меньше .
  2.  Дано число  (1 <  < 1,5). Среди чисел:   найти первое, меньшее .
  3.  Дана последовательность чисел .  Напечатать все значения , при которых все числа последовательности будут не меньше  (1 <  < 1,5).
  4.  Дано число  (1 <  < 1,5). Найти такое , что в последовательности чисел  последнее число будет меньше .
  5.  Среди чисел    найти первое, большее числа n, введенного пользователем.
  6.  Дано вещественное число . Напечатать все значения n, при которых .

Задание №7.

Пользователь вводит произвольные целые числа. Определить:

  1.  Количество четных чисел, введенных до первого отрицательного.
  2.  Сумму положительных чисел, введенных до первого нечетного.
  3.  Произведение нечетных чисел, введенных до первого положительного.
  4.  Среднее арифметическое четных чисел, введенных до первого нуля.
  5.  Количество отрицательных чисел, введенных до первого числа кратного 7.
  6.  Сумму квадратов нечетных чисел, введенных до первого числа большего 300.

Задание №8.

Пользователь вводит произвольные символы. Определить:

  1.  Количество русских букв, введенных до первой цифры.
  2.  Есть ли среди символов, введенных до первой цифры, латинские буквы.
  3.  Есть ли среди символов, введенных до первой русской буквы, символы с кодом 121.
  4.  Есть ли среди символов, введенных до символа с кодом 51, русские буквы.
  5.  Количество цифр среди символов, введенных до символа ‘m’.
  6.  Количество букв ‘a’ среди символов, введенных до первой латинской буквы.

Теоретический материал и методические указания

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

В языках программирования для организации повторяющихся действий используются операторы циклов. Наиболее простым является оператор цикла с параметром (for).

for <параметр_цикла>:=<нач_значение> to <конеч_значение> do <оператор>;

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

Обратите внимание:

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

Существует еще один вариант записи цикла for.

for <параметр_цикла>:=<нач_значение> downto <конеч_значение> do <оператор>;

Обратите внимание:

  •  начальное значение должно превышать конечное значение;
    •  значение параметра цикла на каждой итерации цикла уменьшается на 1;

остальные требования аналогичны рассмотренной выше форме цикла с параметром.

В методических материалах к предыдущей лабораторной работе был рассмотрен пример.

Пример 1.

Заданы три целых числа, следует подсчитать количество четных чисел.

var a,b,c,count:integer;

begin

 write('a='); readln(a);

 write('b='); readln(b);

 write('c='); readln(c);

 count:=0;

 if (a mod 2=0) then inc(count);

 if (b mod 2=0) then inc(count);

 if (c mod 2=0) then inc(count);

 writeln('Количество четных чисел равно  ', count);

 readln;

end.

Обратите внимание, что для всех трех чисел выполняются аналогичные действия:

  •  ввод числа с клавиатуры;
    •  проверка числа на четность;
    •  изменение переменной count, если число четное.

С помощью цикла for рассмотренную программу можно переписать следующим образом:

var a,i,count:integer;

begin

 count:=0;

 for i:=1 to 3 do

 begin

     writeln(' Введите ', i ,'-e число ');

     readln(a);

     if (a mod 2=0) then inc(count);

 end;

 writeln('Количество четных чисел равно  ', count);

 readln;

end.

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

Запись  for i:=1 to 3 do … означает следующее: для всех значений переменной i, изменяющейся от 1 до 3 выполнить…

Результат работы программы:

Пример 2.

Напечатать таблицу перевода 10, 20, 30 … 150 см. в метры.

Можно поступить двумя способами, первый: перебрать все значения от 10 до 150 и все кратные 10 значения перевести в метры. В таком варианте тело цикла будет состоять только из одного оператора (if).

var i:integer;

begin

 for i:=10 to 150 do

   if (i mod 10=0) then writeln(i, ' см = ',i/100 :0:2,' м');

 readln;

end.

При таком способе решения цикл for будет совершать 141 итерацию (150-10+1=141), хотя в действительности нужно рассмотреть только 15 значений.

Второй способ: в цикле можно перебрать значения от 1 до 15, а нужные значения сантиметров получить умножением итерационной переменной на 10, а соответствующие значения в метрах – делением сантиметров на 100. В примере введены две вспомогательные переменные sm и m, но можно обойтись и без них.

var sm,i:integer;

   m:real;

begin

 for i:=1 to 15 do

 begin

   sm:=i*10;

   m:=sm/100;

   writeln(sm, ' см = ',m:0:2,' м');

 end;

readln;

end.

Результат работы программы:

Пример 3.

Вывести на экран все двузначные числа, кратные 17.

Диапазон двузначных чисел: 10..99. В цикле следует перебрать все числа из этого диапазона, проверить каждое число на кратность 17, если число кратно 17 – вывести его на экран.

var i:integer;

begin

 write('Двузначные числа, кратные 17:  ');

 for i:=10 to 99 do

   if (i mod 17 =0) then write(i,' ');

 readln;

end.

Пример 4.

Найти среднее арифметическое всех четных чисел из диапазона -7 ..10.

Среднее арифметическое равно отношению суммы чисел, отвечающих условию, к их количеству.

var sum,count, i:integer;

   sr_ar:real;

begin

 count:=0; sum:=0;

 for i:=-7 to 10 do

   if (i mod 2=0) then begin

     sum:=sum+i;

     count:=count+1;  // inc(count);

   end;

 sr_ar:=sum/count;

 writeln('среднее арифметическое равно  ',sr_ar:0:2);

 readln;

end.

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

Затем в цикле перебираются все числа из указанного диапазона, если удовлетворяет условию задачи (т.е. i mod 2=0), то выполняются два действия:

  •  переменной sum присваивается ее предыдущее значение плюс значение переменной i;
    •  значение переменной count увеличивается на 1.

После завершения цикла переменной sr_ar присваивается значение, равное среднему арифметическому четных чисел из указанного диапазона (sr_ar:=sum/count;). Этот оператор нельзя записывать в теле цикла, т.к. до полного завершения цикла значение переменных sum и count не отвечают условиям задачи.

Пример 5.

Пользователь вводит N действительных чисел, вывести на экран положительные числа.

var N,i:integer;

   x:real;

begin

 writeln('Введите количество чисел');

 readln(N);

 for i:=1 to N do

 begin

   write('Введите  ', i, '-e число  ');

   readln(x);

   if (x>0) then writeln(x:0:2, '  положительно');

 end;

 readln;

end.

Число N – количество чисел, вводимых пользователем. Это число может быть запрошено у пользователя или задано в программе, например, в виде константы. Если N не будет определено, то не будет известно конечное значение итерационной переменной, т.е. сколько раз будет выполнено тело цикла (относится только к данной задаче).

В теле цикла выполняются операторы:

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

Результат работы программы:

Пример 6.

Напечатать числа от 1 до 10 в обратном порядке.

var i:integer;

begin

 for i:=10 downto 1 do

   write(i, '  ');

 readln;

end.

Результат работы программы:

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

Пример 7.

Напечатать таблицу умножения.

var i,j:1..9;

begin

  for i:=1 to 9 do

  begin

     for j:=1 to 9 do

       write(i*j:4);

     writeln;

  end;

  readln;

end.

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

Результат работы программы:

Цикл, параметром которого является переменная i, часто называют «цикл по i», а цикл   for j:=1 to 9 do… соответственно «цикл по j».

В цикле по i выполняются два оператора: цикл по j и writeln без параметров, последний нужен для перехода на следующую строку. В теле цикла for j:=1 to 9 do… выполняется только один оператор write(i*j:4); который выводит число на экран, выделяя под него 4 позиции (этим обуславливается одинаковое расстояние между столбцами). Оператор  write не переводит курсор на следующую строку, поэтому все числа, равные i*j печатаются в одну строку.

Добавим в программу еще один оператор   writeln('Начало ', i, '-й итерации , i=', i ); он будет выполняться на каждой итерации цикла по i и сообщать о номере итерации.

var i,j:1..9;

begin

  for i:=1 to 9 do

  begin

       writeln('Начало ', i, '-й итерации , i=', i );

       for j:=1 to 9 do

          write(i*j:4);

       writeln;

  end;

  readln;

end.

Результат работы программы:

Становится понятным порядок выполнения операторов во вложенных циклах:

  •  первая итерация цикла по i, i=1. Последовательно выполняются операторы тела цикла: вывод на экран информации о номере итерации, далее выполняется цикл по j. Переменная j последовательно принимает значения 1, 2, 3..9, на каждой итерации цикла по j выполняется оператор write(i*j:4); т.е. на экран выводятся  результаты произведений 1*1, 1*2, 1*3, …, 1*9. После завершения цикла по j выполняется оператор writeln;
    •  вторая итерация цикла по i, i=2. Последовательно выполняются операторы тела цикла: вывод на экран информации о номере итерации, далее выполняется цикл по j. Переменная j последовательно принимает значения 1, 2, 3..9, на каждой итерации цикла по j выполняется оператор write(i*j:4); т.е. на экран выводятся  результаты произведений 2*1, 2*2, 2*3, …, 2*9.
    •  
    •  последняя итерация цикла по i, i=9. Последовательно выполняются операторы тела цикла: вывод на экран информации о номере итерации, далее выполняется цикл по j. Переменная j последовательно принимает значения 1, 2, 3..9, на каждой итерации цикла по j выполняется оператор write(i*j:4); т.е. на экран выводятся  результаты произведений  9*1, 9*2, 9*3, …, 9*9.

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

Пример 8.

Распечатать на экране номера месяцев и дней.

Упростим задачу, будем считать, что в каждом месяце 30 дней. Во внешнем цикле (по i) будут перебираться номера месяцев, а во внутреннем – номера дней.

var i,j:byte;

begin

  for i:=1 to 12 do

  begin

     writeln('i=',i);

     for j:=1 to 30 do

       write(j, ' ');

     writeln;

  end;

  readln;

end.

Результат работы программы:

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

Цикл с предусловием

Рассмотрим оператор цикла   while <условие> do <оператор>;. while и do – зарезервированные слова, <условие> - некоторое выражение, результат которого относится к типу boolean,  <оператор> - либо один произвольный оператор, либо набор операторов, заключенных в операторные скобки. Читается:  пока (while) условие истинно, выполнять (do) тело цикла (<оператор>).  Как только <условие> станет ложным, выполнение тела цикла завершится.

Поскольку условие проверяется до выполнения тела цикла, while называется циклом с предусловием.

Обратите внимание, что:

  •  цикл с предусловием не имеет параметра;
    •  в теле цикла должны быть операторы, которые на одной из итераций обратят  <условие> в ложное.

Пример 9.

Задана последовательность натуральных чисел 1 5 9 13 17… и вещественное число n>1, подсчитать сумму членов последовательности меньших n.

Рассмотрим решение этой задачи с помощью оператора цикла с предусловием. Поскольку n – вещественное число, оно не может выступать в качестве границы цикла с параметром  (for i:=1 to n do…).

var n:real;

   k,sum:integer;

begin

 writeln('Введите число');

 readln(n);

 k:=1; sum:=0;

 while (k<n) do

 begin

   sum:=sum+k;

   k:=k+4;

 end;

 writeln('Сумма чисел равна  ',sum);

 readln;

end.

Сумма  чисел будет накапливаться в переменной sum, а последовательность чисел перебираться – с помощью переменной i.  Пользователь вводит вещественное число n, переменным  k и sum присваиваются начальные значения. Т.к. первый член последовательности равен 1, переменной k присваивается это значение. Инициализация переменных, участвующих  в цикле до начала цикла обязательна.

Выполнение цикла начинается с поверки условия, если условие ложно – тело цикла не выполнится ни разу. В данном примере оператором, который обращает условие на входе в цикл в ложное, является оператор  k:=k+4;

Результат работы программы:

Пример 10.

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

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

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

var M,sum:real;

   count:integer;

begin

  writeln('Введите число');

 readln(M);

 count:=0; sum:=0;

 while (sum<=M) do

 begin

   inc(count);

   sum:=sum+1/count;

 end;

 writeln('Количество слагаемых равно  ', count-1);

 readln;

end.

При таком решении выполняется лишняя итерация, т.к. на последней итерации значение переменной sum превысит значение переменной М и количество слагаемых окажется больше на 1. Эту ситуацию можно исправить, если вывести на экран количество слагаемых, равное count-1. Либо можно не допускать переполнения переменной sum. Это можно сделать изменив условие на входе в цикл:

var M,sum:real;

   count:integer;

begin

 writeln('Введите число');

 readln(M);

 count:=0; sum:=0;

 while (sum+1/(count+1)<=M) do

 begin

   inc(count);

   sum:=sum+1/count;

 end;

 writeln('Количество слагаемых равно  ',count, '  Cумма равна=', sum:0:10);

 readln;

end.

Здесь проверяется условие (sum+1/(count+1)<=M), т.е. значение суммы на текущем шаге вместе со следующим слагаемым не должно превышать значение переменной М. Тогда на экран должно быть выведено не count-1, а count. Значение переменной sum выводится для демонстрации того, что оно действительно не превышает числа М.

В данном примере оператором, который обращает условие на входе в цикл в ложное, является оператор  sum:=sum+1/count;.

Результат работы программы:

Пример 11.

Дано натуральное число. Вывести на экран все цифры числа в обратном порядке.

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

var N,k:word;

begin

 writeln('Введите натуральное число');

 readln(N);

 while (N<>0) do

 begin

     k:=N mod 10;

     write(k);

     N:=N div 10;

 end;

 readln;

end.

В данном примере оператором, который обращает условие на входе в цикл в ложное, является оператор N:=N div 10;.

Цикл с постусловием

Имеет вид repeat <оператор> until <условие>;

Читается: повторять (repeat) тело цикла (<оператор>) до тех пор, пока (until) условие не станет истинным.

Особенности цикла с постусловием:

  •  условие проверяется после выполнения тела цикла, т.е. при любом условии тело цикла выполнится хотя бы один раз;
    •  выход из цикла происходит, когда условие становится истинным;
    •  ключевые слова repeat … until играют роль операторных скобок, т.е. в теле цикла может быть записано произвольное количество операторов.

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

Пример 12.

Перепишем программу из примера №11 с помощью оператора цикла с постусловием.

var N,k:word;

begin

 writeln('Введите число');

 readln(N);

 repeat

     k:=N mod 10;

     write(k);

     N:=N div 10;

 until  (N=0);

 readln;

end.

Пример 13.

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

Пусть программа запрашивает у пользователя число и выдает результат, пока пользователь не введет латинскую букву «n».

var x:integer;

   ch:char;

begin

  repeat

     writeln('Введите число');

     readln(x);

     if (x>0)

       then writeln('Число положительно')

       else if (x<0)

              then writeln('Число отрицательно')

              else writeln('Число равно 0');

     writeln('Продолжить: y/n  (yes/no) ');

     readln(ch);

 until  (ch='n') or (ch='N');

writeln('Завершение программы');

 readln;

end.

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

Результат работы программы:

Связь цикла с параметром и цикла с предусловием

Цикл с параметром всегда можно заменить циклом с предусловием.

Пример 14.

Пользователь вводит два натуральных числа:  и . Напечатать квадраты всех чисел из диапазона  … .

Решение задачи с помощью цикла с параметром имеет вид:

var i,n1,n2:byte;

begin

 writeln('Введите два числа n1<n2');

 readln(n1,n2);

 for i:=n1 to n2 do

    writeln(i,'^2=',sqr(i));

 readln;

end.

Решение задачи с помощью цикла с предусловием имеет вид:

var i,n1,n2:byte;

begin

   writeln('Введите два числа n1<n2');

   readln(n1,n2);

   i:=n1;

   while (i<=n2)do

   begin

      writeln(i,'^2=',sqr(i));

      inc(i);

    end;

   readln;

end.

Обратите внимание на различия:

  •  переменная i (во втором варианте) должна быть проинициализирована до начала цикла, в цикле for она инициализируется в заголовке цикла;
    •  в теле цикла (во втором варианте) следует принудительно изменять значение переменной i, в цикле for значение переменной увеличивается (уменьшается) автоматически.

Выход из цикла  произойдет, когда значение переменной i превысит значение n2.

При решении такой задачи с использованием цикла с постусловием необходимо использование дополнительного условного оператора. Если пользователь ошибся, и число n2 оказалось меньше числа n1, то тело цикла while, также как и тело цикла for не выполнится ни разу, т.к. условие на входе в цикл окажется ложным. Но тело цикла с постусловием выполняется хотя бы один раз при любых условиях, поэтому необходимо до цикла использовать дополнительный условный оператор, чтобы в такой ситуации не допустить выполнения  тела цикла.

Контрольные вопросы

  1.  Что такое цикл?
  2.  Какие операторы цикла определены в языке программирования Паскаль?
  3.  Дайте определение итерации цикла.
  4.  Какого типа должен быть параметр цикла for?
  5.  Какой цикл выполняется заранее определенное количество раз?
  6.  Сколько раз вычисляются начальное и конечное значение параметра в цикле for?
  7.  Какое значение принимает переменная-параметр цикла for после завершения цикла?
  8.  Можно ли изменять значение переменной-параметра внутри тела цикла?
  9.  Сколько форм имеет оператор цикла с параметром? Вспомните их синтаксис.
  10.  Какой оператор называют оператором цикла с предусловием? При каких значениях условия выполняется тело цикла?
  11.  Какой оператор называют оператором цикла с постусловием? При каких значениях условия выполняется тело цикла?
  12.  Какое количество операторов можно выполнить в теле цикла while? repeat..until?
  13.  В каких ситуациях при использовании циклов с условиями может возникнуть зацикливание?
  14.  Какие стандартные процедуры предназначены для управления циклами?

Примерный вариант контрольной работы

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

.

  1.  Определить сумму тех членов ряда , величина которых больше числа А (А вводится пользователем).
  2.  Пользователь вводит последовательность чисел, начинающуюся с отрицательного числа. Определить, какое количество подряд идущих отрицательных чисел записано в начале последовательности. Условный оператор не использовать.
  3.  Вычислить сумму. Операцию возведения в степень и условный оператор не использовать:

.


 Лабораторная работа №4. Структурированные типы данных. Одномерные и двумерные массивы

Требования к лабораторной работе

После выполнения лабораторной работы обучаемый должен:

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

Задания №3 и №4 для группы С следует решать с применением операторов цикла с условием.

Задания №5 - №7 для группы С следует решать без использования дополнительного массива.

В заданиях №6 и №7 для группы С под удалением элемента массива следует понимать:

  •  исключение этого элемента из массива путем смещения всех следующих за ним элементов влево на 1 позицию;
    •  присваивание последнему элементу массива значения 0.

Под вставкой числа а в массив после k-ro элемента следует понимать:

  •  увеличение количества элементов в массиве на 1, при этом исходный размер массива должен это допускать;
    •  смещение всех элементов, начиная с (k + 1)-го, вправо на 1 позицию;
    •  присваивание (k + 1)-му элементу массива значения а.

Задания к лабораторной работе

Группа А

Задание №1

Дан массив целых чисел. Выяснить:

  1.  Является ли р-й элемент массива положительным числом.
  2.  Является ли k-й элемент массива четным числом.
  3.  Какой элемент массива больше, k-й или р-й.
  4.  Есть ли в массиве элемент кратный трем.
  5.  Есть ли в массиве элемент больший 100.
  6.  Есть ли в массиве  нулевой элемент.

Задание №2

  1.  В массиве хранятся сведения о количестве осадков, выпавших за каждый день июня. Определить в какой период выпало больше осадков: в первую половину июня или во вторую.
  2.  В массиве хранятся сведения о количестве осадков, выпавших за каждый день июня. Определить в какую декаду месяца выпало больше всего осадков.
  3.  В массиве хранятся сведения о количестве осадков, выпавших за каждый день июня. Определить количество осадков, выпавших в воскресенья.
  4.  Задан массив целых чисел. Найти сумму положительных элементов массива.
  5.  Задан массив целых чисел. Найти каких элементов больше: четных или нечетных.
  6.  Задан массив целых чисел. Найти произведение элементов с нечетными индексами.

Задание №3

Дан массив вещественных чисел. Вывести на экран новое состояние массива, в котором:

  1.  Каждый отрицательный элемент заменить на его абсолютную величину.
  2.  Из всех положительных элементов вычесть число k,  все отрицательные – умножить на число n. Нулевые элементы оставить без изменения.
  3.  Ко всем нулевым элементам прибавить n, из всех положительных элементов вычесть а, ко всем отрицательным прибавить b.
  4.  Из всех элементов с четными номерами вычесть число k1, из элементов с нечетными номерами - число  k2.
  5.  Все элементы с нечетными номерами увеличить в два раза, с четными - уменьшить на 1.
  6.  Все элементы с нечетными номерами заменить на их квадратный корень.

Задание №4

Задание выполняется для всех вариантов полностью.

Дан массив вещественных чисел. Найти:

  1.  Максимальный элемент и его номер.
  2.  Минимальный элемент и его номер.

Задание №5

Задание выполняется для всех вариантов полностью.

Дан массив вещественных чисел. Переставить местами:

  1.  Первый и последний элементы.
  2.  Второй и k – й элементы.
  3.  Минимальный и максимальный элементы.

Задание №6

  1.  Составить программу, заменяющую значение любого элемента  двумерного массива на число а (номера элементов задает пользователь).
  2.  Дан двумерный массив. Поменять местами элементы, расположенные в верхнем правом и нижнем левом углах.
  3.  Дан двумерный массив. Поменять местами элементы, расположенные в нижнем правом и верхнем левом углах.
  4.  Составить программу, которая меняет местами два любых элемента двумерного массива (номера элементов задает пользователь).
  5.  Составить программу, которая меняет местами произвольный элемент двумерного массива (номер элемента задает пользователь) с последним элементом массива.
  6.  Составить программу, которая меняет местами произвольный элемент двумерного массива размерности (номер элемента задает пользователь) с элементом массива, номер которого [n, n-1].

Задание №7

  1.  Определить сумму элементов главной диагонали массива.
  2.  Определить количество четных элементов побочной диагонали массива.
  3.  Определить среднее арифметическое элементов главной диагонали массива.
  4.  Определить произведение элементов побочной диагонали массива.
  5.  Проверить, есть ли на главной диагонали массива элемент кратный трем.
  6.  Проверить, есть ли на побочной диагонали массива отрицательный элемент.

Задание №8

Дан двумерный массив. Определить:

  1.  В какой строке массива произведение отрицательных элементов больше: в первой или в предпоследней.
  2.  В каком столбце массива произведение нечетных элементов меньше: во втором или в последнем.
  3.  В каком столбце массива среднее арифметическое элементов меньше: в первом или в последнем.
  4.  В какой строке массива сумма четных элементов больше: во второй или в третьей.
  5.  В каком столбце массива количество отрицательных элементов меньше: в последнем или в предпоследнем.
  6.  В какой строке массива сумма положительных элементов больше: во второй или в последней.

Задание №9

  1.  В двумерном массиве хранится информация о количестве студентов в той или иной группе каждого курса института с первого по пятый (в первой строке - информация о группах первого курса, во второй - второго и т. д.). На каждом курсе имеется 8 групп. Составить программу для расчета общего числа студентов на каждом курсе.
  2.  В зрительном зале 25 рядов, в каждом из которых 36 мест (кресел). Информация о проданных билетах хранится в двумерном массиве, номера строк которого соответствуют номерам рядов, а номера столбцов - номерам мест. Если билет на то или иное место продан, то соответствующий элемент массива имеет значение 1, в противном случае - 0. Составить программу, определяющую число проданных билетов на места в каждом ряду.
  3.  Фирма имеет 10 магазинов. Информация о доходе каждого магазина за каждый месяц года хранится в двумерном массиве (первого магазина - в первой строке, второго - во второй и т. д.). Составить программу для расчета среднемесячного дохода любого магазина.
  4.  В двумерном массиве хранится информация о зарплате 20 человек за каждый месяц года (первого человека - в первой строке, второго - во второй и т. д.). Составить программу для расчета общей зарплаты, полученной за год каждым человеком.
  5.  В поезде 18 вагонов, в каждом из которых 36 мест. Информация о проданных на поезд билетах хранится в двумерном массиве, номера строк которых соответствуют номерам вагонов, а номера столбцов - номерам мест. Если билет на то или иное место продан, то соответствующий элемент массива имеет значение 1, в противном случае - 0. Составить программу, определяющую число свободных мест в каждом из вагонов поезда.
  6.  В двумерном массиве хранится информация об оценках каждого из 20 учеников класса по тому или иному предмету (в первой строке - информация об оценках первого ученика, во второй - второго). Общее число предметов равно 10. Определить среднюю оценку каждого ученика.

Задание №10

  1.  Дан двумерный массив. Требуется поменять местами первую и третью строки.
  2.  Дан двумерный массив. Требуется поменять местами второй и последний столбцы.
  3.  Дан двумерный массив. Составить программу, которая переставляет две любые строки массива.
  4.  Дан двумерный массив. Составить программу, которая переставляет два любых столбца массива.
  5.  Дан двумерный массив. Требуется поменять местами первый и предпоследний столбцы.
  6.  Дан двумерный массив. Требуется поменять местами вторую и последнюю строки.

Группа В

Задание №1

Дан массив вещественных чисел, требуется:

  1.  Каждый элемент, больший 10, заменить на его квадратный корень.
  2.  Все элементы массива с четными номерами заменить на их абсолютную величину.
  3.  Ко всем отрицательным элементам прибавить элемент с номером  к остальным - элемент с номером .
  4.  Все элементы с четными номерами удвоить, с нечетными - уменьшить на 1.
  5.  Ко всем отрицательным элементам прибавить элемент с номером а, из всех нулевых вычесть число b. Положительные элементы оставить без изменения.
  6.  Из всех положительных элементов вычесть а, из всех отрицательных вычесть b, ко всем нулевым элементам прибавить с.

Задание №2

  1.  Известны оценки по информатике 28 учеников класса. Есть ли среди них оценки выше тройки?
  2.  Известны данные о мощности двигателя 30 моделей легковых автомобилей. Есть ли среди них модель, мощность двигателя которой превышает 200 л.с.?
  3.  Есть ли в массиве есть хотя бы одна пара одинаковых «соседних» элементов?
  4.  Дан массив целых чисел. Есть ли в нем есть хотя бы одна пара «соседних» четных чисел?
  5.  Определить, является ли массив упорядоченным по возрастанию.
  6.  Имеется список учащихся класса с указанием роста каждого из них. Определить, перечислены ли ученики в списке в порядке убывания их роста.

Задание №3

  1.  В массиве хранится информация о росте 35 человек. Определить, у скольких человек самый большой рост.
  2.  В массиве хранится информация о среднедневной температуре за каждый день июля. Определить количество самых прохладных дней в этом месяце.
  3.  В массиве хранится информация о максимальной скорости каждой из 40 марок легковых автомобилей. Определить порядковый номер самого быстрого автомобиля. Если таких автомобилей несколько, то должен быть найден номер первого из них;
  4.  В массиве хранится информация о максимальной скорости каждой из 40 марок легковых автомобилей. Определить порядковый номер самого быстрого автомобиля. Если таких автомобилей несколько, то должен быть найден номер последнего из них.
  5.  В массиве хранится информация о годе рождения каждого из 30 человек. Определить порядковый номер самого старшего по возрасту человека. Если таких людей несколько, то должен быть найден номер первого из них. При определении возраста учитывать только год рождения (месяц и день не учитывать).
  6.  В массиве хранится информация о годе рождения каждого из 30 человек. Определить порядковый номер самого старшего по возрасту человека. Если таких людей несколько, то должен быть найден номер последнего из них. При определении возраста учитывать только год рождения (месяц и день не учитывать).

Задание №4

Задание выполняется для всех вариантов полностью.

Дан массив целых чисел. Поменять местами:

  1.  n-й и m-й элементы.
  2.  Третий и максимальный элементы. Если элементов с максимальным значением несколько, то в обмене должен участвовать первый из них.
  3.  Первый и минимальный элементы. Если элементов с минимальным значением несколько, то в обмене должен участвовать последний из них.

Задание №5

Дан двумерный массив целых чисел. Требуется:

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

Задание №6

Дан двумерный массив целых чисел. Определить:

  1.  Сумму элементов массива, больших 30.
  2.  Количество нечетных элементов массива.
  3.  Среднее арифметическое четных элементов массива.
  4.  Сумму тех элементов массива, сумма индексов которых равна р.
  5.  Количество элементов массива, меньших 50.
  6.  Сумму тех элементов массива, сумма индексов которых кратна трем.

Задание №7

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

Задание №8

  1.  Дан двумерный массив. Требуется поменять местами первую и третью строки.
  2.  Дан двумерный массив. Требуется поменять местами второй и последний столбцы.
  3.  Дан двумерный массив. Составить программу, которая переставляет две любые строки массива.
  4.  Дан двумерный массив. Составить программу, которая переставляет два любых столбца массива.
  5.  Дан двумерный массив. Требуется поменять местами первый и предпоследний столбцы.
  6.  Дан двумерный массив. Требуется поменять местами вторую и последнюю строки.

Задание №9

  1.  Дан двумерный массив. Определить координаты минимального элемента массива. Если элементов с минимальным значением несколько, то должны быть найдены координаты самого нижнего и самого правого из них.
  2.  Дан двумерный массив. Определить координаты максимального элемента массива. Если элементов с максимальным значением несколько, то должны быть найдены координаты самого верхнего и самого левого из них.
  3.  Дан двумерный массив. Поменять местами первый максимальный и последний  элемент массива. Принять, что массив просматривается построчно сверху вниз, а в каждой строке — слева направо.
  4.  Дан двумерный массив. Поменять местами первый минимальный и последний элемент массива. Принять, что массив просматривается построчно сверху вниз, а в каждой строке — слева направо.
  5.  Дан двумерный массив. Поменять местами первый элемент массива  и последний максимальный элемент. Принять, что массив просматривается построчно сверху вниз, а в каждой строке — слева направо.
  6.  Дан двумерный массив. Поменять местами первый элемент массива  и последний минимальный элемент. Принять, что массив просматривается построчно сверху вниз, а в каждой строке — слева направо.

Группа С

Задание №1

  1.  Известны данные о численности населения (в млн. жителей) и площади (в млн. км2) 28 государств. Определить общую численность государств, чья площадь превышает  млн. км2.
  2.  Известны данные о мощности двигателя (в л. с.) и стоимости 30 легковых автомобилей. Определить общую стоимость автомобилей, у которых мощность двигателя превышает  л. с.
  3.  Имеется информация о количестве осадков, выпавших за каждый день месяца, и о температуре воздуха в эти дни. Определить, какое количество осадков выпало в виде снега и какое - в виде дождя (считать, что идет дождь, если температура воздуха выше 0°).
  4.  Известны данные о численности населения (в млн. жителей) и площади (в тыс. км2) 28 государств. Определить общую численность населения в «маленьких» государствах (чья площадь не превышает  р тыс. км2).
  5.  В одном массиве записано количество мячей, забитых футбольной командой в каждой из 20 игр, в другом - количество пропущенных мячей в этой же игре. Для каждой игры определить словесный результат игры (выигрыш, проигрыш или ничья).
  6.  Даны два массива одного размера. Получить третий массив, каждый элемент которого равен: .

Задание №2

  1.  Дан массив вещественных чисел. Выяснить, верно ли, что максимальный элемент превышает минимальный не более чем на 25.
  2.  Дан массив вещественных чисел. Выяснить, верно ли, что минимальный элемент меньше максимального более чем в два раза?
  3.  Известна численность каждого из 40 классов школы. Верно ли, что в самом многочисленном классе учится на 10 учеников больше, чем в самом малочисленном?
  4.  Какое число в массиве встретится раньше: максимальное или минимальное? Если таких чисел несколько, то должны быть учтены самые первые из них.
  5.  В некоторых видах спортивных состязаний (например, в фигурном катании) выступление каждого спортсмена независимо оценивается несколькими судьями, затем из всей совокупности оценок удаляются наиболее высокая и наиболее низкая, а для оставшихся оценок вычисляется среднее арифметическое, которое и идет в зачет спортсмену. Если наиболее высокую оценку выставили несколько судей, то из совокупности оценок удаляется только одна такая оценка; аналогично поступают и с наиболее низкими оценками. Известны оценки, выставленные восемью судьями одному из участников соревнований. Составить программу для расчета оценки,  которая пойдет в зачет этому спортсмену.
  6.  Известно число жителей, проживающих в каждом доме улицы. Нумерация домов проведена подряд. Дома с нечетными номерами расположены на одной стороне улицы, с четными - на другой. На какой стороне улицы проживает больше жителей?

Задание №3

  1.  Дано: массив, упорядоченный по возрастанию, и число а, о котором известно следующее: оно не равно ни одному из элементов массива, больше первого и меньше последнего элемента. Требуется вывести все элементы массива, меньшие а (условный оператор не использовать).
  2.  Дано: массив, упорядоченный по возрастанию, и число а, о котором известно следующее: оно не равно ни одному из элементов массива, больше первого и меньше последнего элемента. Требуется найти два элемента массива (их порядковые номера и значение), в интервале между которыми находится значение а (условный оператор не использовать).
  3.  Дано: массив, упорядоченный по возрастанию, и число а, о котором известно следующее: оно не равно ни одному из элементов массива, больше первого и меньше последнего элемента. Требуется найти элемент массива (его порядковый номер и значение), ближайший к  а.
  4.  Известны данные о росте 15 юношей класса, упорядоченные по убыванию. Нет ни одной пары учеников с одинаковым ростом. В начале учебного года в класс поступил новый ученик. Какое место в перечне ростов займет рост этого ученика (известно, что его рост не совпадает с ростом ни одного из учеников класса, превышает рост самого низкого ученика и меньше роста самого высокого)? Условный оператор не использовать.
  5.  Известно количество очков, набранных каждой из 20 команд — участниц первенства по футболу. Перечень очков дан в порядке убывания (ни одна пара команд не набрала  одинакового количества очков). Определить, какое место заняла команда, набравшая n очков (естественно, что значение n имеется в перечне). Условный оператор не использовать.
  6.  В начале массива записано несколько равных между собой элементов. Определить количество таких элементов и вывести все элементы, следующие за последним из них. Условный оператор не использовать. Предусмотреть возможность, что все элементы массива равны между собой.

Задание №4

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

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

Задание №5

  1.  Дан одномерный массив А состоящий из 2n элементов. Переставить элементы массива следующим образом

a[n+1], a[n+2], . . .,a[2n], a[n], a[n-1], . . ., a[1].

  1.  Дан одномерный массив А состоящий из 2n элементов. Переставить элементы массива следующим образом

a[2n], a[2n-1], . . .,a[n+1], a[1], a[2], . . ., a[n].

  1.  Дан одномерный массив из 15 элементов. Переставить в обратном порядке элементы, расположенные между k-м и s-м элементами (т. е. с (k + 1)-го по (s-1)-й). Значения k и s вводятся с клавиатуры, k < s.
  2.  Дан одномерный массив из 15 элементов. Переставить в обратном порядке элементы, расположенные между максимальным и минимальным элементами, включая их.
  3.  Дан одномерный массив из 15 элементов. Переставить в обратном порядке элементы, расположенные между первым и минимальным элементами (если номера этих элементов совпадают, выдать соответствующее сообщение).
  4.  Дан одномерный массив из 15 элементов. Переставить в обратном порядке элементы, расположенные между последним и максимальным элементами (если номера этих элементов совпадают, выдать соответствующее сообщение).

Задание №6

Удалить из массива (новый массив распечатать):

  1.  Все элементы, кратные 3 или 5 (если таких элементов нет, выдать соответствующее сообщение).
  2.  Элементы с нечетными индексами.
  3.  Все отрицательные элементы; (если отрицательные элементы в массиве есть, если таких элементов нет, выдать соответствующее сообщение).
  4.  Все элементы, большие данного числа  А (если отрицательные элементы в массиве есть, если таких элементов нет, выдать соответствующее сообщение).
  5.  Все элементы, начиная с   до   ( < );.
  6.  Элементы, индексы которых кратны трем.

Задание №7

  1.  Данные о росте 15 юношей класса, упорядоченные по убыванию, записаны в массиве. В начале учебного года в класс поступили два новых ученика. Получить аналогичный массив, учитывающий рост новых учеников.
  2.  Вставить заданное число в массив целых чисел перед всеми четными элементами. Каков должен быть максимальный размер исходного массива?
  3.  Вставить в массив два заданных числа: первое после любого из максимальных элементов, второе - перед этим максимальным.
  4.  Вставить заданное число в массив целых чисел перед всеми элементами, кратными числу 3. Каков должен быть максимальный размер исходного массива?
  5.  Вставить заданное число в массив целых чисел после всех отрицательных элементов. Каков должен быть максимальный размер исходного массива?
  6.  Вставить число    в массив целых чисел после всех элементов, в которых есть цифра 5. Каков должен быть максимальный размер исходного массива?

Задание №8

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

Задание №9

  1.  Составить программу, которая определяет, является ли последовательность элементов главной диагонали массива упорядоченной по неубыванию (при просмотре от левого верхнего угла массива).
  2.  В двумерном массиве из n строк и n столбцов, где n - нечетное число, все элементы различны. Наибольший элемент среди стоящих на главной и побочной диагоналях поменять местами с элементом, стоящим на пересечении этих диагоналей.
  3.  Составить программу, которая определяет, является ли последовательность элементов побочной диагонали массива упорядоченной по возрастанию (при просмотре от правого верхнего угла массива).
  4.  В массиве записаны целые числа. Вычислить произведение элементов побочной диагонали массива меньших 10.
  5.  В массиве записаны целые числа. Вычислить сумму элементов главной диагонали массива, оканчивающихся цифрой 7.
  6.  В массиве записаны целые числа. Вычислить количество нулевых элементов главной диагонали массива.

Задание №10

  1.  Дан двумерный массив из 15 строк. Переставить первые три и последние три строки, сохранив порядок их следования.
  2.  Дан двумерный массив из 20 столбцов. Переставить первые три и последние три столбца, сохранив порядок их следования.
  3.  Дан двумерный массив из 12 строк. Переставить в обратном порядке строки, расположенные между второй и десятой (т. е. с третьей по девятую).
  4.  Дан двумерный массив из 16 столбцов. Переставить в обратном порядке столбцы, расположенные между третьим и одиннадцатым (т. е. с четвертого по десятый).
  5.  Дан двумерный массив из 15 строк. Переставить в обратном порядке строки, расположенные между k-й и s-й строками (т. е. с (k + 1)-й по (s - 1)-ю). Значения k и s вводятся с клавиатуры, k < s.
  6.  Дан двумерный массив из 20 столбцов. Переставить в обратном порядке столбцы, расположенные между k-м и s-м столбцами (т. е. с (k + 1)-го по (s - 1)-й). Значения k и s вводятся с клавиатуры, k < s.

Задание №11

  1.  В двумерном массиве имеются отрицательные элементы. Определить координаты самого нижнего и самого правого из них.
  2.  Дан двумерный массив целых чисел, найти координаты (номера) последнего элемента,  большего числа  r.
  3.  Дан двумерный массив целых чисел, найти координаты (номера) первого элемента, равного нулю.
  4.  Дан двумерный массив. Найти число пар одинаковых «соседних» элементов. В качестве «соседних» рассматривать только элементы, расположенные в одном столбце.
  5.  Дан двумерный массив целых чисел. Определить:  является ли он единичной матрицей.
  6.  Дан двумерный массив целых чисел. Определить:  является ли он треугольной матрицей, на главной диагонали которой расположены только отрицательные элементы.

Задание №12

Заполнить двумерный массив следующим образом:

  1.  

12

13

36

109

11

14

110

2

26

1

24

25

120

  1.  

111

112

120

30

22

21

11

12

20

10

2

1

  1.  

120

25

24

1

26

2

110

14

109

36

13

12

  1.  

120

112

111

20

12

11

10

2

1

  1.  

109

36

13

12

110

14

11

26

2

120

25

24

1

  1.  

1

24

25

120

2

26

14

110

12

13

36

109

Теоретический материал и методические указания

Объявление переменной типа одномерный массив

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

var <имя_переменной> : array [<тип_индекса>] of  <тип_элементов>;

Например,

var  а: array [1..5] of  real;

       c, d: array [0..12] of  char;

Обращение к элементу одномерного массива

Обращение к элементу массива осуществляется через указание имени массива и порядкового номера элемента.

Например, пусть задан массив целых чисел с именем MyArray:

var MyArray : array [1..10] of integer;

При объявлении переменной типа одномерный массив в квадратных скобках указывается его размер. Данный массив будет состоять из 10 элементов, причем первый элемент имеет индекс «1», а последний - «10». В языке программирования Паскаль нумерация элементов в статических массивах обычно начинается с 1, но возможны и другие варианты.

Чтобы обратиться к элементу массива, нужно указать его имя и индекс элемента в квадратных скобках, если вы хотите обратиться ко второму элементу массива MyArray, то должны записать   MyArray[2], к пятому - MyArray[5] и т.д.

Индекс массива не обязательно должен быть числовой константой, он может быть переменной или результатом вычисления выражения (здесь нужно следить, чтобы результат вычисления выражения совпадал по типу с типом индекса массива и при этом не выходил за указанные границы, в рассматриваемом примере это диапазон 1..10). Например:

  •  MyArray[2];
    •  MyArray[k];
    •  MyArray[m div 2 +1]  (где k и m – целочисленные переменные).

Элементам массива можно присваивать произвольные значения (соответствующие указанному типу элементов), они также могут участвовать в выражениях различной сложности. В данном примере все элементы массива MyArray имеют тип integer, следовательно, для них допустимы все операции, определенные для целых чисел:

var MyArray:array [1..10] of integer;

   x:byte;

   s:real;

begin

 …

 MyArray[1]:=7;

 MyArray[3]:=x mod 5;

 s:=(MyArray[1]+MyArray[10])/2;

 if (MyArray[5]=0) then writeln(MyArray[5]);

end.

Заполнение одномерного массива

После объявления переменной MyArray  (var MyArray:array [1..10] of integer;) происходит выделение памяти под десять элементов типа integer. После этого, как и при объявлении обычных переменных, в этих ячейках памяти находятся неопределенные значения. В некоторых случаях (для локальных переменных) это могут быть произвольные числа вида: 1245080, 2167001 или нули. Поэтому прежде чем начать работу с массивом необходимо заполнить массив или, говоря иначе, проинициализировать его элементы.

Элементам массива можно присвоить некоторые значения непосредственно при написании программы:

 MyArray[1]:=7;

 MyArray[3]:=x mod 5;

или запросить значения элементов у пользователя:

readln(MyArray[1]);

readln(MyArray[2]);

В примере массив состоит всего из 10 элементов, поэтому можно организовать заполнение массива следующим образом:

var MyArray:array [1..10] of integer;

   x,i:byte;

   s:real;

begin

 MyArray[1]:=2;

 MyArray[2]:=3;

 MyArray[3]:=4;

 MyArray[4]:=5;

 MyArray[5]:=6;

 MyArray[6]:=7;

 MyArray[7]:=8;

 MyArray[8]:=9;

 MyArray[9]:=10;

 MyArray[10]:=11;

end.

или

var MyArray:array [1..10] of integer;

   x,i:byte;

   s:real;

begin

 readln(MyArray[1]);

 readln(MyArray[2]);

 readln(MyArray[3]);

 readln(MyArray[4]);

 readln(MyArray[5]);

 readln(MyArray[6]);

 readln(MyArray[7]);

 readln(MyArray[8]);

 readln(MyArray[9]);

 readln(MyArray[10]);

end.

Такой способ не очень удобен даже когда массив состоит из небольшого количества элементов, при этом теряется смысл использования массива, т.к. можно было просто объявить 10 переменных типа  integer и работать с ними. А что делать, если количество элементов массива равно 10000?

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

var MyArray:array [1..10] of integer;

   x,i:byte;

   s:real;

begin

 for i:=1 to 10 do

   MyArray[i]:=i+1;

end.

или

var MyArray:array [1..10] of integer;

   x,i:byte;

   s:real;

begin

 for i:=1 to 10 do

   readln(MyArray[i]);

end.

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

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

Randomize;

for i:=1 to 10 do

   MyArray[i]:=random(20);

Число 20 в записи random(20) означает, что генератор будет выдавать числа из диапазона [0, 20). Вместо 20 можно указать любое целое положительное число. Оператор Randomize; выполняет обновление генератора, если его убрать, то при каждом запуске программы массив будет заполняться одним и тем же набором значений.

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

Вывод одномерного массива на экран

Осуществляется с использованием оператора цикла и операторов write() или writeln() в теле цикла.

for i:=1 to 10 do

   write(MyArray[i],'  ');

Результатом выполнения этого блока кода будет вывод на экран элементов массива MyArray в одну строку, элементы будут разделены пробелами.

Замечание.

В примерах, рассмотренных выше, массив задавался следующим образом:  

var MyArray:array [1..10] of integer;

т.е. верхняя граница индекса представлена некоторым числом (здесь 10). Такой способ не очень удобен, т.к. если возникнет необходимость изменения размера массива, то придется вносить изменения не только в объявление массива, но и во все операторы цикла  (for i:=1 to 10 do …), предназначенные для  обработки массива. Поэтому при работе со статическими массивами рекомендуется до их объявления массива задать константу, которая будет определять его длину:

const n=10;

var MyArray: array [1..n] of integer;

В этом случае операторы цикла для обработки массива будут иметь вид:

for i:=1 to n do

и для изменения размера массива в программе достаточно поменять значение константы n.

Пример 1.

Проверить, есть ли в массиве элемент равный 10.

Решение задач, в которых есть слова «есть ли», «является ли», «равен ли» и т.д., обычно начинается с введения переменной типа boolean, поскольку в задаче нужно дать ответ вида «да/нет». В данной задаче этой переменной до начала проверки всех элементов присваивается значение «ложь», т.к. в массиве может не оказаться элементов, отвечающих поставленному условию. Затем каждый элемент массива проверяется на соответствие условию, если он отвечает условию, то логической  переменной присваивается значение «истина».

const n=10;

var MyArray:array [1.. n] of integer;

   i:byte;

   t:boolean;

begin

 Randomize;

 for i:=1 to n do                       { заполнение массива случайным образом}

   MyArray[i]:=random(20);

 for i:=1 to n do

   write(MyArray[i],' ');           {вывод массива на экран}

 t:=false;

 for i:=1 to n do               {проверка элементов на соответствие условию}

   if (MyArray[i]=10) then t:=true;

 writeln('есть элементы, равные 10?  ', t);

 readln;

end.

Обратите внимание, что при решении задачи используется краткая форма условного оператора. Использование полной формы условного оператора (if (MyArray[i]=10) then t:=true else t:=false;) в задачах такого типа приводит к ошибке, т.к. выполнение этого оператора на каждой итерации «затирает» результат проверки элемента на предыдущем шаге. Пусть имеется набор элементов  1 2 3 4 10 2 3 4 1 5, тогда на шаге №5 переменная t примет значение true, а уже на следующем шаге она станет равной false. Результатом работы программы будет вывод на экран строки: «есть элементы, равные 10?  false», хотя в массиве есть элемент, отвечающий условию.

В решение этой задачи можно внести некоторые изменения. Пусть был сгенерирован следующий набор чисел: 10 2 3 4 11 2 3 4 1 5. Т.е. уже на первом шаге переменная t приняла значение true и ответ на вопрос задачи уже получен, но элементы массива будут проверяться до последнего, т.е. происходит выполнение лишних операций. Хорошо было бы организовать решение таким образом, чтобы после нахождения элемента, отвечающего условию, проверка элементов прекращалась.

var MyArray:array [1..10] of integer;

   i:byte;

   t:boolean;

begin

 Randomize;

 for i:=1 to 10

   MyArray[i]:=random(20);

 for i:=1 to 10 do

   write(MyArray[i],' ');  

 t:=false;   i:=1;

 while (not t) and (i<=10) do

 begin

   if (MyArray[i]=10) then t:=true;

   inc(i);

 end;

 writeln('есть элементы, равные 10?  ', t);

 readln;

end.

Пример 2.

Найти сумму элементов массива.

const n=5;

var MyArray:array [1..n] of integer;

   i:byte;

   sum:integer;

begin

Randomize;

 for i:=1 to n do   { инициализация элементов и вывод на экран}

   begin

     MyArray[i]:=random(20);  

     write(MyArray[i],' ');

   end;

 sum:=0;

 for i:=1 to n do  { нахождение суммы элементов массива}

   sum:=sum+MyArray[i];

 writeln('сумма равна  ', sum);

 readln;

end.

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

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

Пример 3.

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

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

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

const n=5;

var MyArray:array [1..n] of integer;

   i,count:byte;

   mult:integer;

begin

 Randomize;

 for i:=1 to n do

   begin

     MyArray[i]:=random(20);

     write(MyArray[i],' ');

   end;

 writeln;

 mult:=1; count:=0;

 for i:=1 to n do

   if (MyArray[i] mod 5=0)

     then begin

       mult:=mult*MyArray[i];

       inc(count);

       writeln(i);

   end;

 if (count>0) then writeln('произведение равно  ', mult, '   количество равно ',count )

 else writeln( 'в массиве нет таких элементов');

 readln;

end.

Для вычисления произведения вводится переменная mult, которой присваивается начальное значение, равное единице, а для вычисления количества вводится переменная count=0. Затем на каждой итерации цикла происходит проверка, отвечает ли элемент заданному условию (if (MyArray[i] mod 5=0)…). В случае выполнения условия:

  •  значение элемента умножается на предыдущее значение переменной mult;
    •  увеличивается на 1 значение переменной count;
    •  выводится на экран номер элемента, т.е. значение итерационной переменной.

Т.к. для элементов отвечающих условию, нужно выполнить несколько действий, тело условного оператора заключается в операторные скобки. После проверки всех элементов организуется вывод результатов вычислений на экран, при этом проверяется, были ли найдены в массиве элементы, отвечающие условию (if (count>0)…). Если такие элементы есть в массиве, на экран выводятся результаты, в противном случае – сообщение о том, что таких элементов нет.

Пример 4.

Все элементы одномерного массива с четными номерами заменить нулями.

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

const n=10;

var MyArray:array [1..n] of integer;

   i:byte;

begin

 Randomize;

 for i:=1 to n do

   begin

     MyArray[i]:=random(20);

     write(MyArray[i],' ');

   end;

 writeln;

{ изменение значений элементов}

 for i:=1 to n do

   if (i mod 2=0)   then MyArray[i]:=0;

{ вывод массива после внесения изменений}

 for i:=1 to n do

    write(MyArray[i],' ');

 readln;

end.

Можно изменить условие задачи следующим образом: все четные элементы массива заменить нулями. Это означает, что нужно приравнять нулю те элементы, значение которых делится на 2 (а не значение номера). Т.е. в программу нужно внести следующие изменения:

{ изменение значений элементов}

 for i:=1 to n do

   if (MyArray[i] mod 2=0)   then MyArray[i]:=0;

Пример 5.

Поменять местами первый и р-й элементы массива.

Такая постановка задачи подразумевает ввиду, что значение р должен ввести пользователь (readln(p);), а в программе должна быть организована проверка, что р не выходит за границы массива ( if (p>=1) and (p<=n) then…). Если пользователь вводит верное число, происходит обмен значениями между р-м и первым элементами массива (по принципу обмена значений двух обычных переменных с использованием дополнительной переменной) и вывод массива на экран. В противном случае на экран должна быть выведена информация, что введенное число выходит за границы массива.

const n=10;

var MyArray:array [1..n] of integer;

   i,p:byte;

   temp:integer;

begin

 Randomize;

 for i:=1 to n do

   begin

     MyArray[i]:=random(20);

     write(MyArray[i],' ');

   end;

 writeln;

 writeln('Введите номер элемента');

 readln(p);

if (p>=1) and (p<=n)

   then begin

        { обмен значениями}

     temp:= MyArray[1];

     MyArray[1]:=MyArray[p];

     MyArray[p]:=temp;

        { вывод массива на экран}

     for i:=1 to n do

       write(MyArray[i],' ');

   end

   else writeln('элемента с таким номером в массиве нет');

 readln;

end.

Пример 6.

Поиск максимального элемента массива.

Для решения этой задачи вводится дополнительная переменная (назовем ее max), в которой будет храниться значение максимального элемента массива. Ее тип должен совпадать с типом элементов массива. Алгоритм поиска: до начала просмотра массива переменной max присваивается значение первого элемента массива. Затем в цикле перебираются все элементы массива и сравниваются с max, если встретится элемент, значение которого больше max, то переменной max присваивается значение этого элемента. Таким образом, после перебора всех элементов переменная max действительно содержит значение, равное максимальному элементу массива.

const n=5;

var MyArray: array [1..n] of real;

   i:integer;

   max:real;

begin

  { заполнение массива и вывод на экран}

  Randomize;

  for i:=1 to n do

   begin

     MyArray[i]:=random(20)/5;

     write(MyArray[i]:0:2,'  ');

   end;

   writeln;    

 { поиск максимального элемента}

 max:=MyArray[1];

 for i:=2 to n do

   if (MyArray[i]>max) then max:=MyArray[i];

 writeln('max=',max:0:2);

 readln;

end.

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

const n=5;

var MyArray: array [1..n] of real;

   i,nmax:integer;

   max:real;

begin

  Randomize;

  for i:=1 to n do

   begin

     MyArray[i]:=random(20)/5;

     write(MyArray[i]:0:2,'  ');

   end;

   writeln;

 {поиск максимального элемента и его номера}

 max:=MyArray[1];

 nmax:=1;

 for i:=2 to n do

   if (MyArray[i]>max)  then begin

      max:=MyArray[i];

      nmax:=i;

    end;

 writeln('max=',max:0:2, ' nmax=',nmax);

 readln;

end.

Пример 7.

Сортировка массива методом «пузырька».

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

Рассмотрим принцип действия на наборе элементов: 19 6 11 5 3.

Этап 1 (первая итерация цикла по i).

  •  (j=2) сравнивается первый элемент (19) со вторым элементом (6). 19>6, т.е. условие выполняется,  первый и второй элементы меняются местами, получаем 6  19  11  5  3;
    •  (j=3) сравнивается первый элемент (6) с третьим  элементом (11). 6<11, т.е. условие не выполняется,  перестановки не происходит: 6  19  11  5  3;
    •  (j=4) сравнивается первый элемент (6) с четвертым элементом (5). 6>5,  условие выполняется,  первый и четвертый  элементы меняются местами, получаем  5  19  11  6  3;
    •  (j=5) сравнивается первый элемент (5) с  последним элементом (3). 5>3,  условие выполняется,  первый и последний  элементы меняются местами, получаем  3  19  11  6  5.

Таким образом, самый «легкий» элемент оказался в начале массива.

Этап 2 (вторая итерация цикла по i).  Массив имеет вид:  3  19  11  6  5.

  •  (j=3) сравнивается второй элемент (19) с третьим  элементом (11). 19>11,  условие выполняется,  второй и третий  элементы меняются местами, получаем  3  11  19  6  5;
    •  (j=4) сравнивается второй элемент (11) с четвертым элементом (6). 11>6,  условие выполняется,  второй и четвертый  элементы меняются местами, получаем  3  6  19  11  5;
    •  (j=5) сравнивается второй элемент (6) с  последним элементом (5). 6>5,  условие выполняется,  второй и последний  элементы меняются местами, получаем  3  5  19  11  6

На втором месте оказался наименьший по значению элемент из оставшейся части массива  3  19  11  6  5 .

Этап 3 (третья итерация цикла по i). Те же действия выполняются для части массива 3  5  19  11  6.  Получаем массив:  3  5  6  11  19. Он оказался отсортированным, но проверка не закончена.

Этап 4. (i=4). Аналогичные действия для оставшейся части массива:  3  5  6  11  19. На данном этапе для рассматриваемого набора значений перестановок не происходит.

Обратите внимание, что каждый этап реализован для оставшейся части массива, т.е. стоящие на своем месте элементы уже не рассматриваются. Это достигается за счет того, что внутренний цикл начинается не с 1, а с i+1  ( for j:=i+1 to n do…).

const n=5;

var MyArray: array [1..n] of real;

   i,j:integer;

   temp:real;

begin

  Randomize;

  for i:=1 to n do

   begin

     MyArray[i]:=random(100)/5;

     write(MyArray[i]:0:2,'  ');

   end;

   writeln;

{сортировка}

 for i:=1 to n-1 do

  for j:=i+1 to n do

     if MyArray[i] > MyArray[j]

           then begin

    temp:=MyArray[i];

    MyArray[i]:=MyArray[j];

    MyArray[j]:=temp;

  end;

 writeln('отсортированный массив:');

 for i:=1 to n do

   write(MyArray[i]:0:2,'  ');

 readln;

end.

Пример 8.

Переставить элементы массива в обратном порядке.

На первой итерации цикла переставляются элементы с номерами 1 и n, на второй итерации 2 и n-1, на третьей: 3 и n-2 и т.д. Таким образом, можно определить зависимость номеров элементов – на каждой итерации меняются местами элементы с номерами i и n-i+1. Обратите внимание на то, что максимальное значение итерационной переменной i равно   n div 2  (а не n). Если бы цикл выполнился n раз, то в итоге получился исходный порядок элементов:  1 3 0 2 9.

const n=5;

var MyArray: array [1..n] of real;

   i:integer;

   temp:real;

begin

  Randomize;

  for i:=1 to n do

   begin

     MyArray[i]:=random(20);

     write(MyArray[i]:0:2,'  ');

   end;

   writeln;

{ перестановка элементов}

 for i:=1 to n div 2 do

   begin

    temp:=MyArray[i];

    MyArray[i]:=MyArray[n-i+1];

    MyArray[n-i+1]:=temp;

   end;

 writeln('элементы массива в обратном порядке');

 for i:=1 to n do

   write(MyArray[i]:0:2,'  ');

 readln;

end.

Пример 9.

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

Решить эту задачу можно следующим образом: ввести переменную count, отвечающую за количество четных элементов, перебрать все элементы массива, при появлении четного элемента значение этой переменной увеличивать на 1, при этом произведение накапливать только в том случае, пока count<=3. После просмотра всех элементов массива произведение следует выводить на экран только тогда, когда  count>=3, т.е. в массиве нашлось три или более четных элементов, в противном случае на экран нужно вывести информацию, что такого количества четных элементов в массиве нет.

const n=10;

var MyArray: array [1..n] of integer;

   i,count:byte;

   mult:integer;

begin

  Randomize;

  for i:=1 to n do

   begin

     MyArray[i]:=random(10);

     write(MyArray[i],'  ');

   end;

   writeln;

{нахождение произведения}

 count:=0; mult:=1;

 for i:=1 to n do

  if (MyArray[i] mod 2=0)

    then  begin

      inc(count);

      if (count<=3) then mult:=mult*MyArray[i];

    end;

 if (count>=3) then writeln('mult=',mult) else writeln('в массиве менее трех четных элементов');

 readln;

end.

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

{ нахождение произведения}

  i:=1;

 count:=0; mult:=1;

 while (count<3) and (i<=n) do

  begin

      if (MyArray[i] mod 2=0)

        then begin

          inc(count);

          mult:=mult*MyArray[i];

        end;

      inc(i);

    end;

 if (count=3) then writeln('mult=',mult) else writeln('в массиве менее трех четных элементов');

Обратите внимание на второе условие в цикле while (count<3) and (i<=n) do… Первое условие очевидно: как только встретятся три четных элемента, так произойдет выход из цикла. Второе условие предусматривает ситуацию, когда в массиве менее трех четных элементов. Без этого условия цикл продолжал бы выполняться и после i=10,
что привело бы к выходу за границы массива, т.е. к ошибке.

Объявление переменной типа двумерный массив

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

 var <имя_переменной>:array[<тип_индекса_1>,<тип_индекса_2>] of  <тип_элементов>;

Например,

var  а: array [1..5, 1..4] of  real;

       c, d: array [0..12, 0..2] of integer;

Обращение к элементу двумерного массива

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

Например, пусть задан двумерный массив целых чисел с именем MyArray:

const m=3; n=4;

var MyArray:array [1..m, 1..n] of integer;

В квадратных скобках указывается количество строк в массиве  1..m  и количество столбцов  1..n. Данный массив будет состоять из 12 элементов (3*4=12).

Чтобы обратиться к элементу массива, нужно указать его имя затем, в квадратных скобках (через запятую) номер строки и номер столбца, на пересечении которых он находится. Например, MyArray[1,1] – первый элемент массива (находящийся в верхнем левом углу),  MyArray[m,n] – последний элемент массива (находящийся в нижнем правом углу),  MyArray[1,3] – элемент, находящийся на пересечении первой строки и третьего столбца.

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

MyArray[2,4], MyArray[k,p], MyArray[k div 2 +1, p-1]…

(где k и p – целочисленные переменные).

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

Заполнение двумерного массива

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

Заполнение массива значениями, вводимыми пользователем.

for i:=1 to m do

   for j:=1 to n do

     begin

      write('MyArray[', i ,',', j ,']=');

      readln(MyArray[i,j]);

     end;

Первый оператор цикла (с итерационной переменной i) перебирает номера строк массива, а второй оператор – номера столбцов.

На рисунке видно, что на каждой итерации цикла с переменной i, цикл по переменной j, отвечающий за перебор номеров столбцов, выполняется 4 раза, а переменная j пробегает значения от 1 до 4:

Заполнения массива с помощью генератора случайных чисел.

randomize;

 for i:=1 to m do

   for j:=1 to n do

      MyArray[i,j]:=random(30);

Вывод элементов двумерного массива на экран

Можно реализовать с помощью следующего блока кода.

for i:=1 to m do

   begin

    for j:=1 to n do

      write(MyArray[i,j]:4);

    writeln;

   end;

Обратите внимание, что после вывода на экран элементов каждой строки ( for j:=1 to n do  write(MyArray[i,j]:4); ), используется оператор writeln без параметров. Это нужно для того, чтобы каждая строка массива печаталась с новой строки.

В операторе write(MyArray[i,j]:4); часть «:4» означает, что для вывода данной переменной отводится 4 экранные позиции. На рисунке ниже приведен пример использования вместо write(MyArray[i,j]:4); оператора write(MyArray[i,j], '  ');

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

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

Пример 10.

В какой строке массива количество нулевых элементов больше: в первой или последней?

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

const m=3; n=4;

var MyArray:array [1..m, 1..n] of integer;

   i,j,k1,km:byte;

begin

 {задание элементов массива и вывод на экран}

 randomize;

 for i:=1 to m do

   begin

     for j:=1 to n do

       begin

        MyArray[i,j]:=random(2);

        write(MyArray[i,j]:3);

       end;

     writeln;

   end;

{ подсчет количества нулевых элементов}

 k1:=0; km:=0;

 for j:=1 to n do

   begin

     if (MyArray[1,j]=0) then inc(k1);

     if (MyArray[m,j]=0) then inc(km);

   end;

{ сравнение количества нулевых элементов}

if (k1>km) then writeln('в первой строке больше')

 else if (k1<km)  then writeln('в последней строке больше')

      else writeln('поровну');

 readln;

end.

Аналогичное задание: «В каком столбце массива количество нулевых элементов больше: в первом или последнем?».

При решении этого задания нам известны номера столбцов: первый (№1) и последний (№ n). Эти номера фиксированы. В программе будут изменяться только номера строк.

 { подсчет количества нулевых элементов}

 k1:=0; km:=0;

 for i:=1 to m do

   begin

     if (MyArray[i,1]=0) then inc(k1);

     if (MyArray[i,n]=0) then inc(km);

   end;

Пример 11.

Поменять местами элементы двумерного массива с номерами [k1,p1] и [k2,p2].

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

const m=3; n=4;

var MyArray:array [1..m, 1..n] of integer;

   i,j,k1,k2,p1,p2:byte;

   t1,t2:boolean;

   temp:integer;

begin

 { инициализация элементов массива и вывод их на экран}

 randomize;

 for i:=1 to m do

   begin

     for j:=1 to n do

       begin

        MyArray[i,j]:=random(20);

        write(MyArray[i,j]:3);

       end;

     writeln;

   end;

 {обмен значениями}

 writeln('введите номер первого элемента');

 readln(k1,p1);

 writeln('введите номер второго элемента');

 readln(k2,p2);

{ проверка, что номера введенных элементов не выходят за границы массива}

 t1:=(k1>0) and (k1<=m)  and (p1>0) and (p1<=n);

 t2:=(k2>0) and (k2<=m)and (p2>0) and (p2<=n);

 if (t1 and t2)

   then begin

                  { перестановка}

     temp:=MyArray[k1,p1];

     MyArray[k1,p1]:=MyArray[k2,p2];

     MyArray[k2,p2]:=temp;

   end;

{ вывод массива после внесения изменений}

 for i:=1 to m do

   begin

     for j:=1 to n do

       write(MyArray[i,j]:3);

     writeln;

   end;

 readln;

end.

Пример 12.

Найти сумму элементов главной диагонали.

Понятие главной и побочной диагонали применимо только к квадратным матрицам.

Элементы главной диагонали массива характеризуются тем, что у них первый и второй индекс одинаковы: MyArray[1,1], MyArray[2,2], …, MyArray[n,n].

В задании требуется найти сумму всех таких элементов.

const n=4;

var MyArray:array [1..n, 1..n] of integer;

   sum,i,j:integer;

begin

 { заполнение массива и вывод на экран}

 randomize;

 for i:=1 to n do

   begin

     for j:=1 to n do

       begin

        MyArray[i,j]:=random(20);

        write(MyArray[i,j]:3);

       end;

     writeln;

   end;

{ вычисление суммы элементов главной диагонали}

 sum:=0;

 for i:=1 to n do

   for j:=1 to n do

     if (i=j)  then sum:=sum+MyArray[i,j];

 writeln('sum=',sum);

 readln;

end.

Таким образом просматриваются все элементы массива, если окажется, что у элемента одинаковые индексы (if  ( i=j)  …), то этот элемент добавляется к сумме (…then sum:=sum+MyArray[i,j];).

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

{ вычисление суммы элементов главной диагонали}

 sum:=0;

 for i:=1 to n do

    sum:=sum+MyArray[i,i];

Аналогичное задание: найти сумму элементов побочной диагонали.

Элементы побочной диагонали массива: MyArray[1,n], MyArray[2,n-1], …, MyArray[n,1]. Т.е. их индексы связаны следующей зависимостью:   j = n-i+1. Поэтому для нахождения их суммы также достаточно одного оператора цикла (а не двух вложенных).

{ вычисление суммы элементов побочной диагонали}

 sum:=0;

 for i:=1 to n do

    sum:=sum+MyArray[i, n-i+1];

Пример 13.

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

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

Выше обсуждалось, что при таком порядке операторов цикла и индексов элементов, цикл по i перебирает номера строк массива, а по j - номера столбцов.

const m=3; n=4;

var MyArray:array [1..m, 1..n] of integer;

   i,j,count:byte;

begin

 {заполнение массива и вывод на экран}

 randomize;

 for i:=1 to m do

   begin

     for j:=1 to n do

       begin

        MyArray[i,j]:=random(20);

        write(MyArray[i,j]:5);

       end;

     writeln;

   end;

 {подсчет количества нулевых элементов в каждой строке}

 for i:=1 to m do

   begin

     count:=0;

     for j:=1 to n do

       if (MyArray[i,j]=0)  then inc(count);

     writeln('кол-во нулевых элементов в ', i , '-ой строке=', count);

   end;

 readln;

end.

Результат работы программы:

Аналогичное задание: определить количество нулевых элементов в каждом столбце двумерного массива.

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

{количество нулевых элементов в каждом столбце}

for j:=1 to n do

   begin

     count:=0;

      for i:=1 to m do

       if (MyArray[i,j]=0)  then inc(count);

     writeln('кол-во нулевых элементов в ' ,j, '-ом столбце=', count);

   end;

Теперь внешний цикл (по переменной j ) перебирает номера столбцов, а внутренний – номера строк, т.е. обход массива осуществляется по столбцам.

Пример 14.

Поменять местами первую и р-ю строки (число р вводит пользователь).

Переставить две строки массива означает, что нужно поменять местами соответственно все элементы этих строк. Перестановку двух элементов массива можно выполнить с использованием вспомогательной переменной, тип которой совпадает с типом элементов массива. Номера строк фиксированы – это 1 и р. Для перестановки элементов строк используется цикл по i,  (чтобы перебрать все номера столбцов). На первой итерации меняются местами элементы MyArray[1,1] и MyArray[р,1], на второй - MyArray[1,2] и MyArray[р,2], на третьей - MyArray[1,3] и MyArray[р,3], на четвертой - MyArray[1,4] и MyArray[р,4].

const  m=3;n=4;

var MyArray:array [1..m, 1..n] of integer;

   i,j,p:byte;

   temp:integer;

begin

 randomize;

 for i:=1 to m do

   begin

     for j:=1 to n do

       begin

        MyArray[i,j]:=random(20);

        write(MyArray[i,j]:5);

       end;

     writeln;

   end;

{ перестановка строк}

 writeln('введите номер строки');

 readln(p);

 if (p>=1) and (p<=m)

  then for i:=1 to n do

          begin

             temp:=MyArray[1,i];

             MyArray[1,i]:=MyArray[p,i];

             MyArray[p,i]:=temp;

          end

  else writeln(' ошибка ввода ');

{вывод измененного массива на экран}

  for i:=1 to m do

   begin

     for j:=1 to n do write(MyArray[i,j]:5);

     writeln;

   end;

 readln;

end.

Аналогичное задание: переставить местами первый и р-й столбец (число р вводит пользователь). В этом задании фиксированы номера столбцов, а номера строк, т.е. первый из индексов элементов массива, должен изменяться. На первой итерации меняются местами элементы MyArray[1,1] и MyArray[1,р], на второй - MyArray[2,1] и MyArray[2,р], на третьей - MyArray[3,1] и MyArray[3,p].

{ перестановка столбцов}

writeln('введите номер столбца');

readln(p);

 if (p>1) and (p<=n)

  then for i:=1 to m do

          begin

             temp:=MyArray[i,1];

             MyArray[i,1]:=MyArray[i,p];

             MyArray[i,p]:=temp;

          end

  else writeln(' ошибка ввода ');

Контрольные вопросы

  1.  Что такое массивы? Для каких целей их обычно используют?
  2.  Какого типа могут быть элементы массива?
  3.  Каким образом организовывается доступ к элементу массива?
  4.  Может ли быть индекс массива вещественным числом? Символом?
  5.  Индекс элемента одномерного массива указывается в ___ скобках.
  6.  Можно ли присваивать элементам массива значения совместимые с ними по типу?
  7.  Какие операции определены для массивов в целом?
  8.  С помощью какой стандартной функции можно заполнить массив случайными числами?
  9.  Дайте определение двумерного массива.
  10.  Каким образом можно обратиться к элементу двумерного массива?
  11.  В каком разделе объявляются переменные-массивы?
  12.  С помощью какого ключевого слова объявляются переменные-массивы?
  13.  Допустимо ли в Паскале объявление трехмерного массива?
  14.  Можно ли объявить одномерный массив, элементами которого будут величины логического типа?

Примерный вариант контрольной работы

  1.  Задан одномерный массив целых чисел. Определить количество нечетных элементов массива.
  2.  Даны два одномерных массива действительных чисел из одинакового количества элементов, получить третий массив той же размерности, каждый элемент которого равен большему из соответствующих элементов массивов т.е. .
  3.  Задан одномерный массив вещественных чисел. Определить есть ли в массиве хотя бы два соседних положительных элемента.
  4.  Даны два двумерных массива действительных чисел размерности . Вывести на экран тот из них у кого сумма элементов главной диагонали меньше.
  5.  Задан двумерный массив действительных чисел размерности .  Требуется последний отрицательный элемент каждого столбца заменить нулем.


Лабораторная работа №5. Структурированные типы данных. Строковый тип

Требования к лабораторной работе

После выполнения лабораторной работы обучаемый должен:

  •  свободно оперировать величинами типа string (объявление, инициализация, ввод, вывод и т.п.);
    •  научиться применять все типы операторов цикла (в зависимости от задачи) для работы со строками;
    •  научиться применять стандартные процедуры и функции для работы со строками;
    •  научиться проводить проверку строки (или элементов строки) на соответствие некоторому условию;
    •  научиться проводить разбор строки (например, по словам) и работать с массивами строк.

Задания к лабораторной работе

Группа А

Задание №1

  1.  Составить программу, которая запрашивает имя человека и повторяет его на экране с приветствием.
  2.  Составить программу, которая запрашивает название футбольной команды и повторяет его на экране со словами: «Это чемпион!».
  3.  Пользователь вводит название футбольного клуба. Определить количество символов в нем.
  4.  Пользователь вводит название города. Определить, четно или нет количество символов в нем.
  5.  Пользователь вводит две фамилии. Определить, какая из них длиннее.
  6.  Пользователь вводит названия трех городов. Проверить, есть ли среди них Тюмень.

Задание №2

  1.  Дано предложение. Определить общее количество букв «о» и «у» в нем.
  2.  Дано предложение. Определить общее количество  пробелов и запятых в нем.
  3.  Дано предложение. Определить число вхождений в него двух произвольных символов.
  4.  Дано предложение. Определить долю (в %) букв «а» в нем.
  5.  Дан текст. Сколько раз в нем встречается символ «+» и сколько раз символ «*»?
  6.  Дан текст. Определить количество предложений в нем.

Задание №3

  1.  Дано предложение. Все буквы «е» в нем заменить на букву «и».
  2.  Дано предложение. Все пробелы в нем заменить на символ «_».
  3.  Дано предложение. Все его символы, стоящие на четных местах, заменить на букву «ы».
  4.  Дано предложение. Все его символы, стоящие на третьем, шестом, девятом и т. д. местах, заменить на букву «А».
  5.  Дано предложение. Все буквы «ъ» в нем заменить на букву «ь».
  6.  Дано предложение. Все его символы, стоящие на нечетных местах, заменить на символ «*».

Задание №4

Путем копирования подстрок получить:

  1.  Из слова «яблоко» слова «блок» и «око».
  2.  Из слова «информатика» слова «форма» и «тик ».
  3.  Из слова «градусник» слова «градус» и «ад».
  4.  Из слова «холодильник» слова «холод» и «ил».
  5.  Из слова «акробатика» слова «акр» и «тик ».
  6.  Из слова «баллистика» слова «балл» и «лист».

Задание №5

Путем вставок и удаления символов исправить ошибки:

  1.  В слове «прроцесор.
  2.  Во фразе «теекстовыйфайл».
  3.  Во фразе «програма и аллгоритм».
  4.  Во фразе «процесор и паммять».
  5.  Во фразе «мышьь  и клавитура».
  6.  Во фразе «систеемный  бок».

Группа В

Задание №1

Путем копирования подстрок получить:

  1.  Из слова «яблоко» слова «блок» и «око».
  2.  Из слова «информатика» слова «форма» и «тик ».
  3.  Из слова «градусник» слова «градус» и «ад».
  4.  Из слова «холодильник» слова «холод» и «ил».
  5.  Из слова «акробатика» слова «акр» и «тик ».
  6.  Из слова «баллистика» слова «балл» и «лист».

Задание №2

  1.  Дано предложение. Заменить в нем все вхождения буквосочетания «ах» на «ух».
  2.  Дано предложение. Заменить в нем все вхождения буквосочетания «да» на «не».
  3.  Дано предложение. Заменить в нем все вхождения буквосочетания «про» на «нет».
  4.  Дано предложение. Заменить в нем все вхождения буквосочетания «бит» на «рог».
  5.  Дано предложение. Заменить в нем все вхождения буквосочетания «ал» на «ор».
  6.  Дано предложение. Заменить в нем все вхождения буквосочетания «тон» на «орт».

Задание №3

  1.  Дано предложение. Удалить из него все цифры.
  2.  Дано предложение. Удалить из него все буквы «о», стоящие на нечетных местах.
  3.  Дано предложение. Удалить из него  буквы «с», если они являются первыми буквами слов.
  4.  Дано предложение. Удалить из него все русские буквы.
  5.  Дано предложение. Удалить из него  буквы «я», если они являются последними буквами слов.
  6.  Дано предложение. Удалить из него все латинские буквы.

Задание №4

  1.  Дано предложение. Вставить запятую после каждого слова.
  2.  Дано предложение. Вставить  «_» после каждой цифры.
  3.  Дано предложение. Вставить  «?» перед каждым словом.
  4.  Дано предложение. Вставить  «*» после всех букв «а» и «А».
  5.  Дано предложение. Вставить  «!» после каждой латинской буквы.
  6.  Дано предложение. Вставить  «+» после каждого пробела.

Задание №5

  1.  Дан текст, имеющий вид: , где - цифры ( > 1). Вычислить записанную в тексте сумму.
  2.  Дан текст, имеющий вид: , где - цифры ( > 1). Вычислить записанную в тексте разность.
  3.  Дан текст, имеющий вид: , где - цифры ( > 1).  Вычислить записанное в тексте произведение.
  4.  Дан текст, имеющий вид: , где - цифры ( > 1). Вычислить записанную в тексте алгебраическую сумму.
  5.  Дан текст, имеющий вид: , где - цифры. Вычислить записанную в тексте алгебраическую сумму.
  6.  Дан текст, имеющий вид: , где - цифры.  Вычислить записанную в тексте сумму.

Группа С

Задание №1

  1.  Дано предложение. Определить есть ли в нем одинаковые буквы.
  2.  Дана строка, состоящая из цифр. Расположить эти цифры в порядке возрастания их значений.
  3.  Дано предложение. Определить, сколько в нем одинаковых соседних букв.
  4.  Дан текст. Найти наибольшее количество идущих подряд цифр.
  5.  Дано предложение. Определить, все ли буквы в нем различны.
  6.  Дан текст, в котором имеется несколько идущих подряд цифр. Получить число, образованное этими цифрами.

Задание №2

  1.  Дано предложение. Вставить запятую после каждого слова.
  2.  Дано предложение. Вставить  «_» после каждой цифры.
  3.  Дано предложение. Вставить  «?» перед каждым словом.
  4.  Дано предложение. Вставить  «*» после всех букв «а» и «А».
  5.  Дано предложение. Вставить  «!» после каждой латинской буквы.
  6.  Дано предложение. Вставить  «+» после каждого пробела.

Задание №3

  1.  Дано предложение. Удалить из него все цифры.
  2.  Дано предложение. Удалить из него все буквы «о», стоящие на нечетных местах.
  3.  Дано предложение. Удалить из него  буквы «с», если они являются первыми буквами слов.
  4.  Дано предложение. Удалить из него все русские буквы.
  5.  Дано предложение. Удалить из него  буквы «я», если они являются последними буквами слов.
  6.  Дано предложение. Удалить из него все латинские буквы.

Задание №4

  1.  Дано предложение. Вывести на экран слова, которые содержат ровно три буквы «е».
  2.  Дано предложение. Верно ли, что его самое длинное слово имеет больше 10 символов?
  3.  Дано предложение. Вывести на экран слова, которые содержат хотя бы одну букву «о».
  4.  Дано предложение. Вывести на экран Дано предложение. Найти какое-нибудь его слово, начинающееся на букву «к».
  5.  Дано предложение. Найти длину его самого короткого слова.
  6.  Дано предложение. Напечатать его самое длинное слово (принять, что такое слово - единственное).

Задание №5

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

Теоретический материал и методические указания

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

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

var <имя_переменной>: string;

Например,  var MyString: string;

После объявления строковой переменной под нее выделяется определенный блок памяти, но содержимое этого блока неясно. Для дальнейшей работы с переменной MyString ей нужно присвоить некоторое значение. Оно может быть определено через:

  •  присвоение переменной значения некоторой строковой константы при написании программного кода (строковые константы в языке программирования Паскаль записываются в одинарных кавычках, вы с ними раньше встречались при написании оператора writeln, например,  writeln(‘sum=’,sum));

MyString:='Моя первая строка';

  •  ввод с консоли (запрос значения у пользователя): readln(MyString);
    •  присвоение значения другой строковой переменной или результата некоторого выражения, например, MyString:=MyString2+ ’as’; (где MyString2 – строковая переменная, определенная в той же программе).

Для ввода и вывода строковых переменных используют операторы readln  и writeln.

Обращение к элементу строки

Обращение к элементу строки осуществляется также как и к элементу одномерного массива через указание имени строки и порядкового номера элемента. Элемент строки совместим с типом char, т.е. элемент строки – это символ.

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

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

Пример 1.

MyString[1]:=’a’;

MyString[k-1]:=’s’;

Также элемент строки может участвовать в выражениях:

if ( MyString[3]=’w’ ) then …

и т.п.

Процедуры и функции для работы со строками

Длина строки.

Функция length() возвращает длину  строки, т.е. количество символов в строке.

Обратите внимание, даже в случае, когда в программе указывается максимальный размер строки, функция  length() вернет значение реальной длины строки. Так в примере на экран выведется число  3, а не 80.

var    MyString:string[80];

        n:byte;

begin

 MyString:='123';

 n:= length(MyString);

 writeln(n);

 readln;

end.

Чаще всего функция length() используется при решении задач, в которых нужно перебрать все символы строки  (for i:=1 to length(MyString) do...).

Конкатенация строк.

Функция Concat() «склеивает» строки, передаваемые ей в качестве параметров. Она возвращает строку, которая является результатом объединения строк-параметров. Например, после выполнения следующего кода переменная MyString примет значение «гололед».

var MyString,s1,s2:string;

begin

 s1:='гол';

 s2:='лед';

 MyString:=Concat(s1, 'о', s2);

 writeln(MyString);

 readln;

end.

Этой функцией пользуются достаточно редко, т.к. тот же результат обеспечивает применение обычной операции «+». Т.е. строку кода  MyString:=Concat(s1, 'о', s2); можно заменить на MyString:=s1+ 'о'+ s2;  результат будет тем же.

Остальные процедуры и функции представлены в таблице ниже. Более подробно они рассмотрены в примерах №7-№10.

Таблица 5.1

Процедуры и функции для работы со строками

Название процедуры / функции

Выполняемое действие

Copy(s, start, len)

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

Pos(subs, s)

Функция. Ищет вхождение подстроки subs в строку s и возвращает номер первого вхождения subs в s или нуль, если subs не содержится в s.

Delete(s, start, len)

Процедура. Удаляет из строки s, начиная с позиции start, подстроку длиной len.

Insert(subs, s, start)

Процедура. Вставляет в строку s подстроку subs, начиная с позиции start.

Str(x, s)

Процедура. Преобразует числовое значение х  в строку s, при этом для  x  может быть задан формат, как в процедурах вывода write и writeln, например Str(x:6:2, s).

Val (s, x, errcode)

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

Массивы строк

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

Строковый массив объявляется также как и обычные массивы:

var MyArray:array [1..20] of string;

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

Работа с массивом строк будет продемонстрирована в примере № 9.

Пример 2.

Запросить у пользователя его имя и поприветствовать пользователя с использованием его имени.

var MyString: string;

begin

 writeln('Введите Ваше имя');

 readln(MyString);

 writeln(' Здравствуйте,  ',MyString, '!');

 readln;

end.

Обратите внимание, что параметром первого оператора является строковая константа ('Введите Ваше имя').

Пример 3.

Пользователь вводит два имени, проверить, есть ли среди них имя Татьяна.

var MyString1,MyString2: string;

begin

 writeln('Введите первое имя');

 readln(MyString1);

 writeln(' Введите второе имя ');

 readln(MyString2);

 if (MyString1= 'Татьяна') or  (MyString2= 'Татьяна') then

 writeln('есть') else writeln('нет') ;

 readln;

end.

Пример 4.

Пользователь вводит некоторую строку. Определить есть ли в ней буква «Д».

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

var MyString: string;

   i:integer;

   t:boolean;

begin

 writeln('Введите строку');

 readln(MyString);

 t:=false;

 for i:=1 to length(MyString) do

   if (MyString[i]='Д') then t:=true;

 writeln(t);

 readln;

end.

Второй способ заключается в использовании стандартной функции, определенной для переменных и констант строкового типа. Функция Pos проверяет, содержится ли некоторая подстрока в рассматриваемой строке, если да – функция возвращает номер первого вхождения, иначе – 0. Т.е. если буква «Д» содержится в строке, функция Pos вернет число большее 0, в противном случае - вернет 0.

var MyString: string;

   i:integer;

begin

 writeln('Введите строку');

 readln(MyString);

 if (Pos( 'Д', MyString)>0) then writeln('да') else  writeln('нет');

 readln;

end.

Пример 5.

Пользователь вводит некоторую строку. Заменить все символы с номерами 5, 10, 15, 20 …на вопросительные знаки.

Последовательно перебираем номера от 1 до length(MyString), если встречается номер, кратный пяти, то элемент строки с этим номером заменяется на «?».

var MyString: string;

   i:integer;

begin

 writeln('Введите строку');

 readln(MyString);

 for i:=1 to length(MyString) do

     if (i mod 5=0) then MyString[i]:='?';

 writeln(MyString);

 readln;

end.

Пример 6.

Задана строка «Моя программа». Скопировать в другую строковую переменную часть исходной строки, начиная с  5 символа по 13.

Сделать копию части строки можно с помощью функции Copy. Первым параметром этой функции является имя строки, часть которой нужно скопировать, второй параметр – номер символа строки, с которого начинается копирование, третий – количество символов, которое необходимо скопировать. Т.к. в примере требовалось скопировать часть строки с 5-го по 13-й символ, третьим параметром в функции стало число 9 (количество символов). Функция Copy возвращает результат такого копирования его можно присвоить некоторой строковой переменной (в примере MyString2)

var MyString1,MyString2:string;

begin

 MyString1:= ‘Моя программа’;

 MyString2:=Copy(MyString1, 5, 9);

 writeln(MyString2);

 readln;

end.

В результате работы программы переменной MyString2 присвоится значение «программа».

Пример 7.

Путем удаления символов получить из слова «программа» слово «гамма».

var MyString:string;

begin

 MyString1:='Программа';

 Delete(MyString,1,3);

 Delete(MyString,2,1);

 writeln(MyString);

 readln;

end.

Первая процедура удаления (Delete(MyString,1,3);): из строки MyString удаляются три первых символа, теперь строка MyString имеет вид «грамма».

Вторая процедура удаления (Delete(MyString, 2, 1);  удаляет из MyString один символ, начиная со второго. Т.е. удалится только второй символ, теперь строка MyString имеет вид «гамма».

Пример 8.

Путем вставки символов получить из слова «гамма» слово «программа».

Процедура  Insert('р',MyString,2); вставляет букву «р» перед вторым символом строки MyString. Следующая процедура вставки Insert('про',MyString,1); вставляет строку «про» перед первым символом строки MyString, т.е. в начало строки. Обратите внимание, что в процедуре Insert первым параметром может быть не только строковая константа, но и строковая переменная, например, Insert(NewString,MyString,1). Вторым параметром может быть только переменная, поскольку именно второй параметр процедуры подлежит изменению, третьим параметром могут быть как константы, так и переменные целочисленных типов: Insert(NewString, MyString, k).

var MyString:string;

begin

 MyString:='гамма';

 Insert('р',MyString,2);

 Insert('про',MyString,1);

 writeln(MyString);

 readln;

end.

Пример 9.

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

var MyArray:array [1..100] of string;

   n,count,i,j:byte;

   s:string;

begin

 writeln('введите текст, по окончанию - ***');

 i:=0;

 {ввод текста}

 repeat

   inc(i);

   readln(s);

   MyArray[i]:=s;

 until  (s='***');

 n:=i-1;      { n - количество строк}

 for i:=1 to n do

  begin

    count:=0;

    s:=MyArray[i];

    for j:=1 to Length(s) do

      if (s[j]>='A') and (s[j]<='Z') then inc (count);

    writeln('в строке № ', i, ' количество  =  ', count);

  end;

 readln;

end.

В этой программе ввод текста организован следующим образом: пользователь вводит произвольные строки, окончанием ввода служит ввод строки «***».  Массив строк задается большого размера, для того чтобы мог вместить все строки, которые введет пользователь. Затем, чтобы далее не перебирать все 100 элементов массива, вводится переменная n, равная количеству введенных строк. Из номера последнего элемента вычитается единица (n:=i-1;), чтобы исключить последнюю строку «***».  Затем в цикле (по i) перебираются строки – элементы массива, во  вложенном цикле (по j ) перебираются элементы строк – символы. Каждый элемент строки проверяется на соответствие условию задачи, при положительном исходе значение переменной count  увеличивается.

В данной программе при вводе и обработке строк использовалась вспомогательная переменная s, но со строковыми элементами массива можно работать напрямую, нужно только принять во внимание, что MyArray[1], MyArray[2]… MyArray[i]… - это имена строковых переменных и работать с ними нужно как и с обычными строками.

var MyArray:array [1..50] of string;

   n,count,i,j:byte;

begin

 writeln('');

 i:=0;

 repeat

   inc(i);

   readln(MyArray[i]);

 until  (MyArray[i]='***');

 n:=i-1;

 for i:=1 to n do

  begin

    count:=0;

    for j:=1 to Length(MyArray[i]) do

      if (MyArray[i][j]>='A') and (MyArray[i][j]<='Z') then inc (count);

    writeln('в строке № ', i, ' количество  =  ', count);

  end;

 readln;

end.

Пример 10.

Задана строка. Следует удалить из нее все знаки препинания.

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

Следует обратить внимание на то, что цикл с параметром в задачах такого типа использовать нельзя, т.к. начальное и конечное значение параметра высчитывается только один раз при входе в цикл и не пересчитываются на каждой итерации, даже если начальное или конечное значение являются результатами вычисления некоторых выражений. При удалении символов длина строки уменьшается, при этом конечное значение параметра цикла остается неизменным, следовательно, происходит выход за границы строки. Если в настройках компилятора включена проверка границ (Range Checking на закладке Compiler), то выполнение следующего кода закончится ошибкой, если проверка границ не включена, то задача будет решена неправильно  - удалятся не все знаки препинания.

var MyString :string;

   i:byte;

begin

 readln(MyString);

 for i:=1 to length(MyString) do

  if (MyString[i]=',')or (MyString[i]='.')

  then Delete(MyString,i,1);

 writeln(MyString);

 readln;

end.

Потому при решении таких задач следует пользоваться циклами с условием.

Следующий код решает задачу корректно.

var MyString :string;

   i:byte;

begin

 readln(MyString);

 i:=1;

 while (i<=Length(MyString))do

 begin

   if (MyString[i]='.')or (MyString[i]=',')

     then begin

       Delete(MyString,i,1);

       dec(i);

     end;

   inc(i);

 end;

 writeln(MyString);

 readln;

end.

Контрольные вопросы

  1.  Дайте определение строковому типу.
  2.  Как определить длину строки?
  3.  С помощью какой процедуры можно считать строку с консоли? Вывести на консоль?
  4.  Какие операции применимы к величинам строкового типа?
  5.  Опишите принцип сравнения строк?
  6.  Как можно обратиться к символу строки? Совместим ли по присваиванию элемент строки с типом char?
  7.  Переменные каких типов могут быть индексами элементов строки?
  8.  Назовите основные процедуры, определенные для величин строкового типа.
  9.  Назовите основные функции, определенные для величин строкового типа.
  10.  Можно ли создать массив строк?

Примерный вариант контрольной работы

  1.  Дано предложение. Определить, каких букв в нем больше: «м» или «н».
  2.  Дано предложение. Определить, есть ли в нем буква «а». В случае положительного ответа найти порядковый номер первой из них.
  3.  Дано слово из четного числа букв. Поменять местами первую букву со второй, третью — с четвертой и т. д.
  4.  Дано предложение. После каждой буквы «н» следует вставить символ «*».
  5.  Проверить, является ли «перевертышем» следующая символьная строка после удаления из нее всех пробелов «А РОЗА УПАЛА НА ЛАПУ АЗОРА».


Лабораторная работа №6. Структурированные типы данных. Множества и записи

Требования к лабораторной работе

После выполнения лабораторной работы обучаемый должен:

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

Задания к лабораторной работе

Группа А

Задание №1

  1.  Имеются три множества:

A = {1,2,3,5,8,9}

B = {1,3,7}

C = {0,6,8,9}

Требуется: сформировать новое множество D (заштрихованная область на рисунке) и вывести полученное множество на экран.

  1.  Имеются три множества:

A = {1,2,3,5,8,9}

B = {3,7,6,8}

C = {0,6,8,9}

Сформировать новое множество D (заштрихованная область на рисунке), вывести полученное множество на экран.

  1.  Имеются два множества:

A = {1,2,3,5,8,9}

B = {0,1,3,6,7}

Сформировать новое множество С (заштрихованная область на рисунке), вывести полученное множество на экран.

  1.  Имеются три множества:

A = {1,2,3,5,8,9}

B = {1,3,7}

C = {0,3,6,8,9}

Сформировать новое множество D (заштрихованная область на рисунке), вывести полученное множество на экран.

  1.  Имеются три множества:

A = {1,2,3,7}

B = {1,2,3,5,8,9}

C = {0,6,8,9}

Сформировать новое множество D (заштрихованная область на рисунке), вывести полученное множество на экран.

  1.  Имеются три множества:

A = {1,2,3,5}

B = {1,3,7,6,8}

C = {0,6,8,9}

Сформировать новое множество D (заштрихованная область на рисунке), вывести полученное множество на экран.

Задание №2

Пользователем вводится строка S. С помощью типа данных множество определить, содержит ли строка:

  1.  цифры;
  2.  заглавные русские буквы;
  3.  прописные английские буквы;
  4.  знаки арифметических операций;
  5.  знаки препинания;
  6.  заглавные латинские буквы.

Задание №3

  1.  Известны данные о 20 сотрудниках фирмы (фамилия, зарплата и пол). Определить фамилию мужчины, имеющего самую большую зарплату (считать, что такой есть и он единственный).
  2.  Известны данные о 20 сотрудниках фирмы (фамилия, зарплата и пол). Определить фамилии мужчины и женщины, имеющих самую маленькую зарплату (считать, что такие есть и они единственные в своей группе сотрудников).
  3.  Известны данные о 16 сотрудниках фирмы: фамилия, возраст и отношение к воинской службе (военнообязанный или нет). Определить фамилию самого младшего по возрасту человека среди военнообязанных (считать, что такой есть и он единственный).
  4.  Даны названия 26 городов и стран, в которых они находятся. Среди них есть города, находящиеся в Италии. Напечатать их названия.
  5.  Известны данные о 16 сотрудниках фирмы: фамилия и отношение к воинской службе (военнообязанный или нет). Напечатать фамилии всех военнообязанных сотрудников.
  6.  Известны фамилии всех 30 сотрудников фирмы и их адреса. Определить, работают ли в фирме люди с одной из фамилий: Кузин, Куравлев, Кудин, Кульков или Кубиков. В случае положительного ответа напечатать их адреса.

Задание №4

  1.  Известны данные о стоимости каждого из 20 наименований товаров: число рублей и число копеек. Составить программу, сравнивающую стоимость двух любых наименований товаров (определяющую, какой из товаров стоит дороже).
  2.  Известна информация о 25 событиях, произошедших в течение суток: часы (значения от 0 до 23) и минуты (от 0 до 59). Составить программу, определяющую, какое из двух событий произошло в эти сутки раньше.
  3.  Даны даты 20 событий, произошедших после 1930 года: год, номер месяца и число. Составить программу, сравнивающую два любых события по времени (определяющую, какое из событий произошло позже).
  4.  Количество мячей, забитых и пропущенных футбольной командой в каждой из 22 игр, записано в массиве, элементами которого являются величины типа запись. Для каждой проведенной игры напечатать словесный результат: «выигрыш», «ничья» или «проигрыш». Определить количество ничьих данной команды.
  5.  Количество мячей, забитых и пропущенных футбольной командой в каждой из 22 игр, записано в массиве, элементами которого являются величины типа запись. Для каждой проведенной игры напечатать словесный результат: «выигрыш», «ничья» или «проигрыш». Определить количество выигрышей, количество ничьих и количество проигрышей команды.
  6.  Количество мячей, забитых и пропущенных футбольной командой в каждой из 22 игр, записано в массиве, элементами которого являются величины типа запись. Для каждой проведенной игры напечатать словесный результат: «выигрыш», «ничья» или «проигрыш». Определить общее число очков, набранных командой (за выигрыш дается 3 очка, за ничью — 1, за проигрыш — 0).

Группа В

Задание №1

Пользователь вводит элементы трех символьных множеств А, В и С. Требуется: сформировать новое множество D (заштрихованная область на рисунке) и вывести полученное множество на экран.

Пользователь вводит элементы трех символьных множеств А, В и С. Требуется: сформировать новое множество D (заштрихованная область на рисунке), вывести полученное множество на экран.

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

Пользователь вводит элементы трех символьных множеств А, В и С. Требуется: сформировать новое множество D (заштрихованная область на рисунке), вывести полученное множество на экран.

Пользователь вводит элементы трех символьных множеств А, В и С. Требуется: сформировать новое множество D (заштрихованная область на рисунке), вывести полученное множество на экран.

Пользователь вводит элементы трех символьных множеств А, В и С. Требуется: сформировать новое множество D (заштрихованная область на рисунке), вывести полученное множество на экран.

Задание №2

С клавиатуры сформировать множество, состоящее из 10 чисел, элементы которого принадлежат промежутку 3 до 50. Выделить из полученного множества все числа, делящиеся на 5 и составить из них новое множество. Вывести его на экран.   

Считать с клавиатуры два множества. Первое состоит из шести чисел, лежащих на промежутке от 0 до 10, второе – из 3 чисел, лежащих на промежутке от 0 до 20. Найти их пересечение и вывести полученное множество на экран  

С клавиатуры считать элементы двух множеств. Первое состоит из трех чисел, лежащих на промежутке от 0 до 10, второе - из пяти чисел лежащих на промежутке от 2 до 15. Сформировать новое множество, состоящее из общих элементов двух множеств, кратных трем.  Вывести полученное множество на экран.

Из множества целых чисел 1..20 выделить: множество чисел, делящихся на 6 без остатка; множество чисел делящихся без остатка на 2 или на 3. Полученные множества вывести на экран

Считать с клавиатуры три множества. Первое состоит из четырех чисел, лежащих на промежутке от 0 до 20, второе – из 3 чисел, лежащих на промежутке от 0 до 10, третье - из 3 чисел, лежащих на промежутке от 5 до 15. Сформировать новое множество, состоящее из четных элементов, входящих в эти множества. Вывести полученное множество на экран.

С клавиатуры сформировать множество, состоящее из 7 чисел, элементы которого принадлежат промежутку 10 до 30. Выделить из полученного множества все числа, делящиеся на 5 или на 7 и составить из них новое множество. Вывести его на экран.

Задание №3

Пользователем вводится строка S. С помощью типа данных множество определить:

  1.  количество цифр  и пробельных символов в строке;
  2.  количество заглавных русских букв и знаков препинания;
  3.  количество цифр и знаков арифметических операций;
  4.  процентное отношение строчных русских  английских букв;
  5.  процентное отношение знаков препинания к цифрам;
  6.  каких букв больше строчных латинских буквы или заглавных русских.

Задание №4

  1.  Даны названия 20 стран и частей света, в которых они находятся. Определить, есть ли среди них страны, находящиеся в Африке или в Азии. В случае положительного ответа напечатать их названия.
  2.  Известен рост каждого из 25 учеников класса. Ни одна пара учеников не имеет одинакового роста. Определить фамилии самого высокого и самого низкого учеников класса.
  3.  В записной книжке указаны фамилии и номера телефонов 30 человек. Составить программу, которая определяет, есть ли в записной книжке телефон некоторого человека, и, если есть, печатающую номер его телефона.
  4.  В записной книжке указаны фамилии и номера телефонов 30 человек. Составить программу, которая определяет, есть ли в записной книжке информация о человеке с заданным номером телефона, и, если есть, печатающую фамилию этого человека.
  5.  Известны данные о массе и объеме 30 тел, изготовленных из различных материалов. Определить материал с минимальной плотностью.
  6.  Известны данные о численности населения (в млн. жителей) и площади (в тысячах квадратных километров) 28 государств. Определить название государства с минимальной плотностью населения.

Задание №5

  1.  Известны сведения о высоте над уровнем моря 15 горных вершин. Все значения выражены в метрах. Напечатать названия вершин, чья высота превышает 3000 м над уровнем моря.
  2.  Известны максимальные скорости 20 моделей легковых автомобилей. Все значения выражены в км/ч. Напечатать названия моделей, у которых максимальная скорость превышает 180 км/ч.
  3.  Известны вес и пол каждого из 20 человек. Найти общую массу мужчин.
  4.  Известны данные о количестве учащихся в каждом из 15 учебных заведений и о типе этого заведения (школа, техникум или училище). Найти общее число учащихся школ.
  5.  Известны рост и пол каждого из 22 человек. Найти средний рост мужчин (женщин).
  6.  Известны данные о стоимости каждой из 15 моделей автомобилей и об их типе (легковой или грузовой). Найти среднюю стоимость легковых автомобилей.

Задание №6

  1.  Известны оценки каждого из 25 учеников класса по четырем предметам. Найти фамилию одного из учеников, имеющих наибольшую сумму оценок;
  2.  Известны оценки каждого из 25 учеников класса по четырем предметам. Найти фамилию одного из учеников, имеющих наименьшую сумму оценок.
  3.  Известны оценки каждого из 20 учеников класса по четырем предметам. Определить среднюю оценку каждого ученика и всего класса. Вывести фамилии учеников, у которых средняя оценка выше средней по классу.
  4.  Количество мячей, забитых и пропущенных каждой из шестнадцати футбольных команд в каждой из 15 игр, записано в массиве. Его элементами величины типа запись. Названия команд известны. Определить, в скольких играх была ничья.
  5.  Количество мячей, забитых и пропущенных каждой из шестнадцати футбольных команд в каждой из 15 игр, записано в массиве. Его элементами величины типа запись. Названия команд известны. Определить, в скольких играх разность забитых и пропущенных мячей была большей или равной трем.
  6.  Количество мячей, забитых и пропущенных каждой из шестнадцати футбольных команд в каждой из 15 игр, записано в массиве. Его элементами величины типа запись. Названия команд известны. Определить количество выигрышей, количество ничьих и количество проигрышей каждой команды.

Группа С

Задание №1

С клавиатуры сформировать множество, состоящее из 10 чисел, элементы которого принадлежат промежутку 3 до 50. Выделить из полученного множества все числа, делящиеся на 5 и составить из них новое множество. Вывести его на экран.   

Считать с клавиатуры два множества. Первое состоит из шести чисел, лежащих на промежутке от 0 до 10, второе – из 3 чисел, лежащих на промежутке от 0 до 20. Найти их пересечение и вывести полученное множество на экран  

С клавиатуры считать элементы двух множеств. Первое состоит из трех чисел, лежащих на промежутке от 0 до 10, второе - из пяти чисел лежащих на промежутке от 2 до 15. Сформировать новое множество, состоящее из общих элементов двух множеств, кратных трем.  Вывести полученное множество на экран.

Из множества целых чисел 1..20 выделить: множество чисел, делящихся на 6 без остатка; множество чисел делящихся без остатка на 2 или на 3. Полученные множества вывести на экран

Считать с клавиатуры три множества. Первое состоит из четырех чисел, лежащих на промежутке от 0 до 20, второе – из 3 чисел, лежащих на промежутке от 0 до 10, третье - из 3 чисел, лежащих на промежутке от 5 до 15. Сформировать новое множество, состоящее из четных элементов, входящих в эти множества. Вывести полученное множество на экран.

С клавиатуры сформировать множество, состоящее из 7 чисел, элементы которого принадлежат промежутку 10 до 30. Выделить из полученного множества все числа, делящиеся на 5 или на 7 и составить из них новое множество. Вывести его на экран.  

Задание №2

Пользователем вводятся с клавиатуры элементы трех множеств А, В, С символьного типа.  Сформировать новое множество . Вывести на экран полученное множество. Проверить включено ли множество С во множество D.  

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

Считать с клавиатуры два символьных множества. Первое состоит из 10 букв, второе из 15. Вывести на экран в алфавитном порядке все буквы, которые входят в пересечение этих множеств.  

Считать с клавиатуры два символьных множества, содержащих только русские и английские буквы. Первое состоит из 5 букв, второе из 6. Сформировать новое множество, которое будет состоять только из заглавных русских букв.  

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

Считать с клавиатуры два символьных множества. Первое состоит из 10 букв, второе из 4. Вывести на экран в обратном алфавитном порядке все буквы, которые входят в объединение этих множеств.

Задание №3

Вводится строка S. С помощью типа данных множество определить, является ли строка:

  1.  записью арифметического выражения (например, 23+11*2…);
  2.  записью вещественного отрицательного числа;
  3.  предложением на русском языке;
  4.  идентификатором языка программирования Паскаль;
  5.  предложением на английском языке;
  6.  именем переменной языка программирования Паскаль.

Задание №4

Таблица футбольного чемпионата задана следующим образом: известны названия 10 команд, каждой командой было проведено 9 матчей (Команду характеризует запись, одно поле которой - название команды, а второе - массив из 10 элементов. Каждый элемент равен 3, 1 или 0 (числу очков, набранных в игре: 3 — выигрыш, 1 — ничья, 0 — проигрыш. Номер элемента массива определяет номер команды-соперника. Ясно, что первый элемент массива первой команды равен 0 и т.д.).

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

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

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

Задание №5

  1.  Известны фамилии 25 человек, их семейное положение: женат (замужем) или нет, и сведения о наличии детей (есть или нет). Определить фамилии женатых (замужних) людей, имеющих детей.
  2.  Известны данные о 30 учениках: фамилия, класс и оценка по информатике. Определить фамилии учеников 9-х классов, имеющих оценку «5».
  3.  Известны оценки каждого из 22 учеников класса по четырем предметам. Определить фамилию одного из учеников, имеющих максимальную сумму оценок.
  4.  Известны данные о 25 учениках класса: фамилия, имя, отчество, адрес и домашний телефон, если он есть. Вывести на экран фамилию, имя и адрес каждого ученика, у которого нет домашнего телефона (телефон задан в виде строки, например 268-50-59).
  5.  Известна информация о 30 клиентах пункта проката: фамилия, имя, отчество, адрес и домашний телефон. Известно также название предмета, взятого каждым из них напрокат (в виде: т — телевизор, х — холодильник и т. п.). Вывести на экран фамилию, имя и адрес каждого из клиентов, взявших напрокат телевизор.
  6.  Известна информация о 28 учениках нескольких школ, занимающихся в районном Доме творчества (фамилия, имя, адрес, номер школы и класс). Фамилию, имя и адрес тех учеников, которые учатся в данной школе в старших (10—11-х) классах, записать в отдельный массив.

Задание №6

  1.  Известны данные о 20 учениках класса: фамилии, имена, отчества, даты рождения (год, номер месяца и число). Определить, есть ли в классе ученики, у которых сегодня день рождения, и если да, то напечатать имя и фамилию каждого.
  2.  Известна информация о 20 сотрудниках фирмы: фамилия, имя, отчество, адрес и дата поступления на работу (месяц, год). Напечатать фамилию, имя, отчество и адрес каждого из сотрудников, проработавших в фирме на сегодняшний день уже не менее трех лет. День месяца не учитывать (при совпадении месяца поступления с текущим месяцем считать, что прошел полный год).
  3.  Известна информация о багаже и личные данные (количество вещей и общий вес багажа) 24 пассажиров. Найти число пассажиров, имеющих более двух вещей и вывести их фамилии на экран.
  4.  Известна информация о багаже (количество вещей и общий вес багажа) и личные данные 24 пассажиров. Найти число пассажиров, у которых количество вещей превосходит среднее число вещей всех пассажиров, а также вывести их фамилии на экран.
  5.  Известна информация о багаже (количество вещей и общий вес багажа) и личные данные 24 пассажиров. Вывести на экран фамилию пассажира, в багаже которого средний вес одной вещи отличается от общего среднего веса одной вещи не более чем на 0,5 кг.
  6.  Известно расписание поездов, проходящих через станцию: номер поезда, назначение (откуда — куда, например, «Москва — Омск»), часы и минуты прибытия, часы и минуты отправления. Значения часов и минут — целые величины; число часов не превышает 23, число минут — 59. Общее число проходящих поездов равно 25, Поезда приходят каждый день. По данному времени определить, какие поезда (номер и назначение) стоят в этот момент на станции.

Теоретический материал и методические указания

Тип множество

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

  •  неупорядоченный набор: к элементам множества нельзя обратиться по номеру (в отличие от элементов массива) и порядок элементов не имеет значения. Рассмотрим два множества [1, 7, 4] и [1, 4, 7], они состоят из одинаковых элементов, поэтому считаются одинаковыми (эквивалентными).
    •  различные элементы одного типа: все элементы множества относятся к одному типу данных, например, можно определить множество символов или множество чисел из диапазона 1..20, но смешивать их нельзя. При этом все элементы множества должны быть различны, предположим мы хотим добавить к множеству [1, 3] два элемента 13 и 3, в итоге мы получим множество [1, 3, 13], а не [1, 3, 13, 3].

Переменная типа множество объявляется в разделе объявления переменных следующим образом:

var  <имя переменной> : set of  <базовый тип>;

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

set ofключевые слова, предназначенные для объявления множеств.

<базовый тип> -  тип элементов множества.

Пример 1.

Объявление переменных типа множество.

var   MySet1 : set of  char;

       MySet2 : set of 'A'..'Z';

       MySet3 : set of byte;

       MySet4 : set of 20..50;

Обратите внимание, элементами обеих переменных-множеств MySet1 и MySet2 могут быть символы, но элементами множества MySet1 могут быть все символы (определяемые таблицей ASCII), а элементами MySet2 – только заглавные английские буквы. При таком объявлении переменных определяется только тип элементов множества и количество памяти, которое необходимо выделить под переменные – множества. Заполнение множества будет происходить в самой программе.

Аналогичная ситуация возникает и для переменных  MySet3 и MySet4, MySet3 может содержать элементы из диапазона 0..255, а MySet4 - только элементы из диапазона 20..50.

В теле программы (разделе операторов) перед началом работы с переменными MySet1, MySet2, MySet3 и MySet4 необходимо определить их значение. Например:

   MySet1:=[ '+' , '-' , 'A' , 'B' , '*' , 'c' , 'x' ];

   MySet2:=[ 'A' .. 'D' ];

   MySet3:=[ 0..9, 27,21 ];

   MySet4:=[ ];

Квадратные скобки [ ] называют конструктором множества.

Элементы множеств  можно записывать через запятую, если нужно включить в множество несколько подряд идущих элементов, например, буквы 'A', 'B', 'C', 'D' или цифры от 0 до 9, то можно указать их в виде диапазона 'A' .. 'D'  или 0..9.

Множество MySet4 не содержит элементов, иначе говоря, является пустым множеством.

Операции над множествами

Таблица 6.1

Операция

Описание

=

Равенство (эквивалентность, тождественность).

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

<>

Неравенство. Два множества считаются неравными, если они отличаются хотя бы одним элементом или их количеством.

>=  (>)

Включение (строгое включение). Если все элементы множества В содержатся в множестве А, тогда результатом выражения А >= B будет значение True и говорят, что B является подмножеством А (содержится в А).

<=  (<)

Включение (строгое включение). Если все элементы множества А содержатся в множестве B, тогда результатом выражения А <= B будет значение True и говорят, что A является подмножеством B (содержится в B).

+

Объединением двух множеств является третье множество, содержащее элементы обоих множеств.

[ 1, 2, 3, 4 ] + [ 3, 4, 5 ] = [ 1, 2, 3, 4, 5 ]

*

Пересечением двух множеств является третье множество, которое содержит элементы, входящие одновременно в оба множества.

[1 ,2, 3]* [ 3, 4, 5 ] = [3]

-

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

[1, 2, 3] -[3, 4, 5] = [1, 2]

in

Используется для проверки принадлежности какого-нибудь значения указанному множеству. Оператор in часто позволяет значительно упростить сложные условные выражения. Например, следующий оператор if :

if ( (i = 0) or (i = 1) or (i = 2)) and ((j= 3) or (j = 4) or (j = 5 ) ) then ...

можно переписать в виде

if (i in [0..2]) and (j in [3..5]) then ...

Пример 2.

Пользователь вводит десять чисел из диапазона 0..255. Необходимо сформировать два множества: первое – из первых шести чисел, второе – из оставшихся четырех. Сформировать третье множество, являющееся пересечением этих множеств и вывести его на экран.

var   s1,s2,res : set of byte;

     i:byte;

     x :integer;

begin

 s1:=[]; s2:=[];

 i:=0;

 writeln('Введите элементы первого множества');

 repeat

   readln(x);

   if (x>=0) and (x<=255)

     then begin

       s1:=s1+[x];

       inc(i);

     end

     else writeln('неверное число');

  until (i=6);

 writeln('Введите элементы второго множества');

  i:=0;

  repeat

   readln(x);

   if (x>=0) and (x<=255)

     then begin

       s2:=s2+[x];

       inc(i);

     end

     else writeln('неверное число');

  until (i=4);

  res:=s1*s2;  {нахождение пересечения двух множеств}

  write('Пересечение множеств равно  ', '[');

  for i:=0 to 255 do

    if i in res then write(i, '  ');

  writeln(']');

  readln;

end.

Заполнение множества с клавиатуры

Пользователь вводит число х, если это число удовлетворяет условию (x>=0) and (x<=255), то выполняется оператор s1:=s1+[x]. Запись s1:=s1+[x]; означает следующее: выполняется объединение множества s1 (операция +) с множеством, состоящим из одного элемента - [x], результат снова присваивается переменной s1, таким образом, происходит добавление элемента  х  к множеству s1.

Вывод множества на экран

Т.к. элементы множества не упорядочены и к ним нельзя обратиться по номеру, то вывод элементов множества происходит иначе, чем вывод на экран элементов массива. Следует в цикле перебрать все возможные значения элементов множества (в примере множества s1, s2 и res могут содержать элементы из диапазона 0..255), затем нужно проверить содержится ли каждый элемент в данном множестве, и если содержится, вывести его на экран.

  for i:=0 to 255 do  {перебираем все потенциальные элементы множества}

    if i in res             { проверяем содержится ли элемент во множестве}

       then write(i, ' ');    { если да- выводим на экран}

В предыдущем примере рассматривалось множество MySet2 : set of 'A'..'Z' – множество заглавных английских букв. Пусть в разделе операторов оно некоторым образом заполняется (например, значения элементов вводит пользователь), для вывода на экран элементов множества MySet2, нужен следующий код:

for i:='A' to 'Z' do

    if ( i   in  MySet2) then write(i, '  ');  

где i – переменная типа char.

Пример 3.

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

uses   SysUtils,Windows;

var   MyStr:string;

     i,count:integer;

begin

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 writeln('Введите строку');

 readln(MyStr);

 count:=0;

 for i:=1 to length(MyStr) do

   begin

     if MyStr[i] in ['у', 'е', 'ы', 'а', 'о', 'э', 'я', 'и', 'ю']

       then inc(count);

   end;

 writeln(count);

  readln;

end.

Обратите внимание, что для корректной работы с русскими буквами нужно подключить модуль Windows и соответствующие функции (подробнее см. лабораторную работу №1). В отличие от предыдущих примеров в данном не объявляется переменная типа множество, а при проверке символов строки используется конструктор множества с необходимыми для решения задачи элементами: ['у', 'е', 'ы', 'а', 'о', 'э', 'я', 'и', 'ю']. Такой вариант работы с множествами очень распространен и используется в том случае, когда множество не нужно хранить или неоднократно к нему обращаться.

Тип запись

В отличие от массивов, которые используются для объединения однотипных данных, тип запись предназначен для объединения данных различных типов. Например, требуется хранить следующую информацию о сотрудниках фирмы:

  •  фамилия, имя, отчество – строковый тип;
    •  должность – строковый тип;
    •  дата приема на работу (год) – целочисленный тип;
    •  дата рождения (год) – целочисленный тип;
    •  пол – тип char.

Такие данные нельзя объединить в массив, т.к. они относятся к различным типам. Конечно, можно объявить пять различных переменных и работать с ними, но если потребуется хранить  и  обрабатывать информацию не по одному сотруднику, а например по трем, то работать с отдельными переменными будет неудобно. Поэтому объявим тип запись:

type Man=record 

          name : string;

          dolgn : string;

          data1 : word;

          data2 : word;

          pol : char;

      end;

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

Теперь можно объявить переменные типа запись:

var  m1, m2, m3: Man;

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

К полю записи можно обратиться, указав сначала имя самой записи, потом через точку  - название поля. Например:

m1.name 

m2.pol

m1.data1   и т.п.

С полями записи можно выполнять все операции, определенные для величин данного типа. Например, m1.data1 – целочисленная  величина и работать с ней можно также как и с любой переменной целого типа.

С переменными типа запись в целом можно выполнять только операции присваивания: m1:=m2; все остальные операции выполняются с полями записи. Например, требуется организовать ввод данных по сотруднику с клавиатуры.

writeln(‘Введите ФИО сотрудника’);

readln (m1.name);

writeln(‘Введите название должности’);

readln (m1.dolgn);

writeln(‘Введите год приема на работу’);

readln (m1. data1);

writeln(‘Введите год рождения’);

readln (m1. data2);

writeln(‘Введите пол’);

readln (m1. pol);

Для более удобной работы с  полями записей предназначен оператор with.  Синтаксис оператора with:

with <имя_записи> do <оператор>;

При этом в рамках <оператора> к полям записи с именем <имя_записи> можно обращаться только по названию поля. Обратите внимание, что в операторе with (как и в операторах for, while, if) можно выполнить только один оператор, поэтому, если нужно выполнить несколько операторов, следует использовать операторные скобки. Предыдущий пример можно переписать следующим образом:

with  m1 do

 begin

     writeln(‘Введите ФИО сотрудника’);

     readln (name);

     writeln(‘Введите название должности’);

     readln (dolgn);

     writeln(‘Введите год приема на работу’);

     readln (data1);

     writeln(‘Введите год рождения’);

     readln (data2);

     writeln(‘Введите пол’);

     readln (pol);

end;

Пример 4.

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

type Man=record

          name : string;

          dolgn : string;

          data1 : word;

          data2 : word;

          pol : char;

      end;

var  m1, m2, m3: Man;

      s1, s2, s3: integer;

begin

 with  m1 do

 begin

     writeln(‘Введите ФИО первого сотрудника’);

     readln (name);

     writeln(‘Введите название должности’);

     readln (dolgn);

     writeln(‘Введите год приема на работу’);

     readln (data1);

     writeln(‘Введите год рождения’);

     readln (data2);

     writeln(‘Введите пол’);

     readln (pol);

 end;

 with  m2 do

 begin

     writeln(‘Введите ФИО второго сотрудника’);

     readln (name);

     writeln(‘Введите название должности’);

     readln (dolgn);

     writeln(‘Введите год приема на работу’);

     readln (data1);

     writeln(‘Введите год рождения’);

     readln (data2);

     writeln(‘Введите пол’);

     readln (pol);

 end;

 with  m3 do

 begin

     writeln(‘Введите ФИО третьего сотрудника’);

     readln (name);

     writeln(‘Введите название должности’);

     readln (dolgn);

     writeln(‘Введите год приема на работу’);

     readln (data1);

     writeln(‘Введите год рождения’);

     readln (data2);

     writeln(‘Введите пол’);

     readln (pol);

 end;

 s1:=2008-m1.data1;

 s2:=2008-m2.data1;

 s3:=2008-m3.data1;

 if (s1>s2) and (s1>s3) then  writeln(m1.name, ' ', s1);

 if (s2>s1) and (s2>s3) then  writeln(m2.name, ' ', s2);

 if (s3>s1) and (s3>s2) then  writeln(m3.name, ' ', s3);

 readln;

end.

Результат работы программы:

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

Массивы переменных типа запись

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

Пример 5.

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

type Man=record

          name : string;

          dolgn : string;

          data1 : word;

          data2 : word;

          pol : char;

      end;

var  mass:array [1..100] of Man;

      count,min, nmin,i : integer;

begin

  writeln('Введите количество сотрудников');

 readln(count);

 for i:=1 to count do

   begin

      writeln('Введите ФИО ', i  ,' -го  сотрудника');

      readln (mass[i].name);

      writeln('Введите должность');

      readln (mass[i].dolgn);

      writeln(' Введите год приема на работу');

      readln (mass[i].data1);

      writeln('Введите год рождения');

      readln (mass[i].data2);

      writeln('Введите пол');

      readln (mass[i].pol);

   end;

   min:=mass[1].data1;

   nmin:=1;

   for i:=2 to count do

     if (mass[i].data1< min)

     then begin

       min:=mass[i].data1;

       nmin:=i;

     end;

  writeln('Максимальный стаж ', mass[nmin].name, '  ', 2008-min);

  readln;

end.

В данной программе вводится массив величин типа запись. Чтобы число сотрудников не было фиксированным (как в предыдущем примере) объявлен массив с большим количеством элементов (100). Теперь пользователь может сам определить количество сотрудников фирмы (переменная count). Поэтому конечное значение параметра циклов в программе равно не 100, а count, остальные, не заполненные элементы массива просто не рассматриваются.

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

Контрольные вопросы

  1.  Что такое множество?
  2.  Какие множества называются эквивалентными?
  3.  Какие типы данных могут быть базовыми для множеств?
  4.  Могут ли быть элементами одного множества величины разных типов?
  5.  Как определяются переменные типа множество?
  6.  Какие операции определены для множеств?
  7.  Как определить принадлежность элемента множеству?
  8.  Можно ли организовать заполнение множества пользователем (т.е. вводить элементы множества с клавиатуры)?
  9.  Как организовать добавление элемента к множеству?
  10.  Какое множество называют пустым? Как его задать в программе?
  11.  Можно ли использовать в программе множества без определения их в разделе объявления переменных? Если да, то каким образом?
  12.  Как можно вывести множество на экран?

Примерный вариант контрольной работы

  1.  Пользователь вводит с клавиатуры два числовых множества, в первом – 5 элементов, во втором – 7. Проверить, содержится ли первое множество во втором.
  2.  Даны два символьных множества  A=[‘a’,’v’,’d’,’r’,’y’] и B=[‘s’..’z’]. Сформировать новое множество, состоящее из элементов, принадлежащих и множеству А и множеству В.  Вывести новое множество на экран.
  3.  Известны данные о 20 студентах: ФИО, пол, год рождения, место жительства. Определить:
    •  есть ли среди них иногородние студенты;
    •  ФИО самой младшей студентки.


Лабораторная работа №7. Подпрограммы в языке программирования Паскаль

Требования к лабораторной работе 

После выполнения лабораторной работы обучаемый должен:

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

Задания к лабораторной работе

Группа А

Задание №1

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

.

  1.  Рассчитать значение х, определив необходимую функцию. .
  2.  Рассчитать значение у, однотипные действия, выполняя с использованием соответствующей функции .
  3.  Рассчитать значение у, однотипные действия, выполняя с использованием соответствующей функции .
  4.  Рассчитать значение , определив функцию        min(x, у) - минимальное из чисел х, у.
  5.  Рассчитать значение  , определив функцию

 

Значения х и y  вводятся с клавиатуры.

Задание №2

Описать процедуру, которая

  1.  Выводит на экран каждый второй символ строки s.
  2.  Выводит на экран таблицу умножения.
  3.  Выводит на экран предложение s ровно k-раз.
  4.  Выводит на экран двумерный массив.
  5.  Выводит на экран символ ch 5 раз, через пробел или в столбик (способ вывода определяется вторым параметром).
  6.  Выводит на экран все буквы «е»  строки s.

Задание №3

Задание выполняется для всех вариантов полностью.  

Требуется описать процедуры MyInc и MyDec (аналогичные стандартным процедурам), которые имеют два параметра x и k, результатом выполнения процедур должно быть увеличение/уменьшение первого параметра на величину k.

Группа В

Задание №1

  1.  Найти периметр фигуры ABDС по заданным сторонам АВ, АС и DC. Определить функцию для расчета гипотенузы прямоугольного треугольника по его катетам.  

  1.  Даны основания и высоты двух равнобедренных трапеций. Найти сумму их периметров. Определить функцию для расчета периметра равнобедренной трапеции по ее основаниям и высоте.
  2.  Найти периметр треугольника, заданного координатами своих вершин.  Определить функцию для расчета длины отрезка по координатам его вершин.
  3.  Даны две последовательности целых чисел:  и   . Найти количество четных чисел в первой из них и количество нечетных во второй. Определить функцию, позволяющую распознавать четные числа.
  4.  Даны натуральное число n и целые числа . Найти количество чисел  (i = 1, 2, ..., n), являющихся степенями пятерки. Определить функцию, позволяющую распознавать степени пятерки.
  5.   Даны два натуральных числа. Выяснить, в каком из них сумма цифр больше. Определить функцию для расчета суммы цифр натурального числа.

Задание №2

Определить процедуры, необходимые для решения следующих задач:

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

Задание №3

  1.  Даны два предложения. Найти общее количество букв «н» в них. Определить функцию для расчета количества букв «н» в предложении.
  2.  Составить программу для нахождения общего количества вхождений заданной буквы в трех заданных предложениях. Определить функцию для расчета количества вхождений некоторой буквы в предложение.
  3.  Даны два предложения. В каком из них доля (в %) вхождений букв «б» больше? Определить функцию для расчета доли вхождений некоторой буквы в предложение.
  4.  Даны два предложения, в которых имеются буквы «ш». Найти, в каком из них эта буква имеет больший порядковый номер (при счете от начала предложения). Если в предложении имеется несколько букв «ш», то должна быть учтена последняя из них. Определить функцию для нахождения порядкового номера последнего вхождения в предложение некоторой буквы.
  5.  Даны три слова. Выяснить, является ли хоть одно из них  «перевертышем», т. е. таким, которое читается одинаково слева направо и справа налево. Определить функцию, позволяющую распознавать слова-палиндромы.
  6.  Заданы три слова. Проверить, все ли буквы в словах различны. Определить функцию, позволяющую проверять, есть ли в слове повторяющиеся буквы.

Группа С

Задание №1

  1.  Найти периметр фигуры ABDС по заданным сторонам АВ, АС и DC. Определить функцию для расчета гипотенузы прямоугольного треугольника по его катетам.  

  1.  Даны основания и высоты двух равнобедренных трапеций. Найти сумму их периметров. Определить функцию для расчета периметра равнобедренной трапеции по ее основаниям и высоте.
  2.  Найти периметр треугольника, заданного координатами своих вершин.  Определить функцию для расчета длины отрезка по координатам его вершин.
  3.  Даны две последовательности целых чисел:  и   . Найти количество четных чисел в первой из них и количество нечетных во второй. Определить функцию, позволяющую распознавать четные числа.
  4.  Даны натуральное число n и целые числа . Найти количество чисел  (i = 1, 2, ..., n), являющихся степенями пятерки. Определить функцию, позволяющую распознавать степени пятерки.
  5.   Даны два натуральных числа. Выяснить, в каком из них сумма цифр больше. Определить функцию для расчета суммы цифр натурального числа.

Задание №2

Задание выполняется для всех вариантов полностью.

  1.  Даны натуральные числа а и b. Найти их наименьшее общее кратное. Определить функцию для расчета наибольшего общего делителя двух натуральных чисел, используя алгоритм Евклида.
  2.  Даны натуральные числа а и b, обозначающие соответственно числитель и знаменатель дроби. Сократить дробь, т. е. найти такие натуральные числа р и q, не имеющие общих делителей, что p/q = a/b. Определить функцию для расчета наибольшего общего делителя двух натуральных чисел, используя алгоритм Евклида.

Задание №3

Определить процедуры и функции, необходимые для решения следующих задач:

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

Задание №4

  1.  Написать рекурсивную функцию вычисления суммы цифр натурального числа.
  2.  Написать рекурсивную функцию вычисления количества цифр натурального числа.
  3.  Даны первый член и разность арифметической прогрессии. Написать рекурсивную функцию для нахождения: n-го члена прогрессии.
  4.  Даны первый член и знаменатель геометрической прогрессии. Написать рекурсивную функцию: нахождения ее n-го члена прогрессии.
  5.  Написать рекурсивную функцию для вычисления k-гo члена последовательности Фибоначчи. Последовательность Фибоначчи образуется по закону:
  6.  Написать рекурсивную процедуру для вывода на экран цифр натурального числа в обратном порядке.

Теоретический материал и методические указания

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

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

inc(i); dec(i);                                                         {вызов процедур}

y:=abs(x);  z:=cos(2*x)+sin(y);                            {вызов функций}

Иначе говоря, и в  процедурах и в функциях выполняется некоторый набор операторов, при этом функция всегда должна вернуть некоторое значение. Например, функция abs(x) возвращает значение, равное модулю аргумента х, которое можно присвоить некоторой переменной, использовать при вычислении выражений или просто вывести на экран.

Синтаксис описания процедур и функций.

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

procedure <имя_процедуры> [(список параметров)];         { заголовок }

    разделы описаний

begin

    раздел операторов

end;

function <имя_функции> [(список параметров)] :

                                                           <тип_возвращаемого_значения>;

    разделы описаний

begin

   <имя_функции>:=<выражение>;

end;

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

Пример 1.

Требуется описать функцию, аналогичную стандартной функции abs(), вычисляющей модуль целого числа.

Назовем функцию MyAbs. Модуль числа вычисляется по формуле

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

Если при написании подпрограммы возникает необходимость использования вспомогательных переменных, их можно объявить внутри подпрограммы. Такие переменные называются локальными (в примере – переменная res). Локальные переменные доступны только внутри тела той подпрограммы, в которой они объявлены и не видны в основной программе, а также других процедурах и функциях. Переменные объявленные в самой программе называются глобальными (в примере – a и b).

Последним оператором в теле функции обычно является оператор <имя_функции>:=<выражение>;. Такой оператор обеспечивает возвращение функцией требуемого значения. В примере это оператор MyAbs:=res;.

Обратите внимание, что при объявлении функции параметр, передаваемый в нее называется  z, а при вызове функции в нее передается переменная а. Параметры, которые указываются при объявлении подпрограммы называются формальными и  играют роль псевдонимов для реальных (фактических) параметров. Иначе как узнать, переменную с каким именем передаст в подпрограмму пользователь? Во все подпрограммы можно передать переменные с произвольными именами, а в большинство подпрограмм и  выражения. Например: z:=abs(x);  z:=abs(y);  y:=abs(d-2); y:=abs(sqrt(x)-z);  и т.п.

Пример 2.

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

function Mod3(x:integer):boolean;

begin

 if (x mod 3=0)  then Mod3:=true else Mod3:=false;

end;

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

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

Пример 3.

Написать процедуру, которая выводит на экран элементы одномерного массива.

const n=10;

type TArray=array [1..n] of byte;

var a : TArray;

     i:integer;

procedure PrintArray(mas:TArray);

var j:integer;

begin

 for j:=1 to n do

  write(mas[j],' ');

end;

begin

 Randomize;

 for i:=1 to n do

   a[i]:=random(100);

 PrintArray(a);

 readln;

end.

Одним из способов передачи массива в качестве аргумента подпрограммы является объявление пользовательского типа (в примере TArraу). Для определения размера массива используется константа n, которая является границей цикла for и в процедуре, и в основной программе.

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

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

Какие проблемы могут возникнуть при использовании константы n в работе данной программы? Например, если предоставить пользователю возможность определять размер массива, то константа n должна быть достаточно велика, например n=1000. 

const n=1000;

type TArray=array [1..n] of byte;

var a:TArray;

   i,k:integer;

begin

 writeln('Введите размер массива');

 readln(k);

 Randomize;

 for i:=1 to k do

   a[i]:=random(100);

 …

end.

Возникает вопрос, как сообщить процедуре о действительном размере  массива? В подобной ситуации следует передать его подпрограмме в качестве параметра.

const n=1000;

type TArray=array [1..n] of byte;

var a:TArray;

   i,k:integer;

procedure PrintArray(mas:TArray; size:byte);

var j:integer;

begin

 for j:=1 to size do

  write(mas[j],' ');

end;

begin

 writeln('Введите размер массива');

 readln(k);

 Randomize;

 for i:=1 to k do

   a[i]:=random(100);

 PrintArray(a,k);

 readln;

end.

Пример 4.

Написать процедуру, которая удваивает переданный в нее аргумент.

Процедуры и функции могут изменять значение переданных им параметров. Например, стандартная процедура для работы со строками Delete(s : string; ind, count : integer); меняет значение параметра s.

var y:real;

//-----------------------

procedure Double_(x:real);

begin

 x:=x*2;

end;

//-----------------------

begin

 readln(y);

 Double_(y);

 writeln(y:2:2);

 readln;

end.

При запуске данной программы получим следующее:

Т.е. удвоения значения переменной, переданной в подпрограмму,  не произошло. Почему? Способ передачи параметров в подпрограмму, который был приведен в предыдущих примерах, называется передачей по значению. Если в процедуру или функцию передается параметр-значение, то внутри подпрограммы создается копия этого параметра и все операции осуществляются только с копией,  саму переданную переменную изменения не затрагивают (в примере – переменную у).

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

var y:real;

//-----------------------

procedure Double_(var x:real);

begin

 x:=x*2;

end;

//-----------------------

begin

 readln(y);

 Double_(y);

 writeln(y:2:2);

 readln;

end.

Результат работы программы:

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

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

procedure Double_(x:real);

begin

 x:=x*2;

end;

можно передать параметры как вещественного так и целого типов, а в процедуре

procedure Double_(var x:real);

begin

 x:=x*2;

end;

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

Пример 5.

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

У данной процедуры должно быть два параметра:

  •  строка, которую нужно вывести на экран;
    •  число, показывающее сколько раз должна быть выведена строка.

procedure PrintN(s:string;n:byte);

var i:byte;

begin

 for i:=1 to n do

   writeln(s);

end;

Если в подпрограмму нужно передать произвольную строку, то можно воспользоваться типом string как и любым стандартным типом. Если же нужно передать строку ограниченной длины, то следует объявить пользовательский тип, например:

type MyString= string[20];

и в подпрограмму передавать аргумент типа MyString (аналогично примеру №3) .

Контрольные вопросы 

  1.  Что такое подпрограмма? Каково ее назначение?
  2.  Какие типы подпрограмм есть в языке программирования Паскаль?
  3.  Из каких элементов состоит заголовок процедуры (функции)?
  4.  Какое количество значений может вернуть функция? Какого типа значения может вернуть функция?
  5.  В чем отличие фактических и формальных параметров подпрограмм?
  6.  В чем отличие глобальных и локальных переменных?
  7.  Каких правил нужно придерживаться при описании подпрограмм?
  8.  В каких ситуациях лучше использовать процедуры, а в каких функции?
  9.  В чем особенность передачи параметров по значению?
  10.  В чем особенность передачи параметров - констант?
  11.  При каком способе передачи параметров создается копия передаваемого значения?
  12.  Каким образом можно передавать в подпрограмму массивы и строки?

Примерный вариант контрольной работы

  1.  Рассчитать значение х, определив необходимую функцию. .
  2.  Составить программу, в результате которой величина А меняется значением с величиной В, а величина С — с величиной D. Определить процедуру, осуществляющую обмен значениями двух переменных величин.
  3.  Даны стороны двух треугольников. Найти сумму их периметров и сумму их площадей. Определить процедуры для расчета периметра и площади треугольника по его сторонам.
  4.  Определить функцию  и найти значение выражения .


Список вопросов к экзамену (зачету)

  1.  Алфавит языка программирования Паскаль.
  2.  Структура программы. Понятие констант, типов, переменных и выражений в программировании.
  3.  Система стандартных типов языка. Целые типы.
  4.  Система стандартных типов языка. Вещественные типы.
  5.  Система стандартных типов языка. Символьный тип. Логический тип.
  6.  Простые типы данных, определяемые программистом. Тип диапазон. Перечисляемый тип.
  7.  Система стандартных типов языка. Порядковые типы данных. Приведение типов.
  8.  Основные отношения, операции и функции. Приоритет операций и отношений в выражениях. Преобразования и совместимость типов в выражениях.
  9.  Простые операторы Паскаля. Процедурные операторы: процедуры ввода и вывода.
  10.  Структурные операторы Паскаля. Условный оператор. Оператор выбора.
  11.  Операторы цикла. Основные понятия и определения. Оператор цикла с параметром.
  12.  Операторы цикла с предусловием и постусловием.
  13.   Операторы цикла. Преобразование одних циклов в другие.
  14.  Структурированные типы данных. Одномерные массивы.
  15.  Структурированные типы данных. Многомерные массивы.
  16.  Тип строка. Процедуры и функции для работы со строками.
  17.  Тип множество. Процедуры и функции для работы с множествами.
  18.  Тип запись. Работа с полями. Оператор with.
  19.  Подпрограммы в языке программирования Паскаль. Основные попятия и определения. Различия функции и процедуры в описании и в использовании.
  20.  Глобальные и локальные переменные. Область видимости и время жизни.
  21.  Подпрограммы в языке программирования Паскаль. Список формальных и фактических параметров, передача данных по значению и по адресу.
  22.  Подпрограммы в языке программирования Паскаль. Способы передачи в подпрограммы одномерных, многомерных массивов и строк.
  23.  Подпрограммы в языке программирования Паскаль. Параметры процедурного типа.


Рекомендуемая литература

  1.  Павловская Т.А. Паскаль. Программирование на языке высокого уровня. – СПб.: Питер, 2006. – 317 с.
  2.  Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. – М.: Издательство «ОМД Гупп», 2003. – 616 с.
  3.  Епашенников А.М., Епашенников В.А. Turbo Pascal 7.0.  – М.: Диалог МИФИ, 1998. – 367 с.
  4.  Златопольский Д. М.  Я иду на урок информатики: Задачи по программированию. – М: Издательство «Первое сентября», 2001. – 208 с.
  5.  Фленов М. Е. Библия Delphi. –  СПб.: БХВ-Петербург, 2004. –  880 с.
  6.  Бобровский С. И. Delphi. Учебный курс. – Спб.: Питер, 2005. – 736 с.


Использованная литература

  1.  Златопольский Д. М.  Я иду на урок информатики: Задачи по программированию. – М: Издательство «Первое сентября», 2001. – 208 с.
  2.  Абрамов С. А., Гнездилова Г. Г., Капустина Г. Г., Селюн М. И. Задачи по программированию. – М.: Наука, 1988. – 186 с.
  3.  Павловская Т.А. Паскаль. Программирование на языке высокого уровня. – СПб.: Питер, 2006. – 317 с.
  4.  Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. – М.: Издательство «ОМД Гупп», 2003. – 616 с.
  5.  Епашенников А.М., Епашенников В.А. Turbo Pascal 7.0.  – М.: Диалог МИФИ, 1998. – 367 с.
  6.  Фленов М. Е. Библия Delphi. –  СПб.: БХВ-Петербург, 2004. –  880 с.
  7.  Бобровский С. И. Delphi. Учебный курс. – Спб.: Питер, 2005. – 736 с.
  8.  Дарахвелидае П. Г., Марков Е. П. Программирование в Delphi 7. – СПб.: БХВ-Петербург, 2003. – 784 с.
  9.  Архангельский А.Я. Разработка прикладных программ для Windows в Delphi 5. –  М.: ЗАО «Издательство БИНОМ», 1999. – 256 с.
  10.  Пестриков В.М., – Маслобоев А.Н. Delphi на примерах.  –  СПб.: БХВ-Петербург, 2005. –  496 с.


?

(?,?)

?

(?,?)

?

(?,?)

?

(?,?)

?

(?,?)

?

(?,?)

?

(?,?)

?

?

(?,?)

?

(?,?)

?

?

(?,?)

?

?

(?,?)

?

(?,?)

?

?

(?,?)

?

?

(?,?)

(?,?)

?

z

w

h

(X0,Y0)

(X1,Y1)

r

(X2,Y2)

a

?

(?,?)

?

(?,?)

?

(?,?)

?

(?,?)

?

(?,?)

?

?

(?,?)

?

?

(?,?)

(?,?)

?

?

(?,?)

?

(?,?)

?

?

(?,?)

(?,?)

?

(?,?)

?

?

(?,?)

?

?

(?,?)

?

?

(?,?)

?

(?,?)

?

  1.  



1. Эффективное управление- Эксмо; Москва; 2006 ISBN 5699176007 1902825756 Оригинал- Kte Keenn ldquo;The Mngement Guide to Mngingrdquo; А
2. 1] 1 Грамматический [2
3. ЗАТВЕРДЖУЮ Директор Нікопольського коледжу ДДАУ О
4. В настоящее время международные экономические отношения утвердились и реализуются в следующих основных ф
5. Задание 1 На рисунках а и б изобразите блоксхему установки лабораторного диализа и схему работы диализато
6. РЕФЕРАТ Дисертації на здобуття наукового ступеня Кандидата медичних наук Київ 1999
7. а С лицом ищущим работу заключается на профессиональное обучение а с работником ~ на обучение или переоб
8. Российский государственный профессиональнопедагогический университет Институт экономики и управлени
9. реферат дисертації на здобуття наукового ступеня кандидата технічних наук Харків
10. реферат дисертації на здобуття наукового ступеня кандидата медичних наук Хар
11. Финансовая отчетность предприятия и её значение
12. Вам пропонується відповісти на 75 питань
13. Организация работ по ремонту кровли
14. Тема 16 ЭЛЕМЕНТЫ ОПЕРАЦИОННОГО ИСЧИСЛЕНИЯ Лекция 1.html
15. технологии могут применяться в виде компьютерных программ слайдфильмов презентаций [1]
16. Создание источника света Trget Spot Рис
17. Статья- Анализ международного опыта реструктуризации предприятий «Индустриальной экономики»
18. Основные пути снижения издержек при осуществлении операций по складированию продукции
19. Виды хромосом человека
20. Особенности Российского менеджмента