Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
31.03.2012, 14:31     Создайте структуру, описывающую простую дробь #1
Пишу в Microsoft Visual Studio ->Win32 Console application ->C++.
Помогите пожалуйста "написать" структуру:
Создайте структуру, описывающую простую дробь. Добавьте в неё метод сокращения дроби, если ее числитель и знаменатель не являются взаимно простыми числами. Затем создайте структуру, состоящую из двух дробей и методов сложения, вычитания и произведения этих дробей.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2012, 14:31     Создайте структуру, описывающую простую дробь
Посмотрите здесь:

Создать класс Fraction, описывающий простую дробь. (Прошу помочь) C++
Определить структуру, описывающую багаж пассажира C++
Создайте структуру,описывающую точку в трехмерной системе координат C++
Создайте структуру Прямая C++
C++ Написать программу, описывающую структуру, содержащую указанные поля и выполняющую над ней указанные действия
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kidasov
76 / 76 / 12
Регистрация: 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;
}
Hqw33
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;
}
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
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?
Вывод на экран консоли

Все остальное вы можете прочитать в самоучителе Шилда либо другой книге по С++
AlexGreen
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;
    }
};
Fallenworld
75 / 75 / 9
Регистрация: 14.04.2014
Сообщений: 408
19.02.2015, 13:27     Создайте структуру, описывающую простую дробь #6
Цитата Сообщение от Hqw33 Посмотреть сообщение
//Что это за магия?
это математика))

А вообще все твои вопросы - они по базовым терминам, так что тебе быстрее взять книжкеу и прочитать. По с++ есть полные мануалы на 1к+страниц, а есть краткие обзоры на 300-400 страниц(например Липман "Основы программирования на С++"
Yandex
Объявления
19.02.2015, 13:27     Создайте структуру, описывающую простую дробь
Ответ Создать тему
Опции темы

Текущее время: 12:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru