多少华人在日本:C++语言问题:程序错误还是漏洞?

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/01 04:47:20
着是一个简单的运算程序
定义 为一个学生计算总成绩
输入 期中成绩和期末成绩
公式 总成绩=30%*期中成绩+70%*期末成绩
输出 总成绩
计算要求 所有成绩为总数

请调试下面这段程序(如果我打出来的程序有个别字符错误请更改)
你会发现其运算出来的结果是错误的。
例如期末和期中都是100分 而结果是99 显然 这个结果是错误的。换其他数据都一样,会在真正的总成绩后-1
但当你改了运算参数70%和30%后(其中不能带3和7,如 c=(int)(.5*a+.5*b);而其结果运算后是正确的 其他的数我都试过,都正确

问:这是程序错误还是C++语言的漏洞?

请详细解答 我初学C语言,谢谢

程序如下
#include "stdio.h"
void main()
{ int a,b,c;
printf("please enter score of midsemester:");
scanf("%d",&a);
while(a>100||a<0)
{ printf("Error data!");
scanf("%d",&a);
}
printf("please enter score of final:");
scanf("%d",&b);
while(b>100||b<0)
{ printf("Error data!");
scanf("%d",&b);
}
c=(int)(.3*a+.7*b);
printf("score in conclusion is:%d",c);
}
版权所有```````````````````````盗版必纠

(.3*a+.7*b)因为有个舍入问题, 所以改为
(int)(.3*a+.7*b+0.5)就正确了,

我调试在DOS下TC及VC++都通过, 你的问题就是小数进位问题, 如(int)99.99999=99
而(int)99.41111=99, 最后都是一样的.
所以, 在加上 0.5后, 99.99999就成了100.49999
99.411111+0.5 = 99.911111, 在用int后不会进上去, 因为 int没有进位功能.它只取整数部分.

int强制类型转换会丢掉小数部份, 这样就出现你那种情况.

c=(int)(.3*a+.7*b); 换成c=(3*a+7*b)/10;就可以了。
我用了两种编译器编译你原来的程序,其中一种是99,其中一种是100;看来是机器识别有误差,所以换成我给改的程序,先让整型数据与整型数据相乘,不要让他们产生误差,重要的是不要多次产生误差。
另外,c其实定义成float类型,应该比int类型要好,不然你们的成绩全是整数,肯定有误差~~~

这不是系统漏洞的问题,也不是程序的问题,是3和7作除数时很难整除,也就涉及到保留小数的问题了啊,而5作除数就不存在这个问题的!几个保留小数的和很难达到直接求得的结果的精确度啊!
建议:你先将结果保留到一定位数,然后再对其求和!我只会vb,里面也涉及有这样的问题,c就不知道其表达式如何书写,给你思路你自己写!

(.3*a+.7*b)因为有个舍入问题, 所以改为
(int)(.3*a+.7*b+0.5)就正确了,

我调试在DOS下TC及VC++都通过, 你的问题褪切∈??晃侍? 如(int)99.99999=99
而(int)99.41111=99, 最后都是一样的.
所以, 在加上 0.5后, 99.99999就成了100.49999
99.411111+0.5 = 99.911111, 在用int后不会进上去, 因为 int没有进位功能.它只取整数部分.

int强制类型转换会丢掉小数部份, 这样就出现你那种情况.

c=(int)(.3*a+.7*b); //错误

在TC中,整数和浮点数相乘有可能出错。可以改为
c=(int)(.3*(float)a+.7*(float)b);//但是效率不高

可以把
int a,b,c;//改为float a,b,c;
printf("score in conclusion is:%d",c); //改为printf("score in conclusion is:%.2f",c);取两位小数

计算要求 所有成绩为总数
1.是"整"数(如何处理小数,四舍五入,全舍?)
2.还是"总"数

1.1四舍五入:见楼上
1.2全舍: c=(3*a+7*b)/10*10/10
或 定义float d; long c;再d=.3*a+.7*b;
c=d;
2 直接定义c为:float c;