程式雖小,智慧並存

来源:https://www.cnblogs.com/hsiang/archive/2019/06/22/11069948.html
-Advertisement-
Play Games

在IT行業中,通常被人稱為:碼農,程式猿。在日常開發中,我們不能滿足於代碼的搬運,不能只會百度搜索,Copy和Paste。 ...


概述

IT行業中,通常被人稱為:碼農,程式猿。在日常開發中,我們不能滿足於代碼的搬運,不能只會百度搜索,CopyPaste。猶記春節假期,走親訪友,觥籌交錯,席間有一位長輩問:你現在做什麼工作呀?我很驕傲地說:我目前是系統架構師,主要負責系統的優化與重構。可是他卻愣了很久,但當表妹在旁邊補上一句“碼農“時,長輩瞬間秒懂,笑呵呵的說道:不錯不錯。卻留我受傷的心在風中凌亂。

為了避免成為碼農,我們必須對編碼保持熱情,並持續學習;必須保持好奇心,樂於探求事物本質;必須對所做的工作及時總結,主動優化代碼,讓系統變得更加有機;必須主動嘗試更好的開發方式、更先進的工具,來提升開發效率,並想辦法避免重覆性的工作;必須不斷改進設計,將編程變成創造性的工作。

以下以一些簡單的小例子,介紹C#基礎內容,拋磚引玉,共同進步,如有不足之處,還請指正。

給定一個不超過5位數的正整數,判斷是幾位數,並逐行列印個位,十位,百位,千位,萬位上的值

通過分析,此處主要有兩個功能:

  1. 判斷是幾位數
  2. 列印每一個位上的值

以下有幾種方案計算位數(孰優孰劣,歡迎點評):

1. 通過比較法進行判斷,簡單直接有效

 1 /// <summary>
 2         /// 判斷位數,直接比較
 3         /// </summary>
 4         /// <param name="num"></param>
 5         static int CheckDigit1(int num)
 6         {
 7             int digit = 0;
 8             if (num < 10)
 9             {
10                 digit = 1;
11             }
12             else if (num < 100)
13             {
14                 digit = 2;
15             }
16             else if (num < 1000)
17             {
18                 digit = 3;
19             }
20             else if (num < 10000)
21             {
22                 digit = 4;
23             }
24             else if (num < 100000)
25             {
26                 digit = 5;
27             }
28             else
29             {
30                 digit = -1;
31             }
32             Console.WriteLine(digit);
33             return digit;
34         }

2. 通過整除法進行判斷

 1 /// <summary>
 2         /// 判斷位數:引入了不該有的計算
 3         /// </summary>
 4         /// <param name="num"></param>
 5         static int CheckDigit2(int num)
 6         {
 7             int digit = 0;
 8             if (num / 10000 > 0)
 9             {
10                 digit = 5;
11             }
12             else if (num / 1000 > 0)
13             {
14                 digit = 4;
15             }
16             else if (num / 100 > 0)
17             {
18                 digit = 3;
19             }
20             else if (num / 10 > 0)
21             {
22                 digit = 2;
23             }
24             else {
25                 digit = 1;
26             }
27             Console.WriteLine(digit);
28             return digit;
29         }

3. 引入折半思想進行判斷

 1  /// <summary>
 2         /// 採用折半思想
 3         /// </summary>
 4         /// <param name="num"></param>
 5         static int CheckDigit3(int num)
 6         {
 7             int digit = 0;
 8             if (num >= 100)
 9             {
10                 if (num >= 10000)
11                 {
12                     digit = 5;
13                 }
14                 else if (num >= 1000)
15                 {
16                     digit = 4; ;
17                 }
18                 else {
19                     digit = 3;
20                 }
21             }
22             else {
23                 if (num >= 10)
24                 {
25                     digit = 2;
26                 }
27                 else {
28                     digit = 1;
29                 }
30             }
31             Console.WriteLine(digit);
32             return digit;
33         }

4. 通過轉換為字元串,判斷字元串的長度來確定位數

 1 /// <summary>
 2         /// 通過字元串計算位數
 3         /// </summary>
 4         /// <param name="num"></param>
 5         static int CheckDigit4(int num) {
 6             string strNum = num.ToString();
 7             int digit = strNum.Length;
 8             Console.WriteLine(digit);
 9             return digit;
10         }

列印每一位上的數字,按照從低位到高位進行列印(通過相減的方式)

 1 /// <summary>
 2         /// 列印每一位數字,從低到高
 3         /// </summary>
 4         /// <param name="num"></param>
 5         /// <param name="digit"></param>
 6         static void PrintNumber(int num, int digit) {
 7             int tmp = num;
 8             for (int i = 0; i < digit; i++) {
 9                 int n = tmp / 10;
10                 Console.WriteLine(tmp - n * 10);
11                 tmp = n;
12             }
13         }

另一種方案:列印每一位上的數字,按照從低位到高位進行列印(通過求餘的方式)

 1   /// <summary>
 2         /// 列印每一位數字,從低到高
 3         /// </summary>
 4         /// <param name="num"></param>
 5         /// <param name="digit"></param>
 6         static void PrintNumber2(int num, int digit) {
 7             int tmp = num;
 8             for (int i = 0; i < digit; i++)
 9             {
10                 int n = tmp / 10;
11                 Console.WriteLine(tmp % 10);
12                 tmp = n;
13             }
14         }

從高位到低位進行列印(For迴圈)

 1    /// <summary>
 2         /// 從高到低列印
 3         /// </summary>
 4         /// <param name="num"></param>
 5         /// <param name="digit"></param>
 6         static void PrintNumber3(int num, int digit)
 7         {
 8             int tmp = num;
 9             for (int i = 0; i < digit; i++)
10             {
11                 int n = tmp / (int)Math.Pow(10, digit - i - 1);
12                 Console.WriteLine(n);
13                 tmp -= n * (int)Math.Pow(10, digit - i - 1);
14             }
15         }

另外一種方案:從高位到低位進行列印,採用while迴圈

 1    static void PrintNumber4(int num, int digit) {
 2             int tmp = num;
 3             int div = (int)Math.Pow(10, digit - 1);
 4             while (tmp > 0) {
 5                 int n = tmp / div;
 6                 Console.WriteLine(n);
 7                 tmp -= n * div;
 8                 div /= 10;
 9             }
10         }

列印一個邊長為n的正方形

功能說明:主要是列印一個,長和寬個數相同的*號的形狀。

通過分析,主要有兩點:

  1. 第一行與最後一行,第一列與最後一列,都是*號,其他都是空格;
  2. 最後一列需要換行
 1  /// <summary>
 2         /// 列印一個邊長為n的正方形
 3         /// </summary>
 4         /// <param name="n"></param>
 5         static void PrintSquare1(int n) {
 6             for (int i = 0; i < n; i++) {
 7                 for (int j = 0; j < n; j++) {
 8                     string info = string.Empty;
 9                     if (i == 0 || i == n - 1 || j == 0 || j == n - 1)
10                     {
11                         info = "*";
12                     }
13                     else {
14                         info = " ";
15                     }
16                     if (j == n - 1)
17                     {
18                         Console.WriteLine(info);
19                     }
20                     else {
21                         Console.Write(info);
22                     }
23                 }
24             }
25         }

求100以內的奇數和

定義:不能被2整除的整數叫奇數,也叫單數,13579、……。

通過分析發現:只要對2求餘,餘數大於0,則為奇數,如下所示:

 1 /// <summary>
 2         /// 求100以內的奇數的和
 3         /// </summary>
 4         static void GetOddSum() {
 5             int total = 0;
 6             for (int i = 0; i < 100; i++) {
 7                 if (i % 2 != 0) {
 8                     total += i;
 9                 }
10             }
11             Console.WriteLine(total);
12         }

另外一種方案:奇數與偶數是交替出現的,如第一個數是奇數,則加2還是奇數,如下所示:

 1  /// <summary>
 2         /// 求100以內的奇數的和
 3         /// </summary>
 4         static void GetOddSum2()
 5         {
 6             int total = 0;
 7             for (int i = 1; i < 100; i += 2)
 8             {
 9                 total += i;
10             }
11             Console.WriteLine(total);
12         }

列印九九乘法表

正向九九乘法表,通過分析發現,第一個乘數(j)小於等於第二個乘數(i),如下所示:

 1 /// <summary>
 2         /// 列印九九乘法表
 3         /// </summary>
 4         static void PrintMultiplicationTable() {
 5             for (int i = 0; i < 9; i++) {
 6                 for (int j = 0; j < 9; j++)
 7                 {
 8                     if (i > j)
 9                     {
10                         Console.Write("{0}*{1}={2} ", j + 1, i + 1, (i + 1) * (j + 1));
11                     }
12                     if (i == j) {
13                         Console.WriteLine("{0}*{1}={2} ", j + 1, i + 1, (i + 1) * (j + 1));
14                     }
15                 }
16             }
17         }

另外一種方案:倒打九九乘法表,通過分析發現,第一個乘數(j)大於等於第二個乘數(i),如下所示:

 1  /// <summary>
 2         /// 倒打九九乘法表
 3         /// </summary>
 4         static void PrintMultiplicationTable2()
 5         {
 6             for (int i = 0; i < 9; i++)
 7             {
 8                 for (int j = 0; j < 9; j++)
 9                 {
10                     if (i < 9 - j - 1)
11                     {
12                         Console.Write("{0}*{1}={2} ", j + 1, 9 - i, (9 - i) * (j + 1));
13                     }
14                     else if (i == 9 - j - 1)
15                     {
16                         Console.WriteLine("{0}*{1}={2} ", j + 1, 9 - i, (9 - i) * (j + 1));
17                     }
18                 }
19             }
20         }

