我试图找到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");
当我输入字母或除数字之外的任何内容时,我得到调试断言失败。在用户输入正确的输入之前,它不会提示。有人可以帮忙吗?
答案 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
}