Математика и информатика. Учебное пособие по всему курсу Тольятти 2008 удк 51 004 (075. 8) Ббк 22. 1832. 81 Е егорова, Э. В. Учебное пособие по дисциплине Математика и информатика для студентов гуманитарных и педагогических специальностей очной формы обучения
Скачать 1.82 Mb.
|
Глава 9. Программирование на ПаскалеПаскаль – алгоритмический язык высокого уровня – был разработан в конце 60-х годов проф. Виртом (Швейцария). Язык получил название в честь французского математика и философа Блеза Паскаля [1623–1662]. В 80-е годы на основе Паскаля был разработан Turbo Pascal. Turbo – это торговая марка разработчика фирмы Borland. Turbo Pascal – это система программирования, которая представляет собой единство двух самостоятельных составляющих: 1) Компилятора языка программирования Паскаль. 2) Инструментальной программной оболочки, способствующей повышению эффективности создания программ, т.е. среды Turbo Pascal. Таким образом, компилятором реализуется язык программирования Turbo Pascal, а разнообразные сервисные услуги обеспечиваются инструментальной программной оболочкой. 9.1. Конструкция языка Turbo-Pascal9.1.1. Алфавит1) латинский шрифт; 2) русский шрифт; 3) цифры (0 9); 4) символы: а) знаки арифметических операций (+ – * /), нет возведения в степень; б) знаки логических отношений (<,>,<=,>=,<>); в) разделители (, . ; :); г) прочие символы. 9.1.2. Данные и типы данныхДанные могут быть разделены на: 1) Константы – const. 2) Переменные – var. Константам и переменным даётся имя, которое называется идентификатором. С другой стороны в зависимости от вида данных (число, текст, символ и т.д.) в Паскале имеет значение тип данных. Понятие типа – одно из фундаментальных понятий Turbo Pascal. Паскаль – это типизированный язык, который характеризуется разветвленной структурой типов данных, построен на основе строгого соблюдения типов. Язык Turbo Pascal представляет большие возможности создания сложных типов, однако все они строятся на основе элементарных (стандартных) типов. Для начала можно ограничиться стандартными типами данных (4 типа). Соответственно можно выделить следующие данные: числовые, символьные, логические. Числовые данные подразделяются на целые и вещественные: INTEGER – целочисленные данные, во внутреннем представлении занимают два байта; диапазон возможных значений – от -32768 до +32767. REAL – вещественные данные, занимают 6 байт; диапазон возможных значений модуля – от 2.9Е-39 до 1.7Е+38; точность представления данных – 11…12 значащих цифр. Вещественные данные в паскале могут записываться в двух форматах: а) Формат с фиксированной точкой (число 34,5 в паскале запишется 34.5). б) Формат с плавающей запятой (34,5 в паскале запишется 0.345Е2 или 3.45Е1, где Е означает число 10, а после записывается степень этого числа). CHAR – символьные данные, занимает 1 байт. BOOLEAN – логический тип, занимает 1 байт и имеет два значения: FALSE (ложь) и TRUE (истина). 9.1.3. Стандартные функцииСтандартные функции подразделяются на числовые, символьные и т.д. Числовые стандартные функции представлены в таблице 9.1. Таблица 9.1
Примечания. 1) После имени стандартной функции в скобках записывается аргумент, который может быть: а) Константой: cos(1.3). б) Переменной: cos(x). в) Арифметическим выражением: cos(x+y). г) Стандартной функцией: cos(ln(x)). 2) Аргумент тригонометрической функции должен быть задан в радианах. Если он задан в градусах, то его следует перевести в радианы по формуле: . 3) Логарифмические функции: . 4) Обратные тригонометрические функции: ; ; ; 5) Гиперболические функции: . . . . 6) Возведение в степень: . xa=exp(a*ln(x)). 7) Тригонометрические функции: 9.1.4. Арифметические, логические, символьные выраженияа) Арифметические выражения Пример арифметического выражения. . В Турбо Паскале есть все 4 арифметические операции над числовыми переменными: а) + сложение; б) – вычитание; в) * умножение; г) / деление вещественное; Для данных типа INTEGER в Турбо Паскале есть еще операции деления: д) MOD получение остатка от целочисленного деления, е) DIV частное от целочисленного деления. Пример, найти частное A/Z, на Паскале имеет вид: A div Z . Пример, найти остаток от деления A/Z, на Паскале имеет вид: A mod Z . F:=17 DIV 5; – деление нацело, ответ: 3; R:=17 MOD 5; – остаток от деления нацело, ответ: 2. б) Логические выражения Пример логических выражений: (A>0) and (B>0) означает (А и В больше нуля). (A>0) or (B>0) означает (А или В больше нуля). В Турбо Паскале определены следующие логические операции: а) not – логическое НЕ (логическое отрицание); б) and –– логическое И (конъюнкция или логическое умножение); в) or – логическое ИЛИ (дизъюнкция или логическое сложение); г) xor – исключительное ИЛИ; д) EQV – эквивалентность; е) IMP-импликация (если…, то…). Логические операции применимы к операндам целого и логического типов. Если операнды – целые числа, то результат логической операции есть тоже число. Логические операции над логическими данными дают результат логического типа. Следует учесть, что в отличие от многих других языков программирования в Турбо Паскале логические операции имеют более высокий приоритет, чем операции отношения. В связи с этим, в сложных логических выражениях обычно необходимо расставлять скобки. 9.2. Структура программы на языке ПаскальСтруктура программы на языке Паскаль имеет следующий вид: PROGRAM Pr; {Заголовок не обязателен} {Раздел описаний} Begin {Начало раздела операторов} {Раздел операторов} END. {конец раздела операторов} Выделяют две части программы: 1. Раздел описаний. В разделе описаний задаётся описание констант ключевым словом const, переменные в этом разделе задаются ключевым словом var, описание нового типа переменных задаётся ключевым словом type. 2. Раздел операторов. Этот раздел является исполняемой частью программы. Чтобы отделить раздел описаний от раздел операторов между ними вставляется слово begin, которое означает начало исполняемой части программы. Раздел операторов заканчивается словом end., обязательно в конце должна быть точка. Пара (begin… end.)называется операторными скобками. Такая структура обязательна для любой программы, что является следствием жесткого требования языка: любой нестандартный для языка Турбо Паскаль идентификатор, используемый в исполняемых операторах, должен быть предварительно описан в разделе описаний. Описать идентификатор – это значит указать тип связанного с ним объекта программы (константы или переменной). 9.3. Основные операторы Паскаля9.3.1. Оператор присваиванияВ левой части оператора присваивания указывается имя переменной, правая часть представляет собой выражение того же типа, что и переменная. Пара символов «:=», связывающая левую и правую части оператора присваивания, означает «ПРИСВОИТЬ ЗНАЧЕНИЕ». В операторах присваивания Турбо Паскаля всегда используются символы «:=», в то время как при описании констант – одиночный символ «=». С точки зрения синтаксиса языка, два символа «:=» рассматриваются как один специальный символ и обязательно пишутся слитно. Пример оператора присваивания: R: =cos(x)+ln(y);. Оператор присваивания выполняется в два этапа: 1. Первый этап – выполнение правой части, т.е. в примере вычисляется арифметическое выражение. 2. Второй этап – присвоение результата левой части, т.е. в примере переменной R присваивается число, полученное при вычислении арифметического выражения. 9.3.2. Операторы вводаВ Паскале нет специальных операторов ввода-вывода. Для обмена информацией в программах Паскаля используются специальные встроенные процедуры, которые не нуждаются в предварительном описании. Таким образом, все операторы ввода-вывода являются операторами обращения к встроенным процедурам ввода или вывода данных. По операторам READ, READLN вызывается встроенная процедура ввода данных и программа останавливается в ожидании ввода. В этот момент необходимо набрать на клавиатуре нужное число и нажать клавишу «Ввод». 9.3.3. Операторы выводаОсновное назначение этих операторов – вывод результатов выполнения программы. Оператор вывода WRITE выводит строку на экран и оставляет курсор в конце выведенной строки. Если в программе несколько операторов WRITE, то вывод осуществляется в одну строку. Оператор вывода WRITELN выводит в отдельную строку, после вывода результата осуществляет перевод строки и устанавливает курсор в начало следующей строки экрана. Пример записи оператора вывода переменных X,Y,Z: WRITELN(X,Y,Z); Если в программе необходимо вывести текст на экран, следует этот текст взять в апострофы. В частности подсказка на экран для ввода данных записывается оператором: WRITELN(‘ввести X,Y,Z’); 9.3.4. КомментарийКомментарий в Турбо Паскале – это произвольная последовательность любых символов, обрамленная фигурными скобками. Комментарий разрешается вставлять в любое место программы, где по смыслу должен стоять пробел. В качестве ограничителей комментария допускается использование фигурных скобок «{» и «}», а также пары символов «(*» – слева от комментария и «*)» – справа от него: {Это – комментарий}. (*Это тоже комментарий*). 9.4. Программы линейных алгоритмовПример 1. Вычислить: . Значение А ввести в градусах. Решение. PROGRAM PR1; VAR r,a,x,y:real; BEGIN {линейный алгоритм} Writeln (‘ввести a, x, y’); Read (a, x, y); a:=a*pi/180; r:=(ln(x)*ln(x)-cos(a*a)+sqrt(y+x*x)) / ((exp(x)+exp(-x))/2); Writeln (‘r=’, r: 9:5, ‘a=’, a: 7: 3,’x=’, x: 7:3,’y=’, y: 7: 3); END. В данной программе переводится значение переменной А из градусов в радианы. Вывод делается с фиксированной точкой с указанием количества позиций под число и под дробную часть числа. 9.5. Операторы передачи управленияНазначение операторов передачи управления заключается в организации ветвлений в программе: условных или безусловных. С помощью этих операторов вычислительный процесс передается в указанную оператором точку программы по указанному в операторе условию либо без условия. 9.5.1. Оператор безусловного переходаДействие оператора GOTO состоит в передаче управления соответствующему оператору. Структура оператора: GOTO метка; Метка в Турбо Паскале – это произвольный идентификатор, позволяющий именовать некоторый оператор программы и таким образом ссылаться на него. Метка располагается непосредственно перед помечаемым оператором и отделяется от него двоеточием. Перед тем как появиться в программе, метка должна быть задана в разделе описанания. Описание меток состоит из зарезервированного слова LABEL (метка), за которым следует список меток. Пример 2. LABEL 1; {в разделе описания}; goto 1; {в разделе операторов} {перейти на метку 1} 1: read(x,y); {строка с меткой 1 в разделе операторов} При исполнении меток необходимо руководствоваться следующими правилами: 1) метка, на которую ссылается оператор GOTO, должна быть задана в разделе описаний и она обязательно должна встретиться где-нибудь в теле программы; 2) метки, описанные в процедуре (функции), локализуется в ней, поэтому передача управления извне процедуры (функции) на метку внутри нее невозможна. Однако в программировании не рекомендуется использование оператора Goto, т.к. это затрудняет понимание программ, делает ее запутанной и сложной в отладке. Современная технология структурного программирования основана на принципе программирования без GOTO. 9.5.2. Операторы условного переходаСтруктура условного оператора имеет следующий вид: IF <условие> THEN <оператор 1> ELSE <оператор 2>; где: IF, THEN, ELSE – зарезервированные слова (если, то, иначе); <условие> – произвольное выражение логического типа; <оператор 1>, <оператор 2> – любые операторы языка Турбо Паскаль. Условный оператор работает по следующему алгоритму. Вначале вычисляется условное выражение <условие>. Если результат есть TRUE (истина), то выполняется <оператор 1>, а <оператор 2> пропускается; если результат есть FALSE (ложь), наоборот, <оператор 1> пропускается, а выполняется <оператор 2>. Поскольку любой из операторов <оператор 1> и <оператор 2> может быть любого типа, в том числе и условным, а в то же время не каждый из «вложенных» условных операторов может иметь часть ELSE <оператор 2>, то возникает неоднозначность трактовки условий. Эта неоднозначность в Турбо Паскале решается следующим образом: любая встретившаяся часть ELSE соответствует ближайшей к ней «сверху» части THEN условного оператора. Условный оператор позволяет проверить некоторое условие и в зависимости от результатов поверки выполнить то или иное действие. Таким образом, условный оператор – это средство ветвления вычислительного процесса. а) Простой, короткий IF (если) Структура оператора имеет вид: 1) IF (условие) THEN (оператор или метка); Пример 3. Вычислить y: = ln x , если x > 0. Написать программу вычисления функции. Решение. Программа имеет вид. Program PR3; var y, x : real; begin writeln(‘ввести x’); Readln (x); {простой, короткий IF} IF x > 0 THEN y: = ln(x); writeln ( `x=`, x: 7:2, `y=`, y :7 :2 ); end. b) Простой, полный IF Пример 4. Вычислить y = ln x , если X>0, иначе y=cos x. Написать программу вычисления функции. Решение. В примере 4 рассматривается не только вариант «тогда», но и «иначе». Программа имеет вид: Program PR4; var x, y: real; begin writeln(‘ввести X’); Readln (X); {простой, полный IF} if x>0 THEN y:= ln (x) ELSE y:=cos(x); Writeln (`x = `, x:6:2 , `y = `, y:7:2) end. Если Х > 0, тогда выполняется оператор за словом THEN, иначе выполняется оператор, следующий за этой строкой. c) Cоставной, короткий IF Составной оператор – это последовательность произвольных операторов программ, заключенная в операторные скобки – зарезервированные слова BEGIN…END. Составные операторы – важный инструмент Турбо Паскаля, дающий возможность писать программы по современной технологии структурного программирования (без перехода GOTO). Язык Турбо Паскаль не накладывает никаких ограничений на характер операторов, входящих в составной оператор. Пример 5. Вычислить y=ln x, z=y–5x, если x > 0. Написать оператор условия вычисления функции. Решение. Оператор условия запишется в виде: IF x>0 then Begin y:=Ln(x); z:=y–5*x; Writeln (`y = `, y:7:2, `z =`, z:8:3) end; d) Составной, полный IF Пример 6. Рассмотрим задание примера 4, но вывод делается для каждого условия. Решение. Оператор условия запишется в виде: IF x>0 then Begin Y:=ln (x); Writeln (`x = `, x:6:2 ,`y =`, y:7:2); End Else begin Y:=cos (x); Writeln (`x = `, x:6:2,`y =`, y:7:2); End; В примере 6 после слов then, еlse операторы заключены в операторные скобки. e) Структурированный (разветвленный) IF 1) Структурированный, короткий, простой IF. В структурированном операторе содержится последовательная проверка вложенных условий. Пример 7. Вычислить r=ln(x+y+z), если x > 0, y > 0, z > 0. Написать фрагмент программы вычисление функции структурированным оператором условия. Решение. Оператор условия запишется в виде: IF x>0 then IF y>0 then IF z>0 then R:=LN(X+Y+Z); Пример 8. Если вместо структурированного оператора условия использовать оператор с логическим выражением, то пример 7 запишется в виде: IF (x>0) and (y>0) and (z>0) then R:=LN(X+Y+Z); В примере 8 уместна логическая операция «and». Данную строку можно прочитать следующим образом «если (x>0) и (y>0) и (z>0) тогда R:=LN(x+y+z);». В примере 9 используется оператор условия с логическим выражением, где применяется логическая операция «or». Пример 9. Вычислить r=x+y+z, если выполняется хотя бы одно из условий x>0, y>0, z>0. Оператор условия запишется в виде: IF (x>0) or (y>0) or (z>0) then R:=(x+y +z); Данную строку можно прочитать следующим образом «если (x>0) или (y>0) или (z>0) тогда R:=LN(x+y+z);». В примерах 8, 9 логические выражения включают в себя логические операции и условия, каждое условие следует заключать в скобки. 2) Структурированный, полный, простой IF. Пример 10. Вычислить: r=ln(x)+ln(y)+ln(z), если x>0, y>0, z>0; r= ln(x)+ln(y)+z, если x>0, y>0; r=ln (x)+y+ z, если x>0, иначе r = x+y+z . Оператор условия запишется в виде: IF x>0 then IF y>0 then IF z>0 then r:=ln(x)+ln(y)+ln(z) else r:= = ln(x)+ln(y)+z Else r:= ln (x)+y+z Else r:= x+y+z; Вначале проверяются три условия. Если они выполняются, то вычисляется r=ln(x)+ln(y)+ln(z). Иначе выполняются первые два условия, а последнее не выполняется и z ≤ 0 (первое слово else относится к последнему условию). В этом случае вычисляется r= ln(x)+ln(y)+z. Если из двух условий выполняетcя только первое, то вычисляется r=ln x+y+z (второе слово else относится ко второму условию) и в этом случае y ≤ 0. Последнее слово else относится к первому условию и в этом случае х ≤ 0. В этом случае вычисляется r=x+y+z. 9.5.3. Оператор выбора вариантаОператор выбора позволяет выбрать одно из нескольких возможных вариантов программы. Параметром, по которому осуществляется выбор, служит ключ выбора – выражение любого порядкового типа (любого из рассмотренных, кроме типов REAL и STRING). Структура оператора выбора такова: CASE <ключ выбора> OF <список выбора> [else <оператор>] end; где CASE – случай, of – из, <ключ выбора> выражение типа целые; <оператор> – произвольный оператор Турбо Паскаля. Оператор выбора работает следующим образом. Вначале вычисляется значение выражения <ключ_выбора>, а затем в последовательности операторов <список_выбора> отыскивается такой, которому предшествует константа, равная вычисленному значению. Найденный оператор выполняется, после чего оператор выбора завершает свою работу. Если в списке выбора не будет найдена константа, соответствующая вычисленному значению ключа выбора, управление передается оператору, стоящему за словом ELSE. Пример 11. Вывести разные функции в зависимости от значения переменной n, введённой с клавиатуры. Написать программу с использованием оператора выбора CASE. Решение. Program Pr11; Var n: integer; a, b, y, z: real; begin writeln (‘n, a, b’); read (n, a, b); y:=a+b; z:=a-b; CASE n of 1, 2, 5: writeln (y); 7..10: writeln (z); else writeln (‘ вне области определения n’); end;end. При значении n=1, 2, 5 программа выведет значение y. При значении n={7, 8, 9, 10}(одному из списка) программа выведет значение z, иначе выведет текст ‘вне области определения n’ . Пример 12. Вывести разные функции в зависимости от значения переменной k. Если переменная k лежит в пределах [110], вычислить y: = cos (x); z:=y+x; и вывести результат. Если переменная k лежит в пределах [11;20], вычислить y: = sin(x); и вывести результат. Написать программу с использованием оператора выбора CASE. Решение. Program Pr12; Var K: integer; x, y, z: real; begin writeln (`x, k`); readln (x, k); case k of 1..10: begin y:=cos (x); z:=y+x; writeln (y,z); end; 11..20: begin y:=sin(x); writeln (y); end; else writeln (`вне области переменной к`); end; end. 9.6. Разветвляющийся алгоритмПример 13. Дана точка А (x,y) с координатами x,y, не равными нулю. Найти четверть, в которой находится эта точка. Написать программу. Решение. Program Pr 13; Var x,y: integer; Begin writeln(‘ввести координаты т. А: x,y’); Readln (x,y); IF (x>0 ) and (y>0) then writeln (‘т. A находится в 1 четверти’) else IF (x>0) and (y<0) then writeln (‘т. А в 4 четверти’) else IF y>0 then writeln (т. А во 2 четверти’) else writeln (‘ т. А в 3 четверти’); End. Каждому ELSE соответствует предыдущее свободное then. 9.7. Операторы циклаОператор цикла с параметрами Счетный оператор цикла FOR имеет такую структуру: а) FOR i:=a TO b DO <оператор>; Здесь FOR, TO, DO – зарезервированные слова (для, до, выполнить); i – переменная цикла типа INTEGER; a – начальное значение переменной цикла (тип INTEGER); b – конечное значение переменной цикла (тип INTEGER); <оператор> – произвольный оператор Турбо Паскаля. Шаг изменения параметра цикла равен единице. Алгоритм выполнения оператора цикла с параметрами при выполнении оператора FOR: вначале осуществляется присваивание i:=a; проверяется условие i > b;если это условие выполняется, то следует выход из цикла, иначе на пункт 3; выполняется тело цикла; счётчик увеличивается на единицу: i:=i + 1; переход на 2; после этого цикл повторяется или заканчивается. Пример 14. Найти сумму значений переменной цикла. Фрагмент программы с оператором цикла запишется в виде: For i:= 1 to 10 do s:=s+i; Writeln(‘s=’, s); В примере 14 рассматривается простой оператор цикла. Счётный оператор цикл FOR может иметь такую структуру: б) FOR i: = b DOWNTO a DO <оператор>; Замена зарезервированного слова TO на DOWNTO означает, что шаг наращивания переменной цикла равен (-1). Пример 15. Найти сумму значений переменной цикла. Фрагмент программы с оператором цикла запишется в виде: For i:=10 to 1 downto s:=s+i; Writeln(‘s=’,s:8:3); {Результат получится тот же, что и в примере 14}. Правила оператора FOR. Нельзя войти в цикл, минуя оператор FOR. Нельзя изменять параметры цикла (a,b) внутри цикла. Параметры цикла и переменная цикла должны быть целыми. Шаг цикла может быть единица или минус единица. Естественное окончание цикла осуществляется при условии i > b для а). Из цикла можно выйти до естественного окончания цикла по условию. Оператор цикла WHILE с предусловием Структура оператора имеет вид: WHILE <условие> DO <оператор>; Здесь WHILE, DO – зарезервированные слова: WHILE – пока; DO – выполнить, <условие> – выражение логического типа; <оператор> – произвольный оператор Турбо Паскаля. Если выражение <условие> имеет значение TRUE, то выполняется <оператор>, после чего вычисление выражения <условие> и его проверка повторяются. Если <условие> имеет значение FALSE, оператор WHILE прекращает свою работу. Пример 16. Переписать фрагмент примера 14, используя оператор цикла с предусловием. Фрагмент программы с оператором цикла запишется в виде: s:=0;i:=1; while i<=10 do Begin s:=s+i; i:=i+1; End; Writeln(‘s=’,s); В примере 16 рассматривается составной оператор цикла, тело цикла заключено в операторные скобки. Оператор цикла REPEAT…UNTIL с постусловием Структура оператора имеет вид: REPEAT <тело_цикла> UNTIL <условие>; Здесь REPEAT, UNTIL – зарезервированные слова (повторять до тех пор, пока не будет выполнено условие); <тело_цикла> – произвольная последовательность операторов Турбо Паскаля; <условие> – выражение логического типа. Операторы <тело_цикла> выполняются хотя бы один раз, после чего вычисляется выражение <условие>: если его значение есть FALSE, операторы <тело_цикла> повторяются, в противном случае оператор REPEAT…UNTIL завершает свою работу. Пример 17. Выполнить задание примера 16. Фрагмент программы с оператором цикла запишется в виде: s:=0; i:=1; repeat s:=s+i; i:=i+1; Until i>10; Writeln(‘s=’,s); В примере 17 цикл выполняется пока переменная i 10, при i>10 цикл закончится. 9.8. Программы циклических алгоритмовЗадача. Написать программу вычисления и вывода таблицы значений функции y=cos(x). Переменная х изменяется в интервале от x1=0 до xk= 2 с шагом dx= 0,2. Пример 18. В данной программе используется оператор цикла с параметрами. PROGRAM PR18; Var x,y,dx,x1,xk:real; i, n :integer; begin {циклический алгоритм} writeln (‘ввести начальное – x1, конечное – xk, шаг – dx’); read (x1,xk,dx); n:=trunc((xk-x1)/dx+1); x:=x1; {оператор цикла с параметрами} for i:=1 to n do begin y:=cos(x); Writeln (‘x= ’, x:8:5, ‘y= ’, y:8:5); x:=x+dx; End; {конец оператора цикла с параметрами}End. 9.9. Массивы9.9.1. Понятие и описание массиваМассивом называются упорядоченная последовательность однотипных объектов, обозначаемая одним именем. Чтобы выделить один из объектов (элемент) массива, надо указать имя массива и номер элемента в нем. Номер элемента называется индексом, индекс указывается в квадратных скобах и может быть числом, переменной, выражением. Имя массива образуется по правилам образования имен переменных. Пример: А [10], B [J,1], SVM [1,J+5]. Если для выделения элемента нужен 1 индекс, массив называется одномерным, два – двумерным и т.д. Число элементов массива называется длиной или размером массива. Массивы относятся к структурированным типам данных. В программе массив можно описать двумя способами: а) непосредственно в разделе описаний переменных: Пример 19. var a,b: array [1..10] of real; с: array [-10..10] of char; d,y: array [1..5,1..5] of integer ; б) объявлением типа-массива (удобно, когда надо ввести несколько одинаковых массивов) Пример 20. type mas=array [1..10] of real; var c,d:mas; {описание двух массивов типа mas} Элементы массива могут быть любого типа, а индексы могут быть любого порядкового типа (например, типа integer, char, …). Но обычно используется тип – диапазон: 1..10, N..M и т. п. Число элементов массива и его границы фиксируются при его описании и не могут быть изменены в процессе выполнения программы. Границы N..M могут быть заданы константами в разделе описания констант. 9.9.2. Ввод и вывод элементов массивовВвод и вывод массивов осуществляется поэлементно. Часто это делают с помощью циклов (обычно используется цикл FOR). Пример 21. Ввести с клавиатуры значения элементов одномерного массива вещественного типа состоящего из 10 элементов. Вывести на экран массив. Написать программу. program PR22; var A: array[1..10] of real; k: integer; begin for k:=1 to 10 do readln (A[k]); for k:=1 to 10 do writeln (A[k]); end. Двумерные массивы (матрицы) можно вводить по строкам или по столбцам. Пример 22. Пусть требуется ввести массив А (3;4): 2-й столбец а) ввод и вывод по строкам: program PR22; var a:array [1..3, 1..4] of real; i,j:integer; begin for i:=1 то 3 for j:=1 то 4 read (a[i,j]); for i:=1 то 3 for j:=1 то 4 writeln (a[i,j]); end. б) ввод по столбцам begin for i:=1 то 4 for j:=1 то 3 read (а[j,i]); {изменён порядок индексов} Пусть, например, требуется ввести матрицу 1 2 3 4 5 6 7 8 В варианте а) вводим числа в порядке 1,2,3,4,5,6,7,8 (после набора каждого числа нажимаем ENTER, запятые не вводятся) В варианте б) вводим числа так: 1,5,2,6,3,7,4,8. Если этот порядок нарушить, то получатся разные матрицы, что в математических задачах приведет к ошибкам. 9.9.3. Операции с массивамиВ Паскале есть лишь одна операция, которую можно делать с массивом целиком – это операция присваивания. Но для этого массивы должны быть совершенно одинаковы, то есть описаны в одной строке VAR или TYPE. Все остальные операции производятся только с отдельными элементами массива. С элементами массива можно делать все операции, которые разрешены для базового типа массива: если массив числовой, то математические, если символьный или строковый, то, соответственно, операции с символьными или строковыми переменными. Пример 23. Требуется найти максимальный и минимальный элементы одномерного массива вещественного типа. Алгоритм поиска минимума: вводим переменную MIN, в которую записываем 1-ый элемент массива. Затем в цикле сравниваем каждый последующий элемент с MIN. Если число, хранящееся в текущем элементе, меньше хранящегося в MIN, то число из текущего элемента записываем в MIN. Аналогичен алгоритм поиска максимума, только вместо «меньше» ставим «больше». Написать программу. program PR23; var z: array[1..100] of real; n,k: integer; max, min: real; Begin Writeln(‘ввести количество элементов массива n’); readln (n); for k:=1 to n do readln (z[k]); max:=z[1];min:=z[1]; for k:=1 to n do if z[k]>max then max:=z[k] else if z[k] writeln(’max=’, max:8:3, ’ min=’, min :8:3); end. Пример 24. Для двумерного массива состоящего из N строк и N столбцов: а) найти сумму элементов M-столбца; б) найти произведение элементов K-строки. Значения К и M вводить с клавиатуры program PR24; type mas=array[ 1.. 10, 1..10] of integer; var a:mas; s, p, i, j, n, k, m :integer; begin writeln(’ввести количество строк и столбцов n’); readln(n); for i := l to n do for j := l to n do begin writeln(’ввести элемент массива a[’,i ,’, ’,j ,’]= ’); read (a[i, j]); {ввод элемента массива} writeln(a[i, j]); {вывод элемента массива} end; writeln (’ввести номер строки-k и столбца-m’); read (k, m); s:=0; p:=1; for i:=1 to n do s:=s+a[i, m]; {сумма элементов столбца m} for j:=1 to N do p:=p*a[k, j]; { произведение элементов строки k} writeln(’s=’,s, ’p=’,p)); end. При выполнении операций с фиксированной строкой первый индекс не меняется, при суммировании по столбцу второй индекс не меняется. Пример 25. Сформировать одномерный массив, каждый k-й элемент которого равен произведению элементов соответствующей k-й строки двумерного массива. program PR25; var A: array[1..10,1..10] of integer; B: array[1..10] of integer; N, M, k, j: integer; begin writeln(’введите количество строк N, столбцов M’); readln (N,M); for k:=1 to N do for j:=1 to M do begin writeln(’ввести элемент массива A[‘, k , ‘,’, j ,’ ]’); readln (A[k,j]); end; for k:=l to N do begin В[k]:=1; for j:=1 to M do В[k]:=В[k]*A[k,j]; end; for k:=l to N do write(B[k]); end. Пояснение к программе: После ввода массива в следующем цикле накапливается произведение элементов каждой строки во внутреннем цикле оператором: B[k]:=B[k]*A[k,j];. Но перед этим необходимо во внешнем цикле задать начальное значение элемента нового массива оператором B[k]:=1;. 9.10. Вопросы для самоконтроля по теме «Программирование»1. Укажите правильно записанный оператор присваивания на Паскале: a) z:= cos(x) + ln(y); b) cos(x): = z+ ln(y); c) z =cos(x)+log(y); d) a+b:=c+d. 2. Укажите правильно записанный оператор присваивания на Паскале: a) x+z:= sin(x)+ln(y); b) z+ ln(y):=w; c) w :=sin(x)+sqr(g); d) v-b:=w*d. 3. Укажите правильно записанный оператор присваивания на Паскале: a) v:=e^x+tg(z); b) v:=exp(x )+sin(x)/cos(x) ; c) v:=exp(x )+sin/cos(x) ; d) m/b+s:=w*d- ln(y). 4. Укажите правильно записанный оператор ввода: a) WRITE ('Введите Х', X); b) WRITE (X); c) READ (X); d) REAL(X). 5. Вывести на экран число, хранящееся в переменной Х: a) READ (X); b) WRITE (X); c) READ ('Выведите Х=', X); d) REAL(X). 6. Дана функция r=tg x-lnay; которая записана на Паскале. Выбрать строку без ошибок: a) r:=tg(x) –ln(y)/a; b) r:=tan(x) –ln(y)/ln(a); c) r:=sin(x)/cos(x) - ln(y)/ln(a); d) r:= cos(x)/sin(x) - ln(a)/ln(y). 7. В строке представлено: В : ARRAY[1..5,1..5] OF INTEGER; a) ввод массива; b) вывод массива; c) описание одномерного массива; d) описание двумерного массива. 8. Дана функция f=ctg a + ln x; которая записана на Паскале. Выбрать строку без ошибок: a) f:=ctg(a) +ln(x); b) f:=sin(a)/cos(a) + log(x); c) f:=ctg(a)+lg(x); d) f:=cos(a)/sin(a) +ln(x). 9. Выбрать строку, в которой допущена ошибка: a) c:= z mod x +a*f; b) c:=arctan(b) - abs(r); c) c:=sqr(b) + exp(-a*b); d) c:= log(x) +cos(a)/d. 10. Выбрать строку, в которой допущена ошибка: a) q:=tan(x) - ln(c)*z; b) q:=exp(y)+sqr(a)/z; c) q:=arctan(f) +sqrt(h); d) q:=int(K) +round(m). 11. Дана функция r=tg x + ln x, которая записана на Паскале. Выбрать строку без ошибок: a) r:=tg(a) +ln(x); b) r:=sin(a)/cos(a) + ln(x); c) r:=tan(a)+lg(x); d) r:=cos(a)/sin(a) +ln(x). 12. В строке программы на Паскале IF X<0 THEN Y:=sqr(X) ELSE Y:=sqrt(X) рассматривается оператор: a) простой короткий условный; b) простой полный условный; c) составной условный; d) присваивания. 13. В строке программы на Паскале IF X>0 THEN Y:=LN(X); рассматривается оператор: a) простой короткий условный; b) простой полный условный; c) составной; d) присваивания. 14. Выбрать правильно записанный оператор условия: если x<0 , тогда y=cos(x):, иначе y=x, x>=0: a) IF X< 0 THEN Y:=cos(X) ELSE Y:=X; b) IF X<0 THEN Y:=cos(X) ELSE X; c) IF Y≤X<0 THEN Y:=X; d) IF X>0 THEN Y=X ELSE cos(X). 15. Дан оператор на Паскале: FOR k:=3 TO m DO S:=S+k;. Для выполнения цикла значение m должно быть: a) m 16. Дан оператор на Паскале: FOR k:=1 TO m DO S:=S+k;. Всего циклов будет выполнено: a) k; b) s; c) m; d) 1. 17. Дан оператор на Паскале: FOR k:=1 TO m DO s:=s+k;. Выберите условие выхода из цикла: a) k = 1 ; b)k = m; c) k m; d) k >m. 18. Строка на Паскале: while k <=m do; относится к операторам: a) условия; b) цикла; c) вывода; d) ввода. 19. В строке представлено: В : ARRAY[1..7] OF INTEGER; a) ввод массива; b) вывод массива; c) описание одномерного массива; d) описание двумерного массива. 0>0>0>0> |