Ответ 1
Это будет мой подход:
#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));
...
}
У меня есть массив чисел, которые я пытаюсь изменить. Я считаю, что функция в моем коде правильная, но я не могу получить правильный вывод.
Вывод: 10 9 8 7 6. Почему я не могу получить вторую половину номеров? Когда я удаляю "/2" из счета, на выходе выводят: 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 << " ";
}
}
Это будет мой подход:
#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));
...
}
Линия
arr[i] = temp;
неверно. (На первой итерации вашего цикла он устанавливает значение arr[i]
в значение undefined, а дальнейшие итерации устанавливают его на неправильное значение.) Если вы удалите эту строку, ваш массив должен быть правильно изменен.
После этого вы должны переместить код, который печатает обратный массив, в новый цикл, который итерации по всему списку. Ваш текущий код печатает только первые 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] << " ";
}
Оба ответа выглядят корректно для меня.
1) Первый arr[i] = temp;
должен быть удален
2) Вы должны сделать второй цикл для печати элементов all, а не только половины массива. Цикл, который делает обратное, не нуждается в его печати.
Вы не печатаете массив, вы печатаете значение temp
- это всего лишь половина массива...
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;
}
}
Решение этого вопроса очень просто: векторы
std::vector<int> vector;
for(int i = 0; i < 10;i++)
{
vector.push_back(i);
}
std::reverse(vector.begin(), vector.end());
Voila! Вы сделали! =)
Сведения о решении:
Это наиболее эффективное решение: Swap не может поменять 3 значения, но, безусловно, может измениться. Не забудьте включить алгоритм. Это так просто, что скомпилированный код определенно не нужен.
Я думаю, что это решает проблему OP
Если вы считаете, что есть какие-либо ошибки и проблемы с этим решением, прокомментируйте ниже
Как прямой ответ на ваш вопрос: Ваша замена неверна
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;
}
}
присваивание arr[i] = temp
вызывает ошибку, когда он впервые входит в цикл, поскольку temp изначально содержит данные мусора и разрушает ваш массив, удаляет его, и код должен хорошо работать.
Как совет, используйте по возможности встроенные функции:
std::swap(arr[i], arr[count-i-1])
std::reverse(arr, arr+count)
Я использую С++ 14 и без проблем обращается с массивами.
Я бы использовал функцию reverse()
из библиотеки <algorithm>
.
Запустите его онлайн: 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 << " ";
}
}
Выход:
10 9 8 7 6 5 4 3 2 1
Надеюсь, вам нравится этот подход.
Прежде всего, какое значение вы имеете в этой части кода? int temp;
? Вы не можете сказать, потому что в каждой отдельной компиляции это будет иметь различное значение - вы должны инициализировать свое значение, чтобы не иметь значения мусора из памяти. Следующий вопрос: почему вы присваиваете это временное значение вашему массиву? Если вы хотите придерживаться своего решения, я бы изменил функцию реверса следующим образом:
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] << " ";
}
}
Теперь это будет работать, но у вас есть другие варианты решения этой проблемы.
Решение с помощью указателей:
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] << " ";
}
}
И, например, Карлос Абрахам говорит, что использовать встроенную функцию в библиотеке algorithm
#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];
}
}
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.
Реализация С++:
#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;
}
Прежде всего, вы назначаете temp элементам массива, и вы должны удалить arr[i] = temp;
Постулаты. Следующая проблема заключается в том, что вы печатаете временную переменную, которая показывает только половину элементов массива (в вашем цикле for). Если вы не хотите использовать векторы STL, я бы предложил это решение:
#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] << " ";
}
}
Ваш цикл будет работать только для count/2
раз. Поэтому он не будет печатать весь массив.
Кроме того, вместо ar[i]=temp
следует использовать temp=ar[i]
, поскольку значение ar[i]
не хранится нигде в последнем утверждении, поэтому оно уничтожается.
for(i=0;i<((s3)/2);i++)
{
z=s2[i];
s2[i]=s2[(s3-1)-i];
s2[(s3-1)-i]=z;
}
Я попытался бы использовать указатели для решения этой проблемы. Мой код ниже.
#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--; } }
Вы можете использовать следующий пример для обращения содержимого в массиве:
#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;
}
попробуйте это, вы можете лучше упасть по сравнению с другими кодами.
using namespace std;
int main() {
int a[5]={4,6,3,5,9};
for(int i=4;i>=0;i--) {
cout<<"\n"<<a[i];
}
}