为什么我的代码无法从屏幕上打印任何内容?(C++)

Why won't my code print anything from the screen? (C++)

本文关键字:任何内 C++ 打印 代码 我的 屏幕 为什么      更新时间:2023-10-16

我正在处理一个包含一组数据的文件:

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个x-y集这样做。我的面积算法是每个梯形的和,对于这些约束,应该只有5个梯形。每个梯形的每个定义为:A=0.5(基底_0)*(高度+高度_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函数的行中的错误有关(我无法编辑数据,我需要跳过这行:"x values\t\t y values")

删除行cin.ignore(20, '2');

这一行将使您的程序等待用户输入,直到他们输入二十个2或输入不同的字符。

您不应该在这个程序中读取任何用户输入,您的输入数据来自infile

您需要添加代码来忽略infile的第一行。一个简单的方法是string s; getline(infile, s);

程序的主循环也有一个逻辑错误。你一次读两行,考虑那个梯形,但你忽略了那个梯形后面的梯形。(所以你只计算了大约一半的梯形)。

最后,在处理梯形之前,您应该检查输入是否成功:

if ( !infile )
    break;

要忽略infile流的第一行(无论其长度如何),您需要:

infile.ignore( numeric_limits<streamsize>::max(), 'n' ) ;

注意,这需要<limits>标头。

您不需要忽略第一个"2"。对于初学者来说,第一个x值总是必须以'2'开头,但更有用的是,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 ;
    }
}