当前课程知识点:程序设计基础 > 第九章 可配置的程序设计 > 9.3 指定界面语言 > 9.3.1 提出问题与命令行参数
有了水果的配置文件之后
老板很高兴 程序用起来不错
生意也很好 过了一段时间
老板在留学生楼旁边开了一家分店
因为生意太好了 开了分店以后
老板又找王小二同学了
说这个地方留学生比较多
所以你能不能再帮我写一个是
英文界面的自动售卖程序
王小二想了一下 原来是中文的
现在英文的 这个语言因素会影响两个地方
第一个就是源代码里面我们显示菜单
显示一些提示语 原来是中文的
现在要改成英文的 第二个配置文件中间
原来老板配置的是中文的苹果香蕉
现在显然也得改成英文的
当然这个配置文件改英文 是老板你自己的事
你自己去改 你老板如果英文水平不好
就请教小二呗 所以配置文件涉及的中文和英文
老板可以自己去处理 跟源代码没有关系
但是用户交互界面里面的一些信息 一些提示语
这个就需要把原来的这些固定写死的中文内容都换成英文
因此王小二就发现说对于不同语言的界面
这个程序有不同的语言的这种界面
就需要维护不同的源代码 本来就一个程序需要维护
现在就需要可能两个版本 一个中文版一个英文版
那么能不能只写一个程序呢
我们只写一个程序 可这个程序表现出来
既可以显示中文版也可以显示成英文版
能不能这么做呢 王小二又想到了文件了
如果我们把不同语言的这些信息
用不同的配置文件来存放 感觉上是可以做到的
但是这种语言界面 这种语言信息的配置文件
和水果这个配置文件 不一样
水果名称和价格实际上是一种数据的文件
在程序的正常使用过程中间
我们根据情况 这个数据是不断变的
而这个语言界面的文件 如果我也写在文件里面
那么它一旦写好以后就不变了
你或者是用中文 或者是用英文
不管你切换哪种语言 每种语言来讲
内容是不会再改变了 那从另一个角度来讲
也可以这么去理解
就是这个水果名称和价格的配置文件
是需要水果店老板自己去改的
你使用的人你自己去改吧
但是语言配置的这个文件 那是开发这个程序的人写好的
它不是要用户要老板自己去改的 也不该由他改
他不能改 他很容易改错
那么怎么才能让老板方便的去决定
我应该这次程序运行应该用中文界面还是英文界面
王小二想到了 因为王小二在学我们这个课程的时候
还根据我们的推荐看了很多参考的教材
然后他看到过有一个语言上的东西叫命令行参数
我们可以通过不同的命令行参数
来控制程序有不同的表现 在我们的代码里面
要处理命令行参数的话 大家请看我们是这么写的
这个命令行参数是要体现在我们的main函数上的
以前我的main函数 int main 一对括号
现在我们因为需要处理命令行参数
命令行参数实际上是我们可以在命令行窗口给输进去的
那么这个参数有两个 第一个叫argc
读成argc 就参数的count 数量
第二个是argv 是参数的这些变量
因为我可能有很多参数
每个参数显然是吧啦吧啦的一些内容
所以实际上我是一个二维数组
或者你也可以认为说是一个字符串的数组
所以我们写成 char *argv[]来表示这个数组
当然也有同学会看到说 有的时候有另一种写法
因为它是一个二维的字符数组
所以也可以写成char **argv
这两种写法是等价的
当然第一种写法可能更明确的表示说
这个argv是一个字符串的数组
那么对于具体的怎么来去实现呢
那王小二也看到了一些示例的代码
比如说我们这么一个示例代码
它是通过命令行参数给出两个整数
这个程序可以把这两个整数的和给输出在屏幕上面
来看 这个代码写得其实挺简单的
定义两个整数a和b a是等于大家看到atoi(argv[1])
b=atoi(argv[2]) 这个下标是2
然后就可以cout了 为什么这么写的呢
那其实我们可以去自己尝试一下
实际上是对应的这个东西 如果我在命令行代码里面写上
比如说我这个程序名称编译完叫add.exe
那么就写上add.exe 调用这个程序
然后给他两个参数 当然就是命令行参数4和5
然后我回车 这个时候我们的main函数
的argc argv参数就有值了
大家看到我在命令行上实际上打了三项
第一项是add.exe 第二项是4 第三项是5
所以我们的main函数参数的argc就等于3
因为你确实输入了空格所隔开的三项
第一项显然是add.exe 第二项是4 第三项是5
当然由于我们的数组是从0开始下标的
所以我们a对应的是argv[1] b对应的argv[2]
这就是我们命令行参数 传递到main函数中间的一个情形
那么在我们的dev C++的环境里面
怎么去输入命令行参数呢
我就没有命令行的窗口了呀
那大家可以去找一下
在我们运行的菜单下面有一个叫参数
点这个参数会蹦出来一个框
这个里面就可以输入我们的实际上
要填进去的命令行参数了 比如说我刚才的4 5
那我就写4空格5就可以了 那么这是我们自己写代码
别人已经写好的一个代码 编译完成一个程序
那我怎么知道 这样一个程序能接受什么样的命令行参数呢
当然有的时候我说我们会有一些用户手册
下面会写着 那往往查找手册是比较麻烦的
所以我们一般写法是说 我们会在程序中间去检测
命令行参数是不是合法
如果不合法我就输出一个帮助信息
要告诉用户说 到底我这个程序能接受什么样的命令行参数
那比如说对于我们刚才的那个加法的程序
比如说我可以这么写
首先先判断说 你是不是输入了两个数
所以如果argc不等于3的话 那你肯定不对
那如果不对 我就要提示用户
你看看我是这么写的
我这个程序的用途是这样的
我输出了这个argv[0] 你具体的这个编译完的程序
然后加第一个操作数 第二个操作数
然后还解释了一下 第一和第二个操作数是整数
那么一般我们都会通过这样一个方式来让真正的用户去了解
我这个程序是接收哪些命令行参数
包括这些命令行参数分别是什么样的格式
-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 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测