为什么变量算术不起作用?

时间:2018-05-29 23:51:08

标签: c++ c++11 c++14

这是代码:

#include<iostream>  
#include<string>

using std::cout;
using std::cin;
using std::endl;
using std::string;

int score_one;
int score_two;
int score_third;
int final_score = score_one * score_two * score_third;

int main()
{

cout << "What was your first score?" << endl;
cin >> score_one;

cout << "What was your second score?" << endl;
cin >> score_two;

cout << "What was your third score?" << endl;
cin >> score_third;

cout << "Your average score is: " << final_score << endl;

return 0;

}

最初我试图通过除以三个分数来获得平均值,但这不起作用,也不是我的算术。它甚至没有多个变量。我用cin来获取数字。不确定我错过了什么。

5 个答案:

答案 0 :(得分:3)

在您分配到final_score时,其他分数的值为0(因为您还没有分配给它们,而且它们是全局的)。然后你读入分数,但永远不会更新final_score

您需要在阅读第三个分数后添加此内容:

final_score = score_one * score_two * score_third;

这将更新final_score

我还建议远离全局变量。我还建议在声明它们以避免垃圾值时初始化变量。

另外,你实际上并没有计算平均值!为此,您需要添加值并除以3,因为总共有3个值。但是您已将final_score声明为整数,因此您将无法以完全精度存储平均值。我建议将其声明为double

考虑到所有这些变化,您的代码将如下所示:

int main()
{
    int score_one = 0;
    int score_two = 0;
    int score_third = 0;
    double final_score = 0;

    cout << "What was your first score?" << endl;
    cin >> score_one;

    cout << "What was your second score?" << endl;
    cin >> score_two;

    cout << "What was your third score?" << endl;
    cin >> score_third;

    final_score = (score_one + score_two + score_third) / static_cast<double>(3);

    cout << "Your average score is: " << final_score << endl;

    return 0;
}

答案 1 :(得分:2)

此行应在您-module(maxMemCheck). -export([fib/1,printfib/1]). -export([main/0]). printfib(N) -> Res = maxMemCheck:fib(N), io:fwrite("~w ~w~n", [N, Res]). fib(0) -> 0 ; fib(1) -> 1 ; fib(N) when N > 0 -> fib(N-1) + fib(N-2) . main () -> spawn_opt(maxMemCheck,printfib,[10],[{max_heap_size,#{size => 300, kill => true, error_logger => true}}]). 之后移动到等式右侧的变量

{"init terminating in do_boot",{badarg,[{erlang,spawn_opt,[maxMemCheck,fib,"\n",[{max_heap_size,#{error_logger=>true,kill=>true,size=>300}}]],[]},{init,start_it,1,[]},{init,start_em,1,[]}]}}

Crash dump is being written to: erl_crash.dump...done
init terminating in do_boot ()

稍后设置这些变量时,不会以某种方式重新计算变量。

答案 2 :(得分:2)

这部分

cin

应该在最后int final_score = score_one * score_two * score_third; cout << "Your average score is: " << final_score << endl; 之后的int final_score = score_one * score_two * score_third; 内。

答案 3 :(得分:2)

您已经收到了一些答案,但我想提出另一种观点。

在我看来,你已经习惯了像Excel这样的程序,在那里你可以设置一个公式(就像其他3个单元格的产品一样),然后,每当你更改任何一个单元格时,产品就是立即更新,自动。 C ++(以及通常的编程语言)并不像那样工作。当你写一行像

int final_score = score_one * score_two * score_third;

设置规则,这将导致重新计算该值。方法不同!

程序从头到尾执行(实际上,从上到下),每次为变量赋值(如final_score)时,你所做的就是阅读输入变量的当前值(这里是你的三个分数),计算结果(在这种情况下是未定义的,因为你没有初始化任何分数),并将它分配给变量,只是这个时间。而已。如果您稍后更改了分数,则 的更改将自动反映在final_score上。如果要重新计算值,则必须手动执行。这就是为什么你必须在读取用户输入的行之后移动该行,正如其他人所说的那样。

答案 4 :(得分:0)

你真的不应该使用全局变量see here来解释为什么要避免它们。

接下来,而不是做using std::cin等。只需习惯输入它。

最后,在编译器中使用适当的标志来帮助您捕获错误。编译器是你的朋友。一个好的编译器会告诉你,

int score_one;
int score_two;
int score_third;
int final_score = score_one + score_two + score+third / 3;

未初始化。要真正实现您的想法,您可以使用一个返回double的函数。这看起来像

double doAverage(int score1, int score2, int score3)
{
    return (score1 + score2 + score3) / 3.0;
}

但这可能会在您的编码实践中出现。

#include<iostream>  


int main()
{
    // Delare your variables here and initialize them to zero.
    int score_one = 0;
    int score_two = 0;
    int score_third = 0;
    double final_score = 0;

    std::cout << "What was your first score?" << std::endl;
    std::cin >> score_one;

    std::cout << "What was your second score?" << std::endl;
    std::cin >> score_two;

    std::cout << "What was your third score?" << std::endl;
    std::cin >> score_third;

    // Take all scores and divide it. This is the important part since
    // order matters in your code.
    final_score = (score_one + score_two + score_third) / 3.0;

    std::cout << "Your average score is: " << final_score << std::endl;

    return 0;

}

你走在正确的轨道上,你只需要查看你的代码并直接读给自己。你可以在编程中做的最好的事情之一是从顶部开始并说:“好吧,这会破坏哪里?”并逐行理解它。