鱼C论坛

 找回密码
 立即注册
查看: 2774|回复: 3

刚写的C++代码,只有减法运算错了,求解答

[复制链接]
发表于 2012-4-14 11:58:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//
/*定义一个Rational类,提供能进行分数运算的函数。
        Rational类用3个int型变量表示一个分数:sign
        表示分数的符号;n表示分子;d表示分母。构造
        函数应以约分形式存放分数,便如2/4在对象中将
        存为分子为1、分母为2*/
       
       
#include "stdafx.h"
#include<iostream>
#include"cmath"

using namespace std;



class Rational{
private:
        int sign;   //符号,0表示正数,1表示负数
        int n,d;    //n-分子;d-分母

public:
        Rational(){};   //构造函数
        Rational(Rational & r)//拷贝构造函数
        {
                sign=r.sign ;
                n=r.n ;
                d=r.d ;
        }
        Rational(int s,int n,int d){//发现是做减法时构造函数错了,单是不会改
                if(d==0)
                        d=1;
                int min;
                min=(n<d?n:d);//小值
                while((n%min!=0)||(d%min!=0))//最大公约数
                        min--;
               
                sign=s;

                this->n=n/min;
                this->d=d/min;
               

        }  //构造函数,当分母为0时打印错误消息并把分母置成1。

        Rational add(Rational r)  //两个分数相加
        {
                int newD;
                int newN;
                int newS;
                if(d==r.d)
                {
                        newD=d;

                        if(sign==r.sign)
                        {
                                newS=sign;
                                newN=n+r.n;
                        }
                        else if(sign==0&&r.sign==1)
                        {
                                newS=n>r.n?0:1;
                                newN=fabs(n-r.n);
                        }
                        else if(sign==1&&r.sign==0)
                        {
                                newS=n>r.n?1:0;
                                newN=fabs(n-r.n);
                        }
                }

                else if(d!=r.d)
                {

                   int a=(d>r.d?d:r.d);
                   int b=(d<r.d?d:r.d);
                        for(int remainder=a%b;remainder!=0;)
                        {
                                a=b;
                                b=remainder;
                                remainder=a%b;
                        }
                        newD=d*r.d/b;
                        if(sign==0&&r.sign==0)
                        {
                                int g=((-1)*n*r.d/b-r.n*d/b);
                                newS=g>=0?1:0;
                                newN=fabs((-1)*n*r.d/b+r.n*d/b);
                        }
                        else if(sign==1&&r.sign==1)
                        {
                                int g=(n*r.d/b+r.n*d/b);
                                newS=g>=0?1:0;
                                newN=fabs(n*r.d/b+r.n*d/b);
                        }
                        else if(sign==0&&r.sign==1)
                        {
                                int g=((-1)*n*r.d/b+r.n*d/b);
                                newS=g>=0?1:0;
                                newN=fabs((-1)*n*r.d/b+r.n*d/b);
                        }
                        else if(sign==1&&r.sign==0)
                        {
                                int g=(n*r.d/b-r.n*d/b);
                                newS=g>=0?1:0;
                                newN=fabs(n*r.d/b-r.n*d/b);
                        }
                }
                Rational R(newS,newN,newD);
                return R;
        }
        Rational sub(Rational r)  //当前分数减去参数分数
        {
                int newD;
                int newN;
                int newS;
                if(d==r.d)
                {
                        newD=d;

                        if( (sign==1)&&(r.sign==1) )
                        {
                                newS=(n>r.n?1:0);
                                newN=fabs(n-r.n);
                        }
                        else if(sign==0&&r.sign==0)
                        {
                                newS=n>r.n?0:1;
                                newN=fabs(n-r.n);
                        }
                        else if(sign==0&&r.sign==1)
                        {
                                newS=0;
                                newN=n+r.n;
                        }
                        else if(sign==1&&r.sign==0)
                        {
                                newS=1;
                                newN=n+r.n;
                        }
                }

                else if(d!=r.d)
                {

                   int a=(d>r.d?d:r.d);
                   int b=(d<r.d?d:r.d);
                        for(int remainder=a%b;remainder!=0;)
                        {
                                a=b;
                                b=remainder;
                                remainder=a%b;
                        }
                        newD=d*r.d/b;
                        if(sign==0&&r.sign==0)
                        {
                                int g=((-1)*n*r.d/b+r.n*d/b);
                                newS=g>=0?1:0;
                                newN=fabs((-1)*n*r.d/b+r.n*d/b);
                        }
                        else if(sign==1&&r.sign==1)
                        {
                                int g=(n*r.d/b-r.n*d/b);
                                newS=g>=0?1:0;
                                newN=fabs(n*r.d/b-r.n*d/b);
                        }
                        else if(sign==0&&r.sign==1)
                        {
                                int g=((-1)*n*r.d/b-r.n*d/b);
                                newS=g>=0?1:0;
                                newN=fabs(-1*n*r.d/b-r.n*d/b);
                        }
                        else if(sign==1&&r.sign==0)
                        {
                                newS=1;
                                newN=n*r.d/b+r.n*d/b;
                        }
                }


                Rational R(newS,newN,newD);
                return R;

        }
        Rational multiply(Rational r) //两个分数相乘
        {
                int newD;
                int newN;
                int newS;

                newD=d*r.d;
                newN=n*r.n;
                if(sign==r.sign)
                        newS=1;
                else
                        newS=0;
                Rational R(newS,newN,newD);
                return R;
        }
        Rational divide(Rational r)  //当前分数除以参数分数
        {
                int newD;
                int newN;
                int newS;

                newD=d*r.n;
                newN=n*r.d;
                if(sign==r.sign)
                        newS=1;
                else
                        newS=0;
                Rational R(newS,newN,newD);
                return R;
        }
        void print()         //以a/b或-a/b的形式打印出分数
        {
                if(sign==0)
                        cout<<"-"<<n<<"/"<<d<<endl;
                else if(sign==1)
                        cout<<n<<"/"<<d<<endl;
       
        }
};





int main(int argc, char* argv[])
{
        printf("Hello World!\n");

        cout<<"after add:"<<a.EggyPeggy(str) <<endl<<a.Method ( n)<<endl;
        Rational i(1,5,15),j(1,1,3),k;

        k=i.add(j) ;
        k.print() ;

        //减法未实现
        /*        k=i.multiply(j);
            k.print();
        */

        k=i.multiply(j);
        k.print();

        k=i.divide(j);
        k.print();

        return 0;
}



/*只有减法错了,而且是构造函数问题,本人不会调试*/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-14 14:12:47 | 显示全部楼层
虽然我看不懂代码,但我会调试。
F9    下断点(先将光标移至要下断点的那一行)
F5    开始调试(要先下断点)
F10  单步执行(不展开内嵌函数体)
F11  遇函数体展开,并进入单步执行。
调试选项卡还具有查看内存,寄存器,数值(变量或常量),反汇编代码的功能
最好学会调试,否则以后的路会很艰难。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-15 15:43:00 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-16 18:27:57 | 显示全部楼层
靠 太长了吧:o
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 18:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表