2015-05-22 2 views
0

Я пишу программу, которая выводит сумму пользовательских входных целых чисел, разделенных пробелами (не более 100). Я должен читать значения в массив таким образом, чтобы вход «1 2 3» выдавал «6».cout не выполняется вне цикла for

Это то, что я до сих пор:

#include <iostream> 
using namespace std; 

int main() { 
int i= 0; 
int total = 0; 
int input[100]; 

cout << "Please enter a series of integers, space separated, that you would 
enter code here`like to calculate the sum of: " << endl; 

for(; i < 100; i++) 
{ 
    cin >> input[i]; 
    total += input[i]; 
} 
cout << "The sum of these values is: " << total << endl; 

getchar(); 
return 0; 
} 

кодированный, как это, он не печатает всего. Если Ioutout в конце цикла for, то скомпилируйте и введите 1 2 3, он печатает 1 3 6. Это то, чего я ожидал бы.

Кроме того, когда я устанавливаю размер массива в 5 и запускаю его (закодированный как есть), я понял, что если бы я нажал enter после каждого значения, он напечатает сумму пяти чисел.

Но мне нужно это для чтения значений, разделенных пробелами, а не значений, разделенных символом новой строки. Как я могу изменить это, не прибегая к использованию материала, который я еще не изучил (векторы, указатели ...)?

Любые подсказки, советы или критические замечания были бы оценены!

+4

Ваш код должен работать с пробелом или новой линией между номерами. Вам просто нужно ввести все 100 из них, цикл не заканчивается, когда вы нажимаете Enter. – Barmar

+0

Я бы предложил добавить какой-то код выхода, чтобы преодолеть проблему, отмеченную Barmar, например, ввести «e». Продолжайте вводить ввод, пока не увидите это, и оставьте цикл for. –

ответ

0

Я думаю, вам просто нужно проверить, является ли следующий символ после прочтения int пространством или нет. Если это не закончится цикл:

#include <iostream> 
using namespace std; 

int main() 
{ 
    int total = 0; 
    int input[100]; 

    cout << "Please enter... blah blah blah... the sum of: " << endl; 

    for(int i = 0; i < 100; ++i) 
    { 
     cin >> input[i]; 
     total += input[i]; 

     // space means more to come else exit loop (break) 
     if(cin.peek() != ' ') 
      break; 
    } 

    cout << "The sum of these values is: " << total << endl; 

    getchar(); 
    return 0; 
} 

Выход:

Please enter... blah blah blah... the sum of: 
1 2 3 
The sum of these values is: 6 

cin.peek() Функция возвращает следующий символ из потока без извлечения его.

+0

Спасибо! Это было, безусловно, самое простое решение для моих текущих рабочих знаний. Хотя я знал * о * cin.peek(), я не понимал, что могу использовать его таким образом. –

0

1) Вы должны взять данные в строку
2) разбить его на основе пространства в массиве
3), то петли и полное или использовать std::accumulate.

0

Вы можете спрятать все числа и разделители пробелов в одну строку. Измените каждое пространство на '\ 0', чтобы создать серию отдельных строк. Каждая строка, которую вы можете преобразовать в целое число, используя atoi.

Надежда Я помог,

0

CIN не получает значения все вместе пространства, вы должны ввести после каждого отдельного значения ... если вы хотите, чтобы получить номера все вместе, вы можете взять его в виде строки а затем преобразовать его в целое ... Фактически, когда вы вводите только одну строку числа, разделенную пробелом, код cin не завершен, и ему нужно 99 других входов, и вы не можете добраться до cout

1

Существует std::noskipws, что позволяет явно получить разделитель пробелов. Для проверки сепараторов (несколько разделителей могут быть переданы), я написал следующую функцию:

bool wait_for_number(istream& is) { 
    char ws; 

    do { 
     ws = is.get(); 

     if(!is.good()) 
      throw std::logic_error("Failed to read from stream!"); 

     if(ws == '\n') 
      return false; 
    } while(isspace(ws)); 

    if(isdigit(ws)) 
     is.putback(ws); 
    else if(ws != '\n') 
     throw std::logic_error(string("Invalid separator was used: '") + ws + "'"); 

    return true; 
} 

Вам потребуется дополнительное условие в цикле:

bool hasnumbers = true; 
for(; hasnumbers && i < 100; i++) { 
    int number; 

    cin >> noskipws >> input[i]; 
    total += input[i]; 

    hasnumbers = wait_for_number(cin); 
} 

Обратите внимание на noskipws используется в выражении с cin ,

В некоторых случаях тест:

  • Эти случаи работают отлично:

    echo '2' | ./skipws > /dev/null 
    echo '1 2' | ./skipws > /dev/null 
    echo '1 2 ' | ./skipws > /dev/null 
    echo '1 2 3' | ./skipws > /dev/null 
    echo '1 3' | ./skipws > /dev/null 
    
  • Это случаи приводят к «Ошибка чтения из потока!«:

    echo '' | ./skipws > /dev/null 
    echo ' ' | ./skipws > /dev/null 
    echo ' 1 2' | ./skipws > /dev/null 
    
  • Этот случай приводит к "Invalid сепаратор используется" Ошибка:

    echo '1XXX3' | ./skipws > /dev/null 
    

Кстати, вы можете использовать vector<int>, который легко перераспределены, так что ваша программа выиграла»

+0

круто! Мне понравилось ... –

0

Многие другие люди, кажется, обращаются к пробелам, но я предполагаю, что вы имеете в виду, что вы ввели эти числа на отдельных строках. Если вы вводите их на одной строке это разрешает только половину вашей проблемы.

Основная проблема, которую я вижу, состоит в том, что вы вводите только 3 числа, но запустите цикл for 100 раз. Если вы введете 100 номеров, вы получите общее количество. Скорее всего, это не то поведение, которое вы хотите. Я предлагаю лучший способ справиться с этим:

#include <iostream> 
#include <stdlib.h> 
#include <stdio.h> 

using namespace std; 

int main() 
{ 
    int total = 0; 
    int input[100]; 

    std::string buffer = ""; 

    for(int i = 0; i < 100; i++) 
    { 
     cin >> buffer; 
     if(buffer != "e") 
     { 
      input[i] = atoi(buffer.c_str()); 
      total += input[i]; 
     } 
     else 
     { 
      i = 100; 
     } 
    } 

    cout << "The sum of these values is: " << total << endl; 

    getchar(); 
    return 0; 
} 

Я бы не сказал, что это идеальный вариант, но он работает так, как ожидалось. Вы также можете обнулить массив int, в зависимости от того, для чего вы его используете, поскольку нет гарантии, чтобы все ячейки были записаны.

0

Когда я выполнил это, у меня возникла ошибка с инструкцией cout в строке 9, которую я смог исправить. Он скомпилировался после этого, и когда я вводил числа, он делает это просто отлично. Это займет много времени, так как вам потребуется 100 номеров, чтобы войти в массив, но когда я изменил его на десять чисел и введите 10 чисел, он отлично работает.

Смежные вопросы