尝试过很多编程语言,写过不少程序(当然,基本上都是些自娱自乐或给自己用的工具类的小玩意儿),逐渐认识到编写程序是一个不断完善、不断优化的过程——编程首先要有一个想法(目标),围绕这个目标形成最基本的功能逻辑,测试证明功能有效之后就算目标基本实现了。随后,可以扩展基本功能的应用领域,加强程序的容错能力和交互性,逐渐形成一个更完善更健壮的程序。以下通过一个小例子来对此过程稍作展示:

  在计算器上、电梯上、LED显示屏上,都可以看到用点阵表示的数字

  

  这里,我们尝试用Python来模拟点阵数字,简而言之,就是把数字放大(^_^)

一、设计点阵数字的显示效果

  为了简化,我们这里只考虑0~9这十个阿拉伯数字,每个数字点阵都是5行4列,在Python中可以用tuple来表示。(在设计点阵字模的过程中,你也可以体验一下当美工或字体设计师的感觉,@_@)。在Python中,这个过程很简单(以下仅以0,1两个数字为例)。  

FONTCOL=4
FONTROW=5 zero=( " ** ",
"* *",
"* *",
"* *",
" ** ") one=( " * ",
" ** ",
" * ",
" * ",
" ***")

  

二、 测试输出效果

  为了考察数字点阵的输出效果,也为了验证将来的输出逻辑,可以用一段最简单的程序把所有字模输出。功能逻辑很简单:

  a. 对于一个序列中的每个数字,找到其对应字模,输出该字模的第一行,空一格;然后输出下一个数字对应字模的第一行,空格,直到全部数字对应字模的第一行都已输出

  b. 继续依次输出每一行,直到结束(在本程序中是5行,即FONTROW)

完整程序:  

import sys

FONTCOL=4
FONTROW=5 #以下构建数字点阵
zero=(" ** ",
"* *",
"* *",
"* *",
" ** ") one= (" * ",
" ** ",
" * ",
" * ",
" ***") two= (" ** ",
"* *",
" * ",
" * ",
"****") three=(" ** ",
"* *",
" **",
"* *",
" ** ") four= (" * ",
" ** ",
"* * ",
"****",
" * ") five= ("****",
"* ",
"****",
" *",
"****") six= (" ** ",
"* ",
"*** ",
"* *",
" ** ") seven=(" ***",
"* *",
" * ",
" * ",
" ***") eight=(" ** ",
"* *",
" ** ",
"* *",
" ** ") nine= (" ** ",
"* *",
" ***",
" *",
" ** ") digits=(zero,one,two,three,four,five,six,seven,eight,nine) #将所有数字字模合成一个元组
i=0
while i<FONTROW:
col=0
while col<10: #此处输出全部字模,共计10个
print(digits[col][i],end=" ")
col+=1
print("") #换行,输出字模下一行
i+=1

  输出效果:

  

三、优化和完善1——根据输入的不同,显示不同的输出

  通过argv读取输入参数(即用户想要显示的具体数字),若用户未提供参数,则提供使用说明和示例输出

  这里就可以把上面用到测试输出代码稍作调整,形成一个函数show_numbers。(注意其print部分有小调整)

  核心代码:  

import sys
FONTCOL=4
FONTROW=5 #以下构建数字点阵
#略
digits=(zero,one,two,three,four,five,six,seven,eight,nine) #将所有数字字模合成一个元组 def show_number(nums):
i=0
while i<FONTROW:
col=0
while col<len(nums): #此处输出全部字模
print(digits[int(nums[col])][i],end=" ")
col+=1
print("") #换行,输出字模下一行
i+=1 def show_usage():
print("请在程序名之后提供15个数字以内的整数")
print("程序名.py 0123456789")
show_number('0123456789') if len(sys.argv)==2:
show_number(sys.argv[1])
else:
show_usage()#如果未提供参数或提供的参数过多,则输出使用说明

  

四、优化和完善2——对输入进行检查

  以上代码已经可以应付基本需求了,但对于用户的错误输入没有抵抗能力。我们计划从以下几个方面进行优化:

  a. 限制用户的最大输入字符个数

    在DOS界面,一行最多显示80个字符,字模每个占4字符,字模间有1字符空格,在考虑行尾的换行符,所以我们一次最多允许输入80/(4+1)-1=15个数字。

b. 限制用户只能输入阿拉伯数字

    如果用户误输入非数字信息,如英文字符等,则int()函数会报 ValueError,抓住这个Error并做提示

  调整后的程序:

try:
if len(sys.argv)==2:
if len(sys.argv[1])<16:
show_number(sys.argv[1])
else:
show_usage()
else:
show_usage()#如果未提供参数或提供的参数过多,则输出使用说明
except ValueError:
print("\n\n未能正确显示全部信息!!——出现了非数字的字符!\n")
show_usage()

  

