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

  在计算器上、电梯上、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. 2781: [JSOI2007]文本生成器

    2781: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 8  Solved: 4[Submit][Status][We ...

  2. OC强弱引用的使用规则

    强弱引用的唯一区别只是体现在对象的消亡上. 当一个对象不再有强引用指向它时,它就会被销毁. 弱引用不持有对象,不计入自动引入计数,所以不用考虑它销毁的问题.

  3. UED大全

    http://www.baiduux.com/  百度UFOhttp://ued.sohu.com/  搜狐UEDhttp://ued.taobao.com/  淘宝UEDhttp://www.ued ...

  4. spring mvc rest 方式

    handler中编写方式: @RequestMapping("/{userName}/ajaxUser3.do") @ResponseBody public UserInfo aj ...

  5. Spring util-namespace下标签相关操作

    java代码 package com.stono.sprtest; import java.util.List; import java.util.Map; import java.util.Set; ...

  6. 关于MVC结构

    简单的记录,只是想记录一下现在对MVC的理解. MVC,即模型(MODEL),视图(VIEW),控制器(CONTROLLER) 模型是数据模型 视图是图形界面 控制器是在两个之间的控制部分,用来将数据 ...

  7. 【初码干货】关于.NET玩爬虫这些事

    这几天在微信群里又聊到.NET可以救中国但是案例太少不深的问题,我说.NET玩爬虫简直就是宇宙第一,于是大神朱永光说,你为何不来写一篇总结一下? 那么今天就全面的来总结一下,在.NET生态下,如何玩爬 ...

  8. 微信小程序教程(第二篇)

    如何注册接入小程序及搭建开发环境 小程序接入流程 注册 主要分为注册邮箱与信息登记. 需要重新申请一个新的微信公众帐号,不能使用服务号.订阅号或企业号使用的公众帐号 (微信公众帐号分为四种类型:订阅号 ...

  9. JS如何实现点击页面其他地方隐藏菜单?

    方法一: $("#a").on("click", function(e){  $("#menu").show();    $(documen ...

  10. js在新页面中返回到上一页浏览的历史位置

    在微信浏览器中浏览页面时,在当前页面中当我们将页面往下滚动到某一个位置时,可能我们就会点击某个链接而页面跳转到了另外一个页面,而当我们又返回到上一个页面时我们会发现那个页面还停留在我们之前浏览的位置, ...