C++:3種方式實現錯誤處理

題目要求

編寫一個函數計算n! * 2^n的值,結果存放在數組A[arraySize]的第n個數組元素中,0≤n≤arraySize。假設計算機中允許的整數的最大值爲maxInt,則當n>arraySize或者對於某一個k(0≤k≤n),使得k! * 2^k > maxInt時,應按出錯處理。可有以下三種不同的出錯處理方式:

  1. cerr <<exit(1)語句來中止執行並報告錯誤。
  2. 用返回整數函數值 0 和 1 來實現算法,以區別是正常返回還是錯誤返回。
  3. 在函數的參數表設置一個引用型的整型變量來區別是正常返回還是某種錯返回。

參考解答

1 使用cerr配合exit()實現

#include <iostream>
#include <cmath>

#define maxInt 999999 //假設計算機允許存儲的最大整數爲999999

using namespace std;

int main() {
    int arraySize = INT8_MAX; //設置一個極大值
    int a[arraySize];
    int sum, tmp;
    for (int i = 0; i < arraySize; i++) {
        sum = 0;
        tmp = 1;
        for (int j = i; j >= 1; j--)
            tmp = tmp * j;
        sum += tmp;
        sum = sum * pow(2, i);
        a[i] = sum;
        if (sum > maxInt) {
            cerr << "Error: Data out of maxInt! a[" << i << "] > maxInt" << endl;
            exit(1);
        } else {
            cout << "a[" << i << "] = " << a[i] << endl;
        }
    }
    return 0;
}

需要指出的是,cerr是不經過緩衝而直接輸出的,一般用於迅速輸出出錯信息。所以在運行時你有可能會看到報錯信息優先於後面的輸出而輸出。

2 使用返回函數值來判斷

#include <cmath>

#define maxInt 999999 //假設計算機允許存儲的最大整數爲999999

using namespace std;

int sum = 0;

int calc(int i){
    int tmp;
    sum = 0;
    tmp = 1;
    for (int j = i; j >= 1; j--)
        tmp = tmp * j;
    sum += tmp;
    sum = sum * pow(2, i);
    if (sum > maxInt)
        return 0;
    else
        return 1;
}

int main() {
    int arraySize = INT8_MAX; //設置一個極大值
    int a[arraySize];

    for (int i = 0; i < arraySize; i++) {
        if (calc(i)){
            a[i] = sum;
            cout << "a[" << i << "] = " << a[i] << endl;
        }
        else{
            cout << "Error: Data out of maxInt! a[" << i << "] > maxInt" << endl;
            exit(1);
        }
    }
    return 0;
}

3 使用在函數的參數表建立的引用型的整型變量來判斷

如果我們想讓被調函數中對形參做的修改同樣對主調函數中的實參有效,用值調用不行,那怎麼辦呢?答案就是用題目所說的引用調用
引用是一種特殊類型的變量,我們可以認爲它是另一個變量的別名,利用引用名和原來的變量名訪問變量的效果是一樣的。引用的形式是:類型標識符 & 引用名。比如:

    int  i, j; 
    int &ri=i;    // 建立一個int型的引用ri,並將其初始化爲變量i的一個別名
    j=10;
    ri=j;          // 相當於 i=j;

編寫代碼如下:

#include <iostream>
#include <cmath>

#define maxInt 999999 //假設計算機允許存儲的最大整數爲999999

using namespace std;
int i = 0;

void comp(int sum){
    if (sum > maxInt){
        cout << "Error: Data out of maxInt! a[" << i << "] > maxInt" << endl;
        exit(1);
    }
}

int main() {
    int arraySize = INT8_MAX; //設置一個極大值
    int a[arraySize];
    int tmp, sum = 0;

    for (i = 0; i < arraySize; i++) {
        sum = 0;
        tmp = 1;
        for (int j = i; j >= 1; j--)
            tmp = tmp * j;
        sum += tmp;
        sum = sum * pow(2, i);

        int &rsum=sum;
        comp(rsum);
        a[i] = sum;
        cout << "a[" << i << "] = " << a[i] << endl;
    }
    return 0;
}

輸出結果(以方法2/3爲例)

a[0] = 1
a[1] = 2
a[2] = 8
a[3] = 48
a[4] = 384
a[5] = 3840
a[6] = 46080
a[7] = 645120
Error: Data out of maxInt! a[8] > maxInt

Process finished with exit code 1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章