ЦЕНТР ДЕТСКОГО (ЮНОШЕСКОГО) НАУЧНО-ТЕХНИЧЕСКОГО ТВОРЧЕСТВА «ПРОГРАММИРОВАНИЕ В СИСТЕМЕ TURBO PASCAL» Часть 1 Базовые конструкции языка Pascal УЧЕБНО-МЕТОДИЧЕСКОЕ ПОСОБИЕ для учащихся заочной школы юных техников, обучающихся по направлению «программирование» Автор - педагог дополнительного образования ЦНТТ Андреева И.Ю. г. Армавир Пояснительная записка Предлагаемое методическое пособие представляет собой сборник заданий к первой части учебного курса «Программирование в системе Turbo Pascal» и предназначено для детей и молодежи в возрасте от 14 до 18 лет, обучающихся в заочной школе юных техников по направлению «Программирование». Цель данного пособия - помочь учащимся в проведении самостоятельной работы по изучению основ программирования и разработке компьютерных программ в системе программирования Turbo Pascal. В методической разработке содержатся учебный план «Базовые конструкции языка Pascal» - первого модуля курса «Программирование в системе Turbo Pascal», порядок выполнения контрольных заданий и варианты заданий к тематическим блокам модуля. Каждое задание содержит теоретический материал, разбор характерных примеров и задач, методические рекомендации по их выполнению. В конце каждого задания дается перечень задач для самостоятельного решения и список вопросов для самоподготовки. Учебно-тематический план Часть 1. Базовые конструкции языка Pascal Работа в среде Turbo Pascal на примере разработки программ линейной структуры. Вычисление арифметических выражений. Организация ветвлений. Условный оператор IF. Оператор выбора Case ..of. Циклы for, while, repeat ... until. Работа с одномерными массивами. Работа с двумерными массивами. Символьные и строковые типы данных в Pascal. Использование процедуры и функции в Pascal. Комбинированный тип Запись. Файловый тип данных. Работа с файлами. Порядок выполнения контрольных заданий 1. Внимательно прочитать и уяснить условие задачи, которую предстоит решить. 2. Ознакомиться с необходимым теоретическим материалом, примерами решения задач. Использовать список рекомендуемой литературы. 3. Разработать алгоритм и написать текст программы. Отладить программу на компьютере. 4. Подготовить отчет. Каждый отчет оформляется в виде пояснительной записки и должен содержать следующие элементы: титульный лист; текст пояснительной записки; список использованной литературы; Содержание пояснительной записки отчета: 1. Постановка задачи. 2. Краткие сведения об особенностях применяемых операторов и методов (теоретическое введение). 3. Описание программы: описание алгоритма решения задачи (в виде блок-схемы); описание входных и выходных данных программы; перечень входных данных (тестовые примеры) программный код на языке Pascal. 2 ЗАДАНИЕ № 1 Работа в среде Turbo Pascal на примере разработки программ линейной структуры. Вычисление арифметических выражений. Цель работы. Разработать алгоритмы и программы решения задач. Исходные данные должны вводиться с проверкой на область допустимых значений. Теоретическая часть: Для того чтобы войти в среду программирования на Паскаль, необходимо найти файл turbo.exe и запустить его. На экране появится окно следующего вида: В меню Файл вы можете сохранить свою программу, открыть существующую, а также создать новую. Комбинация клавиш Alt+Enter переведет программу в полноэкранный режим программирование. Напишем программу, которая выполняет следующее: Выводит сообщение о вводе 2-х целых чисел. Вычисляет сумму чисел и выводит полученный результат. Алгоритм работы программы: Словесный алгоритм 1. Объявление переменных 2. Начало работы программы 3. Ввод значений переменных 4. Сложение чисел 5. Вывод полученного результата 6. Конец Алгоритм в виде блок-схемы: Начало Ввод a, b c:=a+b Вывод с конец 3 Алгоритм на языке Паскаль: program lesson1; {здесь описывается заголовок программы} var a,b,с:integer; {переменные, в которые будем заносить числа и они целочисленные, переменная в которую заносится результат сложения 2-х чисел} begin writeln('Vvedite chisla a, b'); {Эта строка выводит сообщение на экран} ReadLn(a,b); {Ввод значений 2-х чисел} c:=a+b; {сложение чисел a и b, результат присваивается переменной c} writeln('с= ', c); {вывод значения с} readln; {задержка экрана, пока не нажата клавиша Enter} end. {конец работы программы} Грамматика Как вы заметили нужно после каждой строки ставить точку с запятой. Если вы где-то забудете поставить точку с запятой, то компилятор не пропустит это и выведет сообщение о синтаксической ошибке. Объявление переменных имеет вид: var a,b,c:integer; Var - означает то, что мы объявляем переменные. a, b, c - это имена переменных с которыми мы будем работать в программе. integer - это целочисленный тип переменных. Вывод сообщения на экран имеет следующий вид writeln('Сообщение'); . Writeln - это оператор, посредством которого мы сможем вывести что-то на экран монитора. То есть выводится то, что стоит внутри скобок и отделено одинарными кавычками. Если же мы хотим вывести какое-то сообщение и значение какой-то переменной, то нужно сообщение внести в одинарные кавычки, потом поставить запятую и написать переменную, результат которой нужно вывести на экран writeln('с = ', c); . Результат работы программы: Алгоритм линейной структуры - это алгоритм, в котором блоки выполняются в указанном порядке, последовательно друг за другом. Программа линейной структуры реализует соответствующий линейный алгоритм. Чаще всего линейные алгоритмы используются для программирования вычислений по формулам. В этом случае удобно использовать набор встроенных функций Pascal: 4 sin (x) – sin х; cos(x) – cos х; tan(x) - tg х ; ln (x) – натуральный логарифм ln х ; exp(x) показательная функция ex ; sqr(x) - x2; sqrt(x) - √𝑥; abs(x) - |𝑥|. Для тригонометрических функций аргумент х измеряется в радианах. Пример программы линейной структуры Требуется вычислить высоты треугольника по трем заданным сторонам a, b, c. Для вычисления высот воспользуемся двумя выражениями площади треугольника - по трем сторонам (формула Герона) и как половина произведения стороны на соответствующую высоту: 1 𝑠 = 2 ·a·h ; s p( p a)( p b)( p c) ; здесь p – полупериметр p=(a+b+c)/2. Соответствующая этому алгоритму программа вычисления высот треугольника имеет вид: program visota; {программа вычисления высот треугольника } var a, b, c, p, ha, hb, hc, s : real; {описание используемых переменных } begin writeln (‘Введите стороны треугольника a,b,c’); readln (a,b,c); p:=(a+b+c)/2.; {вычисление полупериметра треугольника } s:=sqrt(p*(p-a)*(p-b)*(p-c)); ha:=2*s/a; hb:=2*s/b; hc:=2*s/c; {вычисление высот треугольника } writeln (‘Высоты треугольника: ha=‘,ha:8:2,’ hb=‘, hb:8:2,’ hc=‘,hc:8:2); readln; end. Краткое пояснение. Комментарий в программе на языке Паскаль служит для разъяснения действий основных блоков текста и программы в целом. Комментарий заключается в фигурные скобки {} и не влияет на компиляцию программы. Процедуры read , write (readln, writeln) служат для ввода с клавиатуры и вывода на экран соответственно. Символы ln в процедуре writeln служат для перевода на новую строку. В программе описаны переменные a, b, c, ha, hb, hc, s вещественного типа (real). В данной программе из математических функций используется sqrt(x) - квадратный корень из x. При выводе можно включить общую ширину поля вывода и число позиций после десятичной точки. В данном случае высоты треугольника выводятся в поле из 8 позиций каждая, из которых одна отводится на десятичную точку, а две - на цифры после десятичной точки. Остальные 5 позиций отводятся под знак и целую часть числа. Вывод текста ‘ hb=’ содержит, по крайней мере, один пробел после первого апострофа для отделения от предыдущего значения. Завершает текст программы оператор end. Обратим внимание, что в программе вычисляется промежуточная переменная s (площадь треугольника), через которую вычисляются высоты. Общие сведения о интегрированной cреде Turbo Pascal. Экран интегрированной среды Turbo Pascal содержит главное меню, окно редактирования, строку состояния. Для входа в главное меню следует нажать F10. Главное меню содержит пункты: File(Файл), Edit(Редактирование), Search(поиск), Run(Исполнить), Compile(Компиляция), Debug(Отладка), Tools(Инструменты), Options(Параметры), Window(Окно), Help(Помощь). Из этих пунктов для нас важнейшими будут File, Edit, Compile, Run, Help. В меню File имеются пункты Open (Открыть), при помощи которого открывается существующий программный файл, New (Создать) - создается новый файл, Save (Сохранить) - сохраняется редактируемый файл, Save as (Сохранить как) - файл сохраняется под новым 5 именем, Change dir (Изменить каталог) - задаются входные и выходные каталоги. Последним пунктом нужно пользоваться, чтобы задать ваш каталог, где хранятся тексты программ. Пункт Quit(Выход) служит для выхода из Среды. В меню File приведены также "горячие " клавиши (F3), (F2), (ALT+X) для открытия, сохранения файла и для выхода из Среды соответственно. В меню Edit имеются пункты Cut (Вырезать), Copy (Копировать), Paste (Вставить), Clear (Очистить), которые служат для вырезания, копирования, вставки и очистки выделенного фрагмента текста, как в любом текстовом редакторе. Выделение фрагмента текста производится установкой курсора в начале фрагмента, отметкой начала блока (CTRL+K+B), передвижением курсора в конец блока и отметкой конца блока (CTRL+K+K). Вырезание, копирование, вставка фрагмента осуществляются с помощью пунктов меню Edit или с помощью горячих клавиш (Shift+Del), (CTRL+INS), (Shift+INS) соответственно. Меню Compile содержит пункт Compile(Компиляция), горячие клавиши ALT+F9. Меню Run содержит пункт Run(Исполнить), горячие клавиши CTRL+F9. Меню Help позволяет обратиться к подсказке (справочной системе), содержит пункты Contents (Содержание), Index (Предметный указатель) - горячие клавиши (Shift+F1), Topic search (Тематический поиск) - горячие клавиши (CTRL+F1). Подсказкой следует пользоваться для быстрого освоения Интегрированной Среды. Нажатие клавиши F1 приводит к открытию окна подсказки. Для получения справки о конкретной функции следует установить курсор на любой символ заголовка функции и нажать (CTRL+F1). Задачи для самостоятельного решения: Вычислить значения выражений (1-10) 1) 2*c - d + 23 a -1 4 2) c + 4*d - 123 a 12 3) -2*c + d*82 a tg( - 1) 4 4) lg(2*c) + d - 52 a +1 4 5) arctg(c/4) - d*62 6) -2*c - ln(d) + 53 a -1 4 a*a - 1 7) 2*c - lg(d/4) a*a - 1 8) tg ( c ) - d*23 2*a - 1 9) 2*c - d/23 a ln(1 - ) 4 10) 6 4*c + d - 1 a c - tg 2 11. Реактивный аэробус летит с пассажирами на борту из Лондона в Нью-Йорк. Три четверти пассажиров имеют билеты второго класса стоимостью х фунтов каждый. Остальные пассажиры имеют билеты первого класса, которые стоят вдвое дороже билетов второго класса. Напишите программу, которая выведет сумму денег, получаемую авиакомпанией от продажи билетов на этот рейс . 12. В течение месяца продавец доставлял на дом 4 л молока в день. В марте молоко стоило х руб. за литр. С первого апреля цена молока увеличилась до (х + а) руб. за литр. Сколько надо заплатить продавцу за see доставленное молоко в конце апреля? Количество покупаемого молока осталось прежним. 13. Мальчик может бегать в три раза быстрее, чем ходить. Скорость его ходьбы равна 4 км/час. Он принял участие в марафонском забеге, но сошел с дистанции, пробежав только х км. Сколько времени он затратил на преодоление этого расстояния ? 14. Работник зарабатывает х руб. за каждый из 38 часов своей работы. Ему платят в 1,5 раза больше за каждый час сверх 38 часов. Какую сумму он получит, если работает а часов? (а должно быть заведомо больше 38.) 15. Как вы полагаете, сколько денег вы расходуете каждую неделю? Напишите программу, которая выведет на экран сумму ваших расходов за год. 16. Магазин продает в автомашин по цене 417 525 руб. за каждую. Найдите общую выручку от продажи машин. 17. Ежедневно молочная ферма надаивает 1842 литра молока. Найдите количество молока, полученного за любой месяц (вводится число дней в месяце). 18. Команда Ливерпуля выиграла футбольный матч у команды Ковентри со счетом а:в. Выведите результат матча в виде: Ливерпуль 4 Ковентри 1. Осуществите запрос а и в. 19. В магазине продается костюмная ткань. Ее цена в руб. за кв. метр. Напишите программу, которая подсчитает и выведет на экран стоимость куска этой ткани длиной х м и шириной 80 см. 20. Хозяин хочет оклеить обоями длинную стену в своем доме. Длина этой стены равна а м, а высота в м. Рулон обоев имеет длину 12 м и ширину 1 м. Сколько будут стоить обои для всей стены, если цена одного рулона к руб.? 21. Среднее значение четырех чисел равно одной четверти суммы этих четырех чисел. Напишите программу, которая находит среднее значение четырех чисел. 22. Вычислите заработную плату работника при почасовой системе оплаты, если известны тарифная ставка за 1 час и количество отработанных часов в месяц. 23. Составьте алгоритм и программу вычисления значений выражения: 5 x 27 : y z 12 z 17 28t a) б) в) z 1 27t 38t x3 24. Составьте алгоритм и программу нахождения площади треугольника по его основанию и высоте. S = (ab)/2, где а—основание, в — высота. 25. Составьте алгоритм и программу нахождения площади ромба по стороне и острому углу. (Угол предварительно переведите в радианы.) S = а2sin f, где а — сторона, f— угол. 7 26. Составьте алгоритм и программу нахождения суммы всех натуральных чисел от 1 до п. Используйте формулу суммы членов арифметической прогрессии: Sn = (2a1+(n— 1)d)n/2, где а1 — первый член последовательности, d — разность. 27. Найдите площадь круга, если известен радиус. S= 3.14R2. 28. В прямоугольном треугольнике известны катет и гипотенуза. Найдите другой катет. 29. В арифметической прогрессии известны 1-й член и разность. Найдите 30-й член этой прогрессии и сумму первых 40 членов. 30. Найдите координаты центра отрезка, заданного координатами его концов. 31. По двум сторонам и углу между ними в треугольнике ABC найдите два остальных угла и третью сторону. С2 = А2 + В2 — 2АВ cos f , где А, В — известные стороны, f— угол между ними. 32. Составьте алгоритм и программу вычисления скорости тела в момент времени t при равноускоренном движении. Известны начальная скорость Vo и ускорение а, при условии, что тело движется прямолинейно. Vt= Vo + at. 33. Составьте алгоритм и программу вычисления сопротивления в цепи электрического тока R по данным значениям тока I и напряжения V. R = V/I 34. Составьте алгоритм и программу вычисления подоходного налога от заработной платы. Подоходный налог взимается в размере 13% от общей суммы. 35. Четыре человека пообедали в ресторане. Официант подал им счет на х руб. каждому. Они решают оставить официанту чаевые в размере 15% от счета. Составьте программу, которая выведет на экран сумму чаевых, которую получил официант. Контрольные вопросы: 1. Структура программы. 2. Особенности выполнения изучаемых операторов: присваивания, ввода-вывода. 3. Арифметические выражения: знаки арифметических операций. 4. Стандартные функции. 5. Диапазон допустимых значений для вещественных (real) и целочисленных (integer) переменных. Литература: 1. Бабушкина И.А. Практикум по Турбо Паскалю.- М.: АБФ, 1998. 2. Емелина Е.И. Основы программирования на языке Паскаль. - М.: Финансы и статистика,1997 . 3. Зуев Е.А. Turbo Pascal. Практическое программирование.- М.: ПРИОР, 1997 . 4. Немнюгин С., Перколаб Л. Изучаем Turbo Pascal. – СПб.: Питер, 2001 . 5. курс, С-Петербург, 2002 6. Фаронов В.В. Турбо-Паскаль 7.0. Начальный курс. Учебное пособие.М.:"Нолидж",1998. 8 ЗАДАНИЕ № 2 Организация ветвлений. Условный оператор IF. Оператор выбора Case..of. Цель работы. Разработать алгоритмы и программы решения задач. Исходные данные – целые числа (тип integer). Использовать операторы If и Case..of. Результат Х - тоже целочисленный (integer или longint). Исходные данные должны вводиться с проверкой на область допустимых значений. Теоретическая часть: Алгоритм разветвляющейся структуры - это алгоритм, в котором вычислительный процесс осуществляется либо по одной, либо по другой ветви, в зависимости от выполнения некоторого условия. Для организации ветвлений применяется оператор условного перехода If … Условный оператор в языке Паскаль имеет формат: If <условие> then <оператор1> else <оператор2>; (полная форма) или If <условие> then <оператор1>; (сокращенная форма) Точка с запятой перед зарезервированным словом else не ставится. При выполнении условия исполняется оператор1, при невыполнении - оператор2 (при полной форме условного оператора). Для неполной формы условного оператора при выполнении условия исполняется оператор1, в противном случае оператор1 пропускается и исполняется оператор, следующий за условным оператором. Оператор1 и оператор2 могут представлять простые операторы (один оператор), в этом случае они не заключаются в операторные скобки. Если же оператор1 и/или оператор2 представляют составной оператор (несколько операторов), то их нужно заключить в операторные скобки begin … end. В качестве примера приведем программу вычисления наибольшего из значений функции y1=x*x+1, y2=7-x*x или y3=x+1 для любого х. program razvetvl ; {программа разветвляющейся структуры} var x, y1, y2 , y3, max : real; begin writeln (‘Введите x’); readln (x); y1:=x*x+1; y2:=7-x*x ; y3:=x+1; if y1> y2 then max:=y1 else max:=y2; if y3 > max then max:=y3; writeln (‘ y1=‘, y1: 6:2,’ y2=‘, y2: 6:2, ’ y3=‘,y3: 6:2); writeln (‘при x=‘, x: 6:2, ’ наибольшее значение функций = ‘, max: 6:2); readln; end. Оператор выбора Case ..of Если количество разветвлений программы больше двух, то используется оператор выбора Case, который является более общим случаем условного оператора. Оператор Case выполняет один из нескольких операторов в зависимости от значения селектора. Если селектор не совпадает ни с одним из значений, то выполняется оператор после else или следующий после case…of оператор, если else отсутствует. Селектор может быть выражением одного из следующих типов: целочисленный, символьный, перечисляемый, интервальный. 9 Например, определим время года по введенному номеру месяца. Program case1; {множественный выбор} Label m; Var num: integer; begin m: writeln (‘Введите номер месяца’); readln (num); write (‘Время года: ‘, num); case num of { выбор значений селектора num} 1, 2, 12: writeln (‘Зима’); 3..5: writeln (‘Весна’); 6..8: writeln (‘Лето’); 9..11: writeln (‘Осень’); else begin writeln (‘нет месяца с таким номером!’); goto m; end; end; {завершение оператора case} readln; end . В приведенном примере программы при вводе номера месяца от 1 до 12 на экране печатается соответствующее время года и выполнение программы заканчивается. Если же номер месяца превышает 12 или меньше 0, то выводится сообщение о неверном вводе месяца, для чего служит зарезервированное слово else и выполняется переход на ввод нового значения месяца с помощью метки m. В данной программе num – селектор. Задачи для самостоятельного решения: a * b 1, если a > b, 1) X 25, если а = b, ( a 5) / b, если а < b; a * b 3, åñëè a > b, 2) X 2, åñëè a = b, ( 3 1) / b, åñëè a < b; a a / b 5, если a < b, 3) X 5, если а = b, ( a * a b) / b, если а > b; a / b 1, если a < b, 4) X 1, если а = b, ( a * b 5) / a, если а > b; a / b 1, если a > b, если а = b, 5) X 25, ( 3 5) / a, если а < b; а a * b 21, если a > b, если а = b, 6) X 5, 3 * a / b 1, если а < b; 5 * a b, если a > b, если а = b, 7) X 125, ( a 5) / b, если а < b; a * b 1, если a > b, если а = b, 8) X 255, ( a 5) / b, если а < b; b * a 1, если a > b, если а = b, 9) X 10, ( a 5) / b, если а < b; a / b 31, если a > b, если а = b, 10) X 25, ( a * 5 1) / a, если а < b; 10 11. Дано двузначное число. Определить: а) какая из его цифр больше, первая или вторая; б) одинаковы ли его цифры 12. Дано двузначное число. Определить, равен ли квадрат этого числа учетверенной сумме кубов его цифр. Например, для числа 48 ответ положительный, для числа 52 — отрицательный. 13. Дано двузначное число. Определить: а) является ли сумма его цифр двузначным числом; б) больше ли числа а сумма его цифр. 14. Дано двузначное число. Определить: а) кратна ли трем сумма его цифр; б) кратна ли сумма его цифр числу а. 15. Имеется стол прямоугольной формы размером а × b (а и b — целые числа, а > b). В каком случае на столе можно разместить большее количество картонных прямоугольников с размерами с×d (c и d— целые числа, с> d): при размещении их длинной стороной вдоль длинной стороны стола или вдоль короткой. Прямоугольники не должны лежать один на другом и не должны свисать со стола. 16.Дано трехзначное число. Выяснить, является ли оно палиндромом («перевертышем»), т. е. таким числом, десятичная запись которого читается одинаково слева направо и справа налево. 17.Дано трехзначное число. Определить, какая из его цифр больше: а) первая или последняя; б) первая или вторая; в) вторая или последняя. 18. Дано трехзначное число. Определить, равен ли квадрат этого числа сумме кубов его цифр. 19.Дано трехзначное число. Определить: а) является ли сумма его цифр двузначным числом; б) является ли произведение его цифр трехзначным числом; в) больше ли числа а произведение его цифр; г) кратна ли пяти сумма его цифр; д) кратна ли сумма его цифр числу а. 20.Дано трехзначное число. а) Верно ли, что все его цифры одинаковые? б) Определить, есть ли среди его цифр одинаковые. 21.Дано четырехзначное число. Определить: а) равна ли сумма двух первых его цифр сумме двух его последних цифр; б)кратна ли трем сумма его цифр; в) кратно ли четырем произведение его цифр; г) кратно ли произведение его цифр числу а. 22. Дано натуральное число. а) Верно ли, что оно заканчивается нечетной цифрой? 11 б) Верно ли, что оно заканчивается четной цифрой? В обеих задачах составные условия не использовать. 23. Даны три вещественных числа а, b, с. Проверить: а) выполняется ли неравенство а < b < с; б) выполняется ли неравенство b> а > с. 24. Определить, является ли число а делителем числа b или, наоборот, число b делителем числа а. Ответом должны служить сообщения: «Да, одно из чисел является делителем другого» или «Нет, ни одно из чисел не является делителем другого». 25. Определить, верно ли, что при делении неотрицательного целого числа а на положительное число b получается остаток, равный одному из двух заданных чисел с или d. 26. Даны три вещественных числа а, Ь, с. Определить, имеется ли среди них хотя бы одна пара равных между собой чисел. 27. Год является високосным, если его номер кратен 4, однако из кратных 100 високосными являются лишь кратные 400 (например, 1700, 1800 и 1900 — невисокосные года, 2000 — високосный). 28. Дано натуральное число п. Определить, является ли високосным год с таким номером. 29. Составить программу, которая в зависимости от порядкового номера дня недели (1, 2, ..., 7) выводит на экран его название (понедельник, вторник, ..., воскресенье). 30. Составить программу, которая в зависимости от порядкового номера месяца (1,2,..., 12) выводит на экран его название (январь, февраль,..., декабрь). 31. Составить программу, которая в зависимости от порядкового номера месяца (1,2,..., 12) выводит на экран количество дней в этом месяце. Рассмотреть два случая: а) год не является високосным; б) год високосный (информация об этом вводится с клавиатуры) 32. Мастям игральных карт условно присвоены следующие порядковые номера: «пики» — 1, «трефы» — 2, «бубны» — 3, «червы» — 4. По заданному номеру масти т (1 < т < 4) определить название соответствующей масти. 33. Игральным картам условно присвоены следующие порядковые номера в зависимости от их достоинства: «валету» — 11, «даме» — 12, «королю» — 13, «тузу» — 14. Порядковые номера остальных карт соответствуют их названиям («шестерка», «девятка» и т. п.). По заданному номеру карты к (6 < к < 14) определить достоинство соответствующей карты. 34. С начала 1990 года по некоторый день прошло п месяцев и 2 дня (n > 1). Определить название месяца (январь, февраль и т. п.) этого дня. Контрольные вопросы: 1. Опишите назначение, формы записи и порядок выполнения оператора условия If. 2. Каковы различия оператора выбора Case..of от оператора условия? 3. Операции отношения и логические операции в Pascal. Простые и сложные логические выражения. Литература: 1. Бабушкина И.А. Практикум по Турбо Паскалю.- М.: АБФ, 1998. 2. Емелина Е.И. Основы программирования на языке Паскаль. - М.: Финансы и статистика,1997. 3. Зуев Е.А. Turbo Pascal. Практическое программирование.- М.: ПРИОР, 1997 . 4. Немнюгин С., Перколаб Л. Изучаем Turbo Pascal. – СПб.: Питер, 2001 . 5. курс, С-Петербург, 2002 6. Фаронов В.В. Турбо-Паскаль 7.0. Начальный курс. Учебное пособие.- М.:"Нолидж",1998. 12 ЗАДАНИЕ № 3 Циклы for, while, repeat ... until Цель работы. Разработать алгоритмы и программы решения задач. Исходные данные – целые числа (тип integer). Использовать операторы цикла for, while, repeat ... until. Исходные данные должны вводиться с проверкой на область допустимых значений. Теоретическая часть: Алгоритм циклической структуры - это алгоритм, в котором происходит многократное повторение одного и того же участка программы. Такие повторяемые участки вычислительного процесса называются циклами. Программа циклической структуры содержит один или несколько циклов. Различают детерминированные циклы с заранее известным числом повторений и итерационные циклы, в которых число повторений заранее неизвестно. Изменяющаяся в цикле переменная называется параметром цикла. Для организации цикла необходимо выполнить следующие действия: 1) задать перед циклом начальное значение параметра цикла; 2) изменять параметр перед каждым новым повторением цикла; 3) проверять условие повторения цикла; 4) управлять циклом, т.е. переходить к его началу, если он не закончен, или выходить из него по окончании. В языке Паскаль существует 3 вида циклов: 1) цикл с параметром или цикл типа for, 2) цикл с предусловием или цикл типа while, 3) цикл с постусловием или цикл типа repeat ... until. В цикле типа for число повторений известно заранее, в циклах типа while и repeat ... until число повторений цикла заранее неизвестно, производится проверка условия повторения цикла: в цикле типа while - перед циклом, в цикле типа repeat ... until - после его окончания. В циклах типов for и while повторяющаяся часть (тело цикла) состоит из одного оператора, если требуется выполнить в цикле несколько операторов, они заключаются в операторные скобки begin ... end, образуя составной оператор. В цикле типа repeat ... until тело цикла помещается между зарезервированными словами языка repeat и until, операторные скобки не требуются, в названии цикла его тело условно обозначается тремя точками. С помощью цикла типа for удобно находить суммы, произведения, искать максимальные и минимальные значения и т.п. При нахождении суммы некоторой переменной, например S присваивается значение 0, затем в цикле к этой переменной прибавляется соответствующий член заданной последовательности. При нахождении произведения переменной присваивается значение 1, затем в цикле эта переменная умножается на общий член последовательности. Пример цикла типа for Вычисление n чисел Фибоначчи: F1=1; F2=1;…; Fn=Fn-1+Fn-2 , например F3=F2+F1=1 + 1 = 2; F4 = 2 + 1 = 3 и т.д. program fib; {Нахождение чисел Фибоначчи} var x, y, z, i, n : integer; begin writeln (‘Введите n’); read (n); x:=1; y:=0; 13 for i:=1 to n do begin z:=x; x:=x+y; y:=z; write (' ', x ) ; end; readln; end. Пример цикла типа while Дано натуральное число n. Подсчитать количество цифр данного числа. Подсчет количества цифр начнем с последней цифры числа. Увеличим счетчик цифр на единицу. Число уменьшим в 10 раз, тем самым избавляемся от последней цифры числа. Далее с получившимся числом проделываем ту же последовательность действий и т.д. , пока число не станет равным нулю. program cycl_while; uses crt; {вызов модуля Crt для управления режимом экрана} var n, m, k : integer; begin clrscr ; {процедура очистки экрана из модуля Crt} writeln ('Введите натуральное число ' ); readln (n); m:=n; k:=0; while m<>0 do begin k:=k+1; {увеличиваем счетчик на 1} m:=m div 10; {удаляем в числе последнюю цифру } end; writeln(‘В числе ’,n,’ – ‘,k,’ цифр’); readln; end . Пример цикла типа repeat ... until Вычислить сумму целых чисел вводимых с клавиатуры. Числа вводить до тех пор, пока не будет введен 0. Вычисляем сумму s до тех пор, пока n <> 0, где n - очередное вводимое число. program sum; uses crt; {вызов модуля crt для управления режимом экрана} var s, n : integer; begin clrscr ; s:=0; repeat write( 'Введите число ' ); readln (n); s:=s+n; until n = 0; writeln ('s= ', s : 5 ); readln; end. 14 Цикл повторяется до тех пор, пока условие записанное после ключевого слова until, будет ложным (не выполняется). Как только это условие выполнится, происходит выход из цикла. После окончания цикла производится печать результата (оператор writeln). Отметим, что цикл с предусловием (типа while) может не выполниться ни разу, цикл с постусловием repeat ... until выполнится по крайней мере 1 раз. Когда число повторений цикла неизвестно заранее, применяются циклы с предусловием или с постусловием. Когда число повторений цикла известно заранее, как правило, применяется цикл типа for. Но любой цикл типа for можно заменить циклом с предусловием или постусловием. Задачи для самостоятельного решения: 1. Создайте программу, которая вычисляет сумму чисел от 1 до N. Значение N (N должно быть меньше 100) вводится с клавиатуры. 2. Напишите программу печати таблицы перевода расстояний из дюймов в сантиметры (1 дюйм 2,5 см) для значений длин от 1 до 20 дюймов. 3. Используя цикл while, напишите программу вывода всех четных чиселот 2 до 100 включительно. 4. Создайте и произведите отладку программы, вычисляющей сумму квадратов чисел от 1 до введенного целого числа п. 5. Используя цикл while, напишите программу определения суммы всех нечетных чисел от 1 до 99 включительно. 6. Используя цикл while, напишите программу определения идеального веса для взрослых людей по формуле; Идеальный вес = рост - 100. Выход из цикла - значение роста 250. 7. Используя цикл repeat, напишите программу-фильтр, которая вводит любые символы, но комментирует только буквы русского алфавита. Завершение работы программы — по нажатию буквы «Я». 8. Используя цикл repeat, напишите программу, которая требует ввод пароля, например, числа 111, и, если пароль правильный, заполняет все строки экрана сообщением «Молодец!!!». Если после пятой попытки пароль неверен, выйти из программы. 9. Создайте программу получения в порядке убывания всех делителей данного числа. 10. Создайте программу определения наибольшего общего делителя двух натуральных чисел. 11. Создайте программу определения наименьшего общего кратного двух натуральных чисел. 12. Создайте программу, подсчитывающую количество цифр введенного целого неотрицательного числа. (Можно использовать операцию целочисленного деления для последовательного уменьшения числа на один разряд.) 13. Создайте и произведите отладку программы, определяющей максимальное из всех введенных чисел. (Пусть признаком конца ввода чисел служит число 0.) 14. Найдите наибольшее и наименьшее значения функции у = Зх 2 + х - 4, если в заданном интервале [a, b] x изменяется с шагом 0,1. 15. Вычислите сумму квадратов N четных натуральных чисел. 16. Вычислите: 1)1 + 2 + 4 + 8 + ...+ 210; 2) (1 + 2)(1+ 2 + 3)... (1 + 2 + ... + 10). 15 17. В бригаде, работающей на уборке сена, имеется n косилок. Первая из них работала т часов, а каждая следующая на 10 минут больше, чем предыдущая. Сколько часов проработала вся бригада? Контрольные вопросы: 1. Каково назначение операторов повтора (цикла)? 2. Какие требования предъявляются к выражениям, управляющим повторениями? 3. В чем различия операторов повтора while и repeat? 4. В каких случаях предпочтительнее использовать для организации циклон! оператор повтора for? Что записывается в заголовке этого оператора? 5. Каким образом в операторе цикла for описывается направление изменения значения параметра цикла? 6. Какие ограничения накладываются на использование управляющей переменной (параметра цикла) в цикле for? 7. Какие правила пунктуации необходимо соблюдать при записи операторов; 8. Что такое вложенные циклы? Какие дополнительные условия необходимо соблюдать при организации вложенных циклов? Литература: 1. Бабушкина И.А. Практикум по Турбо Паскалю.- М.: АБФ, 1998. 2. Емелина Е.И. Основы программирования на языке Паскаль. - М.: Финансы и статистика,1997. 3. Зуев Е.А. Turbo Pascal. Практическое программирование.- М.: ПРИОР, 1997 . 4. Немнюгин С., Перколаб Л. Изучаем Turbo Pascal. – СПб.: Питер, 2001 . 5. курс, С-Петербург, 2002 6. Фаронов В.В. Турбо-Паскаль 7.0. Начальный курс. Учебное пособие.- М.:"Нолидж",1998. 16 ЗАДАНИЕ № 4 Работа с одномерными массивами Цель работы. Разработать алгоритмы и программы решения задач. Использовать оператор For для перебора элементов массива. Задав одномерный массив целочисленных данных A в одном из заданных форматов byte, word, integer или longint, реализовать обработку массива. Исходные данные задать самостоятельно, учитывая формат элементов массива A. Исходные данные должны вводиться с проверкой на область допустимых значений. Теоретическая часть: Массивы - структурированный тип данных с элементами одного типа. Количество элементов определяет размер массива. Например, массив составляют заработные платы сотрудников подразделения предприятия, здесь число элементов равно числу сотрудников; массив образуют набор чисел, их количество равно числу элементов массива. Номер элемента массива называется его индексом. Для описания массива предназначено словосочетание array of (массив из). Массив должен быть описан либо в разделе типов TYPE следующим образом: TYPE <имя_типа> = ARRAY [тип индекса] OF <тип_элементов_массива>; VAR <имя_массива>: <имя_типа>; либо без представления типа в разделе описания типов данных: VAR <имя_массива>: ARRAY [тип индекса] OF <тип_элементов_массива>; где тип индекса (перечисляемый или интервальный) определяет границы изменения значений индекса; Например: 1) VAR a: ARRAY [1..5] OF real; Описан массив а действительных чисел, который состоит из 5 элементов. 2) TYPE tl = ARRAY [1..4] OF integer; t = ARRAY [1..5] OF t1; VAR d: t; к : t1; Ввод элементов массива может осуществляться путем: 1) поэлементного ввода for i:=1 to n do readln(a[ i ]); 2) c использованием заданных формул 3) для ввода больших массивов удобна специальная функция – генератор случайных чисел random(x). Запись функции: random(x) – генерируется случайное число диапазона (0, x-1), т.е. random(50) - генерируется случайное число от 0 до 49. Если необходимо генерировать числа из диапазона (10, 88), то записываем a[i] := 10 + random(79); 17 Для переустановки базы генерации, т.е. чтобы каждый раз генерировалась разная последовательность случайных чисел, применяется функция randomize. Пример обработки одномерного массива Дан одномерный массив MAS(12) из вещественных чисел. Найти наибольший элемент массива и его индекс. program pr4_1; const n = 12; {константа n определяет размер массива в описании} type m = array [1..n] of real ; { m – тип массива mas } var mas : m ; i , num : integer; max : real; begin for i:=1 to n do {ввод элементов массива mas по 1 в строке} begin writeln(‘введите элемент массива’, i) ; read (mas[i]); end; num :=1; max := mas [1]; for i: =2 to n do if mas [ i ] > max then begin max := mas [i ]; num := i ;end; writeln; { вывод массива в строку} for i:=1 to n do write (mas [ i ]:5:1 ); writeln; writeln (‘максимальный элемент = ‘, max:4:1,‘ его индекс=’ ,num ); readln; end. Переменная max сравнивается с элементами массива, и если элемент массива больше max, то переменной max присваивается значение элемента массива, а переменной num индекс этого элемента. По окончании цикла переменная max будет иметь значение, равное максимальному элементу массива, а переменная num - значение индекса этого элемента. Пример. Заполнить массив из 20 элементов случайными числами из диапазона (15,40) и вывести элементы массива на экран program massiv; uses crt; var mas:array[1..20] of integer; i:integer; begin clrscr; randomize; writeln('Элементы массива'); writeln; for i:=1 to 20 do begin mas[i]:=15+random(26); write(mas[i],' '); end; readln; end. 18 Задачи для самостоятельного решения: 1. Дана последовательность натуральных чисел a1, a2, ..., аn. Создать массив из четных чисел этой последовательности. Если таких чисел нет, то вывести сообщение об этом факте. 2. Дана последовательность чисел a1, a2, ..., аn . Указать наименьшую длину числовой оси, содержащую все эти числа. 3. Последовательность действительных чисел оканчивается нулем. Найти количество членов этой последовательности. 4. Дан массив действительных чисел, размерность которого N. Подсчитать, сколько в нем отрицательных, положительных и нулевых элементов. 5. При поступлении в вуз абитуриенты, получившие «двойку» на первом экзамене, ко второму не допускаются. В массиве А[n] записаны оценки экзаменующихся, полученные на первом экзамене. Подсчитать, сколько человек не допущено ко второму экзамену. 6. Пригодность детали оценивается по размеру В, который должен соответствовать интервалу (А - 5, А + 5). Определить, имеются ли в партии из N деталей бракованные. Если да, то подсчитать их количество, иначе выдать отрицательный ответ. 7. У вас есть доллары. Вы хотите обменять их на рубли. Есть информация о стоимости купли-продажи в банках города. В городе N банков. Составьте программу, определяющую, какой банк выбрать, чтобы выгодно обменять доллары на рубли. 8. У прилавка магазина выстроилась очередь из п покупателей. Время обслуживания i-того покупателя равно ti(i =1, ...., n). Определить время Сi пребывания i-го покупателя в очереди. 9. Секретный замок для сейфа состоит из 10 расположенных в ряд ячеек, в которые надо вставить игральные кубики. Но дверь открывается только в том случае, когда в любых трех соседних ячейках сумма точек на передних гранях кубиков равна 10. (Игральный кубик имеет на каждой грани от 1 до 6 точек.) Напишите программу, которая разгадывает код замка при условии, что два кубика уже вставлены в ячейки. 10. В массиве целых чисел с количеством элементов n найти наиболее часто встречающееся число. Если таких чисел несколько, то определить наименьшее из них. 11. Каждый солнечный день улитка, сидящая на дереве, поднимается вверх на 2 см, а каждый пасмурный день опускается вниз на 1 см. В начале наблюдения улитка находилась в А см от земли на В-метровом дереве. Имеется 30-элементный массив, содержащий сведения о том, был ли соответствующий день наблюдения пасмурным или солнечным. Написать программу, определяющую местоположение улитки к концу 30-го дня наблюдения. 12. Дан целочисленный массив с количеством элементов n. «Сожмите» массив, выбросив из него каждый второй элемент. Примечание. Дополнительный массив не использовать. 13. Задан массив с количеством элементов N. Сформируйте два массива: в первый включите элементы исходного массива с четными номерами, а во второй - с нечетными. Контрольные вопросы 1. Что такое массив? 2. Как описывается одномерный массив? 3. Как обратиться к некоторому элементу массива? Что общего между всеми элементами массива? 4. Способы заполнения массива. Литература: 1. Бабушкина И.А. Практикум по Турбо Паскалю.- М.: АБФ, 1998. 2. Емелина Е.И. Основы программирования на языке Паскаль. - М.: Финансы и статистика,1997. 3. Зуев Е.А. Turbo Pascal. Практическое программирование.- М.: ПРИОР, 1997 . 4. Немнюгин С., Перколаб Л. Изучаем Turbo Pascal. – СПб.: Питер, 2001 . 5. курс, С-Петербург, 2002 6. Фаронов В.В. Турбо-Паскаль 7.0. Начальный курс. Учебное пособие.- М.:"Нолидж",1998. 19 ЗАДАНИЕ № 5 Работа с двумерными массивами Цель работы. Разработать алгоритмы и программы решения задач. Использовать вложенные циклы для перебора элементов массива. Задав двумерный массив, реализовать обработку массива. Исходные данные должны вводиться с проверкой на область допустимых значений. Теоретическая часть: Двумерным массивом называется совокупность данных, значение которых зависит от двух чисел – индекса строки и индекса столбца. Описание двумерного массива: Var <имя> : array [нижн. инд1..верх.инд1, нижн. инд2 .. верх.инд2] of <тип элемента массива>; индекс1 определяет номер строки, индекс2 определяет номер столбца. Заполнение массива генератором случайных чисел: for i:=1 to n do for j:=1 to n do a[ i,j]:= random(100); Аналогом массива в математике являются матрицы. Если у матрицы число строк равно числу столбцов, то такая матрица называется квадратной. А(n,n) – квадратная матрица. Вывод матрицы в виде таблицы: for i:=1 to n do begin for j:=1 to n do write(a[ i,j ]:4); writeln; end; Рассмотрим пример программы с матрицей. Вывести на экран таблицу умножения. program tabl_umn; uses crt; var x,y:real; i,j:integer; a:array[1..10,1..10] of integer; begin textcolor(14); textbackground(1); clrscr; writeln('Таблица умножения'); writeln; for i:=1 to 10 do begin for j:=1 to 10 do begin a[i,j]:=i*j; write(a[i,j]:5,' '); end; writeln; end; readln; end. 20 Задачи для самостоятельного решения: 1) Магическим квадратом порядка п называется квадратная матрица размера п х п, составленная из чисел 1, 2, ..., n2 так, что суммы по каждому столбцу, каждой строке и каждой из двух больших диагоналей равны между собой. Построить такой квадрат. Пример магического квадрата порядка 3: 6 1 8 7 5 3 2 9 4 2) Вычислить сумму и число положительных элементов матрицы A[N, N], находящихся над главной диагональю. 3) Дана вещественная матрица А размера п х т. Определить k — количество «особых» элементов массива А, считая его элемент особым, если он больше суммы остальных элементов его столбца. 4) Задана квадратная матрица. Переставить строку с максимальным элементом на главной диагонали со строкой с заданным номером т. 5) Дана матрица B[N, M]. Найти в каждой строке матрицы максимальный и минимальный элементы и поменять их с первым и последним элементом строки соответственно. 6) Дана целая квадратная матрица n-го порядка. Определить, является ли она магическим квадратом, т.е. такой, в которой суммы элементов во всех строках и столбцах одинаковы. 7) Элемент матрицы назовем седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце или, наоборот, является наибольшим в своей строке и наименьшим в своем столбце. Для заданной целой матрицы размером пхт напечатать индексы всех ее седловых точек. 8) Дана вещественная матрица размером пхт. Переставляя ее строки и столбцы, добиться того, чтобы наибольший элемент (или один из них) оказался в верхнем левом углу. 9) Определить, является ли заданная целая квадратная матрица n-го порядка симметричной (относительно главной диагонали). 10) Дана целочисленная квадратная матрица. Найти в каждой строке наибольший элемент и поменять его местами с элементом главной диагонали. 11) Упорядочить по возрастанию элементы каждой строки матрицы размером пхт. 12) Задана матрица размером пхт. Найти максимальный по модулю элемент матрицы. Переставить строки и столбцы матрицы таким образом, чтобы максимальный по модулю элемент был расположен на пересечении k-й строки и k-го столбца. 13) Дана квадратная матрица A[N, N]. Записать на место отрицательных элементов матрицы нули, а на место положительных — единицы. Вывести на печать нижнюю треугольную матрицу в общепринятом виде. 14) Дана действительная матрица размером пхт, все элементы которой различны. В каждой строке выбирается элемент с наименьшим значением, затем среди этих чисел выбирается наибольшее. Указать индексы элемента с найденным значением. 21 15) Дана действительная квадратная матрица порядка N (N — нечетное), все элементы которой различны. Найти наибольший элемент среди стоящих на главной и побочной диагоналях и поменять его местами с элементом, стоящим на пересечении этих диагоналей. Контрольные вопросы 1. 2. 3. 4. 5. Что такое двумерный массив? Как его описать? Расположение в памяти двумерных массивов. Способы заполнения двумерных массивов. Как вывести двумерный массив на экран в табличной форме? Литература 1. Вирт Н. Алгоритмы + структуры данных = программы. М., 1985. 2. Голубь Н.Г., Кириленко Е.Г. Алгоритмические языки и программирование: Учебное пособие, часть 1. ХАИ, 1997. 3. Грогоно П. Программирование на языке Паскаль. М., 1982. 4. Джонс Ж., Харроу К. Решение задач в системе Турбо Паскаль. М., 1991. 5. Йенсен К., Вирт Н. Паскаль: руководство для пользователя. М., 1989. 6. Пильщиков В.Н. Сборник упражнений по языку Паскаль. М., 1989. 7. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. М., 1997. 8. Фаронов В.В. Турбо Паскаль 7.0. Практика программирования. Учебное пособие. М., 1997. 22 ЗАДАНИЕ № 6 Символьные и строковые типы данных в Pascal Цель работы. Разработать алгоритмы и программы решения задач. Исходные данные – символы и строки ( типы char, string). Использовать операторы цикла для посимвольной обработки строк и стандартные процедуры и функции для обработки строк. Теоретическая часть: Наряду с числовой информацией в Паскале используется алфавитно-цифровая или символьная информация, которая включает в себя заглавные, строчные буквы, цифры от 0 до 9 и вспомогательные символы. Для описания символьных и строковых переменных используются типы данных CHAR или STRING. Тип данных CHAR Каждая переменная символьного типа может принимать значение только одного символа. Все символы упорядочены в соответствии с принятым в ЭВМ коде (например, ASCII). При этом порядковый номер символов называется кодом (например, код латинского символа 'А ' равен 65; символа '3' равен 51). Для символьных данных не определены никакие арифметические операции, но они могут сравниваться по своим кодам, участвовать в чтении, печати, операторах присваивания. Существуют две стандартные функции преобразования Для работы с символами в Паскале часто используются следующие функции: ord(ch) - численное значение(код) символа. Например, ord('Д') = 132, ord('Е') = 133 и т.д. Букве Д соответствует номер (код) в таблице символов - 132. Это таблица ASCII - Американский стандартный код для обмена информацией, в которой закодировано 256 символов, и каждый из них имеет свой номер (код). Таблицу ASCII - можно разделить на 2 части: 1 часть - 128 кодов символов, которая является общей и неизменной. 2 часть (расширение) - еще 128 кодов, вариативная, которая содержит коды национальных алфавитов и иные символы. Для русскоязычных пользователей подходит расширение таблицы ASCII, известное как кодовая таблица 866. chr ( k ) - возвращает символ по его коду, где k - код символа. Например: chr(133) = 'E' pred(ch) - предыдущий символ, например pred('F') ='E' succ(ch) - следующий символ, например succ('F') = 'G' Строка - это ограниченная апострофами последовательность любых символов Например: ' jlhhf ' , ' qwerty ', ' 12345 ' , ' Привет ! ' Строку можно представить как массив, элементы которого имеют тип CHАR. Например: BUK: array[1..17] of char; Массив BUK - массив символов, который содержит 17 символов. Если символов меньше, то строка дополняется пробелами справа. В противном случае возникает ошибка несоответствия типов. Так как массивы символов являются обычными массивами с элементами типа CHAR, они обладают всеми свойствами массивов. 23 Пример: Из набора 10 любых символов напечатать только заглавные английские буквы и их коды. program lr1; type sl =array [1..10] of char; var s: sl; {описание массива символов} i: integer; begin writeln ('введите 10 символов'): for i:=1 to 10 do readln (s[i]); {ввод массива} for i:=1 to 10 do if (s[i]>=’A’) and (s[i]<= ‘Z’) then writeln (‘Символ :’, s[i], ‘ его код =’, ord (s[i]); readln; end. Тип данных STRING В Турбо Паскале предусмотрен тип данных STRING. Переменная типа STRING может принимать значения переменной длины. Максимально возможная длина переменной 255 символов. Например: var str: STRING[200]; ow: STRING[10]; В скобках указывается максимальная длина для данной переменной. Для ввода значений типа STRING необходимо использовать READLN, а не READ. За один раз может быть введена только одна строка. Две строки можно сравнивать, используя операции отношения (сначала сравниваются самые левые символы, если они равны, то сравниваются следующие). Для работы с переменными типа STRING используют следующие стандартные процедуры и функции: 1) Функция LENGTH C:=LENGTH(st); Переменной С будет присвоено целое значение, показывающее количество символов в строковой переменной st . Например: Значение st Выражение Результат ‘abcd’ Length(st) 4 2) Функция СОNCAТ - сцепление строк в порядке их перечисления. st:=CONCAT(st1,st2,...,stN); st-переменная типа STRING, состоящая из строк st1,...,stN. Например: Выражение Результат concat(‘Фамилия ‘,’Имя ’,’Отчество’) ‘Фамилия Имя Отчество’ 3) Функция POS P:=POS (st1, st2); Р- целое число, показывающее номер позиции, с которой начинается строка st1 в строке st2. Например: Значение st Выражение Результат ‘abcd’ Pos (‘bc’,st) 2 4) Функция COPY S1:=COPY( st, I, J); Sl-символьная подстрока, выделенная из строки st с позиции I, длиной J символов. Например: Значение st Выражение Результат ‘abcd’ copy(st,3,2) ‘cd’ 24 5) Процедура DELETE(St, I, J); Из строки st удаляется J символов, начиная с I позиции. Значение st Выражение ‘abcd’ delete(st,1,2) Результат ‘cd’ 6) Процедура INSERT(Str1, Str2, I); Строка Str1 вставляется с I позиции в строку Str2. Значение st Выражение ‘abcd’ insert(st,’****’,3) Результат ‘**abcd**’ 7) Процедура STR (V, St); Числовое значение переменной V преобразуется в строку символов и записывается в строку St. Значение v Выражение Результат -140 str(v,st) ‘-140’ 8) Процедура VAL (St, V, C); Значение st ‘-140’ ‘1.2E+01’ ’12-5’ Выражение val (st,v,c) val (st,v,c) val (st,v,c) Результат C=0 C=0 C=3 Строковое выражение st преобразуется в величину целочисленного или вещественного типа и записывается в переменной V . Если при этом ошибок не обнаруживается, то С будет равно 0 . В противном случае значение С будет равно номеру позиции первого ошибочного символа и V будет неопределенно. Строка st не должна содержать незначащих пробелов, переменная V может быть целой или вещественной, а переменная С - только целой. Пример: Подсчитать количество слов во введенной с клавиатуры строке. program lr2; var s: string[30]; kol, i, n: integer; begin writeln ('введите строку'); readln (s); kol:=0; {счетчик количества слов} n:= length(s); {определяем длину введенного текста} s:= concat(' ',s); {добавляем пробел к первому слову} for i:=1 to n do if (copy (s,i,1)=' ') and (copy (s,i+1,1)<>' ') then kol := kol+1; {подсчет количества слов} writeln (s,' количество слов= ', kol); readln; end. Задачи для самостоятельного решения: 1. Напишите программу, подсчитывающую количество букв во введенном с клавиатуры слове. Ввод осуществляйте в цикле while do. Выход из программы — строка '999'. 2. Напишите программу, подсчитывающую количество вхождений заданной буквы во введенную строку. 25 3. Напишите программу, которая вводит строку и выводит ее, сокращая каждый раз на 1 символ до тех пор, пока в строке не останется 1 символ 4. Напишите программу, определяющую число слов в строке. Одно слово от другого отделяется одним пробелом. 5. Напишите программу, определяющую, является ли введенное слово числом. 6. Введите 2 целых числа. Преобразуйте числа в две строки, объедините их в одну строку и выведите на экран результат. 7. Напишите программу, которая удаляет из введенной строки любой введенный с клавиатуры символ. В результате должна получиться программа-модель работы одного из режимов любого текстового редактора. 8. Напишите программу, удаляющую из введенной строки все пробелы. Для удаления примените в ней оператор Repeat и функцию Pos. 9. Напишите программу, сортирующую символы введенной с клавиатуры строки в порядке возрастания их номеров в ASCII-таблице. Например, если введено: 'СВА', в результате надо получить "ABC. 10. Вычислите длину самого короткого слова в предложении из трех слов, разделенных пробелами. 11. Выясните, какая из букв — первая или последняя — встречается в заданном слове чаще. 12. Задано существительное первого склонения, оканчивающееся на «а». Напечатайте это слово во всех падежах.. 13. Сколько букв «у» в заданном слове стоит на четных местах? 14. Замените в заданном слове все буквы «о» пробелами. 15. В тексте, состоящем из латинских букв и заканчивающемся точкой, подсчитайте количество гласных букв. 16. Даны два слова. Поменяйте местами буквы этих слов, занимающие одинаковые позиции. 17. Заданы фамилия, имя и отчество учащегося, разделенные пробелами. Напечатайте его фамилию и инициалы. 18. Дан текст, в котором слова разделены пробелами: подсчитайте число слов в тексте; найдите самое длинное слово текста (длина текста 100 символов). 19. Задан текст, состоящий из слов, разделенных одним или несколькими пробелами. Сформируйте новый текст, включив в него слова заданного текста, разделенные только одним пробелом. 20. Сложное слово состоит из двух частей одинаковой длины и соединительной гласной. Найдите обе части этого слова. Контрольные вопросы 1. Что такое строка? 2. Каким идентификатором определяются данные строкового типа? 3. Какова максимально возможная длина строки? Как определить текущую длину строки? 4. Какие выражения называются строковыми? 5. Какие операции допустимы над строковыми данными? 6. Каким образом производится сравнение строк? 7. Как можно обратиться к отдельным символам строки? 8. Объясните назначение специальных процедур и функций обработки данных строкового типа. Приведите примеры. Литература 1. Бабушкина И.А. Практикум по Турбо Паскалю.- М.: АБФ, 1998. 2. Емелина Е.И. Основы программирования на языке Паскаль. - М.: Финансы и статистика,1997. 3. Зуев Е.А. Turbo Pascal. Практическое программирование.- М.: ПРИОР, 1997 . 4. Фаронов В.В. Турбо-Паскаль 7.0. Начальный курс. Учебное пособие.М.:"Нолидж",1998. 26 ЗАДАНИЕ № 7 Использование процедуры и функции в Pascal Цель работы. Разработать алгоритмы и программы решения задач. Использовать в программах процедуры и функции. Теоретическая часть: Часто в задаче требуется повторить определенную последовательность операторов в разных частях программы. Для того, чтобы описывать эту последовательность один раз, а применять многократно, в языках программирования применяются подпрограммы. Подпрограмма - автономная часть программы, выполняющая определенный алгоритм и допускающая обращение к ней из различных частей общей программы. Использование подпрограмм позволяет реализовать один из методов программирования - структурное программирование. В языке Паскаль существует два вида подпрограмм: процедура (PROCEDURE ) и функция ( FUNCTION ). Процедуры и функции в Паскале объявляются в разделе описания за разделом переменных. Рассмотрим примеры и задачи использования процедуры и функций, а также использование рекурсии в языке Паскаль. Параметры, записываемые в обращении к подпрограммам, называются фактическими; параметры, указанные в описании подпрограмм - формальными. Фактические параметры должны соответствовать формальным по количеству, порядку следования и типу. Параметры, объявленные в основной (главной) программе, действуют в любой подпрограмме и называются глобальными. Параметры, объявленные в подпрограмме, действуют только в этой подпрограмме и называются локальными. Процедуры Процедуры используются в случаях, когда в подпрограмме необходимо получить несколько результатов. В языке Паскаль существует два вида процедур: процедуры с параметрами и без параметров. Обращение к процедуре осуществляется по имени процедуры, за которым могут быть указаны фактические параметры. Все формальные параметры являются локальными для данной процедуры и глобальными для каждой процедуры в ней. При вызове процедуры устанавливается взаимно однозначное соответствие между фактическими и формальными параметрами, затем управление передается процедуре. После выполнения процедуры управление передается следующему, после вызова процедуры, оператору вызывающей программы. Пример 1. Процедура без параметров, которая печатает строку из 60 звездочек. procedure pr; var i : integer ; begin for i :=1 to 60 do write (‘ * '); writeln; end; Пример 2. Процедура с параметрами. Даны 3 различных массива целых чисел (размер каждого не превышает 15). В каждом массиве найти сумму элементов и среднеарифметическое значение. program proc; var i , n , sum: integer; sr : real; 27 procedure work (r:integer; var s:integer; var s1:real); {процедура work} var mas : array [1..15] of integer ; { объявление массива мas} j : integer; begin s:=0; for j:=1 to r do begin {ввод элементов массива mas} write(' Vvedite element - ', j,': ') ; read (mas[j]); s:=s+mas [j]; end; s1:=s/r; end; begin { главная программа} for i:=1 to 3 do begin write ('Vvedite razmer ',i, ' masiva: '); readln(n); work (n, sum, sr); {вызов процедуры work} writeln ('Summa elementov = ',sum); writeln ('Srednearifmeticheskoe = ',sr:4:1); end; readln; end. В программе трижды вызывается процедура work, в которой формальные переменные r, s, s1 заменяются фактическими n, sum, sr. Процедура выполняет ввод элементов массива, вычисляет сумму и среднее значение. Переменные s и s1 возвращаются в главную программу, поэтому перед их описанием ставится служебное слово var. Локальные параметры mas, j действуют только в процедуре. Глобальные - i, n, sum, sr доступны во всей программе. Функции Набор встроенных функций языка Паскаль достаточно широк (ABS, SQR, TRUNC и т.д.). Если в программу включается новая, нестандартная функция, то ее необходимо описать в тексте программы, после чего можно обращаться к ней из программы. Обращение к функции осуществляется в правой части оператора присваивания, с указанием имени функции и фактических параметров. Функция может иметь собственные локальные константы, типы, переменные, процедуры и функции. Описание функций аналогично описанию процедур. Отличительные особенности функций: результат выполнения - одно значение, которое присваивается имени функции и передается в основную программу; имя функции может входить в выражение как операнд. Пример 3. Написать подпрограмму-функцию степени аx, где a, х – любые числа. Воспользуемся формулой: аx = ex ln a program p2; var 28 f, b, s, t, c, d : real; { глобальные параметры} function stp (a, x : real) : real; var y : real; { локальные параметры} begin y := exp (x * ln ( a)) ; stp:= y; {присвоение имени функции результата вычислений подпрограммы} end; { описание функции закончено } begin {начало основной программы } d:= stp (2.4, 5); {вычисление степеней разных чисел и переменных } writein (d, stp (5,3.5)); read (f, b, s, t); c := stp (f, s)+stp (b, t); writeln (c); end. Рекурсия В языке Паскаль процедуры и функции могут вызывать сами себя, т.е. обладать свойством рекурсивности. Рекурсивная функция обязательно должна содержать в себе условие окончания рекурсивности, чтобы не вызвать зацикливания программы. При каждом рекурсивном вызове создается новое множество локальных переменных. То есть переменные, расположенные вне вызываемой функции, не изменяются. Пример 4. Составить рекурсивную функцию, вычисляющую факториал числа n следующим образом: n! = 1 , если n= 1 и n!= ( n -1 )! · n , если n > 1 function f ( n : integer): integer; begin if n = 1 then f := 1 else f := n * f ( n -1 ); { функция f вызывает саму себя} end; Задачи для самостоятельного решения: 1. Оформите процедуру проверки права пользователя работать с программой. Используйте для этого пароль SCHOOL. В случае ввода неправильного пароля выход из программы осуществляется при помощи инструкции Halt. 2. Напишите программу, состоящую из трех процедур и основной программы. Первая процедура организует ввод двух целых чисел X и У, вторая вычисляет их сумму, третья выводит результат. Используйте эти процедуры в основной программе. Используйте X и Y как глобальные переменные. Эта программа послужит прообразом всех ваших будущих программ, так как в ней реализуется принцип работы любой системы: логически выделенные ввод, обработка и вывод результата. 3. Напишите программу вычисления для планет Солнечной системы площади поверхности и длины экватора на основе известного радиуса. Форму планет будем считать шарообразной. Вычисление площади и длины экватора оформите в виде отдельных функций. 4. Напишите программу поиска максимального из четырех чисел с использованием подпрограммы поиска большего из двух. 5. Вычислите сумму 1! + 2! + 3! + ... + п!, используя функцию вычисления факториала числа к! 6. Определите наименьший общий делитель трех натуральных чисел. 7. Даны действительные числа s, t. Напишите программу вычисления выражения f(t, -2s, 1,17) + /(2,2, t, s - t), где/(a, b, c) = (2a - b - sin (c))/(5 + |c|) 8. Дано натуральное число n. Напишите программу, определяющую, есть ли среди чисел 29 п, п + 1,..., In «близнецы», то есть простые числа, разность между которыми равна 2. (Используйте процедуру распознавания простых чисел.) 9. Создайте программу перевода двоичной записи натурального числа в десятичную. 10. Создайте программу сокращения дроби M/N, где M,N — натуральные числа. 11. Создайте программу для вычисления суммы квадратов простых чисел, лежащих в интервале (M...N). 12. Создайте программу вычисления суммы трехзначных чисел, в десятичной записи которых нет четных цифр. 13. Создайте программу вывода на экран всех натуральных чисел, не превосходящих N и делящихся на каждую из своих цифр. 14. Создайте программу подсчета числа всех натуральных чисел, меньших М, квадрат суммы цифр которых равен X. Контрольные вопросы 1. Что называется подпрограммой? В чем состоит сходство и различие подпрограммпроцедур и подпрограмм-функций в языке Turbo Pascal? 2. В чем различие между стандартными и определенными пользователем подпрограммами? Приведите примеры, 3. Запишите синтаксическую диаграмму определения процедуры, функции. 4. Опишите последовательность событий при вызове процедуры или функции, 5. В каких случаях в программе указывается директива компилятору {$1}? 6. Что называется параметром и каково его назначение? Что такое формальные и фактические параметры, какова их взаимосвязь? 7. Для чего используется исполнение программы в пошаговом режиме с заходом в процедуры, и как это осуществить? 8. Каковы отличия параметров-значений от параметров-переменных, особенности их описания и применения? 9. Чем различаются локальные и глобальные параметры? Какова область их действия? 10. Что такое рекурсия? 11. В каких случаях требуется предварительное или внешнее описание подпрограмм? Каковы особенности использования подпрограмм с предварительным описанием? Литература 1. Вирт Н. Алгоритмы + структуры данных = программы. М., 1985. 2. Голубь Н.Г., Кириленко Е.Г. Алгоритмические языки и программирование: Учебное пособие, часть 1. ХАИ, 1997. 3. Грогоно П. Программирование на языке Паскаль. М., 1982. 4. Джонс Ж., Харроу К. Решение задач в системе Турбо Паскаль. М., 1991. 5. Йенсен К., Вирт Н. Паскаль: руководство для пользователя. М., 1989. 6. Пильщиков В.Н. Сборник упражнений по языку Паскаль. М., 1989. 7. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. М., 1997. 8. Фаронов В.В. Турбо Паскаль 7.0. Практика программирования. Учебное пособие. М., 1997. 30 ЗАДАНИЕ № 8 Комбинированный тип Запись Цель работы. Разработать алгоритмы и программы решения задач. Использовать в программах комбинированный тип Запись. Теоретическая часть: Записи в Паскале – фиксированное число элементов одного или нескольких типов, то есть в отличие от массивов, в которых содержатся элементы одного типа, в записях могут содержаться элементы как одного, так и разных типов. Например, сведения о книгах имеет структуру: автор, название книги, издательство, год издания, её цена. Первые три элемента относится к строковому типу данных, четвертый к целому, а цена - к вещественному типу. Элементами записей могут быть базовые типы, переменные, массивы, указатели, записи и т.д. Элементы записи вместе с их описанием называются полями записи. Над элементами записи можно выполнять действия, допустимые для данных этого типа. Все записи должны быть описаны в разделе TYPE . Описание записи начинается со служебного слова RECORD заканчивается END, между которыми указывается список имен и типов полей, выбранных пользователем. Все идентификаторы полей в записи должны быть различными. Например, запись Воок можно описать следующим типом card: TYPE card = record Author : string [15]; Title: string [20]; Firm: string[10]; year : integer ; cena : real end; VAR Book : card; Тип записи (например, card) вводит только шаблон записи и с его именем не связан никакой конкретный обьект. Обращение к полю выполняется с помощью составного имени (селектора записи), которое состоит из: Имя_записи . имя_элемента Например, присвоить значения элементам записи Author и Title можно так: Book.author:=’Довгаль С.И.’; Book.title:=’Турбо Паскаль V 7.0’; Ввод цены книги с клавиатуры: readln (Book.cena); Для упрощения и сокращения записи составных имен используется оператор присоединения WITH. Имя записи выносится в заголовок оператора присоединения, а в блоке используются только имена полей записи. Общий вид оператора присоединения: WITH имя записи DO оператор; Предыдущие операторы можно записать проще: With Book do begin author:=’Довгаль С.И.’; title:=’Турбо Паскаль V 7.0’; readln (cena); end; 31 Пример: На выборах в Государственную думу в избирательные бюллетени внесено 7 партий в алфавитном порядке: «Единая Россия», КПРФ, ЛДПР, «Патриоты России», «Правое дело», «Справедливая Россия», «Яблоко». Электронный сканер для считывания информации с бюллетеней передает информацию о каждом бюллетене в следующем формате: если в соответствующей клетке бюллетеня стоит пометка, то сканер передает + (плюс), в противном случае он передает - (минус). Таким образом, он передает последовательность из 7 символов - плюсов и минусов. Бюллетень считается действительным, если пометка есть ровно в одной клетке. Недействительные бюллетени в подсчете результатов выборов не участвуют. Гарантируется, что есть хотя бы один действительный бюллетень. Партия проходит в Государственную Думу, только если она набирает не менее 7% от общего числа действительных бюллетеней. Требуется вывести результаты выборов по тем партиям, которые проходят в Государственную Думу. Выходные данные организовать в виде таблицы, каждая строка содержит название партии, количество голосов, % от общего числа действительных бюллетеней. Строки должны быть упорядочены в порядке убывания по количеству голосов. Входные данные: В первой строке записано число K - количество бюллетеней (K ≤10 000). В следующих K строках записана информация, полученная из бюллетеней. Каждая строка последовательность из 7 символов + или - (без пробелов). program Vibory; uses crt; type Tpartii=record name:string; golosov:integer; end; var k,k2,i,j,n,num,sum:integer; st:string[7]; urna:array[1..1000]of string[7]; partii:array[1..7] of Tpartii; {массив партий с результатами голосования} partia:Tpartii; begin partii[1].name:= 'EDINAROS'; partii[2].name:= 'KPRF'; partii[3].name:= 'LDPR'; partii[4].name:= 'PATRIOTI_ROS'; partii[5].name:= 'PRAVOE_DELO'; partii[6].name:= 'SPRAVEDLIVAIA_ROS'; partii[7].name:= 'IABLOKO'; clrscr; write('Vvedite kolichestvo blankov '); readln(k); for i:= 1 to k do readln (urna[i]); k2:= 0; for i:= 1 to k do begin sum:= 0; num:= 0; for j:= 1 to 7 do if urna[i][j]='+'then num:= j else if urna[i][j]='-'then inc(sum); f(sum=6)and(num<>0)then begin inc(partii[num].golosov);inc(k2);end; end; 32 for i:= 1 to 6 do {сортировка} for j:= i+1 to 7 do if partii[i].golosov<partii[j].golosov then begin partia:=partii[i]; partii[i]:= partii[j]; partii[j]:= partia; end; clrscr; {вывод результатов выборов} for i:= 1 to 7 do if partii[i].golosov*100/k2>=7 then begin write(partii[i].name:20); write(partii[i].golosov:10); writeln(' ',(partii[i].golosov*100/k2):2:2,'%'); end; readln; end. Задачи для самостоятельного решения: 1. Опишите запись с именем типа Graf, содержащую данные, необходимые дм построения графика из 40 точек: • название графика (тип string); • 40 значений (тип integer). Переменную, определяющую запись, назовите X. 2. Опишите запись с именем типа Baza, содержащую следующую информации для школьной базы данных: • личный номер ученика (тип integer); • фамилия, имя, отчество (.тип string); • год рождения (тип integer); • адрес (тип string). Переменную, определяющую запись, назовите Inf. 3. Опишите запись с именем типа Systema, содержащую следующую информацию о планетах Солнечной системы: • порядковый номер планеты (тип integer); • название планеты (тип string); • объем (real); • диаметр (real); • удаленность от Земли (real). Переменную, определяющую запись, назовите Planeta. 4. Опишите запись с именем типа Sport, содержащую следующую информацию о лучших спортивных достижениях школы по легкой атлетике: • вид спорта (тип string); • фамилия рекордсмена (тип string); • дата установления рекорда (запись Dat, состоящая из полей Day, Month Year); • сообщение о результате (real). Переменную, определяющую запись, назовите Rec. 5. Опишите запись с именем типа Geometr, содержащую следующую информацию об оценках по геометрии учеников класса: • фамилия, имя, отчество (тип string); • оценки за девять месяцев (не более 20 оценок в месяц). Переменную, определяющую запись, назовите Dig. 33 6. Опишите запись с именем типа Rasp, содержащую следующую информацию о движении электропоездов: • направление (тип string); • время отправления электропоездов (тип real). Переменную, определяющую запись, назовите R. 7. Опишите запись с именем типа Tovar, содержащую следующую информацию о хранящемся with присвойте значение (10, 'туфли женские', 45200.00) полям одной из записей. 8. Опишите запись с именем типа Data, содержащую следующую информацию о средней температуре в хранилище за 30 дней: • номер месяца (тип integer); • температура (тип real). Переменную, определяющую запись, назовите Zamer. Без помощи with присвойте записи начальное значение: месяц — 'июль' и температура для первого дня — 9.5. 9. Напишите программу, описывающую массив записей — телефонный справочник одноклассников — и обеспечивающую ввод данных, поиск номера телефона по фамилии, подсчет и вывод списка всех абонентов по критерию «увлечение компьютерными играми». В записи о каждом однокласснике содержатся следующие сведения: фамилия, имя, телефон, хобби. 10. Напишите программу, описывающую таблицу химических элементов, отображая следующую информацию: название, символическое обозначение, масса атома, заряд атомного ядра, список основных химических свойств. Программа должна выполнять вывод данных о химическом элементе по указанному символическому обозначению, находить элемент с самой большой массой, с самым маленьким зарядом ядра. 11. Напишите программу, описывающую массив записей о жильцах дома, отображая следующую информацию о каждом из них: номер квартиры, фамилия, имя, возраст, для лиц старше 18 лет в зависимости от рода занятий (учеба, работа, пенсия) — место учебы, место работы и трудовой стаж, для пенсионеров — год выхода на пенсию. Программа должна обеспечивать ввод данных, поиск квартиры с максимальным числом жильцов, поиск самого младшего и самого старшего жильца, поиск студентов, пенсионеров. Контрольные вопросы 1. Почему запись называется комбинированным типом данных? 2. Как определяется тип записи? Что называется полем записи? 3. Какие требования предъявляются к идентификаторам полей записи? 4. Что такое составное имя поля записи? Из каких частей оно состоит и как записывается? 5. Зачем при обращении к полю записи используется предложение With? 6. Что понимается под вложенностью записей? Каков максимально допустимый уровень вложенности? Литература 1. Вирт Н. Алгоритмы + структуры данных = программы. М., 1985. 2. Голубь Н.Г., Кириленко Е.Г. Алгоритмические языки и программирование: Учебное пособие, часть 1. ХАИ, 1997. 3. Грогоно П. Программирование на языке Паскаль. М., 1982. 4. Джонс Ж., Харроу К. Решение задач в системе Турбо Паскаль. М., 1991. 5. Йенсен К., Вирт Н. Паскаль: руководство для пользователя. М., 1989. 6. Пильщиков В.Н. Сборник упражнений по языку Паскаль. М., 1989. 7. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. М., 1997. 8. Фаронов В.В. Турбо Паскаль 7.0. Практика программирования. Учебное пособие. М., 1997. 34 ЗАДАНИЕ № 9 Файловый тип данных. Работа с файлами Цель работы. Разработать алгоритмы и программы решения задач. Использовать в программах файловый тип данных при организации ввода-вывода данных из файлов. Теоретическая часть: Файл - это упорядоченная последовательность однотипных компонентов, расположенных на внешнем носителе. Файлы предназначены только для хранения информации, а обработка этой информации осуществляется программами. Использование файлов целесообразно в случае: 1.долговременного хранения данных; 2.доступа различных программ к одним и тем же данным; 3.обработки больших массивов данных, которые невозможно целиком разместить в оперативной памяти компьютера. В Паскале определены текстовые файлы, типизированные и нетипизированные. Файл, не содержащий ни одного элемента, называется пустым. Создается файл путем добавления новых записей в конец первоначально пустого файла. Длина файла, т.е. количество элементов, не задается при определении файла. Все файлы должны быть описаны в программе либо в разделе переменных VAR, либо в разделе типов TYPE. Под чтением файла понимают ввод данных из внешнего файла, находящегося на диске, в оперативную память машины. Запись в файл - вывод результатов работы программы из оперативной памяти на диск в файл. Работа с файлами выполняется следующими процедурами: Assign – устанавливает связь между именем файла в программе (файловой переменной) и физическим именем файла, принятым в ОС. Reset - открывает существующий файл для чтения. Rewrite – создает и открывает новый файл для записи на внеш нем устройстве (если файл ранее существовал, вся предыдущая информация из него стирается). Close - закрывает открытый файл. Для определения конца файла используется стандартная встроенная функция EOF (файловая переменная), которая принимает значение True, если достигнут конец файла, и значение False в противном случае. Текстовые файлы Текстовые файлы – файлы на диске, состоящие из символов ASCII. Для разделения строк используются символы «конец строки». Текстовые файлы являются файлами с последовательным доступом. В любой момент времени доступна только одна запись файла. Другие записи становятся доступными лишь в результате последовательного продвижения по файлу. Текстовые файлы внутренне разделены на строки, длины которых различны. Для разделения строк используется специальный маркер конца строки. Объявляются текстовые файлы переменной типа text. Обрабатывать их можно только последовательно и с помощью процедур и функций: Readln (f , st )- чтение строки st из файла f и переход на начало следующей ; Writeln (f, st )- запись строки и маркера конца строки st в файл f; Append (f ) - процедура, открывающая файл f для добавления строк в конец файла; 35 Eoln (st )- логическая функция, результат выполнения которой равен TRUE, если достигнут маркер конца строки st. Пример 1. Создать текстовый файл, в который записать 3 предложения. Прочитать этот файл, вывести его содержимое на экран. Определить длину каждого предложения. Program File_text; var f1 : text; st : string; n: byte; begin assign (f1, 'file1.txt'); {связать с файлом file1.txt файловую переменную f1 } rewrite (f1); { создать новый файл с именем file1.txt } writeln ( f1, 'Очень полезно изучать'); { записать предложения в файл} writeln ( f1, ' всем студентам '); writeln (f1, ' язык Pascal '); close (f1); { закрыть файл для записи } reset (f1); { открыть файл для чтения } while not eof (f1) do { пока не достигнут конец файла f1} begin readln (f1, st); {читаем строку из файла f1 } writeln(st); { выводим на экран } n:= length (st); {определяем длину строки } writeln (' длина =',n); end; close (f1); { закрыть файл для чтения} end . Типизированные файлы Типизированные файлы – это файлы, состоящие из нумерованной последовательности объектов (записей) любого типа. С такими файлами можно работать в режиме прямого доступа, при котором выполняется непосредственное об ращение к любой записи файла. Каждая запись файла имеет свой номер, начиная с 0 и т.д. Процедуры и функции обработки файлов: 1) Write и Read- записывают и читают информацию из указанного файла и перемещают указатель файла к следующей записи. 2) Seek (файловая переменная, номер записи); процедура перемещения указателя на запись файла с заданным номером. 3) Truncate (файловая переменная); процедура, усекающая файл по текущей позиции указа теля файла, т.е. все записи, находящиеся после указателя фай ла, удаляются. 4) Функция Filesize (файловая переменная); имеет тип Integer и определяет размер файла, т.е. число записей. 5) Функция Filepos (файловая переменная); имеет тип Integer и возвращает текущую позицию указателя файла. Для добавления записей в конец файла используются процедуры: Seek (f, filesize (f)); Write (f, a); 36 При этом указатель устанавливается за конец файла, т.к. нумерация записей начинается с нуля. После чего с помощью Write можно добавлять записи. Открывать файл можно только процедурой Reset (f). Для того, чтобы в режиме произвольного доступа считать, а затем изменить значение записи, следует выполнить два вы зова процедуры Seek. Один вызов перед операцией Read, а другой - перед операцией Write (т.к. Read после чтения записи переместит указатель к следующей записи). Пример: Создать файл из списка 10 студентов с их оценками (номер, Ф.И.О. и три оценки). Вывести его содержимое на экран, изменить фамилию студента с номером, введенным с клавиатуры, заново прочитать файл. Program file; Type wed = record {Тип wed включает 3 поля: n, fio, bal} n : byte ; fio : string[15] ; bal : array [1..3] of byte; {Поле bal – массив из 3 оценок } end; Var spisok : wed ; {Запись spicok типа wed} sp : file of wed; {Файл записей типа wed} procedure vvod; { процедура создания файла} var i,j:byte; begin { оператор assign находится в основной прграмме } rewrite ( sp); {открытие файла для записи} with spisok do For i:=1 to 10 do begin n:=i; writeln (' Введите фамилию - ', i ); readln (fio); writeln (' Введите 3 оценки ', fio ); For j:= 1 to 3 do readln ( bal [j] ); write (sp , spisok); { запись в файл информации о студенте} end; close (sp); { закрытие файла для записи } end; procedure print; { процедура чтения и печати всего файла } var j : byte; begin reset ( sp); {открытие файла для чтения} writeln (‘ Список студентов: ‘); while not eof (sp) do with spisok do begin Read (sp, spisok); {чтение данных из файла} write (n,' ',fio); {вывод записи на экран} For j:= 1 to 3 do write (' ', bal [j] ); writeln ; end; readln; close (sp) ; end; 37 procedure work; var num: integer; begin reset ( sp); {открытие файла для чтения} writeln ('номер= '); readln (num); seek (sp, num-1); {поиск записи с указанным номером (нумерация записей с 0)} read (sp,spisok);{чтение и перемещение указателя к сле д. записи} write ('fio='); writeln (spisok.fio); seek (sp,filepos(sp)-1); {возвращение к изменяемой записи } writeln (‘ Введите новую фамилию’ ); readln (spisok.fio); write (sp, spisok); {запись в файл измененной записи} close (sp); end; begin {начало основной программы} assign (sp,'Vedom.DAT'); {связать файловую перем-ю sp с файлом Vedom.dat} vvod; print; {процедуры создания и чтения файла} work; print; {корректировка и чтение измененного файла} readln end. Задачи для самостоятельного решения: 1. Напишите программу, создающую файл, состоящий из 10 значений типа integer. Прочитайте файл и вычислите сумму его элементов. Тип record не используйте. 2. Напишите программу, создающую файл, состоящий из неопределенного количества значений типа integer. Для ввода используйте цикл, выход из цикла — значение 999. После записи выведите файл на экран и уничтожьте файл. Тип record не используйте. 3. Напишите программу, создающую файл, состоящий из 10 значений типа integer. Прочитайте файл и определите, есть ли в нем введенное с клавиатуры значение. Тип record не используйте. 4. Напишите программу, которая создает файл из элементов типа Char с помощью цикла while. Признак выхода из цикла — буква «z». Скопируйте созданный файл в другой файл и выведите его на экран. 5. Напишите программу, создающую файл, состоящий из пяти значений типа real. Тип record не используйте. Выведите файл на экран. В цикле while, .do расширьте файл за счет добавления новых значений. Выход из цикла — 999. После расширения выведите файл на экран. 6. Создайте файл, компоненты которого являются целыми числами. Напишите программу, перезаписывающую компоненты файла в обратном порядке (без создания нового файла). 7. Дан файл f, компоненты которого являются целыми числами. Напишите программу, записывающую в файл q все компоненты файла f, делящиеся на 5 и принадлежащие интервалу [С, D]. о работнике, имеющем максимальный оклад. 8. Напишите программу, которая создает файл RANDOM1.DAT, состоящий из 50 случайных чисел типа integer в диапазоне 0...200. После создания выведите элементы файла на экран. 9. Напишите программу, создающую файл RAND0M2.DAT, состоящий из 100 случайных чисел типа integer в диапазоне 0...300. Исследуйте получившийся файл с целью обнаружения в нем простых чисел 23, 31, 37, 41, 53, 107, 127,151, 197. В конце программы уничтожьте созданный файл. 10. Напишите программу, создающую файл F1.DTA из 10 элементов типа integer. Выведите его на экран. Удалите последние пять элементов и выведите содержимое файла на экран. 11. Напишите программу, создающую файл OLD.T из элементов типа char с помощью цикла repeat. Признак выхода из цикла — символ «!». Присвойте файлу новое имя NEW.T и выведите 38 его содержимое на экран. 12. Напишите программу, считывающую текст из файла, заменяющую в нем все буквы «о» на «а» и записывающую файл на диск. 13. Напишите программу, создающую файл со следующими записями о владельцах автомототранспорта: марка автомобиля, номер регистрации в ГИБДД, дата постановки на учет, фамилия, имя, отчество владельца, домашний адрес (область, город, район, улица, дом, квартира) — и обеспечивающую обслуживание данного файла: запись, изменение и удаление данных, а также поиск данных по регистрационному номеру. 14. Напишите программу, построчно выводящую содержимое текстового файла на экран и на печать. 15. Имеется текстовый файл. Напишите программу переформатирования этого файла с разбиением на строки так, чтобы каждая строка оканчивалась точкой или содержала ровно 60 символов, если среди них нет точки Контрольные вопросы 1. Назовите общие и отличительные черты текстовых, типизированных и нетипизированных файлов. 2. Для чего используется специальная файловая переменная? Как устанавливается соответствие файловой переменной файлу во внешней памяти? 3. Что общего у процедур Reset и Rewrite и чем они различаются? 4. Какие отличия существуют в использовании процедуры Reset при открытии различных типов файлов (текстовых, типизированных)? 5. Зачем применяется процедура Cl ose? 6. Какие процедуры применяются для переименования и удаления файлов? Каковы особенности их использования? 7. В чем заключается специфика текстовых файлов? Каково назначение процедуры Append? Опишите особенности, отличающие процедуры Read и Write от Readln и Writeln. 8. Объясните назначение функций Eoln, Eof, SeekEoin, SeekEof. 9. Опишите назначение процедур, Seek, Truncate, FilePos, FileSize. 10. Можно ли, считав из файла пятый элемент, затем сразу же считать второй элемент? А какой можно? 11. В какое место файла можно добавлять новые элементы: в начало, в конец, в середину, куда угодно, никуда? 12. Верно ли, что в одно и то же время нельзя считывать из файла и записывать в него? Верно ли, что, начав считывать из файла, затем уже никогда нельзя записывать в него? А наоборот? Литература 1. Голубь Н.Г., Кириленко Е.Г. Алгоритмические языки и программирование: Учебное пособие, часть 1. ХАИ, 1997. 2. Джонс Ж., Харроу К. Решение задач в системе Турбо Паскаль. М., 1991. 3. Йенсен К., Вирт Н. Паскаль: руководство для пользователя. М., 1989. 4. Пильщиков В.Н. Сборник упражнений по языку Паскаль. М., 1989. 5. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. М., 1997. 6. Фаронов В.В. Турбо Паскаль 7.0. Практика программирования. Учебное пособие. М., 1997. 39 40