2016-08-31 8 views
0

私は以下のように動作するプログラムを作った。逆配列機能

ユーザーは、配列の大きさを決定します。

ユーザは、選択されたx個の整数で配列を塗りつぶします。彼らは配列5を大きくすることを選択した場合、5つの数で配列を埋めるように求められます。しかし、私はこれをどうやってやれるのかちょっと固まってしまいました。このビットが済んだら、他のすべてがうまくいくはずです。

ここに私のコードです。

#include <iostream> 

using std::cout; 
using std::endl; 
using std::cin; 

void reverse(int [], int); 
void printarray(int [], int); 

void printarray(int arr[], int count) 
{ 
     for(int i = 0; i < count; ++i) 
       cout<<arr[i]<<' '; 

     cout<<'\n'; 
} 

void reverse(int arr[], int count) 
{ 
    int temp; 
    for (int i = 0; i < count/2; ++i) 
    { 
      temp = arr[i]; 
      arr[i] = arr[count-i-1]; 
      arr[count-i-1] = temp; 
    } 
} 

int main() 
{ 
     int x; 
     cout << "how big is this thing " << endl; 
     cin >> 
     const int SIZE = x; 
     int arr [SIZE] = {., ., ., ., ., ., ., . , ., .}; 

     cout<<"Before reverse\n"; 
     printarray(arr, SIZE); 
     reverse(arr, SIZE); 
     cout<<"After reverse\n"; 
     printarray(arr, SIZE); 

     return 0; 
} 

私は私が配列を行っているので、そう長くなっています申し訳ありませんが、ループや配列の各インデックスに整数を繰り返して入力する何かのために使用する必要があると信じています。 この問題に関するお手伝いをさせていただきます。 M.Mから前述のように

+1

を次のことを試すことができます。ユーザーが配列のサイズを変更できる場合は、固定最大サイズを使用するか、配列の代わりに 'vector'などの別のコンテナを使用する必要があります。 –

答えて

-1

、のstd ::ベクトルを使用して、ベクターの先頭に挿入

#include <iostream> 
#include <vector> 


int main(int argc, char** argv) 
{ 
    std::vector<int> values; 
    int n_values; 

    std::cout << "How mutch numbers ?"; 
    std::cin >> n_values; 

    std::cout << "Now Enter " << n_values << " Values : "; 
    for(auto i=0; i<n_values; i++) 
    { 
     int tmp; 
     std::cin >> tmp; 

     values.insert(values.begin(), tmp); 
    } 

    for(auto elem : values) 
     std::cout << elem << "\n"; 


    return 0; 
} 
+3

良いプログラミング習慣に関して、入力がファイルから来ていて、5または7以上である可能性がある場合、このアプローチは2次時間O(n²)を持ちます。代わりに '.push_back'と' std :: reverse'(フリー関数)の最後の呼び出しを使用した方が、より合理的なO(n)が得られます。 –

+0

なぜ 'std :: begin'を使うのですか?私はそれがあなただけのテンプレートで使うと思っていましたが、ここであなたはそれが既に '.begin()'ではないことを知っていますか?私はちょうど好奇心です – szx

+0

@szx、あなたは正しいです、私はそれを変更しました:) – Roby

0

これは宿題の運動のように聞こえる(あなたが逆だ必要はありませんか)?ほとんどの場合、std :: vectorのようなものを使用していますが、これはネイティブ配列に固執する必要があると思います。

int arr[SIZE]; 

これは、スタック上に配列を作成し、コンパイル時にサイズを知る必要があります。あなたが実行時までサイズがわからない場合は、newキーワードを使用して、ヒープ上の配列を割り当てる必要になります(またはmallocのようなものを経由して)

int *arr = new int[x]; 

あなたができたらこのメモリを自分で解放する必要があります完了しました

delete[] arr; 

これは、開始するのに十分であり、正しい方向を指しているはずです。うまくいけば

0

int array[SIZE]を使用することはできませんコンパイル時に配列のサイズは不明です。

あなたはnewで、実行時にメモリを割り当てる必要があります。

int x; 
cout << "how big is this thing " << endl; 
cin >> x; 
int *arr = new int[x]; 

for(int i = 0; i < x; i++) { 
    cout << "enter arry[" << i << "]" << endl; 
    cin >> arr[i]; 
} 

cout<<"Before reverse\n"; 
printarray(arr, SIZE); 
reverse(arr, SIZE); 
cout<<"After reverse\n"; 
printarray(arr, SIZE); 

delete[] arr; 

delete[] arrオペレータが割り当てられた配列を解放します。メモリリークを避けるため、割り当てられたすべてのメモリブロックを解放する必要があります。

0

あなたは...

`SIZE`は、アレイのためのコンパイル時に知られなければならない
#include <iostream> 
#include <string> 

void reverse(int arr[], int count) 
{ 
    int temp; 
    for (int i = 0; i < count/2; ++i) 
    { 
      temp = arr[i]; 
      arr[i] = arr[count-i-1]; 
      arr[count-i-1] = temp; 
    } 
} 

void print_array(int my_array[], int array_size) 
{ 
    std::cout << "Your array: "; 
    for (int x = 0; x <array_size; x++) { 
     std::cout << my_array[x] << " "; 
    } 
    std::cout << std::endl; 
} 

int main() 
{ 
    int array_size; 
    std::cout << "how big is this thing " << std::endl; 
    std::cin >> array_size; 

    int my_array[array_size]; 

    std::cout << "Please enter the elements of the array. Press ENTER after each element." << std::endl; 
    for (int x = 0; x <array_size; x++) { 
     std::cin >> my_array[x]; 
    } 

    print_array(my_array, array_size); 

    std::cout << "Reverse array..." << std::endl; 
    reverse(my_array, array_size); 
    print_array(my_array, array_size); 
}