- •Практикум по Турбо Паскалю
- •Первые занятия Первое знакомство с системой программирования Турбо Паскаль
- •Команды редактора
- •Задания
- •Режим помощи
- •Первая программа
- •Запуск программы
- •Сохранение программы
- •Выход из системы программирования Турбо Паскаль
- •Простейшие линейные программы
- •Арифметический квадрат. Абсолютная величина
- •Целый и логический типы данных Условный оператор
- •Логический тип данных
- •Условный оператор
- •Вложенные операторы условия
- •Целый тип данных. Цикл с параметром
- •Цикл с параметром (разбор на примере)
- •Работа с окнами. Метод пошагового выполнения программ
- •Работа с окнами
- •Решение задач с использованием цикла с параметром
- •Вопросы для обсуждения
- •Трассировка примера
- •Цикл с постусловием
- •Алгоритм Евклида
- •Вложенные циклы
- •Решение задач с использованием циклов с условием
- •Простые типы данных
- •Задания
- •Решение задач
- •Вещественный тип данных
- •Задание
- •Решение задач
- •Ограниченный, перечисляемый типы данных. Оператор варианта
- •Ограниченный тип данных
- •Оператор варианта
- •Перечисляемый тип данных
- •Решение задач
- •Описание переменных, констант и типов Раздел описания констант
- •Раздел описания переменных
- •Раздел описания типов
- •Решение задач
- •Преобразование типов. Совместимость типов
- •Задания
- •Решение задач
- •Решение задач
- •Контрольные работы Контрольная работа №1
- •Контрольная работа №2
- •Основы Паскаля
- •X y22m размер gamma alfa r15
- •Процедуры и функции
- •Описание процедур и функций
- •Файловый тип
- •Описание файлового типа
- •Подпрограммы
- •Процедура Assign
- •Процедура Reset
- •Процедура Rewrite
- •Процедура Write
- •Процедура Close
- •Функция FileSize
- •Функция FilePos
- •Текстовые файлы
- •Описание текстового файла
- •Консоль
- •Устройства
- •Соответствие текстовых файлов и логических устройств
- •Операции над текстовыми файлами
- •Процедура Assign
- •Процедура Reset
- •Процедура Rewrite
- •Процедура Append
- •Процедура Close
- •Функция Eof
- •Функция SeekEof
- •Блочные файлы Описание типа блочного файла
- •Процедура BlockRead
- •Процедура BlockWrite
- •Операции ввода-вывода
- •Регулярные типы данных Одномерные массивы. Работа с элементами
- •Способы задания одномерных массивов
- •Работа с элементами массива (разбор на примерах)
- •Методы работы с элементами одномерного массива Изменение значения некоторых элементов
- •Создание массива
- •Работа с несколькими массивами
- •Удаление элементов из одномерного массива Удаление элемента
- •Вставка элементов в одномерный массив Вставка одного элемента
- •Вставка нескольких элементов
- •Перестановка элементов массива
- •Перестановка части массива
- •Найти сумму элементов
- •Работа с несколькими массивами
- •Двумерный массив. Работа с элементами Изменение значений некоторых элементов, удовлетворяющих заданному свойству
- •Заполнение двумерного массива по правилу.
- •Вставка и удаление элементов двумерного массива
- •Перестановка элементов массива
- •Комбинированный тип данных (записи)
Перестановка элементов массива
Перестановка двух элементов
Пример 14
Поменять местами два элемента массива А с заданными координатами (номерами строки и столбца).
Решение
Можно эту задачу решить несколькими способами.
Способ 1 - по аналогии с перестановкой в одномерном массиве, когда в процедуру передаются индексы элементов и массивов, в котором надо их поменять. Тогда процедура может быть такой:
Procedure Swap1(k1, l1, k2, l2: Integer; Var x: dmyarray); Var c : Integer; Begin c:=x[k1,l1]; x[k1,l1]:=x[k2,l2]; x[k2,l2]:=x; End;
Способ 2. Вспомним процедуру Swap, которая меняет местами значения двух целых переменных.
Procedure Swap(Var x, y: Integer); Var z : Integer; Begin z:=x; x:=y; y:=z; End;
А теперь обратимся к ней, передавая данные элементы: Swap(A[k1,l1], A[k2,l2]).
Рассмотрим задачу о перестановке двух столбцов(строк), так как многие задачи используют это действие.
Пример 15
Поменять местами столбцы с номерами 11 и 12.
Эту задачу также можно реализовать несколькими способами. Мы составим процедуру. Ей будем отправлять номера этих столбцов и массив, в котором надо выполнить это действие. Кроме того, добавим проверку корректности ввода данных номеров, так как если столбца с данным номером нет, то и переставлять ничего не надо. В самой процедуре можно использовать любую из процедур примера 1, например Swap.
Procedure Swap2(l1, l2: Integer; Var x: dmyarray); Var i : Integer; Begin If ((l1<1) Or (l1>m)) Or ((l2<1) Or (l2>m)) Then Writeln ('Ввод неправильный') Else For i:=1 To m Do Swap(x[i,l1], x[i,l2]); End;
Если применять первую - Swap1, то после проверки правильности ввода данных будет такое обращение:
For i := 1 To m Do Swap1(i, l1, i, l2,x)
Комбинированный тип данных (записи)
Описание
Разбор на примере
При работе с массивами основное ограничение заключается в том, что каждый элемент должен иметь один и тот же тип. Но при решении многих задач возникает необходимость хранить и обрабатывать совокупности данных различного типа.
Пример
Для каждого из 25 учеников класса известны фамилия и оценка (в баллах) по пяти дисциплинам. Требуется вычислить среднюю оценку каждого ученика и выбрать человека, имеющего максимальный средний балл.
В данном случае фамилия может быть представлена строкой из 15 символов, оценка - это целое число, а средний балл должен быть представлен вещественным (действительным) числом. В Паскале для описания комбинаций объектов разных типов используются записи.
Запись - это структурированный тип, содержащий набор объектов разных типов. Составляющие запись объекты называются ее полями. В записи каждое поле имеет свое собственное имя. Чтобы описать запись, необходимо указать ее имя, имена объектов, составляющих запись и их типы. Общий вид такой:
Type "имя записи" = Record "поле 1" : "тип 1"; "поле 2" : "тип 2"; ... "поле n" : "тип n" End;
Данные для решения рассматриваемой задачи можно описать как запись следующим образом:
Type pupil = Record fam: String[15]; {поле фамилии ученика} b1, b2, b3, b4, b5 : 2...5; {поля баллов по дисциплинам} sb : Real {поле среднего балла} End;;
Запись
Переменная типа puple будет иметь смысл структуры, содержащий информацию, характеризующую одного ученика. Организация этой структуры показана на рис.1.
Чтобы хранить в памяти ЭВМ информацию о всех 25 учениках класса, необходимо ввести массив klass, представляющий массив записей:
Var klass : Array[1.25] Of pupil;
Примечания
Имена полей, составляющих запись, не должны повторяться.
Каждое поле записи может иметь любой тип (кроме файлового),в частности, оно может быть снова записью.
Доступ к полям записи
Его можно осуществить двумя способами.
Указанием имени переменной и имени поля. Например, klass[2].fam, klass[3].sb, klass[1].b4. Поэтому ввод фамилий и оценок учащихся, то есть элементов массива klass, можно задать так:
For i: = 1 To 25 Do Begin Readln(klass[i].fam); Readln(klass[i].b1); Readln(klass[i].b2); Readln(klass[i].b3); Readln(klass[i].b4); Readln(klass[i].b5); End;
Использованием оператора присоединения, который позволяет осуществлять доступ к полям записи, таким образом, как если бы они были простыми переменными. Его общий вид:
With <имя записи> Do <оператор>.
Внутри оператора к компонентам записи можно обращаться только с помощью имени соответствующего поля.
Пример
For i : = 1 To 25 Do With klass [i] Do Begin Readln (fam); ReadLn (b1,b2,b3,b4,b5); End;
Программа для решения рассматриваемой задачи может быть записана в следующем виде:
Program Example_54; Type pupil = Record fam : String[15]; b1, b2, b3, b4, b5 :2..5; sb : Real; End; Var klass : Array[1..25] Of pupil; p : pupil; i, m : Integer; sbmax : Real; Begin {ввод исходных данных} For i:=1 To 25 Do With klass[i] Do Begin Writeln ('Введите фамилию и пять оценок'); Readln(fam); ReadLn(b1,b2,b3,b4,b5); End; For i:=1 To m Do With klass[i] Do sb:=(b1+b2+b3+b4+b5)/5; {поиск максимального среднего балла} sbmax:=0; For i:=1 To m Do If klass[i].sb>=sbmax Then sbmax:=klass[i].sb; {печать результатов} For i:=1 To m Do If klass[i].sb=sbmax Then With klass[i] Do Writeln(fam:20,'-',sb:6:3); Readln; End.
Пример
Определить дату завтрашнего дня.
Решение
Чтобы определить дату завтрашнего дня, надо знать не только дату сегодняшнего дня, но и количество дней данного месяца (так как если это последний день месяца, то завтра будет первый день следующего), кроме того, надо знать, какой год - високосный или нет (от этого зависит количество дней февраля).
Пусть дата вводится следующим образом:
1 2 1997
Первая цифра - это число, вторая - месяц, третья - год. Тогда можно описать запись даты таким образом:
Type year = 1500..2000; month = 1..12; day = 1..31; data = Record y : year; m : month; d : day; End;
Заметим, что:
|
Если это не последний день месяца, то завтра будет этот же год, этот же месяц, а число увеличится на 1. |
|
Если это последний день месяца, то:
|
Program Example_55; Type year = 1500..2000; month = 1..12; day = 1..31; data = Record y : year; m : month; d : day; End; Var dat, next : data; {dat - переменная для сегодняшней даты, next - переменная для определения даты завтрашнего дня}
Function Leap(yy: year): Boolean; {функция, определяющая високосный год или нет} Begin {год называется високосным, если его номер делится на 4, но если это год столетия, то номер столетия не делится на 4, то есть не делится на 400} Leap: = (yy Mod 4 = 0) And ( yy Mod 400 <> 0); End;
Function Dmonth (mm: month; yy: year): day; {функция определения количества дней данного месяца в данном году} Begin Case mm Of 1, 3, 5, 7, 10, 12 : Dmonth := 31; 4, 6, 9, 11 : Dmonth := 30; If Leap (yy) Then Dmonth := 29 Else Dmonth := 28; End; End;
Procedure Tomorrow(td: data; Var nd: data); {процедура определения завтрашней даты} Begin If td.d<> Dmonth(td.m,td.y) {если это не последний день месяца} Then With nd Do Begin d := td.d + 1; m := td.m; y := td.y; End {если это последний день месяца} Else {если это декабрь} If td.m = 12 Then With nd Do Begin d := 1; m := 1; y := td.y + 1; End {если это не декабрь} Else With nd Do Begin d := 1; m := td.m + 1; y := td.y; End; End;
Begin Writeln('Введите сегодняшнее число,месяц и год'); Readln( dat.d,dat.m,dat.y); Tomorrow(dat,next); Writeln('Завтра будет '); Writeln(next.d,'.',next.m,'.',next.y); Readln; End.
Решение задач
Написать программу, определяющую:
дату следующего (предыдущего) дня;
дату, которая наступит через mдней;
дату, которая была за m дней до сегодняшнего дня;
количество суток, прошедших от даты t1 до t2;
день недели, выпадающий на дату t1, если известно, что в первый день нашей эры был понедельник.
Дано время, описанное следующим образом:
Type time = Record h : 0..23; m, s : 0..59 End;
Описать:
логическую функцию для проверки, предшествует ли время t1 времени t2 (в рамках суток);
процедуру, присваивающую параметру t1 время, на 1 секунду большее времени t (учесть смену суток).
Const n = 300; Type MyRecord = Record Key : Integer; Name : String; End; Var Table = Array[1..n] Of MyRecord;
Считая, что в таблице записи имеют различные ключи, описать:
процедуру, упорядочивающую записи таблицы по убыванию значений поля Key;
логическую функцию поиск (Т,К,Н), определяющую, есть ли в таблице Т (все записи которой уже упорядочены по возрастанию значений поля Key) запись со значением поля Key, равным К, и, если есть, присваивающую ее номер параметру Н.
Дан массив, содержащий информацию об учениках некоторой школы.
Заполнить второй массив данными об учениках только девятых классов;
Выяснить, на сколько человек в восьмых классах больше, чем в девятых.
Багаж пассажира характеризуется количеством вещей и общим весом вещей. Дан массив, содержащий сведения о багаже нескольких пассажиров. Сведения о багаже каждого пассажира представляют собой запись с двумя полями: одно поле целого типа (количество вещей) и другое - действительное (вес в килограммах).
Найти багаж, средний вес одной вещи в котором отличается не более чем на 0,3 кг от общего среднего веса одной вещи;
Найти число пассажиров, имеющих более двух вещей и число пассажиров, количество вещей которых превосходит среднее число вещей;
Выяснить, имеется ли пассажир, багаж которого состоит из одной вещи весом менее 30 кг
