排列和组合足球得分

时间:2016-08-04 17:18:28

标签: java

编写一个程序,确定正整数是否完美。您的计划确定

并显示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 个答案:

答案 0 :(得分: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,""); 其中m = 5且n = 2

答案 1 :(得分:0)

除了Ambika的回答,让我向你暗示你的io处理问题:

首先,这是简单且无害的部分,在if-else子句中,if或else块被执行,但从不两者(除非使用一些脏的goto hacks ......)。

因此,在if块中再次询问用户'm'和'n'没有多大意义 - 所以要么不要这样做(只需离开cout << "score can't be negative";,或删除else:

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

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

但后来认为用户可能再次输入错误值

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

现在更严重的问题(如果您使用上面建议的时间,它可能会真的严重):

想象一下,程序的用户输入 - 而不是有效数字 - 无效值,例如: 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
}

在循环中有这个,你很好。您可能希望将此循环打包到函数中,或者将其置于外部循环中以避免重复代码;这两个解决方案也解决了另一个关于可用性的小问题:你总是要求两个值,即使第一个值已经有效。我想出了双循环变体:

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';
}