结构化编程的三重境界:见山是山:朴素的直观逻辑编程

简介:

《五灯会元》卷十七中,有一则青原惟信禅师的语录:“老僧三十年前未参禅时,见山是山,见水是水。及至后来亲见知识,有个入处,见山不是山,见水不是水。而今得个休歇处,依前见山只是山,见水只是水。”这描述了我们对世界的一个观察和思考的过程,只要我们对事物进行执着的观察和思考,那在认识事物的过程中总是会经过以上的三个不同的过程和境界。

我们在本节,将通过一个案例描述作为程序员应如何对待结构化编程的思考。首先描述业务:在酒店退房业务中有如下业务规则:按酒店的住房规则客户过夜算一天,次日12时以后、18时以前办理退房手续者,酒店加收半天房费;次日18时以后办理退房手续者,加收一天房费。现在我们将按这个业务规则编写一段程序来计算用户住了几天。

 

 

在编写具体的代码前,一般笔者的建议是先想一想你要做什么?不要想都不想就开始编写代码,如果是这样的话,你所有的代码都将是无效,或者很难管理。

从需求分析,在酒店退房的业务中至少需要以下数据:入住日期,退房日期,住了多少天。然后计算从入住日期到退房日期过了几个晚上,再以及退房日期的具体时间,计算是否要多算天数。我们按最朴实的逻辑出发,编写第一次的代码。

 
  1. static void Main(string[] args)  
  2. {  
  3.     DateTime indate = new DateTime(2008, 9, 30);                //入住时间  
  4.     DateTime outdate = new DateTime(2008, 10, 5);            //退房时间  
  5.     double days = (outdate - indate).Days;                     //计算入住了几天  
  6.  
  7.     if (outdate.Hour <= 12)                                //在12点之前  
  8.     {  
  9.         days += 0;  
  10.     }  
  11.  
  12.     if (outdate.Hour > 12 && outdate.Hour <= 18)                //在12点和18点之间  
  13.     {  
  14.         days += 0.5;  
  15.     }  
  16.  
  17.     if (outdate.Hour > 18)                                    //在18点之后  
  18.     {  
  19.         days++;  
  20.     }  
  21.     System.Console.WriteLine("你的入住结算信息/n入住时间{0}/n退房时间{1}/n一共入住了{2}天", indate, outdate, days);  
  22.  
  23. }  

从结果的输出可以了解到,客户是在2008930日午夜入住,在2008105日午夜退房(这个入住退房时间实在诡异啊),我们的程序计算得到客户住了5天,这个数据和我们预期的数据是一样的。

但如果我们将退房时间改成以下数据

 

DateTime indate  =   new  DateTime( 2008 9 30 );  // 入住时间
DateTime outdate  =   new  DateTime( 2008 10 5 12 15 12 );  // 退房时间

 

你会惊讶的发现不是我们预期的5.5天,而依然是5天。换句话说,当退房时间是121512秒的时候,程序的逻辑没有进入到以下的判断

 

 

if  (outdate.Hour  >   12   &&  outdate.Hour  <=   18 ) // 在12点和18点之间
{
days 
+=   0.5 ;
}

 

 

冷静的想想,其实计算机并没有做错,的确是我们的逻辑有漏洞。虽然现在退房时间超过了12点,但该日期时间的小时部分的值还是12,因此出现了我们不乐意见到的逻辑错误。所以我们得到一个概念:DataTime结构的Hour成员的值不是我们通常意义上的几点钟,而是时间的小时部分的值。具体是否一个整时,需要我们自己进行判断和处理。


本文转自shyleoking 51CTO博客,原文链接:http://blog.51cto.com/shyleoking/805181


相关文章
|
1天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
25天前
|
设计模式 程序员 Serverless
探索编程之美:从代码细节到技术哲学
【10月更文挑战第28天】在这篇文章中,我们将一起走进编程的世界,探索那些隐藏在代码行间的艺术与哲理。通过深入浅出的讲解和实际的代码示例,我们不仅能够学习到技术层面的知识,更能体会到编程作为一种创造性活动所带来的乐趣和启示。无论你是初学者还是资深开发者,都能在这段旅程中找到新的视角和灵感。
45 11
|
7月前
|
存储 算法 程序员
代码之韵:编程中的诗意与逻辑
在数字的世界里,每一行代码都如同诗句般细腻而富有节奏感。本文将探讨编程不仅仅是一门科学或技术,更是一种艺术形式,它融合了逻辑思维的严谨和创造力的灵动。我们将通过分析编程的核心概念,如变量、控制结构、函数等,来揭示它们背后的美学原则和哲学思考。同时,我们还将讨论如何在日常的编程实践中寻找和创造美感,以及这种美感如何影响我们的工作效率和产品的用户体验。
|
程序员 测试技术 开发工具
高端的程序员通常具有以下一些朴素的编程方式
高端的程序员通常具有以下一些朴素的编程方式
102 2
|
算法 算法框架/工具
图论算法实例分析|趣味象棋
图论(graph theory)是数学的一个分支,以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
127 0
图论算法实例分析|趣味象棋
|
缓存 NoSQL 关系型数据库
高端的程序员,都有哪些朴素的编程方式?
在当今互联网时代,程序员已经成为了一类备受关注的职业。而高端的程序员往往有化代码为神奇的能力,那么今天就邀请大家,一起分享下都有哪些朴素的编程方式?
116 1
|
机器学习/深度学习 人工智能 自然语言处理
扩散模型背后数学太难了,啃不动?谷歌用统一视角讲明白了
扩散模型背后数学太难了,啃不动?谷歌用统一视角讲明白了
243 0
|
算法 C语言 Python
01【C语言 & 趣味算法】百钱百鸡问题(问题简单,非初学者请忽略叭)。请注意算法的设计(程序的框架),程序流程图的绘制,算法的优化。
01【C语言 & 趣味算法】百钱百鸡问题(问题简单,非初学者请忽略叭)。请注意算法的设计(程序的框架),程序流程图的绘制,算法的优化。
01【C语言 & 趣味算法】百钱百鸡问题(问题简单,非初学者请忽略叭)。请注意算法的设计(程序的框架),程序流程图的绘制,算法的优化。
|
小程序 JavaScript 前端开发
兴趣编程六步法
欢迎来到我的小院,在当今时代,科技力量代表一个国家的核心竞争力,其中计算机编程技术尤为重要,可以从中学习逻辑分析能力,业务抽象能力,专注思考能力等等,美国等一些发达国家,已经把编程教育纳入小学课本中,所以我们也需要加快步伐,掌握编程的一些理念和实战技巧。
兴趣编程六步法