将输出放在C ++中的主函数中的问题
Problems with putting the output in the main function in c++
我想在 main 函数中输入 n / anzahl 的输入以及最小和最大温度的输出,同时在 void 函数中进行计算。我认为我的错误是调用了错误的参考,但我看不到它。有人可以帮我看看我的错误吗?
到目前为止我已经明白了。这段代码是主函数中的所有内容,它工作得很好但是我在实现将输出放在主函数中时遇到了问题
#include <iostream>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
int n,i;
int groesst, kleinst;
int rand(void);
cout << "Geben Sie Anzahl der Temperaturwerte an: "; //put in the amount of temperatures
cin >> n;
n=n+1; //so non programmers arent confused
vector<int> temp(n);
cout << "31 zufaellige Temperaturen:\n" << endl;
groesst = temp[0];
kleinst = temp[0];
for (i=1;i<n;i++)
{
temp[i]=rand()%20-4;//random temperature between -4 and 15
cout << temp[i] << " Grad Celsius"<< endl;
if (temp[i]>groesst) //
{
groesst = temp[i]; //
}
if (temp[i]<kleinst)
{
kleinst = temp [i];
}
}
cout << kleinst; //minimum temperature
cout << "\n";
cout << groesst; //maximum temperature
return 0;
}
这是我的尝试:
#include <iostream>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <iomanip>
using namespace std;
void minmaxim(vector<int>& temp, int& n, int& kleinst, int& groesst)
{
int i;
int rand(void);
temp[n];
groesst = temp[0];
kleinst = temp[0];
for (i=1;i<n;i++)
{
temp[i]=rand()%20-4;
if (temp[i]>groesst)
groesst = temp[i];
}
if (temp[i]<kleinst)
{
kleinst = temp [i];
}
return;
}
int main ()
{
vector<int> temps;
int anzahl, minimum,maximum;
cout << "Geben Sie die Anzahl der Temperaturwerte ein: "; //type in the amounts of temperatures
cin >> anzahl;
minmaxim(temps, anzahl, minimum, maximum); //calling the function
cout << " " << anzahl;
cout << " " << minimum <<endl;
cout << " " << maximum <<endl;
return 0;
}
最大的问题是 minimum
和 maximum
在调用 minmaxim()
调用未定义行为时都未初始化。在比较您的值之前,您必须将 maximum
和 minimum
初始化为低于和高于可能温度范围的数字,例如
int anzahl,
minimum = 200, /* initialize min above and max below possible range */
maximum = -200;
或者,适当覆盖int
的整个范围,例如
#define NMAX std::numeric_limits<int>::max()
#define NMIN std::numeric_limits<int>::min()
...
int anzahl,
minimum = NMAX, /* initialize min above and max below possible range */
maximum = NMIN;
您使用 C rand()
对随机值的使用已在 C++ 中替换为 Pseudo-random number generation。您将按如下方式创建和使用随机设备:
void minmaxim (std::vector<int>& temp, int& n, int& kleinst, int& groesst)
{
std::random_device rd; /* delcare the randon number generator device */
std::mt19937 gen(rd()); /* standard mrsene_twister engine seeded w/rd */
std::uniform_int_distribution<int> dist(0, NMAX); /* create disribution */
然后调用
int value = dist(rd);
检索范围内的随机值。您可以设置范围的最大值或继续使用整个范围的值和模数,或多或少由您选择。
您对std::vector
的使用不太正确。 std::vector 提供 .push_back()
成员函数来添加到向量中。您的 minmaxim ()
函数可以写成:
void minmaxim (std::vector<int>& temp, int& n, int& kleinst, int& groesst)
{
std::random_device rd; /* delcare the randon number generator device */
std::mt19937 gen(rd()); /* standard mrsene_twister engine seeded w/rd */
std::uniform_int_distribution<int> dist(0, NMAX); /* create disribution */
for (int i = 0; i < n; i++) {
int randval = dist(rd) % 20 - 4;
temp.push_back(randval);
if (randval < kleinst)
kleinst = randval;
if (randval > groesst)
groesst = randval;
}
}
参见 Why is “using namespace std;” considered bad practice?。进行这些更改后,您可以将整个源代码编写为:
#include <iostream>
#include <vector>
#include <random>
#define NMAX std::numeric_limits<int>::max()
#define NMIN std::numeric_limits<int>::min()
void minmaxim (std::vector<int>& temp, int& n, int& kleinst, int& groesst)
{
std::random_device rd; /* delcare the randon number generator device */
std::mt19937 gen(rd()); /* standard mrsene_twister engine seeded w/rd */
std::uniform_int_distribution<int> dist(0, NMAX); /* create disribution */
for (int i = 0; i < n; i++) {
int randval = dist(rd) % 20 - 4;
temp.push_back(randval);
if (randval < kleinst)
kleinst = randval;
if (randval > groesst)
groesst = randval;
}
}
int main (void)
{
std::vector<int> temps{};
int anzahl,
minimum = NMAX, /* initialize min above and max below possible range */
maximum = NMIN;
std::cout << "Geben Sie die Anzahl der Temperaturwerte ein: ";
if (!(std::cin >> anzahl)) {
std::cerr << "error: invalid integer input.\n";
return 1;
}
minmaxim (temps, anzahl, minimum, maximum);
for (const auto& t : temps)
std::cout << t << '\n';
std::cout << "\n " << anzahl << "\n " << minimum << "\n " << maximum << '\n';
return 0;
}
(注意: 避免包含未使用的 headers)
例子Use/Output
$ ./bin/maxmintemps
Geben Sie die Anzahl der Temperaturwerte ein: 5
4
-4
8
3
13
5
-4
13
如果您想进一步整理 main()
的输出,您可以输出 10 行的温度值,结果如下。然后,您可以合法地包含 <iomanip>
header 以使温度值与 std::setw()
对齐。您可以将当前输出循环替换为:
#include <iomanip>
...
for (size_t i = 0; i < temps.size(); i++) {
if (i % 10 == 0)
std::cout.put ('\n');
std::cout << " " << std::setw(2) << temps[i];
}
std::cout << "\n\n anzahl : " << anzahl <<
"\n minimum : " << minimum <<
"\n maximum : " << maximum << '\n';
更新输出
$ ./bin/randtempchk
Geben Sie die Anzahl der Temperaturwerte ein: 40
3 13 9 8 12 15 1 0 7 4
-2 -3 8 14 -4 7 -2 7 -2 2
10 1 14 7 6 6 13 6 6 0
5 9 6 8 13 9 14 9 15 6
anzahl : 40
minimum : -4
maximum : 15
检查一下,如果您还有其他问题,请告诉我。
我想在 main 函数中输入 n / anzahl 的输入以及最小和最大温度的输出,同时在 void 函数中进行计算。我认为我的错误是调用了错误的参考,但我看不到它。有人可以帮我看看我的错误吗?
到目前为止我已经明白了。这段代码是主函数中的所有内容,它工作得很好但是我在实现将输出放在主函数中时遇到了问题
#include <iostream>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
int n,i;
int groesst, kleinst;
int rand(void);
cout << "Geben Sie Anzahl der Temperaturwerte an: "; //put in the amount of temperatures
cin >> n;
n=n+1; //so non programmers arent confused
vector<int> temp(n);
cout << "31 zufaellige Temperaturen:\n" << endl;
groesst = temp[0];
kleinst = temp[0];
for (i=1;i<n;i++)
{
temp[i]=rand()%20-4;//random temperature between -4 and 15
cout << temp[i] << " Grad Celsius"<< endl;
if (temp[i]>groesst) //
{
groesst = temp[i]; //
}
if (temp[i]<kleinst)
{
kleinst = temp [i];
}
}
cout << kleinst; //minimum temperature
cout << "\n";
cout << groesst; //maximum temperature
return 0;
}
这是我的尝试:
#include <iostream>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <iomanip>
using namespace std;
void minmaxim(vector<int>& temp, int& n, int& kleinst, int& groesst)
{
int i;
int rand(void);
temp[n];
groesst = temp[0];
kleinst = temp[0];
for (i=1;i<n;i++)
{
temp[i]=rand()%20-4;
if (temp[i]>groesst)
groesst = temp[i];
}
if (temp[i]<kleinst)
{
kleinst = temp [i];
}
return;
}
int main ()
{
vector<int> temps;
int anzahl, minimum,maximum;
cout << "Geben Sie die Anzahl der Temperaturwerte ein: "; //type in the amounts of temperatures
cin >> anzahl;
minmaxim(temps, anzahl, minimum, maximum); //calling the function
cout << " " << anzahl;
cout << " " << minimum <<endl;
cout << " " << maximum <<endl;
return 0;
}
最大的问题是 minimum
和 maximum
在调用 minmaxim()
调用未定义行为时都未初始化。在比较您的值之前,您必须将 maximum
和 minimum
初始化为低于和高于可能温度范围的数字,例如
int anzahl,
minimum = 200, /* initialize min above and max below possible range */
maximum = -200;
或者,适当覆盖int
的整个范围,例如
#define NMAX std::numeric_limits<int>::max()
#define NMIN std::numeric_limits<int>::min()
...
int anzahl,
minimum = NMAX, /* initialize min above and max below possible range */
maximum = NMIN;
您使用 C rand()
对随机值的使用已在 C++ 中替换为 Pseudo-random number generation。您将按如下方式创建和使用随机设备:
void minmaxim (std::vector<int>& temp, int& n, int& kleinst, int& groesst)
{
std::random_device rd; /* delcare the randon number generator device */
std::mt19937 gen(rd()); /* standard mrsene_twister engine seeded w/rd */
std::uniform_int_distribution<int> dist(0, NMAX); /* create disribution */
然后调用
int value = dist(rd);
检索范围内的随机值。您可以设置范围的最大值或继续使用整个范围的值和模数,或多或少由您选择。
您对std::vector
的使用不太正确。 std::vector 提供 .push_back()
成员函数来添加到向量中。您的 minmaxim ()
函数可以写成:
void minmaxim (std::vector<int>& temp, int& n, int& kleinst, int& groesst)
{
std::random_device rd; /* delcare the randon number generator device */
std::mt19937 gen(rd()); /* standard mrsene_twister engine seeded w/rd */
std::uniform_int_distribution<int> dist(0, NMAX); /* create disribution */
for (int i = 0; i < n; i++) {
int randval = dist(rd) % 20 - 4;
temp.push_back(randval);
if (randval < kleinst)
kleinst = randval;
if (randval > groesst)
groesst = randval;
}
}
参见 Why is “using namespace std;” considered bad practice?。进行这些更改后,您可以将整个源代码编写为:
#include <iostream>
#include <vector>
#include <random>
#define NMAX std::numeric_limits<int>::max()
#define NMIN std::numeric_limits<int>::min()
void minmaxim (std::vector<int>& temp, int& n, int& kleinst, int& groesst)
{
std::random_device rd; /* delcare the randon number generator device */
std::mt19937 gen(rd()); /* standard mrsene_twister engine seeded w/rd */
std::uniform_int_distribution<int> dist(0, NMAX); /* create disribution */
for (int i = 0; i < n; i++) {
int randval = dist(rd) % 20 - 4;
temp.push_back(randval);
if (randval < kleinst)
kleinst = randval;
if (randval > groesst)
groesst = randval;
}
}
int main (void)
{
std::vector<int> temps{};
int anzahl,
minimum = NMAX, /* initialize min above and max below possible range */
maximum = NMIN;
std::cout << "Geben Sie die Anzahl der Temperaturwerte ein: ";
if (!(std::cin >> anzahl)) {
std::cerr << "error: invalid integer input.\n";
return 1;
}
minmaxim (temps, anzahl, minimum, maximum);
for (const auto& t : temps)
std::cout << t << '\n';
std::cout << "\n " << anzahl << "\n " << minimum << "\n " << maximum << '\n';
return 0;
}
(注意: 避免包含未使用的 headers)
例子Use/Output
$ ./bin/maxmintemps
Geben Sie die Anzahl der Temperaturwerte ein: 5
4
-4
8
3
13
5
-4
13
如果您想进一步整理 main()
的输出,您可以输出 10 行的温度值,结果如下。然后,您可以合法地包含 <iomanip>
header 以使温度值与 std::setw()
对齐。您可以将当前输出循环替换为:
#include <iomanip>
...
for (size_t i = 0; i < temps.size(); i++) {
if (i % 10 == 0)
std::cout.put ('\n');
std::cout << " " << std::setw(2) << temps[i];
}
std::cout << "\n\n anzahl : " << anzahl <<
"\n minimum : " << minimum <<
"\n maximum : " << maximum << '\n';
更新输出
$ ./bin/randtempchk
Geben Sie die Anzahl der Temperaturwerte ein: 40
3 13 9 8 12 15 1 0 7 4
-2 -3 8 14 -4 7 -2 7 -2 2
10 1 14 7 6 6 13 6 6 0
5 9 6 8 13 9 14 9 15 6
anzahl : 40
minimum : -4
maximum : 15
检查一下,如果您还有其他问题,请告诉我。