程序点滴001_Python模拟点阵数字
尝试过很多编程语言,写过不少程序(当然,基本上都是些自娱自乐或给自己用的工具类的小玩意儿),逐渐认识到编写程序是一个不断完善、不断优化的过程——编程首先要有一个想法(目标),围绕这个目标形成最基本的功能逻辑,测试证明功能有效之后就算目标基本实现了。随后,可以扩展基本功能的应用领域,加强程序的容错能力和交互性,逐渐形成一个更完善更健壮的程序。以下通过一个小例子来对此过程稍作展示:
在计算器上、电梯上、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模拟点阵数字的更多相关文章
- 微信小程序车牌号码模拟键盘输入
微信小程序车牌号码模拟键盘输入练习, 未经允许,禁止转载,抄袭,如需借鉴参考等,请附上该文章连接. 相关资料参考:https://blog.csdn.net/littlerboss/article/d ...
- 如何在 ASP.NET 应用程序中实现模拟用户身份(在ASP.NET中以管理员身份运行网站)
前言 在实际的项目开发中,我们可能会需要调用一些非托管程序,而有些非托管程序需要有更高的身份权限才能正确执行.本文介绍了如何让IIS承载的ASP.NET网站以特定的账户执行,比如Administrat ...
- JAVA 基础编程练习题13 【程序 13 根据条件求数字】
13 [程序 13 根据条件求数字] 题目:一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少? 程序分析:在 10 万以内判断,先将该数加上 100 后 ...
- JAVA 基础编程练习题11 【程序 11 求不重复数字】
11 [程序 11 求不重复数字] 题目:有 1.2.3.4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数字都是 1.2.3.4.组成所有的排列后 ...
- PCB布线设计-模拟和数字布线的异同(转)
工程领域中的数字设计人员和数字电路板设计专家在不断增加,这反映了行业的发展趋势.尽管对数字设计的重视带来了电子产品的重大发展,但仍然存在,而且还会一直存在一部分与模拟或现实环境接口的电路设计.模拟和数 ...
- Java初学者作业——编写Java程序, 在控制台输入数字,计算表达式1-2+3-4……+(2*n-1)+2*n的结果。
返回本章节 返回作业目录 需求说明: 编写Java程序, 在控制台输入数字 计算表达式1-2+3-4--+(2*n-1)+2*n的结果. 实现思路: (1)声明变量 n 和 sum,用于存储用户输入的 ...
- 2018.07.26NOIP模拟 魔法数字(数位dp)
魔法数字 题目背景 ASDFZ-NOIP2016模拟 题目描述 在数论领域中,人们研究的基础莫过于数字的整除关系.一般情况下,我们说整除总在两个数字间进行,例如 a | b(a能整除b)表示 b 除以 ...
- 将CodedUI Test 放到控制台程序中,模拟鼠标键盘操作
CodedUI Test是微软的自动化测试工具,在VS中非常好用.可以用来模拟鼠标点击,键盘输入.但执行的时候必须要用mstest调用,无法传入参数(当然可以写入config文件中,但每次修改十分麻烦 ...
- 【转】【MATLAB】模拟和数字低通滤波器的MATLAB实现
原文地址:http://blog.sina.com.cn/s/blog_79ecf6980100vcrf.html 低通滤波器参数:Fs=8000,fp=2500,fs=3500,Rp=1dB,As= ...
随机推荐
- UVa 10034 - Freckles
题目大意:给出n个点的坐标(x,y),要求用线段将n个点连接起来,求最小的线段和. 最小生成树问题,用Kruskal算法进行求解,其中用到了并查集.将所有的点连接,构成一张图,对每一条边进行编号,两点 ...
- linux 5个查找命令
1. find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> ...
- ajax 跨域了 cors
<?php /** * Author: humanhuang * Date: 13-12-17 */ header('Access-Control-Allow-Origin:*'); heade ...
- 移动硬盘/U盘装Windows 7旗舰版(VHD版)
真正的移动版WIN7,在移动硬盘/U盘上运行的WIN7 工具准备 - 联想Y450本本,已安装Windows 7旗舰版(或者WINPE3.0版),用来给移动WIN7做引导 -Win7.vhd,15G, ...
- Mybatis学习(8)逆向工程
什么是逆向工程: mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper.java,mapper.xml.po.. ...
- js原生拓展网址——mozilla开发者
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript https://developer.mozilla.org/zh-CN/docs/Web ...
- Div里面载入另一个页面的实现(取代框架)(AJax)
随着框架越来越不火了,HTML5就不对框架支持了,iframe也只有url了,Div就担当了此大任 DIV+CSS在页面部局确实也很让人满意,使用也更方便 今天突然遇到一个问题,那就是需要导入另一个页 ...
- JavaWeb三层结构---课设02
收获总结 1三层架构模式 区分层次的目的即为了“高内聚,低耦合”的思想 分层介绍: Javaweb设计分为三层:数据访问层,业务逻辑层和表示层. 数据访问层:只提供对基本数据的访问,不涉及任何的业务逻 ...
- IM比较SipDroid/IMSDroid/CSipsimple/Linphone/Webrtc
一) sipdroid1)架构sip协议栈使用JAVA实现,音频Codec使用skype的silk(Silk编解码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器 ...
- POJ1077&&HDU1043(八数码,IDA*+曼哈顿距离)
Eight Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30127 Accepted: 13108 Special ...