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

Классы дробей С++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Mr.Whittier
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 33
24.03.2011, 17:29     Классы дробей С++ #1
Здравствуйте, помогите доделать класс дробей! Дан массив дробей, 1) нужно сравнить дроби, путём привидения к общему знаменателю 2) найти сумму дробей 3) найти максимальный 4) найти минимальный элемент, max и min находится путём преобразования в вещественное. Действия надо выполнить в подпрограммах, но я пока делаю в основной ф-и, чтобы понять, с классами работаю впервые.
всё работает до этой строки c.putznam()=x[i1].putznam()*x[i2].putznam();


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
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
#include <iostream.h>
#define N 5
 
class Rat
{
private:
    int chisl, znam;
    float a;
public:
    void getch (int x) {chisl=x;}
    void getzn (int y) {znam=y;}
    int putchisl ();
    int putznam ();
    void floating ();
    ~Rat ();
};
int Rat :: putchisl () {return this->chisl;}
int Rat :: putznam  () {return znam;}
void Rat::floating() { a=(float)chisl/(float)znam;}
 
Rat :: ~ Rat () {}
 
void  main()
{
    Rat x[N], c, d, sum;
    int ch, zn, i, i1, i2;
    for (i=1;i<N;i++)
    {   
    cout<<"\nEnter drob:";
    cin>>ch>>zn;
    x[i].getch(ch);
    x[i].getzn(zn);
    cout<<x[i].putchisl()<<'/'<<x[i].putznam();
    }
 
    cout<<"\nvvedite i1=";
    cin>>i1;
    cout<<"\nvvedite i2=";
    cin>>i2;
    cout<<x[i1].putchisl()<<'/'<<x[i1].putznam()<<"\n";
    cout<<x[i2].putchisl()<<'/'<<x[i2].putznam()<<"\n";
    if ((x[i1].putznam()==(x[i2].putznam()) || (x[i1].putchisl()!=x[i2].putchisl())))
    {
        c.putznam()=x[i1].putznam()*x[i2].putznam();
        cout<<c.floating();
        d.putznam()==x[i1].putznam()*x[i2].putznam();
        
        c.putchisl()==x[i1].putchisl ()*x[i2].putznam();
        d.putchisl()==x[i2].putchisl ()*x[i1].putznam();
    }   
    if(c.putchisl()==d.putchisl())
        puts("a=b");
    if(c.putchisl()>d.putchisl ())
        puts("a>b");
    if(c.putchisl()<d.putchisl ())
        puts ("a<b");
    
    sum.putchisl()==x[i1].putchisl()*x[i2].putznam()+x[i2].putchisl()*x[i1].putznam();
    sum.putznam()==x[i1].putchisl()*x[i2].putznam();
    cout<<"sum rational:";
    cout<<sum.putchisl()<<sum.putchisl();*/
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2011, 17:29     Классы дробей С++
Посмотрите здесь:

C++ сокрощение дробей
C++ Массив из дробей
Умножение дробей C++
Сумма дробей C++
Сокрашение дробей C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MopkoBHblu
10 / 10 / 0
Регистрация: 23.03.2011
Сообщений: 63
24.03.2011, 17:41     Классы дробей С++ #2
код ошибки не ; expected???

Numerator - числитель по-английски, а denоminator - знаменатель


Почему нужно аккуратно относится к форматированию программного кода???

if ( ( x[i1].putznam() == ( x[i2].putznam() ) || ( x[i1].putchisl() != x[i2].putchisl() ) ) )

Не в этом ли причина?
Mr.Whittier
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 33
24.03.2011, 17:43  [ТС]     Классы дробей С++ #3
ошибка такая error C2106: '=' : left operand must be l-value
когда ставлю "==" она исчезает, но прога всё равно не работает
я знаю, но chisl и znam привычней

такая ошибка в каждой строке:

c.putchisl()=x[i1].putchisl ()*x[i2].putznam();
d.putchisl()=x[i2].putchisl ()*x[i1].putznam();

мне бы понять как правильно записать результат, в новую дробь, чтобы сравнивать
MopkoBHblu
10 / 10 / 0
Регистрация: 23.03.2011
Сообщений: 63
24.03.2011, 18:05     Классы дробей С++ #4
Цитата Сообщение от Mr.Whittier Посмотреть сообщение
ошибка такая error C2106: '=' : left operand must be l-value
когда ставлю "==" она исчезает, но прога всё равно не работает
я знаю, но chisl и znam привычней
Да, привычней. Но! 1ое - это выглядит глупо, рунглиш - всегда выглядит глупо. 2ое - у тебя функция возвращения числителя, однообразно названа с функцией получения символа при вводе с клавиатуры xD
getch(), может лучше getNum, а еще лучше идентификаторы с обозначением типа данных intGetNumerator() - 100 баллов за понятность xD

Добавлено через 4 минуты
Цитата Сообщение от Mr.Whittier Посмотреть сообщение
ошибка такая error C2106: '=' : left operand must be l-value
когда ставлю "==" она исчезает, но прога всё равно не работает
я знаю, но chisl и znam привычней

такая ошибка в каждой строке:

c.putchisl()=x[i1].putchisl ()*x[i2].putznam();
d.putchisl()=x[i2].putchisl ()*x[i1].putznam();

мне бы понять как правильно записать результат, в новую дробь, чтобы сравнивать
ты чего это??? как ты можешь значение установить(назначить) выражению???

у тебя функция putchisl ВОЗВРАЩАЕТ числитель...
тебе нужно написать метод класса, который внутри класса будет устанавливать значение переменной

int fraction::intSetNumeratorFunc(int intValue) {

this->intNumerator = intValue;

};

как-то так

Добавлено через 13 минут
ооо нашел... ты перепутал понятия...

void getch (int x) {chisl=x;}
int putch() {return this->chisl}

GET - получить... PUT - положить, не верная трактовка для действия установки значения, лучше использовать слово SET.

c.getch( x[i1].putchisl () * x[i2].putznam() );
Mr.Whittier
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 33
24.03.2011, 18:59  [ТС]     Классы дробей С++ #5
пытаюсь вывести знаменатель новой дроби cout<<c.getzn(zn);
выдаёт ошибку:
error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'void' (or there is no acceptable conversion)

проблема, наверное в void getzn (int y) {znam=y;}

я сделал так:
int getch (int x) {return chisl=x;}
int getzn (int y) {return znam=y;}
ошибок нет, но всё равно работает неправильно
MopkoBHblu
10 / 10 / 0
Регистрация: 23.03.2011
Сообщений: 63
24.03.2011, 19:25     Классы дробей С++ #6
Цитата Сообщение от Mr.Whittier Посмотреть сообщение
пытаюсь вывести знаменатель новой дроби cout<<c.getzn(zn);
выдаёт ошибку:
error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'void' (or there is no acceptable conversion)

проблема, наверное в void getzn (int y) {znam=y;}

я сделал так:
int getch (int x) {return chisl=x;}
int getzn (int y) {return znam=y;}
ошибок нет, но всё равно работает неправильно
Курс молодого бойца.
Указание на тип данных перед именем функции есть обозначение типа данных ею возвращаемых.

Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int intFunction00() {
 
   int g = 15 + 25;
   return g;
 
}
 
void voidFunction00(int value) {
 
   int g = value + 25;
   return g;
}
 
void main() {
   cout << intFunction00();       // эта строчка выведет значение выражения int g = 15 + 25;
   cout << voidFunction00(15);  // компиляция ЭТОЙ строчки вызовет такую же ошибку как и у тебя, 
                                           // потому что это функция ничего не возвращает. Вернее она пытается
                                           // возвратить что-то, но возвращает пустоту, так как указано что она 
                                           // ничего не должна возвращать [I][B]void[/B] voidFunction00()[/I]
}
На экране будет выведено значение выражения 15+25, т.е. 40.
Инструкция return g; говорит что конкретно будет возвращено этой функцией(т.е. переменная g).
int перед именем этой функции говорит, что возвращен будет результат типа int.

Объясняю еще раз, что надо сделать тебе. Создать четыре метода класса, два из которых принимают значения, два возвращают. Подумай.
Методы, которые принимают значения, должны ли они что-либо возвращать? По-хорошему - да, и должны они возвращать код выполнения функции, так делается, если у тебя сложная программа, которая пишет свой лог для отладки системы или еще что-то. В твоем же случае это не обязательно.

int intGetNumerator(); int intGetDenominator(); - для получения переменных
void voidSetNumerator(int intValue); void voidSetDenominator(int intValue); - для установки значений переменных.

Советую почитать "Дейтел и Дейтел. Как программировать на С++", очень полезно для новичков.
Mr.Whittier
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 33
24.03.2011, 20:49  [ТС]     Классы дробей С++ #7
void setnum (int x) {num=x;}
void setdenum (int y) {znam=y;}
int getnum ();
int getdenum ();

~Rat ();

int Rat :: getnum () {return this->num;} // для получения return не нужен {num;}
int Rat :: getdenum () {return denum;}
void Rat :: setnum () { }; // что писать надо в {} return num?
void Rat :: setdenum () {}
MopkoBHblu
10 / 10 / 0
Регистрация: 23.03.2011
Сообщений: 63
24.03.2011, 20:55     Классы дробей С++ #8
Цитата Сообщение от Mr.Whittier Посмотреть сообщение
void setnum (int x) {num=x;}
void setdenum (int y) {znam=y;}
int getnum ();
int getdenum ();

~Rat ();

int Rat :: getNum () {return this->num;} // для получения return не нужен {num;} ??? что??? xD
int Rat :: getDenom () {return this->denom;}
void Rat :: setNum (int Value) { this->num = Value; } // что писать надо в {} return(???)
здесь ничего не надо писать в return, функции вида void НАЗВАНИЕФУНКЦИИ () - ничего не возвращают...
void Rat :: setDenom (int Value) { this->denom = Value; }
починено...

читай учебник xD

Почему Rat?
Mr.Whittier
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 33
24.03.2011, 21:16  [ТС]     Классы дробей С++ #9
rational - рациональное число

что такое Value?

та книжку скачал только)
MopkoBHblu
10 / 10 / 0
Регистрация: 23.03.2011
Сообщений: 63
24.03.2011, 21:25     Классы дробей С++ #10
Цитата Сообщение от Mr.Whittier Посмотреть сообщение
rational - рациональное число

что такое Value?

та книжку скачал только)
Значение которое ты хочешь установить числителю или знаменателю.
Value - значение
Mr.Whittier
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 33
24.03.2011, 21:36  [ТС]     Классы дробей С++ #11
if(c.setNum() > d.setNum()) // что в скобочках писать надо?

что бы ни ввёл одни ошибки(
MopkoBHblu
10 / 10 / 0
Регистрация: 23.03.2011
Сообщений: 63
24.03.2011, 21:50     Классы дробей С++ #12
Цитата Сообщение от Mr.Whittier Посмотреть сообщение
if(c.setNum() > d.setNum()) // что в скобочках писать надо?

что бы ни ввёл одни ошибки(
Откуда ты взял этот пример? xD С каждым твоим вопросом, происхождение этого кода становится все туманнее и туманнее...

c.setNum() - функция установки значения числителя. c.getNum() - функция получения числителя.
c.getNum() = с.Num;
c.setNum(15) все равно что c.Num = 15.

ЧИТАЙ КНИЖКУУУ xD
Mr.Whittier
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 33
24.03.2011, 21:57  [ТС]     Классы дробей С++ #13
у нас классов почти не было, это следующая тема, нам для ознакомления дал преподаватель задание переделать свои структуры в классы, показала нам всего 1 пример, вот я на основе этого примера, путём переделки, подстановки набрал код без осмысления, что я набрал хD
спасибо, сейчас хоть начал понимать, что набрал, но ещё не до конца)
MopkoBHblu
10 / 10 / 0
Регистрация: 23.03.2011
Сообщений: 63
24.03.2011, 22:02     Классы дробей С++ #14
ок xD удачи
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2011, 15:09     Классы дробей С++
Еще ссылки по теме:

C++ Массивы. Классы. Нахождение среднего значения дробей
Упрощение дробей C++
C++ Вывод дробей

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
27.03.2011, 15:09     Классы дробей С++ #15
Цитата Сообщение от Mr.Whittier Посмотреть сообщение
дал преподаватель задание переделать свои структуры в классы
Какой умный преподаватель
структура и класс это почти одно и тоже
разница в доступе
в классе по умолчанию все элементы частные
а в структуре общие
т.е. вся переделка
поменять struct на class
и добавить public:
Yandex
Объявления
27.03.2011, 15:09     Классы дробей С++
Ответ Создать тему
Опции темы

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