初学者编程编程实战指南 (4) - 由一个简单的例子学习抽象

抽象,就是由具体的例子范化到更一般的情况,抽象对计算机学科是非常重要的。以我们学习的函数为例,实际就是观察到有些操作反复使用,我们将其抽象成一个功能模块,使其只写一次就可以多次调用。可以参见

http://en.wikipedia.org/wiki/Abstraction_principle_(computer_programming)

现在我们有一组数,int arr[N] = {1, 2, 3, 4, 5}; 希望输出格式如下

1 2 3 4 5

OnlineJudge的题目一般要求5后面没有空格,然后换行。所以下面的代码不行:

 1 #include <stdio.h>
 2 #define N 5
 3 int main(void)
 4 {
 5     int i, arr[N] = {1, 2, 3, 4, 5};
 6     for(i = 0; i < N; i++)
 7         printf("%d ", arr[i]);
 8     printf("\n");
 9     return 0;
10 }

我写过下面的代码,第一个元素单独处理,随后的元素前面都有一个空格,最后再来一个换行。

 1 #include <stdio.h>
 2 #define N 5
 3 int main(void)
 4 {
 5     int i, arr[N] = {1, 2, 3, 4, 5};
 6     printf("%d", arr[0]);
 7     for(i = 1; i < N; i++)
 8         printf(" %d", arr[i]);
 9     printf("\n");
10     return 0;
11 }

是不是感觉不清爽,没错,小小的一个功能居然分了三种情况。也许,最后一个元素才应该被区别对待,看下面的代码

 1 #include <stdio.h>
 2 #define N 5
 3 int main(void)
 4 {
 5     int i, arr[N] = {1, 2, 3, 4, 5};
 6     for(i = 0; i < N - 1; i++)
 7         printf("%d ", arr[i]);
 8     printf("%d\n", arr[N - 1]);
 9     return 0;
10 }

确实少了一个printf,只有两个情况。 能不能再统一呢? 注意到空格和换行都是字符,可以得到如下的抽象:

每输出一个元素后都希望接一个分隔字符

1 #include <stdio.h>
2 #define N 5
3 int main(void)
4 {
5     int i, arr[N] = {1, 2, 3, 4, 5};
6     for(i = 0; i < N; i++)
7         printf("%d%c", arr[i], i == N - 1 ? ‘\n‘ : ‘ ‘);
8     return 0;
9 }

%c 是一个绝好的抽象,从具体的空格和换行符提升而来。我们很快意识到如果想输出

1,2,3,4,5

则只需要把空格换成逗号而已。这说明

具体的字符可能会变的,而分隔符才是这个问题更高层次的抽象

时间: 2024-10-12 11:47:48

初学者编程编程实战指南 (4) - 由一个简单的例子学习抽象的相关文章

关于apriori算法的一个简单的例子

apriori算法是关联规则挖掘中很基础也很经典的一个算法,我认为很多教程出现大堆的公式不是很适合一个初学者理解.因此,本文列举一个简单的例子来演示下apriori算法的整个步骤. 下面这个表格是代表一个事务数据库D,其中最小支持度为50%,最小置信度为70%,求事务数据库中的频繁关联规则. Tid 项目集 1  面包,牛奶,啤酒,尿布 2  面包,牛奶,啤酒 3  啤酒,尿布 4  面包,牛奶,花生 apriori算法的步骤如下所示: (1)生成候选频繁1-项目集C1={{面包},{牛奶},{

【Python】一个简单的例子

问题描述: Python基础篇 参考资料: (1)http://www.cnblogs.com/octobershiner/archive/2012/12/04/2801670.html (2)http://www.cnblogs.com/itech/archive/2010/06/20/1760345.html 例子: 求解Fibonacci glb_var.py gl_count=1 path.py # coding:utf-8 ''' Created on 2014-4-28 @autho

Android Handler的一个简单使用例子

在前面 开启一个线程Thread并用进度条显示进度 这篇文章里,我们用线程实现了这么一个简单的功能,就是点击按钮,加载进度条.但是有没有发现,点击一次之后,再次点击就会没效.我们可是需要每次点击都要显示下一张图片的.永盈会娱乐城 这里就需要引入 Android 的消息机制了,简单来说,就是 Handler.Looper 还有 Message Queue的使用.这里我们用一个简单的例子来说明 Handler 的使用,就是每次点击按钮,给消息队列发送一个数字 5.还是在 PaintingActivi

一个简单的例子让你了解React-Redux

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 一个简单的例子让你了解React-Redux - 小平果的欢乐谷 - 博客频道 - CSDN.NET 小平果的欢乐谷 你的到来会让我很意外,谢谢光临! 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅的Python,终于等

Linux内核中的信号机制--一个简单的例子【转】

本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123(http://blog.csdn.NET/ce123) 信号机制是类UNIX系统中的一种重要的进程间通信手段之一.我们经常使用信号来向一个进程发送一个简短的消息.例如:假设我们启动一个进程通过socket读取远程主机发送过来的网络数据包,此时由于网络因素当前主机还没有收到相应的数据,当前进程被设置

duilib DirectUI库里面的一个简单的例子RichListDemo

http://blog.csdn.net/zengraoli/article/details/9993153 2013-08-16 00:08 3289人阅读 评论(2) 收藏 举报 目录(?)[+] 1.首先来看这里的CRichListWnd 已经不再是从CWindowWnd继承了 classCRichListWnd:publicWindowImplBase 从WindowImplBase中,可以看到有三个抽象函数: virtualCDuiStringGetSkinFolder()=0; vi

一个简单的例子搞懂ES6之Promise

ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步是这样的: * 每当我需要执行一次异步操作的时候,我都需要new一个promise对象 * 每一个异步操作的Promise对象都需要设定一个成功执行的条件和成功的回调.一个失败的条件和失败的回调 * Promise对象可通过执行then()方法获得成功的回调信息 * Promise对象可通过执行ca

socket编程——一个简单的例子(转)

原文地址:http://blog.csdn.net/wind19/article/details/6156339 从一个简单的使用TCP例子开始socket编程,其基本步骤如下: server                                                  client +++++++                                          ++++++++ 创建socket                               

socket编程——一个简单的例子

从一个简单的使用TCP例子开始socket编程,其基本步骤如下: server                                                  client +++++++                                          ++++++++ 创建socket                                          创建socket +++++++