热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如果dowhile循环中的语句带有yes或no结尾

如何解决《如果dowhile循环中的语句带有yes或no结尾》经验,为你挑选了3个好方法。

我是编码的新手,我正在尝试do while使用嵌套if语句进行长循环,但是我遇到了让循环实际循环的问题.

我没有直接获得有关代码很长的项目的帮助,而是制作了一个简单的版本.它也不循环.它将结束并询问用户是否要再次尝试但是当输入"y"时它忽略if语句.

#include 
#include 
using namespace std;

int main()
{
    string sodaChoice;
    char answer = 'n';

    do
    {
        cout <<"Please choose your favorite soda from the following: Rootbeer, Diet Coke, Coke, Sprite" <<"\n";
        getline(cin, sodaChoice);

        if (sodaChoice == "Rootbeer")
        {
            cout <<"Me too!" <<"\n";
        }
        else if (sodaChoice == "Diet")
        {
            cout <<"Not me :(" <<"\n";
        }
        else if (sodaChoice == "Coke")
        {
            cout <<"It's alright" <<"\n";
        }
        else if (sodaChoice == "Sprite")
        {
            cout <<"only if I'm sick" <<"\n";

        }
        else
        {
            cout <<"That was not on the list";
        }
        cout <<"would you like to try again?";
        cin >> answer;



    } while (answer == 'y'|| answer == 'Y');




    return 0;
}

我想也许我需要围绕if语句的do循环中的do循环,但后来我不知道如何去做.任何帮助,将不胜感激.我花了很多很多时间试图解决这个问题.

我试着问我的老师,但是我的大学教授他们的院长根据她的书写的一些通用课程.他对帮助或教学不是很热心.

编辑:谢谢大家的答案!至于这是一个重复的问题,我还没有学过cin.ignore,所以我不知道它与我的问题有关.谢谢大家教我!



1> Some program..:

cin >> answer;

你只读了一个字.问题是你在写答案时输入了至少两个字符.实际'y''n' Enter键,其中加入作为在输入缓冲器换行.

然后,下一个getline调用将该换行读取为空行.

这个问题有一些解决方案,例如ignore在阅读之后使用answer.或者,如果你想只有一个字的输入,那么你可以使用使用格式化输入>>sodaChoice过,因为它会默认跳过前导空格(如新行).



2> Richard Hodg..:

在用户表现良好并仅输入"y"或"n"后跟换行符的情况下,现有答案是正确的.

我们可以通过要求它忽略包括下一个换行符在内的所有字符来添加一点安全性来修改.ignore()调用:

您需要在翻译单元的顶部添加此标头包含:

#include 

你需要在之前添加这一行cin >> answer:

// consumes and ignores as many characters as necessary until a newline. 
// The newline is also consumed.
cin.ignore(std::numeric_limits::max(), '\n');

这里有测试输入的完整程序:

http://coliru.stacked-crooked.com/a/996e77559590ad6d

不幸的是,计算机科学教师对计算机科学一无所知并不罕见.不要担心这一点,或者让它让你不去学习如何编写软件 - 这只是一个好的软件工程师比好老师获得更多报酬这一事实的症状.

以下是一些有用的参考资料:https://en.cppreference.com/w/cpp/io/basic_istream/ignore



3> ilkkachu..:

我将提出与其他答案完全相反的建议.cin.ignore在你阅读的那个字符之后,我没有使用跳过任何多余的字符,我认为最好还是完全getline()忘掉所有的阅读cin >> somevar.

有两个原因:

    您获得的格式化输入cin >> somevar忽略了前导空格,包括换行符.如果用户点击Enter空行,程序不会执行任何操作,但仍需要进一步输入.这不是CLI程序用户所期望的!通常的期望是Enter完成输入,空输入应该导致程序使用默认值,或者抱怨无效输入.有了cin >> somevar,你也做不到.

    格式化输入在缓冲区中留下任何不匹配的输入.在您的示例中,读取单个字符至少会留下以下换行符,但其他类型的输入也会如此.读取数字(with int i; cin >> i;)会在数字等待下一个输入操作之后留下任何内容,因此输入123 abc将返回123,并且abc将出现在下一个输入操作中.

    其根本原因在于,默认情况下,命令行终端处于基于行的模式.在输入完整的行之前,程序或库函数看不到操作系统的任何输入.(cin.ignore()当然可以帮助你解决这个问题,但不是第一点.)

使用getline()完全匹配底层机制,让您处理空输入(以及在读取时告诉零和非数字之间的区别int),并自动处理尾随垃圾.但是,您必须手动将读取的字符串转换为您实际需要的字符串.

在您的情况下,您可以将循环条件简单地更改为以下内容:

string answer;
...
    getline(cin, answer);
} while (answer == "y" || answer == "Y");

如果您需要一个号码,您可以使用例如int num = std::stoi(str).


(在C中,如果scanf()用于用户输入,同样会发生,同样,最好使用fgets()然后解析字符串sscanf(),它提供相同的选项但处理行缓冲.我不太熟悉C++,所以我无法告诉如何获得cin >> somevar与完整行读取的完全等价getline().)


推荐阅读
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • C++ 类的 this 指针 语法练习5
    #include<iostream>#include<string>usingnamespacestd;定义一个类Studentclass ... [详细]
  • Igotthiscode(IknowitsinSpanishIcantranslateifneeded)wheretheygivemethefunctionS ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • [置顶]        C++类的构造函数与析构函数的调用顺序
    1构造函数的调用顺序[1]构造函数按此顺序执行工作:按声明顺序调用基类和成员构造函数。如果类派生自虚拟基类,则会将对象的虚拟基指针初始化。如果类具有或继承了虚函数,则会将对象的虚函数指针初始化。 ... [详细]
  • 字符串的题目用库函数往往能大大简化代码量介绍几个常用的C的字符串处理库函数strtok()原型char*strtok(chars[],constchar*delim); ... [详细]
  • C++语言学习(六)——二阶构造模式
    C++语言学习(六)——二阶构造模式一、构造函数的问题构造函数存在的问题:A、构造函数只提供自动初始化成员变量的机会B、不能保证初始化逻辑 ... [详细]
author-avatar
Edison小磊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有