Перейти к содержимому

Фотография
- - - - -

работа с классами (перегрузка операторов) нужна помощь

c++ си cpp новичку

В теме одно сообщение

#1 Vuzy

Vuzy

    Новичок

  • Пользователи
  • Pip
  • 3 сообщений

Отправлено 06 Октябрь 2014 - 06:37

Доброго времени суток ув. Гуру программирования на С++!!!!

 

Хочу реализовать, в учебных целях, класс для роботы с дробями.

 

В данном классе необходимо описать функции и методы для математических действий с дробями сложение вычитание деление умножение. А так же реализовать функцию для упрощения дроби на манер 2/4 == 1/2.

 

Наработал такой вот материал. (Представил ниже). На разных этапах когда писался код. Он отлаживался и работал хорошо в некоторых местах даже очень. Но при реализации функции упрощения работать перестал. Компилится без ошибок но при выполнении кода все результаты какого либо действия становятся -858993460/-858993460. проверял функцию отдельно результа упрощения дробей работает безукоризненно. в чем ошибка не могу понять.

 

в файле main.cpp:

#include <iostream>
#include <fstream>
#include <conio.h>
#include "time.h"
using namespace std;


void main()
{
setlocale(LC_ALL, "Russian");

drob a(2,4); //создание класса дроби и присвоение значения.
drob b(2,6);
drob c=a+b;

cout << "результат сложения дроби " << a << ", с дробью " << b << " ровняется" << c << endl;
cout << "результат вычитания из дроби " << a << ", дроби " << b << " ровняется" << a-b << endl;
cout << "результат умножения дроби " << a << ", на дробь " << b << " ровняется" << a*b << endl;
cout << "результат деления дроби " << a << ", на дробь " << b << " ровняется" << a/b << endl;
cout << "результат деления дроби " << b << ", на дробь " << b << " ровняется" << b/a << endl;



cout << "\n\n\n\t\t*** Нажмите любую клавишу что бы закончить ***";
_getch();
}

файл time.h (это файл в котором описывается класс дроби и работа с ними есть еще time.cpp но там методы не описаны)

#pragma once
#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
#include <math.h>
typedef unsigned int ui;
unsigned nod(unsigned m, unsigned n); //прототип функции НОД

class drob
{
private:
	int chis;
	int	znam;
	void prost()
	{
		int a,b;
		a=chis;
		b=znam;
		if (nod(chis, znam)>1)
		{
			int t=nod(chis, znam);
			znam=b/t;
			chis=a/t;
		}
	}
	public:
	drob(void)
	{
	chis=1;
	znam=1;
	}
	drob(int a, int b)
	{
		if(a!=0)
			chis=a;
		else
			chis=1;
		if(b!=0)
			znam=b;
		else
			znam=1;
		prost();
	}
	drob(drob& a)
	{
		a.prost();
	}


	drob operator+(drob& a)
	{
		drob result;
		if (znam==a.znam)
		{
			result.znam=znam;
			result.chis=chis+a.chis;
		}
		else
		{
			result.znam=znam*a.znam;
			result.chis=(chis*a.znam)+(a.chis*znam);
		}
		//result.prost();
		return result;
	}
	drob operator-(drob& a)
	{
		drob result;
		if (znam==a.znam)
		{
			result.znam=znam;
			result.chis=chis-a.chis;

		}
		else
		{
			result.znam=znam*a.znam;
			result.chis=(chis*a.znam)-(a.chis*znam);
		}
		//result.prost();
		return result;
	}
	drob operator*(drob& a)
	{
		drob result;
		result.chis=chis*a.chis;
		result.znam=znam*a.znam;
		//result.prost();
		return result;
	}
	drob operator*(int a)
	{
		drob result;
		result.chis=chis*a;
		result.znam=znam;
		//result.prost();
		return result;
	}
	drob operator/(drob& a)
	{
		drob result;
		drob result1;
		drob result2;
		result1=drob(a.znam, a.chis);
		result2=drob(chis, znam);
		result=result1*result2;
		//result.prost();
		return result;
			
	}
	
	friend std::ostream& operator<<(std::ostream& os, drob& a)
	{
		os << a.chis << "/" << a.znam;
		return os;
	}

	~drob()
	{
	}

};



#2 Evgeniy

Evgeniy

    Новичок

  • Пользователи
  • Pip
  • 9 сообщений

Отправлено 11 Октябрь 2014 - 14:19

-858993460/-858993460 Это называется мусор (не проинициализированная переменная). Подозреваю, что это как то связано с функцией nod(). Нигде её реализации в этом листинге я не нашел. 

Упростите себе задачу - поставьте точку останова и выполните отладку, там и увидите откуда берется мусор. 







Темы с аналогичным тегами c++, си, cpp, новичку