天天看點

C算法程式設計題(三)畫表格

前言

  上一篇《C算法程式設計題(二)正螺旋》

  寫東西前還是喜歡吐槽點東西,要不然寫的真還沒意思,一直的想法是在部落格園把自己上學和工作時候整理的東西寫出來和大家分享,就像前面寫的《T-Sql學習系列》,當然這些隻是适合初學者,之後還有很多系列,寫這些東西的目的:一是真的可以幫到那些初學者;二是自己回過頭去回憶那些曾經的記憶,畢竟工作了,也沒那個時間了。

  說到時間,真的還沒時間,這段時間公司的項目要上線,都比較忙,真的好後悔前段時間沒有去好好看看書,前兩天買了兩本書《CLR VIA C#》和《漫談設計模式》,我的想法是現在學習設計模式的,說實話是真的想學,以後的路也是想走這一條。但是在博園看了一些設計模式相關的文章,發現設計模式有時候會涉及到底層的東西,大學時候隻是學的C#這門語言,沒怎麼講framework相關的東西,是以才買了那本書,希望可以惡補下,還有學習那個權限管理系統系列的計劃,現在發現真的有很多事要做,不多說了,希望自己可以熬過這段時間。

  發現自己現在還真是有點啰嗦,打住~~~。

  今天說的這個題目和上一個差不多,也是通過一定的邏輯輸出東西的。

程式要求

  程式描述:

  在中文Windows環境下,控制台視窗中也可以用特殊符号拼出漂亮的表格來。

    比如:        

        ┌─┬─┐

        │  │  │

        ├─┼─┤

        └─┴─┘        

    其實,它是由如下的符号拼接的:

        左上 = ┌

        上 =  ┬

        右上 =  ┐

        左 =  ├

        中心 =  ┼

        右 =  ┤

        左下=  └

        下 =  ┴

        右下 =  ┘

        垂直 =  │

        水準 =   ─

    本題目要求編寫一個程式,根據使用者輸入的行、列數畫出相應的表格來。

    例如使用者輸入:

    3 2

    則程式輸出:

    ┌─┬─┐

    │  │  │

    ├─┼─┤

    └─┴─┘

    使用者輸入:

    2 3

    ┌─┬─┬─┐

    │  │  │  │

    ├─┼─┼─┤

    └─┴─┴─┘

程式實作

  看到這個題目,我們可能首先想到的是,這些符号用數組存儲,我也是這樣考慮的,就像上個正螺旋有四個方向一樣,這個題目我們可以這樣考慮,這個表格可以分為四個區域,上、中、下和中間空白區域,那我們可以用數組這樣表示:

1     char *on[4] = { "┌", "─", "┬", "┐" };
2     char *center[4] = { "├", "─", "┼", "┤" };
3     char *down[4] = { "└", "─", "┴", "┘" };
4     char *space[2] = { "│", "  " };      

  符号我們表示好了,這樣我們就可以通過表格把區域分掉,來發現其中的規律。

  就會發現,其實輸出的時候我們也可以分區域輸出:頂部區域、中部區域和底部區域。頂部和底部區域是比較好輸出的,我先貼下這兩個區域的輸出代碼:

1     //輸出頂部字元
 2     for (i = 0; i < 2 * lines + 1; i++)
 3     {
 4         if (i == 0)
 5             printf("%s",on[0]);
 6         else if (i == 2 * lines)
 7             printf("%s",on[3]);
 8         else
 9         {
10             if (i % 2 == 0)
11                 printf("%s",on[2]);
12             else
13                 printf("%s",on[1]);
14         }
15     }
16     printf("\n");
17     //輸出底部字元
18     for (i = 0; i < 2 * lines + 1; i++)
19     {
20         if (i == 0)
21             printf("%s",down[0]);
22         else if (i == 2 * lines)
23             printf("%s",down[3]);
24         else
25         {
26             if (i % 2 == 0)
27                 printf("%s",down[2]);
28             else
29                 printf("%s",down[1]);
30         }
31     }
32     printf("\n");      

  rows和lines分别表示的是輸出表格的行數和列數,頂部和底部區域輸出的代碼我就不多說了,大家結合表和代碼就可以了解了,這裡我說下中部區域。

  其實中部和上下區域差不多,隻不過是中部和空白交替的,比如行數是3,那中部區域就是:空、中、空、中、空;如果行數是2,中部區域為:空、中、空;

  發現這個規律我們代碼可以這樣寫;

