Задания по C++
C tasks ==
task1 - таблица умножения
- Пользователь вводит число
N - Программа генерирует в памяти таблицу умножения чисел от
1доN - Пользователь вводит координаты “окна” в таблице, которое следует вывести на печать:
(1, 1) ≤ (x1, y1) ≤ (x2, y2) ≤ (N, N)
- Если вместо
x1пользователь ввёл0- программа должна завершить выполнение и освободить выделенную память - Проверка выполняется автоматически, на консоль не надо выводить ничего лишнего
Решение
task2 - Реализовать телефонную книжку
- Структура включает в себя поля -
id,name,number - Все данные хранятся в файле, имя файла передается аргументом командной строки
- Все изменения должны должны сохраниться при обрывании программы (
SIGINT,ESC) - При неправильном запросе должно выводиться сообщение об ошибке
- Cтруктура поддерживает функции
create [name] [number]- создает контакт с заданным номером и именем.find [name]- ищет контакт по имени и возвращаетidfind [number]- ищет контакт по номеру и возвращаетidchange [id] name [name]- изменяет имя контакта, соответсвующего заданномуidchange [id] number [number]- изменяет номер контакта, соответсвующего заданномуiddelete [id]- удаляет контакт, соответсвующий заданномуid- Ограничения:
- Корректное имя состоит только из символов латинского алфавита в обоих регистрах
- Поиск производится по подстроке имени без учета регистра
- Корректный телефон содержит цифры, произвольное количество дефисов, не идущих подряд, не более одной пары круглых скобок и может начинаться с плюса.
- Поиск по номеру учитывает только цифры и производится по полному соответствию
- Длина имени и телефона не ограничена, однако суммарный размер записной книжки помещается в оперативную память
### Решение
C++ tasks
task3 - Реализовать библиотеку rational, реализующую работу с дробями -
- Заголовочный файл
rational.h - Библиотека
librational.soлибоlibrational.a - Конструктор
rational(int num)- от целого числа; - Конструктор
rational(int num, int denom)- от числителя и знаменателя int rational::getNum()const - возвращает числительint rational::getDenom()const - возвращает знаменатель- перегрузка арифметичских операторов:
*
rational const operator +(rational const &a) const*rational const operator -(rational const &b) const*rational const operator *(rational const &c) const*rational const operator /(rational const &d) const
### Решение
task4 - format, реализующую безопасный аналог sprintf
#include<string>#include <stdexcept>template<typename... Args>std::string format(std::string const & fmt, Args… args)- Требования:
- Заголовочный файл
format.h - Библиотека
libformat.soлибоlibformat.a - Формат - как у
sprintf - В случае отсутствия аргумента кидается исключение
std::out_of_range - Если
const char * == nullptr, вместо него выводится“<null>” std::stringобрабатывается так же, как constchar *- Если литерал формата не соответсвует типу аргумента - кидается исключение
std::invalid_argument
Решение
- Заголовочный файл
task5 - Доработка format для поддержки автоопределения типа и указателей
- Усовершенствовать
format, добавив формат выводa%@, который: - Если аргумент -
nullptr_t– выводитnullptr - Если аргумент указатель, и его значение равно 0 – выводит
nulltpr<имя_типа> - Если аргумент указатель, и его значение не равно 0 - выводит
ptr<имя_типа>(вывод как для%@) - Если аргумент массив известной размерности – выводит элементы массива через запятую в
[] - Если аргумент может быть преобразован к
std::string– выводит результат такого преобразования - Если ни одно преобразование невозможно – кидается исключение
std::invalid_argument
Решение
task6 - Класс lazy_string для работы со строками реализующий copy-on-write
- Класс
lazy_string, реализующий copy-on-write - Конструируется от
std::string - Приводится к
std::string - Имеет
size,length,at,operator[]аналогичноstd::string - Имеет операторы ввода и вывода в поток (
<<,>>) - Имеет
substr, причем при взятии подстроки копирования не происходит
### Решение
task7 - Доработка класса lazy_string для безопасной работы в многопоточном приложении
- Доработать
lazy_stringдля обеспечения безопасной работы из нескольких потоков