首先要做的事情。總是初始化變量,並總是試圖準確地申報時,您將使用它們:
int a[20],i,j,n,l;
這裏數組的垃圾值,藏漢作爲變量後聲明。你應該初始化與空值的數組第一:
和可變的休息時,你應該使用他們的第一次:
for(int i = 0; i < n; i++)
{
cout << "ENTER : ";
cin >> a[i];
}
int l = (n/2) - 1;
現在這行代碼:
a[i] = a[i] + a[j];
a[j] = a[i] - a[j];
a[i] = a[i] - a[j];
這些應該交換兩個值,但他們一見鍾情並不容易理解。你最好寫一個交換兩個值的函數,甚至更好:使用標準的函數std::swap
。
swap(a[i], a[j]);
現在,你的算法是錯誤的。該行代碼for(i=0,j=l; i<n/2,j>=0; i++,j--)
的最終條件錯誤。你幾乎顛倒了所有的元素兩次。你應該停在前半部分(1/2)的中間,而不是整個陣列的中間(n/2)。
for (int i = 0, j = l; i <= l/2 && j > l/2; i++, j--)
同樣的條件如下。
for (int i = n/2, j = n - 1; i <= (n + l)/2 && j > (n + l)/2; i++, j--)
所以你的最終代碼應該是這樣的:
#include <iostream>
using namespace std;
int main()
{
int a[20] {};
cout << "ENTER NO. OF ELEMENTS: ";
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cout << "ENTER : ";
cin >> a[i];
}
int l = (n/2) - 1;
for (int i = 0, j = l; i <= l/2 && j > l/2; i++, j--)
swap(a[i], a[j]);
for (int i = n/2, j = n - 1; i <= (n + l)/2 && j > (n + l)/2; i++, j--)
swap(a[i], a[j]);
for (int i = 0; i < n; i++)
cout << a[i] << ' ';
return 0;
}
現在的問題是代碼不是很可讀要麼因爲你正在使用C++,這是你不是活得恥辱使用它具有的標準算法。 另外,你的變量名稱不是描述性的,所以代碼會很難維護。
#include <iostream>
#include <algorithm>
int main()
{
const int MaxNumbers = 20;
int numbersToInverse[MaxNumbers] {};
int elementCount = 0;
std::cin >> elementCount;
for (int i = 0; i < elementCount; i++)
std::cin >> numbersToInverse[i];
int middleOfVector = elementCount/2;
std::reverse(numbersToInverse, numbersToInverse + middleOfVector);
std::reverse(numbersToInverse + middleOfVector, numbersToInverse + elementCount);
for (int i = 0; i < elementCount; i++)
std::cout << numbersToInverse[i] << ' ';
return 0;
}
當然,更好的實現將與std::vector
,但我一直陣列。我讓你看看std::reverse
是如何工作的。也不要使用using namespace std;
。見這裏why。
SO不是代碼編寫服務,請創建[mcve],以便我們幫助您。 –
您不需要添加或減少元素來反轉數組。你的代碼做什麼並不明顯。是否要求轉型必須實施? – user463035818
有更好的方法來交換兩個值比算術。例如,'std :: swap'。 – molbdnilo