2011-04-13 10 views
1

ベクトルを使用せずに配列を操作することで、さまざまなことをやっていますが、配列内の要素を移動して配列を拡張し、要素で新しい空間を初期化するときに役立ちますか?私はこのコードを完成させるのに非常に近いと感じていますが、私はブロックを打っています。配列を変更する

#include <iostream> 
using namespace std; 


// Function prototypes 
int *reverse(int *, int); 
int *expand(int *, int); 
int *shift(int *, int); 
void display(int[], int); 
void display2(int[], int); 
void display3(int[], int); 


int main() 
{ 
    int const SIZE = 5; 
    int myArray [SIZE] = {1, 2, 3, 4, 5}; 
    int myArray2 [SIZE] = {1, 2, 3, 4, 5}; 
    int myArray3 [SIZE] = {1, 2, 3, 4, 5}; 

    int *arraPtr; 
    int *arraPtr2; 
    int *arraPtr3; 

    arraPtr = reverse(myArray, SIZE); 

    display(myArray, SIZE); 

    arraPtr2 = expand(myArray2, SIZE); 

    display2(myArray2, SIZE); 

    arraPtr3 = shift(myArray3, SIZE); 

    display3(myArray3, SIZE); 

    delete [] arraPtr; 
    delete [] arraPtr2; 
    delete [] arraPtr3; 


    return 0; 
} 



int *reverse(int *arr, int size) 
{ 
    int *copyArray; 
    int posChange; 

    if(size < 0) 
     return NULL; 

    copyArray = new int[size]; 

    for (int index = 0; index < --size; index++) 
    { 
      posChange = arr[index]; 
      arr[index] = arr[size]; 
      arr[size] = posChange; 

    } 
    return copyArray; 

} 


int *expand(int *arr, int size) 
{ 
    int *newArray; 

     newArray = new int[size * 2]; 
memcpy(newArray, arr, size * sizeof(int)); 
for (int index = size; index < (size*2); index++) 
    newArray[index] = 0; 
return newArray; 




} 

int *shift(int *arr, int size) 
{ 
    int *newArray; 
    newArray = arr; 
    newArray = new int [size + 1]; 
    for (int index = 5; index > 0; index--) 
     newArray[index] = newArray[index - 1]; 

return newArray; 


} 

void display(int arr[], int size) 
{ 
    for (int index = 0; index < size; index++) 
    { 
     cout << arr[index] << " "; 
    } 

     cout << endl; 
} 

void display2(int arr[], int size) 
{ 
    for (int index = 0; index < size; index++) 
    { 
     cout << arr[index] << " "; 
    } 
     cout << endl; 

} 

void display3(int arr[], int size) 
{ 
    for (int index = 0; index < size; index++) 
    { 
     cout <<arr[index] << " "; 
    } 
     cout << endl; 

} 
+0

シフト内のnewArray変数がintポインタである必要がありますが、残りのコードでshiftを実際に使用していない場合はおそらく問題ではないと考えられます。あなたはおそらくそれを更新する必要があります。 –

+0

問題はなんですか?何かエラーがありますか?期待どおりに動作しないのは何ですか?どのように期待どおりに動作しませんか? – sth

答えて

1

2つだけコンパイルエラーがあります:int newArray;int* newArray;#include <cstring>でなければなりません。また(memcpy()するために必要な)

が欠落している、ラインdisplay(myArray, SIZE);はおそらくdisplay(arraPtr, SIZE);と同様にdisplay2(myArray2, SIZE);であることを意味した - そうしないとだけ表示されています元の配列であり、関数呼び出しの結果ではありません。

int *reverse(int *arr, int size) 
{ 
    int *copyArray = new int[size]; 
    std::reverse_copy(arr, arr+size, copyArray); 
    return copyArray; 
} 
int *expand(int *arr, int size) 
{ 
    int *newArray = new int[size * 2](); 
    std::copy(arr, arr+size, newArray); 
    return newArray; 
} 
int *shift(int *arr, int size) 
{ 
    int* newArray = new int [size + 1](); 
    std::copy(arr, arr+size, newArray+1); 
    return newArray; 
} 

完全なプログラム:

しかし、これは、より安全でより汎用的なC++のアルゴリズムからstd::copy()std::reverse_copy()少なくとも利益を得ることができるhttps://ideone.com/RNFiV

+0

あなたの記事を読む前に自分のソリューションを編集していましたが、genericアルゴリズムを使用していないので投稿しますので、実際のコードではあなたの方がはるかに優れていますが、 – AntonioMO

+0

@machielo問題文の漠然としていることを考えると、いずれの答えもOPが探しているものである可能性があります。 – Cubbi

1

これは主にCコードですが、私はあなたが構文よりもやっていることの方法についていくつかのヒントを与えるためにしようとするでしょう:

をあなたの逆の機能では、あなたが実際に何を入れたことがありません新しい配列に追加します。 forループでいくつかのスワップを行う代わりに、元のループを逆方向に実行して、要素を新しい配列に配置することができます。

2つの逆のことをしようとしているように見えます。入力配列から新しい配列にメモリをコピーし、新しい配列をすべて0に上書きします。手動でメモリをコピーしたい場合は、元の配列を元の配列にコピーして新しい配列にその値をコピーするだけで済みます(元の配列のサイズの2倍を超えないでください。 )。もしmemcpyを使いたいなら、forループを取り除いてください。

私はシフト機能に何をしたいのか分かりませんが、現在は配列をコピーするだけです。

+0

質問を投稿した後に私はいくつか変更しました... – Shimar

+0

@Shimarはいくつか修正されているかもしれませんが、まだもっとやるべきことがあるようです。 – DShook

0

を私はあなたがしたいんでした正確に何を知っていません達成することができます:

#include <iostream> 
#include <cstring> // Needed to compile on most compilers(memcpy), dunno in yours 
using namespace std; 


// Function prototypes 
int *reverse(int *, int); 
int *expand(int *, int); 
int *shift(int *, int); 
void display(int[], int); 
void display2(int[], int); 


int main() 
{ 
    int const SIZE = 5; 
    int myArray [SIZE] = {1, 2, 3, 4, 5}; 
    int myArray2 [SIZE] = {1, 2, 3, 4, 5}; 
    int myArray3 [SIZE] = {1, 2, 3, 4, 5}; 

    int *arraPtr; 
    int *arraPtr2; 

    arraPtr = reverse(myArray, SIZE); 

    display(arraPtr, SIZE); 

    arraPtr2 = expand(myArray2, SIZE); 

    display2(arraPtr2, SIZE * 2); 

    delete [] arraPtr; 
    delete [] arraPtr2; 


    return 0; 
} 



int *reverse(int *arr, int size) 
{ 
    int *copyArray; 
    int posChange; 

    if(size < 0) 
     return NULL; 

    copyArray = new int[size]; 

    for (int index = 0; index <= --size; index++) 
    { 
      posChange = arr[index]; 
      copyArray[index] = arr[size]; 
      copyArray[size] = posChange; 

    } 
    return copyArray; 

} 


int *expand(int *arr, int size) 
{ 
    int *newArray; 

    newArray = new int[size * 2]; 
    memcpy(newArray, arr, size * sizeof(int)); 
    for (int index = size; index < (size*2); index++) 
     newArray[index] = 0; 
    return newArray; 
} 

int *shift(int *arr, int size) 
{ 
    int *newArray; 
    newArray = new int [size + 1]; 
    memcpy(newArray, arr, size * sizeof(int)); 


return newArray; 


} 

void display(int arr[], int size) 
{ 
    for (int index = 0; index < size; index++) 
    { 
     cout << endl << arr[index] << " "; 
    } 
} 

void display2(int arr[], int size) 
{ 
    for (int index = 0; index < size; index++) 
    { 
     cout << arr[index] << " "; 
    } 
} 

あなたが問題を抱えている場合この種のものは、ポインターとポインタ算術について話す良いCリソースを見てください。低レベルのC++コードを実行する必要があるときに便利です。

関連する問題