2011-12-24 2 views
0

배열의 크기를 입력하고 메모리를 할당하고이 배열에 read (scanf) 값을 읽는 함수를 작성해야합니다. 루프가없는 반복적 인 함수를 가진 입력 배열

나는이 기능을 쓴하지만 작동하지 않습니다

void getss(int array[], int size) 
{ 

    int counter = 0; 
    if (size == 0) 
     return; 
    if (counter < size) { 
     scanf("%d", &array[i]); 
     counter++; 
    } 
    getss(array, size - 1); 
} 
+1

어떻게 작동하지 않습니까? 실패한 곳은 어디입니까? – sarnold

+0

다른 사람들을위한 배경 정보 : http://stackoverflow.com/q/8623471/377270 - 예, 이것은 거의 중복되었지만, 시작한 곳에서 질문을 얼마나 "마이그레이션해야합니까?" 지금까지 나에게 잘 됐네 ... – sarnold

+2

'i'가 선언되지 않았기 때문에 작동하지 않습니다. 아마 '크기'여야합니다. 그러나 그때조차도,'array [0]'은 절대로 쓰여지지 않습니다. – Jens

답변

1

당신이 달성하려고하는 무엇을 정확하게 명확하지 않다. 하지만 재귀 호출에서 배열 매개 변수가 올바르지 않다고 나는 추측합니다. 이제 gets에 대한 모든 호출은 동일한 배열이지만 크기가 다릅니다. 변수는 어디에서 왔는가? 변수 카운터는 게시 된 코드에서 많이 사용하지 않습니다.

재귀 호출에서 배열의 다음 요소를 가리 키도록 배열 포인터를 업데이트해야한다고 가정합니다. 즉, 첫 번째 요소 대신 배열의 두 번째 요소의 주소를 전달합니다 (현재 동작). 이것은 재귀 호출에서 size-1과 일치합니다.

구현은 간단하지만이 포스터는 숙제와 같이 포스터로 연습 과제로 남겨져 있습니다.

0

다른 문제와 함께 counter을 사용하는 이유는 무엇입니까? 0 또는 1이며 다음 호출로 전달되지 않습니다. 정적으로 선언해야합니까?

1

불필요한 변수가 있습니다.

다음은 scanf()로 읽은 첫 번째 값이 마지막 요소에 저장되도록 배열을 채울 것입니다.

void getss(int array[], int size) 
{ 
    if (size == 0) 
     return; 
    scanf("%d", &array[size-1]); 
    getss(array, size - 1); 
    return; 
} 

다음은 배열을 채울 것이므로 scanf()로 읽은 첫 번째 값이 첫 번째 요소에 저장됩니다. 당신이 반복적으로이 작업을 수행하는 경우

void getss(int array[], int size) 
{ 
    if (size == 0) 
     return; 
    scanf("%d", &array[0]); 
    getss(&array[1], size - 1); 
    return; 
} 
0
#include <stdio.h> 
#include <stdlib.h> 

void getss(int* array, int size){ 
    if (size == 0) 
     return; 
    scanf("%d", array); 
    getss(++array, size - 1); 
} 

int main(){ 
    int *array; 
    int i, size; 

    printf("input array size:"); 
    scanf("%d", &size); 
    array = (int*)malloc(sizeof(int)*size); 
    getss(array, size); 
    for(i=0;i<size;i++){ 
     printf("array[%d]=%d\n", i, array[i]); 
    } 
    return 0; 
} 
1

, 당신은 그것을 어떻게 할 것인가? I는 다음과 같이 가정합니다 :

void getss(int array[], int size) { 
    int i; 
    for (i = 0; i < size; i++) { 
    scanf("%d", array[i]); 
    } 
} 

우리 i가 단지 우리가 약간 우리는 그것을 제거 할 수 있습니다 우리의 기능을 변경, 그래서 만약 배열을 통해 우리의 길을 계산하는 역할을한다 : 이제

void getss(int* array, int size) { 
    for (; size > 0; size--, array++) { 
    scanf("%d", array); 
    } 
} 

우리 "counter"는 크기 변수 자체이며 배열에서 인덱싱하는 대신 우리는 포인터를 앞으로 계속 나아 간다.

이제는 재귀 함수로 변환하기에 완벽한 형태입니다.

void getss(int* array, int size) { 
    if (size > 0) { 
    scanf("%d", array); 
    getss(array + 1, size - 1); 
    } 
} 

그래서 우리 루프의 종료 조건은 우리가 array+1 전달 if 대신의 array++size--로 이동

대신 size--array++의 우리는 함수의 끝에서 getss에 다른 통화에 새 값을 전달할 수 있습니다 다음 번에 size-1으로 전화하십시오. 루핑과 동일한 결과를 얻지 만 명시 적 루프 구조는 없습니다.