一个C++问题,为什么会无限循环输出???

hyz2007 2009-01-31 10:54:54
#include<stdlib.h>
#include<iostream>

using std::cin;
using std::cout;
using std::endl;
using std::istream;
using std::ostream;

class Fraction {
private :
int num,den;

public:
Fraction() { num = 0; den = 1 ; }
Fraction(int n,int d) {set(n,d); }

Fraction(Fraction const &src) { set(src.num,src.den);}
// cout << "NOW executing copy constrctor;" << endl;

void set (int n,int d) {
num = n;
den = d;

normalize();

}

int get_num() const { return num; }
int get_den() const {return den; }

Fraction add(const Fraction &other);
Fraction mul(const Fraction &other);
Fraction sub(const Fraction &other);
Fraction div(const Fraction &other);

Fraction operator+ (const Fraction &other) { return add(other);}

Fraction operator- (const Fraction &other) { return sub(other);}

Fraction operator* (const Fraction &other) { return mul(other);}

Fraction operator/ (const Fraction &other) { return div(other);}
private :
void normalize ();
int gcf (int a,int b);
int lcm (int a,int b);
};

//-------------------------------------
void Fraction::normalize() {
// 0
if (den == 0 || num == 0) {
num = 0;
den = 1;
}

if (den < 0) {
num *= -1;
den *= -1;
}

int n = gcf (num,den);
num /= n;
den /= n;
}

int Fraction::gcf(int a,int b) {
if (a%b == 0)
return abs(b);
else
return (gcf(b,a%b));
}
int Fraction::lcm (int a, int b) {
return abs(a/gcf(a,b)*b);
}

Fraction Fraction::add(const Fraction &other) {
int lcd = lcm(den,other.den);
Fraction fract_mid ;
fract_mid.set(num*lcd/den + other.num*lcd/other.den, lcd);
return fract_mid;
}

Fraction Fraction::mul(const Fraction &other) {
Fraction fract_mid;
fract_mid.set(num*other.num,den*other.den);
return fract_mid;
}

Fraction Fraction::sub(const Fraction &other) {
int lcd = lcm(den,other.den);
Fraction fract_mid ;
fract_mid.set(num*lcd/den-other.num*lcd/other.den,lcd);
return fract_mid;
}

Fraction Fraction::div(const Fraction &other) {
Fraction fract_mid;
fract_mid.set(num*other.den,den*other.num);
return fract_mid;
}



int main() {

int a=0,b=1;
Fraction ft1;
while (b != 0) {
cout << "enter num :";
cin >>a;
cout <<endl;
cout <<"enter den:";
cin >>b;
cout <<endl;
Fraction ft2(a,b);
ft1 = ft1 +ft2 ;


}
cout << "sum is :";
cout << ft1.get_num() << "/" << ft1.get_den() << endl ;
return 0;
}


如果分母输入1111111111111或者J。。。什么的反正就是越界的不符合int类型的
控制台就会不停输出
num:
den:
num:
den:
num:
den:
num:
den:
num:
den:
num:
den:
num:
den:
.
.
.


本来不想问这个问题,但是我想作为一个初学者,多问问总是有好处的。
请大家指点!!
另外,如果哪里可以大幅提高效率最好也指点一下!
谢谢!
...全文
653 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyisnail 2009-02-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tangshuiling 的回复:]
C/C++ code把你的main函数改了一下:intmain() {inta=0,b=1;
Fraction ft1;while(b!=0) {
cout<<"enter num :";
lab: cin>>a;if(cin.rdstate()==ios_base::failbit)
{
cout<<"输入类型失败,清除输入缓冲区,请重新输入!"<<endl;
cin.sync();
cin.clear();gotolab;//用goto只是演示你的问题}
cout<<endl;
cout<<"enter den:";

[/Quote]

up
德阳凯子哥 2009-02-01
  • 打赏
  • 举报
回复
向你们学习
deerwin1986 2009-02-01
  • 打赏
  • 举报
回复
用FLUSH()清下缓冲区
就好了
整数太大 或者 类型不对的问题...
mabo321 2009-01-31
  • 打赏
  • 举报
回复
输入 J 没问题吧
J 的ASCII 值 是 74
符合要求啊……
tangshuiling 2009-01-31
  • 打赏
  • 举报
回复

把你的main函数改了一下:
int main() {

int a=0,b=1;
Fraction ft1;
while (b != 0) {
cout << "enter num :";
lab: cin >>a;
if(cin.rdstate()==ios_base::failbit)
{
cout<<"输入类型失败,清除输入缓冲区,请重新输入!"<<endl;
cin.sync();
cin.clear();
goto lab; //用goto只是演示你的问题

}
cout <<endl;
cout <<"enter den:";
cin >>b;
cout <<endl;
Fraction ft2(a,b);
ft1 = ft1 +ft2 ;


}
cout << "sum is :";
cout << ft1.get_num() << "/" << ft1.get_den() << endl ;
return 0;
}

由于输入的类型不正确,造成failbit置位,后面的cin>>b直接读取缓冲区未清空的错误类型造成死循环!
waizqfor 2009-01-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 hyz2007 的帖子:]
#include <stdlib.h>
#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::istream;
using std::ostream;

class Fraction {
private :
int num,den;

public:
Fraction() { num = 0; den = 1 ; }
Fraction(int n,int d) {set(n,d); }

Fraction(Fraction const &src) { set(src.num,src.den);}
// cout < < "NOW executing copy constrctor;" < < endl;

v…
[/Quote]
正向你说的 不符合int类型的 int的范围是在-32768~32767
你设置的数那么大 已经超出了范围

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