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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
aquarius-a
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 48
#1

Создать класс с именем Rational для выполнения арифметических действий с дробями - C++

24.07.2011, 23:33. Просмотров 2023. Ответов 20
Метки нет (Все метки)

здравствуйте!
подскажите пожалуйста в чем ошибка?
по задаче мне нужно создать класс с именем Rational для выполнения арифметических действий с дробями. для представления закрытых членов данных класса (числителя и знаменателя) )нужно использовать целые переменные. надо создать функцию конструктор, которая позволяет объекту класса принимать начальные значения при его объявлении(конструктор должен также содержать значения по умолчанию). конструктор должен хранить дроби в сокращенном виде (т.е. дробь 2/4 должна храниться в объекте как 1 в числителе и 2 в знамнателе). нужно создать открытые функции-члены для каждой арифметической операции.
мой код не корректно работает если знаменатели задаются нулевым значением, почему так?
вот код:
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
#include<iostream.h>
#include<time.h>
#include<conio.h>
#include<stdio.h>
#include<iomanip.h>
#include<math.h>
using std::setfill;
using std::setw;
using namespace std;
 
class Rational
{
public:
 Rational(int =1,int =1,int =1,int =1);
 void setRational(int ,int ,int ,int );
 int Plus(/*int ,int, int, int */);
 void Print1();
private:
 int ch1,ch2;
 int zn1,zn2;
 int rez_ch1,rez_zn1;
};
 
Rational::Rational(int a1,int b1,int a2,int b2)
{
 setRational(a1,b1,a2,b2);
}
 
void Rational::setRational(int aa1,int bb1, int aa2, int bb2)
{
ch1=aa1;
ch2=aa2;
if (bb1==0)
  {cout<<"ERROR, \n";
   while (bb1==0)
     {
     cout<<"set right value: ";
     cin>>bb1;
     }
  }
else zn1=bb1;
if (bb2==0)
  {cout<<"ERROR, \n";
   while (bb2==0)
     {
     cout<<"set right value: ";
     cin>>bb2;
     }
  }
else zn2=bb2;
}
 
int Rational::Plus()
{
rez_ch1=ch1*zn2+ch2*zn1;
rez_zn1=zn1*zn2;
return rez_ch1,rez_zn1;
}
 
void Rational::Print1()
{
cout<<rez_ch1<<"/"<<rez_zn1;
}
 
int main()
{
Rational r(1,0,3,4);
r.Plus();
r.Print1();
 
getch();
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2011, 23:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создать класс с именем Rational для выполнения арифметических действий с дробями (C++):

Создайте класс с именем Rational для выполнения действий с дробями - C++
Задание : создайте класс с именем Rational для выполнения действий с дробями и программу тестирования вашего класса. (используйте закрытые...

Создайте класс с именем Complex для выполнения арифметических действий с комплексными числами - C++
В Общем программу написал, складывает-вычитает, но преподаватель требует в нее добавить класс комплексных чисел, не знаю как #include...

Создать класс Rational для работы с ра-циональными дробями - C++
Рациональная (несократимая) дробь представляется парой целых чисел (а, 6), где а — числитель, Ь — знаменатель. Создать класс Rational для...

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

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

С++ класс (создайте класс с именем Complex для выполнения в арифмитических операий с комплексными числами)) - C++
Кто сможет помогите пожалуйста! (Класс Complex). Создайте класс с именем Complex для выполнения в арифмитических операий с...

20
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
24.07.2011, 23:42 #2
А в чем именно заключается ошибка?
P.S. Как мне подсказывает мой трехлетний аспирантский опыт преподавания, с таким подходом к реализации классов Вы никогда не сдадите эту задачу... Не обижайтесь, но это ужас
0
aquarius-a
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 48
24.07.2011, 23:51  [ТС] #3
вы бы не могли пояснить в чем именно ужас?
ошибка в том, что если задавать числители и знаменатели числами отличными от нуля, то результат правильный. если задать один из знаменателей нулем, то получается ерунда.
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
24.07.2011, 23:54 #4
Цитата Сообщение от aquarius-a Посмотреть сообщение
if (bb2==0)
{cout<<"ERROR, \n";
while (bb2==0)
{
cout<<"set right value: ";
cin>>bb2;
}
}
else zn2=bb2;
если значение правильное оно присваивается
а Если не правильное???
ты прсишь ввести правильное и тут же его теряешь!
выбрось else
C++
1
2
3
4
5
6
7
8
9
10
if (bb2==0)
 {
    cout<<"ERROR, \n";
       while (bb2==0)
     { 
        cout<<"set right value: ";
        cin>>bb2;
     }
 }
 zn2=bb2;
еше лучше выбрось if
C++
1
2
3
4
5
6
 while (bb2==0)
 {
 cout<<"set right value: ";
 cin>>bb2;
 }
 zn2=bb2;
1
Paporotnik
24.07.2011, 23:56
  #5

Не по теме:

ужас в том, что задача странная и некрасивая. было бы логичнее, если бы арифметические операции нужно было реализовать не описанием ф-ций-членов, а перегрузкой соответствующих операций +, - и прочих.

0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
24.07.2011, 23:56 #6
Цитата Сообщение от aquarius-a Посмотреть сообщение
return rez_ch1,rez_zn1;
как ты собираешься вернуть ДВА значения???
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
24.07.2011, 23:58 #7
Цитата Сообщение от aquarius-a Посмотреть сообщение
Rational(int =1,int =1,int =1,int =1);
браво!
0
John_Pa9JIbHuK
Добрый самаритянин
1098 / 614 / 33
Регистрация: 31.03.2009
Сообщений: 2,568
25.07.2011, 00:00 #8
Добавлено через 35 секунд
Цитата Сообщение от ValeryS Посмотреть сообщение
как ты собираешься вернуть ДВА значения???
Уличную магию еще никто не отменял =)
0
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
25.07.2011, 00:00 #9
Ужас в том, что класс Rational должен содержать представление одного числа, а не трех.
Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Rational
{
public:
  Rational(int a = 0, int b = 1);
  Rational plus(Rational r);
private:
  int ch;
  int zn;
};
 
Rational Rational::plus(Rational r)
{
  return Rational(r.ch * zn + r.zn * ch, r.zn * zn);
}
И гляньте совет ValeryS, он абсолютно верный.

P.S. Как уже упоминалось выше, арифметические операции обычно реализуют с помощью перегрузки операторов
Кстати, ввод/вывод объекта Rational тоже неплохо бы реализовать как перегрузку операторов <<, >>
0
aquarius-a
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 48
25.07.2011, 00:09  [ТС] #10
ValeryS, спасибо
насчет возврата двух значений я гоню.
to alex_x_x, если мне нужно задать значения по умолчанию и я написал Rational(int =1,int =1,int =1,int =1); это ошибочно?
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
25.07.2011, 00:13 #11
Цитата Сообщение от soft.creator Посмотреть сообщение
Ужас в том, что класс Rational должен содержать представление одного числа, а не трех.
тогда ему нужно создать конструктор копирования
переопределить сложение,вычитание,умножение,деление, присваивания, может быть возведение в степень
и получится хороший классик для последующей работы а не для сдачи лаб
Цитата Сообщение от aquarius-a Посмотреть сообщение
конструктор должен хранить дроби в сокращенном виде (т.е. дробь 2/4 должна храниться в объекте как 1 в числителе и 2 в знамнателе).
совершенно не видно нормализации дроби
можно сделать так
вычисляем остаток от деления если его нет смело делим(а ну надо вычислить обший делитель)
но как быть с неправильными дробями и в частности с такими 5/1
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.07.2011, 00:15 #12
Цитата Сообщение от aquarius-a Посмотреть сообщение
если мне нужно задать значения по умолчанию и я написал Rational(int =1,int =1,int =1,int =1); это ошибочно?
просто я поражен, что это возможно, такая запись
0
aquarius-a
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 48
25.07.2011, 00:22  [ТС] #13
to alex_x_x: подшучиваете?
0
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
25.07.2011, 00:24 #14
Цитата Сообщение от alex_x_x Посмотреть сообщение
просто я поражен, что это возможно, такая запись
Запись сама по себе корректная. Но человеку, читающему программу, два числителя и знаменателя сломают мозг

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
тогда ему нужно создать конструктор копирования
переопределить сложение,вычитание,умножение,деление, присваивания, может быть возведение в степень
и получится хороший классик для последующей работы а не для сдачи лаб
Конструктор копирования такому классу не нужен - компилятор тут сам справится.
А вариант реализации сложения я написал. Остальные можно сделать по аналогии.
А насчет наибольшего общего делителя, Вы, конечно, правы.
0
aquarius-a
0 / 0 / 0
Регистрация: 16.04.2011
Сообщений: 48
25.07.2011, 00:26  [ТС] #15
to ValeryS: нормализацию дроби я еще не дописал, так как споткнулся о вышеуказанную ошибку.
вы бы не могли объяснить, что значит конструктор копирования? и что значит "класс Rational должен содержать представление одного числа, а не трех"?
0
25.07.2011, 00:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2011, 00:26
Привет! Вот еще темы с ответами:

Создать класс для работы с дробями - C++
МОЖНО ТОЛЬКО НЕ КИТАЙСКИМ КОДОМ(хочу разобраться,не понимаю).заранее благодарен! Реализуйте класс Дробь. Необходимо хранить числитель...

Создать класс для работы с обыкновенными дробями - C++
ЗАДАНИЕ : Создать класс для работы с обыкновенными дробями. Все операции, которые должны выполняться с дробями Код написала, но куча...

Создать класс для работы с рациональными дробями - C++
1. Создать класс для работы с рациональными дробями (вида m/n). Закрытые данные класса: числитель, знаменатель, десятичный вариант дроби....

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


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

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

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