1     //輸出中間字元
 2     for (i = 0; i < 2 * rows - 1; i++)
 3     {
 4         if ((i + 1) % 2 == 0)
 5         {
 6             for (j = 0; j < 2 * lines + 1; j++)
 7             {
 8                 if (j == 0)
 9                     printf("%s",center[0]);
10                 else if (j == 2 * lines)
11                     printf("%s",center[3]);
12                 else
13                 {
14                     if (j % 2 == 0)
15                         printf("%s",center[2]);
16                     else
17                         printf("%s",center[1]);
18                 }
19             }
20         }
21         else
22         {
23             for (k = 0; k < 2 * lines + 1; k++)
24             {
25                 if ((k + 1) % 2 == 0)
26                     printf("%s",space[1]);
27                 else
28                     printf("%s",space[0]);
29             }
30         }
31         printf("\n");
32     }      

  中和空的輸出邏輯和頂部和底部的輸出邏輯是差不多的。

  這個題目如果你思路清晰的話,是很簡單的。如果大家也有更好的實作方法,歡迎交流。。。

  完成程式代碼:

C算法程式設計題(三)畫表格
C算法程式設計題(三)畫表格
1 #include "stdio.h"
 2 #include "string.h"
 3 
 4 void main()
 5 {
 6     char *on[4] = { "┌", "─", "┬", "┐" };
 7     char *center[4] = { "├", "─", "┼", "┤" };
 8     char *down[4] = { "└", "─", "┴", "┘" };
 9     char *space[2] = { "│", "  " };
10     int rows, lines;
11     int i, j, k;
12     //printf("%c",on[0]);
13     scanf("%d",&rows);
14     scanf("%d",&lines);
15 
16     //輸出頂部字元
17     for (i = 0; i < 2 * lines + 1; i++)
18     {
19         if (i == 0)
20             printf("%s",on[0]);
21         else if (i == 2 * lines)
22             printf("%s",on[3]);
23         else
24         {
25             if (i % 2 == 0)
26                 printf("%s",on[2]);
27             else
28                 printf("%s",on[1]);
29         }
30     }
31     printf("\n");
32 
33     //輸出中間字元
34     for (i = 0; i < 2 * rows - 1; i++)
35     {
36         if ((i + 1) % 2 == 0)
37         {
38             for (j = 0; j < 2 * lines + 1; j++)
39             {
40                 if (j == 0)
41                     printf("%s",center[0]);
42                 else if (j == 2 * lines)
43                     printf("%s",center[3]);
44                 else
45                 {
46                     if (j % 2 == 0)
47                         printf("%s",center[2]);
48                     else
49                         printf("%s",center[1]);
50                 }
51             }
52         }
53         else
54         {
55             for (k = 0; k < 2 * lines + 1; k++)
56             {
57                 if ((k + 1) % 2 == 0)
58                     printf("%s",space[1]);
59                 else
60                     printf("%s",space[0]);
61             }
62         }
63         printf("\n");
64     }
65 
66     //輸出底部字元
67     for (i = 0; i < 2 * lines + 1; i++)
68     {
69         if (i == 0)
70             printf("%s",down[0]);
71         else if (i == 2 * lines)
72             printf("%s",down[3]);
73         else
74         {
75             if (i % 2 == 0)
76                 printf("%s",down[2]);
77             else
78                 printf("%s",down[1]);
79         }
80     }
81     printf("\n");
82 }      

View Code

  運作結果:

作者:田園裡的蟋蟀

微信公衆号:你好架構

出處:http://www.cnblogs.com/xishuai/

公衆号會不定時的分享有關架構的方方面面,包含并不局限于:Microservices(微服務)、Service Mesh(服務網格)、DDD/TDD、Spring Cloud、Dubbo、Service Fabric、Linkerd、Envoy、Istio、Conduit、Kubernetes、Docker、MacOS/Linux、Java、.NET Core/ASP.NET Core、Redis、RabbitMQ、MongoDB、GitLab、CI/CD(持續內建/持續部署)、DevOps等等。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。

分享到:

QQ空間

新浪微網誌

騰訊微網誌

微信

更多

繼續閱讀