【问题标题】:How to reset all variables in C++?如何重置 C++ 中的所有变量?
【发布时间】:2015-12-15 16:57:51
【问题描述】:

我的代码似乎没有任何问题,
但我们的教授警告我们,这项任务可能需要
重置变量以便在第一次运行后干净地重新运行。

问题是我不知道如何重置变量和
我认为它对于更复杂的代码变得至关重要。帮助?

这个天气任务基本上是“询问用户现在是几月,
然后询问最低温度,最高温度。本月每天的降雨量,
然后打印月平均值和总降雨量。

// Note to Stackoverflowers: Dager = days & Nedbor = rainfall.
// Other then that everything below is translated to english just for this
// question
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
  char rerun = 'j';  // rerun program variable
  while (rerun == 'j' || rerun == 'J')  // rerun program
  {
    int antDager, antD;  // number of days
    int minTemp;
    float minTempAdd = 0;  // min.temp.
    int maxTemp;
    float maxTempAdd = minTempAdd;  // max.temp
    int mmNedbor;
    float mmNedborAdd = 0;  // rain/downfall

    do {
      cout << "\n\tHow many days in this month? (28 til 31)\n";  //#days?
      cin >> antDager;
      if (31 < antDager || 28 > antDager)  // must be 28-31
      {
        cout << "\n\tInvalid value\n";
      }
    } while (31 < antDager || 28 > antDager);  // loop if invalid value

    for (antD = 1; antD < antDager;
         antD++,  // for loop the month
         minTempAdd += minTemp, maxTempAdd += maxTemp,
        mmNedborAdd +=
         mmNedbor) {  // the above increments temperatures and rain with itself
      do {
        cout << "\n\tminTemp? (-70 til 70), max.temp? (min til 70),   
            rain in mm
            ? (0 til 200)\n ";      //sentence break for this website
                  cin >>
                  minTemp >> maxTemp >>
                  mmNedbor;  // temperatures and rain input
        if ((-70) > minTemp || 70 < minTemp) {
          cout << "\n\tInvalid min-value\n";
        }
        if (minTemp > maxTemp || 70 < maxTemp) {
          cout << "\n\tInvalid max-value\n";
        }
        if (0 > mmNedbor || 200 < mmNedbor) {
          cout << "\n\tInvalid Nedbor-value\n";
        }
      } while ((((-70) > minTemp || 70 < minTemp) ||
                (minTemp > maxTemp || 70 < maxTemp)) ||
               (0 > mmNedbor || 200 < mmNedbor));
    }

    cout << "\n\tGjennomsnittlig minTemp: " << minTempAdd / antDager;
    cout << "\n\tGjennomsnittlig minTemp: " << maxTempAdd / antDager;
    cout << "\n\tGjennomsnittlig nedbor: " << mmNedborAdd / antDager;
    cout << "\n\tTotal nedbor: " << mmNedborAdd << endl;

    cout << "\n\tØnsker du å kjøre programmet igjen? j/n";
    cin >> rep;
    if (rerun == 'n' || rerun == 'N') {
      cout << "\n\tExiting program\n";
    }
  }

  return 0;
}

编辑:
我得到一些关于缺乏初始化的反馈(我假设这意味着定义变量)。我试过不这样做。我的教授。要求我们“尽可能多地使用 const 并尽可能少地“硬编码”变量。
我在这里找不到 const 的任何用途,所以我用最少的“硬编码”来补偿,我希望他在谈论初始化。

【问题讨论】:

  • 请重新格式化您的代码。
  • 有什么问题?
  • 您似乎在使用 minTempmaxTempmmNedbor 而没有初始化它们,这很糟糕。
  • “我收到一些关于缺乏初始化的反馈(我假设这意味着定义变量)。”三个需要了解且不要混淆的好术语是:Declare、Define 和 Initialize。您可以谷歌搜索差异或查看stackoverflow.com/questions/23345554/…之类的内容
  • 例如int getDaysInMonth() { int antDager = 0; do { cout &lt;&lt; "\n\tHow many days in this month? (28 til 31)\n"; //#days? cin &gt;&gt; antDager; if (31 &lt; antDager || 28 &gt; antDager) // must be 28-31 { cout &lt;&lt; "\n\tInvalid value\n"; } } while (31 &lt; antDager || 28 &gt; antDager); return antDager; }

标签: c++ reset


【解决方案1】:
ex: my name program is program_name.cpp
how to reset all variabel : 
my version is :
char choice;
cout<< "do you want to reset all variabel and loop the program"
cin>>choice;
if (choice=="y")system("program_name.axe")
else(exit(0))

if you want to reset ALL VARIABEL please dont use goto;

【讨论】:

    【解决方案2】:

    这意味着你在循环中使用的任何变量,如果它依赖于它被初始化为某个值,则应该在循环开始时初始化。

    在您的情况下,您在循环内声明所有相关变量,但您没有为所有变量分配初始值。如果您在写入之前尝试读取任何未初始化的值,它们将包含未知数据。特别是,minTempmaxTempmmNedbor 无需初始化即可读取。所以要确保所有这些变量都有一些初始值。

    【讨论】:

      【解决方案3】:

      由于 C++ 的值语义,您已经为您重置了变量。在你的 while 循环中,你有

      int antDager, antD;                                   //number of days    
      int minTemp;  float minTempAdd = 0;               //min.temp.     
      int maxTemp;  float maxTempAdd = minTempAdd;      //max.temp  
      int mmNedbor; float mmNedborAdd = 0;  
      

      当您到达 while 循环 (}) 的末尾时,所有这些变量都将超出范围。然后,当您再次启动循环时,它们将被重新创建并再次重置为其初始值。

      在初始化 undefined behavior 之前,您在 for 循环中使用了 mmNedbormaxTempminTemp,因此您应该将它们设置为一些默认初始值。

      【讨论】:

      • @crashmstr 我刚刚解决了这个问题
      【解决方案4】:

      只需将您在整个循环中使用的所有变量设置为 0 或在循环开始时设置其他值,就像您对 minTempAdd 和 mmNedborAdd 变量所做的那样。

      附带说明,您的代码很难阅读,因此我建议您花一些时间重构它。

      【讨论】:

        【解决方案5】:

        您的代码几乎是正确的。 变量将被删除并重新分配,因为它们在内部范围内。

        你错了,你没有初始化它们。当您声明像 int 这样的原始类型时,您只需在堆栈上获取接下来的 4 个字节,因此它将包含那里的任何内容。

        这通常很糟糕,因为有时您认为它将为 0。因此,要修复您的代码,只需确保显式初始化所有变量(为它们分配 0)。

        【讨论】:

        • 初始化是指给他们数值?我的教授。要求我们将“硬编码”变量保持在最低限度。
        • 是的,给他们一些初始值。如果您有某种方法可以更改该值,则它不是硬编码的。最后,如果您从输入中设置所有值也没关系。如果您以某种方式跳过其中一个,而不是某个随机值或上次运行的那个,您将获得您设置的初始值。
        猜你喜欢
        • 2015-08-14
        • 2014-05-14
        • 1970-01-01
        • 2017-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-15
        相关资源
        最近更新 更多