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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Класс с перегруженными операциями, Создать класс(дробные числа) 
:(
    Опции темы
DarkinRal
Дата 27.11.2013, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


This_IS_300



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 27.11.2013
Где: Ukraine/Kremenchu k

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



Здраствуйте
Вот такое вот задание:
Создать класс Frac(дробные числа) с перегруженными операциями + - * / , а также с возможностью приведения типа Frac->double. Должны быть реализованы также ToString(), Equals(), ==, !=. 

Помогите пожалуйста smile 
PM MAIL WWW Skype   Вверх
baldina
Дата 27.11.2013, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Отличное задание! Правда "дробные числа Frac" принято называть рациональными (rational) числами, или дробями, но это мелочь.
Задание несложное, минут на 15. Ну, на пару часов не слишком опытному. Самому слабо? Хотя бы с нашей помощью.

Добавлено через 1 минуту и 9 секунд
Есть предложение, подкупающее новизной: переместиться в раздел "для новичков" и там совместными усилиями разработать. Хоть польза будет
PM MAIL   Вверх
DarkinRal
Дата 27.11.2013, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


This_IS_300



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 27.11.2013
Где: Ukraine/Kremenchu k

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



Цитата(baldina @ 27.11.2013,  16:32)
Отличное задание! Правда "дробные числа Frac" принято называть рациональными (rational) числами, или дробями, но это мелочь.
Задание несложное, минут на 15. Ну, на пару часов не слишком опытному. Самому слабо? Хотя бы с нашей помощью.

Добавлено @ 16:33
Есть предложение, подкупающее новизной: переместиться в раздел "для новичков" и там совместными усилиями разработать. Хоть польза будет

Если честно я только за,просто я C++ только начал изучать и в нём я ещё просто ничего почти не умею

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Ну вот и будет повод потренироваться. Это ведь не последнее задание? Зачем тогда вообще в универ ходить...

 smile 
колкость про Frac снимаю)))
PM MAIL   Вверх
DarkinRal
Дата 27.11.2013, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


This_IS_300



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 27.11.2013
Где: Ukraine/Kremenchu k

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



Цитата(baldina @ 27.11.2013,  16:38)
Ну вот и будет повод потренироваться. Это ведь не последнее задание? Зачем тогда вообще в универ ходить...

 smile 
колкость про Frac снимаю)))

мне щас надо типо поросить модеров что б они переместили тему?
или эту закрыть ,а там заново написать?
PM MAIL WWW Skype   Вверх
baldina
Дата 27.11.2013, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



можно и тут продолжить. надо будет, перенесут.
а можно подождать пока кто-нить придет и денег попросит. или бесплатно кинет код (которого кстати в интернете навалом)

Добавлено @ 17:31
предлагаю для начала условия задачи записать на языке программирования, а дальше - уточнять и реализовывать.
класс в C++ в общем виде выглядит так:
Код

class A {
  public:
    type function (args...);
};

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

по условию нам нужно написать класс Frac
Код

class Frac {
};

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

class Frac {
 public:
   Frac& operator+=(const Frac&);
   ...
};
Frac operator+(const Frac& lhs, const Frac& rhs) {
  Frac temp(lhs);
  temp += rhs; // используем Frac::operator+=()
  return temp;
}

Так же нам понадобятся функции приведения типа и преобразования в строку
Код

class Frac {
 public:
   Frac& operator+=(const Frac&);
   ...
   std::string ToString() const; // функция константна, т.к. не меняет состояние самого объекта
   operator double() const;
};

продолжайте. когда напишем интерфейс, займемся реализацией

Добавлено через 13 минут и 30 секунд
!= можно (и правильно) реализовать через ==
Код

bool Frac::operator!=(const Frac& other) const {
  return !(*this == other); // this - указатель на объект, к которому применяется функция-член класса
}


Добавлено через 14 минут и 56 секунд
впрочем я тороплюсь с реализацией. сначала опишите весь интерфейс класса, т.е. все нужные методы (функции-члены) класса

Это сообщение отредактировал(а) baldina - 27.11.2013, 17:34
PM MAIL   Вверх
DarkinRal
Дата 27.11.2013, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


This_IS_300



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 27.11.2013
Где: Ukraine/Kremenchu k

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



Код

#include<iostream>

class Frac {
 public:
   Frac& operator+=(const Frac&);
   Frac& operator-=(const Frac&);
   Frac& operator*=(const Frac&);
   Frac& operator/=(const Frac&);
   bool Frac::operator!=(const Frac& other) const {
  return !(*this == other); // this - указатель на объект, к которому применяется функция-член класса
}
   std::string ToString() const; // функция константна, т.к. не меняет состояние самого объекта
   operator double() const;
};
Frac operator+(const Frac& lhs, const Frac& rhs) {
  Frac temp(lhs);
  temp += rhs; // используем Frac::operator+=()
  return temp;
}
Frac operator-(const Frac& lhs, const Frac& rhs) {
    Frac temp(lhs);
    temp -= rhs;
    return temp;
}
Frac operator*(const Frac& lhs, const Frac& rhs) {
    Frac temp(lhs);
    temp *= rhs;
    return temp;
}
Frac operator/(const Frac& lhs, const Frac& rhs) {
    Frac temp(lhs);
    temp /= rhs;
    return temp;
}



Так правильно?
PM MAIL WWW Skype   Вверх
Poseidon
Дата 27.11.2013, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(baldina @  27.11.2013,  16:32 Найти цитируемый пост)
Есть предложение, подкупающее новизной: переместиться в раздел "для новичков" и там совместными усилиями разработать. Хоть польза будет
Для домашних заданий, контрольных и курсовых существует "Центр помощи". Тема создана в правильном месте. Если ее перенести в раздел "Для новичков", то модераторы С++ все-равно вернут ее сюда. Так что если хотите помочь, то помогайте здесь.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
baldina
Дата 27.11.2013, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



DarkinRal, суперически. половину сделали. 
можно заняться реализацией. 
для этого нужно определить, какие данные будут в классе. думаю, это несложно: чем определяется рациональное число (дробь)?
эти данные будут приватными (вне секции public) членами класса (переменными). их мы будем использовать при реализации функций.

Добавлено через 5 минут и 3 секунды
функции будем реализовывать по обычным правилам арифметики дробей.
преобразование в double - тоже несложно, нужно выполнить нецелочисленное деление и вернуть результат.
чуть сложнее будет с преобразованием в строку, плюс понадобится специальная функция - конструктор для инициализации экземпляров нашего класса.
конец уже виден))

Добавлено через 14 минут и 51 секунду
в качестве бонуса приведу код функции нахождения наибольшего общего делителя (алгоритм Евклида) - она понадобится для нормализации числа:
Код

// Euclidean algorithm of calculating the greatest common divisor 
int gcd (int m, int n) {
  if (n == 0)
      return m;
  else
     return gcd (n, m%n);
}

PM MAIL   Вверх
baldina
Дата 27.11.2013, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



DarkinRal, в интерфейсе класса не хватает метода для ==
кстати, при наличии == что должна делать функция Equals() ?
еще, думаю, будет правильным ввести в интерфейс оператор < для сравнения чисел
PM MAIL   Вверх
DarkinRal
Дата 28.11.2013, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


This_IS_300



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 27.11.2013
Где: Ukraine/Kremenchu k

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



Вот,получил дополнение к заданию.

Вычислить значение полинома в точке. Все коэффициенты и x должны иметь тип Frac.

Это сообщение отредактировал(а) DarkinRal - 28.11.2013, 11:39
PM MAIL WWW Skype   Вверх
baldina
Дата 28.11.2013, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Как класс закончим, и дополнение сделаем. Было б корыто)))

Как насчет моего вопроса
Цитата(baldina @  27.11.2013,  18:35 Найти цитируемый пост)
для этого нужно определить, какие данные будут в классе. думаю, это несложно: чем определяется рациональное число (дробь)?

и дополнений в интерфейсе?

Добавлено @ 11:53
Насчет полиномов - можете на досуге подумать, как лучше вычислить значение. Алгоритм вычисления не зависит от типа а и х. Вам о схеме Горнера говорили?

Добавлено через 2 минуты и 5 секунд
и еще был вопрос
Цитата(baldina @  27.11.2013,  18:54 Найти цитируемый пост)
что должна делать функция Equals() ?



Это сообщение отредактировал(а) baldina - 28.11.2013, 11:53
PM MAIL   Вверх
DarkinRal
Дата 28.11.2013, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


This_IS_300



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 27.11.2013
Где: Ukraine/Kremenchu k

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



Цитата(baldina @  28.11.2013,  11:52 Найти цитируемый пост)
Вам о схеме Горнера говорили?

Добавлено через 2 минуты и 5 секунд
и еще был вопрос
Цитата(baldina @  27.11.2013,  18:54 Найти цитируемый пост)
что должна делать функция Equals() ?


О схеме Горнера ничего не говорили,а на счёт функции Equals() я попытаюсь щас уточнить.
PM MAIL WWW Skype   Вверх
baldina
Дата 28.11.2013, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



уточняйте. 
и показывайте поправленный класс и ваши соображения.

Добавлено @ 12:18
А пока - на секунду отвлечемся от класса. Подумаем, как он будет использоваться (собственно, с этого обычно начинают - для разработки интерфейса, но интерфейс нам был и так дан в составе задания).
Сейчас есть повод - дополнение к заданию.

Допустим, что нам дан полином с коэф. типа Frac, и надо вычислить его значение в точке x.
Как задан полином? Очевидно, своими коэффициентами. Их удобно хранить в массиве: индекс элемента массива - номер коэффициента.

Для вычисления значения в точке понадобится функция, принимающая адрес массива, его размер и значение x:
Код

Frac polynomial (Frac coef[], size_t n, const Frac& x) {
 Frac value;
 ...
 return value;
}

её будем использовать, например, так:
Код

int main () {
  // Допустим, у нас введены переменные
  // Frac a0, a1, a2 - значения коэф. полинома (трехчлена) a2*x^2+a1*x+a0
  // Frac x - значение, в котором вычисляется полином

  const size_t n=3;

  Frac poly[n] = {a0,a1,a2};

  Frac result = polynomial (poly, n, x);

  std::cout << "Значение полинома ";

  // печатаем полином
  for (size_t i=n-1; i < n; --i) {
    if (poly[i] != 0) {
      std::cout << poly[i].ToString();
      if (i > 0) {
        std::cout << "*x";
        if (i > 1)
          std::cout << "^" << i;
        std::cout << "+";
      }
    }
  }

  std::cout << " в точке " << x.ToString() << " = " << result.ToString();
}


Это сообщение отредактировал(а) baldina - 28.11.2013, 12:33
PM MAIL   Вверх
DarkinRal
Дата 28.11.2013, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


This_IS_300



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 27.11.2013
Где: Ukraine/Kremenchu k

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



Вот по поводу Equals
Это значит что наш клас должен реализовать интерфейс IEquatable
И пере определить метод equals, который будет основан на ==
Этот метод должен принимать как наш тип для сравнения так и object
http://msdn.microsoft.com/ru-ru/library/ms...#code-snippet-1
http://msdn.microsoft.com/en-us/library/vs...(v=vs.100).aspx
PM MAIL WWW Skype   Вверх
baldina
Дата 28.11.2013, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



управляемый код? ну да ладно... 
про устройство рациональных чисел вы что-то молчите...

PM MAIL   Вверх
DarkinRal
Дата 1.12.2013, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


This_IS_300



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 27.11.2013
Где: Ukraine/Kremenchu k

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



Цитата(baldina @  28.11.2013,  11:52 Найти цитируемый пост)
для этого нужно определить, какие данные будут в классе. думаю, это несложно: чем определяется рациональное число (дробь)?

числителем и знаменателем.
По поводу дополнения к интерфейсу - думаю можно добавить.
Отредактированый код выставлю завтра-после завтра.

PM MAIL WWW Skype   Вверх
baldina
Дата 1.12.2013, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



очень хорошо. давайте их обозначим p и q соответственно.
значит в реализации класса должны присутствовать два члена, в которых будут храниться значения p и q. надо определиться, какого они типа, и добавить их в класс - в приватную секцию (выше "public").

ими мы и будем манипулировать, реализуя методы класса.
PM MAIL   Вверх
DarkinRal
Дата 19.12.2013, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


This_IS_300



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 27.11.2013
Где: Ukraine/Kremenchu k

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



Код

#include<iostream>
class Frac {
private:
    int p,q;
 public:
   Frac& operator+=(const Frac&);
   Frac& operator-=(const Frac&);
   Frac& operator*=(const Frac&);
   Frac& operator/=(const Frac&);
   bool Frac::operator!=(const Frac& other) const {
       return !(*this == other);} // this - указатель на объект, к которому применяется функция-член класса
  bool operator==(const Frac& other) const {
      if (&other == this) return true;
      }
  
}
   std::string ToString() const; // функция константна, т.к. не меняет состояние самого объекта
   operator double() const;


Frac operator+(const Frac& lhs, const Frac& rhs) {
  Frac temp(lhs);
  temp += rhs; // используем Frac::operator+=()
  return temp;
}
Frac operator-(const Frac& lhs, const Frac& rhs) {
    Frac temp(lhs);
    temp -= rhs;
    return temp;
}
Frac operator*(const Frac& lhs, const Frac& rhs) {
    Frac temp(lhs);
    temp *= rhs;
    return temp;
}
Frac operator/(const Frac& lhs, const Frac& rhs) {
    Frac temp(lhs);
    temp /= rhs;
    return temp;
}


VS показует ошибки в функции константы.ToString() просит поставить ;
operator - функция преобразования должна быть нестатической функциией-членом



PM MAIL WWW Skype   Вверх
baldina
Дата 20.12.2013, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



функции-члены класса должны быть объявлены в теле класса. посчитайте скобочки.
определение класса должно заканчиваться точкой с запятой.

Данные класса p и q определены, прекрасно. Как будут устанавливаться их начальные значения? Для этого служат специальные функции-члены - конструкторы. Это функции одноименные с классом, вызываются в момент объявления переменной.

Код

class Foo {
  int data;
  public:
    Foo (int d) : data(d) {} // конструктор
};
...
Foo foo (5); // создается переменная foo, при этом вызывается конструктор Foo::Foo(5)

нам понадобится конструктор вида Frac (int p=0, int q=1)
параметры по умолчанию полезны тем, что мы сможем объявлять переменные не только как
Код

Frac f(1,2); // 1/2
но и так:
Код

Frac f1; // 0
Frac f2 = 5; // 5/1



теперь определение операций. давайте с легкого начнем. сумма двух рациональных чисел p1/q1+p2/q2= (p1*q2+p2*q1)/(q1*q2). значит функцию operator+= можно определить так:
Код

Frac& Frac::operator+= (const Frac& rhs) {
  p = p*rhs.q + rhs.p*q;
  q *= rhs.q;
  return *this;
}

Минус можно реализовать через плюс
Код

Frac& Frac::operator-= (const Frac& rhs) {
  return *this += Frac(-rhs.p, rhs.q);
}

остальные делаете аналогично. 

Как справитесь, поговорим о нормализации числа

PM MAIL   Вверх
DarkinRal
Дата 7.1.2014, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


This_IS_300



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 27.11.2013
Где: Ukraine/Kremenchu k

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



Код

#include<iostream>
class Frac {
private:
    int p,q;
public:
    Frac(int p=0,int q=1)
    {
     
    }

    Frac& Frac::operator+= (const Frac& rhs) {
   p = p*rhs.q + rhs.p*q;
   q *= rhs.q;
   return *this;
    }
    Frac& Frac::operator-= (const Frac& rhs) {
   return *this += Frac(-rhs.p, rhs.q);
    }
    Frac& Frac::operator/= (const Frac& rhs){
    p = p*rhs.q / rhs.p*q;
    q *= rhs.q;
    return *this;
    }
    Frac& Frac::operator*= (const Frac& rhs){
    p = p*rhs.q * rhs.p*q;
    q *= rhs.q;
    return *this;
    }

   Frac& operator+=(const Frac&);
   Frac& operator-=(const Frac&);
   Frac& operator*=(const Frac&);
   Frac& operator/=(const Frac&);
   bool Frac::operator!=(const Frac& other) const {
       return !(*this == other);} // this - указатель на объект, к которому применяется функция-член класса
   bool operator==(const Frac& other) const {
      if (&other == this) return true;
      }
  

   std::string ToString() const; // функция константна, т.к. не меняет состояние самого объекта
   operator double() const;

};

Frac operator+(const Frac& lhs, const Frac& rhs) {
  Frac temp(lhs);
  temp += rhs; // используем Frac::operator+=()
  return temp;
}
Frac operator-(const Frac& lhs, const Frac& rhs) {
    Frac temp(lhs);
    temp -= rhs;
    return temp;
}
Frac operator*(const Frac& lhs, const Frac& rhs) {
    Frac temp(lhs);
    temp *= rhs;
    return temp;
}
Frac operator/(const Frac& lhs, const Frac& rhs) {
    Frac temp(lhs);
    temp /= rhs;
    return temp;
}


Только не понял,что там в конструкторе надо объявить.
и надо ли там операции == и != ?

PM MAIL WWW Skype   Вверх
baldina
Дата 7.1.2014, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



DarkinRal, объявляя функцию в классе не надо писать Frac::
Этот префикс нужен только для определений вне класса, для указания к какому классу относится функция.
Вы бы хоть попробовали откомпилировать код.

Добавлено @ 14:37
Цитата(DarkinRal @  7.1.2014,  14:29 Найти цитируемый пост)
надо ли там операции == и !=

где там? все уже написано вроде как правильно.

в конструкторе надо проинициализировать значения членов класса p и q соответствующими аргументами конструктора. ну или хотя бы присвоить. арументам лучше дать другие имена, что бы не путать с членами класса. часто членам класса добавляют префиксы или суффиксы, что бы легче отличать. например, p_ и q_

Добавлено @ 14:39
т.е.

Код

class Frac {
 private:
   int p_, q_;
 public:
   Frac (int p, int q) : p_(p), q_(q) {}
   //или
   // Frac (int p, int q) { p_ = p; q_=q; }
   // но первая форма лучше
};


Это сообщение отредактировал(а) baldina - 7.1.2014, 14:40
PM MAIL   Вверх
baldina
Дата 7.1.2014, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



для реализации операций понадобится функция нормализация числа: сокращение числителя и знаменателя на наибольший общий делитель, что бы числа, например, вида 4/8 приводить к 1/2 
для этого надо уметь находить НОД. существует алгоритм Евклида, который можно записать рекуррентным соотношением gcd (m, n) = gcd (n, m mod n) c с ограничением gcd (m, 0) = m
gcd - greatest common divisor
mod - операция получения остатка от деления, в C/C++ это операция %

в общем виде алгоритм можно реализовать простой рекурсивной функцией
Код

template <typename T>
T gcd (const T& m, const T& n) {
   if (n == 0)
      return m;
   else 
      return gcd (n, m % n);
}


Добавлено через 4 минуты и 10 секунд
в итоге должно получиться что-то вроде http://ideone.com/OHZ2ph
изучайте

Это сообщение отредактировал(а) baldina - 7.1.2014, 14:55
PM MAIL   Вверх
DarkinRal
Дата 26.2.2014, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


This_IS_300



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 27.11.2013
Где: Ukraine/Kremenchu k

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



Здраствуйте,спасибо за пример.Но когда запустил его через visual studio 2012 то выдало несколько ошибок:
Код

1>------ Построение начато: проект: ConsoleApplication1, Конфигурация: Debug Win32 ------
1>  Исходный код.cpp
1>d:\c-+\consoleapplication1\consoleapplication1\исходный код.cpp(57): error C2071: Frac::operator double: недопустимый класс хранения
1>d:\c-+\consoleapplication1\consoleapplication1\исходный код.cpp(100): error C2666: Frac::operator !=: для 2 перегрузок есть подобные преобразования
1>          d:\c-+\consoleapplication1\consoleapplication1\исходный код.cpp(48): может быть "bool Frac::operator !=(const Frac &) const"
1>          или       "встроенный оператор C++!=(double, int)"
1>          при попытке сопоставить список аргументов "(Frac, int)"
1>d:\c-+\consoleapplication1\consoleapplication1\исходный код.cpp(101): error C2666: Frac::operator !=: для 2 перегрузок есть подобные преобразования
1>          d:\c-+\consoleapplication1\consoleapplication1\исходный код.cpp(48): может быть "bool Frac::operator !=(const Frac &) const"
1>          или       "встроенный оператор C++!=(double, int)"
1>          при попытке сопоставить список аргументов "(Frac, int)"

PM MAIL WWW Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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