while循环作业
#include <stdio.h>#include <math.h>
int main()
{
int ch, is_overflow = 0, num = 0;
long long int temp;
const int max_int = pow(2, sizeof(int) * 8 );
const int min_int = pow(2, sizeof(int) * 8 );
printf("请输入待转换的字符:");
do
{
ch = getchar();
if (ch >= '0' && ch <= '9')
{
temp = num * 10 + (ch - '0');
if (temp > max_int || temp < min_int)
{
printf("数值超出范围,结果未定义!\n");
break;
}
else
{
temp = num;
}
}
else
{
if (num)
break;
}
} while (ch != '\n');
if (!num)
{
printf("并未找到任何数值!\n");
}
else
{
printf("结果是%d\n", num);
}
return 0;
}
当输入只为数字或含有数字时,:输出为:
数值超出范围,结果未定义!
并未找到任何数值!
问1:答案计算int的范围公式为const int max_int = pow(2, sizeof(int) * 8) / 2 - 1;
const int min_int = pow(2, sizeof(int) * 8) / 2 * (-1);
为什么不直接是sizeof(int)*8
问2:要如何修改使功能实现,问题出在哪里 const int max_int = pow(2, sizeof(int) * 8 );
这里的int太小了 wp231957 发表于 2022-5-8 17:12
const int max_int = pow(2, sizeof(int) * 8 );
这里的int太小了
什么意思呢
是改成const long long int max_int=pow(2,sinzeof(int)*8) Weabu 发表于 2022-5-8 18:20
什么意思呢
是改成const long long int max_int=pow(2,sinzeof(int)*8)
知道咋回事就行了,没必要纠结太大的数字该怎么办 1.sizeof(int)*8,计算的是位数,又不是能存在里面的最大最小值。
2.不知道是不是你要找的问题,但是想问num是打算用来干嘛的?貌似并没有看到任何对num赋值的语句,既然从头到尾num都是0,那为什么要定义这个变量。 风车呼呼呼 发表于 2022-5-8 18:35
1.sizeof(int)*8,计算的是位数,又不是能存在里面的最大最小值。
2.不知道是不是你要找的问题,但是想问n ...
if (ch >= '0' && ch <= '9')
{
temp = num * 10 + (ch - '0');
if (temp > max_int || temp < min_int)
{
printf("数值超出范围,结果未定义!\n");
break;
}
else
{
temp = num;
这是赋值num的 Weabu 发表于 2022-5-8 18:41
if (ch >= '0' && chmax_int || temp < min_int)
{
printf("数值超出 ...
你这是在给temp赋值,num没变啊。。 风车呼呼呼 发表于 2022-5-8 18:45
你这是在给temp赋值,num没变啊。。
不好意思
if (ch >= '0' && ch <= '9')
{
temp = num * 10 + (ch - '0');
if (temp > max_int || temp < min_int)
{
printf("数值超出范围,结果未定义!\n");
break;
}
else
{
num=temp;}
可是我这样还是一样的输出 Weabu 发表于 2022-5-8 18:48
不好意思
if (ch >= '0' && chmax_int || temp < min_int)
{
计算范围没改? 本帖最后由 风车呼呼呼 于 2022-5-8 19:38 编辑
Weabu 发表于 2022-5-8 18:48
不好意思
if (ch >= '0' && chmax_int || temp < min_int)
{
把计算int的范围改好,num用long long int定义,超出范围那里把break改成exit(EXIT_SUCCESS),调用这个记得把stdlib.h头文件加进去,判断不是0~9字符时的else那里不是break,是直接无条件continue 风车呼呼呼 发表于 2022-5-8 19:37
把计算int的范围改好,num用long long int定义,超出范围那里把break改成exit(EXIT_SUCCESS),调用这个 ...
为什么我const int max_int = pow(2, sizeof(int) * 8) - 1;
const int min_int = pow(2, sizeof(int) * 8 )* (-1);这样是错的
改成这样就是对的呢const int max_int = pow(2, sizeof(int) * 8) /2- 1;
const int min_int = pow(2, sizeof(int) * 8 )/2* (-1);
是因为前面的max_int定义int太小了吗 Weabu 发表于 2022-5-9 08:44
为什么我const int max_int = pow(2, sizeof(int) * 8) - 1;
const int min_int = pow(2,...
定义为int没问题,你想想你这要计算的就是int类型能存放的最大最小值,你要是计算正确怎么可能int放不下,那不成悖论了
拿1字节举例,有8位,最大值是不是全1
1111 1111 你既可以每一位的1乘以位权相加来计算这个值
是不是也可以用1 0000 0000 这个值-1来得到?
你对比你那两组式子哪个才是对的 风车呼呼呼 发表于 2022-5-9 17:00
定义为int没问题,你想想你这要计算的就是int类型能存放的最大最小值,你要是计算正确怎么可能int放不下 ...
第一种:constint max_int = (int)pow(2, sizeof(int) * 8) - 1;
constint min_int = (int)pow(2, sizeof(int) * 8 )* (-1);
第二种:constlong longint max_int = (int)pow(2, sizeof(int) * 8) - 1;
const long long int min_int = (int)pow(2, sizeof(int) * 8 )* (-1);
第三种:constint max_int = pow(2, sizeof(int) * 8)/2 - 1;
constint min_int = pow(2, sizeof(int) * 8 )/2* (-1);
我改成这三种输出都是正确的,第一种是为什么呢,我看网上说pow默认double所以要转换精度,是这样吗? Weabu 发表于 2022-5-10 15:37
第一种:constint max_int = (int)pow(2, sizeof(int) * 8) - 1;
constint min_int =...
只有之前那种,也就是这里第三种是对的。。。。你没发现第三种比其他多除2吗
强制转换无所谓,本来算出来也没小数部分,写一下显示声明提醒自己也可以。
所谓输出正确,那得看你的测试数据了。你前两种的区别也就是一个int一个long long int,这点之前说过了,你算的就是int的最大值最小值,int肯定放得下,换一个更大的类型存可以但没这必要
前两种计算方法本身就是错的,至于为什么之前也说了。而且这种算出来是超出正确数值范围的,会数据溢出反而得不到想要的范围值
假设正确的范围是0-10,你错误的算法算出来范围变成了3-8,而你测试数据的时候只用4,5,6,输出结果当然看不出差别了 风车呼呼呼 发表于 2022-5-10 16:34
只有之前那种,也就是这里第三种是对的。。。。你没发现第三种比其他多除2吗
强制转换无所谓,本来算出 ...
好的,已经弄懂了,非常感谢你的耐心解答
页:
[1]