风动静泉 2013-09-14 10:34 采纳率: 100%
浏览 2622
已采纳

关于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条回答

  • 风动静泉 2013-09-26 03: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;

    }*

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题