当前课程知识点:程序设计基础 > 第九章 可配置的程序设计 > 9.3 指定界面语言 > 9.3.2 实现程序功能
王小二同学就决定用命令行参数来控制程序的界面语言了
那只要把不同语言的配置文件作为命令行参数给出就行了
那他设想是这样的
由于大部分人还是希望用中文界面
所以如果你这个命令行参数没有
那比如说我们这个字符串程序叫vending
然后如果你不输出任何的命令行参数
就默认就中文界面
当然如果你希望用不同的语言
你可以把这个语言的配置文件作为参数给它
比如你给中文的txt或者英文的txt都可以
如果是这样考虑 那我们main的代码要做这么一个修改
我们用argc和argv
然后我们有一个默认的语言是
比如说是中文的txt这么一个文本文件
如果我的argc>=2
那就是我确实是有这个命令行参数的
那么我们就认为说你的命令行参数中的第一个
也就是argv[1]
那是用户指定的语言的配置文件
那否则我就是默认的中文
与前面的水果的文件类似
保险起见我们在读语言文件如果发现错误了
也许是文件不存在 也许文件格式有问题
那么我们会输出一个说 这个语言文件错误的信息
后面就没法执行了 就return 0了
否则的话我就认为说所有的语言相关的
信息都读入到我的程序中间来了
那么这些不同的语言信息 我们知道肯定有很多
因为刚才我们的代码里面已经知道有好多地方都会有
那么这么多语言相关的信息
我显然可以用一个结构体的变量来统一的存储
而且因为好多函数都会设计到相关的信息的这种显示
所以为了方便起见
我把这个结构的变量定义为一个全局变量
那么这个结构到底应该是怎么样定义呢
那我们其实没有必要现在就把它想得特别清楚
我们可以根据我们代码的修改过程逐步去完善它
这也是一种逐步的求精
因此我们就先定义说我们要有一个结构
比如说LanguageMessages_t
它的内容我们待定 为了后面需要就直接声明
这是一个全局变量叫language
那后面我们就依次来处理不同语言的信息了
比如说我们先考虑这个主菜单
比较简单 假如说我设计中文菜单是这样的
我们原来是这样的
英文菜单我把其中的这些汉字都改成英文了
我感觉这样还不错
我自己编辑的很得意 对齐了很好看
那在在这两个菜单中间
显然其中的内容只要选定语言以后它就固定了
所以我就相应的在这个结构里面
我的语言信息的结构里面
我就先定义第一个变量menu主菜单
我数了一下有5行 每行50个字符反正够了
所以我就先放了这么一个变量
那么有了这个变量之后
我相应的去维护我的读语言信息的函数
以及我输出 打印这个主菜单的函数
那么首先来看我们是怎么来读这个信息的
当然我给出了文件名了
所以ifstream fin就可以打开这个文件
那如果不存在就返回false了
打开失败就返回false
如果成功我后面我认为说语言信息文件
的前面5行就是我的主菜单
我就这么定义的 所以一个for循环
i从0到小于5
然后我每个得到一行
相应的就是我菜单里面的这五行了
那我的显示菜单 原来我还写成五个cout
现在我简单了 我就一个for循环 一个cout
把每一个成员下标相应的字符串给输出出来就可以了
后面就是那些很多的提示语
我就对照原来的代码我一项一项的往后看
那后面我先看到的是水果的配置文件错误
这是一个错误信息
那么中文是水果配置文件错误
英文就写了
fruit configuration file error
那么现在有这条信息
所以我就在我的结构定义里面加了一条
加了一个变量fruit_file_error
然后呢我觉得50个字符也够了
所以我定义了一个数组是不超过50的
有了这个以后 我就可以去用了
比如说如果我的读水果配置文件真的是错误了
那么就把cout原来的这个写死的中文信息
就改成了language.fruit_file_error
这么一个成员变量了
那么有了这个信息
同样我就可以继续去完善读语言配置的函数
下一行就是fin.getline 把它读进来
那子菜单我们知道是比较复杂的
我们前面动态的根据水果去生成子菜单就比较麻烦
那么现在 我们也来继续的分析
子菜单的前两行比较简单 它是固定的信息
那么从第3行开始 它就涉及到我们说
由老板自己去配置的水果名称和价格了
那么我们仔细分析
首先就是类似的 两端分别我们这儿叫左和右
是有一个关于菜单编辑的一个符号的
比如说我们这儿叫submenu的left和right
那么再往中间看 这个两位的命令的序号
当然这个没问题
后面涉及到语言相关的是一个中文叫购买
我就翻译成英文叫buy了
然后这个变量相应我也就叫buy了
后面括号 本身问题不大
这个元 公斤 那么我把它相应的可以翻译成英文的话
那么这块地方是变化的元的这个元素
所以我分别起的名字 比如叫price_unit
就是这个价格的单位 还有重量的单位
那么就需要这么多变量去拼
所以大家看我们这个代码
我在前面两行固定的 很简单
我两个cout 从submenu的0和1就可以输出了
然后开始动态的去拼接的这样一个子菜单的地方
根据我们刚才分析
先是这个submenu_left 左边的符号
然后是固定的两位的这个命令的序号
然后是一个点
后面就是跟着我们中文的购买或者英文的购买
然后是水果名称 水果价格 元啊公斤这些最后拼起来了
那么后面不定向的空格 我们前面也已经分析过了
应该是整个子菜单的长度减去每一项的东西
原来我们因为很多信息是固定的
所以我们直接就算16减去多少
减去这个水果名称就行了
那现在我们都是从配置文件读过来的
很多结构体的成员变量了
这个大家看到这个式子比较长
这个不难吧 一项一项的去减
依次的减掉每一个串的长度就行了
那么所以最后 我们减出来有多少个空格
我就输出多少个空格 这个是比较简单
然后再把最右边的边界符号输出就可以了
但是这里面要注意的一小点是什么
我们的中文字和字中间是没有空格的
英文有空格 所以就意味着什么
如果我把两个串拼在一起
它们如果是中文的串 那么没问题 挺好
如果英文的串 这个空格到底怎么办呢 这个得有空格
所以我们可能需要很细心的去
调试我们这个英文的配置文件
就保证两个内容的中间是有空格的
这是一个细心的工作量的问题
相信大家也是有能力自己去完成的
所以后面的代码就请同学们自己去完善了
-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 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测