zoukankan      html  css  js  c++  java
  • 初学者编程实战指南 (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

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

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

  • 相关阅读:
    GIS开发站点收藏
    读取Excel中的数据到DataSet
    SPSS统计功能与模块对照表
    相关性分析主要源码
    Matlab典型论坛
    EasyUI入门视频教程
    利用EF ORM Mysql实体运行程序出错解决方案
    小议
    六、 从Controller中访问模板数据(ASP.NET MVC5 系列)
    五、 创建连接串连接本地数据库(ASP.NET MVC5 系列)
  • 原文地址:https://www.cnblogs.com/4bytes/p/4166213.html
Copyright © 2011-2022 走看看