- •Задание:
- •Задание:
- •Лабораторная работа 4 Переменные, типы данных и выражения
- •1. Идентификаторы
- •2. Типы данных
- •2.2 Вещественные числа
- •2.3 Преобразование типов в выражениях
- •2.4 Символьный тип
- •2.5 Символьные строки
- •2.6 Типы данных, определяемые пользователем
- •3. Вывод вещественных чисел на экран
- •4. Описания, константы и перечисления
- •4.1 Тип "Перечисление"
- •4.2 Расположение описаний констант и переменных в исходном тексте
- •5. Присваивание и выражения
- •5.1 Краткая форма записи операторов присваивания
- •5.2 Логические выражения и операторы
- •6. Сводка результатов
- •Лабораторная работа 5 Функции и процедурная абстракция
- •1. Назначение подпрограмм
- •2. Определение новых функций
- •3. Способы передачи параметров внутрь функций
- •3.1 Передача параметров по значению
- •3.2 Передача параметров по ссылке
- •4. Полиморфизм и перегрузка функций
- •5. Процедурная абстракция и "хороший" стиль программирования
- •6. Модульное программирование
- •Лабораторные работа 6 Текстовые файлы и потоки ввода/вывода
- •1. Потоки ввода/вывода
- •Создание потоков
- •1.2 Подключение и отключение потоков от файлов
- •2. Проверка ошибок выполнения файловых операций
- •3. Символьный ввод/вывод
- •3.1 Функция ввода "get(...)"
- •3.2 Функция вывода "put(...)"
- •3.3 Функция "putback(...)"
- •4. Проверка достижения конца файла при операциях ввода
- •4.1 Проверка конца файла с помощью функции "eof()"
- •5. Передача потоков функциям в качестве параметров
- •Лабораторные работа 7 Операторы ветвления и циклы
- •1. Логические значения, выражения и функции
- •2. Циклы "for", "while" и "do...While"
- •3. Множественное ветвление и оператор "switch"
- •4. Блоки и область видимости переменных
- •5. Замечание о вложенных циклах
- •6. Сводка результатов
- •Задание:
- •Лабораторные работа 8 Массивы и символьные строки
- •1. Назначение массивов
- •1.1 Объявление массивов
- •1.2 Использование элементов массивов в выражениях
- •2. Передача массивов в качестве параметров функций
- •3. Сортировка массивов
- •4. Двумерные массивы
- •5. Символьные строки
- •5.2 Объявление и инициализация символьных строк
- •5.3 Библиотечные функции для работы с символьными строками
- •5.4 Чтение символьных строк из потока ввода с помощью функции "getline(...)"
- •6. Сводка результатов
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;
}
Вывод: в результате выполнения работы научились использовать ветвления и циклы