Главная страница
Навигация по странице:

  • include

  • Методические рекомендации для студентов, изучающих программирование в С. Предназначено для студентов специальностей Прикладная математика и информатика


    Скачать 0.9 Mb.
    НазваниеМетодические рекомендации для студентов, изучающих программирование в С. Предназначено для студентов специальностей Прикладная математика и информатика
    АнкорOutput
    Дата11.04.2023
    Размер0.9 Mb.
    Формат файлаpdf
    Имя файлаoutput (2).pdf
    ТипМетодические рекомендации
    #1053385
    страница2 из 6
    1   2   3   4   5   6

    Часть 1 (до 5 баллов). Реализуйте класс «Линейный однонаправленный список», как показано в заго- товке, поясните принцип организации полей и методов в структуре «Узел», классе «Линейный список». В каком доступе находятся поля и методы структуры TNode? Как называется класс/структура, содержащие в качестве поля ссылку или указатель на самого себя? Какие методы класса TList могут быть сделаны кон- стантными? Дополните код класса TList деструктором, адекватно удаляющим список. Продемонстрируйте его работу. Вынесите реализацию всех методов класса за пределы класса. Убедитесь в работоспособности класса на примере приведенного кода в теле main().
    #include
    using namespace std;
    struct TNode //структура для описания узла в списке
    {
    int info;
    TNode *next;
    TNode(int x){ info=x; next=0;}
    };
    class TList // сам класс «Линейный список»
    {
    private:
    TNode * head; //голова списка
    TNode * tail; //хвост списка
    public:
    TList()

    16
    {
    //ваш код
    }
    bool addToTail(int x){//добавляем элемент в конец списка
    //ваш код
    }
    bool isEmpty(){ // пуст ли список
    //ваш код
    }
    void print() // вывод списка на печать
    {
    //ваш код
    }
    bool delFromEnd()
    {
    //ваш код
    }
    bool addAfterNode(int valueToSearch, int valueToAdd)
    //добавление после заданного узла
    {
    //ваш код
    }
    bool delNode(int valueToDelete) //удаление заданного узла
    {
    //ваш код
    }
    };
    int main()
    {
    TList myList;
    if (myList.isEmpty())
    for (int i=0; i<5; i++) myList.addToTail(i);
    if (!myList.isEmpty()) myList.print(); myList.addAfterNode(0,-1000);
    if (!myList.isEmpty()) myList.print(); myList.addAfterNode(2,-222);
    if (!myList.isEmpty()) myList.print(); myList.addAfterNode(4,-444);
    if (!myList.isEmpty()) myList.print(); myList.delNode(-222);

    17
    if (!myList.isEmpty()) myList.print();
    while (!myList.isEmpty())
    { myList.delFromEnd(); myList.print();
    }
    return 0;
    }
    Часть 2 (до 5 баллов). В данной лабораторной работе все описания классов должны быть вынесены в отдельный заголовочный файл. Реализация функций-элементов класса должна быть написана в отдельном модуле, а основную программу, иллюстрирующую применение всех методов вашего класса, следует реали- зовать еще одним модулем. Во всех заданиях предусмотрите конструкторы с аргументами по умолчанию, а также дружественную перегруженную операцию вывода в поток и чтения из потока. Помните, что в каж- дом классе должны быть предусмотрены константные функции get.
    Варианты
    1.
    Создайте класс с именем Complex для выполнения арифметических действий с комплексными числами. Напишите программу для проверки вашего класса. Комплексные числа должны быть представлены в форме RePart+ImPart*i, где i*i = –1. Используйте переменные с плавающей точкой для представления закрытых данных класса.
    Создайте конструктор, деструктор и открытые функции-элементы для следующих действий: a) сложение 2 комплексных чисел; b) вычитание 2 комплексных чисел; c) умножение 2 комплексных чисел.
    Перегрузите операцию вывода в поток для печати комплексного числа в виде |A|exp{i*z}.
    2.
    Cоздайте класс c именем Rational для выполнения арифметических действий с дробями. Напишите программу для проверки вашего класса. Используйте целые переменные для представления закры- тых данных класса – числителя и знаменателя. Создайте функцию-конструктор класса, которая по- зволяет объекту этого класса принимать начальные значения при его объявлении. Конструктор должен содержать значения по умолчанию на случай отсутствия заданных начальных и должен хранить дроби в сокращенном виде. Создайте открытые функции-элементы для случаев: a) сложение 2 дробей (здесь и далее результат должен храниться в сокращенном виде); b) вычитание 2 дробей; c) перемножение 2 дробей; d) деление 2 дробей; e) печать дроби в десятичном виде.
    Перегрузите операцию вывода в поток для печати дроби в виде а/b.
    3.
    То же, что и в варианте 2, но для дроби, числитель и знаменатель которой – комплексные числа.
    Перегруженная операция печати должна выглядеть следующим образом: на экран должна выво- диться дробь в виде (ReA+i*ImA)/(ReB+i*ImB).
    4.
    Модифицируйте класс myTime (о котором говорилось на лекциях) так, чтобы включить функцию- элемент tick, которая дает приращение времени, хранящегося в объекте myTime, равное одной се- кунде. Объект Time должен всегда находиться в непротиворечивом состоянии. Напишите про- грамму для проверки функции-элемента tick в цикле, которая печатала бы время в каком-либо

    18
    стандартном формате на каждой итерации цикла и иллюстрировала правильную работу функции- элемента tick. Удостоверьтесь в правильности работы в следующих случаях: a) приращение с переходом в следующую минуту; b) приращение с переходом в другой час; c) приращение с переходом в другой день.
    Предусмотрите перегруженную операцию вывода в поток, а также перегруженную операцию ин- кремента в префиксной и постфиксной формах.
    5.
    Модифицируйте класс myDate (о котором говорилось в лекциях) так, чтобы в нем присутствовала функция-элемент nextDay, которая будет увеличивать дату на 1 день. Объект myDate должен все- гда находиться в непротиворечивом состоянии. Напишите программу, проверяющую функцию nextDay в цикле и печатающую время в стандартном формате на каждой итерации цикла. Проверь- те правильность работы функции в следующих случаях: a) приращение с переходом в следующий месяц; b) приращение с переходом в следующий год.
    Предусмотрите перегруженную операцию вывода в поток, а также перегруженную операцию ин- кремента в префиксной и постфиксной формах.
    6.
    Создайте класс параллелограмм, который хранит только декартовы координаты его четырех углов.
    Конструктор вызывает набор функций, которые принимают 4 группы координат и проверяют, что- бы каждая из координат х и у находилась в первом квадранте в диапазоне от 0,0 до 50,0. Это мно- жество функций также должно проверять, что переданные координаты определяют параллело- грамм. Должны быть предусмотрены функции-элементы, вычисляющие длины сторон параллело- грамма, периметр и площадь. Включите функцию, которая определяла бы, не является ли паралле- лограмм прямоугольником.
    Перегрузите операцию вывода в поток для печати всей информации об объекте.
    7.
    Создайте класс Rectangle (прямоугольник). Класс имеет атрибуты length (длина) и width (ширина), каждый из которых по умолчанию равен 1. Он имеет функции-элементы, которые вычисляют пе- риметр и площадь прямоугольника. Он имеет функции записи и чтения для длины и ширины.
    Функции записи должны проверять, что длина и ширина – числа с плавающей запятой, находя- щиеся в пределах от 0,0 до 20,0.
    Перегрузите операцию вывод в поток для печати всей информации о прямоугольнике.
    8.
    Создайте класс прямоугольник, который хранит только декартовы координаты четырех углов пря- моугольника. Конструктор вызывает набор функций, которые принимают 4 группы координат и проверяют, чтобы каждая из координат х и у находилась в первом квадранте в диапазоне от 0,0 до
    20,0. Это множество функций также должно проверять, что переданные координаты определяют прямоугольник. Должны быть предусмотрены функции-элементы, вычисляющие длину и ширину прямоугольника, периметр и площадь. Включите функцию, которая определяла бы, не является ли прямоугольник квадратом.
    Перегрузите операцию вывод в поток для печати всей информации о прямоугольнике.
    9.
    Модифицируйте класс прямоугольник из варианта №8 так, чтобы включить в него функцию draw, которая изображает прямоугольник внутри окна 25 на 25. Включите функцию setFillCharacter, что- бы задавать символ, которым будет заполняться прямоугольник внутри. Включите функцию setPerimeterCharacter, чтобы задавать символ, которым будут печататься границы прямоугольника.
    Включите функцию поворота прямоугольника на 90 градусов вокруг одной из его вершин против и по часовой стрелке.

    19
    Перегрузите операцию вывод в поток для печати всей информации о прямоугольнике и рисования прямоугольника.
    10. Создайте класс треугольник, хранящий только декартовы координаты вершин. Конструктор вызы- вает набор функций, которые принимают 3 группы координат и проверяют, чтобы каждая из коор- динат х и у находилась в первом квадранте в диапазоне от 0,0 до 50,0. Функции также должны проверять, чтобы треугольник не «схлопывался» в прямую линию. Должны быть предусмотрены функции-элементы, вычисляющие длину сторон, периметр и площадь треугольника. Включите функцию, которая определяла бы, не является ли треугольник равнобедренным, равносторонним или прямоугольным.
    Перегрузите операцию вывода в поток для печати всей информации о треугольнике.
    11. Создайте класс треугольник, хранящий длины двух сторон и значение угла между ними. Должны быть предусмотрены функции-элементы, вычисляющие длину третьей стороны, значения 2 остав- шихся углов, периметр и площадь треугольника. Включите функцию, которая определяла бы, не является ли треугольник равнобедренным, равносторонним или прямоугольным.
    Перегрузите операцию вывода в поток для печати всей информации о треугольнике.
    12. Создайте класс прямая призма, хранящий только декартовы координаты вершин основания и вы- соту призмы. Конструктор вызывает набор функций, которые принимают группы координат и про- веряют, чтобы каждая из координат х и у находилась в первом квадранте в диапазоне от 0,0 до
    250,0. Должны быть предусмотрены функции-элементы, вычисляющие длину ребер, периметр и площадь основания, а также площадь боковой поверхности, площадь поверхности и объем призмы.
    Перегрузите операцию вывода в поток так, чтобы она печатала, какая фигура лежит в основании, и ее основные характеристики.
    13. Создайте класс пирамида, хранящий только декартовы координаты вершин основания и вершины пирамиды. Конструктор вызывает набор функций, которые принимают группы координаты. Долж- ны быть предусмотрены функции-элементы, вычисляющие длину ребер, периметр и площадь ос- нования, а также площадь боковой поверхности, площадь поверхности и объем пирамиды.
    Перегрузите операцию вывода в поток так, чтобы она печатала, какая фигура лежит в основании, и ее основные характеристики.
    14. Создайте класс конус, хранящий только декартовы координаты центра основания, радиус основа- ния и высоту конуса. Должны быть предусмотрены функции-элементы, рассчитывающие периметр и площадь основания, а также площадь боковой поверхности, площадь поверхности и объем кону- са.
    Перегрузите операцию вывода в поток для печати всей информации об объекте.
    15. Создайте класс усеченный конус, хранящий только декартовы координаты центра основания, ра- диусы оснований и высоту конуса. Должны быть предусмотрены функции-элементы, рассчиты- вающие периметр и площадь оснований, а также площадь боковой поверхности, площадь поверх- ности и объем конуса.
    Перегрузите операцию вывода в поток для печати всей информации об объекте.
    16. Создайте класс усеченная пирамида, хранящий только декартовы координаты вершин оснований.
    Конструктор вызывает набор функций, которые принимают группы координат одного основания.
    Высота пирамиды задается случайным образом, координаты второго основания вычисляются в со- ответствии с высотой. Должны быть предусмотрены функции-элементы, вычисляющие периметр и

    20
    площадь основания, а также площадь боковой поверхности, площадь поверхности и объем пира- миды.
    Перегрузите операцию вывода в поток для печати всей информации об объекте (какая фигура ле- жит в основании, ее основные характеристики).
    17. Создайте класс "Спортсмен", в котором будут храниться данные о ФИО атлета, представляемой стране, виде спорта, установленных рекордах, завоеванных местах на первенствах страны, конти- нента, мира и олимпиадные достижения. Предусмотрите методы "Установить рекорд", "Получить медаль" (помните, что медали бывают разные...). Предусмотрите также все необходимые методы установки и чтения данных-элементов.
    Перегрузите операцию вывода в поток для вывода информации о спортсмене.
    18. Создайте класс «Запись в адресной книге». В нем хранятся фамилия и имя человека, номера теле- фонов (нескольких, в т.ч. домашних, рабочих и сотовых), район и адрес проживания, e-mail (не- сколько). Конструктор должен вызывать функцию, считывающую эти данные из текстового файла.
    Напишите функции-элементы для установки и чтения данных. Предусмотрите метод поиска номе- ров сотовых телефонов, метод формирования текстового файла с заголовком и подписью (как заго- товки письма на электронный адрес).
    Перегрузите операцию вывода в поток для печати информации об объекте вида «Запись в адресной книге».
    19. Создайте класс матрица размерностью
    n n

    , который хранит только размерность матрицы и мак- симальное по модулю значение элемента матрицы (и указатель на целое). Конструктор должен вы- зывать функцию заполнения матрицы случайными числами в заданном диапазоне. Напишите функции-элементы для: a) транспонирования матрицы; b) умножения матрицы на число; c) сложения матриц; d) умножения двух матриц.
    Перегрузите операцию вывода в поток для печати всей информации об объекте. Перегрузите также оператор вычитания матриц.
    20. Создайте класс правильный многоугольник, который хранит число вершин и их координаты. Кон- структор вызывает набор функций, которые проверяют, чтобы число вершин было не менее 3, что- бы многоугольник был правильным, и в случае ошибки устанавливают значения всех вершин в 0.
    Должны быть предусмотрены функции-элементы, вычисляющие периметр, площадь многоуголь- ника. Должна быть предусмотрена функция-элемент вывода на печать информации о числе сторон многоугольника. Напишите программу-драйвер, иллюстрирующую применение вашего класса.
    Перегрузите операцию вывода в поток для печати всей информации об объекте.

    21
    Лабораторная работа № 6. Наследование
    Создайте иерархию классов, используя наследование. В каждой программе необходимо соблюсти принцип разделения интерфейса и реализации класса (иными словами, не забывайте выделять заголовоч- ные файлы). В каждом варианте необходимо написать программу, иллюстрирующую применение всех ме- тодов ваших классов. Прежде чем приступить к написанию программ, продумайте (или уточните у препо- давателя), какие необходимы функции в каждом из классов (может, где-то необходимо считать координа- ты, где-то площади и объемы, а где-то хранить фамилии и года поступления): как в базовом, так и в клас- сах-наследниках. Также продумайте, что следует поместить в закрытые (а, возможно, защищенные) пере- менные. Предусмотрите возможность переопределения методов базового класса в производном. Приветст- вуется демонстрация наследования перегруженных операций. Возможно, в некоторых вариантах лучше воспользоваться композицией, чем наследованием.
    Варианты
    1. Точка -> Квадрат -> Куб.
    2. Четырехугольник -> Трапеция -> Параллелограмм.
    3. Точка -> Четырехугольник -> Параллелепипед.
    4. Точка -> Треугольник -> Треугольная призма.
    5. Точка -> Круг -> Сфера.
    6. Факультет: a) администрация; b) преподаватель; c) студент.
    7. Учащийся в университете: a) студент; b) аспирант; c) слушатель.
    8. Студент: a) первокурсник; b) студент 2-4 курса; c) дипломник.
    9. Круг -> Конус -> Усеченный конус.
    10. Треугольник -> Треугольная пирамида -> Усеченная треугольная пирамида.
    11. Прямолинейное движение делится на равномерное и равноускоренное. Равноускоренное в свою очередь может реализовываться свободным падением по вертикали.
    12. Криволинейное движение можно разбить на движение по окружности и падение тела, брошенного под углом к горизонту. Из движения тела, брошенного под углом к горизонту, можно выделить свободное падение тела, брошенного горизонтально.
    13. Спортсмен -> Легкоатлет -> Спринтер.
    14. Точка -> Треугольник -> Равнобедренный треугольник -> Равносторонний треугольник.
    15. Транспортное средство: a) трамвай; b) троллейбус; c) автобус.
    16. Чемпионат по программированию -> Университетский тур -> Городской тур -> Областной тур.
    17. Студент -> Математик -> Математик-программист.
    18. Среди накопителей информации можно выделить такие классы, как жесткий диск и флеш-карта.
    Среди жестких дисков, в свою очередь, можно выделить класс съемных дисков.

    22 19. Точка -> Треугольник -> Прямоугольный треугольник -> Равнобедренный прямоугольный тре- угольник.
    20. Точка –> Четырехугольник -> Ромб -> Квадрат.
    Лабораторная работа № 7. Виртуальные функции и полиморфизм
    Часть 1 (до 3 баллов)
    Вам даны классы BinaryOperation (бинарный оператор) и Number (число), которые наследуются от ба- зового класса Expression (выражение). Ваша задача реализовать базовый класс Expression так, чтобы не бы- ло утечек памяти. Кроме этого подумайте, какие методы стоит сделать виртуальными.
    #
    include // assert
    using namespace std;
    struct Expression
    {
    // здесь должен быть ваш код
    };
    struct Number : Expression
    {
    Number(
    double value) : value_(value) {}
    double value() const { return value_; }
    double evaluate() const { return value_; }
    private:
    double value_;
    };
    struct BinaryOperation : Expression
    {
    enum {
    PLUS = '+',
    MINUS = '-',
    DIV = '/',
    MUL = '*'
    };
    BinaryOperation(Expression
    const *left, int op,
    Expression
    const *right):left_(left), op_(op), right_(right)
    { assert(left_ && right_);
    }

    BinaryOperation()
    {
    delete left_;
    delete right_;
    }
    Expression
    const *left() const { return left_; }
    Expression
    const *right() const { return right_; }
    int operation() const { return op_; }

    23
    double evaluate() const
    {
    double left = left_->evaluate();
    double right = right_->evaluate();
    switch (op_)
    { case PLUS:
    return left + right; case MINUS:
    return left - right; case DIV:
    return left / right; case MUL:
    return left * right;
    } assert(0);
    return 0.0;
    }
    private:
    Expression
    const *left_;
    Expression
    const *right_;
    int op_;
    };
    Проверьте полученную иерархию на следующем фрагменте кода:
    //------------------------------------------------------------
    Expression * e1 =
    new Number(1.234);
    Expression * e2 =
    new Number(-1.234);
    Expression * e3 =
    new BinaryOperation(e1,
    BinaryOperation::DIV, e2);
    cout<evaluate()<<endl;
    //------------------------------------------------------------
    1   2   3   4   5   6


    написать администратору сайта