7 / 7 / 5
Регистрация: 17.02.2012
Сообщений: 119
1

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

07.05.2013, 23:34. Показов 2938. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача из учебника Р.Лафоре

Доброго времени суток! Я изучаю С++ самостоятельно, по данному учебнику, столкнулся с задачей: Используйте преимущество ООП, заключающееся в том, что однажды созданный класс можно помещать в другие программы. Создайте новую программу, которая будет включать класс 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 задач прорешал, а на последней вот запара вышла...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2013, 23:34
Ответы с готовыми решениями:

Программа для изучения таблицы умножения
Напишите программу, которая поможет выучить таблицу умножения. Суть программы в том, что она...

Программа, которая должна выводить случайное число
Написал программку, которая должна выводить случайное число. Но сколько раз я не запускал...

Программа, которая должна выводить объем продаж, и заработок
Разработать программу, которая должна вводить для каждого продавца объем его продаж за последнюю...

Программа должна запросить 3 натуральных числа - знаменатели трех дробей, вычислять и выводить на экран наименьший общий знаменатель.
1) Для сложения трех обыкновенных дробей со знаменателями a, b и c (1<a,b,c<1200) нужно найти...

4
4460 / 2396 / 857
Регистрация: 29.11.2010
Сообщений: 5,311
08.05.2013, 00:55 2
Цитата Сообщение от Koshachek Посмотреть сообщение
класс fraction, созданный в упражнении 11.
Где класс?

Не по теме:

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

0
7 / 7 / 5
Регистрация: 17.02.2012
Сообщений: 119
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;
}
0
4460 / 2396 / 857
Регистрация: 29.11.2010
Сообщений: 5,311
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;
  }
  
}
1
7 / 7 / 5
Регистрация: 17.02.2012
Сообщений: 119
09.05.2013, 15:19  [ТС] 5
Спасибо большое, объяснения просто офигенские!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2013, 15:19
Помогаю со студенческими работами здесь

Для любой заданной даты программа должна выводить день недели
Известно, что 1 января 2009 года –четверг. Для любой заданной даты программа должна выводить день...

Программа для вывода таблицы умножения
1)Напишите программу, которая вычисляет Таблица умножения, используя петли и в табличной форме на...

Программа для запоминания таблицы умножения
Решил реализовать программу для запоминания таблицы умножения для младшей сестренки, что хочу...

Программа должна выводить из массива простые числа
Неактуально


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru