2012-11-10 6 views
0

인덱스를 사용하여 작동하는 프로그램이 있습니다. 그러나 할당을위한 포인터로 변경해야합니다.C++에서 포인터에 대한 인덱스

포인터에 전환하려고하는 아래의 코드에서 포인터를 인덱스로 바꾸고 포인터를 포인터로 변경하는 모든 곳에서 값을 가져옵니다. 적어도 내 생각은 그렇다.

#include <cstdlib> 
#include <iostream> 
#include <iomanip> 

/* 
    Program sorts an array of integers using a selection sort. 
    The general algorithm repeatedly finds the smallest number 
    in the array and places it at the front of the list. 
*/ 
using namespace std; 

const int size = 20; 

int find_small_index (int start_index, int numbers []); 
void swap_values (int index1, int index2, int numbers []); 
void print (int numbers []); 

int main(int argc, char *argv[]) 
{ 
    // array of numbers 
    int numbers [size] = {7, 9, 21, 16, 65, 8, 32, 1, 17, 41, 
         54, 128, 62, 44, 12, 1023, 89, 905, 32, -12}; 
    int start_index; // current starting spot for search 
    int small_index; // index of the smallest number in the array 

    start_index = 0; 
    // continue finding the smallest value and placing it 
    // at the front of the list 
    while (start_index < size - 1) 
    { 
      small_index = find_small_index (start_index, numbers); 
      swap_values (small_index, start_index, numbers); 
      start_index++; 
    } 

    cout << "\n\nThe sorted array is:\n"; 
    print (numbers); 

    cout << "\n\n"; 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

// finds and returns the index of the smallest number remaining in 
// the array 
int find_small_index (int start_index, int numbers []) 
{ 
    int small_index, // smallest index to be returned 
     index;  // current index being viewed 

    small_index = start_index; 
    // look at each element 
    for (index = start_index + 1; index < size; index++) 
     // remember index of smaller value 
     if (numbers [index] < numbers [small_index]) 
      small_index = index; 
    return small_index; 
} 

// swap the values in the array at indexes index1 and index2 
void swap_values (int index1, int index2, int numbers []) 
{ 
    int swapper; 

    swapper = numbers [index1]; 
    numbers [index1] = numbers [index2]; 
    numbers [index2] = swapper; 
} 

// prints the array in nice format, 10 numbers per line 
void print (int numbers []) 
{ 
    int on_line, // number of values printed on the line 
     index; // index of current number being printed 

    on_line = 0; 
    // print each element in the array 
    for (index = 0; index < size; index++) 
    { 
     cout << setw (5) << numbers [index]; 
     on_line++; 
     // if 10 numbers have been printed on the line 
     // go to next line 
     if (on_line == 10) 
     { 
      cout << "\n"; 
      on_line = 0; 
     } 
    } 
} 

이 내가 포인터를 사용하지만 점점 오류를 계속 변경하는 것을 시도하고 동일한 코드는 다음과 같습니다 다음은 인덱스를 사용하는 코드입니다. 누군가 내가 잘못하고있는 것을 나에게 설명 할 수 있습니까?

#include <cstdlib> 
#include <iostream> 
#include <iomanip> 

/* 
    Program sorts an array of integers using a selection sort. 
    The general algorithm repeatedly finds the smallest number 
    in the array and places it at the front of the list. 
*/ 
using namespace std; 

const int size = 20; 

int find_small_pointer (int start_pointer, int numbers []); 
void swap_values (int index1, int index2, int numbers []); 
void print (int numbers []); 

int main(int argc, char *argv[]) 
{ 
    // array of numbers 
    int numbers [size] = {7, 9, 21, 16, 65, 8, 32, 1, 17, 41, 
         54, 128, 62, 44, 12, 1023, 89, 905, 32, -12}; 
    int *start_ptr 
     , *start_pointer; // current starting spot for search 
    int *small_ptr 
     , *small_pointer; // index of the smallest number in the array 
    int * mover; 
    int *size; 


    start_ptr = 0; 

    // continue finding the smallest value and placing it 
    // at the front of the list 
    while (start_ptr < size - 1) 
    { 
      *small_pointer = find_small_pointer (*start_pointer, numbers); 
      swap_values (*small_pointer, *start_pointer, numbers); 
      *start_pointer++; 
    } 

    cout << "\n\nThe sorted array is:\n"; 
    print (numbers); 

    cout << "\n\n"; 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

// finds and returns the index of the smallest number remaining in 
// the array 
int find_small_pointer (int *start_pointer, int numbers []) 
{ 
    int *small_pointer, // smallest index to be returned 
     mover;  // current index being viewed 

    small_pointer = start_pointer; 
    // look at each element 
    for (mover = start_pointer + 1; mover < size; mover++) 
     // remember index of smaller value 
     if (numbers [mover] < numbers [small_ptr]) 
      small_pointer = mover; 
    return small_pointer; 
} 

// swap the values in the array at indexes index1 and index2 
void swap_values (int mover1, int mover2, int numbers []) 
{ 
    int swapper; 

    swapper = numbers [mover1]; 
    numbers [mover1] = numbers [mover2]; 
    numbers [mover2] = swapper; 
} 

// prints the array in nice format, 10 numbers per line 
void print (int numbers []) 
{ 
    int on_line, // number of values printed on the line 
     mover; // index of current number being printed 

    on_line = 0; 
    // print each element in the array 
    for (mover = 0; mover < size; mover++) 
    { 
     cout << setw (5) << numbers [mover]; 
     on_line++; 
     // if 10 numbers have been printed on the line 
     // go to next line 
     if (on_line == 10) 
     { 
      cout << "\n"; 
      on_line = 0; 
     } 
    } 
} 
+1

사이드 노트 : 모든 변수를 함수의 맨 위에 선언하지 마십시오. 가능한 한 늦게 선언하십시오. 이것은 일반적으로 초기화 할 때 선언하는 것을 의미합니다. –

답변

0

size이라는 두 가지가 있습니다. 두 번째 항목의 이름은 예를 들어 end과 같이 다른 것으로 지정해야합니다. 좋은 취향과 유지 관리의 문제입니다. 더 중요한 것은 초기화되어야합니다 : int *end = numbers + size. 그러면 진술 문 while (start_ptr < end - 1)이 현명하게 작동합니다.

#include <iterator> 
⋮ 
    while (start_ptr < std::end(numbers) - 1) 
    ⋮ 

또한 swapValues가 불필요 참고 : 당신이 쓸 수 있기 때문에 C++ 11에서

,이 변수도 필요하지 않습니다. (당신은 정수로 포인터를 전달하는 때문에, swapValues에 대한 호출이 실제로 잘못되는) 포인터 버전,

#include <utility> 
⋮ 
    std::swap(numbers[small_index], numbers[start_index]); 

또는 : 당신은 쓸 수

std::swap(*small_pointer, *start_pointer); 

몇 가지 더 많은 문제가 있습니다 코드와 함께,하지만 시간이 없어. 죄송합니다. 당신의 while 루프

while (start_ptr < size - 1) 

에서

1

당신은 크기로 포인터를 비교한다. pointee를 비교해야합니다. 그래서, 그 전에 몇 줄에 대한

*start_ptr < size - 1 

같은 일이 당신은 당신이 포인터 또는 pointee에 무언가를 할 것인지 여부를 알고 있는지 확인 0

*start_ptr = 0 

로 설정합니다.

관련 문제