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,您可以通过添加参数化构造函数来解决问题,该构造函数将数据成员 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
修改后的程序输出可见here.
我所做的一些更改包括:
- 使用构造函数初始化列表.
添加了参数化构造函数以将数据成员n
和s
初始化为0
- 将数据成员
n
和 s
设为 unsigned int
. 类型
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) { }
以上任何一项工作:)
免责声明:我在学校上 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,您可以通过添加参数化构造函数来解决问题,该构造函数将数据成员 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
修改后的程序输出可见here.
我所做的一些更改包括:
- 使用构造函数初始化列表. 添加了参数化构造函数以将数据成员
- 将数据成员
n
和s
设为unsigned int
. 类型
n
和s
初始化为0
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) { }
以上任何一项工作:)