Цикл со счетчиком.

advertisement
Циклы в C# Лабораторная работа
Лабораторная работа
Программирование циклических алгоритмов
Определение. Цикл – это последовательность операторов, которая может выполняться
более одного раза.
Определение. Циклический алгоритм – это алгоритм, содержащий один или несколько
циклов.
В языке C# существуют удобные конструкции для организации циклов:



цикл со счетчиком;
цикл с предусловием;
цикл с постусловием.
Цикл со счетчиком.
Циклы со счетчиком составляют класс циклов, в которых выполнение повторяющихся
операторов (тела цикла) должно повторяться заранее определенное число раз. В языке C#
для этих целей имеется специальная конструкция.
Общая форма записи цикла со счетчиком
for (i = A; i <= B; i++)
{
. . .
}
for (i = A; i >= B; i--)
{
. . .
}
Здесь переменная i - управляющая переменная или переменная цикла,
А - начальное значение переменной цикла,
В - конечное значение переменной цикла.
При переходе к обработке оператора цикла for управляющей переменной присваивается
заданное начальное значение. Затем в цикле выполняется исполнительный оператор (или
тело цикла). Каждый раз при выполнении тела цикла управляющая переменная увеличивается на 1 (для i++) или уменьшается на 1 (для i--). Цикл завершается при достижении
управляющей переменной своего конечного значения.
Например,
int i;
for (i = 1; i <= 5; i++)
Console.WriteLine(i);
//тело цикла - всего один
//оператор и скобки {} не нужны
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
/*напечатается
1
2
3
4
5
*/
for (double j = 3.2+0.6; j > 2.1; j=j-0.3) //переменная j
Console.WriteLine(j);//локальна только для цикла
/*напечатается
3.8
3.5
3.2
2.9
2.6
2.3
*/
Пример 1 Найти сумму некоторого количества чисел, задаваемых пользователем.
При вычислении суммы используем следующий прием: вначале, когда еще не задано ни
одно слагаемое, сумму полагают равной нулю (S:=0), а затем, получая очередное слагаемое, прибавляют его к сумме (S:=S+x).
Очень важное значение в операторе цикла имеет так называемая переменная цикла. В
нашей программе она называется i. С ее помощью мы обращаемся к пользователю за очередным числом (Console.Write("Введите {0}-е число:",i);). Исходными данными в этом
случае являются переменная N - количество чисел и сами эти числа. Значение очередного
числа обозначим переменной Х. Результатом работы алгоритма станет сумма этих чисел,
которую обозначим переменной S.
S=x1+x2+x3+...+xn
Допустимые значения переменной N должны удовлетворять условию n>0, так как количество слагаемых не может быть числом отрицательным.
Сначала нужно запросить, сколько чисел нужно будет сложить и передать это число в переменную N. Затем нужно так организовать операторы, чтобы программа запрашивала
очередное число и каждый раз складывала его с предыдущими; и повторяла эту группу
операторов N раз.
Программа, реализующая Пример1 будет выглядеть следующим образом (листинг 1):
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
Листинг 1.
Пусть нам требуется сложить следующие числа: 5, 7, -4, 0, 8, 20. Посчитаем, сколько их
всего – шесть. Это число мы введем, когда программа задаст вопрос: Введите количество
суммируемых чисел. Теперь наша программа запросит ввести 1-ое число, т. к. на первом
шаге переменная i равна 1. Мы введем число 5. Программа считает его в переменную х.
Теперь число 5 сложим с числом 0 и результат присвоим переменной S (оператор S=S+x).
В этот момент S становится равной 5. Выполнение операторов тела цикла закончено. Теперь оператор цикла увеличит значение i на 1и переходит к анализу условия продолжения
цикла (i<=N). Переменная цикла i=2, переменная N=6, поэтому значение логического
условия 2<=6 равно True. Значит снова выполняется тело цикла. После того, как переменная I примет значение 7, цикл выполнится последний раз, к сумме будет добавлено очередное число 20. Оператор цикла увеличит значение переменной I до 7, но на этот раз тело цикла выполняться не будет, т.к. i>n (7>6). Повторение операторов тела цикла завершится. И на экран будет выведена итоговая сумма шести введенных чисел.
Задание 1 Реализуйте и протестируйте работу программы для примера 1. Измените программу таким образом, чтобы из вводимых N чисел суммировались только четные. Сохраните программу под именем Ex_3_1.
При использовании цикла for компьютер выполняет за программиста черновую работу по
инициализации управляющей переменной и по ее увеличению (уменьшению) при каждом
повторении цикла.
Управляющая переменная должна описываться, как и любая другая переменная. Обычно
переменная цикла имеет тип int.
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
Если начальное значение цикла for ...to больше конечного значения, то никакие операции
не выполнятся. Таким образом, следующий оператор не приведет ни к каким действиям
for (j = 1; j <= 0; j++)
Console.WriteLine(j);
Такой цикл распечатает целые числа от единицы до десяти:
for (j = 1; j <= 10; j++)
Console.WriteLine(j);
Следующий цикл выполняет счет в обратном порядке:
for (j = 10; j >= 1; j--)
Console.WriteLine(j);
Задание 2. Население города увеличивается на 3% каждый год. В 2000 году население города составляло 65000. Напишите программу, которая выведет на экран предсказываемую
численность населения города в каждом году вплоть до 2010 года.
Вывод должен быть, примерно, таким:
2000 г. население = 65000 чел.
2001 г население = …… чел. и т.д.
Программу сохраните под именем Ex_3_2
Часто исполнительная часть одного из циклов for является новым оператором цикла for.
Структуры такого рода называются вложенными циклами. При завершении внутреннего
цикла управляющая переменная внешнего цикла увеличивается. Повторение этих действий будет продолжаться до завершения внешнего цикла. Приведенный ниже вложенный
цикл печатает пары чисел, начиная от (1,1), (1,2),... и кончая (10,10):
for (i = 1; i <= 10; i++)
{
for (j = 1; j <= 10; j++)
Console.Write("({0},{1})", i, j);
Console.WriteLine();
}
Задание 3. Оформите приведенный выше фрагмент в виде программы. Дополните программу строками, по которым последним числом в строке будет выведена сумма всех чисел данной строки. Так в конце первой строки будет выведено число 65
( (1+1) + (1+2) + (1+3) + (1+4) … + (1+10))=65)
Программу сохраните под именем Ex_3_3
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
Цикл с предусловием (цикл while, цикл «Пока»).
Циклы с предусловием используются тогда, когда выполнение цикла связано с некоторым
логическим условием. Оператор цикла с предусловием имеет две части: условие выполнения цикла и тело цикла.
При выполнении оператора while определенная группа операторов выполняется до тех
пор, пока определенное в операторе while булево условие истинно. Если условие сразу
ложно, то оператор не выполнится ни разу.
Общая форма записи и блок схема цикла с предусловием представлены на рисунке 1
while (<булево выражение>)
{
группа операторов
}
Рисунок 1. Блок схема цикла с предусловием и формат оператора while
На русском языке это звучит примерно так:
пока выполняется это условие делай
от начала
группа операторов
до конца;
Операторные скобки ставят, чтобы отделить от остальной программы ту группу операторов, которую нужно повторить в цикле. Если в цикле нужно выполнить только один оператор, то операторные скобки не ставят.
При использовании цикла с предусловием надо помнить следующее:
1. значение условия выполнения цикла должно быть определено до начала цикла;
2. если значение условия истинно, то выполняется тело цикла, после чего повторяется
проверка условия. Если условие ложно, то происходит выход из цикла;
3. хотя бы один из операторов, входящих в тело цикла, должен влиять на значение
условия выполнения цикла, иначе цикл будет повторяться бесконечное число раз.
Вернемся к задаче вычисления суммы чисел Пример 1. Решим задачу, использую оператор While. С помощью переменной цикла i мы обращаемся к пользователю за очередным
числом (Console.Write("Введите {0}-е число:",i);) и считаем количество уже введенных
чисел (i=i+1), чтобы не запросить лишнее. Одновременно переменная цикла участвует в
булевом выражении (i<=N). Программа решения представлена на листинге 2.
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
Листинг 2.
До тех пор, пока логическое выражение i<=n равно TRUE, выполняется тело цикла - запрос очередного числа и его суммирование. При i=7 (7<=6) значение этого условия равно
False, а значит тело цикла выполняться не будет. Цикл закончил свою работу. А мы получили результат: посчитали сумму всех шести чисел S=32.
Задание 4: Наберите и протестируйте приведенную выше программу. Сохраните под
именем Ex_3_4
В этом примере известно заранее количество повторений - N раз. Но чаще всего этот вид
цикла используется тогда, когда количество повторений заранее не известно и зависит от
выполнения какого-либо условия.
Продолжим изучение цикла с предусловием на примере решения следующей задачи.
Пример 2. Найти сумму положительных чисел, идущих подряд в непустой последовательности.
Рассмотрим алгоритм решения.
Для работы необходимо организовать обращение к каждому элементу последовательности. Это будет происходить до тех пор, пока среди элементов не встретится отрицательное
число.
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
В данном случае число повторений цикла заранее неизвестно. Суммирование чисел будет
проходить до тех пор, пока среди слагаемых не встретится отрицательное число. Общая
схема цикла будет выглядеть так:
Пока очередное слагаемое X>=0 выполнять:
S=S+X
Запросить ввод очередного слагаемого X
Задание 5. Напишите полный текст программы из примера 2, находящей сумму положительных чисел последовательности. Дополните программу нахождением среднего арифметического этих чисел. Сохраните под именем Ex_3_5
Примечание. Средним арифметическим чисел называется сумма этих чисел, деленная на
их количество. Для подсчета количества чисел в теле цикла организуйте «счетчик», т.е.
переменную, увеличивающую свое значение на 1 после ввода очередного слагаемого.
Например: i=i+1. До цикла переменной i надо задать начальное условие i=0.
Цикл с постусловием do - while.
Иногда при решении задач возникает необходимость выполнить тело цикла хотя бы один
раз, а потом исследовать условие повторять ли его еще раз. Эту задачу выполнит другой
вид цикла do – while.
do //повторяй
{
операторы
}
while (<условие>);// до тех пор, пока условие верно
Конструкция do - while работает аналогично циклу while. Различие заключается в том, что
цикл while проверяет условие до выполнения действий, в то время как do - while проверяет
условие после выполнения действий. Это гарантирует хотя бы одно выполнение действий
до завершения цикла. В данном случае условие является условием завершения цикла
Пример 3. Составить программу для игры «Угадай число». Компьютер случайным образом «загадывает» число из интервала от 1 до 20, а пользователь пытается его угадать.
Когда число угадано, компьютер выводит на экран сообщение, сколько попыток понадобилось для угадывания числа.
Программа решения примера 3 представлена на листинге 3.
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
Листинг 3.
Задание 6. Реализуйте программу «Угадай число». Измените программу так, чтобы число выбиралось из интервала от 1 до 99, а после ввода варианта ответа, компьютер сообщал «задуманное число больше (меньше) введенного». Сохраните под именем Ex_3_6
Пример 4. Определить, является ли введенное число простым (простым называется число, которое не имеет делителей кроме 1 и самого себя).
Алгоритм решения этой задачи будет следующий. При помощи операции нахождения
остатка деления (%) проводим проверку всех целых чисел от 2 до введенного числа
Number . Проверяем, является ли очередное проверяемое число делителем нашего числа
(значит, остаток от деления введенного числа на проверяемое число равен нулю). Если
такой делитель найден, значит, цикл досрочно завершает свою работу на некотором i-м
шаге. Если делитель не найден, следовательно цикл проверил все числа и значение переменной цикла i будет равно конечному значению, т.е. Number. Поэтому, после записи
цикла следует анализ значения переменной i и выводится соответствующее сообщение.
Цикл не может продолжаться бесконечно, так как любое число всегда делится само на себя. Программа для решения данного примера представлена на листинге 4.
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
Листинг 4.
При построении циклов нужно быть очень аккуратным: следить за отсутствием ошибок
как в фазе входа в цикл, так и в фазе завершения цикла.
Задание 7. Наберите и протестируйте программу, приведенную в примере 3. Сохраните
под именем Ex_3_6
Задание 8. Нарисуйте в тетради блок-схемы к заданиям 3, 4, 5, 6.
Индивидуальные задания
Задание 1. Выполнить задание по варианту
1. Ежегодный прирост рыбы в пруду составляет 15%. Запасы рыбы в
начале 2012 года оценены в А тонн. Ежегодный план отлова В тонн. Лов следует прекратить, если останется не более 10% от исходного рыбного запаса.
Составьте алгоритм и программу, подсчитывающую, на сколько лет промысла может рассчитывать рыбпромхоз?
2. Начальный вклад в сберкассу составил А рублей. Каждые полгода
вклад увеличивается на N%. Сколько лет должен находиться вклад в банке,
чтобы достичь желаемой величины в К рублей?
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
3. Леспромхоз ведет промышленную заготовку древесины. Ежегодный план составляет N м3. За год лес естественным путем прирастает на
2,5%. Запасы леса на данный момент, начало 2014 года, равны 150000 м3. На
какой срок работы могут рассчитывать лесозаготовители?
4. Начав тренировки, лыжник в первый день пробегал 10 км. Каждый
следующий день он увеличивал длину пробега на 10% от предыдущего дня.
Через сколько дней лыжнику придется пробегать не менее 45 км за день?
5. Начав тренировки, спортсмен в первый день пробежал 3км. Каждый
следующий день он увеличивал дневную норму на 10%. За сколько дней
суммарный пробег спортсмена превысит 100 км?
6. Патентованное средство для похудания гарантирует потерю 1% веса за день. Начальный вес больного вводится с клавиатуры. Сколько дней
придется лечиться больному, чтобы его вес снизился до желаемого значения?
7. Медведь за зимнюю спячку теряет ежедневно по 0,1% от своего веса. Британские ученые считают, что потеря больше половины веса негативно
сказывается на самочувствии зверя. Определите максимально возможную
продолжительность спячки. Результаты, для наглядности, выведите в виде
таблицы: N дня спячки – V вес медведя.
8. Цыпленок-бройлер появляется на свет, имея массу 5 грамм. При
специальном уходе его масса увеличивается по следующей схеме: первые 10
дней – на 7% за сутки, с 11 по 19 день – на 12%, с 20 дня – на 8%. За сколько
дней масса бройлера достигнет 2,5 кг?
9. Муфельная печь для обжига гончарных изделий разогрета до 850.
По окончании процесса обжига печь выключают. Открывать дверцу печи
можно только тогда, когда температура в ней не будет превышать температуру окружающей среды. Через сколько часов можно достать керамику, если
известно, что каждый час температура падает на 20% от текущей величины?
Задание 2. Выполнить задание по варианту. Тип цикла определить самостоятельно
1. Напечатать все делители числа N.
2. Составить программу, проверяющую, является ли последовательность целых чисел, вводимых с клавиатуры, возрастающей. Введенный 0 означает
конец ввода.
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
3. Определить, является ли введенное число простым1.
4. Числа Фибоначчи (fn) определяются формулами: f0=f1=1; fn=fn-1+fn-2 при
n=2,3,... Cоставить программу: поиска f - первого числа Фибоначчи, большего m (m>1).
5. Числа Фибоначчи (fn) определяются формулами: f0=f1=1; fn=fn-1+fn-2 при
n=2,3,... Составить программу вычисления S – суммы всех чисел Фибоначчи,
которые не превосходят 1000.
6. Составить программу вычисления факториала числа. Сколько множителей
входит в произведение, если его значение только что превысило 1000? Какое
минимальное количество множителей должно быть в произведении,
чтобы его значение превысило 1000?
1
1
1
1
7. Сколько чисел вида 1 + 2 + 4 + 8 + 16 + ⋯ надо сложить, чтобы сумма превысила число 1,8?
1
2
3
4
8. Сколько членов ряда 2 + 3 + 4 + 5 + ⋯ ... нужно сложить, чтобы сумма превысила 2?
9. Найти сумму и количество элементов последовательности, которые по модулю больше 0.001. Последовательность: 1/2 - 2/4 + 3/8 - 4/16 + ... - ...
10. Вводится число. Размер числа не выходит за пределы разрядной сетки для
типа данных Int32, но количество разрядов в числе заранее не известно. Требуется вывести число так, чтобы составляющие его цифры шли в обратном
порядке. Например, вводится число 4096, надо вывести 6904.
Контрольные вопросы
1. Для решения какого типа задач применимы циклические алгоритмы
с условием?
2. Поясните отличие работы алгоритма с проверкой условия до тела
цикла и после. Приведите примеры задач, для решения которых существенно, какой тип алгоритма выбран.
3. Поясните общую схему решения задач с использованием циклов с
условием.
4. Для чего в задаче 1 две переменные хранят значение суммы задолженности?
1
Напомним, что простым называется число, которое не имеет делителей кроме 1 и самого себя.
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
5. Какой тип алгоритма следует использовать в задаче 1 – с предусловием или с постусловием? Почему?
6. Может ли произойти ситуация «зацикливания» при решении задачи
1? Ответ обоснуйте.
7. Нарисуйте и прокомментируйте блок-схему к задаче 2.
8. Каким будет значение переменной а после выполнения фрагмента
программы?
int a=1;
int z=1;
while (a<=3)
a=a+1;
a=a+z;
a=a+10;
Console.writeLine (a);
9. Каким будет значение переменной x после выполнения фрагмента
программы?
int x=2;
int y=1;
while (x<=5)
{x=x+1;
x=x+y;
x=x+10; }
Console.writeLine (a);
10. Что будет выведено на экран в результате работы следующей программы:
int m=3;
int n=22;
do
{
n=m;
m=n+1;}
While (m!=8);
Console.WriteLine (n);
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
Приложение
Вычисления с точностью
Теория
Число x называется пределом числовой последовательности {a1, a2, …, an}, если для любого сколь угодно малого  можно указать такое достаточно большое положительное число
N, что для всех n>N выполняется неравенство |an – x|<.
Многие из математических величин или значений функций могут быть выражены как
сумму таких бесконечных последовательностей. Например функции sin(x) и cos(x).
x x3 x5
x 2 n 1
n
sin( x)  

 ...  (1) 
 ...
1! 3! 5!
(2n  1)!
x2 x4 x6
x 2n
n
cos( x)  1  

 ...  (1) 
 ...
2! 4! 6!
(2n)!
Ввод
данных
Очистка суммы
S=0
Чем больше членов ряда участвуют в вычислении суммы, тем более точным получается результат. Разность между суммой
ряда и суммой бесконечного ряда называется погрешностью сложения. Часто оценивают n-ный член, если он достаточно
мал, т.е. меньше некоторого числа , которое часть называют точностью, считается,
что найденная сумма достаточно хорошо
приближается к действительному значению суммы и следующие слагаемые можно не учитывать.
Приведем блок-схему алгоритма вычисления суммы с заданной точностью .
n=нач. знач.
Задать начальное значение n
Задать начальное значение
элементу последовательности
a=нач.знач.
|a|>точность
нет
проверить, надо ли
суммировать этот элемент
да
S=S=a
Суммирование элемента
последовательности
n=n+1
Получение сследующено n
Вычисление
значение a
Вычисление нового элемента
последовательности
Вывод S
Блок-схема решения задач на точность
вычисления
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
Примеры
Пример 1.
Вычислить бесконечную сумму с заданной точностью  ( >0).

4
i 0
i
1
 5i2
Исходные данные:
точность eps вещественный тип,
член последовательности а – вещественный тип.
program sum;
var eps, a, S, P1, P2:real
i, j integer;
Ввод eps
begin
write(‘ eps=’);
readln(eps);
S=0
S;=0;
Результат: сумма S – вещественный
тип.
i=0
Тестовый пример:
при eps=10-4, S=0.0097.
i:=0;
a=1/(1+25)
При вычислении суммы бесконечного
ряда, члены ряда с увеличением номера
стремятся к нулю. Это происходит потому, что значение знаменателя быстро
растет и в конце концов достигает
очень большого значения, что приводит
к ошибке переполнения. Чем выше
точность, тем легче получить такую
ошибку. В некоторых ситуациях этого
модно избежать, если использовать рекуррентную формулу, т.е. выразить новый член ряда через предыдущий.
Рассмотрим примеры построения рекуррентной формулы.
a:=1/(1+25);
while abs(a)>eps do
|a|>eps
begin
нет
да
S:=S+a;
S=S+a
i:=i+1;
i=i+1
P1:=1;
P1=1
for j:=1 to I do
j=1,i,1
P1:=P1*4;
P1=P1*4
P2:=1;
P2=1
for j:=1 to i+2 do
j=1,i+2,1
P2:=P2*5;
P2=P2*5
a:=1/(P1+P2);
end;
a=1/(P1+P2)
writeln(‘S=’, S:7:3);
Вывод S
end.
Блок-схема решения примера 1
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
Пример 2.
Даны действительные числа x,  (x0, >0). Вычислить с точностью :

x 2k

k
k 0 2 k!
Попробуем выразить формулу для ak+1 через ak.
x 2k
2 k k!
x 2( k 1)
x 2k  x 2
x 2k
x2
x2
ak 1  k 1
 k
 k 
 ak 
2(k  1)
2 (k  1)! 2  2  k!(k  1) 2 k! 2  (k  1)
ak 
Таким образом:
x2
ak 1 
ak
2(k  1)
Исходные данные:
x – вещественный тип,
eps – вещественный тип,
член последовательности а – вещественный тип.
Результат:
сумма S – вещественный тип.
Тестовый пример:
при eps=10-4, x=1, S=1.8244.
Рассмотрит еще пример построения рекуррентной формулы:
(1) k x 4 k 3
ak 
(2k  1)!(4k  3)
Блок-схема решения примера 2.
(1) k 1 x 4( k 1)3
(1) k  (1)  x 4 k  43
(1) k  (1)  x 4 k 3  x 4



(2(k  1)  1)!(4(k  1)  3)
(2k  3)!(4k  7)
(2k  1)!(2k  2)  (2k  3)  (4k  7)
(1) k  x 4k 3 (4k  3)
(1)  x 4
(1)  x 4  (4k  3)



 ak 
(2k  1)! (4k  3) (2k  2)  (2k  3)  (4k  7)
(2k  2)(2k  3)(4k  7)
ak 1 
© Болгарина Е.В., РГППУ, 2014
Циклы в C# Лабораторная работа
В некоторых числовых последовательностях требуется получать элементы до тех пор, пока разность между элементами не достигнет заданной точности: |an - an-1|<. В этом случае
надо сохранять в памяти два элемента последовательности.
Пример 3.
Дано действительное число  (>0).
Последовательность a1, a2, … образована по следующему закону:
Ввод eps
1 
 1  1

a n  1    1    ...  1 

 2  3
 n 1
Найти первый член an (n2), для которых
выполняется условие |an-an-1|<.
Исходные данные:
eps – вещественный тип,
элемент an-1 а1 – вещественный тип,
элемент an а2 вещественный тип
Результат:
элемент a2 - вещественный тип.
Начальное значение n
n=1
Тестовый пример:
при eps=10-4, a2=0.14.
a2=1/2
Начальное значение а n
n=n+1
Переход к следующему n
a1=a2
Значение an передается в an-1
a2=a1.(1-1/(n+1))
нет
|a1-a2|<eps
Получаем an
цикл заканчивается когда
разнича между членами
ряда станет меньше eps
да
Вывод a2
Блок-схема решения примера 3
© Болгарина Е.В., РГППУ, 2014
Download