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

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

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

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

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

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

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

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

Написать программу для умножения дробей - C++
Дроби представляются в виде строки, транслируется и на его основе формируется двумерный массив коэффициентов. Результат подавать в виде...

Программа должна читать из консоли переменное количество аргументов и выводить их - C++
Программа должна читать переменное кол-во аргументов из командной строки и выводить их в виде "Hello, arg!" . Ф-я main() принимает два...

Программа должна задать пользовательские ответы в течение 10 выражений умножения - C++
Программа должна задать пользовательские ответы в течение 10 выражений умножения, например 2 * 2, 3 * 5, выход процент правильных ответов и...

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

Не по теме:

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

0
Koshachek
3 / 3 / 1
Регистрация: 17.02.2012
Сообщений: 107
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
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
Koshachek
3 / 3 / 1
Регистрация: 17.02.2012
Сообщений: 107
09.05.2013, 15:19  [ТС] #5
Спасибо большое, объяснения просто офигенские!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2013, 15:19
Привет! Вот еще темы с ответами:

Программа выводит только 1 знак после запятой, хотя должна выводить больше - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;iomanip&gt; using namespace std; int main(){ setlocale(LC_ALL, &quot;Russian&quot;); ...

Программа должна считывать английский текст и выводить на экран слова, которые начинаются на гласные буквы - C++
Привет всем)) Вот такая проблема, прога должна считывать английский текст и выводить на экран слова, которые начинаются на гласные...

Программа должна выводить координаты отрезка в границы которого входит максимальное число отрезков подаваемых на вход - C++
#include&lt;iostream&gt; #include &lt;fstream&gt; using namespace std;

Для каждого введённого числа выводить на экран таблицу умножения - C++
написать программу, которая предлагает пользователю вводить целое число, до тех пор, пока он не введёт 0. И для каждого введённого числа...


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
09.05.2013, 15:19
Ответ Создать тему
Опции темы

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