Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТ...docx
Скачиваний:
12
Добавлен:
21.09.2019
Размер:
695.51 Кб
Скачать

5. Замечание о вложенных циклах

В первоначальном варианте программы "таблица умножения"

(программа 7.8) есть вложенные циклы. В последующих вариантах

программы читабельность исходного текста улучшается с помощью

процедурной абстракции. Преобразование тела цикла в вызов функции

позволяет производить разработку этого алгоритма независимо от

остальной части программы. Поэтому уменьшается вероятность ошибок,

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

переменных.

Недостаток выноса тела цикла в отдельную функцию заключается в

уменьшении быстродействия, поскольку на вызов функции тратится больше

времени, чем на итерацию цикла. Если цикл выполняется не очень часто и

не содержит большого количества итераций (больше нескольких десятков),

то временными затратами на вызов функции вполне можно пренебречь.

6. Сводка результатов

Тип данных "bool" предназначен для использования в логических

выражениях и в качестве возвращаемого значения логических функций.

Такие функции можно применять в качестве условий в условных

операторах и операторах циклов. В Си++ есть три варианта циклов: "for",

"while" и "do ... while".

Вложенные операторы "if" в некоторых случаях можно заменить

оператором множественного ветвления "switch".

Внутри составного оператора (блока), ограниченного фигурными

скобками "{}", допускается описание локальных переменных (внутренних

переменных блока).

Задание:

Задание 1

Разработайте функцию, которая принимает целочисленный параметр

и возвращает логическое ("bool") значение "true", только если переданное ей

