2012-03-09 4 views
0

0과 1 사이의 값으로 무작위로 채워지는 배열의 구성 요소 합계를 계산하는 코드를 작성했습니다. 두 개의 함수를 작성해야합니다. 하나는 반복이고, 다른 하나는 재귀 적입니다. 둘 다 똑같은 일을해야합니다. 내가 한 번만 호출 할 때 내가 작성한 두 함수는 잘 작동한다. 그러나, 내가 메인에서 두 함수를 호출하려고하면 하나의 결과 만 볼 수 있지만 다른 하나의 결과는 볼 수 없습니다. 또한, 재귀 함수는 하나의 여분의 시간을 호출하는 경향이 있습니다. recursive_function()에 getch()를 주석으로두면 알아 챘습니다. 나는 뭔가를 놓친다는 것을 알고 있지만, 나는 그것을 알아낼 수 없다. 당신의 도움을 주셔서 감사합니다. 여기 코드가 있습니다. Dev-C++을 사용하고 있습니다.은 내 함수 각각의 결과를 표시 할 수 없습니다.

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

using namespace std; 

//headers of the thre functions 
int random_value(int array[], int size); 
int iterative_function (int array[], int size, int sum); 
int recursive_function (int size, int array[], int index, int sum); 



int main() 
{  
    int size;int array[size]; int sum=0; 
    int index=0; 
    cout<<"enter the size of the array"<<endl; 
    cin>>size;    //enter the size ofthe array... 
    random_value(array, size); 
    iterative_function (array, size, sum); 
    recursive_function (size, array, index, sum); 
    getch(); 
    return 0; 
} 

int random_value(int array[], int size) 
{ cout<<"here is the value returned by rand()"<<endl; 
    for(int i=0;i<size;i++) 
    { array[i]=(rand() % (0-2)); 
    cout<<array[i]<<endl; 
    } 
} 

int iterative_function (int array[], int size, int sum) 
{ 
    int i,j, number, value; i=0; 
    cout<<"from the iterative function"<<endl; 
    cout<<"------"<<endl; 
    for(i=0;i<size;i++) 
    sum=sum+array[i]; 
    cout<<"sum of the array="<<sum<<endl;   
    getch(); 
    return 0;  //exit the function. Program terminated succesfully. 
} 

int recursive_function (int size, int array[], int index, int sum) 
{ 
    if(size>index) 
    { 
    sum=sum+array[index]; 
    index++; 
    recursive_function(size, array, index, sum); 
    } 
    cout<<"from the recursive function"<<endl; 
    cout<<"------"<<endl; 
    cout<<"new sum= "<< sum<<endl; 

    getch(); 
    return 0; 

} 
+0

참고 : 두 함수를 호출 할 때 sum 변수를 0으로 재설정하는 것을 잊지 마십시오. –

+0

참고 : 디버거/추적은 친구입니다. –

+1

@KarolyHorvath 참고 : 단위 테스트는 친구입니다. –

답변

1
#include <iostream> 
#include<conio.h> 

<conio.h은 모든 컴파일러와 사용할 수없는, 즉 표준 헤더 아닙니다, 당신은 그것을 필요하지 않습니다.

는 결과 프로그램의 출력을 확인하려면 다음 키 누름을 통하여 실행 Visual Studio에서 커맨드 라인에서

  • 실행을하거나

  • 를 [CTRL F5] (NO 디버깅) 또는

  • 닫는 중괄호에 중단 점을 main으로 설정하고 디버거 (Visual Studio에서 키 누르기 [F5]를 사용하여 실행)에서 중단 점을 설정합니다.

    #include <stdlib.h> 
    

는 지금까지 내가 당신을 볼 수 ’이 헤더에서 아무것도 사용하지 않는 재. 그러나 return 문에 대한 기호 상수 EXIT_SUCCESSEXIT_FAILUREmain에 제공합니다. 예를 들어 0이 의미하는 바를 많은 사람들이 오해하기 때문에 0이라고 쓰는 것보다 EXIT_SUCCESS을 쓰는 것이 더 분명 할 수 있습니다.

using namespace std; 

짧은 프로그램이나 네임 스페이스에서는 문제가 없습니다.

그러나 짧은 프로그램은 매우 짧은 프로그램으로 끝나는 경우가 많습니다.

그리고 using namespace std;은 이름 충돌을 쉽게 일으킬 수 있습니다. 특히 이름이 std::distance 인 경우.그것은 부분적으로 취향의 문제이지만

//headers of the thre functions 
int random_value(int array[], int size); 
int iterative_function (int array[], int size, int sum); 
int recursive_function (int size, int array[], int index, int sum); 

, main 전에 기능을 전방 선언에 더 장점이 없다, 그것은 더 많은 작업이며, 때로는 문제 전방 선언 돈 원인 ’ –은 불필요한 중복성과 마찬가지로 DRY 원칙 (Don Repeat ’ t Repeat Yourself)을 위반하는 것과 동일합니다.

대신에 main 앞에 함수 정의를 배치하십시오.

그런 식으로 다른 사람이 사용하는 기능이 반드시 다른 기능보다 먼저 오기 때문에 무엇을 의미하는지 쉽게 알 수 있습니다.

int main() 
{  
    int size;int array[size]; int sum=0; 

C++에서는 동적으로 할당 된 배열의 크기가 컴파일 타임에 알 수 없기 때문에 컴파일하면 안됩니다.

그러나 C99은 “ 가변 길이 배열 ” a.k.a. 위의 구문을 가진 VLA를 지원하며 g ++ 컴파일러가 지원하는 언어 확장입니다. 심지어 상기 size 변수를 초기화하지 않았기 때문에, 불확정 길이의 배열을 선언하고 불확정 값을 갖는 상기 g ++ 언어 확장자 제 및 파지 한편

.

g ++ 컴파일러의 값은 0 일 가능성이 높지만 다른 값일 수도 있습니다.

는 g ++ VLA 언어 확장을 해제하려면, 그리고 몇몇 다른 언어 확장은 다음과 같은 g ++ 옵션을 사용

 
-pedantic -std=c++0x -Wall 

을 표준 C++를 들어, 대신 C99 VLA 당신의 C++ std::vector<int>를 사용해야합니다.

std::vector 클래스 템플릿의 선언을 얻으려면 표준 라이브러리 헤더 <vector>을 포함하십시오.

int index=0; 
    cout<<"enter the size of the array"<<endl; 
    cin>>size;    //enter the size ofthe array... 

당신이 std::vector를 사용하고, 여기에, 크기를 알고, 그 벡터를 선언 할 수있는 장소가 될 것입니다.

또는 이전에 선언 한 경우 여기에서 크기를 조정할 수 있습니다.

random_value(array, size); 

임의의 값의 벡터를 반환하는 함수가 될 것입니다.

그런 다음이를 사용하여 선언 된 벡터를 초기화 할 수 있습니다. getch() 호출에 대해서

iterative_function (array, size, sum); 
    recursive_function (size, array, index, sum); 
    getch(); 

, <conio.h>에 대한 위의 설명을 참조하십시오.여기에 값 0에 대해서는

return 0; 

, 위의 의견에 대한 <stdlib.h>를 참조하십시오.

} 

int random_value(int array[], int size) 
{ cout<<"here is the value returned by rand()"<<endl; 
    for(int i=0;i<size;i++) 
    { array[i]=(rand() % (0-2)); 

여기서는 아마도 제로 크기 배열의 요소를 액세스, 정의되지 않은 동작있다. 여기
 cout<<array[i]<<endl; 
    } 
} 

int iterative_function (int array[], int size, int sum) 
{ 
    int i,j, number, value; i=0; 
    cout<<"from the iterative function"<<endl; 
    cout<<"------"<<endl; 
    for(i=0;i<size;i++) 
    sum=sum+array[i]; 

은 다시 존재하지 않는 배열 요소에 액세스하여, 종종 단지 “ UB ”이라고 정의되지 않은 동작을 호출한다. 또한 배열의 크기가 0이 아니더라도 배열이 초기화되지 않았으므로 021 또는 임의의 값 (성 표준 (“ 불확도 값 ”))이 포함됩니다.

cout<<"sum of the array="<<sum<<endl;   
    getch(); 

<conio.h>에 관한 위의 설명을 참조하십시오.

return 0;  //exit the function. Program terminated succesfully. 
} 

위의 함수가 항상 동일한 값을 반환하도록 할 필요는 없습니다. 정보 이론적 인 관점에서, 반환 값은 0 비트의 정보를 전달합니다. 대신 함수 ’의 결과 값을 void으로 설정하십시오. 대신 비 관용적 그냥 재귀 호출에 index + 1를 사용, 숙련 된 독자 발견하는 것이 어려운 index를 증가의

int recursive_function (int size, int array[], int index, int sum) 
{ 
    if(size>index) 
    { 
    sum=sum+array[index]; 
    index++; 
    recursive_function(size, array, index, sum); 
    } 

.

가능하면 모든 선언에 const을 추가하는 것이 좋습니다.

예를 들어 index + 1을 사용해야합니다. :-)

cout<<"from the recursive function"<<endl; 
    cout<<"------"<<endl; 
    cout<<"new sum= "<< sum<<endl; 

    getch(); 

<conio.h>에 관한 위의 설명을 참조하십시오.

return 0; 

항상 동일한 값을 반환하는 함수에 대한 위의 주석을 참조하십시오.

} 

요약하면 모든 정의되지 않은 동작을 사용하면 상황이 정상적으로 작동하는 것으로 보입니다.

먼저 UB (특히 C99 VLA를 std::vector으로 대체)를 수정 한 다음, 계속해서 새로운 질문을 던지십시오. ;-)

+0

그래, 내가 제안한대로 그 오류를 수정합니다. 깊고 훌륭한 분석에 감사드립니다. 하지만 재귀 함수를 사용하여 동일한 디스플레이를 여러 번 표시합니다. 내가 뭘 잘못했는지 알 수는 없지만, 뭔가 내 코드에서 옳지 않다는 것을 안다. 고마워요! – T4000

1

크기를 사용하여 배열을 만들지 만 초기화 한 후에 초기화됩니다. 당신은 단순히 무작위 stuffs을 얻습니다. int 포인터를 선언하고, 크기를 읽고, new으로 배열을 할당 한 다음 다시 시도하십시오 (delete 잊지 마세요).

알 수없는 크기입니다 선언 한 모든 배열의
0

먼저, recursive_function에서 그 (기억 크기

0

에 대한 입력을 받고 후 배열을 선언) 그 자체 여러 번 호출 - 그것이 모든 시간과 을 (주() 또는 자체로) 명령을 몸체에 실행합니다. (일찍 돌아 오지 않으므로) ... now getch()에 문제가 있습니까?

+0

재귀 함수에서 여전히 getch() 문제가 표시되지 않습니다.재귀 함수의 if (size> 인덱스)가 재귀 함수가 예상보다 많이 호출되는 것을 피함으로써이 문제를 처리해야한다고 생각했습니다. – T4000

+0

함수가 예상보다 많이 호출되는 것은 아닙니다. 모든 반복을 먼저 끝내고 마지막에 하나의 키 누르기를 기다리는 대신 키 누르기를 기다리는 모든 * 시간입니다. 내가 네가 원한 것으로 의심되는 것. – JTeagle

+0

정확하지만, getch()를 타더라도 동일한 재현이 여러 번 있습니다. 모든 재귀가 발생한 후에 실제로 하나의 디스플레이 만 갖고 싶습니다. – T4000

관련 문제