我有一系列数字,我试图扭转。我相信我的代码中的函数是正确的,但我无法得到正确的输出。
输出显示: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));
...
}
#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.
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;
}
你的循环只会在count/2
时间运行。所以它不会打印整个数组。
此外,应使用temp=ar[i]
而不是ar[i]=temp
,因为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--; } }
首先,你将temp分配给数组元素,你应该删除arr[i] = temp;
语句。接下来的问题是你正在打印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] << " ";
}
}
您可以使用以下示例来反转数组中的内容:
#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];
}
}
这条线
arr[i] = temp;
是错的。 (在循环的第一次迭代中,它将arr[i]
设置为未定义的值;进一步的迭代将其设置为不正确的值。)如果删除此行,则应正确反转数组。
之后,您应该将打印反转数组的代码移动到一个新循环中,该循环遍历整个列表。您当前的代码仅打印第一个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)你应该做第二个循环来打印所有元素,而不仅仅是数组的一半。反向循环不需要打印它。
你没有打印数组,你打印的是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());
瞧!你完成了! =)
方案细节:
这是最有效的解决方案:交换不能交换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最初包含垃圾数据并且会破坏你的数组,删除它并且代码应该运行良好。
作为建议,尽可能使用内置函数:
我正在使用C ++ 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
图书馆中使用功能