![](/img/trans.png)
[英]python c++ api PyRun_SimpleFile is not giving desired 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,您可以通过添加参数化构造函数来解决问题,该构造函数将数据成员n
和s
初始化为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可以在这里看到。
我所做的一些更改包括:
n
和s
初始化为0
。n
和s
成为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.