Data input detection

常常我們從stdin讀取資料或是從檔案讀資料,最重要的就是先判斷是不是我們要的資料才來做處理,最常用在給使用者輸入一個資料,我們先來做認可,之後在來處理,但是認可他的資料其實是一個很大的工夫,這裡我們來討論||(or)和&&(and)的妙用之處。

※ &&運算子

&&運算是從左往右運算的,如果兩個運算元不是0的話會得到結果為1,並且當第一個運算元為0的時候,就不會計算第二個運算元的值了。

Example:

if (a == 0 && b == 0)
{
....
}

當a不是0的時候後可的b==0根本不會做,因為a!=0已讓&&得到一個false的結果了,所以通常使用&&的話都是讓每一個運算式層層「把關」,要每關都有通過才會執行裡面的工作。

Example:

if ((關卡1) && (關卡2) && (關卡3) && (關卡4))
{
處理正確資料程序
}

如以上,在每個關卡如果錯誤的話(算出來為0)那麼後面的關卡就測不到,且不會執行if中的程式了。 歸納以下重點。

* 每一樣測試條件都要成立才會進入,且通過測試。
* 某一樣測試條件沒有過的話,後面的測試將會全都跳過。
* 專門用在開始處理資料前的判斷資料輸入符不符合。
* (VIP) 全部為真進入,單一為假離開。

Example:

while (scanf("%d", &n) == 1 && n > 1 && n < 5)
{
printf("%d\n", n);
}

※ ||運算子

||運算是從左往右算,如果兩個運算元中有一個不是0時就是得到1,並且當第一個運算元是1時,就不會計算第二個運算元的值了。

Example:

if (a != 0 || b != 0)
{
....
}

當a不是0的話後面的b!=0不會做,因為a!=0已造成true了,所以通常用||來「排除」每一個錯誤,只要一有錯誤的成立,立刻為1,那麼後面的運算式就都不會做了。

Example:

if ((錯誤1) || (錯誤2) || (錯誤3) || (錯誤4))
{
錯誤處理程序
}

如以上,每個錯誤如果一成立,那就得到為1,就可以立刻進入,錯誤處理工作,而後面的錯誤測試就全都跳過了。歸納以下重點。

* 其中任一個測試條件只要一成立,立刻進入,且通過測試。
* 某個測式條件只要一過,後面就不做了。
* 專門用在排除錯誤輸入,要求重新輸入資料。
* (VIP) 單一為真進入,全部為假離開。

Example:

while (scanf("%d", &n) != 1 || n > 5 || n < 1)
{
printf("error!!");
}

※ 較複雜的錯誤判斷

如果一群資料中我們只要3 5 7這三個值才做正確處理的話,那其它的都是錯誤資料,我們可以分別判斷兩類資料一種是正確的使用&&另一種是錯誤的使用||。

Example:

while (scanf("%d", &n) == 1 && (n == 3 || n == 5 || n == 7))
{
處理正確資料
}
while (scanf("%d", &n) != 1 || (n != 3 && n != 5 && n != 7))
{
處理錯誤程序
}

在正確資料處理判斷的部份,設定了兩個關卡,第一關是讀到的資料必須一筆資料,第二關是讀到的這個資料,必須是3 5 7 其中的一個數字,所以說資料可以是3「或」5「或」7這三個數字。

在錯誤資料處理判斷的部份,有兩個錯誤只要任一個成立,那就立刻進入錯誤處理,第一個錯誤成立條件是讀不到資料,第二個錯誤成立條件是3 5 7 以外的任何數字,所以說資料必須不是3「且」不是5「且」不是7。

※ 總結

要處理正確資料,使用&&且設定每關的關卡標準,通通都通過的話才進行正確的運算工作,而要處理錯誤資料的話使用||且設定錯誤成立的條件,當有條件成立的話,表示出現錯誤了,立刻進行處理。

將每一個「關卡」和「條件」以集合的概念想清楚要如何達成,如所有數字中只要1~4,其它不要,那處理正確資料的關卡就是(n >= 1 && n <= 4) 必須大於1且小於4,那處理錯誤資料的條件為(n <> 4)必須小於1或是大於4。

如果是再更複雜的判斷的話,就使用函式專門來判斷輸入資料是否正確,只需要回傳是true 或是false就可以了,而在函式中可以大大的發揮演算的能力。

0 意見: