2016-08-04 9 views
-6

正の整数が完璧であるかどうかを判断するプログラムを作成します。あなたのプログラムは順列と組み合わせサッカースコア

と識別し、1から10,000までの完全な数字をすべて表示します。 ユーザーから整数を読み取るプログラムを作成します。ユーザーが入力した値が2より小さい場合

プログラムには、適切なエラーメッセージが表示されます。そうでなければ、あなたのプログラムは

表示乗算することができ素数は各ライン上

に現れる一つの要因で、nは計算する必要があります。たとえば:あなたは再帰がわからない場合は、再帰を使用する

0-0, 1-0, 2-0, 2-1 
0-0, 0-1, 1-1, 2-1 



{ 
int m, n; 
cout<<"Enter the finals scores of both teams"; 
cout<<"\nenter the score for team m :"; 
cin>>m; 
cout<<"Enter the score for team n :"; 
cin>>n; 
if (m < 0 && n < 0){ 

     cout<<"score can't be negative"; 
     cout<<"\nenter the score for team m :"; 
     cin>>m; 
     cout<<"Enter the score for team n :"; 
     cin>>n; 
    } 
else{ 
     int k=0; 
     if (n==0){ 
      for (int j = 0; j <= m; j++){ 
       for (k; k <= n; k+=1){ 

        cout<<j<<"-"<<k<<",\t"; 
       } 
       k--; 
      } 
     } 
     else if(m==1 && n==1){ 

      int i=0; 
      int k=0; 
      for (int j = 0; j <= m; j++){ 
       for (k; k <= n; k+=1){ 

        cout<<j<<"-"<<k<<",\t"; 
       } 
       k--; 
      } 
      cout<<endl<<endl; 
      for (int j = 0; j <= n; j++){ 

       for (i; i <= m; i+=1){ 

        cout<<i<<"-"<<j<<",\t"; 
       } 
       i--; 
      } 
     } 
     else { 
      int i=0; 
      int k=0; 
      for (int j = 0; j <= m; j++){ 
       for (k; k <= n; k+=1){ 

        cout<<j<<"-"<<k<<",\t"; 
       } 
       k--; 
      } 

      cout<<endl<<endl; 
      for (int j = 0; j <= n; j++){ 

       for (i; i <= m; i++){ 

        cout<<i<<"-"<<j<<",\t"; 
       } 
       i--; 
      }    
     } 

    } 

} 
+2

まず、if(m <0 && n <0){'はif(m <0 || n <0){'にする必要があります。 。 – DimChtz

+0

この 'if/else if/else'の全てを実際に必要とするわけではありません。必要なのは、' m'、 'n'の任意の組み合わせに対する2つのネストされたループです。 – DimChtz

+0

@DanialKhanあなたのデバッガは実際に壊れていますか? –

答えて

0

簡単な答えは最初

void print_goals(int m,int n,int i,int j,string s) 
{ 
    if(i == m && j == n) 
    { 
     cout<<s+char(48+i)+'-'+char(48+j)<<endl; 
     return; 
    } 
    if(i<=m) 
    print_goals(m,n,i+1,j,s+char(48+i)+'-'+char(48+j)+','); 
    if(j<=n) 
    print_goals(m,n,i,j+1,s+char(48+i)+'-'+char(48+j)+','); 



} 

print_goals(5,2,0,0,""); メートル= 5とn = 2

+0

ありがとう:)それは働いた –

0

としてそれを呼び出すことを読んで Ambikaの回答に加えて、あなたのioの取り扱いに関するいくつかの問題点をお聞かせください。

まずは、それはsですif-else節で、ifブロックとelseブロックのどちらかが実行されますが、どちらも実行されません(いくつかの不正なgotoハックを使用しない限り...)。

は、もしそうならば、ブロック内を再びと「n」は「M」をユーザーに尋ねるであまり意味がない - ので、どちらかが(ちょうどcout << "score can't be negative";を残すか、あるいは削除し、それをしない:

if(m < 0 || n < 0) 
{ 
    //... 
} 

print_goals(m, n, 0, 0, ""); 
// using Ambika's solution already... 

しかし、その後は、ユーザーが再び悪い値入っている可能性があると考える:今

while(m < 0 || n < 0) 
//^instead of if! 

より深刻な問題を(そしてあなたがwhilを使用している場合、それは潜在的に本当に深刻な取得しますあなたのプログラムのユーザが、有効な数字–の代わりに–と入力したとすると、eは無効です。e。 g。誤って文字キー(s7)を押してしまいます。 cin >> nはintを読み取ることができず、ストリームのフェイルビットが設定されます。その結果、後にcinからの読み出しは、mまたはnを変更することなく、直ちに失敗する。上記の方法で試してみてください。最初に-1と入力してからhello –と入力してctrl-cでプログラムを破る準備をしてください!

ソリューション:いずれかの利用CINのgetlineの()最初から、以下に示すように、その文字列を解析し、またはフェイルビットをリセットします。

std::cin >> n; 
if(std::cin.fail()) 
{ 
    // reset the fail bit 
    std::cin.clear(); 
    // important: discard the invalid input! 
    std::string s; 
    std::cin >> s; 
    // now we are prepared to read the input again 
} 

は、ループ内でこれを持って、あなたは大丈夫です。このループを関数にパックするか、コードを複製しないために外側のループ内に置くことができます。どちらのソリューションも、ユーザビリティに関するもう1つの小さな問題を解決します。最初のものが既に有効であったとしても、常に両方の値を求めました。

int result[2]; 
char c = 'm'; 
for(int& n : result) 
{ 
    for(;;) 
    { 
     std::cout << "enter the score for team " << c << ": "; 
     std::cin >> n; 
     if(std::cin.fail()) 
     { 
      std::cout << "invalid input" << std::endl; 
      std::cin.clear(); 
      std::string s; 
      std::cin >> s; 
     } 
     else if(n < 0) 
     { 
      std::cout << "score can't be negative" << std::endl; 
     } 
     else 
     { 
      break; 
     } 
    } 
    c = 'n'; 
}