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

Класс "Дробь", создать таблицу умножения - C++

Восстановить пароль Регистрация
 
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
22.07.2014, 02:48     Класс "Дробь", создать таблицу умножения #1
Классы, циклы

задание состоит вот в чем: Программа должна выводить аналог целочисленной таблицы
умножения для дробей. Пользователь вводит знаменатель, а программа
должна подобрать всевозможные целые значения числителя так, чтобы
значения получаемых дробей находились между 0 и 1. Дроби из получив-
шегося таким образом набора перемножаются друг с другом во всевоз-
можных комбинациях, в результате чего получается таблица следующего
вида (для знаменателя, равного 6):
1/6 1/3 1/2 2/3 5/6
-----------------------------------------
1/6 1/36 1/18 1/12 1/9 5/36
1/3 1/18 1/9 1/6 2/9 5/18
1/2 1/12 1/6 1/4 1/3 5/12
2/3 1/9 2/9 1/3 4/9 5/9
5/6 5/36 5/18 5/12 5/9 25/36
я что-то накодила, пыталась, лепила из того что было в интернете но все равно не работает, точнее работает неправильно. помогите разобраться! и объясните пожалуйста, сам принцип этого многоуровневого цикла, он слишком мудреный для меня


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
#include "stdafx.h"
#include <iostream>     
#include <cmath>
using namespace std;
class Fraction
{
    private:
    
    public: 
        int numerator, denominator;
        Fraction():numerator(0), denominator(0)
        {}
        void mul_fr (Fraction f1, Fraction f2)
        {
            numerator = f1.numerator * f2.denominator;
            denominator = f1.denominator * f2.denominator; 
        }
        void lowterms ()
        {
            long tnum, tden, temp, gcd;
            tnum = labs(numerator); 
            tden = labs(denominator); 
            if( tden == 0 ) 
              { cout << "Недопустимый знаменатель!"; exit(1); }
            else if( tnum == 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()
{
        Fraction fr1, fr2, fr3;
        int number=0;
        fr1.denominator = fr2.denominator = number;
        cout << "enter denominator" << endl; cin >> number;
        for (int j = 1; j<number; j++)
        {
            fr1.numerator = j;
            fr1.denominator = number;
            fr1.lowterms();
            fr1.disp_fr();
        }
        cout << endl;
        for(int i = 1; i < number; i++)
        {
            fr2.numerator=i;
            fr2.denominator=number;
            fr2.lowterms();
            fr2.disp_fr();
        
            for(int j = 1; j < number; j++)  
            {
                fr1.numerator=j;
                fr1.denominator=number;
                fr3.mul_fr(fr1, fr2);
                fr3.lowterms();
                fr3.disp_fr();
            }
            cout<<endl;
        }
            system ("pause");
    return 0;
}
Добавлено через 11 минут
вроде я и в саму структуру цикла въехала, вроде все логично, а работает не так

Добавлено через 15 минут
заработало! нашла маленькую ошибку в функции. может кому пригодится правильное решение. задача из Лафоре ООП
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
#include "stdafx.h"
#include <iostream>     
#include <cmath>
#include <iomanip>
using namespace std;
int number;
class Fraction
{
    private:
    
    public: 
        int numerator, denominator;
        Fraction():numerator(0), denominator(0)
        {}
        void mul_fr (Fraction f1, Fraction f2)
        {
            numerator = f1.numerator * f2.numerator;
            denominator = f1.denominator * f2.denominator; 
        }
        void lowterms ()
        {
            long tnum, tden, temp, gcd;
            tnum = labs(numerator); 
            tden = labs(denominator); 
            if( tden == 0 ) 
              { cout << "Недопустимый знаменатель!"; exit(1); }
            else if( tnum == 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 << setw(5) << numerator  << "/" << denominator; }
};
int main()
{
        Fraction fr1, fr2, fr3;
        fr1.denominator = fr2.denominator = number;
        cout << "enter denominator" << endl; cin >> number;
        for (int j = 1; j<number; j++)
        {
            fr1.numerator = j;
            fr1.denominator = number;
            fr1.lowterms();
            fr1.disp_fr();
        }
        cout << endl;
        for(int i = 1; i < number; i++)
        {
            fr2.numerator=i;
            fr2.denominator=number;
            fr2.lowterms();
            fr2.disp_fr();
        
            for(int j = 1; j < number; j++)  
            {
                fr1.numerator=j;
                fr1.denominator=number;
                fr3.mul_fr(fr1, fr2);
                fr3.lowterms();
                fr3.disp_fr();
            }
            cout<<endl;
        }
            system ("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2014, 02:48     Класс "Дробь", создать таблицу умножения
Посмотрите здесь:

C++ Создать класс "точка" и производный класс "отрезок"
C++ Ввести класс для работы с объектом "рациональная дробь"
Нужно разработать класс "вектор" и реализовать операцию векторного умножения векторов C++
C++ Из класса "Дата" с полями день, месяц, год создать класс "Время" с дополнительными полями час, минута, секунда
Класс "Дробь" для обработки обычных дробей C++
C++ Класс для работы с объектом "рациональная дробь"
C++ Создать класс "прямоугольник" и перегрузить операцию отношения "равно"
C++ Класс "Несократимая дробь"

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
22.07.2014, 11:14     Класс "Дробь", создать таблицу умножения #2
C++
1
2
3
4
5
void mul_fr (Fraction f1, Fraction f2)
        {
            numerator = f1.numerator * f2.numerator;
            denominator = f1.denominator * f2.denominator; 
        }
тогда уж
C++
1
2
3
4
5
6
7
Fraction mul_fr (const Fraction& f1)
        {
            Fraction tmp;
            tmp.numerator = numerator *f1.numerator;
            tmp.denominator = denominator*f1.denominator;
            return tmp;
        }
в main
C++
1
2
3
4
Fraction f1;
Fraction f2;
Fraction f3;
f3 = f1.mul_fr(f2);
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
22.07.2014, 17:10  [ТС]     Класс "Дробь", создать таблицу умножения #3
о, вот это совсем идеально, спасибо
Yandex
Объявления
22.07.2014, 17:10     Класс "Дробь", создать таблицу умножения
Ответ Создать тему
Опции темы

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