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_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;
         }
     }
}
4

2 に答える 2

1

あなたのwhileループで

while (start_ptr < size - 1)

ポインタとサイズを比較しています。ポインティを比較する必要があります。そう、

*start_ptr < size - 1

0に設定すると、その前の数行も同じです。

*start_ptr = 0

ポインタまたはそのポインティに対して何かを行いたいかどうかを確認してください。

于 2012-11-10T04:21:11.217 に答える
0

と呼ばれる 2 つの異なるものがありsizeます。end2 番目の名前は、センスと保守性の問題として、たとえば などの別の名前にする必要があります。さらに重要なことは、初期化する必要があることです: int *end = numbers + size. その後、ステートメントwhile (start_ptr < end - 1)は賢明に動作します。

C++11 では、次のように記述できるため、この変数は必要ありません。

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

不要なので注意swapValues。あなたは書ける:

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

または、ポインターバージョン (swapValuesポインターを整数として渡しているため、への呼び出しが実際には間違っています):

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

コードには他にもいくつか問題がありますが、時間切れになりました。ごめん。

于 2012-11-10T03:19:09.370 に答える