KarK 發表於 2013-4-15 23:41:12

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

本帖最後由 KarK 於 2013-4-16 10:48 PM 編輯

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

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


何謂演算法?

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


演算法重要性?

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


演算法出現在哪裡?


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




演算法實例:


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

假設兩字串為:int idnums[] = { 5,3,4,1,2 };
string name[] = { "雞","羊","牛","鳥","豬" };
而排列原理為:
( i 預設為 0 ,即陣列第一個內容)
將 i 個資料接續與 i + x (直到超越長度)資料做比對
若前者較大,則保留繼續,後者較大,則將後者與前者進行對調。
如果國字解說讓你覺得很困擾,也許你該看看程式碼:#include "stdafx.h"
(上段若您的編譯器為 Visual C++ ,請務必加入此段程式碼,若為其他編譯器,則不需要)

#include <iostream>
#include "string"

using namespace std;

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

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

      name =name; // 進行值的交換(後者移至前者) NAME
      name = temps; // 再將後者之值改為前者值之暫存檔   NAME
}
}
}

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

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


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

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

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

rgrg1234 發表於 2013-4-16 22:42:09

本帖最後由 rgrg1234 於 2013-4-16 10:43 PM 編輯

建議code 用比較好看

KarK 發表於 2013-4-16 22:45:07

rgrg1234 發表於 2013-4-16 10:42 PM static/image/common/back.gif
建議code用比較好看

好 我等等改一下 方便各位觀看

ms890110 發表於 2013-7-12 03:53:21

我還是比較喜歡用char 方便多了
頁: [1]
查看完整版本: C++ 中級教學 基礎演算法講解