返回介绍

6.7 读取数字的循环

发布于 2024-10-08 23:14:04 字数 2974 浏览 0 评论 0 收藏 0

假设要编写一个将一系列数字读入到数组中的程序,并允许用户在数组填满之前结束输入。一种方法是利用 cin。请看下面的代码:

如果用户输入一个单词,而不是一个数字,情况将如何呢?发生这种类型不匹配的情况时,将发生 4 种情况:

  • n 的值保持不变;
  • 不匹配的输入将被留在输入队列中;
  • cin 对象中的一个错误标记被设置;
  • 对 cin 方法的调用将返回 false(如果被转换为 bool 类型)。

方法返回 false 意味着可以用非数字输入来结束读取数字的循环。非数字输入设置错误标记意味着必须重置该标记,程序才能继续读取输入。clear( ) 方法重置错误输入标记,同时也重置文件尾(EOF 条件,参见第 5 章)。输入错误和 EOF 都将导致 cin 返回 false,第 17 章将讨论如何区分这两种情况。下面来看两个演示这些技术的示例。

假设要编写一个程序,来计算平均每天捕获的鱼的重量。这里假设每天最多捕获 5 条鱼,因此一个包含 5 个元素的数组将足以存储所有的数据,但也可能没有捕获这么多鱼。在程序清单 6.13 中,如果数组被填满或者输入了非数字输入,循环将结束。

程序清单 6.13 cinfish.cpp

注意:

本书前面说过,在有些执行环境中,为让窗口打开以便能够看到输出,需要添加额外的代码。在这个示例中,由于输入‘q’结束输入,处理起来更复杂些:

在程序清单 6.13 中,如果要让程序在结束循环后接收输入,也可使用类似的代码。

程序清单 6.14 更进了一步,它使用 cin 来返回值并重置 cin。

程序清单 6.13 中的表达式 cin>>fish [i]实际上一个是 cin 方法函数调用,该函数返回 cin。如果 cin 位于测试条件中,则将被转换为 bool 类型。如果输入成功,则转换后的值为 true,否则为 false。如果表达式的值为 false,则循环结束。下面是该程序的运行情况:

请注意下面的代码行:

前面讲过,如果逻辑 AND 表达式的左侧为 false,则 C++将不会判断右侧的表达式。在这里,对右侧的表达式进行判定意味着用 cin 将输入放到数组中。如果 i 等于 Max,则循环将结束,而不会将一个值读入到数组后面的位置中。

当用户输入的不是数字时,该程序将不再读取输入。下面来看一个继续读取的例子。假设程序要求用户提供 5 个高尔夫得分,以计算平均成绩。如果用户输入非数字输入,程序将拒绝,并要求用户继续输入数字。可以看到,可以使用 cin 输入表达式的值来检测输入是不是数字。程序发现用户输入了错误内容时,应采取 3 个步骤。

1.重置 cin 以接受新的输入。

2.删除错误输入。

3.提示用户再输入。

请注意,程序必须先重置 cin,然后才能删除错误输入。程序清单 6.14 演示了如何完成这些工作。

程序清单 6.14 cingolf.cpp

下面是该程序的运行情况:

程序说明
在程序清单 6.14 中,错误处理代码的关键部分如下:

如果用户输入 88,则 cin 表达式将为 true,因此将一个值放到数组中;而表达式!(cin >> golf [i]) 为 false,因此结束内部循环。然而,如果用户输入 must i?,则 cin 表达式将为 false,因此不会将任何值放到数组中;而表达式!(cin >> golf [i]) 将为 true,因此进入内部的 while 循环。该循环的第一条语句使用 clear( ) 方法重置输入,如果省略这条语句,程序将拒绝继续读取输入。接下来,程序在 while 循环中使用 cin.get( ) 来读取行尾之前的所有输入,从而删除这一行中的错误输入。另一种方法是读取到下一个空白字符,这样将每次删除一个单词,而不是一次删除整行。最后,程序告诉用户,应输入一个数字。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文