Inhoud in array omkeren

Ik heb een reeks getallen die ik probeer om te draaien. Ik geloof dat de functie in mijn code correct is, maar ik krijg niet de juiste uitvoer.

De uitvoer luidt: 10 9 8 7 6.
Waarom krijg ik de andere helft van de cijfers niet? Wanneer ik de “/2” van de telling verwijder, luidt de uitvoer: 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 << " ";
   }
}

Antwoord 1, autoriteit 100%

Dit zou mijn aanpak zijn:

#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));
  ...
}

Antwoord 2, autoriteit 67%

De lijn

arr[i] = temp;

is fout. (Bij de eerste iteratie van je lus stelt het arr[i]in op een ongedefinieerde waarde; verdere iteraties stellen het in op een onjuiste waarde.) Als je deze regel verwijdert, zou je array correct moeten worden omgekeerd.

Daarna moet u de code die de omgekeerde array afdrukt, verplaatsen naar een nieuwe lus die de hele lijst herhaalt. Uw huidige code drukt alleen de eerste count/2elementen af.

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

Antwoord 3, autoriteit 12%

Ik zou de functie reverse()uit de <algorithm>-bibliotheek gebruiken.

Voer het online uit: 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 << " ";
  }
}

Uitvoer:

10 9 8 7 6 5 4 3 2 1

Ik hoop dat je deze aanpak leuk vindt.


Antwoord 4, autoriteit 12%

Beide antwoorden lijken mij correct.

  1. De eerste arr[i] = temp;moet worden verwijderd

  2. Je moet een tweede lus maken om alleelementen af te drukken, niet alleen de helft van de array. De lus die het omgekeerde doet, hoeft deze niet af te drukken.


Antwoord 5, autoriteit 8%

U drukt de array niet af, u drukt de waarde van tempaf – wat slechts de helft van de array is…


Antwoord 6, autoriteit 4%

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

Antwoord 7, autoriteit 4%

De oplossing voor deze vraag is heel eenvoudig: Vectoren

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

Voila! Je bent klaar! =)

Oplossingsdetails:

Dit is de meest efficiënte oplossing: Swap kan geen 3 waarden omwisselen, maar reverse wel.
Vergeet niet om het algoritme op te nemen.
Dit is zo eenvoudig dat de gecompileerde code absoluut niet nodig is.

Ik denk dat dit het probleem van de OP oplost

Als je denkt dat er fouten en problemen zijn met deze oplossing, reageer dan hieronder


Antwoord 8, autoriteit 4%

Als direct antwoord op uw vraag: uw ruiling is verkeerd

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

het toewijzen van arr[i] = tempveroorzaakt een fout wanneer het voor het eerst de lus binnengaat, aangezien temp aanvankelijk afvalgegevens bevat en uw array zal verpesten, het zal verwijderen en de code zou goed moeten werken.

Gebruik als advies waar mogelijk ingebouwde functies:

  • Bij het ruilen kun je gewoon swapgebruiken zoals
    std::swap(arr[i], arr[count-i-1])
  • Voor het omgekeerde als geheel
    gebruik gewoon omgekeerdezoals std::reverse(arr, arr+count)

Ik gebruik C++14 en reverse werkt zonder problemen met arrays.


Antwoord 9, autoriteit 4%

Allereerst welke waarde heb je in dit stukje code? int temp;? Je kunt het niet zien, want in elke afzonderlijke compilatie zal het een andere waarde hebben – je moet je waarde initialiseren om geen prullenbakwaarde uit het geheugen te hebben. De volgende vraag is: waarom wijst u deze tijdelijke waarde toe aan uw array?
Als je bij je oplossing wilt blijven, zou ik de omgekeerde functie als volgt veranderen:

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

Nu werkt het, maar je hebt andere opties om dit probleem op te lossen.

Oplossing met behulp van aanwijzers:

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

En zoals Carlos Abraham zegt, gebruik de ingebouwde functie in de algorithm-bibliotheek


Antwoord 10

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

Antwoord 11

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++ implementatie:


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

Antwoord 12

Uw lus wordt alleen uitgevoerd voor count/2tijden. Dus het zal de hele array niet afdrukken.

Ook, temp=ar[i]moet worden gebruikt in plaats van ar[i]=tempals waarde van ar[i]wordt overal in de laatste verklaring niet opgeslagen, vandaar dat het wordt vernietigd.


Antwoord 13

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

Antwoord 14

Allereerst u Temp toewijzen aan array-elemets en u moet arr[i] = temp;-afbeelding verwijderen. Volgend probleem is dat u Temp-variabele afdrukt die slechts de helft van de array-elementen (in uw voor loop) toont. Als u geen STL-vectoren wilt gebruiken, zou ik deze oplossing voorstellen:

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

Antwoord 15

Ik zou proberen aanwijzingen te gebruiken om dit probleem op te lossen:

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

Antwoord 16

mijn aanpak is het verwisselen van het eerste en laatste element van de array

int i,j;
for ( i = 0,j = size - 1 ; i < j ; i++,j--)
{  
    int temp = A[i];
    A[i] = A[j];
    A[j] = temp; 
}

Antwoord 17

U kunt het volgende voorbeeld gebruiken om de inhoud in een array om te keren:

#include <iostream>
int main()
{
    int n, x;
    // order value for var x
    cin >> x;  
    // create array and the value for array is value var x
    int arr[x];
    // loop for insert values for array by reverse  
    for(int i=x; i > 0; i--) {
        // var i is number of elements in array 
        cin >> n;
        arr[i - 1] = n;
    }
    // show element in array
    for(int l = 0; l < x; l++) {
        cout<<arr[l]<<endl;
    }
    return 0;        
}

Antwoord 18

probeer dit, kun je beter vallen in vergelijking met andere codes.

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

Other episodes