2011-11-29 45 views
0

這是我工作中的問題。我需要我的程序說「這個值無效」

三角形數字的序列是通過添加自然數生成的。因此,第7個三角形數字將是1 + 2 + 3 + 4 + 5 + 6 + 7 = 28。前十個方面是:1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

讓我們列出了前七個三角形數字的因素:

1: 1 

3: 1,3 

6: 1,2,3,6 

10: 1,2,5,10 

15: 1,3,5,15 

21: 1,3,7,21 

28: 1,2,4,7,14,28 

我們可以看到,28是第一個三角形人數已超過五個除數。第一個三角形數字的值超過一百個因數是多少?

這是我的代碼。我在處理錯誤時遇到了問題。唯一有效的輸入是數字。如果我輸入的不是數字,我希望它響應「錯誤」或類似的東西。

int main() 
{ 

    int div=0,sum=0,num,i=1,count=0,a; 
    cout<<"Enter the number of divisors"<< endl; 
    cin>>a; 
    while(div<=a) { 
     div=0; 
     sum=sum+i; 
     for(int j=1;j<=sum;j++) 
      if (sum%j==0) 
       div++; 
     chk++; 
     i++; 
    } 
    cout<<"Value of first triangle number is "<<sum<<endl; 
    cout<<"Value of triangle number is "<<count<<endl; 
    return 0; 
} 

也是我做節目我的僞代碼和流程圖前,所以如果ANY1能幫助我通過我的僞ñ流程圖引導,將它appreciated.thank你。 =)

+0

我注意到你有沒有錯誤處理。你如何檢測錯誤?這需要成爲實際邏輯的一部分。 – Arafangion

+0

@ arafangion,yes.wic是我需要這方面的幫助的,我在做這個錯誤處理的同時也在對我的代碼進行初始化。我只是想添加它。 –

+1

副作用:即使你不需要使用護腕,他們。這通常是提前提貨的好習慣。 – Steven

回答

1

檢查輸入和轉換是否成功的最簡單的方法是檢查該流仍然是事後好:

if (std::cin >> a) { 
    // Success 
} else { 
    // Failure 
} 

如果要恢復,然後再試一次,那麼你就需要清除流的狀態,並在重試之前刪除錯誤的輸入;像

std::cin.clear(); 
std::cin.ignore(unsigned(-1), '\n'); 
0
int main() 
{ 

    int div=0,sum=0,num,i=1,count=0,a;  
    for (;;) { 
    cout << "Enter the number of divisor: "; 
    if (cin >> a) { 
     break; 
    } else { 
     cout << "Error! Please enter a valid integer." << endl; 
     cin.clear(); // remove the fail flag 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); // ignore the newline 
    } 
    } 

    while(div<=a) { 
    div=0; 
    sum=sum+i; 
    for(int j=1;j<=sum;j++) 
     if (sum%j==0) 
      div++; 
    chk++; 
    i++; 
    } 
    cout<<"Value of first triangle number is "<<sum<<endl; 
    cout<<"Value of triangle number is "<<count<<endl; 
    return 0; 
} 
+0

是否會插入「for(;;)」中? –

0

試試這個:

int a = 0; 
    std::string line; 
    while(std::getline(std::cin, line) && sscanf(line.c_str(), "%d", &a) != 1) 
    { 
     puts("Error goes here"); 
    } 

    //the rest code goes here .... 
+0

這個問題是一個作業問題。如果我在任何任務中混合使用了C++和C這樣的函數,那麼我會被標記下來。也許用'cerr <<「替換'puts'調用錯誤在這裏\ n」;和'sscanf'到一個用戶定義的函數來驗證一個字符串。不要誤解我的意思,它看起來像一個很好的答案,但講師可以嚴格:) –

+0

@ChrisParton然後嘗試邁克建議。重建sscanf不是一個好主意。 – BruceAdi

+0

沒有辦法像你的代碼一樣緊湊(我個人對你的代碼沒有任何反應)。但是你可以分三步進行:獲取下一個標記('getline'),驗證標記(通過標記循環並檢查非字母字符),然後將標記轉換爲整數值('stringstream') 。也就是說,有可能允許OP使用C,在這種情況下,我會使用您的代碼,因爲它涉及較少的寫入,並且效率更高。 –

相關問題