Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс обрабатывающий правильные дроби, Как перевести не правильную дробь в ... 
:(
    Опции темы
Recev
  Дата 6.12.2010, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 18.10.2010

Репутация: нет
Всего: нет



Нужно создать класс который будет работать с правильными дробями. В классе нужно перегрузить такие операции: -+=>.

Набросал кое-что (пока перегружаю -, вопросы в комментариях ) :

Код

#include <iostream.h>
#include <conio.h>

class pdrob
{
private:
float chisl, 
    znam,  
    celoe; 
public:
pdrob():chisl(0), znam(0) {} 
pdrob (float ch, float zn): chisl(ch), znam(zn){} 

void get_drob() 
{
cout << "Input chisl: ";
cin >> chisel;
cout << "\nInput zanam: ";
cin >> znam;
 if (chisel > znam) 
  {
//К примеру пользователь вводит такую дробь: 15/8. Программа должна перевести ее в правильную дробь: 1 целая 7/8. Как это реализировать?
  }
}

void show_drob()
{
cout<<chisl<<"/"<<znam;
}
pdrob operator - (pdrob) const;
};

pdrob pdrob::operator - (pdrob dr2) const
{
float ch1, zn1, cl1;
cl1 = cil - dr2.cil;
if (znam !=dr2.znatm)
 {  //ищем общее знаменательное и выполняем вычисление дробей 
  // у меня не ищет наименьшее общее знаменательное, не знаю как реализировать, подскажите.
   zn1 = znam * dr2.znam;
   chisl = chisl * dr2.znam;
   dr2.chisl = dr2.chisl * znam;
   ch1 = chisl - dr2.chisl;
 }
return pdrob(ch1,zn1);
}

void main()
{
    pdrob drob1, drob3;
    drob1.get_drob();
    pdrob drob2(2,5);
    drob3 = drob1 - drob2;
    cout<<endl<<"drob1 = ";
    drob1.show_drob();
    cout<<endl<<"drob2 = ";
    drob2.show_drob();
    cout<<endl<<"drob3 = ";
    drob3.show_drob();
    getch();
}


Помогите кто чем может.


Это сообщение отредактировал(а) Recev - 6.12.2010, 18:52
PM MAIL   Вверх
Recev
  Дата 6.12.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 18.10.2010

Репутация: нет
Всего: нет



Ап!

Вод написал еще немного:

Код

#include <iostream.h>
#include <conio.h>

class pdrob
{
public:
int chisl, // числительное
    znam, //знаменательное 
    cil; // целая часть

pdrob():chisl(0), znam(0) {} 
pdrob (int ch, int zn, int cl): chisl(ch), znam(zn), cil(cl){} 

void get_drob() //ввод дроби
{
cil = 0;
cout << "Input chisl ";
cin >> chisl;
cout << "\nInput zanam ";
cin >> znam;

while (chisl >= znam) //если дроб не правильная, превратим ее в правильную
  {  
   cil ++;
   chisl = chisl - znam;
  }
}

void show_drob()
{
  if (cil != 0)
  {  cout<<cil<<" "<<chisl<<"/"<<znam; }
   else
   cout<<chisl<<"/"<<znam;
}

 pdrob operator - (pdrob);
 int operator > (pdrob);
};

 pdrob pdrob::operator - (pdrob dr2)  
{

int ch1, zn1, cl1;
cl1 = cil - dr2.cil;
if (znam != dr2.znam) //сводим к общему знаменательному методом перехресного умножения
  {
   zn1 = znam * dr2.znam;
   chisl = chisl * dr2.znam;
   dr2.chisl = dr2.chisl * znam;
   ch1 = chisl - dr2.chisl;
  }
cl1 = cil - dr2.cil;
return pdrob(ch1, zn1, cl1);
}

int pdrob::operator > (pdrob dr3)
{
int ch1, zn1, cl1;
if (cil != 0) { //если есть целая часть сравниваем по ней
if (cil > dr3.cil )
 {
  return 1;
 }
else { return 0; } } // если нету целой части сравниваем по числительным
else {
if (znam != dr3.znam) 
  {
   zn1 = znam * dr3.znam;
   chisl = chisl * dr3.znam;
   dr3.chisl = dr3.chisl * znam;
   ch1 = chisl - dr3.chisl;
  }
if (chisl > dr3.chisl )
 {
   return 1;
 }
 else
return 0; }
}

void main()

    pdrob drob1, drob3;
    drob1.get_drob();
    cout<<endl<<"drob1 = ";
    drob1.show_drob();
    pdrob drob2(2,5,0);
    cout<<endl<<"drob2 = ";
    drob2.show_drob();
    drob3 = drob1 - drob2;
    cout<<endl<<"drob3 = ";
    drob3.show_drob();
    if ((drob3 > drob2)==1)
     {
      cout<<endl<<"drob3 > drob2";
     }
     else{
      cout<<endl<<"drob3 < drob2";
         }
    getch();
}


