A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大龄产妇 中级黑马   /  2014-5-17 21:43  /  3417 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. //5、 输入两个数,打印(printf)这两个数的和、差、积、商、以及余数。(C语言编程题)
  2. #include <stdio.h>
  3. int main()
  4. {
  5.     double num1,num2;
  6.     //num1 = num2 = 0;
  7.     num1 = 0;
  8.     num2 = 0;
  9.     //提示用户输入两个数
  10.     printf("请输入两个数\n");
  11.    
  12.     //接收输入的两个数
  13.     scanf("%lf %lf",&num1,&num2);
  14.     //被除数不能为零,所以有下面的判断。
  15.     if (0 == num2)//这里若改成 if(num2)  当输入字母的时候就不会出现if括号中的内容、
  16.     {
  17.         printf("您的输入不正确\n");
  18.         return 0;
  19.     }
  20.     printf("%.2lf + %.2lf = %.2lf\n",num1,num2,num1+num2);
  21.     printf("%.2lf - %.2lf = %.2lf\n",num1,num2,num1-num2);
  22.     printf("%.2lf * %.2lf = %.2lf\n",num1,num2,num1*num2);


  23.     printf("%.2lf / %.2lf = %lf\n",num1,num2,num1/num2);
  24.    
  25.     //当%运算的时候,要求两边都是整型数据。
  26.     int yuShu =(int)num1%(int)num2;
  27.     printf("%.0lf %% %.0lf = %d\n",num1,num2,yuShu);
  28.     return 0;
  29. }
复制代码

//问题:我这个题解决的时歪打正着了,当用户输入非数字时输出的也是if括号中的语句。
/本想加条判断,防止用户输入字母,但发觉这样就可以了。
//但这句语句的目的是,被除数不能为零。为什么解决了输入字母的问题,谁能解释解释?求指点

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1 加油!

查看全部评分

15 个回复

倒序浏览
很明显 你传入字符时,double直接转为0了么。。。
回复 使用道具 举报
i don't know
回复 使用道具 举报
别的不说,先上代码:

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     double num1,num2;
  5.    
  6.     num1 = 0;
  7.     num2 = 2;   // 随便改个非零数,这里改成2,在看看运行效果就知道为什么了
  8.    
  9.     printf("请输入两个数\n");

  10.     scanf("%lf %lf",&num1,&num2);
  11.    
  12.     if (0 == num2)
  13.     {
  14.         printf("您的输入不正确\n");
  15.         return 0;
  16.     }
  17.     printf("%.2lf + %.2lf = %.2lf\n",num1,num2,num1+num2);
  18.     printf("%.2lf - %.2lf = %.2lf\n",num1,num2,num1-num2);
  19.     printf("%.2lf * %.2lf = %.2lf\n",num1,num2,num1*num2);
  20.     printf("%.2lf / %.2lf = %lf\n",num1,num2,num1/num2);
  21.    
  22.     //当%运算的时候,要求两边都是整型数据。
  23.     int yuShu =(int)num1%(int)num2;
  24.     printf("%.0lf %% %.0lf = %d\n",num1,num2,yuShu);
  25.     return 0;
  26. }
复制代码

输入: 1   m

结果如图所示:



所以说并不是歪打正着,正好输出错误提示的原因是因为num2初始化就为零。

结论:scanf("%lf",&num2);执行失败,num2的值为初始值。所以结果如上。

希望对你有帮助!
回复 使用道具 举报
在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。

所以  当你输入的是 字母是    scanf("%lf, &num2); 这个语句 其实 并没有被赋值
    由于楼主 num2 的初始化 是 0  所以 num2 的值 在 执行 scanf 后仍然为0  
    那么就可以解释  “  if (0 == num2)//这里若改成 if(num2)  当输入字母的时候就不会出现if括号中的内容、“


   楼主明白了 请回复 。

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1 很详细,加油!

查看全部评分

回复 使用道具 举报 1 0
输入格式的问题
回复 使用道具 举报
傘が咲く 发表于 2014-5-17 22:11
别的不说,先上代码:

能详细说一说 scanf 失败的原因么?问题是找到了,原理还是不太清楚。
回复 使用道具 举报
戒惜舍得 发表于 2014-5-17 23:26
在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C ...

是scanf的问题,可是为什么当输入第一个数字的时候,我输入字母,也会返回if括号的语句?
回复 使用道具 举报
一只小菜鸟 发表于 2014-5-17 21:54
很明显 你传入字符时,double直接转为0了么。。。

有道理,能详细解释下么?
回复 使用道具 举报
其实我觉得不应该判断的太早 ,因为零可以进行加减乘的运算,到第四步的时候根据输入的数值选择不同的打印结果
回复 使用道具 举报
大龄产妇 发表于 2014-5-18 00:09
是scanf的问题,可是为什么当输入第一个数字的时候,我输入字母,也会返回if括号的语句? ...

因为当你 第一个数字 输入字母的时候。   你得scanf 同样无效  此时你得 num2 就是 初始化的零
   所以 if (0 == num2) 此时 是满足条件
    明白了  如果你吧初始化的值都改为num1 = 2; num2 =2; 就不会出现问题了   
     这下你明白了吗
回复 使用道具 举报
显示输入的问题
回复 使用道具 举报
戒惜舍得 发表于 2014-5-18 07:03
因为当你 第一个数字 输入字母的时候。   你得scanf 同样无效  此时你得 num2 就是 初始化的零
   所以 i ...

我想知道无效的原因,是更换一个初始化值就没有问题了,但scanf取走了什么字符,原理
回复 使用道具 举报
大龄产妇 发表于 2014-5-18 23:39
我想知道无效的原因,是更换一个初始化值就没有问题了,但scanf取走了什么字符,原理 ...


在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。

所以  当你输入的是 字母是    scanf("%lf, &num2); 这个语句 其实 并没有被赋值
    由于楼主 num2 的初始化 是 0  所以 num2 的值 在 执行 scanf 后仍然为0  
    那么就可以解释  “  if (0 == num2)//这里若改成 if(num2)  当输入字母的时候就不会出现if括号中的内容、“
   不论你第一个是字母还是第二个是字母都不赋值

    scanf() 函数   就是说没有被赋值啊。
回复 使用道具 举报
戒惜舍得 发表于 2014-5-19 06:18
在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔 ...

OK  明白了:handshake
回复 使用道具 举报 1 0
戒惜舍得 发表于 2014-5-17 23:26
在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C ...

我后来综合大家的思想又重新分析了下。感觉应该是输入字母的时候,scanf("%lf")  <= 这里直接将字母强转成为double 类型数据,并且都为零。至于为什么输入第一个为字母也返回的问题,认为是字母为char类型,输入的时候带\0 ,而scanf去输入输入缓存区取数据的时候遇到\0就认为取完,所以这时取走的是\0直接赋值了两个变量,并且都为零。谢谢你耐心解答,不知道这样分析对不对?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马