Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
41 / 4 / 0
Регистрация: 24.11.2013
Сообщений: 139

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

21.07.2014, 22:48. Показов 1111. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.07.2014, 22:48
Ответы с готовыми решениями:

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

Не могу разобраться с объявлением MediaPlayer
В книге написано что нужно объявлять так: &quot;MideaPlayer1 = new TMediaPlayer(Form1-&gt;Handle);&quot;,Но компилятор выдает ошибку ...

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

16
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
21.07.2014, 23:26
Цитата Сообщение от Pari Посмотреть сообщение
на втором цикле после задания значений дробей она заглючивает?
А в чём проблема?

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

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

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

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

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

Не по теме:

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

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

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

Добавлено через 2 минуты
а вообще не мешало бы ознакомится с интерфейсом студии , тем более она на русском обычно
1
41 / 4 / 0
Регистрация: 24.11.2013
Сообщений: 139
22.07.2014, 01:02  [ТС]
ой, я попыталась, ничего не поняла что произошло, сейчас буду ковыряться. спасибо)
0
267 / 189 / 33
Регистрация: 15.01.2011
Сообщений: 681
22.07.2014, 01:27
msdn туда же
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.07.2014, 01:27
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru