2016年6月22日 星期三

[教學]用C++寫出表單 (Form) 的簡單方法 (非Visual C++)

本文並不教您如何從頭寫出全部的程式碼
僅說明如何利用Dev-C++這個編輯器來產生「編譯出來是一個表單 (Form)」的程式碼

步驟:


  1. 開啟Dev-C++ (下載連結)


  2. 點選「File→New→Project...」


  3. 會出現一個視窗,選擇「Windows Application」後按「OK」


  4. 它會叫你存檔,選擇一個喜歡的名稱和存檔位置後按「存檔(S)」


  5. 好了,這就是「表單」的程式碼,程式碼的各個部分還有附註解說明


  6. 按下鍵盤上的「F11」編譯並執行,它會叫你選擇執行檔的儲存位置


  7. 選個喜歡的儲存位置後按「存檔(S)」,程式碼就會開始被編譯 (編譯需要一段時間),編譯完成後會出現一個空白乾淨(?)的視窗,這就是我們的程式碼產生的「表單 (Form)」


或許你可以試著亂改這份程式碼,研究一下C++產生表單的方式和程式碼每個部份的功能

程式碼:

2016年6月1日 星期三

給新手的C++教學 (上冊) - B. 遇到困難了? (There are troubles?)

回到「給新手的C++教學 (上冊)」

上一章 (這要怎麼定義上一章啦喂)

本章列出新手在進行本教學的練習時可能會遇到的困難
並提供解決方案
希望能幫助新手們更快、更方便的利用本教學學習新知識!

Q:
看不懂教學在說甚麼QAQ

A:
請問您真的有動手把程式碼用鍵盤打出來,並按下F11執行過嗎?
程式的學習非常依賴自己動手試試看
就像做實驗一樣,在一個字一個字慢慢的打出程式碼的過程中,您才會去觀察規律、猜測其規則、自己修改程式碼來驗證看看,相信很快 (10分鐘內) 就可以掌握觀念!
(真的,不動手試試看就永遠學不會)
這些規則其實是很簡單的,類似小學在玩的益智遊戲,但如果每一個規則都要弄成文字說明,大概在看懂之前就會眼花了吧XD
如果還是不懂,或者理解時間超過10分鐘,歡迎在文章下面留言~
您看不懂,一定還有另一個人也看不懂,所以請別吝嗇,在文章下面勇敢留言說出您遇到的困難吧!

Q:
電腦一直說我的程式寫錯,我不知道為甚麼?
我寫出來的程式就是無法依照預期的方式運作,我不知道為甚麼?

A:
這種情況對新手來說通常不是自己能解決的事,請先參考本教學提供的範例程式碼,並嘗試照著打一遍看看
如果還是出錯,請直接用「複製」、「貼上」的方式,將程式碼貼到你的「Dev-C++」裡面,再按一次鍵盤上的「F11」試試看
當電腦成功讀懂你的程式碼,並且程式是正確執行出預期的結果之後
請再回去比對你原本會出錯的程式碼,找出出錯的原因
這很重要,可以幫助你以後更不會再犯相同的錯誤
如果還是出錯......就代表非常緊急的狀況發生了--本教學的程式碼也錯了!!!
請務必盡快通知小莫,將盡快做修正,感激不盡!
電子信箱:fsps60312@yahoo.com.tw

Q:
怎麼教學看到一半就突然出現看不懂的專有名詞?
怎麼教學看到一半就突然出現還沒教到的東西?

A:
代表小莫沒有考慮好初學者的立場,不小心用到了很專業的術語或進階的語法
請務必盡快通知小莫,將盡快做修正,感激不盡!
電子信箱:fsps60312@yahoo.com.tw

Q:
怎麼辦?上面都沒有提到我的問題QAQ

A:
唉呀呀,你遇到了甚麼問題?
趕快在本章下面留言,或者用任何方式和管道通知小莫
小莫會盡快提供解答,並更新本章內容!
感激不盡!
電子信箱:fsps60312@yahoo.com.tw

下一章 (這要怎麼定義下一章啦喂)

感謝:
(版權所有 All copyright reserved)

給新手的C++教學 (上冊) - 12. 指標 (Pointer)

回到「給新手的C++教學 (上冊)」

上一章

這一章,我們將更深入地探討電腦的運作原理
進而更完善的掌控電腦的記憶體

你會發現,你將會有能力控制更多平常想不到的東西!

你有想過嗎?
當我們宣告一個變數的時候,電腦會撥出一些記憶體來讓程式儲存變數的資訊
但是,電腦的記憶體是有限的,總不可能每一塊記憶體都只有使用一次吧?
這樣的話每一台電腦的記憶體大概都只夠用10分鐘了XD
因此,允許記憶體被重複使用的機制是必要的

