Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Введение в программирование на языке C.doc
Скачиваний:
17
Добавлен:
13.05.2015
Размер:
532.99 Кб
Скачать

Контрольные вопросы и задания

  1. Когда возникает необходимость в организации развилки?

  2. Какая развилка называется полной? неполной?

  3. Выражение какого типа может выступать в качестве условия при организации развилки? Какие значения принимают такие выражения?

  4. Могут ли в полной развилке не выполниться операторы ни по одной из ветвей? выполниться по обеим ветвям?

  5. Записать примеры 1-3 по теме "переключатель" с помощью условного оператора. Сколько развилок понадобилось в каждом из случаев?

  6. В каком случае целесообразно использовать переключатель?

  7. Используя переключатель, решить задачу: "Определить знак заданного целого числа".

Циклы

Командой повторения или циклом называется такая форма организации действий, при которой одна и та же последовательность действий повторяется до тех пор, пока сохраняется значение некоторого логического выражения. При изменении значения логического выражения на противоположное повторения прекращаются (цикл завершается).

Для организации цикла необходимо выполнить следующие действия:

  • перед началом цикла задать начальное значение параметра;

  • внутри цикла изменять параметр цикла с помощью оператора присваивания;

  • проверять условие повторения или окончания цикла;

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

Различают циклы с известным числом повторений (цикл с параметром) и итерационные (с пред- и постусловием).

В цикле с известным числом повторений параметр изменяется в заданном диапазоне.

Если в цикле изменяется простая переменная, то она является параметром цикла; если в цикле изменяется переменная с индексом, то индекс этой переменной является параметром цикла.

Для организации цикла с известным числом повторений в C++ используется оператор for.

Структура цикла, организованного с помощью этого оператора, имеет вид:

for (выражение_1; выражение_2; выражение_3) тело_цикла

Здесь выражение_1 — инициализирующее; выражение_2 - аналог логического завершения (пока не равно нулю); выражение_3 - изменяет параметры цикла. Каждое выражение может состоять из нескольких операторов разделенных оператором запятой.

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

for(;;)

означает бесконечный цикл.

Задача 1.Дано натуральное n, действительное x. Вычислить

Разработаем алгоритм решения задачи:

  1. ввести данные - количество слагаемых n и число x;

  2. присвоить переменной, в которой будем хранить степени sin x, значение 1; S := 0;

  3. присвоить параметру цикла значение 1;

  4. если значение параметра цикла меньше n, перейти к следующему пункту, иначе к п. 9;

  5. вычислить очередную степень sin x;

  6. добавить вычисленное значение к сумме;

  7. увеличить параметр цикла на 1;

  8. перейти к п.4;

  9. вывести на печать сумму S;

  10. конец.

Листинг решения

// Программа вычисления суммы степеней sin x}

#include <iostream.h>

#include <math.h>

void main()

{

float S, X, Pr;

int N;

cout << "Введите число слагаемых и x: ";

cin >> N >> X;

Pr = 1;

S = 0;

for(int i=1; i<=N; i++)

{

Pr *= sin(X);

S += Pr;

}

cout.width(4);

cout << "Сумма равна " << S;

}

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

while (выражение) <тело цикла>;

do <тело цикла> while (выражение);

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

Цикл с постусловием выполняется хотя бы один раз. Затем проверяется значение логического выражения, если оно отлично от нуля, то операторы, входящие в цикл, выполняются, в противном случае осуществляется выход из цикла.

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

Задача 2.Найти наименьший номер члена последовательности, для которого выполняется условие |an-an-1| < e, где an=arctg an-1+1, a1=0. Вывести на экран этот номер и все элементы ai (i = 1, 2, ..., n).

Поскольку по ходу решения задачи необходимо знать an и an-1, будем запоминать их соответственно в переменных ANew и AOld.

Листинг решения

// программа последовательность

#include <iostream.h>

#include <math.h>

void main()

{

int N;

float Eps, AOld, ANew;

AOld = 0; ANew = atan(AOld) + 1;

N = 2;

cout << AOld << " " << ANew;

while(fabs(ANew - AOld) >= Eps)

{

AOld = ANew;

ANew = atan(AOld) + 1;

cout << " " << ANew;

N++;

}

cout << "Искомый номер " << N;

}

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

Задача 3.На интервале [2; n] найти натуральное число с максимальной суммой делителей.

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

Алгоритм решения задачи:

  1. ввести число n;

  2. переменной для хранения максимальной суммы делителей присвоить значение 1 (это сумма делителей числа 1);

  3. запомнить число с максимальной суммой делителей;

  4. параметру цикла I присвоить значение 2;

  5. если I больше n, перейти к п. 13, иначе - к следующему пункту;

  6. переменной для хранения очередной суммы делителей присвоить значение 0;

  7. параметру цикла K присвоить значение 1;

  8. если K больше I/2, перейти к п. 11, иначе - к следующему пункту;

  9. если I делится на K без остатка, добавить K к текущей сумме делителей;

  10. увеличить K на 1 и перейти к п. 8;

  11. сравнить текущую сумму делителей с максимальной, если максимальная меньше, запомнить новое значение и число, соответствующее этой сумме;

  12. увеличить I на 1 и перейти к п. 5;

  13. вывести число с максимальной суммой делителей и эту сумму;

  14. конец.

Листинг решения

// программа максимальная сумма делителей

#include <iostream.h>

#include <math.h>

void main()

{

int N, Sum_Max, Sum, Ch;

cout << "Введите число N: ";

cin >> N;

Sum_Max = 1; /*Максимальная сумма делителей*/

Ch = 1; /*Число с максимальной суммой делителей*/

for( int i = 2; i<= N; i++) /*Это цикл по количеству чисел*/

{

Sum = 0;

for (int k= 1; k<= i/2 + 1; k++) /*В этом цикле находим сумму делителей*/

if(i % k == 0) /*Если i нацело делится на k, то k - делитель i*/

Sum += k;

Sum += i;

if (Sum > Sum_Max)

{

Sum_Max = Sum;

Ch = i;

}

}

cout << "Максимальную сумму делителей " << Sum_Max << " имеет число " << Ch;

}

Задача 4.Дано натуральное число n. Получить все простые делители этого числа.

Листинг решения

// Программа отыскания простых делителей данного числа

#include <iostream.h>

#include <math.h>

void main()

{

int N, I, Vsp, Log_Per, Priznak;

cout << "Введите натуральное число: ";

cin >> N;

Priznak = 1; /*Признак того, не является ли введенное число простым*/

/*Пока параметр цикла не превысил квадратного корня из данного числа,

продолжаем поиск простых делителей*/

for(I = 2; I<= floor(sqrt(N)); I++)

if (N % I == 0)

{

Priznak = 0; /*Введенное число не является простым*/

Log_Per = 0; /*Логическая переменная, принимающая значение True,

если нашлись делители I, отличные от 1 и I*/

Vsp = 2;

do

{

if (I % Vsp == 0) Log_Per = 1;

Vsp++;

}

while ((Vsp < I) && (Log_Per!=1));

if ((Log_Per!=1)||(i==2)) cout << I; /*Если число I простое, печатаем его*/

}

if (Priznak) cout << N;

}

Предлагаем читателю самостоятельно разобраться с представленным решением.