张sir. 发表于 2021-9-3 18:54:42

C语言lesson 11 if语句的课堂代码小问题

下面我的代码除了把分数i定义为float类型,而课堂代码为int i,其他的没什么不同,为什么我的代码无论输什么分数,最后打印结果都是E呢?


#include <stdio.h>

int main()
{
        float i;
       
        printf("学生的分数是:");
        scanf("%.1f", &i);
       
        if(i>=90)
        {
                printf("A\n");
        }
       
        else if(80<=i&&i<90)
        {
                printf("B\n");
        }
       
        else if(70<=i&&i<80)
        {
                printf("C\n");
        }
       
        else if(60<=i&&i<70)
        {
                printf("D\n");
        }
       
        else
        {
                printf("E\n");
        }
       
        return 0;
}

人造人 发表于 2021-9-3 19:33:14

这两行一样吗?一定要仔细看,答案是不一样
      //scanf("%.1f", &i);
      //scanf("%.lf", &i);

#include <stdio.h>

int main()
{
      float i;
      
      printf("学生的分数是:");
      //scanf("%.1f", &i);
      //scanf("%.lf", &i);
      scanf("%f", &i);
      
      if(i>=90)
      {
                printf("A\n");
      }
      
      else if(80<=i&&i<90)
      {
                printf("B\n");
      }
      
      else if(70<=i&&i<80)
      {
                printf("C\n");
      }
      
      else if(60<=i&&i<70)
      {
                printf("D\n");
      }
      
      else
      {
                printf("E\n");
      }
      
      return 0;
}

人造人 发表于 2021-9-3 19:34:47

这种错误以后不要犯了

张sir. 发表于 2021-9-3 21:25:25

人造人 发表于 2021-9-3 19:33
这两行一样吗?一定要仔细看,答案是不一样

感谢,错的就是%.1f,只需要改为%f即可。
没想到错在这,背后原因是什么呢,为什么scanf函数不能写成"%.2f“?

另外,昨晚见到一篇推文,明白了兄台这昵称的内涵{:10_256:}{:10_256:}

人造人 发表于 2021-9-3 21:32:06

张sir. 发表于 2021-9-3 21:25
感谢,错的就是%.1f,只需要改为%f即可。
没想到错在这,背后原因是什么呢,为什么scanf函数不能写成"%. ...

注意你写的是数字 1,不是字母 l,还是没看出来?
要认真一点呀,要达到在字母级别的认真
至于
scanf("%.lf", &i);
我没见过这么用 scanf 的

还有,我想你误会我的 id 了
“人造人” 这个名字不是你想的那样

张sir. 发表于 2021-9-3 21:34:09

人造人 发表于 2021-9-3 19:34
这种错误以后不要犯了

这个问题我没犯啊,我的代码中是1不是l{:10_254:}

人造人 发表于 2021-9-3 21:35:20

https://www.runoob.com/cprogramming/c-function-scanf.html

人造人 发表于 2021-9-3 21:40:01

看这个吧,这个更好一些
http://www.cplusplus.com/reference/cstdio/scanf/

人造人 发表于 2021-9-3 21:43:57

张sir. 发表于 2021-9-3 21:34
这个问题我没犯啊,我的代码中是1不是l

说你不认真是有原因的,看你的代码第 8 行
你写的是数字 1,正确的这里是字母 l

人造人 发表于 2021-9-3 21:47:56

试一下这两个代码,哪一个正确

#include <stdio.h>

int main(void) {
    double n;
    scanf("%lf", &n);
    printf("%lf\n", n);
    return 0;
}


#include <stdio.h>

int main(void) {
    double n;
    scanf("%1f", &n);
    printf("%1f\n", n);
    return 0;
}

张sir. 发表于 2021-9-3 21:57:13

人造人 发表于 2021-9-3 21:43
说你不认真是有原因的,看你的代码第 8 行
你写的是数字 1,正确的这里是字母 l

那个,现在明白了scanf不能像printf那样print("%.1f"),在[%]这个字符后面就是加一点和一个数字,1的话就是1个小数位——所以我写数字1没问题,只是scanf函数不能用。

人造人 发表于 2021-9-3 22:01:29

张sir. 发表于 2021-9-3 21:57
那个,现在明白了scanf不能像printf那样print("%.1f"),在[%]这个字符后面就是加一点和一个数字,1的话就 ...

你这么一说,我明白你的意思了
之前是我没有明白你的意思,抱歉了
^_^

人造人 发表于 2021-9-3 22:03:48

张sir. 发表于 2021-9-3 21:57
那个,现在明白了scanf不能像printf那样print("%.1f"),在[%]这个字符后面就是加一点和一个数字,1的话就 ...

对,scanf 不能这样用
scanf 的格式和 printf 的是不一样的
scanf 是这样
%[*]specifier
printf 是这样
%[.precision]specifier

张sir. 发表于 2021-9-3 22:04:32

人造人 发表于 2021-9-3 21:47
试一下这两个代码,哪一个正确

第1个正确。
所以其实不是我粗心的原因,我那个.1是仿照printf来的,没想到在scanf里不行。

至于1、%1f是什么 2、和%f区别以及 3、为什么scanf里可以%1f而不能%.1f,需要我明天仔细看看老兄你发的scanf函数扩展内容,看能不能有收获。

人造人 发表于 2021-9-3 22:05:46

张sir. 发表于 2021-9-3 22:04
第1个正确。
所以其实不是我粗心的原因,我那个.1是仿照printf来的,没想到在scanf里不行。



抱歉了,是我没有理解你的意思
^_^

张sir. 发表于 2021-9-3 22:11:26

人造人 发表于 2021-9-3 22:03
对,scanf 不能这样用
scanf 的格式和 printf 的是不一样的
scanf 是这样


谢谢老兄,很细心耐心指导。

我目前是才开始学编程,C语言学到第11课if语句,关于printf和scanf,我目前还是依样画葫芦的阶段,经过每节课的手撸代码,现在能用,正因为对甲鱼论坛中函数快查的printf和scanf函数内容仔细看了一遍,才在“用”的层面进步了,但对诸如对%[*]specifier这个内容,我不太理解。比如printf里的%.2f,我知道.2指的是width宽度,有2个小数位,f指的是浮点型数据是length长度吗?那specifier指啥呢?

人造人 发表于 2021-9-3 22:13:31

张sir. 发表于 2021-9-3 22:04
第1个正确。
所以其实不是我粗心的原因,我那个.1是仿照printf来的,没想到在scanf里不行。



对于 scanf
%[*]specifier
%1f 中
没有 *
1 对应 width
没有 length
f 对应 specifier

对于 printf
%[.precision]specifier
%1f 中
没有 flags
1 对应 width
没有 .precision
没有 length
f 对应 specifier

对于 printf
%[.precision]specifier
%.1f 中
没有 flags
没有 width
.1 对应 .precision
没有 length
f 对应 specifier

在 scanf 中,没有 .precision,没有 . 开头的字段,对应不上

人造人 发表于 2021-9-3 22:17:27

张sir. 发表于 2021-9-3 22:11
谢谢老兄,很细心耐心指导。

我目前是才开始学编程,C语言学到第11课if语句,关于printf和scanf,我目 ...

"specifier这个内容,我不太理解。比如printf里的%.2f,我知道.2指的是width宽度"
你看的这个不对
.2 指的是 .precision
width 没有提供
%10.5f
10 -> width
.5 -> .precision
f -> specifier

人造人 发表于 2021-9-3 22:20:41

length 是这些

张sir. 发表于 2021-9-3 22:29:47

人造人 发表于 2021-9-3 22:20
length 是这些

非常感谢老兄,收获非常大,一把试一把尿咳咳~~手把手地教了这是,明天我把相关资料再仔细过一遍,相信能加深理解。这种小问题,积累多了真的是时不时挖出个新坑。

今晚好梦{:10_279:}
页: [1] 2
查看完整版本: C语言lesson 11 if语句的课堂代码小问题