鱼C论坛

 找回密码
 立即注册
查看: 3730|回复: 14

[已解决]while循环作业

[复制链接]
发表于 2022-5-8 16:57:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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:要如何修改使功能实现,问题出在哪里
最佳答案
2022-5-10 16:34:06
Weabu 发表于 2022-5-10 15:37
第一种:const  int max_int = (int)pow(2, sizeof(int) * 8) - 1;
             const  int min_int =  ...

只有之前那种,也就是这里第三种是对的。。。。你没发现第三种比其他多除2吗
强制转换无所谓,本来算出来也没小数部分,写一下显示声明提醒自己也可以。

所谓输出正确,那得看你的测试数据了。你前两种的区别也就是一个int一个long long int,这点之前说过了,你算的就是int的最大值最小值,int肯定放得下,换一个更大的类型存可以但没这必要
前两种计算方法本身就是错的,至于为什么之前也说了。而且这种算出来是超出正确数值范围的,会数据溢出反而得不到想要的范围值

假设正确的范围是0-10,你错误的算法算出来范围变成了3-8,而你测试数据的时候只用4,5,6,输出结果当然看不出差别了
WeChat6947f415e64a580e9892bf0c39e3540f.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-8 17:12:07 From FishC Mobile | 显示全部楼层
const int max_int = pow(2, sizeof(int) * 8 );
  这里的int太小了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-8 18:24:26 From FishC Mobile | 显示全部楼层
Weabu 发表于 2022-5-8 18:20
什么意思呢
是改成const long long int max_int=pow(2,sinzeof(int)*8)

知道咋回事就行了,没必要纠结太大的数字该怎么办
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-8 18:35:03 | 显示全部楼层
1.sizeof(int)*8,计算的是位数,又不是能存在里面的最大最小值。
2.不知道是不是你要找的问题,但是想问num是打算用来干嘛的?貌似并没有看到任何对num赋值的语句,既然从头到尾num都是0,那为什么要定义这个变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-8 18:45:45 | 显示全部楼层
Weabu 发表于 2022-5-8 18:41
if (ch >= '0' && ch  max_int || temp < min_int)
            {
                printf("数值超出 ...

你这是在给temp赋值,num没变啊。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;}
可是我这样还是一样的输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-8 18:59:55 | 显示全部楼层
Weabu 发表于 2022-5-8 18:48
不好意思
if (ch >= '0' && ch  max_int || temp < min_int)
            {

计算范围没改?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-8 19:37:23 | 显示全部楼层
本帖最后由 风车呼呼呼 于 2022-5-8 19:38 编辑
Weabu 发表于 2022-5-8 18:48
不好意思
if (ch >= '0' && ch  max_int || temp < min_int)
            {


把计算int的范围改好,num用long long int定义,超出范围那里把break改成exit(EXIT_SUCCESS),调用这个记得把stdlib.h头文件加进去,判断不是0~9字符时的else那里不是break,是直接无条件continue
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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太小了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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来得到?
你对比你那两组式子哪个才是对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-10 15:37:12 | 显示全部楼层
风车呼呼呼 发表于 2022-5-9 17:00
定义为int没问题,你想想你这要计算的就是int类型能存放的最大最小值,你要是计算正确怎么可能int放不下 ...

第一种:const  int max_int = (int)pow(2, sizeof(int) * 8) - 1;
             const  int min_int = (int)pow(2, sizeof(int) * 8 )* (-1);
第二种:const  long long  int max_int = (int)pow(2, sizeof(int) * 8) - 1;
             const long long int min_int = (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);
我改成这三种输出都是正确的,第一种是为什么呢,我看网上说pow默认double所以要转换精度,是这样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-10 16:34:06 | 显示全部楼层    本楼为最佳答案   
Weabu 发表于 2022-5-10 15:37
第一种:const  int max_int = (int)pow(2, sizeof(int) * 8) - 1;
             const  int min_int =  ...

只有之前那种,也就是这里第三种是对的。。。。你没发现第三种比其他多除2吗
强制转换无所谓,本来算出来也没小数部分,写一下显示声明提醒自己也可以。

所谓输出正确,那得看你的测试数据了。你前两种的区别也就是一个int一个long long int,这点之前说过了,你算的就是int的最大值最小值,int肯定放得下,换一个更大的类型存可以但没这必要
前两种计算方法本身就是错的,至于为什么之前也说了。而且这种算出来是超出正确数值范围的,会数据溢出反而得不到想要的范围值

假设正确的范围是0-10,你错误的算法算出来范围变成了3-8,而你测试数据的时候只用4,5,6,输出结果当然看不出差别了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的,已经弄懂了,非常感谢你的耐心解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 11:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表