当前课程知识点:程序设计基础 > 第九章 可配置的程序设计 > 9.1 自动售卖程序 > 9.1.3 使程序更健壮
下面我们来运行一下我们的程序看看之前情况怎么样的
我们点击这里面的运行
大家看到我们的程序运行起来了
就按我们设计一样先出来这么个菜单
然后我就选择说1 下订单
它就问我了选择具体哪个操作
假设我们先买2.5斤苹果
我选1 购买苹果
重量是2.5 回车
它说我已经买的水果总价是8.75元
再买上两公斤香蕉 点2 输入2 2公斤的香蕉
总价是17.15元 现在我要结账了
输3结账
它就告诉我购买了2.50公斤苹果
2.00公斤香蕉 总价是17.15元
按任意键继续
就退到了我们主菜单里面
如果我按2呢就退出了
这就是我们程序的执行过程
那我们可以试一下其他的输入
那我再点这个运行
比如说我现在希望输入1或者2嘛
那我不小心按了个4 会怎么样呢 我们看一下
因为我们用得这个case只有case1和2才可以正常的处理
我们看4被忽略了
那如果我们是在输别的呢比如说我输了一个1
我不小心输了一个字母 大家看我们程序出问题了
为什么我们的屏幕会不断不断往下闪呢
到底哪里出问题了呢
我们仔细研究我们的代码可以发现说
应该是我们这个里面的cin>>input出问题了
为什么 因为我们希望input是一个整数
可是我们现在输入的时候不是整数 它是字母
所以cin>>input就会出错
出错的表现是说这个字母没有读到cin里面
没有读到cin的input指向的变量里面
那下次当它还想处理的时候
它还过不去
那我们代码呢又是一个while的循环
如果你输入的不是我们能处理的命令呢
它就忽略 所以呢它不断地忽略不断读不断失败
就造成了我们屏幕不断往上滚
那这个怎么办 不能说我这售卖程序放在那里
由于顾客误操作了一个东西然后后面所有的买卖不能做了
也就说如果我这个程序这点处理不好
那实际上很不实用的
所以这样一个小的问题啊实际上是非常严重的
那么我们就应该做到说
对这种用户交互的一种程序
用户在合理范围内范的一些小错误
应该是你持续能够处理
我们称为这样会让你的程序比较健壮 比较鲁棒
那么我们怎么解决这个问题呢
刚才分析了关键就是我输入一个东西 这个东西cin没有真正读入
而且尝试不断地读它 可永远读不过去
所以我的解决方案就是说即使用户输错了
它的错误输入应该被我读进去
虽然读进去以后啊可能不做任何的处理
但是我不能不读进来因为下次还碰到这个问题我绕不过去
所以呢我们的想法是这样的
不管用户输入的是什么有效命令还是无效命令呢
我的cin应该每次读一行把你用户的回车都读完
读完之后我在处理说用户输入是有效命令还是无效命令
那为了实现这个功能呢我们是这么做的
先做一个函数叫getinteger找到一个
以整数表示的这么一个输入
根据我们刚才的想法我们需要得到一行
所以我们主体是用cin get line来得到一整行的
getline我们前面用的比较少
它其实也是比较常用的一个
关于字符数组读入的一个函数
请看我们这边代码的事例
我要把这个输入放到一个字符数组里面
所以我现在先假定说用户的输入不可能特别特别长
我可能有一百字符就够了
所以我定义的char buf[100]初始化
那么我们看代码里面while里面会getline输入
当然用户直接回车什么都没输呢
显然中间串是空的
所以我为了防止这种情况用户误拍了一个回车呢
所以我检查一下说 现在字符串啊长度是不是零
如果是零用户可能直接拍了回车了
那我继续等待它输入所以我写了个while的一个循环
那只要用输入不为空 我就可以继续的进行下去了
因为我需要是得到一个整数的输入
所以我后面是atoi
把这个字符串找回整数
如果输入的123后面跟着个d
那没关系我们atoi可以把123这个值给提取出来
后面d就停下来但是这个d
因为我已经读入了所以不会影响后面的输入
有了这样一个函数之后呢下面我再得到这个命令话
我就不用cin带入input了就写成input=getinteger这门函数了
类似的我们后面还有说输入水果的重量称重是个double
那么我们类似写一个double的函数
前面都一样 最后atoi改成atof
这样我们就可以防止用户错误的
或者不小心的输入的非数值这样一种情况
这样我们程序就健壮了很多
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测