鱼C论坛

 找回密码
 立即注册
查看: 1111|回复: 3

[已解决]while语句真的...

[复制链接]
发表于 2019-9-26 18:20:00 | 显示全部楼层 |阅读模式
5鱼币
#include<stdio.h>
int main()
{
        int ch;
        int num =0;
        printf("请输入待转换的字符串:");
        do
        {
                ch=getchar();
                if(ch>='0'&&ch<='9')//  '0'    字符?ASCII码?
                {
                        num=10*num+(ch-'0');//-'0'?那'9'呢?
                }
                else
                {
                        if(num)
                        {
                                break;//如果已有数字,则退出循环 ?

                        }
                }
        }
        while(ch!='\n');//不等于回车继续do 循环       等于回车跳出循环执行下一条代码
        printf("结果是:%d\n",num);
        return 0;
}









#include <stdio.h>
#include <math.h>

int main()
{
        int ch;
        long long num = 0;
        long long temp; // 临时变量,用于测试是否超出范围
        int is_overflow = 0;

        const int max_int = pow(2, sizeof(int) * 8) / 2 - 1;
        const int min_int = pow(2, sizeof(int) * 8) / 2 * (-1);

        printf("请输入待转换的字符串:");

        do
        {
                ch = getchar();

                if (ch >= '0' && ch <= '9')
                {
                        temp = 10 * num + (ch - '0');
                        if (temp > max_int || temp < min_int)
                        {
                                is_overflow = 1;
                                break;
                        }
                        else
                        {
                                num = temp;
                        }
                }
                else
                {
                        if (num)
                        {
                                break; // 如果已有数字,则退出循环
                        }
                }

        }
        while (ch != '\n');

        if (is_overflow)
        {
                printf("数值超出范围,结果未定义!\n");
        }
        else
        {
                if (!num)
                {
                        printf("并未找到任何数值!\n");
                }
                else
                {
                        printf("结果是:%d\n", num);
                }
        }

        return 0;
}


循环看的懂  定义也看的懂  等都放一起就有些懵了   希望能逐条解释下  劳烦了...
最佳答案
2019-9-26 18:20:01
本帖最后由 画载舟中 于 2019-9-26 19:06 编辑

#include <stdio.h>
#include <math.h>

int main()
{
        int ch;
        long long num = 0;
        long long temp; // 临时变量,用于测试是否超出范围
        int is_overflow = 0;

        const int max_int = pow(2, sizeof(int) * 8) / 2 - 1;                                                     //获取 int 最大范围 取值范围 pow(2,32) /2 -1    正数
        const int min_int = pow(2, sizeof(int) * 8) / 2 * (-1);                                                //获取 int 最大范围 取值范围 pow(2,32) /2 * -1  负数       signed int 的取值范围    -2147483648 ~ 2147483647

        printf("请输入待转换的字符串:");

        do
        {
                ch = getchar();

                if (ch >= '0' && ch <= '9')
                {
                        temp = 10 * num + (ch - '0');                                                                        //10*num+(ch -'0')   相当于保留个位数 比如我输入 32f    第一次循环 3  到第二个数 2 就要把第一循环的 3*10  变成 30+2   不*10 就变成 3+2 =5  不符合输入的 32f
                        if (temp > max_int || temp < min_int)                                                                //这里判断是不是超过这个  signed int 的取值范围    -2147483648 ~ 2147483647
                        {
                                is_overflow = 1;                                                                                        真 //结果 返回1
                                break;                                                                                                    // 结束 do..while(ch != '\n')循环
                        }
                        else                                                                                                               
                        {
                                num = temp;                                                                                        // 把临时变量  temp的值 赋予 num
                        }
                }
                else                                                               
                {
                        if (num)                                                                                                 //如果 num 已经赋值
                        {
                                break; // 如果已有数字,则退出循环                                                //结束 do..while(ch != '\n'); 循环
                        }
                }

        }
        while (ch != '\n');

        if (is_overflow)                                                                                                        //判断上边结果  是真:   输入的 值 超过 signed int 的取值范围    -2147483648 ~ 2147483647
        {
                printf("数值超出范围,结果未定义!\n");
        }
        else
        {
                if (!num)                                                                                                //判断循环体 do..while(ch != '\n');    有没有使用   num    开头已经赋值  num=0;     !num  是0  就说明一次都没使用过;
                {
                        printf("并未找到任何数值!\n");
                }
                else
                {
                        printf("结果是:%d\n", num);                                                        //输出上面已经赋值的 num
                }
        }

        return 0;
}

最佳答案

查看完整内容

#include #include int main() { int ch; long long num = 0; long long temp; // 临时变量,用于测试是否超出范围 int is_overflow = 0; const int max_int = pow(2, sizeof(int) * 8) / 2 - 1; //获取 int 最大范围 取值范围 pow(2,32) /2 -1 正数 const int min_int = pow(2, sizeof(int) * 8) / 2 * (-1); //获取 int 最大范围 取值范围 po ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-26 18:20:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 画载舟中 于 2019-9-26 19:06 编辑

#include <stdio.h>
#include <math.h>

int main()
{
        int ch;
        long long num = 0;
        long long temp; // 临时变量,用于测试是否超出范围
        int is_overflow = 0;

        const int max_int = pow(2, sizeof(int) * 8) / 2 - 1;                                                     //获取 int 最大范围 取值范围 pow(2,32) /2 -1    正数
        const int min_int = pow(2, sizeof(int) * 8) / 2 * (-1);                                                //获取 int 最大范围 取值范围 pow(2,32) /2 * -1  负数       signed int 的取值范围    -2147483648 ~ 2147483647

        printf("请输入待转换的字符串:");

        do
        {
                ch = getchar();

                if (ch >= '0' && ch <= '9')
                {
                        temp = 10 * num + (ch - '0');                                                                        //10*num+(ch -'0')   相当于保留个位数 比如我输入 32f    第一次循环 3  到第二个数 2 就要把第一循环的 3*10  变成 30+2   不*10 就变成 3+2 =5  不符合输入的 32f
                        if (temp > max_int || temp < min_int)                                                                //这里判断是不是超过这个  signed int 的取值范围    -2147483648 ~ 2147483647
                        {
                                is_overflow = 1;                                                                                        真 //结果 返回1
                                break;                                                                                                    // 结束 do..while(ch != '\n')循环
                        }
                        else                                                                                                               
                        {
                                num = temp;                                                                                        // 把临时变量  temp的值 赋予 num
                        }
                }
                else                                                               
                {
                        if (num)                                                                                                 //如果 num 已经赋值
                        {
                                break; // 如果已有数字,则退出循环                                                //结束 do..while(ch != '\n'); 循环
                        }
                }

        }
        while (ch != '\n');

        if (is_overflow)                                                                                                        //判断上边结果  是真:   输入的 值 超过 signed int 的取值范围    -2147483648 ~ 2147483647
        {
                printf("数值超出范围,结果未定义!\n");
        }
        else
        {
                if (!num)                                                                                                //判断循环体 do..while(ch != '\n');    有没有使用   num    开头已经赋值  num=0;     !num  是0  就说明一次都没使用过;
                {
                        printf("并未找到任何数值!\n");
                }
                else
                {
                        printf("结果是:%d\n", num);                                                        //输出上面已经赋值的 num
                }
        }

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-26 21:23:53 | 显示全部楼层

厉害了我的哥
你是怎么学的?
这难道就是学霸跟学渣的区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-26 22:43:45 | 显示全部楼层
yixinwenxin 发表于 2019-9-26 21:23
厉害了我的哥
你是怎么学的?
这难道就是学霸跟学渣的区别

表示只能   理解   要我写 是写不出来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-4 11:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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