Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2011, 20:12   #1
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию Калькулятор\классы\дроби

Не могу понять в чем ошибка в калькуляторе для дробей.
Код:
int main()
{
	fraction frac1, frac2, fracsumm;
	char ch='a';
	do
	{
		
		switch(fracsumm.calc(frac1, frac2)) 
		{
		case '+': fracsumm.fadd(frac1, frac2); break;
		case '-': fracsumm.fsub(frac1, frac2); break;
		case '*': fracsumm.fmul(frac1, frac2); break;
		case '/': fracsumm.fdiv(frac1, frac2); break;
		default: continue;
		}
		fracsumm.display();
		cout << "Continue?(y/n)"; cin >> ch;
	}while(ch!='n');
	return 0;
}
Код:
char calc(fraction frac1, fraction frac2)const
	{
		char dummychar;
		char sign;
		cout << "\nEnter: " ;   cin >> frac1.numerator >> dummychar >> frac1.denumerator >> sign
			>> frac2.numerator >> dummychar >> frac2.denumerator;
		return sign;
	}
Конструктор класса fraction(): numerator(0), denumerator(1) {}

Почему-то значения полей всех объектов после ввода в switch (вроде же то, что там не противоречит синтаксису?) остаются теми же, что были инициализированы конструктором.

Весь код http://pastebin.com/7tAzXvar
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 14.04.2011, 22:32   #2
blacktener
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 78
По умолчанию хм...

Лафоре? // ех....
blacktener вне форума Ответить с цитированием
Старый 14.04.2011, 22:55   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Да
Еще раз дебаггером просмотрел, теперь увидел, что frac1 и frac2 почему-то теряют свои значения после завершения функции (calc) O_o
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.04.2011, 02:03   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Да
Еще раз дебаггером просмотрел, теперь увидел, что frac1 и frac2 почему-то теряют свои значения после завершения функции (calc) O_o
Так ведь ясно дело, вы же в локальные переменные данные вводите. Естественно, по завершении функции, они разрушаются)
Чтобы было, как задумано - нужно передавать по ссылке
Код:
...calc(fraction& frac1, fraction& frac2)...
А вообще, ввод должен бы быть в отдельной функции, а никак не в calc.

...

И, честно говоря, довольно странная реализация класса fraction.

Последний раз редактировалось netrino; 15.04.2011 в 02:06.
netrino вне форума Ответить с цитированием
Старый 15.04.2011, 02:56   #5
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
denumerator
Хы-хы, denominator же.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 15.04.2011, 09:36   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ага, уже сам понял про локальные переменные, спс )

Цитата:
А вообще, ввод должен бы быть в отдельной функции, а никак не в calc.
Так это вроде и есть функция для ввода 2 дробей и действия между ними, название только мб немного некорретное. Или что вы имели в виду?

Цитата:
И, честно говоря, довольно странная реализация класса fraction.
А как лучше можно было?)

Цитата:
Хы-хы, denominator же.
Спсиабо, ибо как усатвонили бртиаскние уечные, члеовек чтиает тлоько преыве и псоелдние бквуы слов.)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.04.2011, 22:38   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Я к тому, что fraction по поведению должен напоминать примитивные типы, тем более, что функционал его очень с ними схож. У вас он используется как-то непонятно и совсем не логично. Функция ввода, если на то пошло, должна либо изменять существующий объект, либо быть статичной и принимать как аргумент некий объект и производить в него ввод.
Код:
class fraction {
...
    static void read(fraction& frac) {
        std::cin >> frac.numer >> frac.denom;
    }
 // или лучше
    static fraction read() {
        fraction frac;
        std::cin >> frac.numer >> frac.denom;
        return frac;
    }
// ну и самый логичный вариант:
     std::istream& operator>> (std::istream& in, fraction& frac) {
         return in >> frac.numer >> frac.denom;
     }
};
Кроме того, поведение должно полностью совпадать с ожидаемым (то есть с тем, как себя ведут примитивные числовые типы, такие как int и double).
То есть должно быть можно использовать его так:
Код:
   fraction frac_1(1, 2), frac_2(3, 4);
   fraction frac_3 = fraction::add(frac_1, frac_2); // исходные данные не должны меняться
// или
   fraction frac_3 = frac_1.add(frac_2); // исходные данные не меняются
// ну и на крайний случай
   frac_1.add(frac_2); // frac_1 меняется. это лучше, чем так как у вас, но тем не менее плохо.
// наиболее понятный и логичный способ:
   fraction frac_3 = frac_1 + frac_2; // исходные данные не меняются.
// для вывода тоже неплохо бы перегрузить оператор << и выводить ответ так:
   std::cout << frac_1 << frac_2 << frac_3 << std::endl;
Ну и так далее, в результате могло бы получится как-нибудь так:
Код:
#include <iostream>

class fraction {
public:
  fraction(int num = 0, int den = 1) {
    int g = gcd(num, den);
    numer = num / g;
    denom = den / g;
  }

  //
  // unary operators
  //

  fraction operator- () {
    return fraction(-numer, denom);
  }

  fraction operator+ () {
    return *this;
  }

  //
  // binary operators
  //

  fraction operator+ (const fraction& other) {
    return fraction(numer * other.denom + other.numer * denom, 
		    denom * other.denom);
  }

  fraction operator- (const fraction& other) {
    return fraction(numer * other.denom - other.numer * denom,
		    denom * other.denom);
  }

  fraction operator* (const fraction& other) {
    return fraction(numer * other.numer, denom * other.denom);
  }

  fraction operator/ (const fraction& other) {
    return fraction(numer * other.denom, denom * other.numer);
  }

  //
  // assign operators
  //

  fraction& operator+= (const fraction& other) {
    return *this = *this + other;
  }

  fraction& operator-= (const fraction& other) {
    return *this = *this - other;
  }

  fraction& operator*= (const fraction& other) {
    return *this = *this * other;
  }

  fraction& operator/= (const fraction& other) {
    return *this = *this / other;
  }

  //
  // I/O operators
  //

  friend std::ostream& operator<< (std::ostream& out, const fraction& f) {
    return out << f.numer << '/' << f.denom;
  }

  friend std::istream& operator>> (std::istream& in, fraction& f) {
    char delimiter;
    return in >> f.numer >> delimiter >> f.denom;
  }

private:
  int gcd(int x, int y) {
    return y == 0 ? x : gcd(y, x % y);
  }

private:
  int numer;
  int denom;
};


int main() {
  using namespace std;

  fraction frac1, frac2, result;
  char ch = 'a';
  
  do {

    cin >> frac1 >> frac2;
    cin.ignore();
    
    switch (cin.get()) {
    case '+': result = frac1 + frac2; break;
    case '-': result = frac1 - frac2; break;
    case '*': result = frac1 * frac2; break;
    case '/': result = frac1 / frac2; break;
    default : continue;
    }

    cout << result << endl;
    cout << "Continue?(y/n)";
    cin  >> ch;

  } while(ch != 'n');
}
netrino вне форума Ответить с цитированием
Старый 16.04.2011, 22:49   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ух, сколько новых слов. Видимо стоит вернуться к этому после повышения моего уровня знаний
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дроби. Делфи AnL Помощь студентам 8 21.09.2010 16:39
Десятичные дроби в С ранетка Общие вопросы C/C++ 4 21.01.2010 00:08
Класс дроби на C# Лубышев Помощь студентам 6 11.10.2008 10:00
Простые дроби 4aineg Паскаль, Turbo Pascal, PascalABC.NET 5 09.12.2006 15:01