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

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

Войти
Регистрация
Восстановить пароль
 
Koshachek
3 / 3 / 1
Регистрация: 17.02.2012
Сообщений: 102
#1

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

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

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
08.05.2013, 00:55     Программа должна выводить аналог целочисленной таблицы умножения для дробей #2
Цитата Сообщение от Koshachek Посмотреть сообщение
класс fraction, созданный в упражнении 11.
Где класс?

Не по теме:

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

Koshachek
3 / 3 / 1
Регистрация: 17.02.2012
Сообщений: 102
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
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
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
Сообщений: 102
09.05.2013, 15:19  [ТС]     Программа должна выводить аналог целочисленной таблицы умножения для дробей #5
Спасибо большое, объяснения просто офигенские!
Yandex
Объявления
09.05.2013, 15:19     Программа должна выводить аналог целочисленной таблицы умножения для дробей
Ответ Создать тему
Опции темы

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