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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Hqw33
0 / 0 / 0
Регистрация: 25.03.2012
Сообщений: 21
#1

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

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

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

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kidasov
77 / 77 / 12
Регистрация: 02.12.2011
Сообщений: 965
Записей в блоге: 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
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;
}
0
Avazart
Эксперт С++
7192 / 5366 / 280
Регистрация: 10.12.2010
Сообщений: 23,675
Записей в блоге: 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?
Вывод на экран консоли

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

А вообще все твои вопросы - они по базовым терминам, так что тебе быстрее взять книжкеу и прочитать. По с++ есть полные мануалы на 1к+страниц, а есть краткие обзоры на 300-400 страниц(например Липман "Основы программирования на С++"
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2015, 13:27
Привет! Вот еще темы с ответами:

Опишите структуру '' Обыкновенная дробь '' - C++
Опишите структуру '' Обыкновенная дробь '' с полями числитель и знаменатель. Для данной структуры напишите функции: добавления двух...

Написать программу, описывающую структуру, содержащую указанные поля и выполняющую над ней указанные действия - C++
Требуется помощь 1. Описать структуру с именем PRICE, содержащую следующие поля: - GOODS – название товара; - SHOP – название...

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

Создайте структуру Прямая - C++
Создайте структуру Прямая с элементами x1, y1, x2, y2 – координаты двух точек, через которые проходит прямая. Для К заданных прямых вывести...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.02.2015, 13:27
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru