首页 > 其他分享 >循环控制:(第4题)有关区分字符型与整型的题目

循环控制:(第4题)有关区分字符型与整型的题目

时间:2024-03-18 12:04:10浏览次数:26  
标签:字符 题目 sum days while 整型 scanf 输入

1.题目再现:

2.题目分析:

这道题主要解决的问题非常明显。1.区分输入的是字符还是整型数据 2.区分是正数还是负数 3.利用循环求出桃子数。

(1)针对问题一

这里先补充一下scanf的三种返回值:

1.输入成功:返回输入成功的变量个数

2.输入失败:类型不匹配,就会返回0 

3.缓冲区中没有数据:返回EOF

我们知道scanf("%d",&days)只能读取整型数据。当我们输入字符时会因为不匹配而无法输入。这时scanf的返回值就是0。我们也正是通过这一点,区分输入的是字符还是整型数据。

所以在程序刚进入循环时,我们就可以判断scanf的返回值是否等于0。当判断等于0时,我们就用while语句清空输入缓冲区中剩余的字符,直到遇到换行符('\n')为止。同时为days重新赋值。

(2)针对问题二

用if语句判断输入的数是否大于0,如果小于0,用continue语句跳过本次循环。

(3)针对问题三

由题目得,第n天的桃子数为一。所以我们对sum初始化为1,进入循环后令sum=(sum+1)*2.

days=days-1当days<1时跳出循环,打印sum。

3.代码展示

#include <stdio.h>
int main()
{
    int days = 0;
    while (1)
    {
        printf("Input days:\n");
        int check = scanf("%d", &days);

        //如果输入失败,则重新输入
        while (check ==0) {
            while (getchar() != '\n');
            printf("Input days:\n");
            check = scanf("%d", &days);
        }

        if (days > 0)
        {

            int sum = 1;
            while (days > 1)
            {
                sum = (sum + 1) * 2;
                days--;
            }
            printf("x=%d\n", sum);
            break;
        }
        else if (days <= 0)
            continue;
    }
    return 0;
}

4.典型错误分析

在2.1中我提到要优先判断输入数据的类型。如果没有这样做就会出现以下这种情况。

#include <stdio.h>
int main()
{
    int days = 0;

    while (1)
    {
        printf("Input days:\n");
        scanf("%d", &days);
        if (days > 0)
        {

            int sum = 1;
            while (days > 1)
            {
                sum = (sum + 1) * 2;
                days--;
            }
            printf("x=%d\n", sum);
        }
        else if (days <= 0)
            continue;
        else if (scanf("%d", &days) != 1)
        {
            while (getchar() != '\n');
            continue;
        }
    }
    return 0;
}

当我们输入正数或者负数时,代码都能正常运行。可是一但输入字符,就会死循环。

   

大家可能会疑惑,我们不是有while(getchar()!='\n')这段代码来清空缓冲区的字符,为什么代码不能重新进入while循环,让我们再次输入呢。

其实这是因为当scanf没有正确读取时就会把days赋值为0。当days等于0,代码就运行else if语句。又通过continue跳过while(getchar()!='\n')这段代码,导致缓冲区一直没被清理。再次循环时缓冲区里依然是字符,scanf依然读取失败进而再次循环,重复打印Input days。正如调试结果:

5.总结复盘

本题看似简单,实际上考察了循环、getchar清空缓冲区字符、scanf返回值等多方面的知识。学生只有对scanf在不同情况下的返回值有所了解才能正确地找到本题的代码思路。当然我们不要忘了应当首先判断输入字符与给定的占位符是否匹配。

本章内容到此结束。谢谢大家!

标签:字符,题目,sum,days,while,整型,scanf,输入
From: https://blog.csdn.net/2301_80744520/article/details/136770240

相关文章

  • 字符函数和字符串函数
    文章目录字符函数和字符串函数字符函数字符分类函数字符转换函数字符串函数strlenstrcpystrcatstrcmpstrncpystrncatstrncmpstrstrstrtokstrerror字符函数和字符串函数字符函数下面介绍的函数均包含在头文件<ctype.h>中字符分类函数字符分类函数帮你判断一个......
  • 字符串拼接re.sub()用法
    re.sub()用法介绍re.sub()函数会搜索string中满足pattern的子串,并用repl替换它们。替换后的字符串作为函数返回值返回re.sub()语法:re.sub(pattern,repl,string,count=0,flags=0)参数:pattern:表示正则表达式中的模式字符串;repl:被替换的字符串(既可以是字符......
  • 459. 重复的子字符串c
    voidbuild(char*s,int*next,intn){next[0]=-1;inti=1,j=-1;while(i<n){if(j==-1||s[j]==s[i-1]){next[i]=j+1;j++;i++;}else{j=next[j];}}for(inti=0;i&l......
  • 小新喊你了解字符串函数了(二)
    接上一篇,我们再学习四个新的字符串函数1.strstr函数的使用和模拟实现 char*strstr(constchar*str1,constchar*str2);strstr函数用于字符串的查到,在一个字符串中查找另一个字符串,找到了就返回字符串str2在字符串str1中第⼀次出现的位置 ,找不到就会返回NULL(空......
  • 代码随想录算法训练营第十天|LeetCode 20.有效的括号、1047.删除字符串中的所有相邻重
    20.有效的括号题目链接:https://leetcode.cn/problems/valid-parentheses/description/解题思路:题目转化:三种类型的括号,需要做匹配匹配规则是:左右括号的类型要匹配、数量要一致,而且要按照顺序匹配例子是:“()”、“(){}[]”、“(([]))”条件转化:按照顺序匹配:......
  • 攻击树测试 题目8寻找最近三个月内公布或发布的新产品或系统,
选择一个你了解的资产并
    攻击树测试题目要求用(你的学号%10)+1确定序号,完成下面的内容:1给如何偷汽车创建攻击树。在这道题以及其他攻击树的练习题中,可以通过图来描述攻击树,也可以使用一个编号的列表来描述攻击树(比如,1,1.1,1.2,1.2.1,1.2.2,1.3,…)。2给如何不付费进入体育馆创建攻击树。3给如何不付......
  • 求字符串中某个字符的数量--long k = s.chars().filter(ch -> ch == c).count();
    classSolution{publiclongcountSubstrings(Strings,charc){longk=s.chars().filter(ch->ch==c).count(); //Java中的count()方法返回值是基本数据类型longreturnk*(k+1)/2;}}作者:灵茶山艾府链接:https://leetcode.cn/pr......
  • [Python初阶]2255.统计是给定字符串前缀的字符串数目
    目录     2255.统计是给定字符串前缀的字符串数目①.题目②.问题分析③.startswith()方法理解与说明Ⅰ.定义和用法 Ⅱ.语法 ④.问题解决⑤总结     2255.统计是给定字符串前缀的字符串数目①.题目②.问题分析需求:统计列表words中,是字......
  • 统计字符串字符个数
    importjava.security.Key;importjava.util.Scanner;importjava.util.Set;importjava.util.TreeMap;publicclassMain{publicstatic<scanner>voidmain(String[]args){System.out.println("请输入一个字符串");Scannersc=newScanne......
  • abc324E 合并两字符串后能
    给定n个字符串s[n]和字符串t,从中任选一对下标(i,j),要求i<=j,让s[i]与s[j]连起来得到一个新的串,要求由新串删除0个或多个字符可以得到t,问存在多少对满足条件的下标对?1<=n<=5e5;1<=len(s[i]),len(t)<=5e5假设由字符串x能得到t的前缀长度为a,字符串y能得到t的后缀长度为b,如果a+b>=le......