Weabu 发表于 2022-5-8 16:57:04

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:要如何修改使功能实现,问题出在哪里

wp231957 发表于 2022-5-8 17:12:07

const int max_int = pow(2, sizeof(int) * 8 );
这里的int太小了

Weabu 发表于 2022-5-8 18:20:59

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)

wp231957 发表于 2022-5-8 18:24:26

Weabu 发表于 2022-5-8 18:20
什么意思呢
是改成const long long int max_int=pow(2,sinzeof(int)*8)

知道咋回事就行了,没必要纠结太大的数字该怎么办

风车呼呼呼 发表于 2022-5-8 18:35:03

1.sizeof(int)*8,计算的是位数,又不是能存在里面的最大最小值。
2.不知道是不是你要找的问题,但是想问num是打算用来干嘛的?貌似并没有看到任何对num赋值的语句,既然从头到尾num都是0,那为什么要定义这个变量。

Weabu 发表于 2022-5-8 18:41:36

风车呼呼呼 发表于 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的

风车呼呼呼 发表于 2022-5-8 18:45:45

Weabu 发表于 2022-5-8 18:41
if (ch >= '0' && chmax_int || temp < min_int)
            {
                printf("数值超出 ...

你这是在给temp赋值,num没变啊。。

Weabu 发表于 2022-5-8 18:48:58

风车呼呼呼 发表于 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;}
可是我这样还是一样的输出

风车呼呼呼 发表于 2022-5-8 18:59:55

Weabu 发表于 2022-5-8 18:48
不好意思
if (ch >= '0' && chmax_int || temp < min_int)
            {


计算范围没改?

风车呼呼呼 发表于 2022-5-8 19:37:23

本帖最后由 风车呼呼呼 于 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

Weabu 发表于 2022-5-9 08:44:12

风车呼呼呼 发表于 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太小了吗

风车呼呼呼 发表于 2022-5-9 17:00:44

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来得到?
你对比你那两组式子哪个才是对的

Weabu 发表于 2022-5-10 15:37:12

风车呼呼呼 发表于 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所以要转换精度,是这样吗?

风车呼呼呼 发表于 2022-5-10 16:34:06

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,输出结果当然看不出差别了

Weabu 发表于 2022-5-10 16:41:13

风车呼呼呼 发表于 2022-5-10 16:34
只有之前那种,也就是这里第三种是对的。。。。你没发现第三种比其他多除2吗
强制转换无所谓,本来算出 ...

好的,已经弄懂了,非常感谢你的耐心解答
页: [1]
查看完整版本: while循环作业