OK論壇

 找回密碼
 註冊
查看: 1315|回復: 3

C++ 中級教學 基礎演算法講解

[複製鏈接]
  • TA的每日心情

    2013-11-14 10:06 PM
  • 簽到天數: 11 天

    連續簽到: 1 天

    [LV.3]偶爾看看II

    發表於 2013-4-15 23:41:12 | 顯示全部樓層 |閱讀模式
    本帖最後由 KarK 於 2013-4-16 10:48 PM 編輯

    本篇教學為演算法初級,並沒有用到新的語法、結構等,僅為思維引導以及給予觀念。

    本文章是給”純想學程式”而不是給”用來做楓之谷相關”的人們,如果你是後者,本文章可能讓你失望。



    何謂演算法?

    以我們較能夠理解的說法是:完成某一個運算(或任務)或是進行加密解密(也屬於運算)時,所需要的步驟以及方法。
    常見的有:由小到大(或是相反)的重新排列一個整數陣列,或是進行陣列的搜尋,甚至是對一個字串進行加密或解密。



    演算法重要性?

    在開發一個專案時,通常難免會碰到許多排序、重整,除了適當個熟悉該語言的程式碼外,還必須具備有一定的思考能力,並且要配合正確邏輯,也就是說,執行不符合邏輯的程式碼,可能帶來未知的結果(通常是嚴重異常),而本篇文章就是要告訴你,如何正確地去思考一個問題,以及該如何配合程式碼,撰寫出你想要的程式。


    演算法出現在哪裡?


    ”演算法”只是一個通用名詞,他實際上指的就是你所開發的程式碼結構,演算法可能隨時隨地出現在你的程式碼裡面,而且被你使用,一般我們常聽到的基礎演算法有:泡沫排序法、二分搜尋法等。(為資料排序演算規則)




    演算法實例:


    假設今天一個整數陣列裡面存放著 Id 號碼,並且對應一個字串陣列存放著 名稱。(如下圖陣列表, 5 號則代表雞,1 號代表鳥,以此類推)
    而今天這兩個陣列已經是互相對應,但 Id 號碼是亂序的,而你必須將這些資料重新排列(由大到小)整理。


    假設兩字串為:
    1. int idnums[] = { 5,3,4,1,2 };
    2. string name[] = { "雞","羊","牛","鳥","豬" };
    複製代碼
    而排列原理為:
    ( i 預設為 0 ,即陣列第一個內容)
    將 i 個資料接續與 i + x (直到超越長度)資料做比對
    若前者較大,則保留繼續,後者較大,則將後者與前者進行對調。

    如果國字解說讓你覺得很困擾,也許你該看看程式碼:
    1. #include "stdafx.h"
    2. (上段若您的編譯器為 Visual C++ ,請務必加入此段程式碼,若為其他編譯器,則不需要)

    3. #include <iostream>
    4. #include "string"

    5. using namespace std;

    6. int main()
    7. {
    8. int idnums[] = { 5,3,4,1,2 };
    9. string name[] = { "雞","羊","牛","鳥","豬" };

    10. for (int i = 0 ; i < 4; i++){ // 代表比對的頭 由第 i 個資料開始比, i 最大時,仍必須保留一個比對位置,因此 i < 4(length-1)(即倒數第二項)。
    11.   for (int k = i+1 ; k < 5; k++){ // 代表開頭所要比對之值的資料,必須由 i + 1 個地址開始(保留開頭),且必須比對至最後一個值,因此範圍最大能夠到達最後一項。
    12.     if (idnums < idnums[k]){ // 當後者較大時
    13.       string temps = name; // 暫存(將前者暫存)
    14.       int temp = idnums; // 暫存(將前者暫存)ID
    15.       idnums = idnums[k]; // 進行值的交換(後者移至前者) ID
    16.       idnums[k] = temp; // 再將後者之值改為前者值之暫存檔

    17.       name =  name[k]; // 進行值的交換(後者移至前者) NAME
    18.       name[k] = temps; // 再將後者之值改為前者值之暫存檔   NAME
    19.   }
    20. }
    21. }

    22. for (int i = 0; i < 5; i++){ // 再重新將陣列內容輸出
    23.    cout << idnums << " Name : "<<name << endl;
    24. }
    25. system("pause");
    26. }
    複製代碼
    在上者中,我們學到的就是”泡沫排序法”,其原理就是固定開頭,然後與後方資料做比對,再將開頭依序漸進。

    在這看似不難的比大小對換程式,其包含了許多原理以及簡單邏輯,許多相關排列演算法大多都是衍生至此演算法則。


    雖然今天教的東西並沒有應用到新的語法,大部分的語法都是非常簡易的,但是難的地方在於,該如何將這些簡易的語法配合正確的邏輯,將要求的事情給做完,並且獲得正確答案。

    本次教學屬於邏輯化程式語言設計,請各位自行多加練習以及思考,若你是第一次編寫相關程式,這些東西對你來說可能有些困難,若有任何疑問,可至本文章留言,我會為您回答,或是能夠透過我的即時通:a9965,我很樂意私下教學。

    下回教學我們將會講到更進階的演算法類型(二分搜尋以及基礎加密解密(依照學習狀況,加密解密屬於困難等即)演算)

    回復

    使用道具 舉報

  • TA的每日心情
    開心
    2012-10-20 12:31 AM
  • 簽到天數: 305 天

    連續簽到: 94 天

    [LV.8]以壇為家I

    發表於 2013-4-16 22:42:09 | 顯示全部樓層
    本帖最後由 rgrg1234 於 2013-4-16 10:43 PM 編輯

    建議code
    1. [code]
    複製代碼
    用比較好看
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情

    2013-11-14 10:06 PM
  • 簽到天數: 11 天

    連續簽到: 1 天

    [LV.3]偶爾看看II

     樓主| 發表於 2013-4-16 22:45:07 | 顯示全部樓層
    rgrg1234 發表於 2013-4-16 10:42 PM
    建議code用比較好看

    好 我等等改一下 方便各位觀看
    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    郁悶
    2013-7-13 12:28 AM
  • 簽到天數: 6 天

    連續簽到: 3 天

    [LV.2]偶爾看看I

    發表於 2013-7-12 03:53:21 | 顯示全部樓層
    我還是比較喜歡用char 方便多了
    回復 支持 反對

    使用道具 舉報

    您需要登錄後才可以回帖 登錄 | 註冊

    本版積分規則

    Archiver|手機版|小黑屋|OK討論區

    GMT+8, 2024-3-29 04:51 PM , Processed in 0.053203 second(s), 20 queries , Gzip On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回復 返回頂部 返回列表