Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/47: Рейтинг темы: голосов - 47, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
1

Создайте структуру, описывающую простую дробь

31.03.2012, 14:31. Показов 8739. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу в Microsoft Visual Studio ->Win32 Console application ->C++.
Помогите пожалуйста "написать" структуру:
Создайте структуру, описывающую простую дробь. Добавьте в неё метод сокращения дроби, если ее числитель и знаменатель не являются взаимно простыми числами. Затем создайте структуру, состоящую из двух дробей и методов сложения, вычитания и произведения этих дробей.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2012, 14:31
Ответы с готовыми решениями:

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

Создайте структуру,описывающую точку в трехмерной системе координат
Создайте структуру,описывающую точку в трехмерной системе координат (x,y,z). Найдите расстояние...

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

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

5
80 / 79 / 35
Регистрация: 02.12.2011
Сообщений: 966
Записей в блоге: 3
31.03.2012, 14:49 2
Hqw33, лови

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
/*Программа для демонстрации сложения, вычитания и умножения двух дробей*/
#include <iostream>
using namespace std;
 
//Дробь
struct Drob {
    int a;
    int b;
    Drob(int a, int b);
    void NOD();
    void show();
};
 
//Конструктор
Drob :: Drob(int a, int b) {
    this->a = a;
    this->b = b;
}
 
//Сокращение дробей
void Drob :: NOD() {
    int a_a = a;
    int b_b = b;
    int buf;
    while (b_b != 0) {
        buf = b_b;
        b_b = a_a % b_b;
        a_a = buf;
    }
    a /= a_a;
    b /= a_a;
}
 
//Показать дробь на экране
void Drob :: show() {
    int buf = a % b;
    if (!buf) cout << a/b << endl;
    else cout << a << "/" << b << endl;
 
}
 
//Структура с двумя дробями и операциями сложения, умножения, вычитания
struct addSubMultDrob {
    struct Drob ob1; //первая дробь
    struct Drob ob2; //вторая дробь
    addSubMultDrob(int a, int b, int a1, int b1): ob1(a, b), ob2(a1, b1) {} //конструктор копирования
    friend Drob operator+(Drob ob1, Drob ob2); //функция-друг для перегрухки операции сложения
    friend Drob operator-(Drob ob1, Drob ob2); //функция-друг для перегрухки операции вычитания
    friend Drob operator*(Drob ob1, Drob ob2); //функция-друг для перегрухки операции умножения
    void show(); //вывести результат на экран
};
 
//перегрузка сложения
Drob operator+(Drob ob1, Drob ob2) {
    Drob temp(0, 0);
    temp.b = ob1.b * ob2.b;
    temp.a = (temp.b / ob1.b) * ob1.a + (temp.b / ob2.b) * ob2.a ;
    return temp;
}
 
//перегрузка вычитания
Drob operator-(Drob ob1, Drob ob2) {
    Drob temp(0, 0);
    temp.b = ob1.b * ob2.b;
    temp.a = (temp.b / ob1.b) * ob1.a  - (temp.b / ob2.b) * ob2.a ;
    return temp;
}
 
//перегрузка умножения
Drob operator*(Drob ob1, Drob ob2) {
    Drob temp(0, 0);
    temp.a = ob1.a * ob2.a;
    temp.b = ob1.b * ob2.b;
    return temp;
}
 
