Что такое рациональная программа в информатике

Задача решаемая в этой статье очень похожа на Класс рациональной дроби, но опять же — с другим набором перегруженных функций и операторов (их стало больше).

Постановка задачи

Реализовать на языке С++ класс для представления рационального числа. В классе должны быть перегрузки основных операций.

В данном классе нет прямой работы с памятью, так что нет необходимости реализовывать деструктор, конструктор копирования, оператор присваивания. Созданные по умолчанию отлично справятся.

Стоит обратить внимание, что дроби необходимо сокращать. Рациональное число 4/10 = 2/5. Для сокращения дроби потребуется найти НОД и поделить на него числитель и знаменатель. Найти НОД можно через Алгоритм Евклида: описание алгоритма в картинках, реализация алгоритма на С++.

  • Создан класс для представления рационального числа (хранит числитель m и знаменатель n в сокращенном виде).
  • Реализованы конструкторы: по умолчанию (0/1), с одним параметром (m/1), конструктор с двумя параметрами (m/n).
  • Операции с рациональными числами:
  • вернуть целое число (3/5 → 0, 5/2 → 2)
  • вернуть вещественное число (3/5 → 0.6, 5/2 → 2.5)
  • вернуть обратное к рациональному числу (3/5 → 5/3)

class RationalFraction < public: RationalFraction(); RationalFraction(int numerator); RationalFraction(int numerator, int denominator); // . private: void simplify(); void check() const; int m_numerator, m_denominator; >;

Метод simplify выполняет упрощение дроби — при этом он вызывает функцию вычисления НОД и делит на него числитель и знаменатель. Так, например, у дроби 36/12 много делителей — 1, 2, 3, 4, 6, 12 , однако, чтобысократить дробь за один шаг — надо числитель и знаменатель поделить на 12 (это число является НОД). Также, метод упрощения следит за тем, чтобы знаменатель не становился меньше ноля — такая ситуация может возникать, например, при сложении чисел:

void RationalFraction::simplify() < int gcd = math_plus::greatest_common_divisor(std::abs(m_numerator), std::abs(m_denominator)); m_numerator /= gcd; m_denominator /= gcd; if (m_denominator < 0) < m_denominator *= -1; m_numerator *= -1; >>

Метод check выполняет проверку корректности (что знаменатель не равен нулю), при нарушении этого правила — вырабатывается исключение:

void RationalFraction::check() const < if (m_denominator == 0) < throw std::overflow_error(«denominator is zero»); >>

Методы simplify и check введены потому, что выполнять упрощение и проверку надо многократно в различных других фукнциях класса, вынесение этого кода в отдельные функции устраняет дублирование. Метод check помечен как const потому что он не изменяет данные класса — такая пометка позволяет вызывать метод для константных объектов. Эти методы находятся в секции private , так как пользователю никогда не придется явно вызывать их — дробь всегда будет находится в упрощенном виде и являться корректной.

class RationalFraction < public: // . int toInt() const; double toReal() const; RationalFraction getInverse() const; bool operator==(const RationalFraction bool operator!=(const RationalFraction bool operator>(const RationalFraction bool operator>=(const RationalFraction bool operator<(const RationalFraction bool operator<=(const RationalFraction //. >

Читайте также:
Создать связь в панели управления программы по умолчанию с электронной почтой как

Видно, что в классе также описываются методы toInt, toReal и getInverse , реализуются они тривиально. Чуть cложнее дело обстоит с операторами сравнения. Часть операторов выражается через другие — так, например, оператор == честно сравнивает числитель и знаменатель, а оператор != пользуется его результатами. Операторы < и >реализуются через метод toReal :

bool RationalFraction::operator==(const RationalFraction return m_numerator == rhs.m_numerator m_denominator == rhs.m_denominator; >bool RationalFraction::operator!=(const RationalFraction return !(*this == rhs); >bool RationalFraction::operator>(const RationalFraction return toReal() >rhs.toReal(); >

Стоит обратить внимание, что описанный выше конструктор от одного аргумента не помечен как explicit, за счет этого компилятор допускает неявное преобразовавание типа int в тип RationalFraction, за счет этого может работать, например такая конструкция:

RationalFraction a(1, 2) if (a > 2)

Тут тип int (чило 2 ) будет неявно преобразован в дробь RationalFraction(2, 1) с помощью этого конструктора, а затем — вызовется оператор сравнения, описанный выше. Однако, такая конструкция сработает только если слева от оператора сравнения стоит объект типа RationalFraction (который не требуется приводить). Чтобы работал такой код:

RationalFraction a(1, 2) if (2

Необходимо, помимо к описанным операторам, добавить «дружественные» операторы от двух аргументов, первым из которых является целое число:

class RationalFraction < public: // . friend bool operator==(const int lhs, const RationalFraction friend bool operator!=(const int lhs, const RationalFraction friend bool operator>(const int lhs, const RationalFraction friend bool operator>=(const int lhs, const RationalFraction friend bool operator<(const int lhs, const RationalFraction friend bool operator<=(const int lhs, const RationalFraction // . >;

Каждая из этих функций может реализовываться через вызов «симметричного» метод класса, например:

bool operator!=(const int lhs, const RationalFraction return rhs != lhs; >bool operator>(const int lhs, const RationalFraction return rhs < lhs; >bool operator>=(const int lhs, const RationalFraction public: // . RationalFraction operator+(const RationalFraction RationalFraction operator-(const RationalFraction RationalFraction operator*(const RationalFraction RationalFraction operator/(const RationalFraction RationalFraction operator+=(const RationalFraction RationalFraction operator-=(const RationalFraction RationalFraction operator*=(const RationalFraction RationalFraction operator/=(const RationalFraction friend RationalFraction operator+(const int lhs, const RationalFraction friend RationalFraction operator-(const int lhs, const RationalFraction friend RationalFraction operator*(const int lhs, const RationalFraction friend RationalFraction operator/(const int lhs, const RationalFraction //. >;

Эти операторы реализуют математические правила выполнения соответствующих операций:

(a, b) + (c, d) = (a*d + b*c, b*d) (a, b) * (c, d) = (a*c, b*d) (a, b) / (c, d) = (a*d, b*c) (a, b) — (c, d) = (a, b) + -(c, d)

Видно, что операция вычитания выражается через сложение и унарный минус (инвертирующий знак числителя).

Арифметические операции совмещенные с операцией присваивания (строки 9-12) реализуются через базвые операции и оператор присваивания, генерируемый компилятором автоматически:

RationalFraction RationalFraction::operator* (const RationalFraction int a = m_numerator, b = m_denominator, c = rhs.m_numerator, d = rhs.m_denominator; RationalFraction result(a*c, b*d); return result; >RationalFraction RationalFraction::operator*= (const RationalFraction *this = *this*rhs; return *this; >RationalFraction operator*(const int lhs, const RationalFraction

  • постфиксный оператор создает копию объекта, выполняет операцию, возвращает копию объекта (со значением до выполнения операции).
  • Читайте также:
    Пример программа обучения безопасным методам и приемам выполнения работ

    Как закрывают программы учителя информатики и программисты.

    Информатика. 8 класс. Тестирование программы /06.05.2021/

    Эти операторы имеют разное поведение, но одинаковое имя метода, поэтому для постфиксной формы оператора в функцию передается один неиспользуемый аргумент целого типа:

    class RationalFraction < public: // . RationalFraction operator++(); // префиксная форма RationalFraction operator++(int); // постфиксная форма RationalFraction operator—(); RationalFraction operator—(int); //. >

    При реализации постфиксная форма может выражаться через префиксную, но выполнять создание копии. Стоит обратить внимание, что после выполнения такой операции может потребоваться сокращение дроби, поэтому эта функция использует описанные выше check и simplify :

    RationalFraction RationalFraction::operator++() < m_numerator += m_denominator; check(); simplify(); return *this; >RationalFraction RationalFraction::operator++(int)

    В большинстве других, рассмотренных тут функций, явный вызов check и simplify не требуется, так как новый объект воздается через конструктор от двух параметров, уже выполняющий проверку и сокращение дроби.

    Последние операторы нашего класса выполняют потоковый ввод и вывод. Эти операторы, реализованы как внешние функции, а так как им требуется доступ к закрытым полям класса — описаны дружественными:

    class RationalFraction < public: //. friend std::istream>(std::istream value); friend std::ostream<(std::ostream value); //. >

    При вводе оператор считывает с потока два целых числа и выполняет проверку и сокращение, при выводе — число помещается в скобки, части дроби разделяются символом деления:

    std::istream>(std::istream value) < ist >> value.m_numerator >> value.m_denominator; value.check(); value.simplify(); return ist; > std::ostream$$

  • запрашивает у пользователя новое значение для переменной b (допустим, введено 50/30), программа выполняет новый расчет и выводит на экран новое состоение переменных:
    $$a = frac= frac, \
    b = frac= frac<2cdot frac><(frac)> = frac<(frac)> = frac, \
    c = d cdot 1 = frac;$$
  • выполняет проверку операции сравнения, вычитания и унарного минуса и деления с присваиванием, выводит на экран данные еще раз:
    $$a = a — d = frac— frac= frac= frac, \
    c = frac= frac<(frac)><(frac<-3>)> = frac;$$
  • наконец, выполняется проверка постфиксный и префиксных операций.
  • Функция main отражает основные возможности класса:

    #include «rational_fraction.h» #include using namespace std; int main() < RationalFraction a(1, 2), b(1, 3), c(5), d; cout : «; cin >> b; d = 2*a/b; c = d*1; cout else < cout a = a-d; c /= -d; cout else < cout if (d < d) < cout else < cout if (d else < cout /* if (d > 2) < cout 2″ else < cout 2»; > */ >

    Остальной код можно взять в репозитории. Результат работы программы (для ввода 50/30) показан на рисунке:

    Источник: pro-prof.com

    О представлении чисел в ЭВМ. Когда нельзя считать точно. Рациональные числа

    3. Рациональная методология.

    Является средним между описанными ранее методологиями. Сочетает в себе достоинства обоих: высокая гибкость, возможность стандартизации, меньше дублирование деятельности. При использовании рациональной методологии использования информационной технологии:

    3.1. Вычислительный центр отвечает за выработку общей стратегии использования информационной технологии, ее стандартизацию, обеспечивает поддержку пользователей технологии: обучение, помощь в работе;

    3.2. Персонал, использующий информационную технологию, выполняет требования (стандарты) вычислительного центра, может разрабатывать свои локальные системы и технологии в соответствии со стратегией, определяемой вычислительным центром.

    Читайте также:
    Программа для набора мышечной массы для новичков

    Дайте общее представление об информационной технологии обработки данных и назовите их ос­новные компоненты.

    Информационная технология обработки данных предназначена для решения хорошо структурированных задач, по которым имеются необходимые входные данные и известны алгоритмы и другие стандартные процедуры их обработки. Эта технология применяется на уровне операционной (исполнительской) деятельности персонала невысокой квалификации в целях автоматизации некоторых рутинных постоянно повторяющихся операций управленческого труда. Основные компоненты информационной технологии обработки данных:

    Сбор данных. По мере того как фирма производит продукцию или услуги, каждое ее действие сопровождается соответствующими записями данных. Обычно действия фирмы, затрагивающие внешнее окружение, выделяются особо как операции, производимые фирмой.

    Обработка данных. Для создания из поступающих данных информации, отражающей деятельность фирмы, используются следующие типовые операции:

    • классификация или группировка. Первичные данные обычно имеют вид кодов, состоящих из одного или нескольких символов. Эти коды, выражающие определенные признаки объектов, используются для идентификации и группировки записей.
    • сортировка, с помощью которой упорядочивается последовательность записей;
    • вычисления, включающие арифметические и логические операции. Эти операции, выполняемые над данными, дают возможность получать новые данные;
    • укрупнение или агрегирование, служащее для уменьшения количества данных и реализуемое в форме расчетов итоговых или средних значений.

    Хранение данных. Многие данные на уровне операционной деятельности необходимо сохранять для последующего использования либо здесь же, либо на другом уровне. Для их хранения создаются базы данных.

    Создание отчетов (документов). В информационной технологии обработки данных необходимо создавать документы для руководства и работников фирмы, а также для внешних партнеров. При этом документы могут создаваться как по запросу или в связи с проведенной фирмой операцией, так и периодически в конце каждого месяца, квартала или года.

    Дайте общее представление об информационной технологии управления и назовите их ос­новные компоненты.

    Целью информационной технологии управления является удовлетворение информационных потребностей всех без исключения сотрудников фирмы, имеющих дело с принятием решений. Эта технология ориентирована на работу в среде информационной системы управления и используется при худшей структурированности решаемых задач, если их сравнивать с задачами, решаемыми с помощью информационной технологии обработки данных.

    Для принятия решений на уровне управленческого контроля информация должна быть представлена в агрегированном виде так, чтобы просматривались тенденции изменения данных, причины возникших отклонений и возможные решения. На этом этапе решаются следующие задачи обработки данных:

    • оценка планируемого состояния объекта управления;
    • оценка отклонений от планируемого состояния;
    • выявление причин отклонений;
    • анализ возможных решений и действий.

    Информационная технология управления направлена на создание различных видов отчетов, таких как:

    • Регулярные отчеты
    • Специальные отчеты
    • Суммирующие отчеты
    • Сравнительные отчеты
    • Чрезвычайные отчеты .

    При использовании на фирме принципов управления по отклонениям к создаваемым отчетам предъявляются следующие требования:

    • отчет должен создаваться только тогда, когда отклонение произошло;
    • сведения в отчете должны быть отсортированы по значению критического для данного отклонения показателя;
    • все отклонения желательно показать вместе, чтобы менеджер мог’ уловить существующую между ними связь;
    • в отчете необходимо показать количественное отклонение от нормы.

    Основные компоненты информационной технологии управления

    Источник: studfile.net

    Рейтинг
    ( Пока оценок нет )
    Загрузка ...
    EFT-Soft.ru