使用for语句计算int输入的总和

时间:2015-12-08 15:56:50

标签: c++ for-loop input sum

我刚开始(昨天)学习如何使用C ++进行编码,而且我正在关注Lippman的“C ++ Primer”一书。

他给了我们这个代码:

#include <iostream>

int main()

{

    int sum = 0, value = 0;

    // read until end-of-file, calculating a running total of all values read

    while (std::cin >> value)

        sum += value; // equivalent to sum = sum + value

    std::cout << "Sum is: " << sum << std::endl;

    return 0;

}

工作正常。现在,其中一个练习是编写我自己的程序版本,该程序打印从cin读取的一组整数的总和。我正在尝试使用for语句来做到这一点。现在我有这个:

#include <iostream>

int main(){

    int sum = 0;

    std::cout << "Please insert your values. When you want to terminate, insert the number 0." << std::endl;


    for(int val1; val1 != 0; std::cin >> val1)
        sum += val1;

    std::cout << "The sum of your inputs is " << sum << std::endl;

    return 0;

}

为了避免crtl + z结束程序,我试图添加一个条件,当用户输入数字零时,程序输出所有输入的总和并终止。由于某种原因,我得到的总和总是错误的,即我输入9和9以及和输出16。

在总结中,我希望用户继续输入数字,直到他不再需要(输入数字为零),此时程序计算所有前输入的总和并输出结果。

提前感谢您的帮助。

6 个答案:

答案 0 :(得分:3)

for语句可以采用以下方式

for ( int val1; std::cin >> val1 && val1 != 0; )
    sum += val1;

至于你的陈述

for(int val1; val1 != 0; std::cin >> val1)
    sum += val1;

然后首先变量val1最初未初始化,因此循环错误。你必须检查操作std::cin >> val1是否成功。

答案 1 :(得分:2)

问题是你在初始化之前将总和添加到了总和

您可以通过打印在每次迭代时添加到总和的val1的值来检查:

#include <iostream>

int main(){

    int sum = 0;

    std::cout << "Please insert your values. When you want to terminate, insert the number 0." << std::endl;
    for ( int val1;  val1 != 0; std::cin >> val1 )  {
        std::cout << "Adding " << val1 << " to the sum" << std::endl;
        sum += val1;
    }
    std::cout << "The sum of your inputs is " << sum << std::endl;

    return 0;

}

您将在循环的第一次迭代中看到,在用户输入任何数字之前,会将一个值添加到总和中。 要了解为什么会出现这种情况,您可以了解如何在等效的while循环中转换for循环:

int val1 <initialization>
while (val1 != 0)  <condition>
    sum += val1;   <body>
    std::cin >> val1 <post-statement>

正如您所看到的,您的初始化语句没有为val1设置特定值。在执行后语句之前,在循环体中读取该值。 对于任何for循环都是如此:

for(initialization, condition, post-statement)
    body

解决方案是使用用户输入的第一个数字来初始化val1:

#include <iostream>

int main(){

    int sum = 0;

    std::cout << "Please insert your values. When you want to terminate, insert the number 0." << std::endl;
    int val1;
    for ( std::cin >> val1;  val1 != 0; std::cin >> val1 )  {
        std::cout << "Adding " << val1 << " to the sum" << std::endl;
        sum += val1;
    }
    std::cout << "The sum of your inputs is " << sum << std::endl;

    return 0;

}

答案 2 :(得分:0)

您可以使用相同的while循环,只需扩展条件:while ((std::cin >> value) && (0 != value))

它从int中提取std::cin,如果成功,则检查它是否为0

答案 3 :(得分:0)

您获得奇怪答案的原因是因为您在初始化之前使用变量val1。这是未定义的行为。

Vlad's answer会解决这个问题,因为val1会在添加到总和之前正确初始化。

答案 4 :(得分:0)

应该初始化变量val1,否则它将保存垃圾值。 你可以宁愿使用:

@Test
    public void uploadCertFile() throws Exception {
        //given

        MockMultipartFile file = new MockMultipartFile("file", "test.txt",  "text/plain", "bar".getBytes());

        MockHttpServletRequestBuilder request = MockMvcRequestBuilders.fileUpload("/uploadCert").file(file);

        System.out.println(request);
        //when
        ResultActions resultActions = mockMvc.perform(request);

        //then
        MvcResult mvcResult = resultActions.andReturn();
        assertEquals(200, mvcResult.getResponse().getStatus());
        File savedFile = new File("./test.txt");
        assertTrue(savedFile.exists());
        savedFile.delete();
    }

答案 5 :(得分:0)

虽然这不能明确回答您的问题,但我想提一下,您可以通过按EOF手动插入Ctrl+D字符。输入此EOF字符相当于“关闭”std::cin,从而打破任何取决于它的循环。

另外,我建议您为程序使用(并了解)一些方便的STL算法,而不是对for循环进行硬编码!

#include <iterator>
#include <iostream>
#include <numeric>

int main()
{
    auto cin_iter = std::istream_iterator<int>{std::cin};
    auto cin_end = std::istream_iterator<int>{};
    std::cout << "Sum is: " << std::accumulate(cin_iter, cin_end, 0) << std::endl;
}

Demostd::istream_iteratorstd::accumulate