c ++程序没有提供所需的输出

c++ program not giving desired output

免责声明:我在学校上 8 年级,我们正在学习古老而死去的 TURBO c++ 作为我们的第一门编程语言。到目前为止,我已经编写了大约 50 个更简单的程序。这是我正在研究的最有趣的。 我正在编写一个程序来使用 类 求 n 个自然数的总和,并试图使它成为 'failsafe'。 我没有得到想要的结果。我没有收到编译器的任何错误和警告。 我正在学习编程以理解逻辑并像程序员一样思考。请不要因为我使用 Turbo C++ 而评判我,我对此无能为力。我保证等我长大了就学RUST

这是我的代码:

#include<iostream.h>
#include<conio.h>

class summer
{
 int n,s;
 public:
 int get();
 void calc();
 void show();
 void define();
 };

int summer::get()
{
 cout<<"Enter a Natural Number: ";
 cin>>n;
 return n;
}

void summer::calc()
{
 for(int i=1;i<=n;i++)
 {
  s=s+i;
 }
}

void summer::show()
{
 cout<<"Sum of all natural Numbers till "<<n<<" is "<<s;
}

void summer::define()
{
 cout<<"\n\nA natural Number is a non decimal and non fractional number greater than 0";
}

void main()
{
 clrscr();
 summer obj;
 int ch=obj.get();
 if(ch>0)
 {
  obj.calc();
  obj.show();
 }
 else
 {
  cout<<ch<<" is not a natural number";
  obj.define();
 }
 getch();
}

无法复制粘贴输出屏幕。敬请谅解。 我输入 5 并得到输出 7888

问题是数据成员s还没有初始化而你正在使用那个未初始化的数据成员这会导致 未定义的行为 .

Undefined behavior means anything1 can happen including but not limited to the program giving your expected output. But never rely(or make conclusions based) on the output of a program that has undefined behavior.

所以您看到(也许看到)的输出是未定义行为的结果。正如我所说,不要依赖具有 UB 的程序的输出。程序可能会崩溃。

所以使程序正确的第一步是删除 UB。 然后并且只有那时你可以开始对程序的输出进行推理。

解决方案

由于您使用的是 Turbo,您可以通过添加参数化构造函数来解决问题,该构造函数将数据成员 ns 初始化为 0,如下所示:

//other code here as before
class summer
{
     unsigned int n,s;//unsigned int used instead of int
     public:
         int get();
         void calc();
         void show();
         void define();
         //parameterized constructor
         summer(): n(0), s(0) //uses constructor initializer list
         {
             
         }
 };

//other code here as before

修改后的程序输出可见here.

我所做的一些更改包括:

  1. 使用构造函数初始化列表.
  2. 添加了参数化构造函数以将数据成员ns初始化为0
  3. 将数据成员 ns 设为 unsigned int.
  4. 类型

1有关未定义行为的更准确的技术定义,请参阅 this 其中提到:没有对程序行为的限制.

初始化变量s解决你的问题。当你将 i 添加到 s 时,变量 s 的值不是 0(你可以使用调试器看到)。所以只需使用以下行将 0 分配给 s:

void summer::calc()
{
    s = 0; // Assign 0 to s

    for (int i = 1; i <= n; i++)
    {
        s = s + i;
    }
}

但是如果您希望正确初始化它,请使用这样的构造函数:

class summer
{
    int n, s;
public:

    summer();

    int get();
    void calc();
    void show();
    void define();
};

summer::summer() : n(0), s(0) { }

以上任何一项工作:)