找出运行错误的元凶

简介: 收到一位同学的求助信,解决的是http://blog.csdn.net/sxhelijian/article/details/8737365中的问题。她的程序如下:#include <iostream>using namespace std;class CFraction{private:int nume; // 分子int deno; // 分母public:

收到一位同学的求助信,解决的是http://blog.csdn.net/sxhelijian/article/details/8737365中的问题。她的程序如下:

#include <iostream>
using namespace std;
class CFraction
{private:
int nume; // 分子
int deno; // 分母
public:
	void input();	 //按照"nu/de"的格式,如"5/2"的形式输入
	void simplify();	 //化简(使分子分母没有公因子)
	void amplify(int n);	 //放大n倍,如2/3放大5倍为10/3
	void output(int style);	 //输出:以8/6为例,style为0时,原样输出8/6;
	//style为1时,输出化简后形式4/3;
	//style为2时,输出1(1/3)形式,表示一又三分之一;
	//style为3时,用小数形式输出,如1.3333;
	//不给出参数和非1、2,认为是方式0
};
//主函数
int main()
{
	CFraction c;
	c.input();
	c.simplify();
	c.amplify(3);
	c.output(1);
	c.output(2);
	c.output(3);
	c.output(0);
	return 0;
}
//按照"nu/de"的格式,如"5/2"的形式输入
void CFraction::input()
{
	char c;
	cout<<"请输入分数的值:"<<endl;
	while(1)
	{
		cin>>nume>>c>>deno;
		if(c!='/')
			cout<<"格式不正确,请重新输入!"<<endl;
		else
			break;
	}
}
//化简(使分子分母没有公因子)
void CFraction::simplify()
{
	int num1,num2,temp;
	int x,y;
	num1=nume;
	num2=deno;
	if(num1<num2) //找出较大的值
	{
		temp=num1;
		num1=num2;
		num2=temp;
	}
	x=nume;
	y=deno;
	while(y>0)
	{
		temp=x%y;
		x=y;
		y=temp;
	};
	num1=num1/x;
	num2=num2/y;
	cout<<num1<<'/'<<num2<<endl;
}
//放大n倍,如2/3放大5倍为10/3
void CFraction::amplify(int n)
{
	int num1,num2;
	num1=nume*n;
	num2=deno*n;
	cout<<num1<<'/'<<num2<<endl;
}
//输出:以8/6为例,style为0时,原样输出8/6;为1时,输出化简后形式4/3;为2时,输出1(1/3)形式,表示一又三分之一;为3时,用小数形式输出,如1.3333;
//不给出参数和非1、2,认为是方式0
void CFraction::output(int style)
{
	if(style==1)
	{
		int num1,num2,temp;
		int x,y;
		num1=nume;
		num2=deno;
		if(num1<num2) //找出较大的值
		{
			temp=num1;
			num1=num2;
			num2=temp;
		}
		x=nume;
		y=deno;
		while(y>0)
		{
			temp=x%y;
			x=y;
			y=temp;
		};
		num1=num1/x;
		num2=num2/y;
		cout<<num1<<'/'<<num2<<endl;
	}
	else
	{
		if(style==2)
		{
			int a,b,c=0;
			a=nume;
			b=deno;
			while(a>=b)
			{
				a=a-b;
				c++;
			}
			if(a==0)
				cout<<c<<endl;
			else
				cout<<c<<'('<<a<<'/'<<b<<')'<<endl;
		}
		if(style==3)
		{
			double c;
			c=nume/deno;
			cout<<c<<endl;
		}
		else
			cout<<nume<<'/'<<deno<<endl;
	}
}

她的问题是:编译,链接都没错,但不能运行???

尝试运行,输入后,运行出错。初步判断,调用CFraction::input()没有出问题,CFraction::simplify()的嫌疑很大。

输入分子、分母,单步跟踪进CFraction::simplify(),几步之后,真相出现了。见图:


阶数为0。

这个程序在算法设计上有问题,请自行再去考虑。需要提醒的是,单步调试,可以学会。


目录
相关文章
|
JSON NoSQL Redis
逆转时间,起死回生——程序报错崩溃后,如何倒回到崩溃的位置?
逆转时间,起死回生——程序报错崩溃后,如何倒回到崩溃的位置?
101 0
|
存储 Java
一个极易被忽略的内存泄漏情况,看看你会不会犯一样的错
Java之所以能够成为世界上最受欢迎的语言,与其垃圾回收机制分不开。我们Javaer能够在创建完对象后就不用管她的生死,确实是十分方便(真特么是个渣男)。可是有时候因为你创建了她,又对她爱答不理,就很有可能出大问题。
|
Java 数据安全/隐私保护 测试技术
我修复的印象最深的一个bug,一个导致CPU和内存异常到无法响应的BUG
系统上线一段时间后,客户反映接口响应特别慢,甚至没有响应,第一时间依次检查了网络、服务器资源使用情况,发现服务器CPU和内存占用率都非常的高,经过一阵紧张的排查,最终发现问题出现的根源,这就是我修复的印象最深的一个bug就是由于String的用法不当所造成的。
482 0
我修复的印象最深的一个bug,一个导致CPU和内存异常到无法响应的BUG
|
数据可视化
7个新手数据讲述者犯下的致命错误,你都知道吗?
  本文约1800字,建议阅读5分钟。   本文介绍了新手数据讲师所犯的最常见的错误,以及如何改正它们。   在制作数据故事时,很容易迷失在细节中,并且无法创造出可以激发别人动手操作的数据故事。下面是新手数据讲师所犯的最常见的错误,以及如何改正它们。这些技巧来自“像数据讲述者一样思考”研究会。   1. 数据故事不适合听众   不是所有的听众都是相同的,不是所有的听众都有一样的目标。即使您自己审视自己团队内部,也可以考虑一个技术支持专家和一个运营主管如何具有不同的观点。尽管两者都有共同的目标即服务客户,但每个人对于这个目标能够实现的方法和原因具有不同的观点。   许多展示数据故事的讲
136 0
|
存储 SQL Web App开发
你们的系统真的安全吗?你们系统是不是也有这种诡异的情况呢?
这个文章来源灵感是公司的项目在安全检查的时候,发现了很多 SQL 注入的一些问题还有一些 XSS 攻击问题,SQL 注入我们都是比较了解的,那么什么是 XSS 攻击呢?测试反馈给我的时候我是一脸懵逼呀,现在我们就来说一下什么是 XSS 攻击,以及我们怎么防止它的出现。
|
Python
PYTHON莫名其妙的崩溃
PYTHON莫名其妙的崩溃
132 0
|
Python 索引
初学Python常见异常错误,总有一处你会遇到!
初学Python常见错误 忘记写冒号 误用= 错误 缩紧 变量没有定义 中英文输入法导致的错误 不同数据类型的拼接 索引位置问题 使用字典中不存在的键 忘了括号 漏传参数 缺失依赖库 使用了python中对关键词 编码问题 1.
1590 0