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

Классы, разобраться с объявлением объектов - C++

Восстановить пароль Регистрация
 
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
21.07.2014, 22:48     Классы, разобраться с объявлением объектов #1
я написала вот такую программу по условию:
Класс должен содержать методы для ввода и вывода данных объектов, а также для выполнения арифметических операций. Кроме того, необходимо включить в состав класса функцию, приводящую дробь к несократимому виду. Функция должна находить наибольший общий делитель числителя и знаменателя и делить числитель и знаменатель на это значение.
Можно вызывать данную функцию в конце каждого метода, выполня-
ющего арифметическую операцию, либо непосредственно перед выводом
на экран результата. Кроме перечисленных методов, вы можете вклю-
чить в класс конструктор с двумя аргументами, что также будет полезно.

программа работает.

C++ (Qt)
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
#include "stdafx.h"
#include <iostream>     
#include <cmath>
using namespace std;
class Fraction
{
    private:
        int numerator, denominator;
    public:
        Fraction():numerator(0), denominator(0)
        {}
        void get_fr()
        {
            char ch;
            cout << "enter fraction" << endl;
            cin >> numerator >> ch >> denominator;
        }
        void add_fr(Fraction f1, Fraction f2)
        {
            numerator = f1.numerator * f2.denominator + f1.denominator * f2.numerator; 
            denominator = f1.denominator * f2.denominator;
        }
        void sub_fr (Fraction f1, Fraction f2)
        {
            numerator = f1.numerator * f2.denominator - f1.denominator * f2.numerator;
            denominator = f1.denominator * f2.denominator;  
        }
        void mul_fr (Fraction f1, Fraction f2)
        {
            numerator = f1.numerator * f2.denominator;
            denominator = f1.denominator * f2.denominator; 
        }
        void div_fr (Fraction f1, Fraction f2)
        {
            numerator = f1.numerator * f2.denominator; 
            denominator = f1.denominator * f2.numerator;
        }
        void lowterms ()
        {
            long tnum, tden, temp, gcd;
            tnum = labs(numerator);            // используем неотрицательные 
            tden = labs(denominator);            // значения (нужен cmath)
            if( tden == 0 )              // проверка знаменателя на 0
              { cout << "Недопустимый знаменатель!"; exit(1); }
            else if( tnum == 0 )         // проверка числителя на 0
              { numerator=0; denominator = 1; return; }
// нахождение наибольшего общего делителя
            while(tnum !=0)
            {
              if( tnum < tden )          // если числитель больше знаменателя,
                { temp=tnum; tnum=tden; tden=temp; } //меняем их местами
                 tnum = tnum - tden;        // вычитание
            }
            gcd = tden;                  // делим числитель и знаменатель на
            numerator = numerator / gcd;             // полученный наибольший общий делитель
            denominator = denominator / gcd;
        }
        void disp_fr()const
        { cout << numerator << "/" << denominator << endl; }
};
int main()
{
    char zn;
    do
    {
        Fraction fr1, fr2, fr_sum;
        fr1.get_fr();
        cout << "Enter sign" << endl; cin >> zn;
        fr2.get_fr();
        switch (zn)
        {
            case '+': fr_sum.add_fr(fr1, fr2); break;
            case '-': fr_sum.sub_fr(fr1, fr2); break;
            case '*': fr_sum.mul_fr(fr1, fr2); break;
            case '/': fr_sum.div_fr(fr1, fr2); break;
        }
        fr_sum.lowterms();
        fr_sum.disp_fr();
        cout << "repeat? (y/n)" << endl; cin >> zn;
    }
    while (zn != 'n');
    return 0;
}
но мне не дает покоя вопрос: почему, когда я изначально написала

C++ (Qt)
1
2
3
4
5
6
int main()
{
    char zn;
        Fraction fr1, fr2, fr_sum;
    do
    {
на втором цикле после задания значений дробей она заглючивает?
я только-только начала учить классы. может чего не поняла еще.
и может кто тапками в меня побросает, насчет изящности решения?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2014, 22:48     Классы, разобраться с объявлением объектов
Посмотрите здесь:

Разработать классы для данных объектов C++
C++ Классы. Создать массив объектов. Student
Задача (разъяснение) в алгоритм (программа, используя базовый и производный классы, создавала массив объектов типа производного класса) C++
C++ классы объектов
C++ Изучаю классы объектов, ошибок куча, работаю над квадратами, выручайте
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
21.07.2014, 23:26     Классы, разобраться с объявлением объектов #2
Цитата Сообщение от Pari Посмотреть сообщение
на втором цикле после задания значений дробей она заглючивает?
А в чём проблема?

Цитата Сообщение от Pari Посмотреть сообщение
насчет изящности решения?
Можно добавить в get_fr(): (чтобы посмотреть, что было введено)
C++
1
2
3
4
5
6
7
        void get_fr()
        {
            // ... 
            //cin >> ...;
 
                cout << "  \n Your input: " << numerator << "/" << denominator << endl;
        }
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
21.07.2014, 23:28  [ТС]     Классы, разобраться с объявлением объектов #3
Цитата Сообщение от Alex5 Посмотреть сообщение
А в чём проблема?
вопрос в том, что объявив объекты fr1, fr2, fr_sum раньше оператора do программа вылетает на втором цикле.
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
21.07.2014, 23:32     Классы, разобраться с объявлением объектов #4
изящно бы было перегрузить все операроры, а не функции лепить...)
по-поводу ошибки, так с лету не сказать, нужно больше информации...)
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
21.07.2014, 23:39     Классы, разобраться с объявлением объектов #5
Цитата Сообщение от Pari Посмотреть сообщение
программа вылетает на втором цикле
В какой строке? Какие значения при этом имеют переменные?
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
21.07.2014, 23:44  [ТС]     Классы, разобраться с объявлением объектов #6
Цитата Сообщение от NeonLost Посмотреть сообщение
изящно бы было перегрузить все операроры, а не функции лепить...)
а можно поподробнее?

