Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 10.03.2022
Сообщений: 5

Создать дружественную функцию сложения целого числа с дробью

10.03.2022, 18:14. Показов 1298. Ответов 14

Студворк — интернет-сервис помощи студентам
Здравствуйте, у меня возникла проблема с дружественной функцией, а именно к числителю поступает значение 5, вместо заданного значения 2. Подскажите, пожалуйста, в чем может быть проблема.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <math.h>
 
using namespace std;
//Вариант 2
 
class Fraction
{
private:
    //поля: числитель и знаменатель
    int numerator;
    int denominator;
public:
    //конструктор
    Fraction() { numerator = 0; denominator = 1; }
    Fraction(int Numerator) { numerator = Numerator; denominator = 1; }
    Fraction(int Numerator, int Denominator) { numerator = Numerator; denominator = Denominator; }
    Fraction operator+(int a)
    {
        Fraction Res;
        Res.numerator = numerator + (a * denominator);
        Res.denominator = denominator;
        return Res;
    }
    Fraction operator-(int a)
    {
        Fraction Res;
        Res.numerator = numerator - (a * denominator);
        Res.denominator = denominator;
        return Res;
    }
    Fraction operator++(int notused)
    {
        numerator = numerator + denominator;
        return *this;
    }
 
    void print()
    {
        cout << "\n" << numerator << "/" << denominator << "\n";
    }
    double getDenomitanor() { return denominator ; }
    double getNumerator() { return numerator; }
 
    void SetDenominator(double value) { denominator = value; }
    void SetNumerator(double value) { numerator = value; }
 
 
    friend Fraction operator+(int с, Fraction Z);
};
Fraction operator+(int с, Fraction Z) 
{
    Fraction res;
    res.numerator = (с * Z.denominator) + Z.numerator;
    res.denominator = Z.denominator;
    return res;
}
 
int main()
{
    Fraction Z(2, 3);
    Fraction Y = Z + 5;
    Fraction F = Z - 5;
    Fraction C = Z++;   
    Fraction V = 5 + Z;
    Y.print();
    F.print();
    C.print();
    V.print();
    char c; cin >> c;
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.03.2022, 18:14
Ответы с готовыми решениями:

Добавьте возможность сложения (сложения через оператор сложения) для дроби с целым числом. (не только с дробью)
Есть код, не могу написать как складывать дробь с целым числом, а не только с дробью. + Создайте дочерний класс OperationsOnFraction и...

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

Создать класс и дружественную функцию к нему
Создать класс и дружественную функцию к нему. Срочно!!!

14
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,245
10.03.2022, 18:37
Цитата Сообщение от daag0n Посмотреть сообщение
Fraction C = Z++;
operator++ увеличивает Z на 1, т.е.
2/3+1=5/3
Почему Вы считаете, что это не так?
0
0 / 0 / 0
Регистрация: 10.03.2022
Сообщений: 5
10.03.2022, 18:55  [ТС]
Здесь все вроде ок) Я про эту часть
C++
1
2
3
4
5
6
7
Fraction operator+(int с, Fraction Z) 
{
    Fraction res;
    res.numerator = (с * Z.denominator) + Z.numerator;
    res.denominator = Z.denominator;
    return res;
}
0
фрилансер
 Аватар для Алексей1153
6463 / 5675 / 1131
Регистрация: 11.10.2019
Сообщений: 15,115
10.03.2022, 19:04
Цитата Сообщение от daag0n Посмотреть сообщение
Fraction operator++(int notused)
    {
        numerator = numerator + denominator;
        return *this;
    }
неправильная реализация. Вот так правильно:

C++
1
2
3
4
5
6
Fraction operator++(int)
{
    const auto copy=*this;
    numerator += denominator;
    return copy;
}
0
0 / 0 / 0
Регистрация: 10.03.2022
Сообщений: 5
10.03.2022, 21:03
подскажите как можно реализовать перегрузку оператора чтоб он вернул объект без удаления перед возвратом?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <fstream>
#include <iostream>
#include <conio.h>
#include <string>
#include <time.h>
#include <Windows.h>
 
using namespace std;
class Stack
{
    int empty = -1;
    int* list;
    int size;
    int full;
    int count;
public:
    //Конструктор
    Stack();
    Stack(int s);
    //Добавление элемента
    void Push(Stack a, int c);
    //Извлечение элемента
    int Pop();
    //Очистка стека
    void Clear();
    //Проверка существования элементов в стеке
    bool IsEmpty();
    //Проверка на переполнение стека
    bool IsFull();
    //Количество элементов в стеке
    int GetCount();
    Stack increase(Stack a);
    void print();
    ~Stack();
    friend const Stack operator+ (const Stack& a, const Stack& b)
    {
        int s = a.size + b.size;
        Stack c(s);
        c.count = a.count + b.count;
        for (int i = 0; i < c.size; i++)
        {
            if (i <= c.count)
            {
                if (i <= a.count)c.list[i] = a.list[i];
                else c.list[i] = b.list[i - a.count];
            }
            else c.list[i] = 0;
        }
        c.print();  
        return c;
    }
    friend Stack operator*(Stack& a, Stack& b)
    {
        int s = a.size + b.size;
        Stack c(s);
        c.count = 0;
        for (int i = 0; i < c.size; i++)
        {
            
        }
        return c;
    }
};
Stack::Stack()
{
    size = 5;
    full = 4;
    list = new int[size];   
    for (int i = 0; i < size; i++)
    {
        list[i] = 0;
    }
    count = -1;
}
Stack::Stack(int s)
{
    size = s;
    full = size - 1;
    list = new int[size];
    for (int i = 0; i < size; i++)
    {
        list[i] = 0;
    }
    count = -1;
}
Stack Stack::increase(Stack a)
{
    Stack b(a.size + 5);
    b.count = a.count;
    for (int i = 0; i < a.size; i++)
    {
        b.list[i] = a.list[i];
    }
    delete[]a.list;
    return  b;
}
Stack::~Stack()
{
    delete[]list;
    cout << "диструктор" << endl;
}
void Stack::print()
{
    for (int i = 0; i < size; i++)
    {
        cout << list[i] << " -> ";
    }
    cout << endl;
}
 
int main()
{
    setlocale(LC_ALL, "");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    srand(time(0));
    Stack A;    
    Stack B;    
    Stack C{ A + B };
    C.print();
    A.print();
    B.print();
    
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
10.03.2022, 21:04
r141d, Распространенные ошибки
0
0 / 0 / 0
Регистрация: 10.03.2022
Сообщений: 5
10.03.2022, 21:09
а проще можно? я это читал. не понимаю в чем моя ошибка.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
10.03.2022, 21:26
r141d, у класса Stack должны быть определены конструктор копирования и оператор присваивания.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
10.03.2022, 21:31
Цитата Сообщение от r141d Посмотреть сообщение
int* list;
Это ваш ресурс в классе, который требует особого обращения, инициализации, удаления, копирования.
Нужно реализовать "правило Трех" :
Цитата Сообщение от zss Посмотреть сообщение
1. Деструктор
2. Конструктор копирования
3. Оператор присваивания
У вас из этого списка только присутствует только деструктор.

З.Ы. Можно проще, если сделать поле list "самостоятельным" тогда не нужно будет ходить за ним подтирать ).
1
0 / 0 / 0
Регистрация: 10.03.2022
Сообщений: 5
10.03.2022, 21:33
спасибо. буду пробовать. моя задача научиться программировать.
0
0 / 0 / 0
Регистрация: 10.03.2022
Сообщений: 5
10.03.2022, 22:10  [ТС]
-_-мне б тоже разобраться...
0
0 / 0 / 0
Регистрация: 10.03.2022
Сообщений: 5
10.03.2022, 22:28
спасибо все получилось. едем дальше
0
0 / 0 / 0
Регистрация: 10.03.2022
Сообщений: 5
10.03.2022, 23:13  [ТС]
рад за тебя
0
0 / 0 / 0
Регистрация: 10.03.2022
Сообщений: 5
11.03.2022, 12:23  [ТС]
Имеется такой код, нужно создать дружественную функцию сложения целого числа с дробью.
Работает некорректно эта часть:
C++
1
2
3
4
5
6
7
Fraction operator+(int с, Fraction Z) 
{
    Fraction res;
    res.numerator = (с * Z.denominator) + Z.numerator;
    res.denominator = Z.denominator;
    return res;
}
Весь код целиком:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <math.h>
 
using namespace std;
//Вариант 2
 
class Fraction
{
private:
    //поля: числитель и знаменатель
    int numerator;
    int denominator;
public:
    //конструктор
    Fraction() { numerator = 0; denominator = 1; }
    Fraction(int Numerator) { numerator = Numerator; denominator = 1; }
    Fraction(int Numerator, int Denominator) { numerator = Numerator; denominator = Denominator; }
    Fraction operator+(int a)
    {
        Fraction Res;
        Res.numerator = numerator + (a * denominator);
        Res.denominator = denominator;
        return Res;
    }
    Fraction operator-(int a)
    {
        Fraction Res;
        Res.numerator = numerator - (a * denominator);
        Res.denominator = denominator;
        return Res;
    }
    Fraction operator++(int notused)
    {
        numerator += denominator;
        return *this;
    }
 
    void print()
    {
        cout << "\n" << numerator << "/" << denominator << "\n";
    }
    double getDenomitanor() { return denominator ; }
    double getNumerator() { return numerator; }
 
    void SetDenominator(double value) { denominator = value; }
    void SetNumerator(double value) { numerator = value; }
 
 
    friend Fraction operator+(int с, Fraction Z);
};
Fraction operator+(int с, Fraction Z) 
{
    Fraction res;
    res.numerator = (с * Z.denominator) + Z.numerator;
    res.denominator = Z.denominator;
    return res;
}
 
int main()
{
    Fraction Z(2, 3);
    Fraction Y = Z + 5;
    Fraction F = Z - 5;
    Fraction C = Z++;   
    Fraction V = 5 + Z;
    Y.print();
    F.print();
    C.print();
    V.print();
    char c; cin >> c;
    return 0;
}
0
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,565
11.03.2022, 12:32
Цитата Сообщение от daag0n Посмотреть сообщение
Работает некорректно эта часть:
А зачем дублировать код?
C++
1
2
3
4
Fraction operator+(int с, Fraction Z) 
{
    return Z + c;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.03.2022, 12:32
Помогаю со студенческими работами здесь

Нужно создать собственную функцию вычисления квадрата целого числа X
Нужно создать собственную функцию вычисления квадрата целого числа X в виде суммы первых X нечетных чисел (например, 2^2=1+3, 3^2...

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

Как создать дружественную функцию для приватных данных?
Пользовательский класс должен содержать необходимые закрыты элементы Данные и метод для установления их начальных значений. Создать...

Создать дружественную функцию для сравнения площади объектов
Добрый день! В 41 строчке компилятор подчеркивает &quot;sq.r&quot;. В чём может быть ошибка? #include &quot;pch.h&quot; #include &lt;iostream&gt;...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru