Оператор цикла с параметром
Стр 1 из 2Следующая ⇒ Простейшая программа
Простейшая программа на Паскале схематически может быть изображена следующим образом: program N; var A1;…; Ак; begin Р1;…; Pn; end. Здесь N – имя программы, A1;…; Ак; - описания переменных, Р1;…; Pn – операторы Пример. Программа korni вычисления корней квадратного уравнения ах2+bx+с=0, заданного коэффициентами а, b и с (предполагается, что а≠0 и что дискриминант уравнения неотрицателен),будет иметь следующий вид: program korni; var a, b, c,d: real; begin readln (a, b, c); d:=sgr(b)-4*a*b; x1:=(-b+sgrt(d))/(2*a); x2:=(-b-sgrt(d))/(2*a); writeln(x1,x2); end. Первая часть программы, т.е.program korni;называется заголовком. Между служебным словом program и именем программы ставится пробел. Пробел является символом (печатным знаком). На клавиатуре компьютера есть специальная клавиша пробела. Пробелы в программе нужно обязательно ставить между всеми теми идентификаторами и числами, которые не разделены другими знаками. Вторая часть программы,которая начинается со служебного слова var,называется описанием переменных. Третья часть программы,помещенная в операторные скобки,begin…..end,называется программным кодом.В этой части программы размещаются операторы,которые выполняет компьютер после запуска программы на выполнение. Программа, перед тем как она будет применена для решения поставленной задачи, должна быть отлажена.Цель отладки состоит в том, чтобы выявить и устранить допущенные ошибки. Одним из способов отладки является тестирование, суть которого состоит в следующем. Программа выполняется несколько раз с различными исходными данными. При этом в качестве исходных данных вводятся такие значения, для которых заранее известны результаты(такие наборы исходных данных называются тестами). Результаты, полученные при выполнении программы, сравниваются с известными результатами. Несовпадения их между собой свидетельствует о наличии ошибок в программе.
Если программа предназначена для многократного использования, то ее можно переписать из памяти компьютера на магнитный диск. Впоследствии эту программу можно будет вводить уже не с клавиатуры, а с диска.
Условный оператор.
Условный оператор используется для программирования ветвлений. Если мы хотим, чтобы переменной max присвоилось наибольшее из значений переменных х1 и х2, то надо сравнить значения х1 и х2 и в зависимости от результата сравнения выполнить либо оператор max:=х1, либо max:=х2. Действия такого рода задаются условным оператором: if B then P1 else P2, где В – условие, P1 и P2 - операторы. Если В соблюдается, то выполняется P1, иначе выполняется P2. В качестве условий используются отношения. Отношения представляют собой записи равенств и неравенств. Примеры отношений: а = b x < a – b sqr(b) – 4*a*c > 0. Для решения задачи о присвоении переменной max наибольшего из значений х1 и х2 достаточно выполнить условный оператор if х1>х2 then max: = х1 else max: = х2; На клавиатурах современных компьютеров нет знаков ≠, ≥, ≤, и вместо этих знаков используются соответственно комбинации < >, > =, < =. Вместо с + d ≠е + f получается с + d < > е + f, х ≥ у– соответственно х > = у. В общем случае отношение – это два выражения, разделенных одним из знаков =, >, < или же одной из комбинаций знаков < >, > =, < =. В программах, могут, например, встретиться условные операторы if a < = b then a: = a – 1 else b: = b – 1; if a < > b then a: = a + b else а: = а – b; и т.д. Рассмотрим примеры программ, включающих в себя условные операторы. Пусть задана функция: 0, если х ≤ 0 у = х3, если х > 0. Требуется написать программу вычисления значения у по значению х. Программа может выглядеть так:
program Vfun; var x, y: real; begin writeln(‘введите с клавиатуры значение х’); readln(х); if х < = 0 then у: = 0 else у = х*х*х; writeln (‘y=’,y:8:2); end. Пример. Пусть даны два числа. Если первое больше второго по абсолютной величине, то необходимо уменьшить первое в пять раз. Иначе оставить числа без изменения. Программа:
program В; var x, y: real; begin writeln(‘введи 2 числа’); readln(х, у); if abs (х) > abs (у) then х: = х/5; writeln(х:8:2,y:8:2); end. Пример. Даны три числа х, у, z. Требуется найти max (х, у, z) – наибольшее из этих чисел (среди х, у, z могут быть и равные числа: например, max (3, -1, 3)=3, max (7, 7, 7)=7
program М; var x, y,z, max: real; begin read (х, у, z); max: = х if max < у then max: = у; if max < z then max: = z; writeln (‘максимальное из трх чисел равно:’,max:8:4:); end. После выполнения первого условного оператора переменная max имеет значение наибольшего из первых двух данных чисел, после выполнения второго условного оператора – значение наибольшего из трех данных чисел.
Составной оператор.
В рассмотренных выше примерах в условном операторе после then и else выполняются по одному оператору. Однако часто необходимо в зависимости от результата проверки некоторого условия выполнить ту или иную группу операторов. Паскаль предоставляет возможность сделать из группы операторов один составной оператор. Структура основного оператора:begin Р1; Р2; ...Рк end. Пусть квадратное уравнение ах2+bх+с=0 задано коэффициентами а, b и с (а≠0). Ниже следует программа, при выполнении которой исследуется дискриминант и выводится пара корней, если дискриминант не отрицателен: program кorni; var а, b, с, d,p,t,x1,x2: real; begin read (а, b, с); d:= sgr (b) – 4*a*c; if d < 0 then write (‘уравнение не имеет корней’) else begin p:=sgrt(d); t:=2*a; x1:=(-b+p)/t; x2:=(-b-p)/t; writeln(‘x1=’x1:6:2,’x2:=’,x2:6:2); end end. В условном операторе этой программы после else в операторных скобках begin…….end помещен составной оператор, включающий пять операторов p:=….;t:=….;x1:=…;x2:=….;writeln(…).
Оператор цикла с условием.
Многократно повторяемые действия (циклы) могут быть заданы оператором цикла с условием while B do P (while – пока, do – выполнять),где В – условие (отношение), Р – любой оператор (простой или составной), называемый телом цикла. Выполняется данный оператор цикла так: проверяется условие В, и если оно соблюдается, то выполняется Р, а затем вновь проверяется условие В и т.д. Как только на очередном шаге окажется, что условие В не соблюдается, то выполнение оператора цикла прекратится.
Пусть даны числа а, b (а > 1), и надо получить все члены бесконечной последовательности а, а2, а3,… меньше числа b. Программа: program stepeni; var а, b, st: real; begin readln (а, b); st: = а; while с < b do begin writeln(st); st: = st*а; end end. При выполнении этой программы переменная st будет последовательно принимать значения а, а2, а3,…Изменение значения переменной st происходит до тех пор, пока оно не станет больше или равной значению b. Если с самого начала будет иметь место,что а ≥ b, то не будет выведено ни одного члена последовательности а, а2, а3,…Оператор цикла с условием используется в задачах,где по условию задачи неизвестно сколько раз необходимо выполнить тело цикла,чтобы получить решение задачи.
Оператор цикла с параметром
Имеются задачи,в которых условие задачи определяет сколько раз необходимо выполнить тело цикла,чтобы получить решение.В этом случае вместо оператора while предпочтительней использовать оператор цикла с параметрами: for i: =A to B do Р, здесь I некоторая переменная типа integer, которая называется параметром цикла, А и В – выражения со значением типа integer, Р – оператор (тело цикла). Оператор цикла с параметром выполняется так. Сначала вычисляются значения выражений А и В. Получаются два целых числа, которые мы обозначаем, соответственно, через А и В. Если А ≤ В, то переменная I последовательно принимает значения, равные А, А+1, А+2,…,В, и для каждого из этих значений выполняется оператор Р. Если А > В, то оператор Р не будет выполнен ни разу и выполнение оператора цикла с параметром сразу же закончится. Пусть перед выполнением оператора цикла for i: =1 to n do s: = s + i*i*i переменная s имела значение 0 и пусть n > 0. Тогда после выполнения оператора for переменная s примет значение 13+23+…+ n3. Программа вычисления факториала N! (N!=1*2*3……*N): program Fakt; var n, i, p: integer; begin readln (n); p:=1; for i: =2 to n do p: = p*I; write ('n!=',p)
end.
Имеется еще один вариант оператора цикла с параметром: for i: =А downto B do P Здесь I принимает последовательно значения А, А – 1,…, В, и для каждого из них выполняется оператор P, если же А меньше В, то оператор S не выполняется ни разу. Еще один вариант программы вычисления факториала: program Fakt; var n, i, p: integer; begin read (n); p:=1; for i: = n downto 2 do p: = p* i; write ('n!=',p) end.
Рассмотрим еще примеры программ с операторами цикла с параметром. 1. Программа определения наименьшего числа к3 *sin (n + k/n) n (к = 1, 2, …, n):
program Vmin; var elem, min: real; k, n: integer; begin read (n); min: = sin (n+1/n); for k: = 2 to n do begin elem: = k*k*k*sin (n+k/n); if elem < min then min: = elem end; writeln (' min =', min) end.
При выполнении этой программы наименьшее число определяется за n шагов: после выполнения к-го шага значение переменной min равно наименьшему числу среди первых к чисел последовательности. Остальные n – 1 шагов выполняются с помощью оператора цикла. Каждый следующий шаг выполняется с учетом значения, полученного на предыдущем шаге. Программа вычисления суммы 70 действительных чисел(числа вводятся с клавиатуры):
program с70; var a, s: real; i: integer; begin s: = 0; for i: = 1 to 70 do begin writeln(’введите текущее число из последовательности 70 чисел’); read (a); s: = s+a end; writeln (' s =', s) end.
В программе с70 строку for i: = 1 to 70 do можно заменить строкой for i: = 70 downto 1 do или строкой for i: = 0 to 69 do – от этого ничего не изменится, так как сами значения параметра цикла при выполнении программы не используются, и существенным является только число шагов цикла.
2. И последний пример. Дано натуральное n число и целые а1, …, аn. Предполагается, что а1, …, аn – попарно различны. Требуется определить наибольший член ак последовательности а1, …, аn вместе с его порядковым номером к. Программа:
program Naib; var I, k, a, M: integer; Begin writeln ('введи n '); readln (n); writeln(‘введи первое число’); read (M); k:=1; for i: = 2 to n do begin writeln (' введи следующее число '); readln (a); if a > M then begin M: = a; k: = I; end; end; writeln ('наибольшее = ', М, ' номер = ', к) end. В заключении этого параграфа приведем два правила, принятых в Паскале: 1) по окончании выполнения оператора цикла с параметром значение параметра цикла считается неопределенным; 2) выполнение оператора, являющегося телом оператора цикла с параметром, не должно приводить к изменению значения параметра цикла.
Примеры и решения
1. Написать программу вычисления объема цилиндра. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом).
Вычисление объема цилиндра Введите исходные данные: Радиус основания (см) = 5 Высота цилиндра (см) = 10
Объем цилиндра 1570, 80 куб.см. Для завершения работы программы нажмите <Enter>.
Program CL; Var r, h, v: real; {радиус основания, высота и объем цилиндра} Begin writeln (' Вычисление объема цилиндра '); writeln (' Введите исходные данные: '); write (' радиус основания (см) = '); readln (r); write (' высота цилиндра (см) = '); readln (h); v: = 2*3.1415926*r*r*h; writeln (' Объем цилиндра ', v:6:2, ' см.куб. '); writeln (' Для завершения работы программы нажмите <Enter> '); readln; End. 2. Написать программу вычисления стоимости покупки, состоящей из нескольких тетрадей и карандашей. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом).
Вычисление стоимости покупки. Введите исходные данные: Цена тетради (руб.) = 2.75 Количество тетрадей = 5 Цена карандаша = 0.85 Количество карандашей = 2 Стоимость покупки: 15.45 руб.
Program PK; Var kar, tetr: real; {цена карандаша и тетради} nk, nt: integer; {количество тетрадей и карандашей} summ: real; {стоимость покупки} Begin writeln (' Вычисление стоимости покупки. '); writeln (' Введите исходные данные: '); write (' Цена тетради (руб.) = '); readln (tetr); writeln (' Количество тетрадей = '); readln (nt); write (' Цена карандаша (руб.) = '); readln (kar); writeln (' Количество карандашей = '); readln (nk); summ: = tetr* nt + kar* nk; writeln; writeln (' Стоимость покупки: ', summ: 6:2, ' руб. '); readln; End. 3. Написать программу, которая вычисляет частное от деления двух чисел. Программа должна проверять правильность введенных пользователем данных и, если они неверные (делитель равен нулю), выдать сообщение об ошибке. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом).
Вычисление частного. Введите в одной строке делимое и делитель, Затем нажмите <Enter> = 12 0 Вы ошиблись. Делитель не должен быть равен нулю.
Program DEL; Var a, b, c: real; (делимое, делитель и частное) Begin writeln (' Вычисление частного '); writeln (' Введите в одной строке делимое и делитель, '); writeln (' затем нажмите <Enter>'); write (' = '); readin (a, b); if b <> 0 then Begin с: = а/ b; writeln (' частное от деления ', а:6:3, ' на ', b:6:3, ' равно ', с:6:3); End Else writeln (' Ошибка! Делитель не должен быть равен нулю!'); readln; End.
4. Написать программу решения квадратного уравнения. Программа должна проверять правильность исходных данных и в случае, когда коэффициент при второй степени неизвестного равен нулю, выводить соответствующее сообщение. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом).
* Решение квадратного уравнения * Введите в одной строке значения коэффициентов и нажмите <Enter> = 12 27 -10 Корни уравнения: х1= -25.551 х2= -28.449
program sqroot; Var a, b, c: real; {коэффициенты уравнения} х1, х2: real; {корни уравнения} d: real; {дискриминант} Begin writeln (' * Решение квадратного уравнения * '); write (' Введите в одной строке значения коэффициентов'); writeln (' и нажмите<Enter>'); write (' = '); readln (a, b, c); (ввод коэффициентов) d: = b*b-4*a*c; (вычисление дискриминанта) if d >= 0 Then Begin х1: = - b + sqrt (d) / (2*a); х2: = - b - sqrt (d) / (2*a); writeln (' Корни уравнения: '); writeln (' х1= ', х1:9:3); writeln (' х2= ', х2:9:3); End Else writeln (' Корней нет '); End.
5. Написать программу вычисления стоимости покупки с учетом скидки. Скидка в 3% предоставляется в том случае, если сумма покупки больше 500 руб,в 5% - если сумма больше 1000 руб. Ниже представлен рекомендуемый вид экрана во время работы программы. Вычисление стоимости покупки с учетом скидки.
Введите сумму покупки и нажмите <Enter> = 640 Вам представляется скидка 3% Сумма покупки с учетом скидки: 620. 80 руб.
Program SK; Var summ: real; {сумма покупки} Begin writeln (' Вычисление стоимости покупки с учетом скидки. '); writeln (' Введите стоимость покупки и нажмите <Enter>. '); write (' = '); readln (summ); if summ >500 Then Begin if summ >1000 Then Begin writeln (' Вам предоставляется скидка 5%. '); summ: = 0.95* sum; End Else Begin writeln (' Вам предоставляется скидка 3%. '); summ: = 0.97* sum; End writeln (' Сумма покупки с учетом скидки: ', summ:6:2 ', руб. '); End Else writeln (' Скидка не предоставляется. '); readln; End. 6. Написать программу, которая запрашивает у пользователя номер месяца и выводит соответствующее название времени года. В случае, если пользователь укажет недопустимое число, программа должна ввести сообщение «Ошибка ввода данных». Ниже представлен рекомендуемый вид экрана во время работы программы.
Введите номер месяца (число от 1 до 12) и нажмите <Enter> = 11 Зима.
Program VG; Var month: integer; {номер месяца} Begin writeln (' Введите номер месяца (число от 1 до 12) и нажмите '<Enter>'); write (' = '); readln (month); case month of 1, 2, 12: writeln (' Зима '); 3..5: writeln (' Весна'); 6..8: writeln (' Лето '); 9..11 writeln (' Осень'); else writeln (' Число должно быть от 1 до 12 '); end; readln; End. 7. Написать программу, вычисляющую стоимость междугороднего телефонного разговора (цена одной минуты определяется расстоянием до города, в котором находится абонент). Исходными данными для программы являются код города и продолжительность разговора.
Program STR; Var kod: integer; {код города} cena: real; {цена минуты} dlit: integer; {длительность разговора} summ: real; {стоимость разговора} Begin writeln (' Вычисление стоимости разговора по телефону. '); Begin writeln (' Введите исходные данные:'); Begin write (' Код города = '); readln (kod); write (' Длительность разговора (целое количество минут) = '); readln (dlit); write (' Город: '); case kod of 432: begin writeln (' Владивосток '); cena: = 2.2; end; 095: begin writeln (' Москва '); cena: = 1; end; 815: begin writeln (' Мурманск '); cena: = 1.2; end; 846: begin writeln ('Самара '); cena: = 1.4; end; end; summ: = cena * dlit; writeln (' Цена минуты: ', cena:6:2, ' руб. '); writeln (' Стоимость разговора: ', summ:6:2, ' руб. '); readln; End. 8. Написать программу, которая вычисляет сумму первых n членов ряда 1, 3, 5, 7, …. Количество суммируемых членов ряда задается во время работы программы.
Program SR; Var е: integer; {член ряда} n: integer; {кол-во суммируемых членов} summ: integer; {сумма членов ряда} i: integer; {счетчик циклов} Begin writeln (' Вычисление частичной суммы ряда: 1, 3, 5, 7, … '); write (' Введите количество суммируемых членов = '); readln (n); е: = 1; {первый член ряда} summ: = 0; for i = 1 to n do Begin summ: = summ + е; {прибавить к сумме очередной член ряда} е: = е +2; {вычислить значение следующего члена ряда} end; writeln (' Сумма первых ', n, ' членов ряда равна ', summ); readln; End.
9. Написать программу, которая выводит таблицу степеней двойки (от нулевой до десятой).
Program ST2; Var n: integer; {показатель степени} х: integer; {значение 2 в степени n} Begin writeln (' Таблица степеней двойки '); х:=1; for n: = 0 to 10 do Begin writeln (n:2, х:6); х:=х*2; end; readln; End.
10. Написать программу, которая выводит таблицу значений функции у = - 2,4х2 + 5х – 3 в диапазоне от -2 до 2 с шагом 0,5. Program TF; Const LB=-2; {нижняя граница диапазона изменения аргумента} HB=2; {верхняя граница диапазона изменения аргумента} DX=0.5; {приращение аргумента} Var x, y: real; {аргумент и значение функции} n: integer; {кол-во точек} i: integer; {счетчик циклов} Begin n:= Round (HB – LB)/DX) + 1; x:=LB; writeln (' ------------------------- '); writeln (' х ﺍ у '); writeln (' -------------------------- '); for i: = 1 to n do Begin у:=-2.4*х*х+5*х-3; writeln (х:В:2, ' ﺍ ', у:В:2); х:=х+ DX; end; writeln (' ------------------------- '); readln; End.
11. Написать программу, которая генерирует три последовательности из десяти случайных чисел в диапазоне от 1 до 10, выводит каждую последовательность на экран и вычисляет среднее арифметическое каждой последовательности. Рекомендуемый вид экрана во время работы программы приведен ниже.
***Случайные числа*** 6 10 4 2 5 8 1 7 7 3 сред. арифм. 5.30 10 3 6 1 10 1 3 8 7 6 сред. арифм. 5.50 5 2 2 5 4 2 2 1 6 10 сред. арифм. 3.90 Для завершения программы нажмите <Enter>
Program SLCH; Const N=3; {кол-во последовательностей} L=10; {длина последовательности} Var r: integer; {случайное число} sum: integer; {сумма чисел последовательности} sred: real; {среднее арифметическое} i, j: integer; {счетчики циклов} Begin writeln (' Случайные числа '); Randomize; {инициализация генератора случ. Чисел} for i: = 1 to N do Begin {генерируем последовательность} sum:=0; for j = 1 to L do Begin r:=Random (10) + 1; write (r: 3); sum:= sum+ r; end; sred:= sum/ L; writeln (' Сред. арифм..: ' sred:: 6: 2); end; writeln (' Для завершения работы программы нажмите <Enter> '); readln; End.
12. Написать программу, которая преобразует введенное пользователем десятичное число в двоичное. Рекомендуемый вид экрана во время работы программы приведен ниже.
Преобразование десятичного числа в двоичное. Введите целое число от 0 до 255 и нажмите <Enter> = 49 Десятичному числу 49 соответствует двоичное 00110001 Для завершения работы программы нажмите <Enter>.
Program DS_DV; Var dec: integer; {десятичное число} v: integer; {вес формируемого разряда} I: integer; {номер формируемого разряда} Begin writeln (' Преобразование десятичного числа в двоичное '); writeln (' Введите целое число от 0 до 255 и н нажмите ', <Enter> '); write (' = '); readin (dec); write (' Десятичному числу ', dec, ' соответствует двоичное '); v:=128; {вес старшего (восьмого) разряда} for i: = 1 to 8 do Begin if dec >= v then Begin write (' 1 '); dec:= dec- v; end; else write (' 0 '); v: = Round (v/2); {вес следующего разряда в два раза меньше} end; readln; End.
13. Напишите программу, которая вычисляет π с заданной пользователем точностью. Для этого воспользуетесь тем, что значение частичной суммы ряда 1-1/3+1/5-1/7+1/9-… при суммировании достаточно большего количества членов приближается к π/4. Рекомендуемый вид экрана во время работы программы приведен ниже. Задайте точность вычисления ПИ = 0.001. Значение числа ПИ с точностью 0.001000 равно 3.143589 Просуммировано 502 членов ряда.
Program VPI; Var p: real; {вычисляемое значение ПИ} t: real; {точность вычисления} n: integer; {номер члена ряда} elem: real; {значение члена ряда} Begin р:=0; n:=1; elem: = 1; {начальное значение} write (' Задайте точность вычисления ПИ = '); readln (t); writeln (' Вычисление ПИ с точностью ', t: 9: 6); while elem >= t do Begin elem: = 1/ (2*n-1); if (n MOD 2) = 0 then p:=р – elem else р: =р + elem n: = n+1; end; р: =р*4; writeln (' Значение ПИ с точностью ', t: 9: 6, ' равно', р: 9: 6); writeln (' Просуммировано ', n, ' членов ряда. '); readln; End.
14. Написать программу, которая вычисляет наибольший общий делитель двух целых чисел.
Program NOD; Var n1, n2: integer; {числа, НОД которых надо найти} nod: integer; {наибольший общий делитель} r: integer; {остаток от деления n1 на n2} Begin writeln (' Вычисление наибольшего общего делителя '); writeln (' для двух целых чисел. '); writeln (' Введите в одной строке два числа '); writeln (' и нажмите <Enter> '); write(' = '); readln; (n1, n2); while (n1 mod n2) <>0 do Begin r:= n1 mod n2; {остаток от деления} n1:=n2; n2:= r; end; nod:= n2; writeln (' НОД чисел ', n1, ' и ',n2, ' это ', nod); readln; End.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|