我正在使用包含一组数据的文件:
x values y values
20.00 0
20.02 15
20.04 27
20.06 39
20.08 54
20.10 65
20.12 75
该程序应该计算曲线下面积。在这部分中,我将对前6个y-y集进行此操作。我找到该区域的算法是每个梯形的总和,对于这些约束,它应该只有5个梯形。每个梯形的定义如下:A = 0.5(base-base_0)*(height + height_0)。
这是我的代码:
int main()
{
ifstream infile;
double AreaCurve = 0.0, NumberTraps = 0.0, height, height_0, base, base_0, AreaTrap;
infile.open("xydata.dat");
cin.ignore(20, '2');
while (NumberTraps < 6)
{
infile >> base_0;
infile >> height_0;
infile >> base;
infile >> height;
AreaTrap = 0.5 * (base - base_0) * (height + height_0);
AreaCurve += AreaTrap;
NumberTraps++;
}
cout << "The area under the curve is: " << setprecision(4) << AreaCurve << endl;
infile.close();
return 0;
}
编译程序时,没有任何内容打印到屏幕上。我不确定为什么会发生这种情况,但我相信它可能与包含cin.ignore函数的代码行中的错误有关(我无法编辑数据,我需要跳过这一行读取:&#34; x值\ t \ ty值&#34;)
答案 0 :(得分:0)
删除第cin.ignore(20, '2');
行。
此行将使您的程序等待用户输入,直到他们输入二十2
秒或输入不同的字符。
您不应该阅读此计划中的任何用户输入,您的输入数据来自infile
。
您需要添加代码才能忽略infile
的第一行。一个简单的方法是string s; getline(infile, s);
你的程序的主循环也有一个逻辑错误。你一次读两行并考虑到梯形,但是你忽略了那个之后的梯形。 (所以你只计算了大约一半的梯形)。
最后,您应该在处理该梯形之前检查输入是否成功:
if ( !infile )
break;
答案 1 :(得分:0)
要忽略infile
流的第一行(无论其长度如何),您需要:
infile.ignore( numeric_limits<streamsize>::max(), '\n' ) ;
注意,这需要<limits>
标题。
您无需忽略第一个&#39; 2&#39;。对于初学者来说,第一个x值总是必须以&#39; 2&#39;开头,但更有用的是std::istream::operator>> (double&);
跳过包含行尾的空格。
此代码还存在其他问题,例如尝试读取文件包含的更多值,错误的集成算法以及没有对有效流进行错误检查。考虑:
infile.ignore( numeric_limits<streamsize>::max(), '\n' ) ;
infile >> base_0;
infile >> height_0;
while( infile.good() )
{
infile >> base;
infile >> height;
if( infile.good() )
{
AreaTrap = 0.5 * (base - base_0) * (height + height_0);
AreaCurve += AreaTrap;
base_0 = base ;
height_0 = height ;
}
}