程序点滴001_Python模拟点阵数字的更多相关文章

  1. 微信小程序车牌号码模拟键盘输入

    微信小程序车牌号码模拟键盘输入练习, 未经允许,禁止转载,抄袭,如需借鉴参考等,请附上该文章连接. 相关资料参考:https://blog.csdn.net/littlerboss/article/d ...

  2. 如何在 ASP.NET 应用程序中实现模拟用户身份(在ASP.NET中以管理员身份运行网站)

    前言 在实际的项目开发中,我们可能会需要调用一些非托管程序,而有些非托管程序需要有更高的身份权限才能正确执行.本文介绍了如何让IIS承载的ASP.NET网站以特定的账户执行,比如Administrat ...

  3. JAVA 基础编程练习题13 【程序 13 根据条件求数字】

    13 [程序 13 根据条件求数字] 题目:一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少? 程序分析:在 10 万以内判断,先将该数加上 100 后 ...

  4. JAVA 基础编程练习题11 【程序 11 求不重复数字】

    11 [程序 11 求不重复数字] 题目:有 1.2.3.4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数字都是 1.2.3.4.组成所有的排列后 ...

  5. PCB布线设计-模拟和数字布线的异同(转)

    工程领域中的数字设计人员和数字电路板设计专家在不断增加,这反映了行业的发展趋势.尽管对数字设计的重视带来了电子产品的重大发展,但仍然存在,而且还会一直存在一部分与模拟或现实环境接口的电路设计.模拟和数 ...

  6. Java初学者作业——编写Java程序, 在控制台输入数字,计算表达式1-2+3-4……+(2*n-1)+2*n的结果。

    返回本章节 返回作业目录 需求说明: 编写Java程序, 在控制台输入数字 计算表达式1-2+3-4--+(2*n-1)+2*n的结果. 实现思路: (1)声明变量 n 和 sum,用于存储用户输入的 ...

  7. 2018.07.26NOIP模拟 魔法数字(数位dp)

    魔法数字 题目背景 ASDFZ-NOIP2016模拟 题目描述 在数论领域中,人们研究的基础莫过于数字的整除关系.一般情况下,我们说整除总在两个数字间进行,例如 a | b(a能整除b)表示 b 除以 ...

  8. 将CodedUI Test 放到控制台程序中,模拟鼠标键盘操作

    CodedUI Test是微软的自动化测试工具,在VS中非常好用.可以用来模拟鼠标点击,键盘输入.但执行的时候必须要用mstest调用,无法传入参数(当然可以写入config文件中,但每次修改十分麻烦 ...

  9. 【转】【MATLAB】模拟和数字低通滤波器的MATLAB实现

    原文地址:http://blog.sina.com.cn/s/blog_79ecf6980100vcrf.html 低通滤波器参数:Fs=8000,fp=2500,fs=3500,Rp=1dB,As= ...

随机推荐

  1. DP——由蒟蒻到神犇的进阶之路

    开始更新咯 DP专题[题目来源BZOJ] 一.树形DP 1.bzoj2286消耗战 题解:因为是树形结构,一个点与根节点不联通,删一条边即可, 于是我们就可以简化这棵树,把有用的信息建立一颗虚树,然后 ...

  2. linux下安装mysql(编译mysql源码)

    编译所需软件地址 http://mysql.mirror.kangaroot.net/Downloads/  -- 下载需要的mysql版本例如mysql-5.5.39.tar.gz    目前还不太 ...

  3. Python3基础 用 函数递归求解 一个数字的阶乘

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  4. iOS 按钮设置图片和事件

    [btn addTarget:self action:@selector(searchButtonClick) forControlEvents:UIControlEventTouchUpInside ...

  5. Mysql中日期时间型解析

  6. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  7. phpcms 杂乱总结

    1.根据catid 获取 栏目名称 $CATEGORYS = getcache('category_content_'.$siteid,'commons'); $name = {$CATEGORYS[ ...

  8. MySQL生产库全库备份脚本

    创建一个单独的备份用户backup,不要用root 创建备份目录 :mkdir -p /databackup/fullbackup mysql> grant SELECT,RELOAD,SHOW ...

  9. dbf导入sqlserver的方法

    1. dbf导出为foxpro2.x. 2.打开excel,点击打开,选择dbase文件,选中第一步保存的文件. 3.另存为xls格式 4.使用sql的dts导入xls.

  10. 怎样在iis中发布asp.net网站

    以windows server2003.vs2008和sql servber2005为例.将开发完成的asp.net网站发布,将发布包放在windows server2003服务器的文件夹下.将web ...