新手学C++,把C++ primer 上的两个例子用Visual Studio 2010弄到一起的时候出现了一个问题。
一共用了三个函数放在三个cpp文件,被调用的两个均用头文件进行了声明。
两个函数实现的功能很简单分别是:1、多个数相加求和(plus()) 2、输入两个数字作为上界和下界并求和。(two_num())
问题出现在:在main函数下进行调用的时候,
先调用two_num();再调用plus()可以正常执行。
#include "1-4-3.h"
#include "1-4-4.h"
int main()
{
two_num(); //函数1
std::cout<<"多个数相加"<<std::endl<<std::endl<<"输入各数字,以ctrl+z,回车结束输入。"<<std::endl<<std::endl;
plus(); //函数2,两个函数调换先后顺序执行,就出错。即把上面的two_num()剪切到plus()下面,再执行就出错
system("pause");
return 0;
}
如果先调用plus();再调用two_num();则会出错,只能执行出第一个函数的结果,第二个就无法输入了。
int main()
{
std::cout<<"多个数相加"<<std::endl<<std::endl<<"输入各数字,以ctrl+z,回车结束输入。"<<std::endl<<std::endl;
plus(); //函数2
two_num(); //函数1
system("pause");
return 0;
}
项目截图:
各文件内容:
//1-4-3.h
int two_num();
//1-4-4.h
int plus();
//1-4-3.cpp
#include
int two_num()
{
std::cout<<"Enter two numbers: "<
int v1,v2;
std::cin>>v1>>v2;
int lower,upper;
if (v1<=v2){
lower=v1;
upper=v2;
}
else {
lower=v2;
upper=v1;
}
int sum=0;
for (int val=lower; val<=upper; ++val)
sum += val;
std::cout<<"Sum of "<<lower<<" to "<<upper
<<" inclusive is "<<sum<<std::endl;
return 0;
}
//1-4-4.cpp
#include
int plus()
{
int sum=0,value;
while (std::cin>>value)
sum += value;
std::cout<<"Sum is: "<<sum<<std::endl;
return 0;
}
//main.cpp
#include
#include "1-4-3.h"
#include "1-4-4.h"
int main()
{
std::cout<<"多个数相加"<<std::endl<<std::endl<<"输入各数字,以ctrl+z,回车结束输入。"<<std::endl<<std::endl;
plus();//函数2,两个函数调换先后顺序执行,就出错。即把上面的two_num()剪切到plus()下面,再执行就出错
two_num();//函数1
system("pause");
return 0;
}
请教了下学长,讨论后找到了解决方法。原理不知道对不对。
*问题可能出现在函数plus()的输入结束上面。C++ primer上有说要结束输入“需要输入文件结束符 windows下是Ctrl+z,或者遇到无效输入时(如读取了一个不是整数的值),则istream对象是无效的。处于无效状态的istream对象将导致条件失败”。
先执行two_num函数再执行plus没出现问题是由于前者输入均为有效状态。
换过之后,由于执行plus函数后已经输入了结束符导致istream对象无效,导致后续无法进行输入,故two_num函数无法正常调用。
(即不能用文件结束符或者非整数的数值作为输入结束,而应该用一个自定的结束标志结束输入,如下面修改的代码)
检测方法是把plus中的语句while (std::cin>>value)改成
int plus()
{
int sum=0,value;
std::cin>>value;
while (value!=0)
{
sum += value;
std::cin>>value;
}
std::cout<<"Sum is: "<<sum<<std::endl;
return 0;
}*