新手學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;
}*
請教了下學長,討論後找到了解決方法。原理不知道對不對。
*問題可能出現在函數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;
}*