2 fengdongjingquan fengdongjingquan 于 2013.09.14 18:34 提问

关于VS的一个小测试程序问题,函数调用顺序

新手学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;

}
CSDN移动问答
如果先调用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;

}
CSDN移动问答

项目截图:CSDN移动问答

各文件内容:

//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;

}*

2个回答

fengdongjingquan
fengdongjingquan   2013.09.26 11:27
已采纳

请教了下学长,讨论后找到了解决方法。原理不知道对不对。

*问题可能出现在函数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;

}*

u010949779
u010949779   2013.09.14 20:23

有时候我也会遇到这样的问题。。。不知道该怎么办

fengdongjingquan
fengdongjingquan 问题解决了。就是原理没弄太清楚,修改了几行代码可以正常执行了。
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!