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

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

Войти
Регистрация
Восстановить пароль
 
 
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
#1

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

21.07.2014, 22:48. Просмотров 460. Ответов 16
Метки нет (Все метки)

я написала вот такую программу по условию:
Класс должен содержать методы для ввода и вывода данных объектов, а также для выполнения арифметических операций. Кроме того, необходимо включить в состав класса функцию, приводящую дробь к несократимому виду. Функция должна находить наибольший общий делитель числителя и знаменателя и делить числитель и знаменатель на это значение.
Можно вызывать данную функцию в конце каждого метода, выполня-
ющего арифметическую операцию, либо непосредственно перед выводом
на экран результата. Кроме перечисленных методов, вы можете вклю-
чить в класс конструктор с двумя аргументами, что также будет полезно.

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

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
    {
на втором цикле после задания значений дробей она заглючивает?
я только-только начала учить классы. может чего не поняла еще.
и может кто тапками в меня побросает, насчет изящности решения?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2014, 22:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Классы, разобраться с объявлением объектов (C++):

Разобраться с коротеньким объявлением переменной - C++
Драсьте, возник небольшой вопрос по теории, дано вот такое объявление, а вместе с этим и определение: static const short* const x; ...

классы объектов - C++
На вход подается некоторое количество окружностей(координаты центра и радиус).Отсортировать и вывести их по возрастанию площадей.(на языке...

Классы для описанных объектов - C++
Здравствуйте! Очень нужна помощь. Что в данном коде не так? При запуске выдаёт ошибки. Кому не сложно, исправьте. Заранее благодарен. ...

Разработать классы для данных объектов - C++
Разработать классы для описанных ниже объектов. Включить методы set (...), get (...), show (...). Определить другие методы. Book:...

Классы. Создать массив объектов. Student - C++
Разработать консольную программу на языке С++, в которой описывается и используется простой класс для объектов индивидуального варианта....

Разработать классы для описанных ниже объектов - C++
Не могу въехать где что не так.. вот задание: Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get...

16
Alex5
1073 / 737 / 114
Регистрация: 12.04.2010
Сообщений: 1,886
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;
        }
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
21.07.2014, 23:28  [ТС] #3
Цитата Сообщение от Alex5 Посмотреть сообщение
А в чём проблема?
вопрос в том, что объявив объекты fr1, fr2, fr_sum раньше оператора do программа вылетает на втором цикле.
0
NeonLost
Пес войны
75 / 86 / 3
Регистрация: 23.02.2012
Сообщений: 653
21.07.2014, 23:32 #4
изящно бы было перегрузить все операроры, а не функции лепить...)
по-поводу ошибки, так с лету не сказать, нужно больше информации...)
0
Alex5
1073 / 737 / 114
Регистрация: 12.04.2010
Сообщений: 1,886
21.07.2014, 23:39 #5
Цитата Сообщение от Pari Посмотреть сообщение
программа вылетает на втором цикле
В какой строке? Какие значения при этом имеют переменные?
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
21.07.2014, 23:44  [ТС] #6
Цитата Сообщение от NeonLost Посмотреть сообщение
изящно бы было перегрузить все операроры, а не функции лепить...)
а можно поподробнее?

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

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

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

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

Не по теме:

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

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

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

Добавлено через 2 минуты
а вообще не мешало бы ознакомится с интерфейсом студии , тем более она на русском обычно
1
22.07.2014, 00:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2014, 00:36
Привет! Вот еще темы с ответами:

Изучаю классы объектов, ошибок куча, работаю над квадратами, выручайте - C++
/* Л.Р. №2 Классы объектов. На вход подается некоторое количество квадратов (координаты вершин). Отсортировать и вывести их по...

Задача (разъяснение) в алгоритм (программа, используя базовый и производный классы, создавала массив объектов типа производного класса) - C++
Задача на наследование классов, базовый класс - &quot;люди&quot;, производный - &quot;студенты&quot;...как я понял, а базовом надо создать символьную матрицу в...

Загвоздка с объявлением переменной - C++
Всем доброго времени суток. Недавно начал изучать С++ по Дейтелу. Есть такой пример программы, который прерывает цикл при определенном...

Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы - C++
Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы Abiturient:...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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