2016-12-20 20 views
-4

Я знаю, что вы, вероятно, gona снова проголосовали за меня, я действительно не понимаю этого, но я действительно застрял в чем-то и не могу понять, что нет такую ​​информацию в любом месте в Интернете, ни в моей книге для курса, поэтому у меня есть это задание, где мне нужно сделать 2 суммы контейнеров, где разница между двумя суммами является самой низкой, поэтому программа выполнена, отлично работает, вычисляя все, в моем назначении:Как сделать цикл while до того, как есть что-то, чтобы читать C++

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

Хорошо, но так, как я написал код, который я использую в то время как (true), чтобы работать с бесконечными тестовыми окнами (как из назначения), и в это время (правда) у меня есть другое while (cin >> (SOMEINT)) петли и оттолкнуть его обратно в векторе, и после того, как он прочитает новую строку, он просто сломает wile и продолжит вычисление.

Однако в нашем тестовом программном обеспечении это дает ошибку времени выполнения, так как после обнаружения некоторых случаев он начинает печатать бесконечность 0 0, поскольку вводить нечего, но while (true) просто продолжается.

Я имею в виду, что я просто хочу сделать так, что до тех пор, пока пользователь ничего не вводит, например, вы входите в 30 50 90, он вернет 80 90, затем за другой запись и так далее.

КОД:

#include <iostream> 
#include <string> 
#include<vector> 
#include <sstream> 
#include <cmath> 
#include <string.h> 
#include <stdio.h> 
#include <climits> 

using namespace std; 

const int length = 17000; 
int power(int x){ 
int sum =2; 
for(int i = 0;i<x;i++) { 
    sum *= 2; 
} 
return sum; 
} 
bool ison(int i,int x) 
{ 
if((i>>x) & 1)return true; 
return false; 
} 
int main() 
{ 


while(true){ 
vector<int> Vec; 
int cur = 0; 
while (cin >> cur) { 

     Vec.push_back(cur); 
     if (cin.get() == '\n') { 
      break; 
     } 
} 

int * sumOfarr1 = new int[length]; 
int * sumOfarr2 = new int[length]; 

for(int i = 0; i<length;i++){ 
sumOfarr1[i] = 0; 
} 
for(int i = 0; i<length;i++){ 
sumOfarr2[i] = 0; 
} 
    int index=0; 


for(int i=1;i<length;i++) 
{ 
    for(int j=0;j<Vec.size();j++) 
    { 
     if(ison(i,j)) 
     { 
     sumOfarr1[index]+=Vec[j]; 

     } 
     else 
     { 
     sumOfarr2[index]+=Vec[j]; 

     } 
    }index++; 
} 
int ans=INT_MAX; 
int ii; 
for(int i=0;i<index;i++) 
{ 
    if(abs(sumOfarr1[i]-sumOfarr2[i])<ans) 
    { 
    ii=i; 
    ans=abs(sumOfarr1[i]-sumOfarr2[i]); 
    } 
    } 
if(sumOfarr1[ii]<sumOfarr2[ii]){ 
    cout << sumOfarr1[ii] << " " << sumOfarr2[ii]; 
} 
else{ 
    cout << sumOfarr2[ii] << " " << sumOfarr1[ii]; 
} 

cout << endl; 
delete[] sumOfarr1; 
delete[] sumOfarr2; 
Vec.clear(); 

    } 

    return 0; 
} 
+3

Добро пожаловать на переполнение стека. Пожалуйста, найдите время, чтобы прочитать [The Tour] (http://stackoverflow.com/tour) и обратитесь к материалу из [Справочного центра] (http://stackoverflow.com/help/asking) о том, что и как вы можете спросите здесь. –

+3

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

Прочитайте целые строки ('getline'). Читайте о 'stringstream'. (И используйте 'vector' полностью.) – molbdnilo

ответ

0

Да, я нашел решение только с помощью GetLine и stringstream.

ака этого

vector<int> Vec; 

string line; 
while(getline(cin, line)) 
{ 
istringstream iss(line); 
int number; 
while(iss >> number) 
Vec.push_back(number); 
} 

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

  • Нет связанных вопросов^_^