繁体   English   中英

c++ 程序未提供所需的 output

[英]c++ program not giving desired output

免责声明:我在学校上 8 年级,我们正在学习古老而死去的 TURBO c++ 作为我们的第一门编程语言。 到目前为止,我已经编写了大约 50 个更简单的程序。 这是我正在研究的最有趣的。 我正在编写一个程序来使用类查找 n 个自然数的总和,并试图使其“故障安全”。 我没有得到想要的结果。 我没有收到编译器的任何错误和警告。 我正在学习编程以理解逻辑并像程序员一样思考。 请不要因为我使用 Turbo C++ 而评判我,我对此无能为力。 我 promise 长大后我会学习 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();
}

无法复制粘贴 output 屏幕。 请理解。 我输入 5 并得到 output 作为 7888

问题是数据成员s尚未初始化,而您正在使用导致未定义行为的未初始化数据成员。

未定义的行为意味着任何事情1都可能发生,包括但不限于给出您预期的 output 的程序。但永远不要依赖(或根据)具有未定义行为的程序的 output。

因此,您看到(可能看到)的 output 是未定义行为的结果。 正如我所说,不要依赖具有 UB 的程序的 output 该程序可能会崩溃。

因此,使程序正确的第一步是删除 UB。 只有这样你才能开始对程序的 output 进行推理。

解决方案

由于您使用的是 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

修改后的程序output可以在这里看到。

我所做的一些更改包括:

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

1有关未定义行为的更技术准确的定义,请参阅此处提到的内容: There are no restrictions on the behavior of the program

初始化变量 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) { }

任何上述工作:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM