Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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