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 << " ";
}
}
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));
...
}
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] << " ";
}
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.
Vous n'imprimez pas le tableau, vous imprimez la valeur de temp
- qui ne représente que la moitié du tableau ...
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;
}
}
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.
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.
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:
std::swap(arr[i], arr[count-i-1])
std::reverse(arr, arr+count)
J'utilise C++ 14 et inverse fonctionne avec des tableaux sans aucun problème.
#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];
}
}
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] << " ";
}
}
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;
}
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.
for(i=0;i<((s3)/2);i++)
{
z=s2[i];
s2[i]=s2[(s3-1)-i];
s2[(s3-1)-i]=z;
}
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--; } }