-
Write a Program to demonstrate functions.
-
Write a Program to demonstrate function overloading.
-
Write a Program to demonstrate default arguments.
-
Write a Program to demonstrate pass by value, pass by reference and return by reference.
-
Write a Program to demonstrate classes and objects.
-
Write a Program to demonstrate constructors.
Необходимо реализовать класс STUDENT:
Private members of class student:
admno integer
sname 20 character
eng. math, science float
total float
ctotal() a function to calculate eng + math + science with float return type.
Public member function of class student:
Takedata() Function to accept values for admno, sname, eng, science and invoke ctotal() to calculate total.
Showdata() Function to display all the data members on the screen
Необходимо реализовать класс REPORT
Private members of class report:
adno 4 digit admission number
name 20 characters
marks an array of 5 floating point values
average average marks obtained
GETAVG() a function to compute the average obtained in five subject
Public member function of class report:
READINFO() function to accept values for adno, name, marks. Invoke the function GETAVG()
DISPLAYINFO() function to display all data members of report on the screen.
-
Student header/implementation
-
Report header/implementation
- Напишите простые файлы
hello.cpp
,here.cpp
,bye.cpp
,mylib.h
. Вhello.cpp
, функция должна выводить
"Hello!"
В here.cpp
, другая функция должна выводить
"I am here!"
Eще одна функция должна выводить
"Bye bye!"
В bye.cpp
.
mylib.h
должен содержать объявления всех трех функций
- Напишите
main.cpp
, который вызывает все три функции, результатом работы программы является
"Hello!"
"I am here!"
"Bye bye!"
В файле main.cpp
нет операторов вывода
- Напишите Makefile, который компилирует все файлы и строит статическую библиотеку
mylib.a
, содержащуюhello.cpp
,here.cpp
,bye.cpp
, но неmain.cpp
- Напишите Makefile, который компилирует все файлы и строит динамическую библиотеку с soname библиотеки
libmylib.so.5.
Установите minor версию.1
и релиз.10.
Таким образом вы получите динамическую библиотеку с именем файлаlibmylib.so.5.1.10
c установленными.so
ссылками
-
Выполните сформулированное ниже задание, используя любую из интегрированных сред разработки. Результатом реализации части a задания должна быть статическая библиотека, а части b — программа, использующая библиотеку. Структура каталога проекта должна быть такой, как изображена на втором рисунке. Настройте проект приложения таким образом, чтобы в модуле
rational_poly.cpp
можно было подключать заголовочный файл библиотеки директивой:-
a) Операции с рациональными числами: сокращение, сложение, вычитание, умножение, деление, сравнение.
и двух чисел
q_1, q_2 ∈ Q
определить, какое из значений больше:P_n(q1)
илиP_n(q2)
. Вычисление значения многочлена производить по схеме Горнера. -
-
Требования к реализации:
- Реализовать построение вне каталога проекта, устанавливая соответствующие настройки в интегрированной сред
- Части a и b задания должны быть оформлены в виде отдельных проектов (располагаться в разных каталогах системы).
- Проект библиотеки должен иметь возможность создавать как статический, так и динамический/разделяемый вариант.
- Проект библиотеки должен содержать описание целей тестирования и установки. Установка должна поддерживать компоненты для обычного пользователя и для разработчика.
- Структура каталога установки должна быть аналогичной структуре, приведённой на рисунке 2
- Проект библиотеки должен содержать описание интерфейсных настроек, применяемых к зависимым проектам.
- Проект приложения должен подключать библиотеку, используя её сценарий, сгенерированный во время установки. Для этого проект приложения должен иметь кэш-настройку, определяющую путь к каталогу установки библиотеки.
Проверьте работоспособность собираемой программы для различных доступных операционных систем и компиляторов.
- rational_poly implementation/CMake
- lib_rational header/implementation/CMake
- program CMake
- bat-файл для сборки
Cоздадим свой простой аналог стандартного класса string
для удобной работы со строками.
Начнем мы с написания конструктора. В этой задаче вам требуется реализовать конструктор, который принимает на вход C-style строку, вычисляет ее размер (без учета завершающего 0 символа) и сохраняет его в поле size
, кроме того, конструктор должен аллоцировать память достаточную для хранения копии переданной строки (вместе с завершающим 0 символом), копирует переданную строку в выделенную память и сохраняет указатель на начало этой области памяти в поле str
. Т.е. в результате работы конструктора в поле str
должен оказаться указатель на C-строку c копией исходной строки, а в поле size
— длина строки без учета завершающего нулевого символа.
Конструкторов у структуры может быть несколько. Для строки может оказаться полезным заполняющий конструктор (например, чтобы создать строку пробелов). Заполняющий конструктор принимает число и символ, и создает строку с заданным количеством повторений переданного символа. Условия налагаемые на реализацию конструктора те же самые (в поле size
размер без учета завершающего 0 символа, в поле str
C-style строка, т.е. с завершающим 0 символом). Кроме конструктора в этой задаче вам нужно также реализовать и деструктор, который освободит выделенную память.
Для работы со строками можно придумать множество полезных методов (подумайте, какие методы пригодились бы вам, и чего вам не хватает для их реализации). Примером такого метода может послужить метод append
— он добавляет копию строки-аргумента в конец текущей строки (т.е. в конец строки, у которой он был вызван).
String s1("Hello,");
String s2(" world!");
s1.append(s2); // теперь s1 хранит "Hello, world!"
Ваша задача реализовать метод append.
При выполнении задания будьте аккуратны при работе с памятью — при вызове метода не должно возникать утечек памяти. Кроме того, не забудьте, что size
хранит размер без учета завершающего 0 символа.
Кроме того, ваша реализация должна корректно работать в следующем тесте:
String s("Hello");
s.append(s); // теперь s хранит "HelloHello"
Добавьте в класс String
реализацию конструктора копирования. Инвариант класса остается тем же (в size
хранится размер строки без завершающего 0 символа, str
указывает на C-style строку, т. е. с завершающим нулевым символом).
Завершите класс String
, добавив к нему оператор присваивания. Будьте аккуратны при работе с памятью. Инвариант класса остается тем же (в size
хранится размер строки без завершающего 0 символа, str
указывает на C-style строку, т. е. с завершающим нулевым символом).
Придумайте некоторый класс, для которого разумно переопределить все доступные для переопределения операторы в C++. Использовать String
, BigInt
и Vector
запрещено. Чем оригинальнее у вас будет класс, тем больше шансов, что вас будут не сильно мучать на сдаче.
Отлично, выбрали, теперь переоределите для него все доступные для переопределения операторы в C++ (кроме операторов работы с памятью).
Реализуйте шаблонную версию класса Array
, не полагаясь на то, что для типа T определен оператор присваивания и конструктор по умолчанию. Конструктор копирования у типа T есть.
Реализуйте шаблонную функцию minimum
, которая находит минимальный элемент, который хранится в экземпляре шаблонного класса Array
, при этом типовой параметр шаблона Array может быть произвольным. Чтобы сравнивать объекты произвольного типа, на вход функции также будет передаваться компаратор, в качестве компаратора может выступать функция или объект класса с перегруженным оператором "()". Примеры вызова функции minimum
:
bool less(int a,int b) { return a < b; }
struct Greater { bool operator()(int a, int b) const { return b < a; } };
Array<int> ints(3);
ints[0] = 10;
ints[1] = 2;
ints[2] = 15;
int min = minimum(ints, less);
int max = minimum(ints, Greater());
Шаблонный класс Array
может хранить объекты любого типа, для которого определѐн конструктор копирования, в том числе и другой Array
, например, Array< Array<int> >
. Глубина вложенности может быть произвольной. Напишите шаблонную функцию (или несколько) flatten
, которая принимает на вход такой "многомерный" Array неизвестной заранее глубины вложенности и выводит в поток out через пробел все элементы, хранящиеся на самом нижнем уровне. Примеры работы функции flatten
:
Array<ints> (2, 0);
ints[0] = 10;
ints[1] = 20;
flatten(ints, std::cout);// выводит на экран строку "10 20"
Array< Array<int> > array_of_ints(2, ints);
flatten(array_of_ints, std::cout);// выводит на экран строку "10 20 10 20"
Array<double> doubles(10, 0.0);
flatten(doubles, std::cout);// работать должно не только для типа int
Hint: шаблонные функции тоже можно перегружать, из нескольких шаблонных функций будет выбрана наиболее специфичная.
- Array.h/Array.cpp
- "Плохой" класс для тестов BadClass.h/BadClass.cpp
-
Предположим, что при разработке игры вам потребовался юнит "Челмедведосвин" (ManBearPig). Разработайте иерархию классов, реализуйте необходимые конструкторы и добавьте разумные методы. PS: В данном игровом контексте предполагается, что человек — не животное. Структуры, которые обязаны присутствовать:
Unit
,Animal
,Man
,Bear
,Pig
-
При помощи
typedef
определите типComplexFunction
, который является указателем на функцию, которая принимаетint
и указатель на функцию, принимающуюdouble
и возвращающуюint
, и возвращает указатель на функцию, которая принимаетchar const *
и возвращаетint *
. -
Напишите возвращающую
bool
шаблонную функциюcompare
, которая принимает две константные ссылки на объекты одного типа и указатель на константный метод этого типа без параметров, который в свою очередь возвращает значение какого-то второго типа. Функция должна сравнивать объекты по значениям, которые для них вернѐт соответствующий метод, и возвращатьtrue
, если значение для первого объекта оказалось меньше, чем для второго.
std::string s1("Elf");
std::string s2("Archer);
// сравнение строк по длине
bool r1 = compare(s1, s2, &std::string::size); // true
bool r2 = compare(s1, s1, &std::string::size); // false
- Предположим, что вам даётся два указателя на объект некоторого сложного полиморфного класса, который использует множественное наследование. Оба указателя имеют один и тот же тип, но могут ссылаться на разные однотипные базы внутри одного объекта. Напишите шаблонную функцию, которая по двум однотипным указателям проверяет, указывают ли они на один объект.
template<class T>
bool isSameObject(T const * p, T const * q)
-
Unit header/implementation, Animal header/implementation, Main header/implementation, Bear header/implementation, Pig header/implementation, ManBearPig header/implementation
-
typedef ComplexFunction
- По аналогии с функцией
printf
с лекции напишите функциюprint_values
с переменным числом аргументов, которая для каждого аргумента выводит его тип и значение в потокstd::cout
. Функция должна работать с произвольным числом аргументов. Указание: для вывода имени типа нужно использоватьstd::type_info::name
. Например, вызов функции
print_values(0, 3.5, "Hello");
должен вывести на стандартный вывод примерно следующее (таким будет вывод на g++).
i: 0
d: 3.5
PKc: Hello
- Реализуйте следующий класс Array:
template<class T>
struct Array
{
explicit Array(size_t size = 0);
Array(Array const& a);
Array & operator=(Array const& a);
~Array();
size_t size() const;
T & operator[](size_t i);
T const& operator[](size_t i) const;
// перемещающий конструктор
// перемающий оператор присваивания
private:
size_t size_;
T * data_;
};
- Напишите шаблонную функцию
to_pair
, которая принимает произвольныйstd::tuple
и два индекса внутри и возвращаетstd::pair
, содержащий элементы переданногоstd::tuple
с соответствующими индексами. Пример:
auto t = std::make_tuple(0, 3.5, "Hello");
std::pair<double, char const *> p = to_pair<1,2>(t);
// p содержит 3.5 и "Hello"
Замечание: реализация должна работать в рамках стандарта C++11.
Маршрут – Ломаная на плоскости, соединяющая некоторые данные точки (заказы).
Необходимо реализовать программу, которая умеет эффективно разбивать заказы на маршруты с ограничениями. Пусть у нас имеется алгоритм, который принимает на вход множество точек, и разбивает их на маршруты. Алгоритму на вход подается ограничение на число заказов в одном маршруте и метрика эффективности маршрута.
Ваша задача реализовать хотя бы три различных алгоритма разбиения на маршруты, а также хотя бы три метрики эффективности маршрута. Эти объекты, естественно, должны удовлетворять своим интерфейсам.
Программа при запуске должна запускать ровно один алгоритм ровно с одной метрикой. Должна быть возможность выбрать алгоритм и метрику не пересобирая программу. Точка входа в программу должна быть одна (один исполняемый файл).
Hint: для управления какой алгоритм выбрать можно использовать, например, текстовый файл.
В стандартной библиотеке есть семейство функций to_string
для преобразования чисел в строки. Однако обратное преобразование не такое удобное — для каждого числового типа есть своя функция (например, strtoi
для int
).
В данном задании вам предлагается написать шаблонную функцию from_string
, которая умеет преобразовывать строку в разные типы. Для реализации from_string
предлагается воспользоваться классом std::istringstream
который представляет собой поток ввода из строки, т.е. для преобразования строки в тип T предлагается прочитать значение типа T из потока при помощи оператора >>
. В случае неудачного преобразования функция должна бросать исключение bad_from_string
, класс которого вам нужно реализовать самостоятельно.
string s1("123");
int a1 = from_string<int> (s1);// a1 = 123
double b1 = from_string<double>(s1);// b1 = 123.0
string c1 = from_string<string>(s1);// c1 = "123"
string s2("12.3");
int a2 = from_string<int> (s2);// исключение
double b2 = from_string<double>(s2);// b2 = 12.3
string c2 = from_string<string>(s2);// c2 = "12.3"
string s3("abc");
int a3 = from_string<int> (s3);// исключение
double b3 = from_string<double>(s3);// исключение
string c3 = from_string<string>(s3);// с3 = "abc"
Указания:
- Для того, чтобы учитывать пробельные символы, используйте
std::noskipws
(например, если строка с числом начинается с пробела или заканчивается пробелом, то это должно быть ошибкой). - Флаг
eof()
у потоков устанавливается только, если не удалось прочитать символ: если при чтении из потока с 5-ю символами прочли 5 символов, но при этом 6-ой (отсутствующий) символ прочесть не пытались, тоeof()
будет выдаватьfalse
. - Не забудьте определить конструктор
bad_from_string
отchar const *
или отstd::string
.
-
"Плохой" класс для тестов header/implementation