Контрольная работа включает программу (Visual studio 2015) и отчет
Содержание
Введение
Задание №1
Контрольные вопросы
Задание №2
Контрольные вопросы
Задание №3
Контрольные вопросы
Задание №4
Контрольные вопросы
Задание №5
Контрольные вопросы
Задание №6
Контрольные вопросы
Задание №7
Контрольные вопросы
Задание №8
Контрольные вопросы
Задание №1
Линейные программы
Напишите программу для расчёта по двум формулам. Предварительно подготовьте тестовые примеры по второй формуле с помощью калькулятора (результат вычисления по первой формуле должен совпадать со второй). Список математических функций библиотеки С++ приведен в учебнике на с. 410. Для их использования необходимо подключить к программе заголовочный файл <math.h>.
Контрольные вопросы
1. Состав языка C++.
2. Ключевые слова языка C++.
3. Константы языка С++.
4. Основные типы данных языка C++.
5. Модификаторы типов данных языка C.
6. Структура программы.
7. Понятие переменной. Декларация переменных.
8. Операции языка C++, их классификация и приоритеты.
Задание № 2
Разветвляющиеся алгоритмы
Вычислить и вывести на экран значение функции F.
F =
где a, b, c — действительные числа.
Функция F должна принимать действительное значение, если выражение
(Ац И Вц) ИЛИ (Вц И Сц)
не равно нулю, и целое значение в противном случае. Через Ац, Вц и Сц обозначены целые части значений a, b, c. Операции И и ИЛИ — поразрядные. Значения a, b, c ввести с клавиатуры.
Контрольные вопросы
1. Операторы ветвления и множественного выбора языка C++.
2. Логические операции.
3. Поразрядные операции.
4. Операции преобразования данных одного типа в другой.
5. Базовые конструкции структурного программирования.
Задание № 3
Циклические вычислительные процессы
1. Вычислить и вывести на экран в виде таблицы значения функции F (из предыдущей лабораторной работы) на интервале от Xнач. до Xкон. с шагом dX.
2. Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от xнач да xкон с шагом dx с точностью ε. Таблицу снабдить заголовком и шапкой. Каждая строка таблицы должна содержать значение аргумента, значение функции и количество просуммированных членов ряда.
Вариант №2
1. Операторы цикла языка C++.
2. Циклы с постусловием и предусловием.
3. Операторы передачи управления.
4. Отличие префиксной операции инкремента от постфиксной.
Задание № 4
Одномерные массивы
Требования к выполняемой работе:
Размерности массивов задавать немодифицируемыми переменными.
Вариант 2
В одномерном массиве, состоящем n вещественных элементов, вычислить:
1) сумму положительных элементов массива;
2) произведение элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами.
Упорядочить элементы массива по убыванию.
Контрольные вопросы
1. Понятие массива. Декларация массивов.
2. Индексация в одномерном массиве.
3. Инициализация массивов при описании.
4. Порядок размещения массива в памяти.
5. Задание № 5
Требования к выполняемой работе:
Размерности массивов задавать именованными константами.
Вариант 2
Дана целочисленная прямоугольная матрица. Определить количество столбцов, не содержащих ни одного нулевого элемента.
Характеристикой строки целочисленной матрицы назовём сумму её положительных чётных элементов. Переставляя строки заданной матрицы, расположить их в соответствии с ростом характеристик.
Контрольные вопросы
1. Понятие двумерного массива. Описание массивов.
2. Инициализация двумерного массива при описании.
3. Индексация в двумерном массиве.
4. Размещение массива в памяти.
Требования к выполняемой работе:
Схему алгоритмов выполнять не требуется.
Переделать программы из заданий № 4 и 5 следующим образом:
- вместо статических массивов использовать динамические;
- массивы и переменные, хранящие размерности массивов, описать локально в функции main();
- каждое задание к каждой лабораторной работе оформить в виде отдельной функции.
Контрольные вопросы
1. Понятие указателя. Виды указателей.
2. Способы инициализации указателей.
3. Операции с указателями.
4. Арифметические операции с указателями.
5. Ссылки.
6. Получение адреса произвольного элемента одномерного и двумерного массива.
7. Правила передачи одномерного массива в функцию.
8. Правила передачи двумерного массива в функцию.
9. Способы выделения памяти под одномерный и двумерный динамический массив.
Задание № 7
Структуры
Вариант 2
1. Описать структуру с именем STUDENT, содержащую следующие поля:
· фамилия и инициалы;
· номер группы;
· успеваемость (массив из пяти элементов).
2. Написать программу, выполняющую следующие действия:
· ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по возрастанию среднего балла;
· вывод на дисплей фамилий и номеров групп для всех студентов, имеющих оценки 4 и 5;
если таких студентов нет, вывести соответствующее сообщение на экран.
Контрольные вопросы
1. Типы данных, определяемые пользователем.
2. Переименование типов (typedef).
3. Перечисления (enum).
4. Понятие структуры (struct).
5. Отличие структуры от массива и от перечисления.
6. Битовые поля.
7. Объединения (union).
Задание № 8
РАЗРАБОТКА КЛАССА
Разработать класс в соответствии с индивидуальным заданием. Разработанный класс должен содержать указанные поля в разделе private и методы в разделе public в количестве двух штук на каждое поле. Один метод должен быть предназначен для считывания содержимого поля, второй метод — для изменения содержимого поля.
1. Краткие теоретические сведения
Основная цель объектно-ориентированного программирования (ООП) — введение в язык программирования терминов, используемых при постановке задачи. В этом случае в техническом задании на разработку программного обеспечения и программном коде будут использоваться одни и те же понятия и термины.
Новый тип данных создается для того, чтобы стать специальным и конкретным представлением понятия, которое не находит прямого и естественного отражения среди встроенных типов. Например, в программе из области телефонной связи можно ввести тип trunk_module (линия связи), в видеоигре — тип explosion (взрыв), а в программе, обрабатывающей текст, — тип list_of_paragraphs (список параграфов). Обычно проще понимать и модифицировать программу, в которой типы хорошо представляют используемые в задаче понятия. Удачно подобранное множество пользовательских типов делает программу более ясной.
Для того, чтобы дать программисту инструмент построения новых типов служат классы. На основе описанного класса создается объект. Каждый объект характеризуется атрибутами и действиями, которые он может выполнять. Значения атрибутов объекта могут изменяться.
Каждый объект характеризуется своим состоянием, которое определяется текущим значением его атрибутов.
Атрибуты объекта описываются в классе с помощью полей, а действия — методов. Полями могут быть не только простейшие величины — числа, логические значения, указатели и т.п., но и сложные величины, объекты других классов.
Класс описывает пользовательский тип путем группирования полей различных типов, описывающих атрибуты объекта, и методов, описывающих поведение объекта. Если класс не является абстрактным, то клиентский код может его использовать, создав объекты. Поля и методы логически связаны между собой.
Объекты, не связанные общностью структуры и поведения, нельзя объединить в класс, так как по определению они не связаны ничем, кроме того, что все они объекты.
Некоторые объекты так сложны (интерфейс пользователя, база данных), что они не могут быть выражены в терминах простого описания класса. Их можно представить совокупностью сотрудничающих классов.
Описание класса обычно располагается в заголовочном файле и имеет следующий вид:
class <имя_класса>
{
[private:]
<описание скрытых элементов>
protected:
<описание защищенных элементов>
public:
<описание доступных элементов>
}; // точка с запятой обязательна в конце описателя.
Спецификаторы доступа private и public управляют видимостью элементов класса. Элементы, описанные после служебного слова private, видимы только внутри класса. Этот вид доступа принят в классе по умолчанию. Защищенная часть элементов (protected) — видима функциям-членам самого класса, потомкам класса и друзьям. Интерфейс класса описывается после спецификатора public. Действие любого спецификатора распространяется до следующего спецификатора или до конца класса. Можно задавать несколько секций private, protected и public, порядок их следования значения не имеет.
Поля класса могут иметь любой тип, кроме типа этого же класса, но могут быть указателями или ссылками на этот класс. Инициализация полей при описании не допускается.
В качестве примера создадим класс, моделирующий гражданина России. Для этого требуется задать атрибуты, которые описывают его состояние. Для простоты рассмотрим только 3 поля: фамилия строкового типа, год рождения целочисленного типа, пол символьного типа (‘М’ или ‘Ж’):
class GrajdaninOfRussia{
char Fam[30];
int gr;
char Pol;
};
В этом классе поля являются видимыми только внутри класса. Для обеспечения считывания и изменения значения каждого поля из программного кода извне класса необходимо для каждого поля создать по два общедоступных метода.
Таким образом, описание класса будет иметь следующий вид (в заголовочном файле с расширением h, например, grajdaninofrussia.h):
class GrajdaninOfRussia{
private:
char Fam[30];
int gr;
char Pol;
public:
char * get_Fam(void);
void set_Fam(char * AFam);
int get_gr(void);
void set_gr(int AGr);
char get_Pol(void);
void set_Pod(char APol);
};
Все методы класса имеют непосредственный доступ к его скрытым полям. Доступ к полям с помощью методов в данном случае кажется искусственным усложнением, но надо учитывать, что полями реальных классов могут быть сложными динамическими структурами, и получение их значений не так тривиально. Кроме того, очень важной является возможность вносить в эти структуры изменения, не затрагивая интерфейс класса (общедоступные методы).
В приведенном классе содержатся объявления (заголовки) методов, сами методы должны быть определены в другом месте программы (в файле с расширением cpp, например, grajdaninofrussia.cpp) с помощью операции доступа к области видимости (::):
#include “grajdaninofrussia.h”
char * GrajdaninOfRussia: :get_Fam(void)
{
return Fam;
}
void GrajdaninOfRussia: :set_Fam(char * AFam)
{
strncpy(Fam, AFam, 29);
Fam[29]=’\0’;
}
int GrajdaninOfRussia: :get_Gr(void)
{
return gr;
}
void GrajdaninOfRussia: :set_Gr(int AGr)
{
Gr = AGr;
}
char GrajdaninOfRussia: :get_Pol(void)
{
return Pol;
}
void GrajdaninOfRussia: :set_Pol(char APol)
{
Pol = APol;
}
После создания класса необходимо создать объект. Для описания объекта — экземпляра этого класса — необходимо записать следующее выражение (например, в функции main):
<Имя_класса> <имя объекта>;
например, GrajdaninOfRussia g;
Вызов методов класса из-вне этого класса может осуществляться с помощью операции доступа к элементам класса: “.”, например,
g.set_Fam(“Иванов”);
Для того, чтобы скомпилировать программу необходимо в файл с описанием функции main подключить заголовочный файл:
#include “grajdaninofrussia.h”.
Опишем два объекта класса GrajdaninOfRussia и организуем инициализацию полей этих объектов.
GrajdaninOfRussia g1, g2;
cout <<”Введите данные о первом гражданине” << endl;
cout << ”Введите фамилию”;
char s[1000]; //строка для промежуточного хранения
cin >> s;
g1.set_Fam(s);
cout << ”Введите год рождения”;
int gr;
cin >>gr;
g1.set_Gr(gr);
cout << ”Введите пол (М/Ж)”;
cin >>s;
if ( (s[0]= =’М’) || (s[0]= =’м’) )
g1.set_Pol(true);
else
g1.set_Pol(false);
///----------------------------------------------------------------------------
cout <<”Введите данные о втором гражданине” << endl;
cout << ”Введите фамилию”;
cin >> s;
g2.set_Fam(s);
cout << ”Введите год рождения”;
cin >> gr;
g2.set_Gr(gr);
cout << ”Введите пол (М/Ж)”;
cin >> s;
if ( (f[0]==’М’) || (f[0]==’м’) )
g1.set_Pol(true);
else
g1.set_Pol(false);
Затем можно вывести информацию об объектах g1 и g2 на экран с целью проверки правильности ввода и записи данных в поля объектов:
cout << “Гражданин 1: Фамилия ” << g1.get_Fam( ) << “; год рождения ” << g1.get_Gr( ) “; Пол - ”<< (g1.get_Pol( ))?“M”:”Ж”;
cout << “Гражданин 2: Фамилия ” << g2.get_Fam( ) << “; год рождения ” << g2.get_Gr( ) “; Пол - ”<< (g2.get_Pol( ))?“M”:”Ж”;
2. Задание
Разработать класс в соответствии с индивидуальным заданием. Разработанный класс должен содержать указанные поля в разделе private и по два метода на каждое поле в разделе public. Один метод должен быть предназначен д7ля считывания содержимого поля, второй метод — для изменения содержимого поля.
Вариант №2
2. Разработать класс CJob (Вакансия), содержащий поля: JobID (номер вакансии), JobName (Название вакансии), Mobile (телефон работодателя), Money (примерный размер зарплаты).
Задание № 9
Конструкторы и деструкторы
Цель работы: научиться разрабатывать конструкторы и деструкторы и изучить
1. Краткие теоретические сведения
В каждом классе есть хотя бы один метод, имя которого совпадает с именем класса. Он называется конструктором и вызывается автоматически при создании объекта класса. Конструктор предназначен для инициализации объекта (полей объекта). Автоматический вызов конструктора позволяет избежать ошибок, связанных с использованием неинициализированных полей.
Конструктор предназначен для инициализации объекта и вызывается автоматически при его создании. Ниже перечислены основные свойства конструкторов.
— Конструктор не возвращает значение, даже типа void.
— Нельзя получить указатель на конструктор.
— Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации.
— Конструктор, вызываемый без параметров, называется конструктором по умолчанию.
— Параметры конструктора могут иметь любой тип, кроме этого же класса.
— Можно задавать значения параметров по умолчанию. Их может содержать только один из конструкторов.
— Если программист не указал ни одного конструктора, компилятор создает автоматически конструктор по умолчанию.
— Конструкторы не наследуются.
— Конструкторы глобальных объектов вызываются до вызова функции main. Локальные объекты создаются, как только становится активной область их действия. Конструктор запускается и при создании временного объекта (например, при передаче объекта из функции).
В качестве примера класса с несколькими конструкторами усовершенствуем описанный ранее класс GrajdaninOfRussia, добавив в него конструкторы и деструктор. Ниже приведены их описания:
GrajdaninOfRussia:: GrajdaninOfRussia (){ //конструктор по умолчанию
strcpy(Fam, “Иванов”);
Gr=1980;
Pol=’М’;
}
GrajdaninOfRussia:: GrajdaninOfRussia (GrajdaninOfRussia & g)
{ //конструктор копирования
strncpy(Fam, g.Fam, 29);
Gr=g.Gr;
Pol=g.Pol;
}
//конструкторы
GrajdaninOfRussia:: GrajdaninOfRussia (char * AFam){
strncpy(Fam, AFam, 29);
Gr=1980;
Pol=’М’;
}
GrajdaninOfRussia:: GrajdaninOfRussia (char * AFam, int AGr, char APol){
strncpy(Fam, AFam, 29); Fam[29]=’\0’;
Gr=AGr;
Pol=APol;
}
Первый из приведенных выше конструкторов является конструктором но умолчанию, поскольку его можно вызвать без параметров. Объекты класса GrajdaninOfRussia теперь можно инициализировать различными способами, требуемый конструктор будет вызван в зависимости от списка значений в скобках. При задании нескольких конструкторов у компилятора должна быть возможность распознать нужный вариант по типу аргументов.
Конструктор вызывается, если в программе встретилась какая-либо из синтаксических конструкций:
<имя_класса> <имя_объекта> (необязательный список параметров);
<имя_класса> (список параметров);
<имя_класса> <имя_объекта> = выражение;
Примеры:
GrajdaninOfRussia President (“Medvedev”, 1962, ‘М’);
GrajdaninOfRussia stud (“Анохина”, 1988, ‘Ж’)
GrajdaninOfRussia b;
GrajdaninOfRussia * X= new GrajdaninOfRussia(“Родин”);
При создании объекта b значения полей инициализируются по умолчанию.
Под объект X выделяется память, в которую копируется безымянный объект, созданный конструктором с одним параметром.
Существует еще один способ инициализации полей в конструкторе (кроме использованного в приведенной выше программе присваивания полям значений формальных параметров) — с помощью списка инициализаторов, расположенных после двоеточия между заголовком и телом конструктора:
GrajdaninOfRussia::GrajdaninOfRussia (char * AFam, int AGr, char APol) : Gr(AGr), Pol(APol)
{
strncpy(Fam, AFam, 29); Fam[29]=’\0’;
}
Инициализируемые поля перечисляются после двоеточия через запятую. Для каждого поля в скобках указывается инициализирующее значение, которое может быть выражением. Без этого способа не обойтись при инициализации полей-констант, полей-ссылок и полей-объектов. В последнем случае будет вызван конструктор, соответствующий указанным в скобках параметрам.
Конструктор не может возвратить значение, чтобы сообщить об ошибке во время инициализации. Для этого можно использовать механизм обработки исключительных ситуаций.
Конструктор копирования — это специальный вид конструктора, получающий в качестве единственного параметра ссылку на объект этого же класса:
T::T(const T&) { ... /* Тело конструктора */ }
где Т — имя класса.
Этот конструктор вызывается в тех случаях, когда новый объект создается путем копирования существующего:
— при описании нового объекта с инициализацией другим объектом;
— при передаче объекта в функцию по значению;
— при возврате объекта из функции.
Если программист не указал пи одного конструктора копирования, компилятор создает его автоматически. Такой конструктор выполняет поэлементное копирование полей. Если класс содержит указатели или ссылки, это, скорее всего, будет правильным, поскольку и копия, и оригинал будут указывать на одну и ту же область памяти.
Запишем конструктор копирования для класса monstr. Поскольку в нем есть поле name, содержащее указатель на строку символов, конструктор копирования должен выделять память под новую строку и копировать в нее исходную:
GrajdaninOfRussia:: GrajdaninOfRussia (GrajdaninOfRussia &Ag){
strncpy(Fam, Ag.Fam, 29); Fam[29]=’\0’;
Gr=Ag.Gr;
Pol=Ag.Pol;
}
В обоих ниже приведенных случаях вызывается конструктор копирования:
GrajdaninOfRussia Premier (President);
GrajdaninOfRussia President2 = new GrajdaninOfRussia(President);
Любой конструктор класса, принимающий один параметр какого-либо другого типа, называется конструктором преобразования, поскольку он осуществляет преобразование из типа параметра в тип этого класса.
Деструктор — это особый вид метода, применяющийся для освобождения памяти, занимаемой объектом. Деструктор вызывается автоматически, когда объект выходит из области видимости:
· для локальных объектов — при выходе из блока, в котором они объявлены:
· для глобальных — как часть процедуры выхода из функции main;
· для объектов, заданных через указатели, деструктор вызывается неявно при использовании операции delete. Автоматический вызов деструктора объекта при выходе из области действия указателя на него не производится.
Имя деструктора начинается с тильды (~), непосредственно за которой следует имя класса. Деструктор:
— не имеет аргументов и возвращаемого значения;
— не наследуется;
— может быть виртуальным;
— указатель на деструктор определить нельзя.
Если деструктор явным образом не определен, компилятор автоматически создаст пустой деструктор.
Описывать в классе деструктор явным образом требуется в случае, когда объект содержит указатели на память, выделяемую динамически — иначе при уничтожении объекта память, па которую ссылались его поля-указатели, не будет помечена как свободная.
Деструктор для рассматриваемого примера не нужен, поскольку в классе память не выделяется. Деструктор потребуется, если поле Fam описать как динамическую строку через указатель: char * Fam;
В этом случае в конструкторах придется выделять память под строку:
Fam = new char[strlen(AFam)+1];
а в деструкторе — освобождать память:
GrajdaninOfRussia:: ~GrajdaninOfRussia
{
delete [ ] Fam;
}
Метод set_Fam также изменится в связи с тем, что может измениться длина строки:
void GrajdaninOfRussia: :set_Fam(char * AFam)
{
if (Fam!=0) { delete[ ] Fam; Fam = 0; }
Fam = new char[strlen(AFam)+1];
strncpy(Fam, AFam, 29); Fam[29]=’\0’;
}
2. Задание
1. Разработать класс в соответствии с индивидуальным заданием. Разработанный класс должен содержать указанные поля в разделе private и методы в разделе public в количестве двух штук на каждое поле. Один метод должен быть предназначен для считывания содержимого поля, второй метод — для изменения содержимого поля. Хотя бы один из строковых полей должен быть динамическими.
2. Разработать конструкторы по умолчанию, копирования и с параметрами.
3. Разработать деструктор.
4. Написать функцию main, в которой создается два объекта разработанного класса, и инициализируются их поля.
Вариант №2
2. Разработать класс CJobless (Безработный), содержащий поля JoblessID (регистрационный номер безработного), LastName (Фамилия безработного), FirstName (Имя безработного), Age (возраст безработного).