Вычисление последовательностей с использованием цикла с заголовком

PASCAL
ЛАБОРАТОРНАЯ РАБОТА N5.
Тема: Вложенные циклы.
Вычисление последовательностей.
Цель работы: Изучение операторов языка PASCAL, реализующих циклы.
Задание и порядок выполнения лабораторной работы
По
лабораторной работе необходимо выполнить два задания:
- По
первому заданию составить алгоритм и программу вложенных циклов с параметром,
при этом один из циклов (внешний или внутренний) реализовать оператором FOR, а другой WHILE или REPEAT. - По
второму заданию составить алгоритм и программу вычисления
последовательностей.
По каждому
заданию необходимо:
·
Проанализировать
задание, установить, какие величины являются входными параметрами, какие
выходными.
·
Составить
таблицу соответствия для переменных.
·
Составить
блок схему алгоритма.
·
По
разработанному алгоритму составить программу на языке PASCAL.
·
В
редакторе среды BORLAND-PASCAL ввести программу и
отредактировать ее.
·
Осуществить
компиляцию и отладку программы.
·
Получить
листинг программы и результаты ее работы.
·
Оформить
отчет по работе и ответить на контрольные вопросы.
Порядок решения задачи
вложенных циклов
Составить программу для вычисления значения функции F(x,y) на отрезке [xn, xk] с шагом Dx и [yn, yk] с шагом Dy. Результат представить в виде таблицы, первый столбец которой –
значения аргумента x, второй
столбец – значения аргумента y, третий столбец – соответствующие значения функции.
при 0o £ х £ 135o и Dх=45o , -30o £ y £ 30o и Dy=10o.
В данной задаче необходимо вычислить
значения функции F(x,y) при одновременном изменении аргументов x и y. Порядок изменения аргументов x и y в
данной задаче является независимым, поэтому не имеет значения по какому
переменной цикл будет внешним, а по какой внутренним. Рассмотрим
алгоритмическую и программную реализацию задачи с внешним циклом по переменной x и оператором FOR, а внутренний цикл по переменной y с оператором WHILE.
Для использования
оператора FOR
необходимо определим число повторений Nx по переменной х, изменяющейся с шагом Dх:
.
Таблица соответствия переменных:
Так как
переменная x задана в градусах, а аргумент
тригонометрических функций языка BORLAND-PASCAL должен быть в радианах,
необходимо преобразовать градусы в радианы и ввести дополнительную переменную rg –
переводной множитель:
.
Имя математической переменной | F(x) | x | xn | xk | Dх | y | yn | yk | Dy | i | Nx | rg |
Переменная языка BORLAND -PASCAL | F | x | xn | xk | dx | y | yn | yk | dy | i | Nx | rg |
Тип переменной | R | R | R | R | R | R | R | R | R | I | I | R |
Составление
алгоритма
Составление
программы
Для печати значений
аргумента как целых чисел задается формат х:2:0, в котором разряды за
десятичной точкой отсутствуют.После компиляции и отладки программу
необходимо запустить на выполнение, полученную таблицу значений функции
поместить в отчет.
Вычисление
последовательностей
Пример 1
Для заданного вещественного x и малой величины e вычислить сумму ряда: ,
Включив в нее только слагаемые, превышающие e. Последовательность
выражается формулой:
Таблица соответствия
Имя математической | x | ai | S | e | i |
Переменная языка BORLAND PASCAL | x | a | S | Eps | i |
Тип переменной | R | R | R | R | Int |
Алгоритм задачи
Составление
программы
Пример 2
Вывести на экран первые n (n>2) чисел Фибоначчи.
Подсчитать сколько среди них четных чисел.
Последовательность чисел
Фибоначчи:
1, 1, 2, 3, 5, 8, 13, 21,
34, 55, …,
выражается формулой:
Таблица соответствия
При вычислении рекуррентной
последовательности с глубиной 2 уже нельзя обойтись одной переменной.
Понадобится три переменные, поскольку для нахождения очередного элемента
необходимо помнить значения двух предыдущих.
Имя математической | ai | ai-1 | ai-2 | k | i | N |
Переменная языка BORLAND PASCAL | F | F1 | F2 | k | i | N |
Тип переменной | R | R | R | I | I | R |
Составление
алгоритма
Составление
программы
После компиляции и отладки программу необходимо запустить на
выполнение.
Пример 3
Вычислить N-ый элемент арифметической
прогрессии.
Таблица соответствия
Имя математической | Ai | N | i |
Переменная языка BORLAND PASCAL | A | N | i |
Тип переменной | I | I | I |
Составлениеалгоритма
Программу можно написать с
использованием оператора цикла по параметру FOR, т.к. число повторений задается в переменной N.
Составление
программы
После компиляции и отладки программу необходимо запустить на
выполнение.
Пример 4
Для последовательности y0, y1,…yi, образованной по закону:
y0 = x;
¼
Источник
Обновл. 15 Сен 2020 |
Безусловно, наиболее используемым циклом в языке C++ является цикл for.
Цикл for
Цикл for в языке С++ идеален, когда известно необходимое количество итераций. Выглядит он следующим образом:
for (объявление переменных; условие; инкремент/декремент счетчика)
тело цикла;
Или, преобразуя for в эквивалентный цикл while:
{ // обратите внимание, цикл находится в блоке
объявление переменных;
while (условие)
{
тело цикла;
инкремент/декремент счетчика;
}
} // переменные, объявленные внутри цикла, выходят из области видимости здесь
Переменные, определенные внутри цикла for, имеют специальный тип области видимости: область видимости цикла. Такие переменные существуют только внутри цикла и недоступны за его пределами.
Выполнение цикла for
Цикл for в C++ выполняется в 3 шага:
Шаг №1: Объявление переменных. Как правило, здесь выполняется определение и инициализация счетчиков цикла, а точнее — одного счетчика цикла. Эта часть выполняется только один раз, когда цикл выполняется впервые.
Шаг №2: Условие. Если оно равно false, то цикл немедленно завершает свое выполнение. Если же условие равно true, то выполняется тело цикла.
Шаг №3: Инкремент/декремент счетчика цикла. Переменная увеличивается или уменьшается на единицу. После этого цикл возвращается к шагу №2.
Рассмотрим пример цикла for и разберемся детально, как он работает:
#include <iostream> int main() { for (int count = 0; count < 10; ++count) std::cout << count << ” “; return 0; } |
Сначала мы объявляем переменную count и присваиваем ей значение 0. Далее проверяется условие count < 10, а так как count равен 0, то условие 0 < 10 имеет значение true. Следовательно, выполняется тело цикла, в котором мы выводим в консоль переменную count (т.е. значение 0).
Затем выполняется выражение ++count, т.е. инкремент переменной. Затем цикл снова возвращается к проверке условия. Условие 1 < 10 имеет значение true, поэтому тело цикла выполняется опять. Выводится 1, а переменная count увеличивается уже до значения 2. Условие 2 < 10 является истинным, поэтому выводится 2, а count увеличивается до 3 и так далее.
В конце концов, count увеличивается до 10, а условие 10 < 10 является ложным, и цикл завершается. Следовательно, результат выполнения программы:
0 1 2 3 4 5 6 7 8 9
Циклы for могут быть несколько сложны для новичков, однако опытные кодеры любят их, так как эти циклы очень компактны и удобны. Для наглядности, давайте преобразуем цикл for, приведенный выше, в эквивалентный цикл while:
#include <iostream> int main() { { // внешние скобки нужны для обеспечения области видимости цикла int count = 0; while (count < 10) { std::cout << count << ” “; ++count; } } return 0; } |
Обратите внимание, внешние фигурные скобки здесь необходимы, так как переменная count выходит из области видимости при завершении цикла.
Еще примеры циклов for
Давайте, используя цикл for, напишем функцию вычисления значений в степени n:
int pow(int base, int exponent) { int total = 1; for (int count=0; count < exponent; ++count) total *= base; return total; } |
Функция возвращает значение base^exponent (число в степени n). base — это число, которое нужно возвести в степень, а exponent — это степень, в которую нужно возвести base.
Если экспонент равен 0, то цикл for выполняется 0 раз, и функция возвращает 1.
Если экспонент равен 1, то цикл for выполняется 1 раз, и функция возвращает 1 * base.
Если экспонент равен 2, то цикл for выполняется 2 раза, и функция возвращает 1 * base * base.
Хотя в большинстве циклов используется инкремент счетчика, мы также можем использовать и декремент счетчика:
#include <iostream> int main() { for (int count = 8; count >= 0; –count) std::cout << count << ” “; return 0; } |
Результат:
8 7 6 5 4 3 2 1 0
Также с каждой новой итерацией мы можем увеличить или уменьшить значение счетчика больше, чем на единицу:
#include <iostream> int main() { for (int count = 9; count >= 0; count -= 2) std::cout << count << ” “; return 0; } |
Результат:
9 7 5 3 1
Ошибка неучтенной единицы
Одна из самых больших проблем с которой приходится сталкиваться начинающим программистам в циклах for (а также и в других типах циклов) — это ошибка на единицу (или «ошибка неучтенной единицы»). Она возникает, когда цикл повторяется на 1 раз больше или на 1 раз меньше нужного количества итераций. Это обычно происходит из-за того, что в условии используется некорректный оператор сравнения (например, > вместо >= или наоборот). Как правило, эти ошибки трудно отследить, так как компилятор не будет жаловаться на них, программа будет работать, но её результаты будут неправильными.
При написании циклов for помните, что цикл будет выполняться до тех пор, пока условие является истинным. Рекомендуется тестировать циклы, используя разные значения для проверки работоспособности цикла. Хорошей практикой является проверять циклы с помощью данных ввода (чисел, символов и прочего), которые заставляют цикл выполниться 0, 1 и 2 раза. Если цикл работает исправно, значит всё ОК.
Правило: Тестируйте свои циклы, используя входные данные, которые заставляют цикл выполниться 0, 1 и 2 раза.
Пропущенные выражения в цикле
Также в циклах можно пропускать одно или сразу все выражения, например:
#include <iostream> int main() { int count = 0; for (; count < 10; ) { std::cout << count << ” “; ++count; } return 0; } |
Результат:
0 1 2 3 4 5 6 7 8 9
Инициализацию счетчика мы прописали вне тела цикла, а инкремент счетчика — внутри тела цикла. В самом операторе for мы указали только условие. Иногда бывают случаи, когда не требуется объявлять счетчик цикла (потому что у нас он уже есть) или увеличивать его (так как мы увеличиваем его каким-то другим способом).
Хоть это и не часто можно наблюдать, но в операторе for можно вообще ничего не указывать. Стоит отметить, что подобное приведет к бесконечному циклу:
for (;;)
тело цикла;
Вышеприведенный пример эквивалентен:
while (true)
тело цикла;
Объявления переменных в цикле for
Хотя в циклах for обычно используется только один счетчик, иногда могут возникать ситуации, когда нужно работать сразу с несколькими переменными. Для этого используется оператор Запятая. Например:
#include <iostream> int main() { int aaa, bbb; for (aaa = 0, bbb = 9; aaa < 10; ++aaa, –bbb) std::cout << aaa << ” ” << bbb << std::endl; return 0; } |
Этот цикл присваивает значения двум ранее объявленным переменным: aaa = 0 и bbb = 9. Только с каждой итерацией переменная aaa увеличивается на единицу, а bbb — уменьшается на единицу.
Результат выполнения программы:
0 9
1 8
2 7
3 6
4 5
5 4
6 3
7 2
8 1
9 0
Примечание: Вышеприведенный цикл можно переписать следующим образом:
#include <iostream> int main() { for (int aaa = 0, bbb = 9; aaa < 10; ++aaa, –bbb) std::cout << aaa << ” ” << bbb << std::endl; return 0; } |
В этом случае запятая в объявлении переменных является частью синтаксиса, а не использованием оператора Запятая. Но эффект идентичен.
Использование циклов for в старых версиях С++
В старых версиях C++ переменные, объявленные в цикле for, не уничтожались при завершении этого цикла. Т.е. у вас могло получиться что-то вроде следующего:
for (int count=0; count < 10; ++count) std::cout << count << ” “; // В старых версиях С++ переменная count здесь не уничтожается std::cout << “n”; std::cout << “I counted to: ” << count << “n”; // поэтому мы можем использовать count даже здесь |
Позднее это было запрещено, но вы все еще можете увидеть подобное в старом коде.
Вложенные циклы for
Подобно другим типам циклов, одни циклы for могут быть вложены в другие циклы for. В следующем примере мы разместили один for внутри другого for:
#include <iostream> int main() { for (char c = ‘a’; c <= ‘e’; ++c) // внешний цикл по буквам { std::cout << c; // сначала выводим букву for (int i = 0; i < 3; ++i) // внутренний цикл по числам std::cout << i; std::cout << ‘n’; } return 0; } |
С одной итерацией внешнего цикла выполняется три итерации внутреннего цикла. Следовательно, результат выполнения программы:
a012
b012
c012
d012
e012
Заключение
Циклы for являются наиболее часто используемыми циклами в языке C++. Несмотря на то, что их синтаксис, как правило, немного запутывает начинающих программистов, вы очень скоро к нему привыкните и ощутите всю мощь и удобство этих циклов.
Тест
Задание №1
Напишите цикл for, который выводит каждое четное число в диапазоне от 0 до 20.
Ответ №1
#include <iostream> int main() { for (int count = 0; count <= 20; count += 2) std::cout << count << std::endl; return 0; } |
Задание №2
Напишите функцию sumTo(), которая принимает целочисленный параметр с именем value и возвращает сумму всех чисел от 1 до значения value.
Например, если значением value является 5, то sumTo(5) должен возвратить 15, исходя из 1 + 2 + 3 + 4 + 5.
Подсказка: Используйте переменную вне тела цикла для хранения суммы чисел, как в примере с функцией pow() в подзаголовке «Еще примеры циклов for».
Ответ №2
int sumTo(int value) { int total(0); for (int count=1; count <= value; ++count) total += count; return total; } |
Задание №3
Что не так со следующим циклом?
// Выводим все числа от 8 до 0 for (unsigned int count=8; count >= 0; –count) cout << count << ” “; |
Ответ №3
Этот цикл for выполняется до тех пор, пока count >= 0. Другими словами, он работает до тех пор, пока переменная count не станет отрицательным числом. Однако, поскольку count является типа unsigned, то эта переменная никогда не сможет быть отрицательной. Следовательно, этот цикл бесконечный! Как правило, рекомендуется избегать использования типов unsigned в цикле, если на это нет веских причин.
Оценить статью:
Загрузка…
Источник
Циклы с предусловием (while), с постусловием (repeat), циклы со счетчиком (for)
Цикл с предусловием (while) в Pascal abc.net
- Итерация — однократное повторение тела цикла.
- В цикле while тело может не выполниться ни разу.
Синтаксис цикла while:
<оператор> // тело цикла
::=
Цикл while на блок-схеме
Пример: Вычислить сумму четных чисел от 2 до 20.
✍ Решение:
x := 2;
while x <= 20 do
begin
sum += x;
x += 2;
end;
Задание: Определите наименьшее натуральное число, квадрат которого больше заданного целого числа. Стандартную функцию извлечения квадратного корня не использовать.
Пример: Даны положительные числа A и B (A ≥ B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти количество отрезков B, размещенных на отрезке A.
✍ Решение:
var (a,b):=readInteger2;
assert(a>=b);
var k:=0;
var s:=0;
while s<=a do begin
inc(k);
s+=b
end;
writeln(k-1)
End.
Оператор break в цикле while
Оператор break предназначен для экстренного выхода из цикла. Обычно используется в условном операторе: при выполнении условия — выход из цикла.
Как работать с последовательностями чисел?
Например, в случае, когда последовательность чисел должна заканчиваться нулем, то примерный код обработки последовательности может быть таким:
// …
while True do // бесконечный цикл
begin
// ввод очередного элемента последовательности
var b := ReadInteger; // или ReadReal
if b = 0 then
break; // выход из цикла при вводе элемента, равного нулю
// обработка очередного элемента последовательности
end;
// вывод результатов
end.
Задание: Дана последовательность целых чисел, признак завершения которой — число (оно не считается элементом последовательности). Вывести номера чётных чисел последовательности (числа нумеровать с 1). Если последовательность не содержит чётных элементов, выводить ничего не нужно.
Цикл с постусловием (repeat) в Pascal abc.net
- В цикле repeat тело выполнится хотя бы один раз.
Синтаксис цикла repeat:
<операторы> // тело цикла
until <условие>
Цикл repeat на блок-схеме
Пример: Вычислить сумму четных чисел от 2 до 20.
✍ Решение:
x := 2;
repeat
sum += x;
x += 2;
until x = 22;
Оператор цикла со счетчиком (for) в Pascal abc.net
- переменная-счетчик должна иметь порядковый тип (целый, символьный или перечислимый);
- переменная-счетчик цикла for не должна меняться внутри цикла for;
- описание переменной цикла в его заголовке:
- автоопределение типа при описании:
Синтаксис цикла for:
выглядит так:
for := do
выглядит так:
выглядит так:
to | downto
Новое в Pascal abc.net:
<оператор>
<оператор>
Значение переменной цикла после завершения цикла будет не определено (локальная).
Пример: Даны целые числа A и B (A ). Вывести в порядке возрастания все целые числа, расположенные между A и B (не включая сами числа A и B), а также количество N этих чисел.
✍ Решение:
var (a, b) := readinteger2(‘Введите два целых числа. Первое должно быть меньше второго:’);
assert(a < b); // проверка действительно ли a < b
for var i := (a + 1) to (b – 1) do
println(i);
println(b – a – 1); // количество чисел
end.
Задание: Даны два целых числа A и B. Выведите квадраты всех целых чисел, расположенных между A и B, в порядке возрастания чисел и включая сами эти числа.
Задание: Дано вещественное число — цена 1 кг конфет. Вывести стоимость 1.2, 1.4, …, 2 кг конфет.
Пример: Используя один цикл, вычислить значение суммы, заданной следующей формулой (N > 0):
✍ Решение:
var n:=readInteger(‘N = ‘);
assert(n>0);
var x:=readReal(‘X = ‘);
var sum:=0.0;
var f:=-1.0;
var num:=1.0;
for var i:=1 to n do begin
num*=x;
sum+=(x+f*num)/i;
f*=-1.0;
end;
writeln(sum)
End.
Задание: Используя один цикл, вычислить значение суммы, заданной следующей формулой (N > 0):
Не забудьте, что использование функции возведения в степень запрещено.
Как работать с последовательностью чисел?
Например, если необходимо как-то обработать последовательность чисел с заданным количеством элементов, то примерный код может быть таким:
// предварительные действия
N := ReadInteger; // или Read(N);
for var i := 1 to N do
begin
// ввод очередного элемента
var b := ReadInteger; //или ReadReal, или Read(b);
// обработка очередного элемента
end;
// вывод результатов обработки
end.
Задание: Дано целое число N (N ≥ 0) и последовательность из N целых чисел. Найти количество отрицательных чисел в этой последовательности.
Упрощенный цикл LOOP
Для того, чтобы реализовать цикл с конкретным числом итераций, не используя счетчик цикла, возможен упрощенный вариант:
Пример:
loop 5 do
begin
println(‘Привет!’);
end;
// …
Обработка цифр числа
О том, как выделять из числа отдельные его разряды Вы ознакомились в предыдущем уроке.
Теперь рассмотрим более сложный вариант с обработкой цифр числа.
Пример: Дано натуральное число N — количество цифр и последовательность из N цифр. Сформировать положительное число, состоящее из этих цифр, начиная со старшего разряда.
Пример:
кол-во; цифры => результат
N = 3; 3,7,0 => M = 370
N = 1; 0 => M = 0
N = 5; 0,7,0,1,6 => M = 7016
N = 1; 2 => M = 2
N = 2; 0,2 => M = 2
Замечание: В решении должен использоваться один цикл, запрещено использовать математические функции наподобие power или ln.
✍ Решение:
var n := readinteger(‘Введите количество цифр N:’);
var num := 0;
assert(n > 0);
println(‘Введите цифры:’);
loop n do
begin
var a := readinteger;
num += a;
num := num * 10;
end;
println(num div 10);
end.
Задание: Дано целое число. Найти количество его цифр и их сумму.
Пример:
N = 1205 => Count = 4, Sum = 8
N = -111 => Count = 3, Sum = 3
N = 0 => Count = 1, Sum = 0
Замечание: В решении должен использоваться только один цикл, запрещено использовать математические функции наподобие power или ln.
Пример: Задается целое число. Получить новое число, первый (старший) разряд которого равен последнему (младшему) разряду исходного числа, второй разряд равен предпоследнему разряду исходного числа и т.п.
Пример:
N = 1205 => M = 5021
N = -950 => M = -59
N = 0 => M = 0
N = -4 => M = -4
✍ Решение:
println(‘Введите целое число:’);
var n := readinteger;
var (newnum, sign) := (0, sign(n));
n := abs(n);
while n > 0 do
begin
newnum += (n mod 10);
newnum *= 10;
n := n div 10;
end;
println(sign * (newnum div 10));
end.
Задание: Задаются два числа целого типа одинаковой разрядности. Получить из них новое положительное число, разряды которого — есть наибольшее из соответствующих разрядов исходных чисел.
Пример:
N1 = 29, N2 = -31 => M = 39
N1 = 111, N2 = 103 => M = 113
N1 = -50, N2 = 20 => M = 50
Вложенные циклы
Пример: Дано целое число K > 0, а также K наборов ненулевых целых чисел. Признак завершения каждого набора — число . Для каждого набора вывести количество его элементов. Вывести также общее количество элементов во всех наборах.
Пример:
Введите число: 3
7 8 6 0
4 5 4 3 1 0
4 5 6 9 0
Кол-во элементов для каждого: 3 5 4
Всего элементов: 12
✍ Решение:
var k:=ReadInteger(‘Введите число’);
assert(k>0);
var st:=”;
assert(k>0);
var c:=0;
for var i:=1 to k do
begin
var count:=0;
var x:=ReadInteger;
while x<>0 do
begin
count+=1;
read(x);
end;
st+=count.ToString+’ ‘;
c+=count;
end;
Println(‘Кол-во элементов для каждого =’,st);
println(‘Всего элементов’,c);
end.
Задание: Даны целые числа K > 0, N ≥ 0, а также K наборов целых чисел по N элементов в каждом наборе. Найти количество наборов, содержащих число 2. Если таких наборов нет, то вывести .
Пример:
K = 3, N = 5;
набор 1: 6 4 2 -3 2
набор 2: -1 5 6 3 49
набор 3: 31 7 7 -8 12
…
Правильный ответ: 1 набор.
Источник