число является простым числом из диапазона от 1 до 1000 (число 1

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

данных с помощью тестовой программы.

Подсказка: (1) если число не является простым, то оно имеет как

минимум один простой множитель, меньший или равный квадратному

корню из числа. (2) (32*32)=1024 и 1024>1000.

Задание 2

Напишите функцию "print_pyramid(...)", которая получает целочисленный

параметр "height (высота)" и отображает на экране "пирамиду" заданной

высоты из символов "*". Проверьте функцию с помощью простой тестовой

программы, которая должна воспроизводить следующий примерный диалог

с пользователем:

Эта программа печатает на экране "пирамиду"

заданной высоты.

Введите высоту пирамиды: 37

Введите другое значение (из диапазона от 1 до 30): 6

**

****

******

********

**********

************

Задание 3

Цикл "for" всегда можно переписать в форме цикла "while", и наоборот.

Являются ли две показанных ниже программы эквивалентными? Какие

сообщения они печатают на экране? Объясните свой ответ и проверьте его

опытным путем.

Программа а:

#include <iostream.h>

void main()

{

int count = 1;

for ( ; count <= 5; count++ )

{

int count = 1;

cout << count << "\n";

}

}

Программа b:

#include <iostream.h>

void main()

{

int count = 1;

while ( count <= 5 )

{

int count = 1;

cout << count << "\n";

count++;

}

}

Задание 4

Приведенная ниже программа должна печатать время закрытия

магазина в различные дни недели (в виде таблицы). В программе объявлен

новый перечислимый тип данных "День" и определена функция

"closing_time(...)", которая должна возвращать час закрытия магазина в

заданный день (пока эта функция не слишком сложна – для любого дня

возвращает значение 17). Программа демонстрирует, как можно

использовать типы "int" и "Day" в преобразованиях типов (в заголовке цикла

"for" и при вызове функции "closing_time(...)").

#include <iostream.h>

enum Day { Monday, Tuesday, Wednesday, Thursday,

Friday, Saturday, Sunday };

int closing_time( Day day_of_the_week );

// Главная функция

void main()

{

int count;

// Печать заголовка таблицы

cout.width(17);

cout << "ДЕНЬ";

cout.width(19);

cout << "ВРЕМЯ ЗАКРЫТИЯ \n\n";

// Печать таблицы от понедельника (Monday) до

// воскресенья (Sunday)

for ( count = int(Monday); count <= int(Sunday); count++ )

{

cout.width(19);

switch ( count )

{

case 0 : cout << "Понедельник"; break;

case 1 : cout << "Вторник"; break;

case 2 : cout << "Среда"; break;

case 3 : cout << "Четверг"; break;

case 4 : cout << "Пятница"; break;

case 5 : cout << "Суббота"; break;

case 6 : cout << "Воскресенье"; break;

default : cout << "ОШИБКА!";

}

cout.width(9);

cout << closing_time( Day(count) ) << ":00\n";

}

}

// Конец главной функции

// Функция, возвращающая время закрытия магазина

// в заданный день недели

int closing_time( Day day_of_the_week )

{

return 17;

}

(а) Что произойдет (и почему), если заменить оператор "switch" на строку

cout << Day(count); ?

Вместо этого замените "switch" на строку

print_day( Day(count), cout );

и добавьте описание и определение функции "print_day(...)", внутри

которой разместите удаленный из главной функции оператор "switch"

(поток стандартного вывода "cout" передавайте в функцию как параметр

по ссылке типа "ostream&").

Выполнение работы

Задание 1

Разработайте функцию, которая принимает целочисленный параметр

и возвращает логическое ("bool") значение "true", только если переданное ей

число является простым числом из диапазона от 1 до 1000 (число 1

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

данных с помощью тестовой программы.

#include <iostream>

#include <math.h>

using namespace std;

int main()

{

float number;

bool simple;

cout<<"Enter the number"<<endl;

cin>>number;

if(number==961||number==900||number==841||number==784||number==729||number==676||number==625||number==576||number==529||number==484||number==441||number==400||number==361||number==324||number==289||number==256||number==225||number==196||number==169||number==144||number==121||number==100||number==81||number==64||number==49||number==36||number==25||number==16||number==9||number==4||number==1)

simple=false;

else

simple=true;

cout<<simple;

}

Задание 2

Напишите функцию "print_pyramid(...)", которая получает целочисленный

параметр "height (высота)" и отображает на экране "пирамиду" заданной

высоты из символов "*". Проверьте функцию с помощью простой тестовой

программы, которая должна воспроизводить следующий примерный диалог

с пользователем:

Эта программа печатает на экране "пирамиду"

заданной высоты.

Введите высоту пирамиды: 37

Введите другое значение (из диапазона от 1 до 30): 6

**

****

******

********

**********

************

#include <iostream>

int main()

{

int x;

std::cin>> x;

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

{

for(int j=1; j<2*i; j++)

std::cout<< "*";

std::cout<< std::endl;

}

return 0;

}

Цикл "for" всегда можно переписать в форме цикла "while", и наоборот.

Являются ли две показанных ниже программы эквивалентными? Какие

сообщения они печатают на экране? Объясните свой ответ и проверьте его

опытным путем.

Программа а:

#include <iostream.h>

void main()

{

int count = 1;

for ( ; count <= 5; count++ )

{

int count = 1;

cout << count << "\n";

}

}

Программа b:

#include <iostream.h>

void main()

{

int count = 1;

while ( count <= 5 )

{

int count = 1;

cout << count << "\n";

count++;

}

}

Программа а выведет на экран 5 единиц.

Программа b выведет на экран бесконечное кол-во единиц.

Задание 4

Приведенная ниже программа должна печатать время закрытия

магазина в различные дни недели (в виде таблицы). В программе объявлен

новый перечислимый тип данных "День" и определена функция

"closing_time(...)", которая должна возвращать час закрытия магазина в

заданный день (пока эта функция не слишком сложна – для любого дня

возвращает значение 17). Программа демонстрирует, как можно

использовать типы "int" и "Day" в преобразованиях типов (в заголовке цикла

"for" и при вызове функции "closing_time(...)").

#include <iostream.h>

enum Day { Monday, Tuesday, Wednesday, Thursday,

Friday, Saturday, Sunday };

int closing_time( Day day_of_the_week );

// Главная функция

void main()

{

int count;

// Печать заголовка таблицы

cout.width(17);

cout << "ДЕНЬ";

cout.width(19);

cout << "ВРЕМЯ ЗАКРЫТИЯ \n\n";

// Печать таблицы от понедельника (Monday) до

// воскресенья (Sunday)

for ( count = int(Monday); count <= int(Sunday); count++ )

{

cout.width(19);

switch ( count )

{

case 0 : cout << "Понедельник"; break;

case 1 : cout << "Вторник"; break;

case 2 : cout << "Среда"; break;

case 3 : cout << "Четверг"; break;

case 4 : cout << "Пятница"; break;

case 5 : cout << "Суббота"; break;

case 6 : cout << "Воскресенье"; break;

default : cout << "ОШИБКА!";

}

cout.width(9);

cout << closing_time( Day(count) ) << ":00\n";

}

}

// Конец главной функции

// Функция, возвращающая время закрытия магазина

// в заданный день недели

int closing_time( Day day_of_the_week )

{

return 17;

}

(а) Что произойдет (и почему), если заменить оператор "switch" на строку

cout << Day(count); ?

Вместо этого замените "switch" на строку

print_day( Day(count), cout );

и добавьте описание и определение функции "print_day(...)", внутри

которой разместите удаленный из главной функции оператор "switch"

(поток стандартного вывода "cout" передавайте в функцию как параметр

по ссылке типа "ostream&").

#include <iostream.h>

enum Day { Monday, Tuesday, Wednesday, Thursday,

Friday, Saturday, Sunday };

int print_day(Day(count))

{

switch ( count )

{

case 0 : cout << "Понедельник"; break;

case 1 : cout << "Вторник"; break;

case 2 : cout << "Среда"; break;

case 3 : cout << "Четверг"; break;

case 4 : cout << "Пятница"; break;

case 5 : cout << "Суббота"; break;

case 6 : cout << "Воскресенье"; break;

default : cout << "ОШИБКА!";

}

cout.width(9);

}

int closing_time(Day(count));

int main()

{

int count;

cout.width(17);

cout << "ДЕНЬ";

cout.width(19);

cout << "ВРЕМЯ ЗАКРЫТИЯ \n\n";

for ( count = int(Monday); count <= int(Sunday); count++ )

{

cout.width(19);

print_day(Day(count));

cout << closing_time(Day(count) ) << ":00\n";

}

}

int closing_time(Day(count))

{

return count;

}

Вывод: в результате выполнения работы научились использовать ветвления и циклы