Муниципальное общеобразовательное учреждение «Гимназия №1» Практическое руководство по языку Паскаль Составитель: Горбатовская И.Л. Сосновоборск – 2006 1 2 Содержание Стр. Введение § 1 Алфавит языка Паскаль. Организация данных. Структура программы. Оператор присваивания. § 2 Работа в системе Турбо Паскаль. § 3 Операции над числовыми переменными. Логические операции. § 4 Ввод-вывод в Паскале. Процедуры модуля CRT. § 5 Условный оператор. § 6 Оператор выбора. § 7 Оператор безусловного перехода. Метки. § 8 Организация циклов. § 9 Массивы. п. 9.1. Одномерные массивы. п. 9.2. Двумерные массивы (матрицы). § 10 Строковые переменные. § 11 Подпрограммы. 3 4 7 10 12 14 17 21 22 23 29 29 34 41 44 Введение. Основные понятия темы «Алгоритмы». Алгоритм – это последовательность действий, которые должен выполнить исполнитель для достижения конкретной цели. Слово «алгоритм» происходит от algorithmi – латинской формы написания имени великого математика IX века аль-Хорезми, который сформулировал правила выполнения четырёх арифметических действий. Первоначально под алгоритмами понимали только правила выполнения арифметических действий. В дальнейшем это понятие стали использовать для обозначения любой последовательности действий, приводящих к решению поставленной задачи. Алгоритм содержит несколько шагов. Шаг – отдельное законченное действие. Исполнитель – это объект, умеющий выполнять определённый набор действий. Исполнителем может быть человек, животное, робот, компьютер. Система команд исполнителя (СКИ) – это все команды, которые исполнитель умеет выполнять. Среда исполнителя: обстановка, в которой функционирует исполнитель. Выполняя алгоритм, исполнитель может не вникать в смысл того, что он делает, и тем не менее получать нужный результат. В таком случае говорят, что исполнитель действует формально, т.е. отвлекается от содержания поставленной задачи и только строго следует некоторым правилам, инструкции. Построение алгоритма для решения задачи из какой-либо области требует от человека глубоких знаний в этой области. На поиски алгоритма решения некоторых задач учёные затрачивают годы. Но решение задачи по уже созданному готовому алгоритму не требует каких-либо рассуждений и сводится только к строгому выполнению команд алгоритма. В этом случае исполнение алгоритма можно поручить не человеку, а машине. Действительно, простейшие операции, на которые при создании алгоритма расчленяется процесс решения задачи, способна реализовать и машина. Это положение лежит в основе работы автоматических устройств, автоматизация деятельности человека. 4 Свойства алгоритма: Дискретность (прерывность, раздельность) – разбиение алгоритма на шаги; Понятность – каждый шаг алгоритма должен быть понятен исполнителю; Точность – указание последовательности шагов; Массовость – использование алгоритма для решения однотипных задач. Способы описания алгоритма: Словесный (письменно или устно); Графический (стрелками, рисунками, блок-схемами); Программный. В 60-70-х годах ХХ века активно развивалась методика, которая получила название «структурное программирование». Первый принцип структурного программирования заключается в том, что при построении алгоритма используются три базовые алгоритмические структуры: следования (линейный), ветвление, цикл. Алгоритм называется линейным, если он содержит N шагов, и все шаги выполняются последовательно друг за другом от начала до конца. Алгоритм называется разветвляющимся, если порядок выполнения шагов изменяется в зависимости от некоторых условий. Алгоритм называется циклическим, если определённая последовательность шагов повторяется несколько раз в зависимости от заданной величины (параметра цикла). Тело цикла – это шаги алгоритма, которые выполняются несколько раз. Параметр цикла – величина, от которой зависит число повторений в цикле. Вторым фундаментальным принципом структурного подхода является метод последовательной детализации. Последовательная детализация – это построение алгоритма «сверху-вниз». Сначала строится основной алгоритм и в нём записываются обращения к вспомогательным алгоритмам первого уровня, которые могут содержать обращения к вспомогательным алгоритмам второго уровня, и т.д. 5 Этапы решения задач на компьютере 1) Постановка задачи: Сбор информации о задаче; Формулировка условия задачи; Определение конечных целей решения задачи; Описание данных. 2) Анализ и исследование задачи: Подбор необходимых формул, уравнений, неравенств. 3)Разработка алгоритма: Определение типа алгоритма; Выбор формы записи алгоритма; Проектирование алгоритма. 4) Программирование: Выбор языка программирования; Уточнение способов ввода данных; Запись алгоритма на выбранном языке программирования. 5) Тестирование и отладка программы. 6) Анализ результатов решения задачи. 7) Сопровождение программы: Составление пояснительной записки к программе. Вопросы для самоконтроля. 1. Какую последовательность предписаний можно назвать алгоритмом? 2. Что называется системой команд исполнителя? Поясните на примере. 3. Какие свойства алгоритмов позволяют человеку автоматизировать их выполнение? 4. В чём состоят основные принципы структурного программирования? 6 § 1 Алфавит языка Паскаль. Организация данных. Структура программы. Оператор присваивания. Одним из наиболее популярных сегодня языков программирования является язык Паскаль, стандарт которого был принят в 1973 году. Этот язык был разработан швейцарским профессором Никлаусом Виртом и был назван в честь французского учёного, изобретателя механический вычислительной машины – Блеза Паскаля. Как каждый язык, Паскаль имеет свой алфавит. В него входят: латинские буквы, цифры от 0 до 9, специальные знаки (+, -, /, *, =, <, >, <= (меньше либо равно), >=(больше либо равно), <>(не равно), [, ], ;, : и т.д), а так же служебные слова (из английского языка begin, end, for, while и др.). Программа, написанная на языке Паскаль, предназначена для обработки данных. В зависимости от способа хранения и обработки в ЭВМ данные можно разбить на две группы: константы и переменные. Константы – это те данные, значения которых не изменяются в процессе работы программы. Переменные – это те данные, значения которых могут изменяться в процессе работы программы. Все данные программы должны иметь индивидуальную идентификацию (имя). Приведём наиболее важные ограничения, имеющие место при выборе имён. 1) В качестве имени нельзя использовать служебные слова. 2) Имя состоит из латинских букв, цифр и знаков подчёркивания. 3) Имя должно начинаться с буквы. 4) Имя может быть любой длины, но значимыми являются только первые 8 символов. 5) Символ подчёркивания не воспринимается ЭВМ. Например, имена Time_OF и TIMEOF – идентичны. Каждое имя соответствует некоторой ячейке памяти, куда записывается значение переменной величины. Ячейка – понятие условное, это последовательность разного количества байтов памяти, которое определяется типом данных. 7 Тип переменной определяет не только величину ячейки, но и множество значений этой переменной, а также набор операций, которые к ней могут быть применены. Типы величин. целые вещественные символьные логические ПРОСТЫЕ Byte (0..255) Word (0..65535) Shorting (-128..127) Integer (-32748..32748) Lonint (-2147483647..2147483647) Real (от 2.9*10-39 до 1.7*1038 , до11 знака ) double (от 5*10-324 до 1.7*10308 , до15 знака ) Char (значением может быть только 1 символ) Boolean (принимает одно из двух значений: true или false) СЛОЖНЫЕ Массивы (array) Перечисляемый Ограниченный Строковый (string) Множества (set) Записи (record) Файлы (file) Программа на Паскале состоит из двух частей: описания используемых данных и программного блока. Общий вид программы: Program (имя программы); Имена стандартных модулей; Могут Label (список меток); отсутствовать Const (список констант); Type (описание сложных типов данных); Var (описание типов переменных); {функции и процедуры} Begin (начало программы) (тело программы) Содержит операторы, описывающие алгоритм решения задачи. End. (конец программы) Правила записи программы на языке Паскаль. Имя программы не должно содержать более 8 символов и соответствовать правилам записи имён переменных. Программа начинается со слова program и заканчивается словом end с точкой. 8 Операторы, разделы и описания разделов заканчиваются точкой с запятой. В разделе описания типов переменных имена переменных одного типа перечисляются через запятую, затем после двоеточия указывается их тип. Описание каждого типа заканчивается точкой с запятой. Программный блок содержит операторы, описывающие алгоритм решения задачи. Оператор – указание, которое определяет характер и последовательность выполнения действий по обработке данных. Основное преобразование данных, выполняемое компьютером, присваивание переменной нового значения. Общий вид оператора присваивания: Имя переменной:= арифметическое выражение. Знак «:=» читается «присвоить». При выполнении оператора присваивания рассматривается арифметическое выражение, из ячеек оперативной памяти, соответствующих стоящим там именам, вносятся в процессор значения и выполняются указанные действия над данными. Полученный результат записывается в ячейку памяти, имя которой указано слева. Если значение переменной не определено, то ему присваивается значение 0. Например, х:=3.14; (переменной х присваивается значение 3.14) а:=b+c; (из ячеек b и c считываются заранее помёщённые уда данные, вычисляется сумма, результат записывается в ячейку а) i:=i+1; (значение переменной увеличивается на единицу) Для типов переменной слева и арифметического выражения справа от знака присваивания существуют ограничения: 1) если переменная слева вещественного типа, то арифметическое выражение может быть как целого, так и вещественного типа; 2) если переменная слева целого типа, то арифметическое выражение только целочисленное. Задания. 1. Определите, почему не работают программы с приведёнными ниже заголовками: a) programma Juk; b) program Begin; program Школа. 2. Определите, какие из приведённых ниже имён и почему нельзя использовать в качестве имён переменных: a) seleznew_Petr_11b; b) F7_1f2; c) Dog-Cat; d) Petr Ivanov 10d; e) Alfa; 9 f) WR12.23 g) 10b_Petrov; h) Alfa/Beta. 3. Выполните операторы присваивания и определите значения всех переменных. а) Var k, x, a, y, b: real; в) Var k, t, q, y,l: real; x:= 3.75; k:=105.6; k:=2*x+0.3; t:=4.6; a:=3*x+0.05; q:=-7.3+t; y:=k+1.7; y:=q+2*t-l*k; b:=2*a+x; l:=2*q; 4. Запишите в виде операторов присваивания следующие действия: а) переменной t присвоить среднее арифметическое значение переменных u,v,w; b) значение переменной a уменьшить на 5.1; c) в качестве нового значения переменной z принять её текущее значение возведённое в куб; d) переменной с присвоить сумму квадратов переменных a и b. 5. Заданы значения переменных а=12; b=5. Каковы будут значения этих переменных после выполнения следующих фрагментов программы: a) a:=b; b:=a; c:=a+b; b) f:=a; a:=b; b:=f; c:=a+b; § 2 Работа в системе Турбо Паскаль. Интегрированная среда Турбо Паскаль включает в себя средства подготовки исходной программы, библиотеки, компилятор, компановщик, отладчик. Средства подготовки исходной программы - это текстовый редактор для набора и редактирования текста программы. Библиотеки – специальные программы, содержащие стандартные модули (готовые программы), которые можно вставить в программу, вызывая по имени (графический модуль, модуль CRT). Компилятор (compiler) – программа, для перевода исходного текста в машинные коды. Компановщик (liker) – программа, предназначенная для добавления к программе кодов из библиотечных модулей и соединения программы в единое целое. Отладчик (debugger) – программное средство, позволяющее проверить программу и устранить выявленные ошибки. 10 Все компоненты интегрированной среды тесно взаимосвязаны и не могут работать отдельно друг от друга. Загрузка системы осуществляется запуском файла turbo.exe. После загрузки системы на экране появляется рабочий стол системы. В верхней части экрана расположено главное меню, в нижней – назначение горячих клавиш. File Edit Search Run Compile Debug Tools Options Window Help ╔═[■]═════════════ NONAME00.PAS ════════1═[↕]═╗ ║ ║ ║ ║ ║ ║ ║ ╚═══════ 1:1 ═════◄■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒►─┘ F1 Help F2 Save F3 Open Alt+F9 Compile F9 Make Alt+F10 Local menu Пункт File – содержит в себе опускающееся меню работы с файлами. Пункт Compile – содержит в себе опускающееся меню компиляции файлов. New Open... F3 Save F2 Save as... Save all Change dir... Print Printer setup... DOS shell Exit Alt+X Создать новый файл Compile Alt+F9 Make F9 Build Target... Real Primary file... Clear primary file Information... Открыть файл Сохранить файл Выход из программы Компилировать файл Пункт Run – содержит в себе опускающееся меню запуска программ на исполнение. Run Ctrl+F9 Step over F8 Trace into F7 Go to cursor F4 Program reset Ctrl+F2 Parameters... Выполнить программу 11 Для просмотра результатов работы используйте клавиши Alt+F5. 12 § 3 Операции над числовыми переменными. Логические операции. Для работы с числами используют шесть операций: 1. «+» сложение 2. «-» вычитание 3. «*» умножение 4. «/» деление 5. mod остаток от деления 6. div целая часть от деления Находить остаток от деления и делить нацело можно только целые числа. Например, 5 mod 2 = 1, 5 div 2 = 2. Если один из операндов имеет вещественный тип, то результат операции будет вещественным. Выражения в Паскале записываются в строку. Выполнения операций производится согласно приоритету: выражения в скобках, умножение, деление, mod, div, сложение, вычитание. Функции Abs(x) Exp(x) Cos(x) Sin (x) Arctan(x) Ln(x) Sqr(x) Sqrt(x) Random(x) Pi Int(x) Trak(x) Trund(x) Round(x) Odd(x) Стандартные математические функции. Тип Тип Действие функции аргумента значения функции Integer, real Как у х Модуль х Real Real ех Real Real Cos x, x- в радианах Real Real Sin x, x- в радианах Real Real Arctg x Real Real Натуральный логарифм х Integer, real Как у х х2 Real Real х, х 0 Integer Real Если х не указано, то случайное число от 0 до 1. Если х – указан, то число от 0 до х. Real Число . Точность зависит от процессора. Real Real Целая часть х Real Real Дробная часть х Real Integer Целая часть х Real Integer Значение х, округлённое до следующего целого числа Integer boolean Значение функции true, если х – нечётное, и false – если х – чётное. 13 Для записи условий используют логические выражения, которые записываются при помощи логических операций. Приоритет Операция Значение 0 Not Отрицание 1 And Логическое умножение (конъюнкция И) 2 Or Логическое сложение (дизъюнкция ИЛИ) 3 = Равно <> Не равно < Меньше <= Не больше > Больше >= Не меньше Таблица истинности логических операций a b not (a) a and b true true false true false true true false true false false false false false true false a or b true true true false Задания. 1.Определите результаты операций: a) x:=3 mod 5; b) x:=7 div 3 +7 mod 3; c) x:= 27 div 3 div 3; d) x:= 27 mod 5 + 3. 2. Определите значение логической переменной u (w:=true; v:=true; h:=false): a) u:= v and h or w; f) u:= not (h or w); b) u:= v and h or w = h; g) u:= not h and w; c) u:= v and h or (w = h); h) u:= not (h and w); d) u:=v and (h or w) = h; i) u:= not h and not w; e) u:= not h or w; q) u:= not h or not w. 3. Определите результат вычислений: a) y:= sqr(sin(0.5))+sqr(cos(0.5)); b) y:= sqrt(sqr(3)+sqr(4)); c) y:= int(3.7)+round(3.7); d) y:=abs(cos(Pi)-sin(Pi/2)). 4. Вставьте в выражения скобки, если они необходимы, и удалите лишние: a) (sqr(x)*2)/5+sin Pi; b) ((x+2)*x/(x+5); c) ((x*2)+x)/(x*5); d) (sin(x))+(sqr(sin(x))); e) (abs(2*(x/5)))+1. 14 5. Запишите по правилам языка Паскаль следующие выражения: a) x x 2 ; b) tgx; c) 3x2+2x2+1; d) x5; e) (1-x2+5sinx)2. 6. Напишите наиболее короткие вычисления: y=x8; y=x10; y=x15; y=x19. 7. Каким формулам соответствуют соответствующие арифметические выражения: a) (a+b)/(x+y); b) 2.3*z*sqrt(x+y); c) (sqr(a)+sqr(b))/a+b)*3*a/sqr(x). 8. Вычислите значения выражений: a) (5+7*2)*7; b) 3-8+21 div 3; c) (2+3) mod 7 -2; d) 5-2/10; e) (5+2)/10; f) 7/7 mod 2. 9. Запишите операторы присваивания, определяющие значения переменной Х по следующим правилам: a) Х=a+ b ; a b) X= a c b d ; e f g 10. Найдите ошибки в каждом из следующих операторов присваивания: a) X=I+4; b) X:=2,76*A; c) X:=A/-D; d) P:=2.5 MOD 2; e) 3*X:=L; f) 1:=7 mod 2. § 4 Ввод-вывод в Паскале. Процедуры модуля CRT. Для сообщения данных компьютеру служат операторы ввода и вывода. Оператор ввода помещает вводимое значение переменной в отведённую для неё ячейку. Операторы ввода: Read (список имён); Readln (список имён); Оператор read (читать) останавливает работу программы и ждёт пока пользователь наберёт на клавиатуре значение переменной и нажмёт <Enter>. Если список ввода содержит несколько имён, то 15 для каждого надо ввести своё значение. Значения вводятся через пробел, или через запятую, или пи нажатии клавиши <Enter>. После работы этого оператора курсор располагается за последним числом, но не переводится на новую строку. Для перевода курсора на новую строку используется оператор readln. Для вывода результатов работы программы на экран дисплея служат операторы вывода: Write (список вывода); Writeln (список вывода); Оператор write (писать) выводит данные на экран дисплея. Список вывода – перечисленные через запятую имена переменных, арифметические выражения. Также в список вывода, для пояснения, входят заключённый в апострофы тексты. Перевод курсора на новую строку осуществляется оператором пустого ввода writeln; Если надо перевести курсор после печати, то применяется writeln. Для вывода вещественных переменных указывают параметры выводимого формата. Первое число указывает количество символов в числе, второе – количество знаков после запятой. Например, writeln (‘пи=’, PI:2:1); На экран будет выведено сообщение: пи=3.1 В составе Турбо Паскаля есть специальный модуль с именем CRT, в котором располагаются процедуры и функции для управлением выдачей текста на экран, изменением цвета, анализа нажатия клавиш. В текстовом режиме экран дисплея можно рассматривать как множество позиций. В каждой позиции может быть изображён один символ. Большинство дисплеев имеют по 80 позиций в строке (столбцы) и 25 строк на экране. Строки нумеруются сверху вниз, начиная с 1, столбцы – слева направо, тоже начиная с 1. Весь экран целиком и любая его прямоугольная область могут представлять собой текстовое окно. Это значит, что для такой прямоугольной области можно задать её собственный цвет (он называется цветом фона) и цвет символов, изображаемых в окне. Для работы с окнами используются следующие процедуры и функции: 16 Процедуры и функции модуля CRT. Процедуры: 1. 2. 3. 4. 5. 6. 7. 8. Window (X1,Y1,X2,Y2) Clrscr Gotoxy (m,n) Textbackground (c) Textcolor ( c ) Delay (n) Sound (n) Nosound Определяет положение текстового окна на экране. (clear screen) очистка экрана. Установка курсора в позицию m строки n. Установка цвета фона (0 c 15). Установка цвета шрифта (0 c 15). Приостановка выполнения программы на n миллисекунд. Запуск звукогенератора с частотой тока n Гц. Отключение звукового сигнала. Функции: 1. Keypressed 2. Readkey Функция может принимать 2 значения: true или false. Значение true. Если на клавиатуре ещё не нажата какая-либо клавиша, и false – в противном случае. Ввод символа с клавиатуры без отображения его на экране. (1,1) (Х1, У1) Окно совпадает с экраном Текстовое окно (Х2, У2) (80,25) Например, рассмотрим оформление программы вычисляющей сумму двух обыкновенных дробей a c e . b program sum_drob; uses crt; var a,b,c,d,e,f:integer; begin textbackground (3); textcolor (0); clrscr; gotoxy (5,5); read(a); gotoxy (5,6); write ('--'); gotoxy (5,7); read(b); gotoxy (8,6); write ('+'); gotoxy (9,5); read(c); gotoxy (9,6); write ('--'); gotoxy (9,7); read(d); f:=b*d; d f - подключение модуля CRT - определение цвета фона (бирюзовый) - определение цвета текста (чёрный) - очистка экрана - курсор устанавливается в позицию (5,5), где ожидается ввод значения числителя первой дроби 17 e:=a*d+b*c; gotoxy (11,6); write ('='); gotoxy (12,5); write(e); gotoxy (12,6); write ('--'); gotoxy (12,7); write(f); Readkey; End. Задания. 1) Напишите программу вычисления среднего арифметического двух чисел. 2) Напишите программу вычисления расстояния между двумя точками плоскости. 3) Напишите программу вычисления площади треугольника по формуле Герона. 4) Напишите программу вычисления площади и гипотенузы прямоугольного треугольника, если известны его катеты. 5) Напишите программу определения времени встречи двух автомобилей, если известно расстояние между двумя пунктами, откуда они вышли навстречу друг другу одновременно, а также их скорости. 6) Найдите сумму цифр заданного трёхзначного числа. 7) Зал кинотеатра вмещает n рядов кресел по m мест в ряду. Стоимость билетов с 1 по [n/3] ряд x рублей, с [n/3]+1 по [2n/3] ряд – y рублей, с [2n/3] +1 по n ряд z рублей. Составьте программу вычисления общей стоимости билетов, если зал заполнен полностью. [] – целая часть. § 5 Условный оператор. В практике хорошо известны задачи, дальнейший ход решения которых зависит от выполнения какого-либо условия. Команды, с помощью которых записываются алгоритмы подобного типа (разветвляющиеся), называются командами ветвления. Команде ветвления в Паскале соответствует условный оператор. Условный оператор может иметь две формы: Неполная форма THEN Полная форма IF Да Условие Нет Да THEN Оператор Оператор 1 18 IF Условие Нет ELSE Оператор 2 IF условие THEN оператор IF условие THEN оператор1 ELSE оператор2 В неполной форме действие выполняется тогда и только тогда, когда выполняется записанное условие. В случае невыполнения условия происходит переход к следующему оператору. В полной форме в случае выполнения условия выполняется одно действие, а в случае невыполнения – другое. Каждая структура имеет один вход и один выход. Для записи оператора ветвления используют английские слова: IF – если, THEN – то, ELSE – иначе. Если после слов THEN и ELSE надо выполнить не один оператор, а несколько, то их записывают между служебными словами BEGIN и END. Перед словом ELSE точка с запятой не ставится. Каждую пару BEGIN – END рекомендуется записывать в одном столбце: так легче проверить соответствие. Например, If a<b then y:=x; If a+b<c then begin z:=x; x:=y; y:=z; end else begin z:=x; x:=sqr(y); y:=sqr(x); end; В качестве выполняемого в условном операторе действия может быть другой условный оператор. Например, If a<0 then write (‘отрицательное’) else if a=0 then write (‘ноль’) else write (‘положительное’); Задания. 1.Определите результат при m=2, n=-4. a) if m>n then if n>0 then write(m) else write (n) else write (m+n); b) if (m<n) or (n<0) then write(m) else write (n); 19 c) if (m<n) then if (n>0) or (m>0) then write (m) else write (n); d) if not ((m>0) and (n<0)) then write (m) else write (n); Напишите программы на Паскале для решения следующих задач. 2. Даны три числа а, b, с. Выясните, верно ли a<b<c. Ответ получите в текстовой форме: верно или неверно. 3. Даны положительные числа a, b, c, x. Выясните, пройдёт ли кирпич с рёбрами а,b,c в квадратное отверстие со стороной x. 4. Выясните принадлежат ли числа a и b промежутку (-1;1). 5. Даны числа x и y. Вычислите число z, равное х+у, если х≤у, и 1-х+у в противном случае. 6. Присвойте z значение большего из чисел х и у в том случае, если x<0, и меньшего если х≥0. 7. Присвойте величине а значение наибольшего из трёх заданных чисел. 8. Даны два числа. Выведите первое из них, если оно больше второго, и оба числа, если это не так. 9. Проверьте, есть ли среди трёх заданных чисел равные. 10. Даны два действительных числа. Меньшее из них замените полусуммой этих чисел, а большее – их произведением. 11. Вычислите наименьшее из трёх заданных чисел. 12. Найдите решение уравнения ах+b=0, если оно существует. 13. Если данное число х меньше нуля, то z присвойте значение большего из двух чисел х и у, иначе z присвойте значение полусуммы этих чисел. 14. Даны три числа. Найдите разность большего и меньшего из них. 15. Возведите данное число х в куб, если оно чётное и в квадрат в противном случае. 16. Даны три стороны треугольника a, b, c. Определите, является ли данный треугольник прямоугольным. 17. Найдите решение уравнения ах2+bх+с=0, если оно существует. 18. Определите, является ли билет с шестизначным номером счастливым. 19. Вычислите модуль вещественного числа. 20. Даны две точки в плоской прямоугольной системе координат. Определите, которая из точек находится ближе к началу координат. 21. Определите, в какой координатной четверти лежит точка с координатами (х, у). 22. Написать программу, классифицирующую треугольники (остроугольные, прямоугольные, тупоугольные), если даны углы. 20 Предусмотреть случай, когда треугольника с такими углами не существует. 23. Написать программу, классифицирующую треугольники (равносторонние, равнобедренные, разносторонние), если даны углы. Предусмотреть случай, когда треугольника с такими углами не существует. 24. Ввести х и у и вычислить S. 1 1 , если х≠0 и у≠0 S= х у 1 , если х≠0 и у=0 х 1 , если х=0 и у≠0 у 0, если х=у=0 25. Дано четырёхзначное число. Определить, является ли оно полиндромом (например, 4444, 1221, 3003). 26. Определите результат операции при следующих значениях х=2, 7, 12, 17. a) if x<10 then x:=10 else if x<15 else x:=20; b) if x<10 then if x<5 then x:=5 else x:=10; c) if x<10 then if x<5 then x:=5 else x:=15 else x:=10; 27. Определите результат при m=2, n=-4: a) if m>n then if n>0 then write(m) else write(n) else write (m+n); b) if (m<n) or (n<0) then write(m) else write(n); c) if (m>n) then if (n>0) or (m>0) then write(m) else write(n); d) if not((m>0) and (n<0)) then write(m) else write(n). 28. Напишите фрагмент программы в виде условного оператора, в котором значение переменной z вычисляется по формуле z=ln(x), если x>0, и по формуле z=x2, если x<0. 29. Вводятся три числа. Найдите среди них такое, которое меньше наибольшего из них, но больше наименьшего. 30. Напишите программу, в результате выполнения которой первое введённое число уменьшается в три раза, если оно больше, чем третье, а третье становится разностью третьего и второго, если оно больше второго. 31. Вычислить значения функции, заданной следующим образом: ax2+b, x<0 y= ax-b, x≥0 32. Определите результат при m=4, n=-3: a) if m>n then if n>0 then write(sqr(m)) else write(sqr(n)) else write(m+n); b) if (m<n) or (n<0) then write(sqrt(m)) else write(sqr(n)); c) if m>n then if (n>0) or not(m>0) then write(m) else write(n); d) if not((m>0) and (n<0)) then write(m) else write(n); e) if not(m>0) and (n<0) then write(m) else write(n). 21 § 6 Оператор выбора. Условный оператор позволяет осуществить ветвление программы только по двум направлениям, одно из которых соответствует выполнению проверяемого условия, а другое – невыполнению этого же условия. Если для переменной необходимо осуществить ряд действий, зависящих от других условий, то надо записывать либо несколько таких операторов подряд, либо вложенные условия. Для такой ситуации удобно использовать оператор выбора. CASE Ключ Знач1 … Эти команды выполняются если ключ равен знач1 Значi Эти команды выполняются если ключ равен значi … Значn Эти команды выполняются если ключ равен значn … ELSE Эти команды выполняются если ключ не равен ни одному из предложенных значений (может отсутствовать) CASE ключ OF Знач1: оператор1; ………….. ЗначI: операторI; ………….. ЗначN: операторN; ELSE операторN+1; END; В качестве ключа может быть имя переменной любого порядкового типа, кроме вещественного и строкового, или выражение (арифметическое с целым значением или логическое). Тип параметра знач должен совпадать с типом ключа, при этом параметр знач – константа. Можно задавать список или диапазон констант. Если для определённых значений нужно выполнить несколько 22 операторов, то они также как и в операторе ветвления записываются между служебными словами BEGIN и END. Например, рассмотрим фрагмент программы, определяющей последнюю цифру квадрата числа х. CASE x mod 10 OF 0: write (‘0’); 1, 9: write (‘1’); 2, 8: write (‘4’); 3, 7: write (‘9’); 4, 6: write (‘6’); 5: write (‘5’); END; Задания. 1. Написать программу, которая по введённому однозначному числу печатает его название (1 – один, 2 – два и т.п.). Если число неоднозначное, то программа должна выдать сообщение об ошибке. 2. Написать программу, которая по введённому номеру печатает название дня недели. Если дня недели с таким номером не существует, то программа должна выдать сообщение об ошибке. 3. Написать программу, позволяющую получить словесное наименование школьных оценок. 4. Написать программу решения уравнения х*х=а для произвольного числа а (1≤a≤81). 5. Написать программу, нахождения числа дней в месяце, если даны: номер месяца n – целое число от 1 до 12; целое число а, равное 1 для високосного года и равное 0 в противном случае. 6. Написать программу, которая по введённому номеру координатной четверти печатает информацию о знаках координат точек в этой четверти. 7. Написать программу, которая по введённому номеру класса печатает, сколько лет может быть ученикам этой параллели. § 7 Оператор безусловного перехода. Метки. Для изменения хода программы без каких-либо условий или досрочного прекращения выполнения какой-либо части программы или программы в целом существует специальный оператор безусловного перехода. Общий вид: goto n; 23 n – целое число, не более чем из четырёх цифр, называемое меткой. Метка появляется в программе три раза: 1) в описательной части в разделе Label; 2) в операторе goto; 3) перед оператором, на который осуществляется безусловный переход, в этом случае метка от оператора отделяется двоеточием. Оператор безусловного перехода рекомендуется применять лишь в тех случаях, когда без него не обойтись. Например, пусть требуется вычислить наибольший общий делитель двух натуральных чисел А и В. Воспользуемся алгоритмом Евклида: будем уменьшать каждый раз большее из чисел на величину меньшего до тех пор, пока оба числа не станут равны. Program NOD_go; Label 1,2; Var a,b: integer; Begin Write (‘введите два натуральных числа’); Readln (a,b); 1: if a=b then goto 2; if a>b then a:=a-b else b:=b-a; goto 1; 2: write (‘НОД=’, a); Readln; End. Задания. 1. Пользователь с клавиатуры вводит числа. Последним вводится 0. Подсчитайте сумму всех введённых отрицательных чисел. 2. Пользователь с клавиатуры вводит числа. Последним вводится 0. Подсчитайте произведение всех введённых положительных чисел. 3. Пользователь с клавиатуры вводит числа. Последним вводится 0. Найдите максимальное число. § 8 Организация циклов. В языке Паскаль реализованы команды повторения в виде операторов цикла. В отличие от некоторых других языков программирования (например, Бейсик) в Паскале реализованы все три типа операторов. 24 ЦИКЛ С ПРЕДУСЛОВИЕМ. WHILE WHILE условие DO BEGIN Тело цикла END; выполняется Условие не выполняется BEGIN ТЕЛО ЦИКЛА Если в цикле нужно выполнить лишь один оператор, то служебные слова BEGIN и END не пишутся. END Цикл может не выполнится ни разу, если условие изначально не выполняется. Цикл выполняется до тех пор, пока выполняется условие. Рассмотрим уже известный нам алгоритм Евклида: Program NOD_while; Var a,b: integer; Begin Write (‘введите два натуральных числа’); Readln (a,b); While a<>b do If a>b then a:=a-b else b:=b-a; write (‘НОД=’, a); readln; end. ЦИКЛ С ПОСТУСЛОВИЕМ. REPEAT REPEAT Тело цикла UNTIL условие; ТЕЛО ЦИКЛА UNTIL не выполняется Условие выполняется Цикл выполнится хотя бы один раз, так как проверка условия происходит после выполнения операторов тела цикла. Цикл выполняется до тех пор, пока условие не выполняется. 25 Рассмотрим алгоритм Евклида: Program NOD_repeat; Var a,b: integer; Begin Write (‘введите два натуральных числа’); Readln (a,b); Repeat If a>b then a:=a-b else b:=b-a; until a=b; write (‘НОД=’, a); readln; end. ЦИКЛ СО СЧЁТЧИКОМ (С ПАРАМЕТРОМ). Выполняется до тех пор, пока I ≤ N2 FOR I:=N1 TO N2 DO BEGIN Тело цикла END; I:=N1, N2 ТЕЛО ЦИКЛА Читается как «для I начиная с N1 до N2 выполнить оператор». Переменная I называется переменной цикла (или параметром), её значение меняется от меньшего значения до большего. Если N1>N2, то цикл не выполнится ни разу. Для организации цикла в котором параметр изменяется от большего значения к меньшему используют следующую форму: FOR I:=N1 DOWNTO N2 DO BEGIN Тело цикла END; Если в цикле нужно выполнить лишь один оператор, то служебные слова BEGIN и END можно пропустить. Рассмотрим задачу вычисления an. Program zadacha; Var a, i, p: integer; Begin 26 Write (‘введите два натуральных a и n’); Readln (a, n); p:=1; For i:=1 to n do p:=p*a; write (‘a в степени n равно ’, p); readln; end. Внутри цикла может находиться другой цикл, но необходимо, чтобы циклы имели разные переменные и внутренний цикл полностью находился в теле внешнего цикла. Задания. 1. Какие из приведённых ниже программ содержат ошибку, приводящую к «зацикливанию»: a) i:=0; for m:=10 to 0 do i:=i+1; writeln (i); b) i:=0 repeat i:=i+1 until i:=0; writeln (i); c) i:=0; while (i=0) or (i<10) do i:=i+1; writeln (i); d) i:=0; repeat i:=i+1 until i<0; writeln (i); e) i:=0; while (i=0) or (i>0) do i:=i+1; writeln (i); 2. Каковы будут значения переменных и сколько раз выполнится цикл: For x:=1 to 15 do If x mod 2 = 1 then s:=s+1; 3. Сколько раз будут выполнены операторы внутри цикла в следующем фрагменте: x:=2; y:=10; while y-x>1 do begin x:=x+1; y:=y-1; end; sum:=x+y; 4. Что будет выведено на экран после выполнения следующих операторов: p:=1; i:=1; repeat p:=p*2; i:=i-1; until i<=1; 27 5. Определите результат выполнения программы. Сколько раз выполняется внешний цикл? Сколько раз выполняется внутренний цикл? Program zadacha2; Uses crt; Var m; n: integer; Begin clrscr; M:=0; n:=0; While m<3 do begin N:=n+1; m:=m+1; While n<2 do n:=n+1; end; Writeln (n); Readkey; End. 6. Определите результат выполнения программы. Сколько раз выполняется внешний цикл? Сколько раз выполняется внутренний цикл? Program zadacha3; Uses crt; Var n: integer; Begin clrscr; n:=0; Repeat N:=n+1; Repeat n:=n+1 until n>2; Until n>5; Writeln (n); Readkey; End. 7. Найти все целые двузначные числа, удовлетворяющие условию: остаток от деления числа на 3 равен 2. 8. Найти все целые двузначные числа, разность цифр которых равна 3 (по модулю). 9. Напишите программы вычисления сумм: a) сорока слагаемых вида n-i, где i=1, 2, …, 40, а n – данное число; b) n слагаемых вида x+i, где х – данное число, а i меняется от 1 до n; c) ста слагаемых, имеющих вид дроби i 1 ; i2 d) n слагаемых вида (i+1) , i=1, 2, …, n; e) квадратов n первых натуральных чисел. 2 28 10. Для различных, вводимых с клавиатуры чисел найдите сумму положительных нечётных. 11. Дано положительное число А. Найдите среди чисел 1, 1+ 1 , 2 1+ 1 + 1 , 2 3 … первое, большее А. 12. Вводя числа с клавиатуры без ограничения их количества (конец ввода – число ноль), найдите сумму положительных и произведение отрицательных чисел. 13. Среди всех двухзначных чисел найти те, сумма цифр которых равна n (1<n<18). 14. Даны натуральные числа х и у. Получить все кратные им числа, меньшие х*у. 15. Среди всех четырёхзначных чисел, выбрать те, у которых все цифры различны. 16. Почему, приведённые ниже циклы, будут бесконечны? a) s:=2; b) s:=1; n:=20; i:=1; c) repeat repeat s:=5/s; repeat s:=s*I; until false; until s<0.01; until i>n; 17. Запишите программу вычисления квадратного корня, используя оператор REPEAT. 18. Заполните таблицу: Оператор WHILE Оператор REPEAT Сначала проверяется условие, в Последовательность выполнения тела цикла и затем выполняется тело цикла проверки условия Тело цикла выполняется, если Условие повторения Условия выхода Минимальное повторений условие истинно Выход из цикла осуществляется, если условие ложно цикла может не число Тело выполниться ни разу, если условие цикла сразу принимает значение FALSE 19. Определите, будет ли выполняться программа и каков будет результат. Var s: real; i:integer; Begin S:=0; i:=1; For i:=2 downto do s:=s+1/I; Writeln(s); End; 29 20. Написать программу нахождения наибольшего общего делителя 4 положительных чисел, вводимых с клавиатуры. § 9 Массивы. При решении практических задач часто используется совокупность однотипных величин, которые для удобства обработки объединяют в упорядоченные группы с общим именем. Каждому элементу группы присваивается отдельный порядковый номер. Такая совокупность называется массивом. Массив — это пронумерованная последовательность величин одинакового типа, обозначаемая одним именем. Элементы массива располагаются в последовательных ячейках памяти, обозначаются именем массива и индексом. Каждое из значений, составляющих массив, называется его компонентой (или элементом массива). Индекс в обозначении компонент массивов может быть константой, переменной или выражением порядкового типа. Количество индексов элементов массива определяет размерность массива. По этом признаку массивы делятся на: одномерные (линейные), двумерные, трёхмерные и т.д. Задания. 1. Определите, какие массивы потребуются для решения задач: а) объединения результатов эксперимента; б) составления списков сотрудников; в) хранения данных о том, какое количество картофеля следует закупить в каждом хозяйстве; г) хранения результатов соревнований по многоборью 10 спортсменов в пяти видах спорта; 2. Может ли массив содержать разнородные данные? п. 9.1. Одномерные массивы. Пример: числовая последовательность четных натуральных чисел 2, 4, 6, ..., N представляет собой линейный массив, элементы которого можно обозначить А[1]=2, А[2]=4, А[3]=6, ..., А[К]=2*(К+1), где К — номер элемента, а 2, 4, 6, ..., N — значения. Индекс (порядковый номер элемента) записывается в квадратных скобках после имени массива. Например, A[7] — седьмой элемент массива А; D[6] — шестой элемент массива D. 30 Для размещения массива в памяти ЭВМ отводится поле памяти, размер которого определяется типом, длиной и количеством компонент массива. В языке Pascal эта информация задается в разделе описаний. Массив описывается так: имя массива : array [нач.знач.индекса .. кон.знач.индекса] оf базовый тип; Например, Var B : array [1..5] of real, R : array [1..34] of char; — описывается массив В, состоящий из 5 элементов и символьный массив R, состоящий из 34 элементов. Для массива В будет выделено 5*6=30 байт памяти, для массива R — 1*34=34 байта памяти. Базовый тип элементов массива может быть любым простым типом. Заполнить массив можно следующим образом: 1) с помощью оператора присваивания. Этот способ заполнения элементов массива особенно удобен, когда между элементами существует какая-либо зависимость, например, арифметическая или геометрическая прогрессии, или элементы связаны между собой реккурентным соотношением. Задача 1. Заполнить одномерный массив элементами, отвечающими следующему соотношению: a1=1; a2=1; ai=ai-2+ai-1 (i = 3, 4, ..., n). Read(N); {Ввод количества элементов} A[1]:= 1; A[2]:= 1; FOR I := 3 TO N DO A[I] := A[I - 1] + A[I - 2]; 2) Другой вариант присваивания значений элементам массива — заполнение значениями, полученными с помощью датчика случайных чисел. Задача 2. Заполнить одномерный массив с помощью датчика случайных чисел таким образом, чтобы все его элементы были различны. Program Prim; Var A : array [1..100] of integer; I, N : integer; Begin Write('введите количество элементов массива'); ReadLn(N); randomize; 31 For I := 1 to N do begin А[i] := -32768 + random(65535); Write(a[i]:7); end; End. 3) ввод значений элементов массива с клавиатуры используется обычно тогда, когда между элементами не наблюдается никакой зависимости. Задание: Напишите программу ввода в память компьютера последовательности чисел: 1, 2, -5, 6, -111, 0. ОСНОВНЫЕ ОПЕРАЦИИ НАД ЭЛЕМЕНТАМИ МАССИВОВ Над элементами массивов чаще всего выполняются такие действия, как: а) поиск значений; б) сортировка элементов в порядке возрастания или убывания; в) подсчет элементов в массиве, удовлетворяющих заданному условию. Сумму элементов массива можно подсчитать по формуле S=S+A[I] первоначально задав S=0. Количество элементов массива можно подсчитать по формуле К=К+1, первоначально задав К=0. Произведение элементов массива можно подсчитать по формуле P = P * A[I], первоначально задав P = 1. 1. Упорядочивание массива по возрастанию. Дан линейный массив. Упорядочить его элементы в порядке возрастания. Упорядочивание массивов по какому-либо признаку называются также сортировками. Существуют различные методы сортировок. Рассмотрим один из них – «метод пузырька2. Пусть имеется последовательность чисел a1, a2, …, an, которую необходимо упорядочить по возрастанию. Зафиксируем первый элемент и будем последовательно сравнивать его со стоящими справа. Если какой-то из элементов справа окажется меньше первого, то мы поменяем местами это элемент с первым и продолжим сравнение уже нового элемента, стоящего на первом месте, с оставшимися справа числами. Если снова выявится элемент, меньший зафиксированного, то повторим перестановку. В результате первого просмотра последовательности на первом месте окажется наименьший из всех элементов, т.е. он. Как более «лёгкий», как бы всплывает наверх (отсюда и название метода – «метод пузырька»). Теперь зафиксируем 32 второй элемент и повторим просмотр, выполняя при необходимости при необходимости перестановки элементов, и т.д. Программа сортировки методом пузырька имеет вид: Program puzyr; Var a: array [1..10] of real; I, j, n: integer; c: real; Begin Write (‘введите количество элементов массива:’); readln(n); For i:=1 to n do begin Write(‘a[‘,I,’]=’); readln(a[i]); end; For i:=1 to n-1 do For j:=i+1 to n do if a[i]>a[j] then begin c:=a[i]; a[i]:=a[j]; a[j]:=c end; writeln(‘упорядоченный массив:’); For i:=1 to n do write(‘a[‘,I,’]=’, a[i]); End. 2. Подсчёт элементов массива, удовлетворяющих заданному условию. Дан линейный массив целых чисел. Подсчитать, сколько в нем различных чисел. Program Razlichnye_Elementy; Var I, N, K, Kol : Integer; A : Array [1..50] Of Integer; Begin Write('Введите количество элементов массива: '); ReadLn(N); FOR I := 1 TO N DO Begin Write('A[', I, ']='); ReadLn (A[I]); End; Kol := 1; {переменная, в которой будет храниться количество различных чисел} FOR I := 2 TO N DO begin Z:=0; {переменная, показывающая, встречалось ли данное значение раньше} FOR J:=1 TO I-1 DO IF A[I]=A[J] THEN Z:=1; IF Z:=0 THEN Kol := Kol +1; 33 End; WriteLn('Количество различных чисел: ', Kol) END. Задания. 1. Вычислите сумму элементов одномерного массива В[10]. 2. Найдите максимальный элементов целочисленного массива С[20]. 3. В заданной последовательности целых чисел определите количество и сумму элементов, кратных 10. 4. Дано n чисел. Найдите сумму чисел, больших заданного числа а. 5. В заданном массиве замените нулём наибольший элемент. 6. Вычислите среднее арифметическое наибольшего и наименьшего из n чисел. 7. Найдите сумму квадратов неотрицательных элементов и количество положительных чисел в заданном целочисленном массиве. 8. Дан одномерный массив действительных чисел. Подсчитать, сколько в нём отрицательных, положительных и нулевых элементов. 9. Даны действительные числа a1, a2, …, an. Поменять местами наибольший и наименьший элементы. 10. Пригодность детали оценивается по размеру В, который должен соответствовать интервалу (А-δ, А+ δ). Определить, имеются ли в партии из N деталей бракованные. Если да, то подсчитать их количество, иначе выдать отрицательный ответ. 11. У вас есть доллары. Вы хотите обменять их на рубли. Есть информация о стоимости купли- продажи в банках города. В городе N банков. Составьте программу, определяющую, какой банк выбрать, чтобы выгодно обменять доллары на рубли. 12. Дан одномерный массив A[N]. Найти max(a2,a4,…,a2k)+min(a1,a3,…,a2k+1). 13. У прилавка магазина выстроилась очередь из n покупателей. Время обслуживания i-го покупателя равна ti(i=1,…,n). Определить время Ci пребывания i-го покупателя в очереди. 14. Задан массив с количеством элементов N. Сформируйте два массива: в первый включите элементы исходного массива с чётными номерами, а во второй – с нечётными. 15. Японская радиокомпания провела опрос N радиослушателей по вопросу: «Какое животное Вы связываете с Японией?» Составить программу получения k наиболее часто встречающихся ответов и их долей (в процентах). 34 Сортировка массивов. 16. Сортировка слиянием. Заданы два упорядоченных одномерных массива с различным количеством элементов. Образовать из них новый так, чтобы он тоже был упорядоченным. 17. Сортировка выбором. Дана последовательность чисел. Требуется упорядочить их по убыванию. Для этого в массиве, начиная с первого, выбирается наибольший элемент и ставится на первое место, а первый – на место наибольшего. Затем, начиная со второго, эта процедура повторяется. 18. Сортировка вставками. Дана последовательность чисел. Требуется упорядочить её по возрастанию. Делается это следующим образом. Пусть а1, a2,…,ai – упорядоченная последовательность, т.е. a1≤ a2≤…≤ ai . Берётся следующее число ai+1 и вставляется в последовательность так, чтобы новая последовательность была также возрастающей. Процесс производится до тех пор, пока все элементы от i+1 до n не будут перебраны. п. 9.2. Двумерные массивы (матрицы). При решении практических задач часто приходится иметь дело с различными таблицами данных, математическим эквивалентом которых служат матрицы. Такой способ организации данных, при котором каждый элемент определяется номером строки и номером столбца, на пересечении которых он расположен, называется двумерным массивом или таблицей. Например, данные о планетах Солнечной системы представлены следующей таблицей: Планета Расст. до Солнца Относ. обьем Относ. масса Меркурий 57.9 0.06 0.05 Венера 108.2 0.92 0.81 Земля 149.6 1.00 1.00 Марс 227.9 0.15 0.11 Юпитер 978.3 1345.00 318.40 Сатурн 1429.3 767.00 95.20 Их можно занести в память компьютера, используя понятие двумерного массива. Положение элемента в массиве определяется 35 двумя индексами. Они показывают номер строки и номер столбца. Индексы разделяются запятой. Например: A[7, 6], D[56, 47]. При описании массива задается требуемый объем памяти под двумерный массив, указываются имя массива и в квадратных скобках диапазоны изменения индексов. Например, Var M: array[1..10, 1..20] of real; ОСНОВНЫЕ ОПЕРАЦИИ НАД ЭЛЕМЕНТАМИ МАТРИЦ 1. Заполняется двумерный массив аналогично одномерному: с клавиатуры, с помощью оператора присваивания. Например, в результате выполнения программы: Program Vvod2; Var I, J : Integer; A : Array [1..20, 1..20] Of Integer; Begin FOR I := 1 TO 3 DO FOR J := 1 TO 2 DO A[I, J] := 456 + I End. элементы массива примут значения A[1, 1] = 457; A[1, 2] = 457; A[2, 1] = 458; A[2, 2] = 458; A[3, 1] = 459; A[3, 2] = 459. Задача 1. Заполнить матрицу порядка n по следующему образцу: 1 2 3 ... n-2 n-1 n 2 1 2 ... n-3 n-2 n-1 3 2 1 ... n-4 n-3 n-2 ... ... ... ... ... ... ... n-1 n-2 n-3 ... 2 1 2 n 2 1 n-1 n-2 ... 3 Program Massiv12; Var I, J, K, N : Integer; A : Array [1..10, 1..10] Of Integer; Begin Write('Введите порядок матрицы: '); ReadLn(N); For I := 1 To N Do For J := I To N Do Begin A[I, J] := J - I + 1; A[J, I] := A[I, J]; End; For I := 1 To N Do Begin Writeln; For J := 1 To N Do Write(A[I, J]:4); End 36 End. 2. Работа с элементами главной диагонали квадратной таблицы. Если число строк таблицы равно числу столбцов, то такая таблица называется квадратной. Главная диагональ квадратной таблицы проходит из левого верхнего угла в правый нижний. Задача 2. Дана целочисленная квадратная матрица. Найти в каждой строке наибольший элемент и поменять его местами с элементом главной диагонали. Program Obmen; Var N, I, J, Max,Ind, Vsp : Integer;A : Array [1..15, 1..15] Of Integer; Begin WRITE('Введите количество элементов в массиве: '); READLN(N); FOR I := 1 TO N DO FOR J := 1 TO N DO Begin WRITE('A[', I, ',', J, '] '); READLN(A[I, J]) End; FOR I := 1 TO N DO Begin Max := A[I, 1]; Ind := 1; FOR J := 2 TO N DO IF A[I, J] > Max THEN Begin Max := A[I, J]; Ind := J End; Vsp := A[I, I]; A[I, I] := A[I, Ind]; A[I, Ind] := Vsp End; FOR I := 1 TO N DO Begin WriteLn; FOR J := 1 TO N Do Write(A[I, J] : 3); End; WriteLn End. 3. Нахождение наибольших элементов каждой строки таблицы. Каждую строку таблицы можно рассматривать, как одномерный массив и использовать идею нахождения максимального элемента одномерного массива. Найденные значения помещаются в одномерный массив. 37 Program maximum; Var b: array [1..10, 1..10] of integer; i,j,n: integer; a: array [1..10] of integer; begin write (‘Введите количество столбцов квадратной матрицы:’); readln(n); writeln(‘Введите значения элементов таблицы по строкам:’); for i:=1 to n do for j:=1 to n do begin write(‘a[‘,i,’,’,j,’]=’); readln (a[i,j]); end; {построение массива наибольших значений элементов строк таблицы} for i:=1 to n do begin a[i]:=b[i,1]; for j:=2 to n do if a[i]<b[i,j] then a[i]:=b[i,j]; end; writeln(‘Наибольшие числа строк таблицы:’); for i:=1 to n do for j:=1 to n do writeln(‘a[‘,i,’]=’; a[i]); end. 4. Перестановка строк таблицы. В прямоугольной таблице В из n строк и m столбцов требуется поменять местами две строки. Для этого достаточно организовать цикл по переменной столбца и используя промежуточную переменную, менять местами каждую пару элементов, стоящих в одном столбце. При заданных номерах строк К и L решение выглядит так: Program perestanovka; Var b: array [1..10, 1..10] of integer; i,j,n,m,k,l: integer; c:real; begin write (‘Введите количество столбцов матрицы:’); readln(n); write (‘Введите количество строк матрицы:’); readln(m); writeln(‘Введите значения элементов таблицы по строкам:’); for i:=1 to n do for j:=1 to n do begin 38 write(‘b[‘,i,’,’,j,’]=’); readln (b[i,j]); end; write (‘Введите номера меняемых местами строк:’); readln(k,l); {перестановка строк} for i:=1 to m do begin c:=b[k,j]; b[k,j]:=b[l,j]; b[l,j]:=c end; writeln; writeln(‘Таблица с переставленными строками:’); for i:=1 to n do begin for j:=1 to n do write (‘b[‘,i,’,’,j,’]=’; b[i,j]); writeln; end; end. Задания. 1. Можно ли выполнять обход двумерного массива, организовав внешний цикл по столбцам, а внутренний — по строкам? 2. Сформулируйте условие задачи, решение которой приведено в данной программе: Program N_4; Var A : Array[1..50,0..49] Of Real; I, J, N : Integer; C : Real; Begin Write('Количество элементов массива N=? '); ReadLn(N); For I := 1 To N Do For J := 0 To N-1 Do Begin Write('A[',I,',',J,']= '); Readln(A[I,J]) End; For I := 1 To N Do For J := 0 To N-1 Do Begin C := A[I,J]; A[I,J] := A[N-I+1,J]; A[N-I+1,J] := C End; For I := 1 To N Do Begin For J := 0 To N-1 Do Write(A[I,J]:5:2,' '); End; End. 3. Вычислите сумму элементов главной диагонали квадратной таблицы. 39 4. Найдите суммы элементов столбцов таблицы. 5. Найдите наибольший элемент квадратной таблицы. 6. В прямоугольной таблице замените все отрицательные элементы их квадратами. В квадратной таблице найдите наибольший элемент диагонали. Поменяйте местами первую и последнюю строки прямоугольной таблицы. 7. Сформировать таблицу умножения в матричной форме и вывести её на экран. 8. Построить квадратную матрицу порядка 2n: n n 1 1 … 1 1 1 … 1 . . … . . . … . . . … . 1 1 … 1 3 3 … 3 3 3 … 3 . . … . . . … . . . … . 3 3 … 3 9. Получить матрицу: 1 0 0 0 0 0 0 0 0 0 2 2 . . . 2 4 4 . . . 4 2 1 0 0 0 0 0 0 0 0 3 2 1 0 0 0 0 0 0 0 … … … … … … … … … … … … 2 2 . . . 2 4 4 . . . 4 4 3 2 1 0 0 0 0 0 0 5 4 3 2 1 0 0 0 0 0 6 5 4 3 2 1 0 0 0 0 7 6 5 4 3 2 1 0 0 0 8 7 6 5 4 3 2 1 0 0 2 2 . . . 2 4 4 . . . 4 9 8 7 6 5 4 3 2 1 0 n n 10 9 8 7 6 5 4 3 2 1 10. Составить программу, которая заполняет квадратную матрицу порядка n натуральными числами 1,2,3,…,n2, записывая их в неё «по спирали». Например, для n=5 получаем следующую матрицу: 1 2 3 4 16 17 18 19 15 24 25 20 14 23 22 21 40 5 6 7 8 13 12 11 10 9 11. Вычислить сумму положительных элементов матрицы А[n,n]. 12. Определить, является ли заданная целая квадратная матрица симметричной относительно главной диагонали. 13. Упорядочить по возрастанию элементы каждой строки матрицы размером nxm. 14. Задана квадратная матрица. Получить транспонированную матрицу, т.е. матрицу, где столбцы и строки меняются местами. 15. Найти наибольший и наименьший элементы прямоугольной матрицы и поменять местами. 16. В соревнованиях по многоборью (5 видов спорта) участвуют 10 спортсменов. Результаты соревнований записываются в таблицу. За каждый вид спорта спортсмен получает количество баллов, соответствующее занятому месту. Получить одномерный массив – результирующий и номер спортсмена-победителя. 17. В матрице А, состоящей из n строк и m столбцов, поменять местами 1-ю и 2-ю строки, 3-ю и 4-ю и т.д. 18. Найти сумму элементов из заштрихованной области матрицы А, размера 9х9. а) б) 19. Дана квадратная матрица размера nxn. Найти номер столбца, все элементы которого нули. 20. Дана квадратная матрица размера nxn. Найдите произведение максимальных элементов столбцов матрицы. 21. Составить программу вычислений значений функции y=(x+3)2 для 10 произвольных значений х. 22. Написать алгоритм удвоения каждого элемента таблицы. 23. Составьте программу подсчёта числа элементов прямоугольной матрицы меньших заданного числа а. 24. Написать программу нахождения произведения всех ненулевых элементов прямоугольной матрицы. 25. Определить номера строк матрицы R[M,N], хотя бы один элемент которых равен с, и элементы этих строк умножить на d. 41 § 10 Строковые переменные. В памяти компьютера могут храниться числа и символы. Любой символ занимает один байт памяти. Для данного, соответствующего одиночному символу, используется тип char. Значение символьного данного – любой символ клавиатуры компьютера, ограниченный апострофами. Например: ‘A’, ‘?’, ‘4’ – значения символьных величин. Символы могут объединяться в массивы. При обработки символьных массивов используются такие же алгоритмы, как и для числовых. Примеры описаний: Var a:array[1..50] of char; x,y:char; Символьные переменные могут сравниваться с другими переменными, символьными константами, участвовать в операциях ввода, вывода, присваивания. Сравнивать символьные переменные можно посредством операций отношения: >, <, <=, >=, = , <>. Все символы упорядочены и каждому символу ставится в соответствие порядковый номер. Из двух символов большим считается тот, чей порядковый номер больше. Узнать порядковый номер символа можно с помощью функции ORD. Значением ORD(X) является порядковый номер значения символьной переменной Х. Пример: I:=ORD(‘f’). Функция CHR определяет символ по его коду. Данную функцию можно заменить знаком #. Пример C:=#13. Несколько подряд записанных символов образует строку. Строка – это ограниченная апострофами упорядоченная последовательность любых символов. Длина строки, обрабатываемой в Паскале, не должна превышать 255 символов (апострофы не считаются). Это связано с тем, что в конце строки, в дополнительном байте, хранится её длина – количество символов, а наибольшее целое число, которое может быть записано в байте, - 255. Если требуется обработать текст, длина которого большее 255 знаков, то используют массив строк. Примеры описаний: Var x: string [20]; y: string; f: array [1..10] of string [5]; 42 Число в квадратных скобках указывает максимальную длину строки, если она не указана, то подразумевается, что она равна максимальной величине – 255. Элементы строки идентифицируются именем строки с индексом, заключённым в квадратные скобки. Например: N[9], SLOVO[5], S[K+1]. Первый символ строки имеет номер 1. Индекс может быть положительной константой, переменной, выражением целого типа. Значение индекса не должно выходить за границы описания. Тип string и стандартный тип char совместимы. Строки и символы могут употребляться в одних и тех же выражениях. Операции над строками. Операция сцепления (конкатенации) (+) применяется для соединения нескольких строк в одну. Сцеплять можно как строковые константы, так и переменные. Длина результирующей строки не должно превышать 255. Операции отношения: >, <, <=, >=, = , <> применяются для сравнения двух строк. Сравнение строк производится слева направо до первого несовпадающего символа, сравнение которых и производится. Если строки имеют различную длину, но в общей части символы совпадают, считается, что более короткая строка меньше. Функция Copy(S, Poz, N) выделяет из строки S подстроку длиной N символов, начиная с позиции Poz. Здесь Poz и N – целочисленные выражения. Пример. Значение S ‘Мама мыла раму’ ‘Маша ела кашу’ Выражение Copy(S,6,4) Copy(S,1,8) Результат ‘мыла’ ‘Маша ела’ Функция Length(S) определяет текущую длину строки S. Результат – значение целого типа. Пример. Значение S ‘Мама мыла раму’ ‘(А+В)*С’ Выражение Length(S) Length (S) Результат 14 7 Функция Pos(S1,S2) обнаруживает первое появление в строке S2 подстроки S1. Результат – целое число, равное номеру позиции, где находится первый символ подстроки S1. Если в S2 подстроки S1 не обнаружено, то результат равен 0. Пример. 43 Значение S2 ‘abcdef’ ‘abаcdcdef’ Выражение Pos(‘cd’,S2) Pos(‘cd’,S2) Результат 3 4 Процедура Delete (S, Poz, N) – удаление N символов из строки S, начиная с позиции Poz. Пример. Исходное значение S Выражение ‘abcdefg’ Delete (S,3,2) ‘abcdefg’ Delete (S,2,6) Конечное значение S ‘abefg’ ‘a’ Процедура Insert(S1,S2,Poz) – вставка строки S1 в строку S2, начиная с позиции Poz. Пример. Исходное значение S2 Выражение Конечное значение S2 ‘ЭВМ РС’ Insert (‘IBM-‘,S2,5) ‘ЭВМ IBM-PC’ ‘Рис. 2’ Insert (‘N’,S2,6) ‘Рис.N2’ Задания. 1. Дана строка, заканчивающаяся точкой. Подсчитать, сколько в ней слов. 2. Дана строка, содержащая английский текст. Найти количество слов, начинающихся с буквы b. 3. Дана строка. Подсчитать в ней количество вхождений букв r, k, t. 4. Дана строка, содержащая текст. Найти длину самого короткого слова и самого длинного слова. 5. Дана строка. Определить, сколько раз входит в неё группа букв abc. 6. В строке заменить все двоеточия (:) точкой с запятой (;). 7. Дана строка. Подсчитать сколько различных символов встречается в ней. Вывести их на экран. 8. Дана строка. Найти в ней те слова, которые начинаются и оканчиваются одной и той же буквой. 9. В строке удалить символ двоеточие и подсчитать количество удалённых символов. 10. Удалить часть символьной строки, заключённой в скобки (вместе со скобками). 11. Определить, сколько раз в строке встречается заданное слово. 12. Строка содержит одно слово. Проверить, будет ли оно читаться одинаково справа налево и слева направо (т.е. является ли оно полиндромом). 13. В записке слова зашифрованы – каждое из них записано наоборот. Расшифровать сообщение. 44 14. Проверить, одинаковое ли число открывающихся закрывающихся скобок в данной строке. 15. Упорядочить массив английских слов по алфавиту. и § 11 Подпрограммы. Подпрограмма – программа, реализующая вспомогательный алгоритм. Основная программа – программа, реализующая основной алгоритм решения задачи и содержащая в себе обращения к подпрограммам. В Паскале существуют два типа подпрограмм: подпрограммы-процедуры и подпрограммы-функции. Используемые в программе нестандартные подпрограммы должны быть описаны в разделе описания подпрограмм. Переменные, описанные в разделе описаний основной программы, и используемые в основной программе и в подпрограммах называются глобальными. Переменные, используемые только в подпрограмме, и описанные в разделе описаний переменных подпрограммы называются локальными. Подпрограмма-функция имеет следующий формат описания: Function <имя функции>(<параметры аргументы>):<тип функции>; {описание локальных переменных} begin <блок операторов>; end; Тип функции может быть только простым типом (исключением является тип string). Блок содержит локальные для функции описания и раздел операторов. Обращение к функции является операндом в выражении. Подпрограмма-процедура имеет следующий формат описания: Procedure <имя процедуры>(<параметры>); {описание локальных переменных} begin <блок операторов>; end; В качестве результата процедура может возвращать в вызывающую программу множество простых или структурированных величин или не возвращать никаких значений. Среди параметров процедуры указываются как аргументы, так и результаты. Параметры-результаты должны быть обязательно параметрами- 45 переменными (описанными после служебного слова var). Обращение к процедуре – отдельный оператор. Обмен данными между вызывающей программой и подпрограммой может происходить не только через параметры, но и через глобальные переменные. Пример. Вычислить разность двух простых дробей: a c (a, b, c, d – натуральные числа). Результат получить в виде b d простой несократимой дроби e/f. Решение. Следует вычислить числитель и знаменатель по правилам вычитания дробей, и сократить их на наибольший общий делитель (НОД). Вычисление НОД двух чисел оформим в виде подпрограммы, используя алгоритм Евклида. Рассмотрим два варианта решения этой задачи: с подпрограммой-функцией и подпрограммой-процедурой. Решение 1. Program Sub1; Var a,b,c,d,e,f: integer; Function NOD (m,n:integer):integer; Begin While m<>n do If m>n then m:=m-n else n:=n-m; NOD:=m End; Begin write (‘Введите числители и знаменатели дробей:’); Readln (a, b, c, d); e:=a*d-b*c; f:=b*d; if e=0 then writeln (e) else begin e:=e div NOD (abs(e),f); f:=f div NOD (abs(e),f); writeln (e,’/’,f); end; end. Решение 2. Program Sub2; Var a,b,c,d,e,f,g: integer; Procedure NOD (m,n:integer; var k:integer); Begin While m<>n do 46 If m>n then m:=m-n else n:=n-m; k:=m End; Begin write (‘Введите числители и знаменатели дробей:’); Readln (a, b, c, d); e:=a*d-b*c; f:=b*d; if e=0 then writeln (e) else begin NOD(abs(e),f,g); e:=e div g; f:=f div g; writeln (e,’/’,f); end; end. Задания. Во всех задачах используйте подпрограммы. 1. Треугольник задан координатами своих вершин. Составить программу вычисления его площади. 2. Составить программу нахождения наибольшего общего делителя и наименьшего общего кратного двух натуральных чисел. НОК (А, В)= А В НОД ( А, В) 3. Составить программу нахождения наибольшего общего делителя четырёх натуральных чисел. 4. Написать программу нахождения сумму большего и меньшего из 3 чисел. 5. Вычислить площадь правильного шестиугольника со стороной а, используя подпрограмму вычисления площади треугольника. 6. Проверить, являются ли данные три числа взаимно простыми. 7. Написать программу вычисления суммы факториалов всех нечётных чисел от 1 до 9. 8. Даны две простых дроби. Составить программу: а) деления дроби на дробь. б) умножения дроби на дробь. 9.Дано натуральное число N. Составить программу формирования массива, элементами которого являются цифры числа N. 10. Составить программу, определяющую, в каком из данных двух чисел больше цифр. 47 11. Заменить данное натуральное число на число, которое получается из исходного записью его цифр в обратном порядке. 12. Найти все натуральные n-значные числа, цифры в которых образуют строго возрастающую последовательность. 48 П О С Л О В И Ц Ы Семеро одного монитора не ждут. Каждому программисту компьютер выдаёт то, что он заслуживает. Не спрашивай старого программиста, спрашивай бывалого. Хороша верёвка длинная, а программа короткая. Снявши оператор вывода по ответу не плачут. Программу циклом не испортишь. Кто как программирует, тот так и ест. Маленький алгоритм лучше большого безделья. 49