Решить задачи для циклов в паскаль
Решенные задачи Pascal: операторы цикла
Pascal операторы цикла — Repeat
Repeat 1: Даны положительные числа A и B (A>B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти количество отрезков B, размещенных на отрезке A.
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var a,b,temp,c:integer; flag: boolean; begin writeln(‘A=’); readln(a); writeln(‘B=’); readln(b); temp:=a; repeat temp:=temp-b; inc(c); until temp-b>=0; writeln(‘result: ‘,c); end. |
Pascal операторы цикла — While
While 1: Определите значение переменной P после выполнения следующего фрагмента программы:
1 2 3 4 5 | P:=1; i:=3; while i <= 9 do begin P := P * (i div 3); i := i + 1; end; |
Варианты:
1) 1
2) 3
3) 9
4) 24
Проверить:
While 2: Определите значение переменной S после выполнения следующего фрагмента программы:
1 2 3 4 5 | S:=0; i:=7; while i > 1 do begin S := S + i div 2; i := i – 1; end; |
Варианты:
1) S = 0
2) S = 7
3) S = 12
4) S = 24
Проверить:
While 3: Даны целые положительные числа N и K. Используя только операции сложения и вычитания, найти частное от деления нацело N на K, а также остаток от этого деления.
Решение данного задания смотрите в видео уроке по Паскалю:
While 4: Дано целое число N (> 0). С помощью операций деления нацело и взятия остатка от деления определить, имеется ли в записи числа N цифра «2». Если имеется, то вывести TRUE, если нет — вывести FALSE.
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var number:integer; flag: boolean; begin writeln(‘введите целое число (number>0) number=’); readln(number); flag:=false; while (number div 10)>0 do begin if (number mod 10) = 2 then flag:=true; number:=number div 10; end; writeln(flag); end. |
While 5:
Дано целое число N (>1). Найти наибольшее целое число K, при котором выполняется неравенство 3K<N
* Из задачника М. Э. Абрамян (While10)
Предлагаем посмотреть разбор задачи на видео:
While 6:
Дано число A (>1). Вывести наибольшее из целых чисел K, для которых сумма 1+1/2+…+1/K будет меньше A, и саму эту сумму
* Из задачника М. Э. Абрамян (While14)
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var Temp:Real; A,K :Integer; begin Write(‘Введите A: ‘); Readln(A); K:=0; Temp:=0; while Temp<=A do begin inc(K,1); Temp:=Temp+1/K; end; Writeln(K-1,’ ‘,Temp-1/K); end. |
While 7:
Дано целое число K и набор ненулевых целых чисел; признак его завершения — число . Вывести количество чисел в наборе, меньших K
* Из задачника М. Э. Абрамян (Series14)
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var i,R,K:Longint; begin write(‘Введите K : ‘); readln(K); R:=1; i:=0; while(R<>0) do begin write(‘Введите число из набора: ‘); Readln(R); if R<K then i:=i+1; end; i:=i-1; Writeln(i); readln; end. |
While 8:
Спортсмен-лыжник начал тренировки, пробежав в первый день 10 км. Каждый следующий день он увеличивал длину пробега на P процентов от пробега предыдущего дня (P — вещественное, 0<P<50). По данному P определить, после какого дня суммарный пробег лыжника за все дни превысит 200 км, и вывести найденное количество дней K (целое) и суммарный пробег S (вещественное число).
* Из задачника М. Э. Абрамян (While16)
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var P, S, D:Real; K :Integer; begin Write(‘Введите процент: ‘); Readln(P); K:=1; D:=10; S:=10; while S<=200 do begin inc(K,1); D:=D+D*P/100; S:=S+D; end; Writeln(K,’ ‘,S); end. |
Pascal операторы цикла — For
For 1: Дано вещественное число — цена 1 кг конфет. Вывести стоимость 0.1, 0.2, …, 1 кг конфет.
* Из задачника М. Э. Абрамян
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 | var c,m:real; i:integer; begin writeln(‘Цена?’); readln(c); m:=0.1; for i := 1 to 10 do begin writeln(‘ price of ‘,m, ‘ kg = ‘,c*m); m:=m+0.1; end; end. |
For 2: Даны два целых числа A и B ( A<B ). Вывести в порядке убывания все целые числа, расположенные между A и B (не включая числа A и B), а также количество N этих чисел.
* Из задачника М. Э. Абрамян
Проверить:
1 2 3 4 5 6 7 8 9 10 11 | var a, b, i: integer; begin writeln(‘A:’); readln(a); writeln(‘B:’); readln(b); for i:= b-1 downto a+1 do write(i:3 ); writeln; writeln(‘kolvo: ‘,b-a-1); end. |
For 3:
Дано целое число N>0. Найти сумму
* Из задачника М. Э. Абрамян (For11)
Проверить:
1 2 3 4 5 6 7 8 9 | var N, Rez,i :Integer; begin Write(‘Введите N: ‘); Readln(N); rez:=0; For i:=0 to N do Rez:=Rez+sqr(N+i); Writeln(Rez); end. |
Сейчас предлагаем решить сложную олимпиадную задачу на Паскале:
Пять делителей: Найти сумму всех чисел от 1 до заданного n, имеющих ровно пять делителей. Единица и само число входят в число его делителей
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | var c,n,s,k,i:integer; begin c:=0; s:=0; readln(n); for i:=2 to n do begin k:=i; while k>0 do begin if i mod k = 0 then c:=c+1; k:=k-1; end; if c= 5 then s:=s+i; c:=0; end; writeln(s); end. |
Источник
Простейшие алгоритмы
№1. Сумма вводимых целых чисел
var n := ReadInteger(‘Введите число слагаемых:’);
var s := 0.0;
for var i:=1 to n do
begin
var x := ReadReal($’Введите слагаемое №{i}:’);
s += x;
end;
Println($’Сумма равна {s}’);
end.
В алгоритме используются интерполированные строки вида $’Сумма равна {s}’.
Они начинаются с $. Выражение в фигурных скобках, расположенное в такой строке, заменяется на его значение.
№2. Произведение целых чисел
var n := ReadInteger(‘Введите число множителей: ‘);
var p := 1.0;
for var i:=1 to n do
begin
var x := ReadReal(‘Введите множитель: ‘);
p *= x;
end;
Println($’Произведение равно {p}’);
end.
№3. Двойной факториал n!!=n*(n-2)*(n-4)*…*2 (или 1)
var x := ReadInteger(‘Введите x: ‘);
var p := 1;
while x>=2 do
begin
p *= x;
x -= 2;
end;
Println($’Двойной факториал равен {p}’);
end.
№4. Сколько нечетных среди n введенных
var n := ReadInteger(‘Введите n: ‘);
var c := 0;
for var i:=1 to n do
begin
var x := ReadInteger(‘Введите целое число: ‘);
if x mod 2 <> 0 then
c += 1;
end;
println($’Количество нечетных равно {c}’);
end.
№5. Защита от неверного ввода
var x: real;
repeat
x := ReadReal(‘Введите x>0: ‘);
if x<=0 then
Println(‘Неверный ввод’);
until x>0;
end.
№6. Табулирование функции f(x) на отрезке в точках, разбивающих отрезок на N частей
Дан отрезок [a,b]
begin
var N := ReadInteger(‘Введите N: ‘);
Assert(N>0);
var (a,b) := ReadReal2(‘Введите a и b: ‘);
var h := (b-a)/N;
var x := a;
loop N+1 do
begin
Writeln(x:5:2,f(x):10:4);
x += h;
end;
end.
№6a. Решение, использующее while. Погрешность округления и вычислительная погрешность
begin
var N:=ReadInteger(‘Введите N: ‘);
Assert(N>0);
var (a,b):=ReadReal2(‘Введите a и b: ‘);
var h := (b-a)/N;
var x := a;
while x <= b+h/2 do
begin
writeln(x:5:2,f(x):10:4);
x += h;
end;
end.
Рекуррентные соотношения
№7. Вывод 10 первых степеней двойки
var x := 2;
for var i := 1 to 10 do
begin
writeln(i:2,x:5);
x *= 2;
end;
end.
№8. Вывод всех двухзначных чисел, кратных 5
var x := 10;
while x < 100 do
begin
writeln(x:3);
x += 5;
end;
end.
№9. Вывод n первых чисел Фибоначчи
var n := ReadInteger(‘Введите целое число n (n > 1): ‘);
Assert(n>1);
var (a,b) := (1,1);
Print(a,b);
loop n-2 do
begin
(a,b):=(b,a+b);
Print(b);
end;
end.
В алгоритме используются кортежи. В момент переприсваивания в цикле создаются буферные переменные, что позволяет нам избежать их объявления вручную.
№10. Найти НОД(A,B), используя алгоритм Евклида:
НОД(A,B) = НОД(B,A mod B); НОД(A,0) = A
var (a,b):=ReadInteger2(‘Введите целые числа A и B: ‘);
while b<>0 do
(A,B):=(B,A mod B);
println($’НОД(A,B) = {A}’);
end.
№11. Найти сумму цифр целого числа m
var m := ReadInteger(‘Введите целое число m: ‘);
var (s,m1) := (0,abs(m));
while m1 > 0 do
begin
s += m1 mod 10;
m1 := m1 div 10;
end;
println($’Сумма цифр числа {m} равна {s}’);
end.
Для работы с отрицательными числами в алгоритме используется стандартная функция abs(x) возвращающая модуль от x.
Максимумы и минимумы
№12. Найти max из введенных чисел
var n := ReadInteger(‘Введите целое число n (n>0): ‘);
assert(n>0);
var x := ReadReal(‘Введите 1 число: ‘);
var max := x;
for var i := 2 to n do
begin
x := ReadReal($’Введите {i} число: ‘);
if max < x then
max := x;
end;
Println($’Максимальное из введенных чисел: {max}’);
end.
№12a. Найти min, удовлетворяющее условию p(x)
function p(x: real): boolean:=x > 0;
begin
var n := ReadInteger(‘Введите целое число n (n>0): ‘);
assert(n>0);
var min := real.MaxValue;
for var i := 1 to n do
begin
var x := ReadReal($’Введите {i} число: ‘);
if (x < min) and p(x) then
min := x;
end;
if min = real.MaxValue then
println(‘Нет чисел, удовлетворяющих условию’)
else println($’Минимальное из введенных чисел, удовлетворяющее условию: {min}’);
end.
Суммирование рядов (конечных и бесконечных)
№13. Вычислить Σ(i=1..n) a^i/i!
var a:=ReadReal(‘Введите a: ‘);
var n:=ReadInteger(‘Введите n (n>0): ‘);
assert(n>0);
var x := a;
var s := x;
for var i := 2 to n do
begin
x *= a / i;
s += x;
end;
Println($’Сумма = {s}’);
end.
№13a. Вычислить Σ(i=1..∞) (-1)^i * a^i/i!
var a:=ReadReal(‘Введите a (0 < a < 1): ‘);
assert((a>0) and (a<1));
var eps := 0.0001;
var i := 1;
var s := 0.0;
var y := -a;
repeat
s += y / i;
i += 1;
y *= -a;
until abs(y/i) < eps;
Println($’Сумма = {s}’);
end.
Поиск значения
№14. Есть ли среди введенных число k?
begin
write(‘Введите целые числа n (n>0) и k: ‘);
readln(n,k);
assert(n>0);
var Exists := false;
for var i := 1 to n do
begin
write(‘Введите ‘, i, ‘ целое число: ‘);
var x := ReadInteger;
if x = k then
begin
Exists := true;
break;
end;
end;
if Exists then
writeln(‘Число ‘, k, ‘ было введено’)
else writeln(‘Число ‘, k, ‘ не было введено’);
end.
№14b. Есть ли среди введенных число k? (то же с использованием while)
begin
write(‘Введите целые числа n (n>0) и k: ‘);
readln(n,k);
assert(n>0);
var Exists := false;
var i := 1;
while (i <= n) and not Exists do
begin
write(‘Введите ‘, i, ‘ целое число: ‘);
var x := ReadInteger;
i += 1;
if x = k then
Exists := true;
end;
if Exists then
writeln(‘Число ‘, k, ‘ было введено’)
else writeln(‘Число ‘, k, ‘ не было введено’);
end.
№15. Является ли число N>1 простым?
write(‘Введите целое число N (N>1): ‘);
var N := ReadInteger;
assert(N>1);
var IsPrime := True;
for var i := 2 to round(sqrt(N)) do
if N mod i = 0 then
begin
IsPrime := False;
break;
end;
if IsPrime then
writeln(‘Число ‘, N, ‘ является простым’)
else writeln(‘Число ‘, N, ‘ является составным’);
end.
Другие алгоритмы
№16. Разложение числа на простые множители
var x := ReadInteger(‘Введите целое число x (x>1): ‘);
assert(x>1);
var i := 2;
write(x, ‘ = 1’);
repeat
if x mod i = 0 then
begin
Print(‘*’, i);
x := x div i;
end
else i += 1;
until x = 1;
end.
№17. Вычисление значения многочлена в точке x по схеме Горнера
x,a: real;
n: integer;
begin
write(‘Введите x: ‘);
readln(x);
write(‘Введите степень многочлена n (n>0): ‘);
readln(n);
assert(n>=0);
write(‘Введите коэффициенты: ‘);
readln(a);
var s := a;
for var i := 1 to n do
begin
write(‘Введите a_{‘, i+1,’}: ‘);
readln(a);
s := s*x + a;
end;
writeln(‘Значение многочлена p(x) = a_{1}*x^n + a_{2}*x^(n-1) + … + a_{n}*x + a_{n+1} в точке x = ‘, x, ‘ равно ‘, s);
end.
№18. Дана непрерывная на отрезке функция f(x), имеющая на отрезке ровно один корень. Найти его методом половинного деления
Дан отрезок [a,b] (f(a)*f(b)<=0)
const eps = 0.0001;
const f = sin;
var a,b: real;
begin
write(‘Введите числа a и b (a<b): ‘);
readln(a,b);
assert(a<b);
var fa := f(a);
var fb := f(b);
assert(fb*fa<0);
while (b-a) > eps do
begin
var x := (b+a)/2;
var fx := f(x);
if fa*fx <= 0 then
b := x;
else
begin
a := x;
fa := fx;
end;
end;
writeln(‘Корень функции на [a,b] равен ‘,(b+a)/2);
end.
© Буцев Виктор, Белоусько Тихон, Зуев Семен, Гончаров Владислав, Батраков Михаил, Гаджиев Казанфар, Пак Владислав
Источник
МОУ Селятинская средняя общеобразовательная школа №2
Наро – Фоминский район Московской области
«Циклы в Turbo Pascal. Решение задач на циклы.»
Проверил: Кащей Владимир Васильевич
Выполнил: слушатель курсов «Методика преподавания
алгоритмизации и программирования в
средней школе» учитель информатики
Высоцкая О.Е.
2011 г.
В программах, связанных с обработкой данных или вычислениями, часто выполняются циклически повторяющиеся действия.
Цикл представляет собой последовательность операторов, которая выполняется неоднократно. В языке Turbo Pascal различают три вида операторов цикла: цикл с предусловием (while), цикл с постусловием (repeat) и цикл с параметром (for).
Следует знать:
- подавляющее большинство задач с циклами можно решить разными способами, используя при этом любой из трех операторов цикла;
- часто решения, использующие разные операторы цикла, оказываются равноценными;
- в некоторых случаях все же предпочтительнее использовать какой-то один из операторов;
- самым универсальным из всех операторов цикла считается while, поэтому в случае затруднений с выбором можно отдать предпочтение ему;
- цикл repeat имеет очень простой и понятный синтаксис, поэтому с него удобно начинать изучение циклов;
- цикл for обеспечивает удобную запись циклов с заранее известным числом повторений;
- при неумелом использовании циклов любого типа возможна ситуация, когда компьютер не сможет нормально закончить цикл. При работе в среде Turbo Pascal для выхода из подобной ситуации используется комбинация клавиш +.
- если это не помогает, есть и крайнее средство – ++. Одновременное нажатие этих трех клавиш или кнопки Reset, расположенной на системном блоке, позволяет перезагрузить компьютер, при этом данные, относящиеся к работающей программе, будут утеряны.
- процедура continue позволяет прервать выполнение тела любого цикла и передает управление на его заголовок, заставляя цикл немедленно перейти
к следующему выполнению.
Циклы с параметром
Если число требуемых повторений заранее известно, то используется оператор, называемый оператором цикла с параметром или циклом со счетчиком.
*цикл по от до
** действие
* конец цикла
Оператор цикла с параметром имеет два варианта записи:
1) вариант с увеличением счетчика
for := to do
2) вариант с уменьшением счетчика
for := downto do
Счетчик – параметр цикла, простая переменная целого типа; – операторы или оператор. Цикл повторяется до тех пор пока значение параметра лежит в интервале между начальным и конечным значениями. В первом варианте при каждом повторении цикла значение параметра увеличивается на 1, во втором – уменьшается на 1.
При первом обращении к оператору for вначале определяются начальное и конечное значения, и присваивается параметру цикла начальное значение. После этого циклически повторяются следующие действия.
1. Проверяется условие: параметр цикла
2. Если условие выполняется, то оператор продолжает работу (выполняется оператор в теле цикла), если условие не выполняется, то оператор завершает работу и управление в программе передается на оператор, следующий за циклом.
3. Значение параметра изменяется (увеличивается на 1 или уменьшается на 1).
Если в теле цикла располагается более одного оператора, то они заключаются в операторные скобки begin … end;
Следует знать:
- оператор For используется для организации циклов с фиксированным, заранее известным числом повторений;
- количество повторений цикла определяется начальным и конечным значениями переменной-счетчика. Оператор For обеспечивает выполнение тела цикла до тех пор, пока не будут перебраны все значения параметра цикла: от начального до конечного;
- переменная счетчик должна быть порядкового типа: чаще integer, реже – char, boolean. Использование вещественного типа недопустимо;
- начальное и конечное значения параметра цикла могут быть константами, переменными, выражениями и должны принадлежать к одному и тому же типу данных. Начальное и конечное значение параметра цикла нельзя изменять во время выполнения цикла;
- параметр цикла For может изменяться (увеличиваться или уменьшаться) каждый раз при выполнении тела цикла только на единицу. Если нужен другой шаг, предпочтительнее использовать циклы с предусловием или с постусловием.
Задача 1. Вывести на экран натуральные числа от 1 до 9 в обратном порядке.
Program z1;
Var i:integer;
Begin
For i:=9 downto 1 do
Writeln(i);
End.
Задача 2.
Вычисление р = n! (n факториал).
program z2;
var p, i, n: integer;
begin
write (‘введите целое n = ‘);
readln (n);
p: = 1;
for i: = 1 to n do
p: = p * i;
write (n, ‘! = ‘,p);
readln
end.
Задача 3.
Составить программу вычисления значения выражения y=1+1/2+1/3+… +1/20.
{В данном случае целесообразно организовать цикл с параметром, изменяющимся от 1 до 20, то есть шаг изменения параметра равен +1. Обозначим: у – очередное значение суммы дробей; n – параметр цикла. Учитывая это, составим программу: }
program z3;
uses crt;
var n: integer;
y: real;
begin
clrscr;
{Задаем начальное значение, равное нулю.}
y:=0;
{Организовываем цикл с параметром от 1 до 20.}
for n:=1 to 20 do
begin
{Находим очередную сумму.}
y:=y+1/n;
{Выводим на экран очередную сумму.}
writeln(‘y=’,y);
end.;
end.
Задача 4.
Из чисел от 10 до 99 вывести те, сумма цифр которых равна S(0
{Обозначим: k – это просматриваемое число; p1 – это первая цифра числа k, р2 – это вторая цифра числа k; s – это сумма цифр данного числа k. Число k будем выписывать только в том случае, когда сумма p1 и р2 будет равна s.}
program z4;
uses crt;
var k,n,p1,p2,s:integer;
begin
clrscr; writeln(‘ целое число n=’); {Задаем целое число.}
readln(n);
for k:=10 to 99 do {Организовываем цикл с параметром от 10 до 99.}
begin
p1:=k div 10; {Выделяем первую цифру.}
р2:=к mod 10; {Выделяем вторую цифру.}
s:=p1+p2; {Находим сумму цифр.}
if s=n then writeln(‘k= ‘,k);{Если сумма цифр равна заданному числу N, то выводим К.}
end;
end.
Задача 5.
Дано натуральное число n (1000
{Обозначим: n – вводимое число; m – дубликат числа n; а – перевертыш числа n; i – переменная цикла для создания перевертыша.}
program z5;
uses crt;
var n, m, a, i: integer;
begin
clrscr;
{Введем четырехзначное целое число.}
writeln(‘N{Запоминаем введенное целое число и задаем начальное значение перевертыша.}
m:=n;а:=0;
{Организуем цикл с параметром от 1 до 4.}
for i:=l to 4 do
{Находим перевертыш числа N}
begin
а:=а*10+ m mod 10; m:= m div 10;
end;
{Если A=N, то данное число является перевертышем.}
if a=n then writeln(‘DA!’)
else writeln(‘NO’);
readln;
end.
Оператор цикла с предусловием
Если число повторений заранее неизвестно, а задано лишь условие его повторения (или окончания), то используются операторы while и repeat. Оператор While часто называют оператором цикла с предусловием. Так как проверка условия выполнения цикла производится в самом начале оператора.
*цикл пока
**
* конец цикла
Общий вид: While do
;
Тело цикла – простой или составной оператор или операторы. Если операторов в теле цикла несколько, то тело цикла заключается в операторные скобки begin…end. Ключевые слова While и do означают соответственно “пока” и “выполнять”. Когда программа в процессе выполнения впервые достигает оператора while, осуществляется проверка истинности условия. Если условие истинно, то выполняется тело цикла (оператор). После этого происходит возврат к началу фрагмента while do, где проверка условия осуществляется вновь. Цикл будет выполняться до тех пор, пока логическое выражение будет истинным. Как только логическое выражение станет ложным, управление передается следующему за циклом оператору. Если при первом выполнении цикла значение логического оператора будет “ложь”, то цикл не станет выполняться, а управление сразу же передается следующему за while оператору.
Следует знать:
- число повторений операторов цикла while определяется в ходе работы программы и, как правило неизвестно;
- после слова while записывается условие продолжения выполнения инструкций цикла;
- условие – это выражение логического типа: простое выражение отношения или сложное выражение отношения, которое может принимать одно из двух значений: true или false;
- для успешного завершения цикла while в его теле обязательно должны присутствовать инструкции, оказывающие влияние на условие выпонения инструкций цикла.
Задача 1. Найти сумму 10 произвольных чисел.
Program z1;
Const
N=10;
Var k, x, s: integer;
Begin
k:=0; s:=0; {k- количество введенных чисел}
while k
begin
k:=k+1;
write(‘Введите число’);
readln(x);
s:=s+x;
end;
writeln(‘Сумма чисел равна’, s);
end.
Задача 2.
Дано натуральное число n. Посчитать количество цифр в числе. {Подсчет количества цифр начнем с последней цифры числа. Увеличим счетчик цифр на единицу. Число уменьшим в 10 раз (тем самым мы избавляемся от последней цифры числа). Далее с получившимся числом проделаем ту же последовательность действий и т. д., пока число не станет равным нулю. Примечание: в теле цикла обязательно должен быть оператор, влияющий на соблюдение условия, в противном случае произойдет зацикливание.}
program z2;
uses crt;
var m, n: longint;
k: integer; {счетчик цифр}
begin
clrscr;
{Вводим целое число.}
writeln(‘Введите N=’); readln(n);
{Запоминаем его и счетчику цифр присваиваем начальное значение.}
m:=n;k:=0;
{Пока m0 делать цикл.}
while m 0 do
begin
{“Уменьшаем” число на последнюю цифру, т. е. в 10 раз.}
k:=k+1; m:= m div 10; {Inc(k) }
end;
{Вывод количества цифр.}
writeln(‘B числе ‘,n,’- ‘,k, ‘ цифр!’);
readln;
end.
Задача 3.
Вычислить наибольший общий делитель двух натуральных чисел А и В.
program z3;
var a, b: integer;
begin
write (‘введите два натуральных числа’);
readln (a, b);
while ab do
if a>b then a: = a – b
else b: = b – a;
write (‘НОД = ‘, a);
readln;
end.
Задача 4.
Составление таблицы значений функции у = sin х отрезке [0;3.14] с шагом 0,1.
program z4;
var х, у: real;
begin
х: = 0;
writeln (‘x’ : 10,’sinx’ : 10);
while x begin
y: = sin(x);
writeln (x : 10,’ ‘ ,y : 7 : 5);
x: = x + 0.1
end;
readln
end.
Задача 5.
Приближенное вычисление суммы бесконечно убывающего ряда 1+x/1!+x2/2!+x3/3!+ …
Program z5;
var
Eps:real; { Заданное число “эпсилон” }
X: real; { Основание степени в числителе дроби }
S: real; { В этой переменной будем накапливать сумму }
Y; real; { Для хранения очередного слагаемого }
i: integer; { Счетчик числа шагов }
begin
write(‘Введите X и Epsilon:’);
readln(X, Eps);
Y:=l; { Первое слагаемое }
S:=Y; { Положим в сумматор первое слагаемое }
i:=0; { Обнулим счетчик шагов }
while abs(Y)>=Eps do { Пока добавленное слагаемое не меньше “эпсилон”, считаем сумму. Если “эпсилон” сразу не меньше 1, цикл не выполнится ни разу! }
begin { Началось тело цикла }
i:=i+l; { Вычислили номер текущего шага }
Y:=Y*X/i; { Посчитали новое слагаемое }
S:=S+Y { Увеличили сумму на текущее слагаемое }
end; { Тело цикла завершилось. После этой строки компьютер перейдет на оператор while для сравнения переменной “эпсилон” с только что добавленным слагаемым }
{ Теперь выведем результат на экран }
Writeln(‘Сумма чисел=’, S:6:4); readln
end.
Циклы с потусловием
Оператор цикла repeat аналогичен оператору while, но отличается от него, во-первых, тем, что условие проверяется после очередного выполнения операторов тела цикла и таким образом гарантируется хотя бы однократное выполнение цикла. Во-вторых, тем, что критерием прекращения цикла является равенство выражения константе true . За это данный оператор часто называют циклом с постусловием, так как он прекращает выполняться, как только условие, записанное после слова until, выполнится. Оператор цикла repeat состоит из заголовка, тела и условия окончания.
*цикл с постусловием
**
* конец цикла, если
Общий вид: Repeat
. . . . .
until
Вначале выполняется тело цикла, затем проверяется условие выхода из цикла. В любом случае этот цикл выполняется хотя бы один раз. Если условие не выполняется, т.е. результатом выражения является False, то цикл активизируется еще раз. Если условие выполнено, то происходит выход из цикла. Использования операторных скобок, в случае, если тело цикла состоит из нескольких операторов, не требуется.
Следует знать:
- число повторений операторов цикла repeat определяется в ходе работы программы и, как правило неизвестно;
- инструкции цикла repeat будут выполняться, пока условие, стоящее после until, будет оставаться ложным;
- после слова until записывается условие завершения цикла;
- условие – это выражение логического типа: простое выражение отношения или сложное выражение отношения, которое может принимать одно из двух значений: true или false;
- для успешного завершения цикла repeat в его теле обязательно должны быть инструкции, выполнение которых влияет на условие завершения цикла, иначе цикл будет выполняться бесконечно – программа зациклится. Другими словами, переменная, которая участвует в условии выхода из цикла, обязательно должна изменяться в теле цикла.
Задача 1. Составить программу, которая вводит и суммирует целые числа. Если введено значение 999, то на экран выводится результат суммирования.
Program z1;
Var x, s:integer;
Begin
S:=0;
Repeat
Write(‘Ввести число’);
Readln(x);
If x999 then s:=s+x;
Until x=999;
Writeln(‘Сумма введенных чисел’, s); End.
Задача 2.
Использование цикла repeat для подсчета суммы вводимых чисел до первого отрицательного числа
Program z2;
var
sum, a: real; {sum – для накопления суммы, a – для очередного числа}
begin
sum:=0; {Обнуляем сумму}
a:=0;
repeat
sum:=sum+a; {Добавляем введенное число к сумме}
write(‘Введите число’); {Ввод очередного числа}
readln(a)
until a Проверяем введенное число на отрицательность}
{При выходе из цикла выполняется этот оператор:}
writeln (”,sum:5:3);
readln
end.
Задача 3.
Составить программу планирования закупки товара в магазине на сумму, не превышающую заданную величину.
{Обозначим через x, k – соответствующую цену и количество товара, через p – заданную предельную сумму, через s – общую стоимость покупки. Начальное значение общей стоимости покупки (s) равно нулю. Значение предельной суммы считывается с клавиатуры. Необходимо повторять запрос цены и количества выбранного товара, вычислять его стоимость, суммировать ее с общей стоимостью и выводить результат на экран до тех пор, пока она не превысит предельную сумму р. В этом случае на экран нужно вывести сообщение о превышении: }
program z3;
uses crt;
var c, k, p, s: integer;
begin
clrscr;
{Вводим наличие денежных средств.}
writeln(‘Пред. сумма – ‘);
readln(p);
{Начальное значение стоимости покупки равно нулю.}
s:=0;
repeat
{Вводим цену товара и его количество.}
writeln(‘цена тов. и его кол ‘);
readln (с, k);
{Находим стоимость приобретенных товаров.}
s:=s+c*k;
{Выводим на экран стоимость приобретенных товаров.}
writeln(‘Стоимость покупки = ‘, s);
{Повторяем до тех пор, пока стоимость товара не превысит наличия денежных средств.}
until s>p
writeln(‘Суммарная стоимость покупки превысила предельную сумму’);
readln;
end.
Задача 4.
Написать программу нахождения наибольшего общего делителя (НОД) двух натуральных чисел.
program z4;
uses crt;
var x, y: integer;
begin
clrscr;
{Вводим два целых неотрицательных числа.}
writeln(‘x:=,y: = ‘);readln(x,y);
repeat
if x>y then x:=x mod у else y:=y mod x;
{До тех пор, пока одно из чисел не станет равно нулю.}
until (x=0) Or (y=0);
{Вывод НОД – без условного оператора, так как одно из чисел равно нулю.}
writeln(‘HOД=’,x+y));
readln;
end.
Вложенные циклы
В теле любого оператора цикла могут находиться другие операторы цикла. При этом цикл, содержащий в себе другой, называют внешним, а цикл, находящийся в теле первого – внутренним (вложенным). Правила организации внешнего и внутреннего циклов такие же, как и для простого цикла.
При программировании вложенных циклов необходимо соблюдать дополнительное условие: все операторы внутреннего цикла должны полностью располагаться в теле внешнего цикла.
Задача 1.
Даны натуральные числа n и k. Составить программу вычисления выражения lk+2k+…+nk.
{Для вычисления указанной суммы целесообразно организовать цикл с параметром i, в котором, во-первых, вычислялось бы очередное значение y=ik и, во-вторых, осуществлялось бы накопление суммы прибавлением полученного слагаемого к сумме всех предшествующих (s= s+y).}
program z1;
uses crt;
var n, к, y, i, s, m: integer;
begin
clrscr;
writeln (‘n= k=’); readln(n, k);
s:=0;
for i:=l to n do
begin
у:=1;
for m:=l to к do
begin
{
Нахождение степени k числа i.}
y: = y*i;
end;
{Нахождение промежуточной суммы.}
s:=s+y;
end;
writeln(‘ Ответ: ‘,s);
readln;
end.
Задача 2.
Вычислить сумму 11+22+…+nn.
program z2;
uses crt;
var n, к, y, i, s, m: integer;
begin
clrscr;
writeln (‘n= k=’); readln(n, k);
s:=0;
for i:=l to n do
begin
у:=1;
for m:=l to i do
begin
{Нахождение степени k числа i.}
y: = y*i;
end;
{Нахождение промежуточной суммы.}
s:=s+y;
end;
writeln(‘ Ответ: ‘,s);
readln;
end.
Задача 3.
Написать программу, которая находит и выводит на печать все четырехзначные abcd, числа а, b, с, d – различные цифры, для которых выполняется: ab-cd=a+b+c+d.
{Задачу можно решать несколькими способами. Одним из возможных способов является перебор всех четырехзначных чисел и проверка для каждого из них выполнения условий. Попробуем сократить перебор, для этого преобразуем второе условие:
10а+b-(10c+d)=a+b+c+d;
9(a-c)=2(c+d);
(a-c)/(c+d)=2/9
Проанализировав первое условие, получаем, что а=с+2, d=9-c, следовательно 0program z3;
uses crt;
var a,b,c,d: integer;
begin
clrscr;
for c:=0 to 7 do
begin
a:=c+2; d;=9-c;
for b:=0 to 9 do
begin
if (bc)and(ba)and(bd)
then
write(a,b,c,d);
writeln
end;
end;
readln;
end.Задача 4.
Если мы сложим все цифры какого-либо числа, затем все цифры найденной суммы и будем повторять много раз, мы, наконец, получим однозначное число (цифру), называемое цифровым корнем данного числа. Например, цифровой корень числа 34697 равен 2 (3+4+6+9+7=29; 2+9=11; 1 + 1=2). Составим программу для нахождения цифрового корня натурального числа.
program z4;
uses crt;
var n, k, s: longint;
begin
clrscr;
writeln(‘ число=’); readln(n);
s:=n;
{Пока сумма является двузначным числом.}
while s>9 do
begin
k:=s;s:=0;
{Вычисляем сумму цифр числа.}
repeat
S:=s+k mod 10; k:=k div 10;
until k=0;
end;
writeln(‘ цифр. корень числа ‘,n, ‘ равен ‘,s);
readln;
end.
Список используемой литературы
- Г.Г. Рапаков, С.Ю. Ржеуцкая “Turbo Pascal для студентов и школьников“, Санкт-Петербург, «БХВ-Петербург», 2011г.
- А.И. Гусева “ Учимся программировать: Pascal 7.0”, Москва, «Диалог-МИФИ», 2011г.
- С.В. Вольский, П.А. Дмитриев “Turbo Pascal 7.0 для студентов и школьников“, Санкт-Петербург, «Наука и Техника», 2007г.
- Д.М. Ушаков, Т.А. Юркова “Паскаль для школьников”, Москва-Санкт-Петербург, «ПИТЕР», 2008г.
- Е.Р. Алексеев “Турбо Паскаль 7.0”, Москва, NT Press, 2006г.
Источник