//вывести дроби, с которыми проводим действия
void addSubMultDrob::show() {
    cout << "First drob " << ob1.a << "/" << ob1.b << endl;
    cout << "Second drob " << ob2.a << "/" << ob2.b << endl;
    cout << endl;
}
 
 
int main() {
    Drob ob(0, 0);
    addSubMultDrob ob2(5,4,3,4); //заводим 2 дроби 5/4 и 3/4
 
    ob2.show();
 
    cout << "After sum " ;
 
    ob = ob2.ob1 + ob2.ob2; //сложение
    ob.NOD();
    ob.show();
 
    cout << "After sub " ;
 
    ob = ob2.ob1 - ob2.ob2; //вычитание
    ob.NOD();
    ob.show();
 
    cout << "After mul " ; //умножение
 
    ob = ob2.ob1 * ob2.ob2;
    ob.NOD();
    ob.show();
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
02.04.2012, 14:23  [ТС] 3
Проблема: В решение этой задачи использован не знакомы мне стиль "написание" (неизвестные на данный час возможности...), Все вопросы выделены в решении "//!"
Помогите пожалуйста разобраться. Заранее спасибо!

Решение:
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
/*Программа для демонстрации сложения, вычитания и умножения двух дробей*/
#include <iostream>
using namespace std;
 
//Дробь
struct Drob {
    int a;
    int b;
    Drob(int a, int b);
    void NOD(); //! Для чего служат эти "void"
    void show();
};
 
//Конструктор
Drob :: Drob(int a, int b) {  //! Что значат ::, и что это за оператор this? Для чего  "->". Что происходит в этом "конструкторе"
    this->a = a;
    this->b = b;
}
 
//Сокращение дробей 
void Drob :: NOD() { //! Опять же ::
    int a_a = a; //! ЗАчем нужно нижнее подчеркивание "_"
    int b_b = b;
    int buf;
    while (b_b != 0) {
        buf = b_b;
        b_b = a_a % b_b;
        a_a = buf;
    }
    a /= a_a;
    b /= a_a;
}
 
//Показать дробь на экране
void Drob :: show() { //! что такое show?
    int buf = a % b;
    if (!buf) cout << a/b << endl; //! Для чего "/"
    else cout << a << "/" << b << endl;
 
}
 
//Структура с двумя дробями и операциями сложения, умножения, вычитания
struct addSubMultDrob {  
    struct Drob ob1; //первая дробь
    struct Drob ob2; //вторая дробь
    addSubMultDrob(int a, int b, int a1, int b1): ob1(a, b), ob2(a1, b1) {} //конструктор копирования  //! Что означаю operator+ и и остальные? 
    friend Drob operator+(Drob ob1, Drob ob2); //функция-друг для перегрухки операции сложения
    friend Drob operator-(Drob ob1, Drob ob2); //функция-друг для перегрухки операции вычитания
    friend Drob operator*(Drob ob1, Drob ob2); //функция-друг для перегрухки операции умножения
    void show(); //вывести результат на экран 
};
 
//перегрузка сложения //! Длячего нужны "перегрузки?"
Drob operator+(Drob ob1, Drob ob2) { //! Что ткое  temp и как с этим боротся?
    Drob temp(0, 0);
    temp.b = ob1.b * ob2.b; //!     temp.b, Как это работает, в смысле "точка" между темп и б?
    temp.a = (temp.b / ob1.b) * ob1.a + (temp.b / ob2.b) * ob2.a ;  //Что это за магия?
    return temp;
}
 
//перегрузка вычитания
Drob operator-(Drob ob1, Drob ob2) { //!ТАкие же вопросы, как и в сложении
    Drob temp(0, 0);
    temp.b = ob1.b * ob2.b;
    temp.a = (temp.b / ob1.b) * ob1.a  - (temp.b / ob2.b) * ob2.a ;
    return temp;
}
 
//перегрузка умножения
Drob operator*(Drob ob1, Drob ob2) {  //!ТАкие же вопросы, как и в сложении
    Drob temp(0, 0);
    temp.a = ob1.a * ob2.a;
    temp.b = ob1.b * ob2.b;
    return temp;
}
 
//вывести дроби, с которыми проводим действия
void addSubMultDrob::show() {
    cout << "First drob " << ob1.a << "/" << ob1.b << endl;
    cout << "Second drob " << ob2.a << "/" << ob2.b << endl;
    cout << endl;
}
 
 
int main() {  //!Если можно расскажите по подробней о том что делается в меин.
    Drob ob(0, 0);
    addSubMultDrob ob2(6,4,8,4); //заводим 2 дроби 5/4 и 3/4
 
    ob2.show(); //! Те же вопросы про точку...
 
    cout << "After sum " ;
 
    ob = ob2.ob1 + ob2.ob2; //сложение
    ob.NOD();
    ob.show();
 
    cout << "After sub " ;
 
    ob = ob2.ob1 - ob2.ob2; //вычитание
    ob.NOD();
    ob.show();
 
    cout << "After mul " ; //умножение
 
    ob = ob2.ob1 * ob2.ob2;
    ob.NOD();
    ob.show();
 
    return 0;
}
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.04.2012, 14:36 4
C++
1
void NOD(); //! Для чего служат эти "void"
Метод не возвращает никаких значений
C++
1
Drob :: Drob(int a, int b) {  //! Что значат ::, и что это за оператор this? Для чего  "->". Что происходит в этом "конструкторе"
Drob :: - область видимости, т.е говорит что это относится к классу Drop
C++
1
int a_a = a; //! ЗАчем нужно нижнее подчеркивание "_"
Не зачем, просто такое название переменной
C++
1
void Drob :: show() { //! что такое show?
Вывод на экран консоли

Все остальное вы можете прочитать в самоучителе Шилда либо другой книге по С++
1
0 / 0 / 0
Регистрация: 19.02.2015
Сообщений: 1
19.02.2015, 13:22 5
Сори, что без комментариев, надеюсь разберешься

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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
struct fraction
{
    int numerator;
    int denominator;
    int intPart;
    int sign;
 
    void input ()
    {
        intPart = 0;
        sign = 1;
 
        cout<<"Enter numerator: ";
        cin>>numerator;
 
        for (int check = 0; check != 1;)
        {
            cout<<"Enter denominator: ";
            cin>>denominator;
            if (denominator == 0)
                cout<<"Exeption divided by zero!"<<endl;
            else
                check = 1;
        }
 
        if (numerator < 0 && denominator < 0)
        {
            numerator*=-1;
            denominator*=-1;
            sign = 1;
        }
 
        else if (numerator < 0 || denominator < 0)
        {
            if (numerator < 0)
                numerator*=-1;
            else
                denominator*=-1;
 
            sign = -1;
        }
    }
 
    int Nod (int a, int b)
    {
        while (a && b)
            if (a >= b)
               a %= b;
            else
               b %= a;
        return a | b;
    }
 
    void output ()
    {
        fraction output;
        output.sign = sign;
        output.denominator = denominator;
        output.numerator = numerator;
        output.intPart = intPart;
 
        int nod = 0;
 
        if (output.numerator == output.denominator)
        {
            output.numerator = 0;
            output.intPart = 1;
        }
        else if (output.numerator > output.denominator)
        {
            output.intPart = output.numerator/output.denominator;
            output.numerator -= output.denominator * output.intPart;
        }
 
        nod = Nod (output.numerator, output.denominator);
 
        if (output.numerator == 0 && output.intPart > 0)
            cout<<output.sign * output.intPart<<endl;
        else if (output.numerator == 0)
            cout<<0<<endl;
        else if (output.intPart == 0)
            cout<<(output.sign * output.numerator) / nod<<"/"<<output.denominator / nod<<endl;
        else
            cout<<output.sign * output.intPart<<"|"<<output.numerator / nod<<"/"<<output.denominator / nod<<endl;
    }
 
    const fraction& operator + (fraction& object1)
    {
        fraction object2;
        object2.intPart = 0;
        object2.sign = 1;
 
        if (denominator != object1.denominator)
        {
            object2.denominator = object1.denominator * denominator;
            object2.numerator = (numerator * object1.denominator * sign) + (object1.numerator * denominator * object1.sign);
        }
        else
        {
            object2.numerator = (sign * numerator) + (object1.sign * object1.numerator);
            object2.denominator = denominator;
        }
 
        if (object2.numerator < 0 && object2.denominator < 0)
        {
            object2.numerator*=-1;
            object2.denominator*=-1;
            object2.sign = 1;
        }
 
        else if (object2.numerator < 0 || object2.denominator < 0)
        {
            if (object2.numerator < 0)
                object2.numerator*=-1;
            else
                object2.denominator*=-1;
 
            object2.sign = -1;
        }
 
        return object2;
    }
 
    const fraction& operator - (fraction& object1)
    {
        fraction object2;
        object2.intPart = 0;
        object2.sign = 1;
 
        if (denominator != object1.denominator)
        {
            object2.denominator = object1.denominator * denominator;
            object2.numerator = (numerator * object1.denominator * sign) - (object1.numerator * denominator * object1.sign);
        }
        else
        {
            object2.numerator = (sign * numerator) - (object1.sign * object1.numerator);
            object2.denominator = denominator;
        }
 
        if (object2.numerator < 0 && object2.denominator < 0)
        {
            object2.numerator*=-1;
            object2.denominator*=-1;
            object2.sign = 1;
        }
 
        else if (object2.numerator < 0 || object2.denominator < 0)
        {
            if (object2.numerator < 0)
                object2.numerator*=-1;
            else
                object2.denominator*=-1;
 
            object2.sign = -1;
        }
 
        return object2;
    }
 
    const fraction& operator * (fraction& object1)
    {
        fraction object2;
        object2.intPart = 0;
        object2.sign = sign * object1.sign;
 
        object2.numerator = numerator * object1.numerator;
        object2.denominator = denominator * object1.denominator;
 
        return object2;
    }
 
    const fraction& operator / (fraction& object1)
    {
        fraction object2;
        object2.intPart = 0;
        object2.sign = sign * object1.sign;
 
        object2.numerator = numerator * object1.denominator;
        object2.denominator = denominator * object1.numerator;
 
        return object2;
    }
};
0
76 / 76 / 32
Регистрация: 14.04.2014
Сообщений: 408
19.02.2015, 13:27 6
Цитата Сообщение от Hqw33 Посмотреть сообщение
//Что это за магия?
это математика))

А вообще все твои вопросы - они по базовым терминам, так что тебе быстрее взять книжкеу и прочитать. По с++ есть полные мануалы на 1к+страниц, а есть краткие обзоры на 300-400 страниц(например Липман "Основы программирования на С++"
0
19.02.2015, 13:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.02.2015, 13:27
Помогаю со студенческими работами здесь

Определить структуру, описывающую багаж пассажира
Помогите, кому не трудно, пожалуйста! Определить структуру, описывающую багаж пассажира, с полями:...

Создать класс Fraction, описывающий простую дробь. (Прошу помочь)
Создать класс Fraction, описывающий простую дробь.Добавить конструктор по умолчанию, конструктор с...

1. Создайте структуру описывающую в трехмерной системе координат (x, y, z). Найдите расточник между двумя точк
1. Создайте структуру описывающую в трехмерной системе координат (x, y, z). Найдите расточник между...

Создайте структуру Дробь с элементами a - числитель, b - знаменатель: реализуйте с 2 дробями арифметические действия
Создайте структуру Дробь с элементами a - числитель, b - знаменатель. Даны две дроби. Реализуйте с...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru