0

2 番目の配列を使用せずに配列を反転しようとしています。これが私が書いたコードですが、何らかの理由で機能していないようです。

#include<stdio.h>
#include<conio.h>
void getarrayvalues();
void main()
{
 int k,n;
 int i=0;
 int a[100];
 printf("Enter the value of n");
 scanf("%d", &n);
 printf("Ener the values of array");
 for(i=0;i<n;i++)
 {
   scanf("%d", &a[i]);
 }
 k=n;
 if(n%2==0)
 {
   for(i=0;i<n;i++)
   {
      a[i]=a[k];
      k--;
   }
 }
 else
 {
   for(i=0;i<n;i++)
   {
     if(k==((n/2)+1))
     {
       continue;
     }
     else
     {
       a[i]=a[k];
       k--;
     }
   }
 }
 printf("reverse values are");
 for(i=0;i<n;i++)
 {
  printf("%d", a[i]);
 }
}

配列値を入力した後、青いコード書き込み画面に戻り、出力を印刷しません。何か案は ?

4

5 に答える 5

3

最初に表示されるエラーは、kとして開始することですn。配列インデックスはゼロから始まるため、n配列の位置は最後の要素の 1 つ後です。a次のように開始する必要があります。

k=n-1;

第二に、あなたがするとき

for(i=0;i<n;i++)
{
   a[i]=a[k];
   k--;
}

配列の前半を反転した後半で上書きしますが、その過程で前半の元の値が失われます。以前の値を別の場所に保存しないa[i]と、割り当てによって失われます。の値を配置するのに適した場所はa[i]、配列を反転しているため、対称的な反対側の位置で、たまたまa[k]です。コードは次のようになります。

for(i=0;i<n;i++)
{
   int temp = a[i];
   a[i]=a[k];
   a[k]=temp;
   k--;
}

しかし、そうすると、i == n/2配列全体がすでにスワップされているため、そこで停止する必要があります。

for(i=0;i<=(n/2);i++)
{
   int temp = a[i];
   a[i]=a[k];
   a[k]=temp;
   k--;
}

n最後に、が奇数か偶数かを別の方法で扱う必要はありません。奇数の場合、中央の要素は必要な場所に既にあるためです...

于 2013-09-20T19:17:20.280 に答える
1

a[i] 値のみを割り当てています。a[k] 値も割り当てる必要があります。例えば ​​:

int temp;

//code

temp = a[i];
a[i] = a[k];
a[k] = temp;

基本的に、配列の値を複製しています。

編集

また、ivella が言ったことを確認する必要があります。それを考慮しないと、null メモリにアクセスすることになります (プログラムがクラッシュします)。

于 2013-09-20T19:16:23.037 に答える
0

C++ ではなく、C を使用しているようです。次のように、2 番目の配列なしで反転を実行できます。

int array[SIZE];
// fill in array
for (int i = 0; i < SIZE / 2; ++i)
{
    int t = array[i];
    array[i] = array[SIZE - i - 1];
    array[SIZE - i - 1] = t;
}

C++ ソリューションは、要件に応じていくつかの方法で実行できます。例えば:

std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::reverse(v.begin(), v.end());
于 2013-09-20T19:17:57.497 に答える