Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование 1 к ПОВТ.doc
Скачиваний:
4
Добавлен:
09.11.2019
Размер:
1.14 Mб
Скачать

1.3. Оператор цикла со счётчиком

Он имеет следующий вид:

for          (k = m;                   k<= n;                k++) S;

            Инициализация              Проверка          Увеличение

где k-параметр цикла (счетчик);

m,n – начальное и конечное, соответственно, значения параметра k;

for ( для )- служебное слово.

Оператор S в такой конструкции цикла выполняется для каждого значения счетчика: от начального m до конечного n, включительно, с шагом 1. Такой цикл со счетчиком используется, когда заранее известно число повторений тела цикла S. Управление циклом осуществляется на основании сравнения текущего значения счетчика с заранее заданным диапазоном его изменения (m,n). В качестве m и n могут быть конкретные числа, переменные или выражения. Если m>n, то тело цикла не выполняется ни разу. Если необходимо выполнить группу операторов их заключают в скобки {}, кроме этого в качестве тела цикла может использоваться вложенный цикл.

Можно организовать цикл по убыванию:

for (k=n; k=>m;k--) S;

Параметр цикла k принимает последовательно убывающие значения от n до m с шагом -1.

Шаг можно задавать самостоятельно. Например следующий цикл с шагом 3 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

for(k=0;k<=10;k+=3)

1.4. Операторы завершения цикла

Для всех операторов цикла выход из цикла осуществляется как вследствие естественного окончания оператора цикла, так и с помощью операторов перехода и выхода. В C++ определены стандартные процедуры Break и

Continue. Процедура Break выполняет безусловный выход из цикла. Процедура Continue обеспечивает переход к началу новой итерации цикла.

II.Экспериментальный раздел работы

Пример 1. Пусть задано натуральное число m. Необходимо найти минимальное число n такое, что факториал n! > m.

По определению, n!=1*2*3*…n.Таким образом, решение поставленной задачи сводится к последовательному увеличению значения n, вычисления n! и сравнения его с заданным числом m. Как только величина n! станет больше m, вычисления нужно прекратить и вывести результат. Последовательное увеличение n организуем с помощью цикла while, а для вычисления факториала числа воспользуемся следующими соотношениями:

В этой последовательности первый член равен 1, а каждый последующий равен предыдущему, умноженному на k. Такое соотношение называется рекуррентным, что означает «возвращающийся».

Из школьного курса математики нам известны такого рода соотношения для членов арифметической и геометрической прогрессий, где d – разность, q – знаменатель. Рекуррентные соотношения играют важную роль в программировании, т.к. в сочетании с операторами циклов создают мощный вычислительный инструментарий.

Запишем алгоритм нашей задачи:

1. «подготовка» цикла: ввод m; k=1; p=1;

2.«управление» циклом: если p<m, то выполнять пункт 3 (тело цикла),

иначе выполнять пункт 4 (вывод результата);

3.«тело» цикла: к=к+1; p=p*k; возврат к пункту 2;

4.вывод результата n=k.

Оформим его в виде подпрограммы-функции:

#include <iostream.h>

#include <conio.h>

int Min_N(int m)

{

int k=1,p=1;

while (p<m)

{ k++; p*=k;}

return k;

}

void main (void)

{

int m;

cout<<"Введите число m=?"<<endl; cin>>m;

cout<<" Минимальное значение n="<<Min_N(m)<<endl;

getch();

}

Провести отладку и тестирование программы. Вычислить значение n для случаев, когда m=MAXINT и MAXLONG.

Пример 2.Напишем логическую функцию, которая будет возвращать значение true, если натуральное число n простое, и false – в противном случае.

Напомним, что натуральное число называется простым, если оно делится без остатка только на единицу и само себя. Очевидно также, что число n – составное, если оно делится хотя бы на одно из чисел 2,3,…,n-1.

Таким образом, при n>2 необходимо проверить делимость n на каждое из чисел k=2,3, … n-1. На самом деле, как показано в теории чисел, можно сократить сверху диапазон поиска до целой части корня квадратного из n: .

Составим программу на языке C++:

bool Simple(int n)

{

bool b=true; int k=2,max;

max=sqrt(n)+1;

while (b&&(k<max))

{

if ((n%k)==0) b=false;

k++;

}

return b;

}

Поэкспериментируйте с программой. Простые числа 2,3,5,7,11,13,…расположены в натуральном ряду весьма загадочным образом. Двигаясь по этой последовательности чисел необходимо вычислить простое число по его номеру.

Пример 3. Используя алгоритм Евклида, составим программу определения наибольшего общего делителя числа a на b: НОД(a,b).

Один из вариантов этого алгоритма состоит в том, что необходимо последовательно находить остатки от деления :

a на b : ; r1 = a mod b;

b на ; r2= b mod r1;

на ; r3 = r1 mod r2;

..........................

до тех пор, пока не станет равным нулю. Итак,

НОД(a,b) = НОД(b,r1) = НОД(r1,r2) =... = НОД(rn,0) = rn .

Например,

НОД(18,12) = НОД(12,6) = НОД(6,0) = 6 .

Напишем подпрограмму-функцию:

int GCD(int a,int b)

{

// Greatest Common Divisor -наибольший общий делитель

int r1,r2,r3;

if (a>b){ r1=a; r2=b;}

else { r1=b; r2=a;}

while(r2 !=0)

{

r3=r1%r2;

r1=r2; r2=r3;

}

return r1;

}

Введите, отладьте и протестируйте программу.

Пример 4. Напишем программу, в которой для заданного натурального числа n, ищется число q, записанное цифрами в обратном порядке. К примеру, если n=1965, то q=5691.

Запишем натуральное число n в виде n=akak-1...a0 , где ai - цифры, составляющие его в десятичной системе счисления:

akak-1...a0 = a0100 + a1101 + ... + ak10k

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

a0a1...ak = ak100 + ak-1101 + ... + a010k .

Значение a0 можно найти как остаток от деления числа n на 10. Разделив n на 10, и найдя снова остаток, получим цифру а1, ... В противоположность этому, число q формируется путем умножения на 10 , полученных остатков от деления числа n. Это последовательное умножение на 10 можно осуществить в виде:

a0a1...ak = ak + 10( ak-1 + 10(ak-2 + ... + 10(a1 + 10a0 )...)

Пусть тогда

Теперь нетрудно составить систему рекуррентных соотношений:

которую нужно «прокрутить» в цикле до тех пор пока . Начальное значение искомой величины .

Запишем алгоритм вычислений:

1) «подготовка» цикла: ввод n; k=0; p=n; q=0;

2) «управление» циклом: если p>0, то выполнять пункт 3 (тело цикла),

иначе выполнять пункт 4 (вывод результата);

3) «тело» цикла: a=p mod 10; к=к+1; p=p div 10; q=q*10 +a; возврат к пункту 2;

4) вывод результата q.

Оформим его в виде подпрограммы-функции:

int Inv_N(int n)

{

int a,p=n,q=0,k=0;

while(p>0)

{

a=p%10;k++;

p/=10; q=q*10+a;

}

return q;

}

Отладить, протестировать и провести эксперимент с программой.

Напишите программу перевода чисел из двоичной системы счисления в десятичную; из системы счисления m в систему счисления n.

Ш. Раздел заданий для самостоятельной работы

Задачи самостоятельного раздела необходимо решить с использованием всех изученных операторов повторений.

A.

  1. Составить программы.

    1. Дано натуральное число n. Вычислить количество цифр данного числа. Найти ( ).

    2. Определить сумму и произведение цифр целого числа. Найти сумму цифр, больших 5.

    3. Найти максимальную и минимальную цифры числа. Верно ли, что данное число заканчивается на них?

    4. Вычислить сколько раз данная цифра встречается в целом числе. Верно ли, что цифра А, введенная с клавиатуры, не встречается в этом числе?

    5. Определить, является ли данное натуральное число палиндромом, то есть таким, десятичная запись которого читается одинаково слева направо и справа налево. Например, палиндромы 234432, 089980, 5225 .

    6. Составить программу вычисления факториала числа n!=123...n.

    7. Составить программу, которая выдавала бы сообщение ‘ true ‘, если последовательность из N целых чисел, вводимых с клавиатуры, является возрастающей.

    8. Дано целое число. Приписать к нему такое же число.

    9. Найти все трехзначные числа, которые при увеличении на 1 делятся на 2, при увеличении на 2, делятся на 3, при увеличении на 3, делятся на 4, а при увеличении на 4 делятся на 5.

    10. Найти все трехзначные числа, которые при делении на 2, дают остаток 1, при делении на 3, - остаток 2, при делении на 4 – остаток 3, а само число делится на 5.

    11. Найти все делители числа 1234.

  1. Составить программы.

    1. Найти наименьшее общее кратное (НОК) чисел а и в, если

НОК(a,b)= ab/ НОД(a,b).

    1. Найти наибольший общий делитель трех чисел НОД(a,b,c)=НОД (НОД(a,b),c).

    2. Определить, являются ли два натуральных числа a и b взаимно простыми, то есть не имеющих общих делителей, кроме единицы.

    3. Некоторая сумма денег S помещается в банк под годовой процент Р. Вычислить, через сколько лет она удвоится.

    4. Население города составило на начало года 82 тыс. человек, а годовой прирост, который можно считать постоянным, составил 3.7%.Оперделить, через сколько лет население города составит 150 тыс. человек.

    5. В нынешнем году урожай зерновых составил 20 центнеров с гектара. В среднем каждые 2 года за счет применения передовых агротехнических приемов урожай увеличивается на 5%. Вычислить, через сколько лет урожайность достигнет 30 центнера с гектара.

    6. Найти двузначное число, обладающее тем свойством, что куб суммы его цифр равен квадрату самого числа.

    7. Найти все двузначные числа, сумма квадратов цифр которых делится на 17

    8. Найти все трехзначные числа, средняя цифра которых равна сумме первой и второй цифр.

    9. Найти все трехзначные числа, средняя цифра которых равна данному целому числу.

    10. Проверить, содержит ли квадрат данного натурального числа n, цифру 3 в свой записи.

  1. Составить программу вычисления суммы первых n=10; 20; 30 членов ряда:

    1. S=1+1/1!+1/2!+1/3!+...

    2. S=1-1/3+1/5-1/7+...

    3. S=1-1/1!+1/2!-1/3!+...

    4. S=1-1/2+1/3-1/4+...

    5. S=1+1/2+1/4+1/8+...

    6. S=1/(1*2)+1/(2*3)+1/(3*4)+...

    7. S=1/(1*3)+1/(2*4)+1/(3*5)+...

    8. S=1/(1*3)+1/(3*5)+1/(5*7)+...

    9. S=1/(3*5)+1/(7*9)+1/(11*13)+...

    10. S=1/(1*2*3)+1/(2*3*4)+1/(3*4*5)+...

    11. S=1+1/32 +1/52 +...

    12. S=1+1/24+1/34+...

    13. S=1-1/22+1/32-1/42+...

    14. S=1-1/24+1/34-...

    15. S=1+1/34+1/54+...

