[C#] 跟著Ouch寫程式 – 第一課 程式邏輯

  • 9591
  • 0
  • C#
  • 2013-07-14

上次簡單的介紹過了C#中Class的基本結構,接下來再來介紹幾個重要的觀念。通常,「程式」都是被用來處理大量性或是重複性很高的動作,而且這些動作的進行是有固定的「順序」或是「條件」的,而那些順序和條件,就是所謂的「邏輯」。


上次簡單的介紹過了C#中Class的基本結構,接下來再來介紹幾個重要的觀念。通常,「程式」都是被用來處理大量性或是重複性很高的動作,而且這些動作的進行是有固定的「順序」或是「條件」的,而那些順序和條件,就是所謂的「邏輯」,小從計算出從1加到1000的總和,或是從1的平方值加到10的平方值的總和、數學中的機率運算、積分等等,或是進銷存貨的管理、員工的薪資運算、甚至大到運算火箭發射的拋物線、這些事情都可以交給電腦來做—前提是,「邏輯」必需能被清楚的定義。

而目前較為主流的程式語言中,幾乎都是採用循序式的執行方式,就像我們讀書一樣,一行一行的往下執行。

舉例來說:

//宣告一個整數number ,並賦予初始值為0
int number = 0;

//將新的值5指派給變數number
number = 5;

//將number 的新值改為原來的值+1,所以執行完number 會變6
number = number + 1;


上面的幾行,如果用數學的邏輯來看的話,是會看不懂的,因為在大部份的程式語言中,等號(=)的意思是:將等號右邊的值帶入等號左邊的變數中。如果要判斷兩個值或是變數是否相等或是比較大小等等,就得透過「運算子來進行運算。
在C#中常見的運算子大概列表如下:

運算子分類 運算子 用途 回傳值
數學運算子 + , - , * , / , % 一般的數學運算(如加減乘除) 運算後的數值
關係運算子 == , != , > , < , >= ,<= 判斷是否相等、大於、小於等等 true或false
指定運算子 = , += , -= ,*= , <<= 先進行運算再指派新值 運算後的數值
邏輯運算子 && , || , ! And、Or、Not true或false

運算子絕對是學習程式設計中不可不學的大學問,若想深入了解,可以參考C#運算子

但是,前面說了,程式是拿來做重複的事情的,那像上面1加到1000的例子,難道我們得寫一千次嗎?當然不是,程式語言中有語法可以用來依照不同的條件來控制程式進行的方向或是順序,而在C#中,常見的有以下幾種:

  • 條件選擇類
流程圖示意 C#程式範例 / 注意事項
image
int healthPoint = 6000;
int damage = 6100;
 
if( healthPoint -  damage <= 0 )
{
    MessageBox.Show( "小強!!你不能死啊,小強!!" );
}
image
int myLevel = 80;
int enemyLevel = 30;
 
if( myLevel - enemyLevel >= 1 && myLevel - enemyLevel <10 )
{
    MessageBox.Show( "打他老木!!" );
}
else
{
    MessageBox.Show( "今天就放你一馬,下次別讓我遇到!!" );
}
image

int myLevel = 80;
int enemyLevel = 30;
bool isEnemyMale = true;
 
if( myLevel - enemyLevel >= 1 )
{
    if( myLevel - enemyLevel <10 )
    {
        MessageBox.Show( "打他老木!!" );
    }
    else if( isEnemyMale == true )
    {
        MessageBox.Show( "為著咱ㄟ角頭~殺!!" );
    }
    else
    {
        MessageBox.Show( "媽媽說男生不可以欺負女生..." );
    }
}
else
{
    MessageBox.Show( "Peace!!" );
}
image
switch( enemies.Count )
{
    case 1:
        MessageBox.Show( "來啊!單挑!!" );
        break;
 
    case 2:
        MessageBox.Show( "來兩個殺一雙!!" );
        break;
 
    case 3:
        MessageBox.Show( "我要打十個!!" );
        break;
 
    case default:
        MessageBox.Show( "我家煮了湯,我先回家看火,bye!" );
        break;
}


switch case的每組程式符合區段的結束要記得加上break;如果沒有符合條件的話,則會執行default這個區段。而break;也可以用來跳出迴圈,可以好好的利用喔!!

   

  • 重複執行類
流程圖示意 C#程式範例 / 注意事項
image
int healthPoint = 3000;
int maxHealthPoint = 20000;
 
while( healthPoint <= maxHealthPoint )
{
    //吃食物回復500的血量
    if( healthPoint + 500 < maxHealthPoint )
    {
        healthPoint = healthPoint + 500;
    }
    else
    {
        healthPoint = maxHealthPoint;
    }
}
image
int healthPoint =20000;
int enemyHP= 20000;
 
do
{
    //攻擊敵人,敵人扣500HP,自己扣300HP
    enemyHP = enemyHP - 500;
    healthPoint = healthPoint - 300;
}
while( healthPoint > 2000 || enemyHP > 0 );


do while和while最大的差別就是:do while至少會執行一次符合條件的程式區段,做完才開始第一次的判斷,而while則是先判斷,才會執行符合條件的程式區段。
image
int manaPoint = 0;
 
for( int healthPoint = 5000 ; healthPoint > 500 ; healthPoint -= 500 )
{
    //施放法術轉換HP成MP
    manaPoint += 300;
}


for算是使用起來靈活性很大的一種迴圈,特色是在它有起始值和漸進值的設定(不過也有不寫起始值和漸進值的用法,這個就請自行摸索囉!)
image
foreach( Player player in players )
{
    if( player.sex == Sex.Male )
    {
        MessageBox.Show( "Hey,man." );
    }
    else
    {
        MessageBox.Show( "哈囉!美女!" );
    }
}


foreach通常用來處理一整個集合中的每個元素,會將所有元素從頭到尾抓出來一個一個做處理,有點像點名的感覺。

就拿前面提到的計算1加到1000的和這個邏輯來說,我們可以畫出如下的流程圖:
clip_image027

隨著要處理的工作越複雜,邏輯也就越複雜。但是,身為一個程式設計師,工作就是要把再怎麼困難、複雜的規則都轉化成程式的邏輯,並且降低需要進行運算的次數(判斷的次數或是進迴圈的次數),以增加程式執行的效率。這次的課程就到此為止,有空的話可以練習把生活中的規則也畫成流程圖,或是在紙上寫成簡單的程式喔!!