Добавлено через 2 минуты
Цитата Сообщение от Alex5 Посмотреть сообщение
В какой строке? Какие значения при этом имеют переменные?
строка 62 и далее, но там подан работающий вариант, а я спрашиваю почему если прописать ДО оператора do объекты, она перестает работать.
переменные имеют значения простых чисел, к примеру, 1/2 + 3/4
scripter51
0 / 0 / 0
Регистрация: 21.07.2014
Сообщений: 4
21.07.2014, 23:48     Классы, разобраться с объявлением объектов #7
Я попробовал, у меня работает в обоих случаях, Microsoft Visual StudioExpress.
ssXXss
263 / 185 / 10
Регистрация: 15.01.2011
Сообщений: 668
21.07.2014, 23:50     Классы, разобраться с объявлением объектов #8
ключевое слово - область видимости, если создается обьект до цикла do {..}while() то переменные в классе при каждом вхождении в цикл имеют отличное состояние от первоначального, а если создаешь в цикле то у тебя они имеют нулевое значение.
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
21.07.2014, 23:53  [ТС]     Классы, разобраться с объявлением объектов #9
Цитата Сообщение от scripter51 Посмотреть сообщение
int - целые.
а результат тоже в виде целого числа, посмотрите методы действий над дробями

Добавлено через 2 минуты
Цитата Сообщение от ssXXss Посмотреть сообщение
ключевое слово - область видимости, если создается обьект до цикла do {..}while() то переменные в классе при каждом вхождении в цикл имеют отличное состояние от первоначального, а если создаешь в цикле то у тебя они имеют нулевое значение.
и в данном случае, если значение ненулевое, это как-то влияет? потому что далее ведь пользователь сам задает все значения и только потом программа выполняет операции. может глупые вопросы задаю, прошу прощения, но я большой чайник
ssXXss
263 / 185 / 10
Регистрация: 15.01.2011
Сообщений: 668
21.07.2014, 23:55     Классы, разобраться с объявлением объектов #10
Pari,
Цитата Сообщение от Pari Посмотреть сообщение
это как-то влияет?
а вот как это влияет - нужно смотреть гоняя программу под отладчиком и тогда станет ясно где баг окопался )
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
22.07.2014, 00:08  [ТС]     Классы, разобраться с объявлением объектов #11
Цитата Сообщение от ssXXss Посмотреть сообщение
а вот как это влияет - нужно смотреть гоняя программу под отладчиком и тогда станет ясно где баг окопался )
ааааа, т.е. дело не в каком-то конкретном правиле
ssXXss
263 / 185 / 10
Регистрация: 15.01.2011
Сообщений: 668
22.07.2014, 00:13     Классы, разобраться с объявлением объектов #12
вообще то дело всегда в каком то правиле )) а вот в каком именно - ответит отладчик, в любой IDE- шке есть режим пошагового исполнения проги , запусти ее и смотри как изменяются переменные и на каком шаге вылетает и при каких значениях .
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
22.07.2014, 00:22     Классы, разобраться с объявлением объектов #13
Цитата Сообщение от Pari Посмотреть сообщение
строка 62 и далее, значения простых чисел, к примеру, 1/2 + 3/4
Функция main() расположена в 62-83 строках. Если (с помощью отладчика) пройти по шагам, то в какой именно строке возникает ошибка?
Вопрос не о значениях "к примеру". Какие значения именно в тот момент, когда произошла ошибка?

Цитата Сообщение от Pari Посмотреть сообщение
дело не в каком-то конкретном правиле
Дело в конкретном правиле, только нужно определить, в каком.

Добавлено через 1 минуту

Не по теме:

Сейчас вижу, что просто повторил, что уже написал ssXXss

Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
22.07.2014, 00:29  [ТС]     Классы, разобраться с объявлением объектов #14
Цитата Сообщение от ssXXss Посмотреть сообщение
есть режим пошагового исполнения проги
а я не знаю как его запустить в вижуал как это сделать?
ssXXss
263 / 185 / 10
Регистрация: 15.01.2011
Сообщений: 668
22.07.2014, 00:36     Классы, разобраться с объявлением объектов #15
проще некуда : ставишь курсор на том месте где хочешь чтобы программа остановилась ,жмешь F9 после F5 после остановки каждый шаг F10 - не заходя в функцию , F11 с заходом в функцию ctrl + F11 - выход из функции.

Добавлено через 1 минуту
или с самого начала жми F10 или F11

Добавлено через 2 минуты
а вообще не мешало бы ознакомится с интерфейсом студии , тем более она на русском обычно
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
22.07.2014, 01:02  [ТС]     Классы, разобраться с объявлением объектов #16
ой, я попыталась, ничего не поняла что произошло, сейчас буду ковыряться. спасибо)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2014, 01:27     Классы, разобраться с объявлением объектов
Еще ссылки по теме:

C++ Разработать классы для описанных ниже объектов
C++ Разобраться с коротеньким объявлением переменной

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

Или воспользуйтесь поиском по форуму:
ssXXss
263 / 185 / 10
Регистрация: 15.01.2011
Сообщений: 668
22.07.2014, 01:27     Классы, разобраться с объявлением объектов #17
msdn туда же
Yandex
Объявления
22.07.2014, 01:27     Классы, разобраться с объявлением объектов
Ответ Создать тему
Опции темы

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