Как будет работать приведенная в параграфе программа которая считает количество цифр числа при вводе
Перейти к содержимому

Как будет работать приведенная в параграфе программа которая считает количество цифр числа при вводе

  • автор:

Ответы по параграфу 3.5 Программирование циклических алгоритмов

Учебник по Информатике 8 класс Босова

Задание 2. Дана последовательность операторов. Сколько раз будет повторен цикл и какими будут значения переменных a, b, s?

a:=1; b:=2; while a+bdo begin a:=a+1; b:=b+2; end; s:=a+b

Ответ: 2 раза будет повторен цикл, a=3, b=6, s=9.

Задание 3. Требовалось написать программу вычисления факториала. Программист написал его неправильно. Ниже представлена программа, в которой содержатся ошибки. Найдите ошибки и внесите исправления.

Задание 4. Проанализируйте следующий цикл. В чём его особенность?

Значение переменной «c» будет типом boolean, то есть значение будет true или false. Выражение c:=a=b проверяет равенство «a» и «b» и будет делать проверку, пока a

Задание 5. Запишите на языке Паскаль программы решения задач № 26-30 из параграфа 2.4. Используйте оператор while.

program z26; var a, b, c: real; n: integer; BEGIN readln(a, b, c); n:=0; while a>c do begin a:=a+0.15*a-b; n:=n+1; end; writeln ('В течение ', n, ' лет'); END. program z27; var a, b, n: integer; BEGIN write('Сумма слагаемых первых членов последовательности: '); readln(b); a:=5; n:=1; while ado begin a:=a+(a+4); n:=n+1; end; writeln (n, ' слагаемых'); END. program z28; var m,k: longint; begin write('Введите число: '); readln(m); k:=0; while m<>0 do begin k:=k+1; m:=m div 10; end; writeln('Кол-во цифр: ',k); end. program z29; var m, d: real; n:integer; begin m:=10000; d:=2*m; n:=0; while mdo begin m:=m*1.05; //Подсчитываем количество рублей через год n:=n+1; //Считаем количество лет end; writeln('Сумма увеличится в два раза через ',n, ' лет'); end. program z30; var m, t, X: real; begin write('Введите количество амёб: '); readln(X); m:=1; t:=0; while mend.

Задание 6. Дана последовательность операторов. Сколько раз будет повторен цикл и какими будут значения переменных a, b, s?

a:=1; b:=1; repeat a:=a+1; b:=b*2; until b>8; s:=a+b

Ответ: 4 раза будет повторен цикл, a=5, b=16, s=21.

Задание 7. Напишите программу, в которой осуществляется ввод целых чисел (ввод осуществляется до тех пор, пока не будет введен ноль) и подсчет суммы и среднего арифметического введенных положительных чисел. Используйте оператор repeat.

program z_7; var m, n: integer; s: real; begin n:=0; s:=0; repeat readln (m); if m>0 then begin n:=n+1; s:=s+m end; until m=0; writeln('Сумма положительных чисел: ', s); s:=s/n; writeln('Среднее арифметическое положительных чисел: ', s) end.

Задание 8. Напишите программу, в которой осуществляется ввод целых чисел (ввод осуществляется до тех пор, пока не будет введен ноль) и определение максимального (наибольшего) из введённых чисел. Используйте оператор repeat.

program z_8; var m, s: integer; begin repeat readln (m); if m>s then s:=m; until m=0; writeln('Наибольшее число: ', s) end.

Задание 9. Напишите программы вычисления наибольшего общего делителя НОД двух целых чисел:

а) используя оператор repeat:

program z9_a; var a,b,с: integer; begin write('Введите два числа: '); readln(a, b); if a < b then с := a + 1 else с := b + 1; repeat с := с - 1 until (a mod с = 0) and (b mod с = 0); write('NOD = ', с) end.

б) используя оператор while:

program z9_b; var a,b: integer; begin writeln('Введите два числа: '); readln(a, b); while a <> b do if a > b then a := a - b else b := b - a; writeln('NOD = ', a); end.

Задание 10. Сколько раз будет выполнен цикл?
а) for i:=0 to 15 do s:=s+1;
б) for i:=10 to 15 do s:=s+1;
в) for i:=-l to 1 do s:=s+1;
г) for i:=10 to 10 do s:=s+1;
д) k:=5; for i:=k-1 to k+1 do s:=s+1;

а) 16 раз
б) 6 раз
в) 3 раза
г) 1 раз
д) 3 раза

Задание 11. Напишите программу, которая 10 раз выводит на экран ваши имя и фамилию.

program z11; var a, b: string; i: integer; begin write('Введите имя: '); readln(a); write('Введите фамилию: '); readln(b); for i:=0 to 9 do writeln (a,' ',b); end.

Задание 12. Напишите программу, выводящую на экран изображение шахматной доски, где черные клетки изображаются звёздочками, а белые – пробелами.

program z11; var a, b: string; i, k, n: integer; begin a:='*'; b:=' '; for i:=0 to 3 do begin for k:=0 to 3 do write (b,a); writeln; for n:=0 to 3 do write (a,b); writeln; end; end.

Задание 13. Напишите программу, которая вычисляет сумму:
а) первых n натуральных чисел;
б) квадратов первых n натуральных чисел;
в) всех чётных чисел в диапазоне от 1 до n;
г) всех двузначных чисел.

program z13; var i, z1, z2, z3, z4, n: integer; BEGIN write('Введите n: '); readln(n); z1 := 0; z2 := 0; z3 := 0; z4 := 0; for i := 1 to n do begin z1 := z1 + i; z2 := z2 + sqr(i); if i mod 2 = 0 then z3 := z3 + i; end; for i := 10 to 99 do z4 := z4 + i; writeln('Сумма первых n натуральных чисел: ', z1); writeln('Сумма квадратов первых n натуральных чисел: ', z2); writeln('Сумма всех четных чисел: ', z3); writeln('Сумма всех двухзначных чисел: ', z4); END.

Задание 14. Напишите программу, которая генерирует 10 случайных чисел в диапазоне от 1 до 20, выводит эти числа на экран и вычисляет их среднее арифметическое.

program z13; var i, s, d: integer; sr: real; BEGIN s:=0; for i:=1 to 10 do begin d:= random(20)+1; writeln(i, ' число: ', d); s:=s+d end; sr:=s/i; writeln('Среднее арифметическое: ', sr) END.

Задание 15. Запишите на языке Паскаль программы решения задач 33 и 34 из параграфа 2.4. Используйте оператор for.

program z15_1; var i, a, b, k: integer; BEGIN write('Введите первый множитель: '); readln (a); write('Введите второй множитель: '); readln (b); k:=0; for i:=1 to b do begin k:=k+a; end; writeln(a, '*', b, '=', k) END.

В программе мы вводим изначальную численность населения. Далее она считает количество населения в каждый год и итогом будет количество населения через три года.

program z15_2; var i: integer; k, a: real; BEGIN write('Введите население города: '); readln (a); k:=0; for i:=1 to 3 do begin a:=1.05*a; writeln(i, ' год: ', a, ' человек') end; writeln('Численность населения через 3 года: ', a) END.

Задание 16. Напишите программу, которая выводит на экран таблицу степеней двойки (от нулевой до десятой).

Десятую степень не добавили в цикл, она отрабатывает после цикла и выводит эту степень ровно по вертикали.

program z16; var i, k, a: integer; BEGIN a:=2; k:=1; writeln('Таблица степеней двойки:'); writeln('0 1'); for i:=1 to 9 do begin k:=k*a; writeln(i,' ',k); end; k:=k*a; writeln('10 ',k); END.

Задание 17. Напишите программу, которая выводит на экран таблицу умножения на n (n – целое число от 2 до 10, вводимое с клавиатуры).

program z17; var i, k, n: integer; BEGIN write('Введите n>>'); readln(n); for i:=2 to 10 do begin k:=n*i; writeln(n,' * ',i,' = ',k) end; END.

Задание 18. Какой из трёх рассмотренных операторов цикла является, по вашему мнению, основным, т.е. таким, что им можно заменить два других?

Рассмотренные операторы:
repeat until
while do
for 1 to n do

Я думаю, что циклы «repeat until» и «while do» могут заменить другие циклы. Цикл «for» не сможет заменить других, так как в этом цикле происходит известное количество повторений. А в двух других разница в том, что цикл «repeat until» сначала выполняется тело цикла и потом проверяется условие, а с циклом «while do» наоборот.

Решение заданий из учебника Информатика 8 класс Босова, параграф 3.5 Программирование циклических алгоритмов. Программирование циклов с заданным условием продолжения работы, с заданным условием окончания работы, с фиксированным числом повторений, различные варианты программирования циклического алгоритма.

Составить программу, которая запрашивает числа и считает количество введенных отрицательных чисел, до тех пор, пока пользователь не введет 0. Использовать цикл с предусловием.
На обычном паскале, не турбо.

Program z1;
var s:integer;a:double;
begin
s:=0;a:=1;
while a<>0 do begin
readln(a);
if a end;
writeln(s);
readln
end.

Новые вопросы в Информатика

срочно даю 15 балов ​

[Python] За допомогою циклу введи 10 ключів та значень у словник Перевір чи є у словнику ключ зі списку, якщо є виведи значення словарь <1:”banan”, “ … cat”: “кошка”, “34”: “aslan”,'drink': 'juice', 'food': 'spaghetti', 'cutlery': 'fork' >Список [1,”34”,45,’drink’,’fork’]

спам этоможете ответить одним словому меня просто тест​

За допомогою циклу введи 10 ключів та значень у словник. Перевір чи є у словнику ключ зі списку, якщо є виведи значення. словарь <1:”banan”, “cat”: “ … кошка”, “34”: “aslan”,'drink': 'juice', 'food': 'spaghetti', 'cutlery': 'fork' >Список [1,”34”,45,’drink’,’fork’]

К.Ю. Поляков, Е.А. Еремин — Язык Си и Си++

Только сегодня: скидка до 20% в подарок на первый заказ.
Какую работу нужно написать?

Другую работу

Помощник Анна

08.11.2014
Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин 11

В языке C существует функция rand для получения случайных (точнее, псевдослучайных) целых чисел в диапазоне [0,RAND_MAX] , где RAND_MAX – постоянная, определённая в заголо вочном файле stdlib.h (для C++ вместо него используется файл cstdlib ). Целое число в за данном диапазоне [a,b] можно получить с помощью операции взятия остатка и простой ариф метики: n = a + rand()%(b-a+ 1 ); Например, для того, чтобы записать в целую переменную n случайное число в диапазоне от 1 до 6 (результат бросания кубика), можно использовать оператор n = 1 + rand() % 6 ; Вещественное случайное число на отрезке [x,y] получается так: z = x + (y-x)*rand()/RAND_MAX; Важно, чтобы при использовании этой формулы хотя бы одна из граничных переменных, x или y , была вещественной (подумайте, почему). ? Контрольные вопросы 1. Какие типы данных вы знаете? 2. Как вы думаете, почему во многих языках программирования есть несколько целочислен ных и вещественных типов данных? 3. Какие данные записываются в логические переменные? Почему они обычно занимают це лое число байтов? 4. Что такое приоритет операций? Зачем он нужен? 5. В каком порядке выполняются операции, если они имеют одинаковый приоритет? 6. Зачем используются скобки? 7. Что происходит, если в выражения входят переменные разных типов? Какого типа будет ре зультат? 8. Опишите операции деления и взятия остатка. В чем их особенность в языках C и C++? Поду майте, почему в математике они не определены для вещественных чисел. 9. Расскажите о проблеме вычисления остатка от деления в различных языках программиро вания. Обсудите в классе этот вопрос. 10. Какие стандартные математические функции вы знаете? В каких единицах задается аргу мент тригонометрических функций? 11. Как выполнить округление (к ближайшему целому) в языках C и C++? 12. Какие числа называют случайными? Зачем они нужны? 13. Как получить «естественное» случайное число? Почему такие числа почти не используются в цифровой технике? 14. Чем отличаются псевдослучайные числа от случайных? 15. Какие функции для получения псевдослучайных чисел вы знаете? Задачи и задания 1. Найдите в справочной системе или в Интернете диапазон значений для вещественных типов данных. 2. Напишите программу, которая находит сумму, произведение и среднее арифметическое трёх целых чисел, введённых с клавиатуры. Например, при вводе чисел 4, 5 и 7 мы должны получить ответ 4+5+7=16, 4*5*7=140, (4+5+7)/3=5.333333 где X k + 1 и X k – следующее и предыдущее псевдослучайные числа; запись n mod k означает остаток от деления n на k ; a , c и m – целые числа, подобранные так, чтобы в получаемой цепочке чисел было как можно меньше закономерностей. Например, в библиотеке Microsoft C использовались значения a = 214013 , c = 2531011 и m = 2 31 .

http://kpolyakov.spb.ru

08.11.2014
Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин 12

3. Напишите программу, которая вводит радиус круга и вычисляет его площадь и длину ок ружности. Можно использовать константу M_PI , равную числу π (эта константа определена в математической библиотеке). 4. Напишите программу, которая меняет местами значения двух переменных в памяти. 5. *В предыдущей задаче попробуйте найти решение, которое не использует дополнительные переменные. 6. Напишите программу, которая возводит введённое число в степень 10, используя только че тыре операции умножения. Что произойдет, если ввести большое число, например, 78? По пытайтесь объяснить полученный результат. 7. Вычислите значение вещественной переменной c при a = 2 и b = 3 :

а) с = a + 1 / 3 ;
б) с = a + 4 / 2 * 3 + 6 ;
в) с = ( a + 4 ) / 2 * 3 ;
г) с = a + 4 ) /(b + 3 ) * a;

8. Вычислите значение целочисленной переменной c при a = 26 и b = 6 :

а) c = a % b + b;
б) c:= a / b + a;
в) b = a / b;
c = a / b;
г) b = a / b + b;
c = a % b + a;
д) b = a % b + 4 ;
c = a % b + 1 ;
е) b = a / b;
c = a %(b + 1 );
ж) b = a % b

c = a /(b + 1 ) 9. Выполните предыдущее задание при a = -22 и b = 4 . 10. Напишите программу, которая вводит трёхзначное число и разбивает его на цифры. напри мер, при вводе числа 123 программа должна вывести «1,2,3». 11. Напишите программу, которая вводит координаты двух точек на числовой оси и выводит расстояние между ними. 12. Напишите программу, которая округляет вещественное число до ближайшего целого. 13. Напишите программу, которая вводит два целых числа, а и b ( a < b ), и выводит на экран 5 случайных целых чисел на отрезке [ a , b] . 14. Напишите программу, которая моделирует бросание двух игральных кубиков: при запуске выводит случайное число в диапазоне от 2 до 12. 15. Напишите программу, которая случайным образом выбирает дежурных: выводит два раз личных случайных числа в диапазоне от 1 до N , где N – количество учеников вашего класса. Какая проблема может при этом возникнуть? 16. Напишите программу, которая вводит два вещественных числа, а и b ( a < b ), и выводит на экран 5 случайных вещественных чисел в полуинтервале [ a , b ). § 57. Ветвления Условный оператор Возможности, описанные в предыдущих параграфах, позволяют писать линейные програм мы, в которых операторы выполняются последовательно друг за другом, и порядок их выполне ния не зависит от входных данных. В большинстве реальных задач порядок действий может несколько изменяться, в зависимо сти от того, какие данные поступили. Например, программа для системы пожарной сигнализации

http://kpolyakov.spb.ru

cout << "Андрей старше" ; else

cout << "Одного возраста" ; else

cout << "Борис старше" ;

08.11.2014
Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин 13

должна выдавать сигнал тревоги, если данные с датчиков показывают повышение температуры или задымленность. Для этой цели в языках программирования предусмотрены условные операторы. Например, для того, чтобы записать в переменную M максимальное из значений переменных a и b , можно использовать оператор: if ( a > b ) M = a; else M = b; Здесь использованы да ключевых слова: if означает «если», а else – «иначе». Если условие в скобках после if истинно, выполняется оператор, записанный после скобок, а если условие лож но, то выполняется оператор после слова else . Обратите внимание, что после слова else ника кого условия нет. В приведенном примере условный оператор записан в полной форме: в обоих случаях (ис тинно условие или ложно) нужно выполнить некоторые действия. Программа выбора максималь ного значения может быть написана иначе: M = a; if (b > a) M = b; Здесь использован условный оператор в неполной форме, потому что в случае, когда условие ложно, ничего делать не требуется (нет слова else и операторов после него). Для того, чтобы сделать текст программы более понятным, всё тело условного оператора сдвинуто вправо. Вообще говоря, это не обязательно: вся программа на языках C и C++ может быть записана в одну строку. Тем не менее, запись с отступами значительно повышает читаемость программ, и мы далее будем её использовать 6 . Часто при каком то условии нужно выполнить сразу несколько действий. Например, в зада че сортировки значений переменных a и b по возрастанию нужно поменять местами значения этих переменных, если a > b : if ( a > b ) < c = a; a = b; b = c; >В этом случае нужно записать составной оператор , в котором между фигурными скобками мо жет быть сколько угодно команд. Кроме знаков < и >, в условиях можно использовать другие знаки отношений: = (больше или равно), == (равно) и != (не равно). Внутри условного оператора могут находиться любые операторы, в том числе и другие ус ловные операторы. Например, пусть возраст Андрея записан в переменной a , а возраст Бориса – в переменной b . Нужно определить, кто из них старше. Одним условным оператором тут не обой тись, потому что есть три возможных результата: старше Андрей, старше Борис и оба одного воз раста. Решение задачи можно записать так: if ( a > b ) printf( «Андрей старше» ); else if ( a == b ) printf( «Одного возраста» ); else printf( «Борис старше» ); 6 В некоторых языках, например, в языке Python, отступы обязательны, и все строки одного уровня вложен ности должны иметь одинаковые отступы.

http://kpolyakov.spb.ru

08.11.2014
Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин 14

Условный оператор, проверяющий равенство, находится внутри блока else , поэтому он называ ется вложенным условным оператором. Как видно из этого примера, использование вложенных условных операторов позволяет выбрать один из нескольких (а не только из двух) вариантов. Нужно помнить правило: любой блок else относится к ближайшему предыдущему опера тору if , у которого такого блока еще не было. Например, оператор if (a > b) printf( «А» ); else if (a == b) printf( » ft65″>else printf( «Б» ); может быть записан с выделением структуры так: if (a > b) printf( «А» ); else if (a == b) printf( » p195 ft65″>else printf( «Б» ); Здесь второй блок else относится к ближайшему (второму, вложенному) условному оператору, поэтому буква Б будет выведена только тогда, когда оба условия окажутся ложными. Сложные условия Предположим, что ООО «Рога и Копыта» набирает сотрудников, возраст которых от 25 до 40 лет включительно. Нужно написать программу, которая запрашивает возраст претендента и выда ет ответ: «подходит» он или «не подходит» по этому признаку. На качестве условия в условном операторе можно указать любое логическое выражение, в том числе сложное условие, составленное из простых отношений с помощью логических опера ций (связок) «И», «ИЛИ» и «НЕ» (см. главу 3). В языках C и C++ они записываются так: «И» – && , «ИЛИ» – || и «НЕ» – ! (восклицательный знак). Пусть в переменной v записан возраст сотрудника. Тогда нужный фрагмент программы бу

дет выглядеть следующим образом: if ( v >= 25 && v
if ( v >= 25 && v
printf( «подходит» ); cout
else подходит» ); else
printf( «не cout

Обратите внимание, что каждое простое условие не обязательно заключать в скобки. Это связано с тем, что в языках C и C++ отношения имеют более высокий приоритет, чем логические операции, которые выполняются в таком порядке: сначала все операции «НЕ», затем – «И», и в самом кон це – «ИЛИ» (во всех случаях – слева направо). Для изменения порядка действий используют круг лые скобки. Множественный выбор Условный оператор предназначен, прежде всего, для выбора одного из двух вариантов (простого ветвления). Иногда нужно сделать выбор из нескольких возможных вариантов. Пусть, например, в переменной m хранится номер месяца, и нужно вывести на экран его русское название. Конечно, в этом случае можно использовать 12 условных операторов:

if (m == 1 ) printf( «январь» ); if (m == 1 ) cout
if (m == 2 ) printf( «февраль» ); if (m == 2 ) cout
. .
if (m == 12 ) printf( «декабрь» ); if (m == 12 ) cout

Вместо многоточия могут быть записаны аналогичные операторы для остальных значений m . Но в языках C и С++ для подобных случаев есть специальный оператор выбора:

switch ( m )

switch ( m )
case 1 : printf( «январь» ); case 1 : cout
break ; case 2 : break ;
case 2 : printf( «февраль» ); cout
. break ; . break ;

http://kpolyakov.spb.ru

08.11.2014
Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин 15
case 12 : cout
case 12 : printf( «декабрь» );
break ; break ;
default : printf( «ошибка» ); default : cout
> >

Кроме очевидных 12 блоков здесь добавлен еще один, который сигнализирует об ошибочном номере месяца. Он начинается ключевым словом default . Обратите внимание, что каждый блок заканчивается оператором break (в переводе с анг лийского – «прервать»). Если его не поставить, программа перейдет на следующий блок. Поэтому

программа switch ( m )
switch ( m )
case 1 : printf( «январь» ); case 1 : cout
case 2 : printf( «февраль» ); case 2 : cout
case 3 : printf( «март» ); case 3 : cout
default : printf( «ошибка» ); default : cout
> >

для случая m = 2 выведет на экран текст февральмартошибка ? Контрольные вопросы 1. Чем отличаются разветвляющиеся алгоритмы от линейных? 2. Как вы думаете, почему не все задачи можно решить с помощью линейных алгоритмов? 3. Как вы думаете, хватит ли линейных алгоритмов и ветвлений для разработки любой про граммы? 4. Почему нельзя выполнить обмен значений двух переменных в два шага: a = b; b = a ? 5. Чем отличаются условные операторы в полной и неполной формах? Как вы думаете, можно ли обойтись только неполной формой? 6. Какие отношения вы знаете? Как обозначаются отношения «равно» и «не равно»? 7. Что такое сложное условие? 8. Как определяется порядок вычислений в сложном условии? 9. Зачем нужен оператор выбора? Как можно обойтись без него? 10. Как в операторе выбора определить, что нужно делать, если ни один вариант не подошёл? 11. Зачем в операторе выбора используется оператор break ? 12. Как выполнить для какого то варианта несколько операторов? Задачи и задания 1. Покажите, что приведенная программа не всегда верно определяет максимальное из трёх чисел, записанных в переменные a , b и c :

if (a > b) M = a;
else M = b;
if (с > b) M = с;
else M = b;

Приведите контрпример, то есть значения переменных, при котором в переменной M будет получен неверный ответ. Как нужно доработать программу, чтобы она всегда работала пра вильно? 2. Напишите программу, которая выбирает максимальное и минимальное из пяти введённых чисел. 3. Напишите программу, которая определяет, верно ли, что введённое число – трёхзначное. 4. Напишите программу, которая вводит номер месяца и выводит название времени года. Оператор выбора использовать не разрешается. При вводе неверного номера месяца долж но быть выведено сообщение об ошибке. 5. Решите предыдущую задачу с помощью оператора выбора. 6. Напишите программу, которая вводит с клавиатуры номер месяца и определяет, сколько дней в этом месяце. При вводе неверного номера месяца должно быть выведено сообще ние об ошибке.

http://kpolyakov.spb.ru

08.11.2014
Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин 16

7. Напишите программу, которая вводит с клавиатуры номер месяца и день, и определяет, сколько дней осталось до Нового года. При вводе неверных данных должно быть выведено сообщение об ошибке. 8. Напишите программу, которая вводит возраст человека (целое число, не превышающее 120) и выводит этот возраст со словом «год», «года» или «лет». Например, «21 год», «22 года», «25 лет». 9. Напишите программу, которая вводит целое число, не превышающее 100, и выводит его прописью, например, 21 → «двадцать один». 10. Напишите программу, которая вводит координаты точки на плоскости и определяет, попала ли эта точка в заштрихованную область.

а) y 1 б) y в) y г) y
x x -1 1 x 0 2 x

y = − x 11. Напишите два варианта программы, которая вводит координаты точки на плоскости и опре деляет, попала ли эта точка в заштрихованную область. Один вариант программы должен использовать сложные условия, второй – обходиться без них.

а) y б) y y = sin( x ) в) y y = x
x 2 + y 2 = 4 y = 0,5 y = 2 − x 2
x x
y = x x
x = 2
г) y д) е) y
y y = x y = x
x 2 + y 2 = 1
y = x 2 − 2 x 2 + y 2 = 1
x x x
y = x y = − x y = − x
ж) y з) и) y
y
y = 1 − x y = 2 x 2 y = 1 y = 1
y = x − 1
x = 1 x x
x = 1
0 x x 2 + y 2 = 1 x 2 + y 2 = 1

§ 58. Циклические алгоритмы Как организовать цикл ? Цикл – это многократное выполнение одинаковых действий. Доказано, что любой алгоритм может быть записан с помощью трёх алгоритмических конструкций: циклов, условных операторов и последовательного выполнения команд (линейных алгоритмов). Простейший цикл, который 10 раз выводит на экран слово «привет», на псевдокоде записы вается так:

http://kpolyakov.spb.ru

08.11.2014
Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин 17

сделай 10 раз вывод «привет» Подумаем, как можно организовать такой цикл. Вы знаете, что программа после запуска выполняется автоматически. И при этом на каждом шаге нужно знать, сколько раз уже выполнен цикл и сколько ещё осталось выполнить. Для этого необходимо использовать ячейку памяти, в которой будет запоминаться количество выполненных шагов цикла (счётчик шагов). Сначала можно записать в неё ноль (ни одного шага не сделано), а после каждого шага цикла увеличивать значение ячейки на единицу. На псевдокоде алгоритм можно записать так (здесь и далее опера ции, входящие в тело цикла, выделяются отступами): счётчик = 0 пока счётчик < 10 < вывод "привет" увеличить счётчик на 1 >Возможен и другой вариант: сразу записать в счётчик нужное количество шагов, и после каждого шага цикла уменьшать счётчик на 1. Тогда цикл должен закончиться при нулевом значении счёт чика: счётчик = 10 пока счётчик > 0 < вывод "привет" уменьшить счётчик на 1 >Этот вариант несколько лучше, чем предыдущий, поскольку счётчик сравнивается с нулём, а такое сравнение выполняется в процессоре автоматически (см. главу 4). В этих примерах мы использовали цикл с условием , который выполняется до тех пор, пока некоторое условие не становится ложно. Циклы с условием Рассмотрим следующую задачу: определить количество цифр в десятичной записи целого положительного числа. Будем предполагать, что исходное число записано в переменную n целого типа. Сначала составим алгоритм решения этой задачи. Чтобы считать что то в программе, нужно использовать переменную, которую называют счётчиком . Для подсчёта количества цифр необхо димо как то отсекать эти цифры по одной, с начала или с конца, каждый раз увеличивая счётчик. Начальное значение счётчика должно быть равно нулю, так как до выполнения алгоритма ещё не найдено ни одно цифры. Для отсечения первой цифры необходимо заранее знать, сколько цифр в десятичной записи числа, то есть нужно заранее решить ту задачу, которую мы решаем. Следовательно, этот метод не подходит. Отсечь последнюю цифру проще – достаточно разделить число нацело на 10 (поскольку речь идет о десятичной системе). Операции отсечения и увеличения счётчика нужно выполнять столько раз, сколько цифр в числе. Как же «поймать» момент, когда цифры кончатся? Несложно понять, что в этом случае результат очередного деления на 10 будет равен нулю, это и говорит о том, что отброшена последняя оставшаяся цифра. Изменение перемен

ной n и счётчика для начального значения 1234 можно записать в виде n счётчик
1234 0
таблицы, показанной справа. Псевдокод выглядит так:
123 1
счётчик = 0
12 2
пока n > 0
1 3
отсечь последнюю цифру n 0 4

увеличить счётчик на 1 > Запись такого цикла на языке C выглядит так:

http://kpolyakov.spb.ru

08.11.2014
Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин 18

count = 0 ; while ( n > 0 ) < n = n / 10 ; count ++; >Здесь целочисленная переменная счётчик имеет имя count . Слово while переводится с англий ского как «пока», за ним в скобках записывается условие работы цикла (в данном случае – «пока n > 0 ). Фигурные скобки ограничивают составной оператор. Если в теле цикла нужно выполнить только один оператор, эти скобки можно не ставить. Напомним, что операция деления для целых чисел всегда даёт целое число (остаток отбрасывается). Обратите внимание, что проверка условия выполняется в начале очередного шага цикла. Такой цикл называется циклом с предусловием (то есть с предварительной проверкой условия) или циклом «пока». Если в начальный момент значение переменной n будет нулевой или отрица тельное, цикл не выполнится ни одного раза. В данном случае количество шагов цикла «пока» неизвестно, оно равно количеству цифр введенного числа, то есть зависит от исходных данных. Кроме того, этот же цикл может быть ис пользован и в том случае, когда число шагов известно заранее или может быть вычислено:

k = 0 ; k = 0 ;
while ( k < 10 ) while ( k < 10 )
printf ( «привет\n» ); cout
k ++; k ++;
> >

Если условие в заголовке цикла никогда не нарушится, цикл будет работать бесконечно дол го. В этом случае говорят, что «программа зациклилась». Например, если забыть увеличить пере менную k в предыдущем цикле, программа зациклится:

k = 0 ; k = 0 ;
while ( k < 10 ) while ( k < 10 )
printf ( «привет\n» ); cout
> >

Во многих языках программирования существует цикл с постусловием , в котором условие проверяется после завершения очередного шага цикла. Это полезно в том случае, когда нужно обязательно выполнить цикл хотя бы один раз. Например, пользователь должен ввести с клавиа туры положительное число. Для того, чтобы защитить программу от неверных входных данных,

можно использовать такой цикл с постусловием: do
do
printf( «Введите n > 0: » ); cout 0: » ;
scanf ( «%d» , &n ); cin >> n;
> >
while ( n

while ( n

Этот цикл закончится тогда, когда условие n 0 . А это значит, что пользователь ввел допустимое (положительное) значение. Обратите внимание на важную особенность этого вида цикла: при входе в цикл условие не проверяется, поэтому цикл всегда выполняется хотя бы один раз . Цикл с переменной В информатике важную роль играют степени числа 2 (2, 4, 8, 16 и т.д.) Чтобы вывести все степени двойки от 2 1 до 2 10 мы уже можем написать такую программу с циклом «пока»:

k = 1 ; k = 1 ;
n = 2 ; n = 2 ;
while ( k

) while ( k

)
printf ( «%d\n» , n ); cout

http://kpolyakov.spb.ru

for ( k = 1; k <= 10 ; k++)

cout << n << endl; n *= 2 ;

08.11.2014
Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин 19
n = n * 2 ;
n = n * 2 ;
k ++; k ++;
> >

Вы наверняка заметили, что переменная k используется трижды (см. выделенные блоки): в опе раторе присваивания начального значения, в условии цикла и в теле цикла (увеличение на 1). Чтобы собрать все действия с ней в один оператор, во многие языки программирования введен особый вид цикла – цикл с переменной. В заголовке этого цикла задается начальное значение этой переменной, условие продолжения цикла и изменение переменной в конце каждого шага цикла: n = 2 ; for ( k = 1; k С каждым шагом цикла переменная цикла может не только увеличиваться, но и уменьшать ся. Следующая программа печатает квадраты натуральных чисел от 10 до 1 в порядке убывания:

for ( k = 10 ; k >= 1 ; k— ) for ( k = 10 ; k >= 1 ; k— )
printf( «%d\n» , k*k); cout
Шаг изменения переменной цикла может быть любым числом. Например, следующий цикл
выводит квадраты нечётных чисел: for ( k = 1 ; k

)
for ( k = 1 ; k

k+= 2 ) k+= 2
printf( «%d\n» , k*k); cout

Вложенные циклы В более сложных задачах часто бывает так, что на каждом шаге цикла нужно выполнять об работку данных, которая также представляет собой циклический алгоритм. В этом случае получа ется конструкция «цикл в цикле» или «вложенный цикл». Предположим, что нужно найти все простые числа в интервале от 2 до 1000. Простейший (но не самый быстрый) алгоритм решения такой задачи на псевдокоде выглядит так: сделать для n от 1 до 1000 если число n простое то вывод n Как же определить, что число простое? Как известно, простое число делится только на 1 и само на себя. Если число n не имеет делителей в диапазоне от 2 до n-1 , то оно простое, а если хотя бы один делитель в этом интервале найден, то составное. Чтобы проверить делимость числа n на некоторое число k , нужно взять остаток от деления n на k . Если этот остаток равен нулю, то n делится на k . Таким образом, программу можно запи сать так (здесь n , k и count – целочисленные переменные, count обозначает счётчик делите лей):

for (n = 2 ; n

for (n = 2 ; n

Попробуем немного ускорить работу программы. Делители числа обязательно идут в парах, причём в любой паре меньший из делителей не превосходит n (иначе получается, что произве дение двух делителей, каждый из которых больше n , будет больше, чем n ). Поэтому внутрен ний цикл можно выполнять только до значения n вместо n-1 . Для того, чтобы работать только с целыми числами (и таким образом избежать вычислительных ошибок), лучше заменить условие

http://kpolyakov.spb.ru

08.11.2014
Информатика, 10 класс К.Ю. Поляков, Е.А. Еремин 20

k ≤ n на равносильное ему условие k 2 ≤ n . При этом потребуется перейти к внутреннему циклу с условием: count = 0 ; k = 2 ; while ( k*k Чтобы еще ускорить работу цикла, заметим, что когда найден хотя бы один делитель, число уже заведомо составное, и искать другие делители в данной задаче не требуется. Поэтому можно за кончить цикл. Для этого в условие работы цикла добавляется условие n % k != 0 , связанное с имеющимся условием с помощью операции «И», при этом можно обойтись без переменной count : k = 2 ; while ( k*k n ) printf( «%d\n» , n); После выхода из цикла мы проверяем, какое условие было нарушено. Если k*k>n (нарушено первое условие в заголовке цикла), то число n простое. В любом вложенном цикле переменная внутреннего цикла изменяется быстрее, чем пере менная внешнего цикла. Рассмотрим такой вложенный цикл: for ( i = 1 ; i > На первом шаге (при i=1 ) переменная k принимает единственное значение 1. Далее, при i=2 переменная k принимает последовательно значения 1 и 2. На следующем шаге при i=3 пере менная k проходит значения 1, 2 и 3, и т.д. ? Контрольные вопросы 1. Что такое цикл? 2. Сравните цикл с переменной и цикл с условием. Какие преимущества и недостатки есть у каждого из них? 3. Что означает выражение «цикл с предусловием»? 4. В каком случае цикл с предусловием не выполняется ни разу? 5. В каком случае программа, содержащая цикл с условием, может зациклиться? 6. В каком случае цикл с переменной не выполняется ни разу? 7. Верно ли, что любой цикл с переменной можно заменить циклом с условием? Верно ли об ратное утверждение? 8. В каком случае можно заменить цикл с условием на цикл с переменной? 9. Как будет работать приведенная программа, которая считает количество цифр введённого числа, при вводе отрицательного числа? Если вы считаете, что она работает неправильно, укажите, как её нужно доработать. Задачи и задания

1. Найдите ошибку в программе: k = 0 ;
k = 0 ;
while ( k < 10 ) while ( k < 10 )
printf ( «привет\n» ); cout

Уроки 39 — 41
Цикл с условием. Цикл с переменной
§58. Циклические алгоритмы

1. Что такое цикл?
2. Сравните цикл с переменной и цикл с условием. Какие преимущества и недостатки есть у каждого из них?
3. Что означает выражение «цикл с предусловием»?
4. В каком случае цикл с предусловием не выполняется ни разу?
5. В каком случае программа, содержащая цикл с условием, может зациклиться? Приведите пример такой программы.
6. В каком случае цикл с переменной не выполняется ни разу?
7. Верно ли, что любой цикл с переменной можно заменить циклом с условием? Верно ли обратное утверждение? Ответ обоснуйте.
8. В каком случае можно заменить цикл с условием на цикл с переменной?
9. Как будет работать приведённая в параграфе программа, которая считает количество цифр введённого числа, при вводе отрицательного числа? Если вы считаете, что она работает неправильно, укажите, как её нужно доработать.

Подготовьте сообщение

а) «Операторы цикла в языке Си»
б) «Операторы цикла в языке Python»

Следующая страница Задачи (1 — 16)

Cкачать материалы урока

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *