风动静泉 2013-09-14 02: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-25 19: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 STM32悬赏求解答
  • ¥15 Mysql 一张表同时多人查询和插入怎么防止死锁
  • ¥20 centos6.7 安装libevent库.总是报错,如何解决?
  • ¥15 电脑买回,学校的有线网络总掉。
  • ¥20 关于普洛菲斯触摸屏与AB连接地址问题
  • ¥15 vue但是页面显示的数据为空为什么呀,明明在钩子函数中已经成功赋值(相关搜索:输出数据)
  • ¥15 syri可视化不显示插入缺失
  • ¥30 运行软件卡死查看系统日志分析不出来
  • ¥15 C语言代码改正特征选择算法设计,贝叶斯决策,,设计分类器,远程操作代码修正一下
  • ¥15 String 类valuve指向的问题
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部