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

  在计算器上、电梯上、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. 一段神奇的代码-关于PHP字符变量奇怪现象的解释

    首先神奇的PHP是支持字符数据类型的,有同学就写了这样一段代码: for ($c = 'a'; $c <= 'z'; $c++) { echo $c . ' '; } 然而结果却不是他想要的a到 ...

  2. word页眉页脚 首页 索引 正文各不同的处理方法

    1.在目录和正文之间,加入分隔符——分节符——下一页,然后再添加页眉页脚,然后再添加索引:

  3. spark中数据的读取与保存

    1.文本文件 (1)读取文本文件 JavaRDD<String> input =sc.textFile(dir) (2)保存文本文件 result.saveAsTextFile(dir)) ...

  4. RAC时间同步的两种方法

    集群时间同步服务在集群中的两个 Oracle RAC 节点上执行以下集群时间同步服务配置.Oracle Clusterware 11g 第 2 版及更高版本要求在部署了 Oracle RAC 的集群的 ...

  5. hadoop-1.x的运行实例

    我的环境是hadoop-0.20.2,eclipse:SDK-3.3.2, 源数据为: Apr 23 11:49:54 hostapd: wlan0: STA 14:7d:c5:9e:fb:84 Ap ...

  6. Raphael的鼠标over move out事件

    Raphael的鼠标over move out事件 <%@ page language="java" contentType="text/html; charset ...

  7. Bootstrap入门(十)组件4:按钮组与下拉菜单结合

    Bootstrap入门(十)组件4:按钮组与下拉菜单结合   先引入本地的CSS文件和JS文件(注:1.bootstrap是需要jQuery支持的.2.需要在<body>当中添加) < ...

  8. jquery.validate.js之自定义表单验证规则

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  9. eclipse安装git插件

    用Eclipse开发,有时需要团队协作,git就是个比较好的选择.下面简单介绍一下git插件的安装方法:   1.Help -- install new software 打开插件安装界面 2.点ad ...

  10. css3 UI 修饰——回顾

    1.box-shadow 属性向框添加一个或者多个阴影. 语法: box-shadow: h-shadow v-shadow blur spread color inset h-shadow 必须,水 ...