Привет, код задачи приведен ниже 1. Отметь ответ как лучший (поставь 5 звезд). 2. Нажми кнопочку " " тут и в моем аккаунте
(За 8 былов такое никто не делает кроме меня будь благодарен в ответ)
Код прокомментирован, за дополнительными вопросами или информацией * Обращайся в комментарии, я отвечу на вопросы. * Зайди ко мне в профиль, в моих записях ты найдешь ссылки на полезные ресурсы.
FILE: CFraction.hpp
#ifndef CFRACTION_HPP #define CFRACTION_HPP
//Это класс дроби, тут мы храним чеслитель, знаменатель и функцию nesokr(). class CFraction { public:
CFraction(); //Конструктор класа
//"Геттеры" класса для получения значений приватных полей const unsigned int& getNumerator() const; const unsigned int& getDenumerator() const;
//"Сеттеры" класса для задани значений приватным полям void setNumerator(const unsigned int& value); void setDenumerator(const unsigned int& value);
//Функция заданная по заданию для сокращения дроби void nesokr();
private:
//Функция реализующая поиск найбольшего общего делителя по алгоритму Евклида const unsigned int getGreatestCommonDivisor() const; //Функция проверяющая, есть ли необходимость искать НОД const bool isRequireCalculationGCD() const;
private:
unsigned int mFirst; //Поле для числителя unsigned int mSecond; //Поле для знаменателя };
//Возращение значений происходит по константной ссылке. //Благодаря этому избегается копирование переменной, //а так же её модификация по ссылке. const unsigned int& CFraction::getNumerator() const { return mFirst; }
//Функция имеет в конце себя слово const сигнализирующее компилятору, //что метод не модифицировать поля класса. const unsigned int& CFraction::getDenumerator() const { return mSecond; }
//Передача аргумента в функцию так же реализуется по константной ссылке, //из тех же соображений что и возращение поля по константной ссылке. void CFraction::setNumerator(const unsigned int& value) { mFirst = value; }
void CFraction::setDenumerator(const unsigned int& value) { //Проверяем значение на 0, знаменатель не может быть равнм нулю. //Значение не проверяется на знак отрицания, по тому, что везде используется //беззнаковый целочисленный тип данных unsigned int. if (0 != value) { mSecond = value; } }
void CFraction::nesokr() { //Если есть необходимость проводить расчёты и сокращать дробь, то //находим НОД и делим на него чеслитель и знаменатель. if ( isRequireCalculationGCD() ) { unsigned int greatestCommonDivisor = getGreatestCommonDivisor();
const bool CFraction::isRequireCalculationGCD() const { //Проверяем, не является, ли знаменатель равным единице, //иначе нет смысла проводить безсмысленную работу, т.к. в любом случаи НОД //будет единица, то же самое делаем с числителем. return ( (1 != mSecond || 1 != mFirst) || (1 != mSecond && 1 != mFirst) ); }
const unsigned int CFraction::getGreatestCommonDivisor() const { //Алгоритм поиска НОД называется алгоритмом Евклида unsigned int remainder(1);
//Для его реадизации берем два числа и выделяем из них большее и меньшее. unsigned int gretestNumber = (mFirst > mSecond ? mFirst : mSecond); unsigned int leastNumber = (mFirst < mSecond ? mFirst : mSecond);
while (0 != remainder) { remainder = gretestNumber % leastNumber;
//Если остаток деления большего на меньшее равен нулю, //то НОД является меньшее из этих чисел if (0 != remainder) { //Если же остаток не равен нулю, //то большим числом становится предыдущее меньшее, //а меньшим становится остаток от леления. gretestNumber = leastNumber; leastNumber = remainder; } }
1) полная таблица истинности каждого выражения с пятью переменными содержит 2^5 = 32 строки;
2) в каждой таблице содержится по 4 единицы и по 28 нулей, ( то есть 32-4);
3) выражение a v - b равно нулю тогда, когда a = 0 или b = 1;
4) min количество единиц в таблице истинности выражения a v - b будет тогда, когда там будет наибольшее число нулей, то есть в max количество строк одновременно a = 0 и b = 1;
5) по условию a = 0 в 28 строках, и b = 1 в 4 строках, поэтому выражение a v - b может быть равно нулю не более чем в 4 строках, а оставшиеся 32 – 4 = 28 могут быть равны 1.
1. Отметь ответ как лучший (поставь 5 звезд).
2. Нажми кнопочку " " тут и в моем аккаунте
(За 8 былов такое никто не делает кроме меня будь благодарен в ответ)
Код прокомментирован, за дополнительными вопросами или информацией
* Обращайся в комментарии, я отвечу на вопросы.
* Зайди ко мне в профиль, в моих записях ты найдешь ссылки на полезные ресурсы.
FILE: CFraction.hpp
#ifndef CFRACTION_HPP
#define CFRACTION_HPP
//Это класс дроби, тут мы храним чеслитель, знаменатель и функцию nesokr().
class CFraction
{
public:
CFraction(); //Конструктор класа
//"Геттеры" класса для получения значений приватных полей
const unsigned int& getNumerator() const;
const unsigned int& getDenumerator() const;
//"Сеттеры" класса для задани значений приватным полям
void setNumerator(const unsigned int& value);
void setDenumerator(const unsigned int& value);
//Функция заданная по заданию для сокращения дроби
void nesokr();
private:
//Функция реализующая поиск найбольшего общего делителя по алгоритму Евклида
const unsigned int getGreatestCommonDivisor() const;
//Функция проверяющая, есть ли необходимость искать НОД
const bool isRequireCalculationGCD() const;
private:
unsigned int mFirst; //Поле для числителя
unsigned int mSecond; //Поле для знаменателя
};
#endif //CFRACTION_HPP
FILE: CFraction.cpp
#include "CFraction.hpp"
CFraction::CFraction()
: mFirst(0) //Числитель инициализируем нулем
, mSecond(1) //Знаменатель по умолчанию инициализируем единицей
{
}
//Возращение значений происходит по константной ссылке.
//Благодаря этому избегается копирование переменной,
//а так же её модификация по ссылке.
const unsigned int& CFraction::getNumerator() const
{
return mFirst;
}
//Функция имеет в конце себя слово const сигнализирующее компилятору,
//что метод не модифицировать поля класса.
const unsigned int& CFraction::getDenumerator() const
{
return mSecond;
}
//Передача аргумента в функцию так же реализуется по константной ссылке,
//из тех же соображений что и возращение поля по константной ссылке.
void CFraction::setNumerator(const unsigned int& value)
{
mFirst = value;
}
void CFraction::setDenumerator(const unsigned int& value)
{
//Проверяем значение на 0, знаменатель не может быть равнм нулю.
//Значение не проверяется на знак отрицания, по тому, что везде используется
//беззнаковый целочисленный тип данных unsigned int.
if (0 != value)
{
mSecond = value;
}
}
void CFraction::nesokr()
{
//Если есть необходимость проводить расчёты и сокращать дробь, то
//находим НОД и делим на него чеслитель и знаменатель.
if ( isRequireCalculationGCD() )
{
unsigned int greatestCommonDivisor = getGreatestCommonDivisor();
mFirst /= greatestCommonDivisor;
mSecond /= greatestCommonDivisor;
}
}
const bool CFraction::isRequireCalculationGCD() const
{
//Проверяем, не является, ли знаменатель равным единице,
//иначе нет смысла проводить безсмысленную работу, т.к. в любом случаи НОД
//будет единица, то же самое делаем с числителем.
return ( (1 != mSecond || 1 != mFirst) || (1 != mSecond && 1 != mFirst) );
}
const unsigned int CFraction::getGreatestCommonDivisor() const
{
//Алгоритм поиска НОД называется алгоритмом Евклида
unsigned int remainder(1);
//Для его реадизации берем два числа и выделяем из них большее и меньшее.
unsigned int gretestNumber = (mFirst > mSecond ? mFirst : mSecond);
unsigned int leastNumber = (mFirst < mSecond ? mFirst : mSecond);
while (0 != remainder)
{
remainder = gretestNumber % leastNumber;
//Если остаток деления большего на меньшее равен нулю,
//то НОД является меньшее из этих чисел
if (0 != remainder)
{
//Если же остаток не равен нулю,
//то большим числом становится предыдущее меньшее,
//а меньшим становится остаток от леления.
gretestNumber = leastNumber;
leastNumber = remainder;
}
}
return leastNumber;
}
FILE: main.cpp
#include <iostream>
#include "CFraction.hpp"
int main()
{
CFraction example;
example.setNumerator(15);
example.setDenumerator(255);
std::cout << "Fraction before simplification:" << std::endl;
std::cout << "Fraction numerator: " << example.getNumerator() << std::endl;
std::cout << "Fraction denumerator: " << example.getDenumerator() << std::endl;
example.nesokr();
std::cout << "" << std::endl;
std::cout << "Fraction after simplification:" << std::endl;
std::cout << "Fraction numerator: " << example.getNumerator() << std::endl;
std::cout << "Fraction denumerator: " << example.getDenumerator() << std::endl;
return 0;
}
1) полная таблица истинности каждого выражения с пятью переменными содержит 2^5 = 32 строки;
2) в каждой таблице содержится по 4 единицы и по 28 нулей, ( то есть 32-4);
3) выражение a v - b равно нулю тогда, когда a = 0 или b = 1;
4) min количество единиц в таблице истинности выражения a v - b будет тогда, когда там будет наибольшее число нулей, то есть в max количество строк одновременно a = 0 и b = 1;
5) по условию a = 0 в 28 строках, и b = 1 в 4 строках, поэтому выражение a v - b может быть равно нулю не более чем в 4 строках, а оставшиеся 32 – 4 = 28 могут быть равны 1.
ответ: 28.