UID320416
帖子
精華
主題
積分14
現金
積極性
威望
違規
熱心
推廣次數
閱讀權限5
註冊時間2013-3-25
在線時間 小時
最後登錄1970-1-1
TA的每日心情 | 怒 2013-11-14 10:06 PM |
---|
簽到天數: 11 天 連續簽到: 1 天 [LV.3]偶爾看看II
|
本帖最後由 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[k]){ // 當後者較大時
- string temps = name; // 暫存(將前者暫存)
- int temp = idnums; // 暫存(將前者暫存)ID
- idnums = idnums[k]; // 進行值的交換(後者移至前者) ID
- idnums[k] = temp; // 再將後者之值改為前者值之暫存檔
- name = name[k]; // 進行值的交換(後者移至前者) NAME
- name[k] = temps; // 再將後者之值改為前者值之暫存檔 NAME
- }
- }
- }
- for (int i = 0; i < 5; i++){ // 再重新將陣列內容輸出
- cout << idnums << " Name : "<<name << endl;
- }
- system("pause");
- }
複製代碼 在上者中,我們學到的就是”泡沫排序法”,其原理就是固定開頭,然後與後方資料做比對,再將開頭依序漸進。
在這看似不難的比大小對換程式,其包含了許多原理以及簡單邏輯,許多相關排列演算法大多都是衍生至此演算法則。
雖然今天教的東西並沒有應用到新的語法,大部分的語法都是非常簡易的,但是難的地方在於,該如何將這些簡易的語法配合正確的邏輯,將要求的事情給做完,並且獲得正確答案。
本次教學屬於邏輯化程式語言設計,請各位自行多加練習以及思考,若你是第一次編寫相關程式,這些東西對你來說可能有些困難,若有任何疑問,可至本文章留言,我會為您回答,或是能夠透過我的即時通:a9965,我很樂意私下教學。
下回教學我們將會講到更進階的演算法類型(二分搜尋以及基礎加密解密(依照學習狀況,加密解密屬於困難等即)演算)
|
|