web-dev-qa-db-fra.com

Inverser le contenu d'un tableau

J'ai une série de chiffres que j'essaie d'inverser. Je crois que la fonction de mon code est correcte, mais je ne parviens pas à obtenir le bon résultat.

La sortie indique: 10 9 8 7 6 . Pourquoi ne puis-je pas obtenir l'autre moitié des chiffres? Quand je retire le "/ 2" du compte, la sortie lit: 10 9 8 7 6 6 7 8 9 10

void reverse(int [], int);

int main ()
{
   const int SIZE = 10;
   int arr [SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

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

      cout << temp << " ";
   }
}
12
John

Ce serait mon approche:

#include <algorithm>
#include <iterator>

int main()
{
  const int SIZE = 10;
  int arr [SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  std::reverse(std::begin(arr), std::end(arr));
  ...
}
19
juanchopanza

La ligne

arr[i] = temp;

est faux. (Lors de la première itération de votre boucle, il définit arr[i] sur une valeur non définie; les itérations suivantes la définissent sur une valeur incorrecte.) Si vous supprimez cette ligne, votre tableau doit être inversé correctement.

Ensuite, vous devez déplacer le code qui imprime le tableau inversé dans une nouvelle boucle qui parcourt la liste entière. Votre code actuel n’imprime que les premiers éléments count/2.

int temp, i;
for (i = 0; i < count/2; ++i) {
    temp = arr[count-i-1];
    arr[count-i-1] = arr[i];
    arr[i] = temp;
}
for (i = 0; i < count; ++i) {
    cout << arr[i] << " ";
}
15
simonc

Les deux réponses me semblent correctes.

1) Le premier arr[i] = temp; devrait être supprimé

2) Vous devriez faire une seconde boucle pour imprimer tous éléments, pas seulement la moitié du tableau. La boucle qui fait l'inverse n'a pas besoin de l'imprimer.

3
Matt

Vous n'imprimez pas le tableau, vous imprimez la valeur de temp - qui ne représente que la moitié du tableau ...

2
Floris
void reverse(int [], int);
void printarray(int [], int );
int main ()
{
    const int SIZE = 10;
    int arr [SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

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

    return 0;
}

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;
   }
}
1
user93353

J'utiliserais la fonction reverse() de la bibliothèque <algorithm>.

Courez-le en ligne: repl.it/@abranhe/Reverse-Array

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
  int arr [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  reverse(begin(arr), end(arr));

  for(auto item:arr)
  {
    cout << item << " ";
  }
}

Sortie:

10 9 8 7 6 5 4 3 2 1

J'espère que vous aimez cette approche.

1
Carlos Abraham

La solution à cette question est très simple: les vecteurs

std::vector<int> vector;
for(int i = 0; i < 10;i++)
{
    vector.Push_back(i);
}
std::reverse(vector.begin(), vector.end());

Voila! Vous avez terminé! =)

Détails de la solution:

C'est la solution la plus efficace: Swap ne peut pas échanger 3 valeurs mais inversement peut. N'oubliez pas d'inclure l'algorithme. C'est tellement simple que le code compilé n'est absolument pas nécessaire.

Je pense que cela résout le problème du PO 

Si vous pensez que cette solution présente des erreurs ou des problèmes, veuillez commenter ci-dessous.

1
user2913837

En réponse directe à votre question: votre échange est faux

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

assigner arr[i] = temp provoque une erreur lorsqu’il entre dans la boucle pour la première fois, car temp contient initialement des données vides et va détruire votre tableau, le supprimer et le code devrait bien fonctionner.

À titre de conseil, utilisez les fonctions intégrées chaque fois que possible: 

  • Lors de la permutation, vous pouvez simplement utiliser swap like std::swap(arr[i], arr[count-i-1]) 
  • Pour l’inverse dans son ensemble, utilisez simplement reverse like std::reverse(arr, arr+count)

J'utilise C++ 14 et inverse fonctionne avec des tableaux sans aucun problème.

1
Argento
#include "stdafx.h"
#include <iostream>
using namespace std;

void main()
{
    int n, i;
    cout << "n = ";
    cin >> n;
    int *a = new int[n];
    int *b = new int[n];
    for (i = 0; i < n; i++)
    {
        cout << "a[" << i << "]= ";
        cin >> a[i];
    }
    for (i = 0; i < n; i++)
    {
        b[i] = a[n - 1 - i];
    }
    for (i = 0; i < n; i++)
    {
        cout << b[i];
    }
}
0
Diana

Tout d’abord, vous affectez temp aux éléments de tableau et vous devez supprimer la déclaration arr[i] = temp;. Le problème suivant est que vous imprimez une variable temporaire ne montrant que la moitié des éléments du tableau (dans votre boucle for). Si vous ne voulez pas utiliser les vecteurs STL, je suggérerais cette solution: 

#include <iostream>

void reverseArray(int userArray[], int size);

void printArray(int userArray[], int size);

int main(int arg, char**argv) {

    int arr[]{ 1,2,3,4,5,6,7,8,9,10 };
    int sizeOfArray = sizeof(arr) / sizeof(arr[0]);

    reverseArray(arr, sizeOfArray);
    printArray(arr, sizeOfArray);

    system("pause");
    return(0);
}

void reverseArray(int userArray[], int size) {

    int* ptrHead = userArray;
    int* ptrTail = userArray + (size-1);

    while (ptrTail > ptrHead) {
        int temp = *ptrHead;
        *ptrHead = *ptrTail;
        *ptrTail = temp;

        ptrHead++;
        ptrTail--;
    }
}

void printArray(int userArray[], int size) {
    for (int i = 0; i < size; i++) {
        std::cout << userArray[i] << " ";
    }
}
0
M.Baryłowicz
Procedure :

 1.Take an array.

 2.Then by default function reverse(array_name, array_name + size) .
  reverse(array_name, array_name + size) function exits in algorithm.h header file.

 3.Now print the array. 

 N.B  Here we use new and delete for dynamic memory allocation.

Implémentation C++:


#include<bits/stdc++.h>
using namespace std;


int main()
{
   int n;
   cin>>n;

   int *arr = new int[n];


   for(int i=0; i<n; i++)  cin>>arr[i];

   reverse(arr, arr+n);

   for(int i=0; i<n; i++)    cout<<arr[i]<<" ";

   delete[] arr;

   return 0;
}
0
rashedcs

Votre boucle ne fonctionnera que pour count/2 fois. Donc, il n’imprimera pas tout le tableau.

De plus, temp=ar[i] doit être utilisé à la place de ar[i]=temp car la valeur de ar[i] n'est pas stockée dans la dernière instruction, elle est donc détruite.

0
user8110804
for(i=0;i<((s3)/2);i++)
{         
    z=s2[i];
    s2[i]=s2[(s3-1)-i];
    s2[(s3-1)-i]=z;
}
0
Arshad shaik

Je voudrais essayer d'utiliser des pointeurs pour résoudre ce problème. Mon code ci-dessous.

    #include <iostream>

    void displayArray(int table[], int size);

    void rev(int table[], int size);


    int main(int argc, char** argv) {

      int a[10] = { 1,2,3,4,5,6,7,8,9,10 };

      rev(a, 10);
      displayArray(a, 10);

      return 0;
    }

    void displayArray(int table[], int size) {
      for (int i = 0; i < size; i++) {
          std::cout << table[i] << " ";
      }
      std::cout << std::endl;
    }

    void rev(int table[], int size) {

      int *start = table;
      int *end = table + (size - 1);

      for (int i = 0; i < size; i++) {

          if (start < end) {
              int temp = *end;
              *end = *start;
              *start = temp;
          }

          start++;
          end--;
      }
    }
0
M.Baryłowicz