為了讓記憶體能夠被重複使用,我們必須確認用過的記憶體中,哪些現在還在使用中、哪些已經使用完畢了
那麼,我們的程式當然只能使用那些已經使用完畢的記憶體,否則修改到其他程式正在使用的記憶體,進而導致其他程式出錯

觀念簡單,但是要有效率地做到這件事 (避免每次找記憶體前都要老老實實的把每一塊記憶體都確認一遍),需要許多先進的演算法知識,而且程式碼寫起來非常的麻煩

放心,這件事連我都不知道怎麼做
所謂「站在巨人的肩膀上」,這種事情不用再由我們自己處理了!
在先人的努力之下,「C++」這個偉大的程式語言,已經讓電腦可以只依據簡單的幾行程式碼,就可以執行許多複雜卻需要經常執行的工作
換句話說
我們在撰寫C++程式碼的時候,只需要告訴電腦「需要使用多少記憶體」和「哪些記憶體已經使用完畢」就好了!

我們在宣告變數的時候,就等於是告訴電腦「恩,我需要這麼多記憶體來儲存這一個變數的資訊」,然後電腦就會把你要的記憶體給你

但是,我們有告訴過電腦「哪些記憶體已經使用完畢」嗎?
有的!

還記得在第十章的時候,我們有提到「每一個變數都有它自己的作用範圍」嗎?
那麼,當正在執行的程式碼位於一個變數的作用範圍外,這個變數所使用的記憶體該怎麼辦呢?
這時我們不會需要用這個變數來儲存任何資訊
也就是,這個變數目前不需要使用記憶體來儲存資訊

電腦學過C++,想當然會利用這個「作用範圍外記憶體就不需要了」的特性
不管是甚麼變數,只要程式執行到它的「作用範圍」之外
電腦就會「自動」把這個變數使用的記憶體當作「使用完畢」
也就是說,現在,這塊記憶體可能是閒置的,或者被其他的程式拿去使用了
如果我們再去修改這塊記憶體,會造成不可預知的錯誤
當然,你還沒開始學習本章的內容,不會知道怎麼在作用範圍外修改這塊記憶體

在作用範圍外修改記憶體?
有需要嗎?
是的,有時候會很需要,請看本章範例
感覺很危險?
是的,使用不當會造成其他程式的錯誤,甚至讓整台電腦當機,必須將電腦插頭拔掉再重新開機

因此,在學習本章前,請務必將重要資料存檔,以避免造成不必要的損失

嘿嘿嘿~
現在
我們開始吧XD

2016年5月25日 星期三

給新手的C++教學 (上冊) - 11. 結構 (Structure)

回到「給新手的C++教學 (上冊)」

上一章

第九章,我們學到了函式
函式真的好好用耶!

咦?真的嗎?
現在,給你三個直線方程式
請你輸出這三條直線相交所形成的三角形的三個頂點座標 (也就是直線的三個交點的座標)

輸入格式:有三行,第$i$行包含第$i$條直線的資訊:三個數字$a_i$、$b_i$、$c_i$,代表第$i$條直線的方程式$a_i x+b_i y=c_i$ (保證三條直線可以形成一個三角形)
輸出格式:有三行,第$i$行包含第$i$個頂點 (交點) 的座標資訊:兩個數字$x_i$、$y_i$,代表第$i$個頂點座標$(x_i,y_i)$ (請輸出小數,頂點順序隨意)

提示:兩條直線$a_{1}x+b_{1}y=c_{1}$、$a_{2}x+b_{2}y=c_{2}$的交點求法:

$\begin{cases}
    &a_{1}x+b_{1}y=c_{1}\\
    &a_{2}x+b_{2}y=c_{2}
\end{cases}\cdots\cdots ①$

$①\Rightarrow
\begin{cases}
    &a_{1}a_{2}x+b_{1}a_{2}y=c_{1}a_{2}\cdots\cdots ②\\
    &a_{1}a_{2}x+a_{1}b_{2}y=a_{1}c_{2}\cdots\cdots ③
\end{cases}$

$②-③\Rightarrow (b_{1}a_{2}-a_{1}b_{2})y=c_{1}a_{2}-a_{1}c_{2}$

$\Rightarrow y=\frac{c_{1}a_{2}-a_{1}c_{2}}{b_{1}a_{2}-a_{1}b_{2}}$

$①\Rightarrow
\begin{cases}
    &a_{1}b_{2}x+b_{1}b_{2}y=c_{1}b_{2}\cdots\cdots ④\\
    &b_{1}a_{2}x+b_{1}b_{2}y=b_{1}c_{2}\cdots\cdots ⑤
\end{cases}$

$④-⑤\Rightarrow (a_{1}b_{2}-b_{1}a_{2})x=c_{1}b_{2}-b_{1}c_{2}$

$\Rightarrow x=\frac{c_{1}b_{2}-b_{1}c_{2}}{a_{1}b_{2}-b_{1}a_{2}}$

p.s. 以上推導過程看不懂也沒關係

$\therefore$兩線交點為$(\frac{c_{1}b_{2}-b_{1}c_{2}}{a_{1}b_{2}-b_{1}a_{2}},\frac{c_{1}a_{2}-a_{1}c_{2}}{b_{1}a_{2}-a_{1}b_{2}})$

啊不就三條直線兩兩求交點就好?
懶得寫三遍同樣的東西,就弄成一個函式吧~
引數 (甚麼是引數?) 就傳遞兩條線的資訊,然後函式就可以進行計算,最後回傳交點的座標......
等等,怎麼回傳「一個座標」?
float、int、char,都不對呀
我們需要一次回傳「兩個float」

2016年5月19日 星期四

給新手的C++教學 (上冊) - 10. 變數的作用範圍 (Scope)

回到「給新手的C++教學 (上冊)」

上一章

不知你在之前的章節中做練習時,電腦是否莫名其妙地說你寫錯呢?
舉個例子
還記得第6章的練習題嗎?
題目是這樣的:
「輸入一個整數n,然後輸入n個數字
最後把這n個數字的順序顛倒,然後輸出」
當你學完陣列之後,馬上就興高采烈地寫下了程式碼:

#include<cstdio>
int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    int i=0;
    while(i<n)
    {
        scanf("%d",&a[i]);
        i=i+1;
    }
    int i=n-1;
    while(i>=0)
    {
        printf("%d ",a[i]);
        i=i-1;
    }
    printf("\n");
}

然後,電腦就說你寫錯了
然後,電腦就說你寫錯了XD
哦~原來我前面已經宣告了一個名字為「i」的變數了,不能再宣告一個名字一模一樣 (同樣是「i」) 的變數
p.s. 雖然之前的章節完全沒有提到,這個命名不能重複的規則請讀者務必了解,仔細想想應該就會發現這個規則合情合理,否則最後會分不清楚「i」到底是指哪一個變數

如果你還是搞不懂發生了甚麼事,將上面的程式碼和第6章提供的程式碼解答比對一下,看看有甚麼差別吧~

現階段,這種問題是很好解決的
以目前的知識,可以想到的方法有2種:

2016年5月17日 星期二

給新手的C++教學 (上冊) - 9. 函式 (Function)

回到「給新手的C++教學 (上冊)」

上一章

依照慣例,在本章依然要給你一個題目,然後你就會發覺需要學習某種新技能,才能有效率的寫出可以解決問題的程式碼 (?)

給你一個正整數$n$,請求出第$n$個卡特蘭數
提示:
第$n$個卡特蘭數$=C^{2n}_{n}-C^{2n}_{n+1}$
其中$C^{a}_{b}=\frac{a!}{b!(a-b)!}$
其中「$x!$」念作「$x$階層」,$x!=1*2*3*...*x=\prod_{k=1}^{x}k$

當然,$n$不能太大,否則會發生溢位 (overflow) 的情況 (甚麼是溢位?)
所以$n$的範圍會在$1\sim 6$內

卡特蘭數列:1、2、5、14、42、132、......

你的程式答對前6項了嗎?

參考程式碼:

#include<cstdio>
int main()
{
    int n;
    scanf("%d",&n);
    int a=1,b=1,c=1;
    int i=1;
    while(i<=2*n)
    {
        a=a*i;
        i=i+1;
    }
    i=1;
    while(i<=n)
    {
        b=b*i;
        i=i+1;
    }
    i=1;
    while(i<=2*n-n)
    {
        c=c*i;
        i=i+1;
    }
    int first=a/(b*c);
    a=1,b=1,c=1,i=1;
    while(i<=2*n)
    {
        a=a*i;
        i=i+1;
    }
    i=1;
    while(i<=n-1)
    {
        b=b*i;
        i=i+1;
    }
    i=1;
    while(i<=2*n-(n-1))
    {
        c=c*i;
        i=i+1;
    }
    int second=a/(b*c);
    printf("%d\n",first-second);
    return 0;
}

程式碼中,變數a、b、c分別表示$C^{a}_{b}$中的$a!$、$b!$、$(a-b)!$

當輸入$n=6$時,程式輸出第6個卡特蘭數「132」了!
你可能會覺得:程式碼好冗長呀~
然後心裡想說:等一下一定會教一個更簡單的方法
咦?XD

沒錯!
接下來,本章會教你,怎麼利用「函式 (Function)」來化簡你的程式碼!