0

我试图在 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");

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

4

5 回答 5

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;
于 2013-04-27T06:12:23.700 回答
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

更新

首先要说的是,如果你想要整数,那么你应该使用intnot 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,那么即使 123abc 不是有效数字,您也会得到整数 123。

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

于 2013-04-27T06:18:46.097 回答
0

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

double smallest(double, double, double);
int main()
{
//Staff
}
于 2013-04-27T06:15:04.700 回答
0

把这条线放在你的主线上面;)。

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

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

于 2013-04-27T06:12:22.433 回答
0

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

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

// 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,即设置为“坏”的状态是无法在给定变量中读取输入。

我们只是阅读,如果失败,则一次又一次地重做。但是首先我们必须清除状态,这样才能解锁输入。独立 og 好一个坏的阅读,然后我们必须丢弃可以在该行中输入的所有“额外”(想想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 循环中引入一个计数器,如果循环终止而不返回,则将输入设置为“失败”:

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
}

.

于 2013-04-27T08:25:06.517 回答