2014-04-13 4 views
0

좋아요. 저는 프로그래밍에 매우 익숙하며, C++ 클래스를 사용하고 있습니다. 기본적으로 현재 프로젝트에서 알 수없는 크기의 배열을 가져 와서 크기를 조정하고 평균, Q1, Q3 등과 같은 통계를 출력해야합니다. 사용자로부터 배열을 가져 오는 데 문제가 있습니다. 변수를 0으로 입력 한 후에 변수를 가져와야합니다. 다음은 내가 가지고있는 것입니다.알 수없는 크기의 배열을 C++로 배열합니다.

int i = 1; //When I first posted this I didn't mean to comment out the '= 1' part 
do { 
    cin >> array[i]; 
    if (array[i] != 0) 
     return true; 
} while (true); 

무엇이 잘못 되었나요? 내가 입력 한 번호에 관계없이 매번 1을 입력하면 프로그램이 중단됩니다.

저는 벡터 클래스 btw를 사용하고 있습니다.

+0

숫자를 입력하면 – redFIVE

+0

이 다시 표시되므로 {...} 동안 다시 읽으십시오. 반환 함수를 종료합니다. 그런 식으로 루프를 빠져 나가려면 아마도 깨기를 원할 것입니다. – duncan

+0

다음 블로그 게시물 http://ericlippert.com/2014/03/05/how-to-debug-small-programs/에서 설명하는 ** 고무 도킹 기술에 대해 읽어 보시기 바랍니다. 왜냐하면 당신은 ** 그것을 다시 라인 아래로 사용해야 할 것입니다. – nonsensickle

답변

1

우선 i은 결코 증가하지 않습니다. 모든

둘째, if (array[i] != 0) 것이다 return 해당 배열의 값 않는 경우 동일하지 않은 당신은 do { ... } while() 루프뿐만 아니라 return 문이 무엇으로 어떻게 작동하는지에 읽을 필요가

0. 배열을 가져 오는 동안 배열을 증가시키는 방법을 던질 수도 있습니다.

1

질문에 답변하기 전에.

  1. 당신의 변수를 초기화 int i=0; 배열 제로 색인 때문에 우선은 제로가 될 i을 지정합니다.
  2. 당신은 i을 입수해야합니다. 증분하지 않으면 i은 배열의 첫 번째 버킷을 전체 시간으로 가리 킵니다. 할 때마다 i++ 또는 i = i + 1을 사용하십시오. 루프가 배열에서 "앞으로"이동하는 동안 수행하십시오.
  3. 0이 입력 될 때까지 프로그램을 실행하여 if (array[i] == 0) return true;과 같은 조건을 작성해야합니다. 입력 한 마지막 숫자가 0이고 메서드가 반환 될 때이 조건이 참입니다. while 절에서 확인하는 것이 더 우아 할 것입니다.

모두 함께 퍼팅, 코드는 다음 작업을 수행이

int i=0; 
do { 
    cin >> array[i]; 
    if (array[i] != 0) break; 
    i++; 
} while (i < maxSize); 
//do stuff with filled array 
+0

당신은 꽤 중요한 성분을 버렸습니다. 우리가 버퍼를 오버플로하지 않도록하십시오. –

+0

@MattMcNabb 예 좋은 지적 난 내 답변을 편집 thx – Ziker

+0

@ Ziker 총알 포인트 1. 말이되지 않습니다. 당신은 동시에 두 가지를 설명하려합니다. 배열은 인덱스가 0이고'i'는 초기화되지 않은 채로 남아있을 수 없다는 것을 설명하는 두 문장으로 나누십시오. 그대로서는 것은 말이되지 않습니다. – nonsensickle

2

과 같아야합니다

// change int to your type 
int val; 
std::vector<int> vec; 
while(std::cin >> val) { 
    if(val == 0) break; 
    vec.push_back(val); 
} 

이유 : 리턴 절을 표명하는 것은 루프가 종료됩니다.

std::vector의 사용은 임의의 크기 조건을 보장합니다.

업데이트 @ nonsensickle의 건설적인 발언 후 :

다음 코드 조각은 또한 은 0 입력 과정을 조건 종료 보장 : 과잉 있지만,

// change int to your type 
int val; 
std::vector<int> vec; 
do { 
    if(std::cin >> val) { 
    if(val == 0) break; 
    vec.push_back(val); 
    } else { // fix broken input stream in case of bad input 
    std::cin.clear(); 
    std::cin.ignore(1,'\n'); 
    } 
} while(true); 

하고보다 정교한 방법을하지만, 도대체 :) 템플릿 및 유형 특성 :

template <typename T> 
struct zero_traits 
{ 
    static T getzero() { return T(0); } 
}; 

template <> 
struct zero_traits<std::string> 
{ 
    static std::string getzero() { return "0"; } 
}; 

template <> 
struct zero_traits<char> 
{ 
    static char getzero() { return '0'; } 
}; 

template <typename T> 
std::vector<T> read_values() 
{ 
    T val; 
    std::vector<T> vec; 
    do { 
    if(std::cin >> val) { 
     if(val == zero_traits<T>::getzero()) break; 
     vec.push_back(val); 
    } else { 
     std::cin.clear(); 
     std::cin.ignore(1,'\n'); 
    } 
    } while(true); 
    return vec; 
} 

int main() 
{ 
// change int to your type 
std::vector<int> vec = read_values<int>(); 
for(auto i : vec) std::cout << i << std::endl; 
} 
+1

'while (std :: cin >> val)'행은 0이 입력되면 * 조건을 만족하지 못할 수도 있습니다. http://stackoverflow.com/questions/19307979/cin-in-a-while-loop'std :: badbit'와'std :: failbit' 모두 0이 아니어야합니다. – nonsensickle

+0

@nonsensickle 실제로 메이트에 발언을 보내 주셔서 감사합니다. – 101010

1

나는 귀하의 질문에 직접 답변하려고하지 않을 것입니다. 당신이 가지고있는 것은 작은 논리 오류와 do {...} while() 루핑 구성의 오해입니다. 필요한 것은 코드를 단계별로 실행하는 방법을 배우는 것입니다. 좋아, 그래서 우리는 여기에 정수 i를 선언하는 것이 아니라, -

  1. int i; :

    (이 정말 쉽게해야한다, 그래서 단지 6 선이 여기에있다)의 라인에 의해 코드 라인을 통해 가자 가치를 부여합니다. 따라서 i은 임의의 값을 가질 수 있습니다.

  2. do { - 여기가 while 절을 평가할 때 다시 돌아올 곳입니다. 그러나 while 절의 결과가 true 인 경우에만 해당됩니다.
  3. cin >> array[i] - 사용자가 입력하는 값을 array 위치의 i에 저장하십시오. 여기서 우리는 스스로에게 질문을합니다. 무엇입니까 i 무엇입니까? 우리는 프로그램을 운영하지 않고도 그 가치를 알아야합니다. 힌트 : 여기 인해 i
  4. if (array[i] != 0) 문제가있다 - 사용자가 입력 한 번호가 하지 제로return true (종료 결과 true이 함수) 인 경우.
  5. } while (true); - do { 행으로 돌아가서 여기에 올 때까지 모든 단계를 다시 실행하십시오. 여기에는 조건이 없으므로이 함수를 종료 할 때까지 계속 발생합니다.

힌트 : 루프의 유일한 출구 점이이와 4 단계

에, 당신은 문제를 파악 할 수 있어야한다. 너 자신을위한 문제를 무너 뜨리려고하는 것이 첫 걸음이되어야한다.

작은 프로그램을 디버깅 할 때 this blog post을 읽는 것이 좋습니다. 유익해야합니다. (특히 @DimitriosBouzas에) 다른 사람에 의해 게시

비록 코드가 작동하고, 더 나은 선택이다, 난 강력하게 코드를 수정 추천 그것은 실패 학습 이유. @DimitriosBouzas의 우아한 솔루션보다 장기적으로 도움이 될 것입니다.

관련 문제