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

Программа должна выводить аналог целочисленной таблицы умножения для дробей - C++

Восстановить пароль Регистрация
 
Koshachek
3 / 3 / 1
Регистрация: 17.02.2012
Сообщений: 100
07.05.2013, 23:34     Программа должна выводить аналог целочисленной таблицы умножения для дробей #1
Задача из учебника Р.Лафоре

Доброго времени суток! Я изучаю С++ самостоятельно, по данному учебнику, столкнулся с задачей: Используйте преимущество ООП, заключающееся в том, что однажды созданный класс можно помещать в другие программы. Создайте новую программу, которая будет включать класс fraction, созданный в упражнении 11. Программа должна выводить аналог целочисленной таблицы умножения для дробей. Пользователь вводит знаменатель, а программа должна подобрать всевозможные целые значения числителя так, чтобы значения получаемых дробей находилось между 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
. Пожалуйста помогите с решением. 11 задач прорешал, а на последней вот запара вышла...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2013, 23:34     Программа должна выводить аналог целочисленной таблицы умножения для дробей
Посмотрите здесь:

Программа должна считывать английский текст и выводить на экран слова, которые начинаются на гласные буквы C++
программа должна выводить день недели. C++
Написать программу проверки знания даты основания Санкт-Петербурга. В случае неправильного ответа пользователя, программа должна выводить правильный о C++
Для каждого введённого числа выводить на экран таблицу умножения C++
Программа проверки знания таблицы умножения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.05.2013, 00:55     Программа должна выводить аналог целочисленной таблицы умножения для дробей #2
Цитата Сообщение от Koshachek Посмотреть сообщение
класс fraction, созданный в упражнении 11.
Где класс?

Не по теме:

Цитата Сообщение от Koshachek Посмотреть сообщение
11 задач прорешал
Вы хотите сказать, что смогли написать класс для дробей, но не можете теперь элементарно вывести на экран таблицу умножения в два вложенных цикла?!

Koshachek
3 / 3 / 1
Регистрация: 17.02.2012
Сообщений: 100
08.05.2013, 00:58  [ТС]     Программа должна выводить аналог целочисленной таблицы умножения для дробей #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
#include <iostream>
#include <cmath>
using namespace std;
char s = '/';
class fraction
{
    private:
        int chis, znam;
    public:
        fraction(): chis(0), znam(0) 
        { }
 
        fraction(int ch, int zn): chis(ch), znam(zn) 
        { }
        //метод "Ввода"
        void input()
        {cin >> chis >> s >> znam;}
        //метод "Отображения"
        void show()
        {cout << "Резульат = " << chis << s << znam;}
        //действия
        void addition(fraction, fraction);
        void subtraction(fraction, fraction);
        void multiplication(fraction, fraction);
        void division(fraction, fraction);
        void lowterms();
};
void fraction::addition(fraction dd1, fraction dd2)
{
    chis = dd1.chis * dd2.znam + dd1.znam * dd2.chis;
    znam = dd1.znam * dd2.znam;
}
void fraction::subtraction(fraction dd1, fraction dd2)
{
    chis = dd1.chis * dd2.znam - dd1.znam * dd2.chis;
    znam = dd1.znam * dd2.znam;
}
void fraction::multiplication(fraction dd1, fraction dd2)
{
    chis = dd1.chis * dd2.chis;
    znam = dd1.znam * dd2.znam;
}
void fraction::division(fraction dd1, fraction dd2)
{
    chis = dd1.chis * dd2.znam;
    znam = dd1.znam * dd2.chis;
}
void fraction::lowterms()
{
    long tchis, tznam, temp, nod;
    tchis = labs(chis);
    tznam = labs(znam);
    if (tznam == 0)
    {
        cout << "Недопустимый знаменатель!"; 
        exit(1);
    }
    else
        if (tchis == 0)
        {
            chis = 0; 
            znam = 1;
            return;
        }
    while(tchis != 0)
    {
        if (tchis < tznam)
        {temp = tchis; tchis = tznam; tznam = temp;}
        tchis = tchis - tznam;
    }
    nod = tznam;
    chis = chis / nod;
    znam = znam / nod;
}
 
int main()
{
    setlocale(LC_ALL, "RUS");
    fraction drob1, drob2, rezultat;
    char deistvie = ' ';
    char yn = 'y';
    while(yn != 'n')
    {
        cout << "Введите первую дробь: "; drob1.input();
        cout << "Введите действие(+ , - , * , /): "; cin >> deistvie;
        cout << "Введите вторую дробь: "; drob2.input();
        switch(deistvie)
        {
            case '+': rezultat.addition(drob1, drob2); break;
            case '-': rezultat.subtraction(drob1, drob2); break;
            case '*': rezultat.multiplication(drob1, drob2); break;
            case '/': rezultat.division(drob1, drob2); break;
        }
            rezultat.show(); cout << endl;
            rezultat.lowterms();
            cout << "Сокращенный вид: "; rezultat.show(); cout << endl;
            cout << "Желаете продолжать работу? (y/n): ";
            cin >> yn;
            cout << endl;
    }
    system("pause");
    return 0;
}
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.05.2013, 18:05     Программа должна выводить аналог целочисленной таблицы умножения для дробей #4
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
#include <iostream>
 
/*
 * Давайте сначала отделим мух от котлет.
 * Методы самого класса (то, что делает сам объект) от методов работы с классом
 * (то, что делают уже с объектом).
 * 
 * Заранее извиняюсь за переформатирование кода и переименование
 * идентификаторов -- не могу прямо, когда смешивают транслит и
 * перевод.
 */
 
/*
 * Объект, свойства которого нельзя изменить после создания,
 * называют immutable. Это удобно, поскольку более-менее гарантирует,
 * что свойства объекта не поменяются даже при передаче по
 * неконстантной ссылке или по указателю.
 */
class fraction {
private:
  const int numerator;
  const int denominator;
 public:
  fraction(): numerator(0), denominator(1)  {}
  fraction(int numerator, int denominator): numerator(numerator),
    denominator(denominator) {}
  // добавим пару методов класса, позволяющих установить числитель и знаменатель.
  int getNumerator() const { return numerator; }
  int getDenominator() const { return denominator; }
};
 
 
/*
 * Действия с дробями. Обратите внимание, что теперь функции возвращают
 * новосозданную дробь.
 *
 * В логике больших изменений нет. Дроби как складывались так и
 * складываются. Только теперь функции возвращают дроби.
 */
 
// складывает две дроби, возвращает сумму
fraction addition(const fraction &a, const fraction &b) {
  return fraction(a.getNumerator() * b.getDenominator() + 
    b.getNumerator() * a.getDenominator(),
    a.getDenominator() * b.getDenominator());
}
 
fraction subtraction(const fraction &a, const fraction &b) {
  return fraction(a.getNumerator() * b.getDenominator() - 
    b.getNumerator() * a.getDenominator(),
    a.getDenominator() * b.getDenominator());
}
 
fraction multiplication(const fraction &a, const fraction &b) {
  return fraction(a.getNumerator() * b.getNumerator(),
    a.getDenominator() * b.getDenominator());
}
 
fraction division(const fraction &a, const fraction &b) {
  return fraction(a.getNumerator() * b.getDenominator(),
    a.getDenominator() * b.getNumerator());
}
 
// находит наибольший общий делитель двух чисел
int getGcd(int a, int b) {
  if (a == 0 || b ==0) {
    return 1;
  }
  if (a < 0) {
    a = -a;
  }
  if (b < 0) {
    b = -b;
  }
  while (a != b) {
    if (a < b) {
      b -= a;
    } else {
      a -= b;
    }
  }
  return a;
}
 
// lowterms
// из имени функции было непонятно, что она делает, позволил себе 
// переименовать в reduce, как учат на уроках английского языка.
fraction reduce(const fraction &f) {
  int numerator = f.getNumerator();
  int denominator = f.getDenominator();
  if (denominator < 0) {
    numerator = -numerator;
    denominator = -denominator;
  }
  int gcd = getGcd(numerator, denominator);
  return fraction(numerator / gcd, denominator / gcd);
}
 
// метод "Ввода"
/*
 * не нужен, я забил.
 */
fraction input() {
  return fraction();
}
 
// метод "Отображения"
void show(const fraction &f) {
  std::cout << f.getNumerator() << "/" << f.getDenominator();
}
 
/*
 * Для удобства и читаемости кода можно еще налепить операторов,
 * но это уже по желанию.
 */
 
int main(int argc, char *argv[]) {
  int number = 6;
  
  // ну, собственно, таблица умножения
  for (int i = 1; i <= number; ++i) {
    for (int j = 1; j <= number; ++j) {
      show(
        reduce(
        multiplication(fraction(i, number), fraction(j, number))));
      std::cout << " ";
    }
    std::cout << std::endl;
  }
  
}
Koshachek
3 / 3 / 1
Регистрация: 17.02.2012
Сообщений: 100
09.05.2013, 15:19  [ТС]     Программа должна выводить аналог целочисленной таблицы умножения для дробей #5
Спасибо большое, объяснения просто офигенские!
Yandex
Объявления
09.05.2013, 15:19     Программа должна выводить аналог целочисленной таблицы умножения для дробей
Ответ Создать тему
Опции темы

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