Поправите что не правильно.  Помогите перезагрузить +=
PM MAIL   Вверх
sQu1rr
Дата 6.12.2010, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



А что непонятно, изложите лучше smile Лень в коде разбираца
Дробь можно хранить в 2х переменных - числитель знаменатель - они не должны иметь общего делителя кроме еденицы
Каждый раз производя операцию с дробью, сокращать ее.
Обработку строки можно и классу поручить

Не вижу смысл хранить целую часть - лучше ее при выводе делать правильной.

Добавлено через 5 минут и 54 секунды
Код

class a
{
    a & operator += ( const a & ref )
    {
        add( ref );
        return *this;
    }
}
// Или можно void operator += как угодно. А в чем проблема?

PM MAIL Skype GTalk   Вверх
Recev
  Дата 6.12.2010, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 18.10.2010

Репутация: нет
Всего: нет



Код

pdrob operator += (pdrob dr4){
 cil += dr4.cil;
 chisl += dr4.chisl;
 znam += dr4.znam;
 }


Когда пишу    pdrob drob4 += drob1;
То компилятор выдает ошибку.
Improper use of typedef 'pdrob'
  Full parser context
    pdrob.cpp(107): parsing: void main()

PM MAIL   Вверх
Crafty
Дата 6.12.2010, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Тебе уже написали как выглядит оператор+=
Код

pdrob& pdrob::operator+= (const pdrob &dr4){
 cil += dr4.cil;
 chisl += dr4.chisl;
 znam += dr4.znam;
  return *this;
 }


Да и всё-таки удобней было бы использовать только числитель и знаменател, как посоветовал sQu1rr.
PM MAIL   Вверх
Recev
Дата 6.12.2010, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 18.10.2010

Репутация: нет
Всего: нет



Цитата(Crafty @ 6.12.2010,  22:07)
Тебе уже написали как выглядит оператор+=
Код

pdrob& pdrob::operator+= (const pdrob &dr4){
 cil += dr4.cil;
 chisl += dr4.chisl;
 znam += dr4.znam;
  return *this;
 }


Да и всё-таки удобней было бы использовать только числитель и знаменател, как посоветовал sQu1rr.

 znam += dr4.znam;

Знаменательные не додаются. 
А как мне сделать что-бы в программе искало НОД и НОК? А то  у меня вычисление другим методом (общее знаменательное = знаменательное1 * знаменательное2, числительное1 = числительное1 * знаменательное2, числительное2 = числительное2 * знаменательное1).
PM MAIL   Вверх
Crafty
Дата 6.12.2010, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Вообще при сложении дробных чисел нужно привести дроби к общему знаменателю, и уже потом складывать только числители.
Находишь НОД - Алгоритм Евклида
А НОК можешь найти черед НОД
НОК = |a * b| / НОД

Это сообщение отредактировал(а) Crafty - 6.12.2010, 22:42
PM MAIL   Вверх
sQu1rr
Дата 7.12.2010, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(Recev @  6.12.2010,  22:27 Найти цитируемый пост)
А как мне сделать что-бы в программе искало НОД и НОК?

http://forum.vingrad.ru/forum/topic-316687...sual-c++/0.html
Тут я давал решение ближе к концу
PM MAIL Skype GTalk   Вверх
Recev
  Дата 7.12.2010, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 18.10.2010

Репутация: нет
Всего: нет



Сейчас программа почему то работает не правильно.
Попробуйте ввести к примеру 3 и 4. Сами увидите результат, почему она так не нормально работает?

Код

#include <iostream.h>
#include <conio.h>

class pdrob
{
public:
int chisl, 
    znam,  
    cil; 

pdrob():chisl(0), znam(0) {} 
pdrob (int ch, int zn, int cl): chisl(ch), znam(zn), cil(cl){} 

void get_drob() 
{
cil = 0;
cout << "Input chisl: ";
cin >> chisl;
cout << "\nInput znam: ";
cin >> znam;

while (chisl >= znam)
  {  
   cil ++;
   chisl = chisl - znam;
  }
}

void show_drob()
{
if (chisl >= znam) {
while (chisl >= znam)
  {  
   cil ++;
   chisl = chisl - znam;
  } }
  if (cil != 0)
  {  cout<<cil<<" "<<chisl<<"/"<<znam; }
   else
   cout<<chisl<<"/"<<znam;
}

 int operator > (pdrob);
 pdrob operator - (pdrob);
 pdrob operator +=(pdrob dr4)
{
 cil += dr4.cil;
 if (znam != dr4.znam) 
  {
   chisl *= dr4.znam;
   dr4.chisl *= znam;
   znam *= dr4.znam;
  }
 chisl += dr4.chisl;
 cout<<endl<<"After += : chisl = "<<chisl<<" dr4.chisl = "<<dr4.chisl<<endl;

 }
};

 pdrob pdrob::operator - (pdrob dr2) 
{

int ch1, zn1, cl1;

if (znam != dr2.znam) 
  {
   chisl = chisl * dr2.znam;
   dr2.chisl = dr2.chisl * znam;
   ch1 = chisl - dr2.chisl;
   zn1 = znam * dr2.znam;
  }

  cl1 = cil - dr2.cil;

return pdrob(ch1, zn1, cl1);
}

int pdrob::operator > (pdrob dr3)
{
int ch1, zn1, cl1;
if (cil != 0) { 
if ((cil > dr3.cil) && (chisl > 0)&&(dr3.chisl > 0))
 {
  return 1;
 }
if ((cil < dr3.cil) && (chisl > 0)&&(dr3.chisl > 0))
 {
  return 0;
 }
else { return 0; } }
else {
if (znam != dr3.znam) 
  {
   chisl = chisl * dr3.znam;
   dr3.chisl = dr3.chisl * znam;
   znam = znam * dr3.znam;
  }
if (chisl > dr3.chisl )
 {
   return 1;
 }
 else
return 0; }
}

void main()
{
    pdrob drob1, drob3, drob4;
    drob1.get_drob();
    cout<<endl<<"drob1 = ";
    drob1.show_drob();
    pdrob drob2(2,5,0);
    cout<<endl<<"drob2 = ";
    drob2.show_drob();
    drob3 = drob1 - drob2;
    cout<<endl<<"drob3 = ";
    drob3.show_drob();
    if ((drob3 > drob2) == 1)
     {
      cout<<endl<<"drob3 > drob2";
     }
    else{
      cout<<endl<<"drob3 < drob2";
        }
    cout<<endl<<"drob2 = ";
    drob2.show_drob();
    drob4 = drob2;
    cout<<endl<<"drob3 = ";
    drob3.show_drob();
    drob4 += drob3;
    cout<<endl<<"drob4 =";
    drob4.show_drob();
    getch();
}

PM MAIL   Вверх
Recev
  Дата 7.12.2010, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 18.10.2010

Репутация: нет
Всего: нет




А все, я понял. При сравнении тоже нужно сводить к общему знаменательному. smile 

PM MAIL   Вверх
sQu1rr
Дата 7.12.2010, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(Recev @  7.12.2010,  20:16 Найти цитируемый пост)
При сравнении тоже нужно сводить к общему знаменательному.

Угу, догадался  smile 

Цитата(Recev @  7.12.2010,  20:16 Найти цитируемый пост)
знаменательному

...
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0848 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.