Программирование рациональных дробей


Разработать ООП вычисления обыкновенной дроби до ближайшего целого числа, значение которого будет не меньше ее величины по модулю. Символьная запись дроби должна передаваться программе в качестве аргумента командной строки, где числитель и знаменатель разделены знаком ‘/’. Результирующее дополнение должно отображаться строкой стандартного вывода в том же символьном формате. Программная реализация вычислений должна быть основана на разработке класса обыкновенной дроби с приватными полями целочисленных данных для ее числителя и знаменателя, а также публичным компонентным методом перегрузки оператора ‘~’. Конструкторы этого класса должны обеспечивать преобразование символьной записи дроби в числовой формат и инициализацию значений ее числителя и знаменателя. Кроме того, нужно предусмотреть компонентный метод приведения дроби к несократимому виду, использующий алгоритм Евклида для вычисления наибольшего общего делителя (НОД) ее числителя и знаменателя, а также компонентный оператор преобразования числовой записи дроби в формат символьной строки для стандартного вывода результатов вычислений.

//Дополнение дроби до целого числа

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <iostream>

using std::cout;

using std::endl;

int euclide(int, int);//функция алгоритма Евклида

class Fraction {//класс обыкновенной дроби

private:

int nom; //числитель(nominator)дроби

int den; //знаменатель (denominator) дроби

public:

Fraction(char*);//символьный конструктор

Fraction(int n=0, int m=1) : nom(n), den(m) {};

Fraction operator~();//оператор дополнения

operator char*();// оператор преобразования типа записи дроби

void reduce();//метод сокращения дроби

}; // class Fraction

//конструирование дроби по символьной записи «n/m=s»

Fraction::Fraction(char* s) {

char* p = strchr(s, '/'); //адресовать '/' в символьной записи дроби

den = 1; //инициализировать знаменатель дроби

if(p != NULL) {//вычисление знаменателя дроби

*p++ = '\0'; // адресовать знаменатель и заменить '/' на '\0'

den = atoi(p); //преобразовать запись знаменателя в целое число

} // if

nom = atoi(s); //преобразовать запись числителя в целое число

}// Fraction

//оператор дополнения дроби до целого:

Fraction Fraction::operator~() {

int k = 0; //кратность знаменателя

int sign = (nom < 0) ? -1 : 1; //фиксировать знак числителя

int n = sign * nom; //модуль числителя дроби

while(k < n) //Найти наименьшее число, которое не меньше числителя

k += den; //по модулю кратно знаменателю дроби

n = (k - n); //модуль числителя дополнения

return Fraction(n * sign, den); //анонимный возврат дополнения

} // operator~

//оператор преобразования дроби в символьный формат ”n/m”

Fraction::operator char* () {

static char s[32]; //строка для символьной записи дроби

sprintf(s, "%d/%d", nom, den); //символьная запись дроби

return s; //возврат адреса символьной записи дроби

} // operator char*

//метод приведения дроби к несократимому виду

void Fraction::reduce() {

int gcd; //наименьший общий делитель (НОД)

gcd = euclide(abs(nom), den);//вычисление НОД знаменателя и модуля числителя

nom /= gcd; //сокращение числителя на НОД

den /= gcd; // сокращение знаменателя на НОД

return; //возврат из метода сокращения дроби

}// reduce

//вычисление наибольшего общего делителя НОД(m,n) по алгоритму Евклида

int euclide(int n, int m) {

int r = 1; //остаток деления

while(n != 0) {//цикл уменьшения чисел m и n

r = m % n; //найти остаток целочисленного деления m на n

m = n; //уменьшение m и n без

n = r; //изменения НОД

} // while

return(m); //возврат НОД(m,n)

} // euclide

int main(int argc, char* argv[]) {//основная функция

if(argc < 2) //проверка числа аргументов командной строки

return(puts("Usage: complement nomerator/denomerator"));

Fraction x(argv[1]); //получить исходную дробь в числовом формате

Fraction y; //инициализация дополнения конструктором по умолчанию

x.reduce();//сокращение исходной дроби

y = ~x; //вычисление дополнения дроби

cout << (char*) y << endl; //стандартный вывод дополнения дроби

return(0); //корректное завершение программы

} // main

Примеры дополнений: ~6/7=1/7; ~-23/5=-2/5.

Варианты заданий для третьей лабораторной работы

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу преобразования заданной обыкновенной дроби в конечную десятичную дробь. Обыкновенная дробь должна передаваться программе аргументом командной строки, где записи числителя и знаменателя десятичными цифрами разделены знаком '/'. Результат преобразований должна отображать запись вещественного числа с фиксированной точкой строкой стандартного вывода. Программная реализация этого преобразования должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также оператором преобразования типа для получения вещественного числа по результату их деления. Конструктор класса должен обеспечивать представление исходной символьной записи обыкновенной дроби парой взаимно простых целочисленных значений ее числителя и знаменателя. Для приведения обыкновенной дроби к несократимому виду необходимо предусмотреть компонентный метод, реализующий алгоритм Евклида.

R1

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу для округления заданной обыкновенной дроби до ближайшего целого числа, значение которого не превосходит ее величину. Запись обыкновенной дроби должна передаваться программе аргументом командной строки, где числитель и знаменатель разделены знаком '/'. Результат округления должен отображаться строкой потока стандартного вывода. Программная реализация округления должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также оператором преобразования типа, который преобразует результат их деления в целое число. Конструктор класса должен обеспечивать представление исходной символьной записи обыкновенной дроби парой взаимно простых целочисленных значений ее числителя и знаменателя. Для приведения обыкновенной дроби к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида.

R2

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу для округления заданной обыкновенной дроби до ближайшего целого числа, значение которого должно быть не меньше ее величины. Запись обыкновенной дроби должна передаваться программе аргументом командной строки, где числитель и знаменатель разделяет знак '/'. Результат округления должен отображаться строкой потока стандартного вывода. Программная реализация округления должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также оператором преобразования типа, который преобразует результат их деления в целое число. Конструктор класса должен обеспечивать представление исходной символьной записи обыкновенной дроби парой взаимно простых целочисленных значений ее числителя и знаменателя. Для приведения обыкновенной дроби к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида.

R3

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу представления заданной обыкновенной дроби в виде суммы целой и правильной дробной части. Обыкновенная дробь должна передаваться программе аргументом командной строки, где записи числителя и знаменателя десятичными цифрами разделяет символ '/'. Результат преобразований должен отображаться строкой стандартного вывода, где записи целой и правильной дробной части обыкновенной дроби разделены символом'+'. Программная реализация преобразований должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя. Получение их значений по заданной символьной записи обыкновенной дроби должен обеспечивать конструктор класса. Их функциональную обработку должен обеспечивать компонентный оператор преобразования типа для вычисления целой части обыкновенной дроби и компонентный оператор '−' для перегрузки операции вычитания его из исходной дроби.

R4

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу представления заданной обыкновенной дроби в виде разности целой и правильной дробной части. Обыкновенная дробь должна передаваться программе аргументом командной строки, где записи числителя и знаменателя десятичными цифрами разделяет символ '/'. Результат преобразований должен отображаться строкой стандартного вывода, где записи целой и правильной дробной части обыкновенной дроби разделены символом'−'. Программная реализация преобразований должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя. Получение их значений по заданной символьной записи обыкновенной дроби должен обеспечивать конструктор класса. Их функциональную обработку должен обеспечивать компонентный оператор преобразования типа для вычисления целой части обыкновенной дроби и компонентный оператор '−' для перегрузки операции вычитания ее из исходной дроби.

R5

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу для вычисления суммы обыкновенной дроби и целого числа, которые должны передаваться ей через аргументы командной строки. Результат сложения должен отображаться строкой потока стандартного вывода в формате обыкновенной дроби. Во всех случаях для записи обыкновенной дроби должен применяться символьный формат, где ее числитель и знаменатель разделены знаком '/'. Программная реализация вычислений должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также компонентным методом перегрузки оператора '+'. Конструкторы класса должны выполнять преобразования обоих операндов в указанный числовой формат обыкновенных дробей. Для приведения исходной и результирующей обыкновенных дробей к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида, и перегрузку оператора присваивания.

R6

---------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу для вычисления разности обыкновенной дроби и целого числа, которые должны передаваться ей через аргументы командной строки. Результат вычитания должен отображаться строкой потока стандартного вывода в формате обыкновенной дроби. Во всех случаях для записи обыкновенной дроби должен применяться символьный формат, где ее числитель и знаменатель разделены знаком '/'. Программная реализация вычислений должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также компонентным методом перегрузки оператора '−'. Конструкторы класса должны выполнять преобразования обоих операндов в указанный числовой формат обыкновенных дробей. Для приведения исходной и результирующей обыкновенных дробей к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида, и перегрузку оператора присваивания.

R7

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу для перемножения обыкновенной дроби и целого числа. Оба операнда должны передаваться ей через аргументы командной строки. Результат умножения должен отображаться строкой потока стандартного вывода в формате обыкновенной дроби. Во всех случаях для записи обыкновенной дроби должен применяться символьный формат, где ее числитель и знаменатель разделены знаком '/'. Программная реализация вычислений должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также компонентным методом перегрузки оператора '*'. Конструкторы класса должны выполнять преобразования обоих операндов в указанный числовой формат обыкновенных дробей. Для приведения исходной и результирующей обыкновенных дробей к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида, и перегрузку оператора присваивания.

R8

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу для деления обыкновенной дроби на целое число. Оба операнда должны передаваться ей через аргументы командной строки. Результат деления должен отображаться строкой потока стандартного вывода в формате обыкновенной дроби. Во всех случаях для записи обыкновенной дроби должен применяться символьный формат, где ее числитель и знаменатель разделены знаком '/'. Программная реализация вычислений должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также компонентным методом перегрузки оператора '/'. Конструкторы класса должны выполнять преобразования обоих операндов в указанный числовой формат обыкновенных дробей. Для приведения исходной и результирующей обыкновенных дробей к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида, и перегрузку оператора присваивания.

R9

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу для вычисления суммы обыкновенных дробей, которые должны передаваться ей через два аргумента командной строки. Результат суммирования должен отображаться строкой стандартного вывода в формате обыкновенной дроби. Во всех случаях для записи обыкновенных дроби должен применяться символьный формат, где ее числитель и знаменатель разделены знаком '/'. Программная реализация вычислений суммы должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также компонентным методом перегрузки оператора '+'. Конструкторы класса должны выполнять преобразования обоих операндов в указанный числовой формат обыкновенных дробей. Для приведения исходных и результирующей обыкновенных дробей к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида, и перегрузку оператора присваивания.

R10

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу для вычисления разности обыкновенных дробей, которые должны передаваться ей через два аргумента командной строки. Результат вычитания должен отображаться строкой стандартного вывода в формате обыкновенной дроби. Во всех случаях для записи обыкновенной дроби должен применяться символьный формат, где ее числитель и знаменатель разделены знаком '/'. Программная реализация вычислений разности должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также компонентным методом перегрузки оператора '−'. Конструкторы класса должны выполнять преобразования обоих операндов в указанный числовой формат обыкновенных дробей. Для приведения исходных и результирующей обыкновенных дробей к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида, и перегрузку оператора присваивания.

R11

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу для вычисления произведения двух обыкновенных дробей, которые должны передаваться ей через аргументы командной строки. Результат умножения должен отображаться строкой потока стандартного вывода в формате обыкновенной дроби. Во всех случаях для записи обыкновенной дроби должен применяться символьный формат, где ее числитель и знаменатель разделены знаком '/'. Программная реализация вычислений должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также компонентным методом перегрузки оператора '*'. Конструкторы класса должны выполнять преобразования обоих операндов в указанный числовой формат обыкновенных дробей. Для приведения исходных и результирующей обыкновенных дробей к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида, и перегрузку оператора присваивания.

R12

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу вычисления отношения обыкновенных дробей, которые должны передаваться ей через два аргумента командной строки. Результат этой операции деления должен отображаться строкой потока стандартного вывода в формате обыкновенной дроби. Во всех случаях для записи обыкновенной дроби должен применяться символьный формат, где ее числитель и знаменатель разделены знаком '/'. Программная реализация вычислений должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также компонентным методом перегрузки оператора '/'. Конструкторы класса должны выполнять преобразования обоих операндов в указанный числовой формат обыкновенных дробей. Для приведения исходных и результирующей обыкновенных дробей к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида, и перегрузку оператора присваивания.

R13

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу для вычисления суммы целого числа и обыкновенной дроби, которые должны передаваться ей через аргументы командной строки. Результат операции должен отображаться строкой потока стандартного вывода в формате обыкновенной дроби. В любом случае для записи обыкновенной дроби должен применяться символьный формат, где ее числитель и знаменатель разделены знаком '/'. Программная реализация вычислений должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также дружественным методом перегрузки оператора '+'. Конструкторы класса должны выполнять преобразования обоих операндов в указанный числовой формат обыкновенных дробей. Для приведения исходной и результирующей обыкновенных дробей к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида, и перегрузку оператора присваивания.

R14

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу для вычисления разности целого числа и обыкновенной дроби, которые должны передаваться ей через аргументы командной строки. Результат операции должен отображаться строкой потока стандартного вывода в формате обыкновенной дроби. В любом случае для записи обыкновенной дроби должен применяться символьный формат, где ее числитель и знаменатель разделены знаком '/'. Программная реализация вычислений должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также дружественным методом перегрузки оператора '−'. Конструкторы класса должны выполнять преобразования обоих операндов в указанный числовой формат обыкновенных дробей. Для приведения исходной и результирующей обыкновенных дробей к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида, и перегрузку оператора присваивания.

R15

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу для перемножения целого числа и обыкновенной дроби, которые должны передаваться ей через аргументы командной строки. Результат операции должен отображаться строкой потока стандартного вывода в формате обыкновенной дроби. В любом случае для записи обыкновенной дроби должен применяться символьный формат, где ее числитель и знаменатель разделены знаком '/'. Программная реализация вычислений должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также дружественным методом перегрузки оператора '*'. Конструкторы класса должны выполнять преобразования обоих операндов в указанный числовой формат обыкновенных дробей. Для приведения исходной и результирующей обыкновенных дробей к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида, и перегрузку оператора присваивания.

R16

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу деления целого числа на обыкновенную дробь. Оба операнда должны передаваться ей через аргументы командной строки. Результат деления должен отображаться строкой потока стандартного вывода в формате обыкновенной дроби. В любом случае для записи обыкновенной дроби должен применяться символьный формат, где ее числитель и знаменатель разделены знаком '/'. Программная реализация требуемых вычислений должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений числителя и знаменателя, а также компонентным методом перегрузки оператора '/'. Конструкторы класса должны выполнять преобразования обоих операндов в указанный числовой формат обыкновенных дробей. Для приведения исходной и результирующей обыкновенных дробей к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида, и перегрузку оператора присваивания.

R17

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу сравнения двух обыкновенных дробей, которые должны передаваться ей через аргументы командной строки. Результат сравнения должен отображаться строкой потока стандартного вывода, где заданные дроби разделяет знак отношения порядка между их величинами. Во всех случаях для записи обыкновенных дробей должен применяться символьный формат, где их числители и знаменатели разделены знаком '/'. Программная реализация сравнения должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений их числителя и знаменателя, а также компонентными методами перегрузки операторов '>' и '<' в условных выражениях. Конструктор этого класса должен обеспечивать преобразование символьной записи сравниваемых обыкновенных дробей в указанный числовой формат.Для приведения обеих обыкновенных дробей к несократимому виду необходимо предусмотреть компонентный метод, реализующий алгоритм Евклида.

R18

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу для сравнения обыкновенной дроби и целого числа, которые должны передаваться ей аргументами командной строки. Результат сравнения должен отображаться строкой потока стандартного вывода, где заданные дробь и целое число разделяет знак отношения порядка между их величинами. Во всех случаях для записи обыкновенных дробей должен применяться символьный формат, где их числители и знаменатели разделены знаком '/'. Программная реализация сравнения должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений их числителя и знаменателя, а также компонентными методами перегрузки операторов '>' и '<' в условных выражениях. Конструктор этого класса должен выполнять преобразование символьной записи обыкновенной дроби в указанный числовой формат.Для приведения обыкновенной дроби к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида.

R19

--------------------------------------------------------------------------------------------------------------------

Разработать объектно-ориентированную программу сравнения целого числа и обыкновенной дроби, которые должны передаваться ей двумя аргументами командной строки. Результат сравнения должен отображаться строкой потока стандартного вывода, где заданные целое число и дробь разделяет знак отношения порядка между их величинами. Во всех случаях для записи обыкновенных дробей должен применяться символьный формат, где их числители и знаменатели разделены знаком '/'. Программная реализация сравнения должна быть основана на разработке класса обыкновенных дробей с приватными полями данных для целочисленных значений их числителя и знаменателя, а также дружественными методами перегрузки операторов '>' и '<' в условных выражениях. Конструкторы этого класса должны обеспечивать преобразование обеих сравниваемых величин в указанный числовой формат обыкновенной дроби.Для приведения обыкновенной дроби к несократимому виду следует предусмотреть компонентный метод, реализующий алгоритм Евклида.

R20

--------------------------------------------------------------------------------------------------------------------



Дата добавления: 2021-07-22; просмотров: 325;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.022 сек.