斐波那契數列

定義:斐波那契數列,又稱黃金分割數列,指的是這樣一個數列:0112358132134、……在數學上,斐波納契數列以如下被以遞歸的方法定義:F0=0F1=1Fn=F(n-1)+F(n-2)n2nN*)。

通過分析發現:

  1. 0項是0,第1項是第一個1
  2. 這個數列從第3項開始,每一項都等於前兩項之和。
 1 /// <summary>
 2         /// 列印斐波那契數列,10以內
 3         /// </summary>
 4         static void PrintFibonacci() {
 5             int cur = 0;
 6             int pre1 = 0;
 7             int pre2 = 0;
 8             for (int i = 0; i < 30; i++) {
 9                 if (i == 0)
10                 {
11                     pre2 = 0;
12                     pre1 = 0;
13                     cur = 0;
14                 }
15                 else if (i == 1)
16                 {
17                     pre2 = 0;
18                     pre1 = 0;
19                     cur = 1;
20                 }
21                 else if (i == 2) {
22                     pre2 = pre1;
23                     pre1 = 1;
24                     cur = 1;
25                 }
26                 else {
27                     pre2 = pre1;
28                     pre1 = cur;
29                     cur = pre1 + pre2;
30                 }
31                 Console.WriteLine(cur);
32             }
33         }

備註

我們永遠不會忘記寫的第一個程式--HelloWorld!”因為那承載著程式員最初的夢想改變世界。

雖然我們不一定能成為大師,但從不甘心做一個碼農,程式員不是碼農,碼農也不是真正的程式員。

我們可以自謙,可以自嘲,但不能自我定位於碼農,止步於碼農。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、JLabel 標簽 構造函數: JLabel() JLabel(String text) JLabel(String text,int align) //第二個參數設置文本的對齊方式,常量,比如SwingConstants.LEFT/RIGHT。 JLabel(Icon image) //顯示圖 ...
  • 先做個自我介紹,我13年考上一所很爛專科民辦的學校,學的是生物專業,具體的學校名稱我就不說出來獻醜了。13年我就輟學了,我在那樣的學校,一年學費要1萬多,但是根本沒有人學習,我實在看不到希望,我就退學了。 退學後我也迷茫,大專都沒有畢業,我真的不知道我能幹什麼,我在糾結著我能做什麼。所以輟學後我一段 ...
  • 一、插入排序的介紹 插入排序的工作方式非常像人們排序一手撲克牌一樣。開始時,我們的左手為空並且桌子上的牌面朝下。然後,我們每次從桌子上拿走一張牌並將它插入左手中正確的位置。為了找到一張牌的正確位置,我們從右到左將它與已在手中的每張牌進行比較,如下圖所示: 那插曲排序是如何藉助上面提到的思想來實現排序 ...
  • 看了劉江老師教程這麼多天,卧槽,我才發現他也曾躋身於行伍之間,interesting 劉老師這波講解很到位,告訴你如何編寫單例視圖的時候忽然告訴你,其實不用這麼麻煩,我們有通用視圖,那些總是要做相似的行為的視圖,咱們就寫一個好了,解放生產力不就是進步嗎? 好的廢話不說進入正題,先修改一波detail ...
  • 在C#的List集合中,如果要查找List集合是否包含某一個值或者對象,如果不使用List集合類的擴展方法的話一般會使用for迴圈或者foreach遍歷來查找,其實List集合類中的擴展方法Contain方法即可實現此功能,Contain方法的簽名為bool Contains(T item),ite ...
  • 在C#中的List集合操作過程中,有時候需要清空List集合中的元素對象,將之重置為一個初始化的List集合對象,此時就可以使用到List集合的擴展方法Clear()方法,此方法將清空List集合中所有的元素對象,清空後List集合中的元素個數為0。 例如有個List<int>的集合list1,內部 ...
  • 前言: 項目實戰中不論是業務編碼還是通用編碼,總會歸納出一些通用的工具類。放入項目中一勞永逸,讓兄弟姐妹們避免編寫重覆代碼。所以利用了工作之餘的時間,將這些散落在多個項目中精緻優雅的工具類,歸納起來形成工程,方便後續工作的使用和便捷開發。 根據實際需求,編寫了此工具。目前只支持SQLServer數據 ...
  • 開篇:上一篇我們瞭解了一個ASP.Net頁面請求的核心處理入口,它經歷了三個重要的入口,分別是:ISAPIRuntime.ProcessRequest()、HttpRuntime.ProcessRequest()以及HttpApplication.Init()。其中,在HttpApplication ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...