比较C ++的最小用户输入

时间:2013-04-27 06:10:58

标签: c++ if-statement

我试图找到3个输入中的最小数字。这是我的代码:

int main ()
{
     double x = 4.0;
     double y = 5.0;
     double z = 3.0;
     smallest(x,y,z);
     cout << smallest << endl;
     system("PAUSE");

}

double smallest(double x, double y, double z)
{
     double smallest;

     if ((x < y)||(x< z)) {
        smallest = x;
     } else if ((y < z)||(y < x)) {
        smallest = y;
     } else {
        smallest = z;
     }
     return smallest;

}

但是,我一直在收到错误。它声明了我在main方法中使用未声明标识符的最小方法。这在使用eclipse但不是visual studio时有效。有人可以向我解释原因吗?

提前致谢。

更新部分。

所以我尝试对这个程序进行验证。我想确保用户只输入号码,这是我的代码:

    double x, y, z;
bool correct_input = false;
do{
    cout << "Enter first integer : " ;
    cin >> x;
    if(isdigit(x)){
        correct_input = true;
    }
}while(!correct_input);
do{
    cout << "Enter second integer : ";
    cin >> y;
    if(isdigit(y)){
        correct_input = true;
    }
}while(!correct_input);
do{
    cout << "Enter third integer : ";
    cin >> z;
    if(isdigit(z)){
        correct_input = true;
    }
}while(!correct_input);

cout << "Smallest integer is : " << smallest(x,y,z) << endl;
system("PAUSE");

当我输入字母或除数字之外的任何内容时,我得到调试断言失败。在用户输入正确的输入之前,它不会提示。有人可以帮忙吗?

5 个答案:

答案 0 :(得分:6)

首先,如果您希望在定义之前使用smallest(),则需要对其进行原型设计。在main()之前添加以下内容:

double smallest(double x, double y, double z);

此外,您忽略了smallest()的返回值。变化

smallest(x,y,z);
cout << smallest << endl;

double smallest_val = smallest(x,y,z);
cout << smallest_val << endl;

答案 1 :(得分:5)

这不是您提出的问题,但由于您混淆了||&&,因此您的功能出现了问题。

你的功能应该是

double smallest(double x, double y, double z)
{
    double smallest;

    if (x < y && x < z)
        smallest = x;
    else if (y < z && y < x)
        smallest = y;
    else
        smallest = z;
    return smallest;
}

x是最小的数字y 小于z

<强>更新

首先要说的是,如果你想要整数,那么你应该使用int而不是double

第二件事,isdigit没有做你认为它做的事情。你实际上已经为自己设定了一个非常困难的问题。这是一种方法

#include <string> // for string class

bool correct_input = false;
do
{
    cout << "Enter first integer : " ;
    if (cin >> x)
    {
        correct_input = true;
    }
    else
    {
        // cin is in a error state after a failed read so clear it
        cin.clear();
        // ignore any remaining input to the end of the line
        string garbage;
        getline(cin, garbage);
    }
}
while(!correct_input);

但这并不完美。例如,如果你输入abc然后你的程序会要求更多的输入,但是如果输入123abc,那么你将得到整数123,即使123abc不是有效数字。

如果你真的想要正确地做这件事(并且很难)那么你必须读入一个字符串,检查字符串是否可以转换为数字,如果它可以进行转换,如果它不能那么要求更多的意见。

答案 2 :(得分:0)

将此行放在主要上方;)。

double smallest(double x, double y, double z);

您需要声明您所做的任何功能。这称为制作函数头。

答案 3 :(得分:0)

您应声明您的功能,以便编译器可以识别它。 将其原型放在main函数之上:

double smallest(double, double, double);
int main()
{
//Staff
}

答案 4 :(得分:0)

这里有两个问题,一个是关于如何获得最小的问题,另一个是关于ho得到正确的输入。

对于第一个问题,让我提出一个递归方法:

// this is trivial
double smallest(double x, double y)
{ return (x<y)? x: y; }

// the smalles of three is the smallest between the smallest of two and the third
double smallest(double x, double y, double z)
{ return smallest(smallest(x,y),z); }

对于第二个问题,每个变量都有同样的问题,所以让我们为它做一个函数:

#include <iostream>
#include <limits>
#include <string>

double read(std::istream& s, std::ostream& o, const std::string& message)
{
    for(;;) //stay here until kiked out
    {
        double d=0.; //just a safe value - no particular meaning

        o << message << std::endl; // prompt the request
        bool good(s >> d); //read a double and keep the state
        if(!good) s.clear(); //if we failed to read, clean the stream state

        //in any case, discard everything unread until the return.
        s.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

        if(good) return d; //if reading succeeded, return.
        //overwise loop back
    }
}

这是基于std::cin具有设置为“bad”的状态的事实,即在给定变量中无法读取输入。

我们刚刚阅读,如果失败,请一次又一次地重做。 但拳头我们必须清除状态,所以输入可以解锁。 独立地阅读不好,我们必须丢弃可以在行中输入的“额外”(想到123asdf:我们已成功阅读123,但我们必须放弃abc }) 阅读成功我们只是将它返回,否则我们会一遍又一遍地循环直到我们得到它。

程序本身,此时将减少为:

int main()
{
    double x = read(std::cin, std::cout, "Enter first value");
    double y = read(std::cin, std::cout, "Enter second value");
    double z = read(std::cin, std::cout, "Enter third value");

    std::cout << "the smallest numer is: " << smallest(x,y,z) << std::endl;
    return 0;
}

可以这样运行:

Enter first value
7
Enter second value
5.2yyyy
Enter third value
sf3
Enter third value
455
the smallest numer is: 5.2

更高级的技术可以将函数转换为操纵器类,如下所示:

class read_value
{
public:
    read_value(double& d, const std::string& prompt_, std::ostream& out_ = std::cout)
        :z(d), prompt(prompt_), outstream(out_)
    {}

    friend std::istream& operator>>(std::istream& s, const read_value& a)
    { 
        for(;;)
        {
            a.outstream << a.prompt << std::endl; // prompt the request
            bool good(s >> a.z); //read a double and keep the state
            if(!good) s.clear(); //if we failed to read, cleanr the stream state

            //in any case, discard everything unread until the return.
            s.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

            if(good) return s; //if reading succeeded, return.
            //overwise loop back
        }
    }

private:
    double& z;
    std::string prompt;
    std::ostream& outstream;
};

让程序更具惯用性:

int main()
{
    double x,y,z;

    std::cin >> 
        read_value(x,"Enter first value") >>
        read_value(y,"Enter second value") >>
        read_value(z,"Enter third value");

    std::cout << "the smallest numer is: " << smallest(x,y,z) << std::endl;
    return 0;
}

另一点可以是用户可以永远循环,从不输入一个好的序列。

我们可以修复在for循环中引入计数器的最大尝试次数限制,如果循环终止而不返回,则将输入设置为“failed”:

friend std::istream& operator>>(std::istream& s, const read_value& a)
{
    for(int i=0; i<10; ++i)
    {
       ... //same as before
    }
    return s; //s will be returned in failed state
}

然后检查主程序:

int main()
{
    double x,y,z;

    std::cin >> 
        read_value(x,"Enter first value") >>
        read_value(y,"Enter second value") >>
        read_value(z,"Enter third value");

    if(!std::cin) 
    { 
       std::cout << "bad input." << std::endl;
       return -1; //report as "program failed"
    }

    std::cout << "the smallest numer is: " << smallest(x,y,z) << std::endl;
    return 0; //succeeded
}