2013-10-31 19 views
9

Ich habe eine Reihe von Zahlen, die ich versuche umzukehren. Ich glaube, dass die Funktion in meinem Code korrekt ist, aber ich kann nicht die richtige Ausgabe erhalten.Umgekehrter Inhalt in Array

Der Ausgang lautet: 10 9 8 7 6. Warum kann ich nicht die andere Hälfte der Zahlen bekommen? Als ich die "/ 2" von Zählung zu entfernen, liest 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 << " "; 
    } 
} 
+1

Ihre Schleife läuft nur für die Hälfte der Länge des Arrays, wenn Sie die Zählung durch 2 teilen, so dass es nur die Hälfte der Array-Inhalt auf dem Bildschirm ausgibt. – Josh

+3

Schauen Sie sich Ihren swapping mit temps;) – jbh

+1

Mit 'std :: swap()' wäre idiotensicher - weshalb es existiert;) – marko

Antwort

2

Sie das Array nicht gedruckt wird, werden Sie den Wert temp Druck - die nur die Hälfte der Array ...

14

die Linie

arr[i] = temp; 

ist falsch. (Bei der ersten Iteration Ihrer Schleife wird arr[i] auf einen nicht definierten Wert gesetzt; bei weiteren Iterationen wird der Wert auf einen falschen Wert gesetzt.) 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 über die gesamte Liste iteriert. 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] << " "; 
} 
3

Beide Antworten sehen für mich richtig aus.

1) Die erste arr[i] = temp; sollte

2) entfernt werden Sie sollten eine zweite Schleife tun alle Elemente zu drucken, nicht nur die Hälfte der Anordnung. Die Schleife, die das Gegenteil tut, muss es nicht drucken.

16

Dies 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)); 
    ... 
} 
+0

Ich glaube, dass die andere Antwort (mit 'temp'-Variable) eine Zeit Komplexität von O hat (n) und Raumkomplexität von O (1). Was wäre die Komplexität in diesem Fall? –

+1

@skr_robo Das Gleiche. Siehe [hier] (http://en.cppreference.com/w/cpp/algorithm/reverse) für die zeitliche Komplexität. Die Implementierung tauscht nur Wertepaare aus. – juanchopanza

1
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; 
    } 
} 
0
#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]; 
    } 
} 
1

Die auf diese Frage Lösung 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ösung im Detail:

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

Ich denke, das das Problem des OP löst

Wenn Sie denken, es irgendwelche Fehler und Probleme mit dieser Lösung einen Kommentar bitte unter

+0

Art von ineffizient, wenn Sie nur in einem Array an Ort und Stelle tauschen können. – siride

+0

Sie könnten auch tauschen, aber es wäre nicht mehr effizient als umgekehrt, weil sie in diesem Fall das gleiche tun. Aber wenn Sie 3 Elemente umkehren müssten, wäre diese Methode am effizientesten. –

-3

versuchen, dies können Sie besser zu einem anderen Codes fiel verglichen wird.

using namespace std; 
int main() { 
    int a[5]={4,6,3,5,9}; 
    for(int i=4;i>=0;i--) { 
     cout<<"\n"<<a[i]; 
    } 
} 
+0

Dies kehrt nicht den * Inhalt * des Arrays um, wie OP gewünscht hat, das Array wird in umgekehrter Reihenfolge gedruckt. – jaggedSpire

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

Als direkte Antwort auf Ihre Frage: Ihr Swapping falsch ist

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

assigni ng arr[i] = temp verursacht einen Fehler, wenn es zum ersten Mal in die Schleife eintritt, da temp anfänglich fehlerhafte Daten enthält und das Array ruiniert, entfernt und der Code gut funktioniert.

Als Beratung, Anwendung integrierten Funktionen, wann immer möglich:

  • Im Vertauschen Sie nur swap wie std::swap(arr[i], arr[count-i-1])
  • Für die umgekehrte als Ganzes nur reverse wie std::reverse(arr, arr+count) verwenden verwenden könnte

Ich benutze C++ 14 und reverse arbeitet mit Arrays ohne Probleme.

0

Zuallererst weisen Sie Array-Elementen Temperatur zu, und Sie sollten arr[i] = temp; Statment entfernen. Das nächste Problem ist, dass Sie eine Temp-Variable drucken, die nur die Hälfte der Array-Elemente anzeigt (in Ihrer for-Schleife). Wenn Sie nicht wollen, STL-Vektoren verwenden Ich würde diese 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] << " "; 
    } 
    std::cout << std::endl; 
} 
0

Ihre Schleife läuft nur für count/2 mal. Es wird also nicht das gesamte Array gedruckt.

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

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

s3 wird die Länge eines Arrays sein. –

0

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