B.

  1. Составить программы.

    1. Дано натуральное число n. Вычислить количество цифр данного числа с использованием цикла и при помощи формулы. Какой способ лучше?

    2. Найти первую и последнюю цифры числа, поменять их местами.

    3. Вычислить сумму четных цифр целого числа, и удалить их.

    4. Если в заданном натуральном числе содержится две одинаковые цифры, программа должна выдавать сообщение.

    5. Вычислить количество симметричных натуральных чисел в промежутке от n до m.

    6. Найти все трехзначные числа, такие, что сумма цифр равна N.

    7. Найти количество различных цифр данного натурального числа.

    8. Найти все четырехзначные числа, в которых есть три одинаковые цифры.

    9. Найти все симметричные четырехзначные числа.

    10. Найти все трехзначные числа, которые состоят из разных цифр, а их сумма равна M.

    11. Найти все натуральные числа из промежутка от 1 до 200, у которых количество делителей равно N.

  1. Составить программы.

    1. Найти количество делителей натурального числа, больших K.

    2. Найти сумму четных делителей натурального числа.

    3. Разложить натуральное число на простые множители.

    4. Составить программу, проверяющую, является ли заданное натуральное число совершенным, то есть равным сумме своих положительных делителей, кроме самого этого числа.

    5. Определить, является ли данное натуральное число автоморфным. Автоморфное число равно последним разрядам квадрата этого числа.

    6. Население двух стран равно N1 и N2 , а прирост населения P1 и P2 , соответственно. Известно, что N1 > N2 и P1 < P2 . Вычислить, через сколько лет население N2 превзойдет население N1.

    7. Начав тренировки, спортсмен в первый день пробежал 10 км. Каждый следующий день он увеличивал дневную норму на 10% от нормы предыдущего дня. Через сколько дней спортсмен будет пробегать в день больше 20 км и, когда суммарный путь будет больше 200 км.

    8. Вычислить, в каких двузначных числах удвоенная сумма цифр равна их произведению.

    9. Найти все трехзначные числа, представляемые в виде суммы факториалов своих цифр.

    10. Можно ли заданное натуральное число m представить в виде суммы квадратов двух натуральных чисел.

    11. Натуральное число из n цифр называется числом Армстронга, если сумма его цифр, возведенная в n-степень, равна самому числу. Составить программу поиска чисел Армстронга в диапазоне от 0 до 2000.

  2. Составить программу вычисления суммы первых n=10; 20; 30 членов ряда:

    1. сравнить результат с * /6;

    2. сравнить результат с /4;

    3. сравнить результат с 1;

    4. сравнить результат с 3/4;

    5. сравнить результат с e;

    6. сравнить результат с 1/e;

    7. сравнить результат с ln2;

    8. сравнить результат с 2;

    9. сравнить результат с 1/2;

    10. сравнить результат с * /8;

    11. сравнить результат с * /12;

    12. сравнить результат с ;

    13. сравнить результат с

  3. Составить алгоритм и написать программу вычисления следующих сумм.

    1. , и сравнить результат с ln(x) при x>0;

    2. , и сравнить результат с ln(x) при 0< x<2;

    3. , и сравнить результат с ln(1+x) при [x] <1;

    4. , и сравнить результат с ln((1+x)/(1-x)) при [x] <1;

    5. , и сравнить результат с ln((1+x)/(x-1)) при [x] >1;

    6. , и сравнить результат с arctg(x) при [x] <1;

    7. , и сравнить результат с arctg(x) при [x] >1;

    8. , и сравнить результат с sh(x)=0.5*(ex-e-x);

    9. , и сравнитеь результат с ch(x)=0.5*(ex+e-x);

    10. ,

C.

Составить программу и вычислить сумму ряда с точностью , и . Сравнить число итераций для каждого из этих случаев.

  1. ,

  2. ,

  3. ,

  4. ,

  5. ,

  6. ,

  7. ,

  8. ,

  9. ,

  10. ,