it-swarm.com.de

Inhalt im Array umkehren

Ich habe eine Reihe von Zahlen, die ich umkehren möchte. Ich glaube, dass die Funktion in meinem Code korrekt ist, aber ich bekomme keine korrekte Ausgabe.

Die Ausgabe lautet: 10 9 8 7 6 ... Warum kann ich nicht die andere Hälfte der Zahlen erhalten? Wenn ich "/ 2" von count entferne, lautet die Ausgabe: 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

Das wäre mein Ansatz:

#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

Die Linie

arr[i] = temp;

ist falsch. (Bei der ersten Iteration Ihrer Schleife wird arr[i] auf einen undefinierten Wert festgelegt; weitere Iterationen setzen ihn auf einen falschen Wert.) Wenn Sie diese Zeile entfernen, sollte Ihr Array korrekt umgekehrt werden.

Danach sollten Sie den Code, der das umgekehrte Array druckt, in eine neue Schleife verschieben, die die gesamte Liste durchläuft. Ihr aktueller Code druckt nur die ersten count/2-Elemente.

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

Beide Antworten sehen für mich richtig aus.

1) Der erste arr[i] = temp; sollte entfernt werden

2) Sie sollten eine zweite Schleife ausführen, um all -Elemente zu drucken, nicht nur die Hälfte des Arrays. Die Schleife, die die Umkehrung ausführt, muss nicht gedruckt werden.

3
Matt

Sie drucken das Array nicht, Sie drucken den Wert von temp - was nur die Hälfte des Arrays ist ...

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

Ich würde die Funktion reverse() aus der Bibliothek <algorithm> verwenden.

Führen Sie es online aus: 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 << " ";
  }
}

Ausgabe:

10 9 8 7 6 5 4 3 2 1

Ich hoffe, Sie mögen diesen Ansatz.

1
Carlos Abraham

Zuallererst, welchen Wert haben Sie in diesem Stück Code? int temp;? Sie können nicht sagen, dass es in jeder einzelnen Kompilierung einen anderen Wert hat - Sie sollten Ihren Wert so initialisieren, dass er keinen Papierkorbwert aus dem Speicher enthält. Die nächste Frage lautet: Warum weisen Sie Ihrem Array diesen temporären Wert zu? Wenn Sie an Ihrer Lösung festhalten möchten, würde ich die Umkehrfunktion folgendermaßen ändern:

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

    for (int i = 0; i < count; ++i)
    {
        std::cout << arr[i] << " ";
    }
}

Jetzt wird es funktionieren, aber Sie haben andere Optionen, um dieses Problem zu behandeln.

Lösung mit Zeigern:

void reverse(int arr[], int count)
{
    int* head = arr;
    int* tail = arr + count - 1;
    for (int i = 0; i < count/2; ++i)
    {
        if (head < tail)
        {
            int tmp = *tail;
            *tail = *head;
            *head = tmp;

            head++; tail--;
        }
    }

    for (int i = 0; i < count; ++i)
    {
        std::cout << arr[i] << " ";
    }
}

Und ofc wie Carlos Abraham sagt, verwenden Sie die eingebaute Funktion in der Bibliothek algorithm

1
thebarylowi

Die Lösung dieser Frage ist sehr einfach: Vektoren

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

Voila! Du bist fertig! =)

Lösungsdetails:

Dies ist die effizienteste Lösung: Swap kann 3 Werte nicht vertauschen, aber definitiv umgekehrt. Denken Sie daran, den Algorithmus einzuschließen. Dies ist so einfach, dass der kompilierte Code definitiv nicht benötigt wird.

Ich denke, das löst das Problem der OP 

Wenn Sie der Meinung sind, dass es Fehler und Probleme mit dieser Lösung gibt, kommentieren Sie diese bitte unten

1
user2913837

Als direkte Antwort auf Ihre Frage: Ihr Swapping ist falsch

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

das Zuweisen von arr[i] = temp verursacht einen Fehler, wenn es zum ersten Mal in die Schleife eintritt, da temp zunächst Mülldaten enthält und das Array ruiniert, entfernt und der Code gut funktionieren sollte.

Verwenden Sie nach Möglichkeit integrierte Funktionen, wenn möglich: 

  • Beim Swapping können Sie einfach swap like std::swap(arr[i], arr[count-i-1]) verwenden. 
  • Für das Gegenteil als Ganzes Verwenden Sie einfach reverse like std::reverse(arr, arr+count)

Ich verwende C++ 14 und Reverse funktioniert problemlos mit Arrays.

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

Zunächst weisen Sie den Array-Elementen Temp zu und entfernen Sie arr[i] = temp;-Anweisung. Das nächste Problem ist, dass Sie eine temporäre Variable drucken, die nur die Hälfte der Array-Elemente (in Ihrer for-Schleife) zeigt. Wenn Sie keine STL-Vektoren verwenden möchten, würde ich folgende Lösung vorschlagen: 

#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.

C++ - Implementierung:


#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

Ihre Schleife wird nur für count/2-Zeiten ausgeführt. Es wird also nicht das gesamte Array gedruckt.

Außerdem sollte temp=ar[i] anstelle von ar[i]=temp verwendet werden, da der Wert von ar[i] nirgendwo in der letzten Anweisung gespeichert wird und daher zerstört wird.

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

Ich würde versuchen, Zeiger zu verwenden, um dieses Problem zu lösen. Mein Code unten.

    #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