我编写了一段代码,使这种输出:
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30
31 32 33 34 35 36
37 38 39 40 41 42
43 44 45 46 47 48
#include <iostream>
using namespace std;
int main() {
// dimensions:
int x=6,y=8;
int sum=0;
int numery[8][6]={};
for (i = 0; i < y; i++) {
for (j = 0; j < x; j++) {
numery[i][j]=++sum;
if (numery[i][j]<=9) cout << " ";
cout << numery[i][j] << " ";
}
cout << endl;
}
return 0;
}
但是我不知道如何编辑它来得到这样的输出:
6 5 4 3 2 1
7 8 9 10 11 12
18 17 16 15 14 13
19 20 21 22 23 24
30 29 28 27 26 25
31 32 33 34 35 36
37 38 39 40 41 42
43 44 45 46 47 48
我可以想到为每个I %2==1编写if语句,它应该向后,但我不知道如何使程序做这样的事情。否则它应该正常运行。如果它找到一个偶数行,它应该像7 8 9 10 11 12,而如果它是i%2==1,它应该像6 5 4 3 21 1,等等。一些建议吗?
一种解决方案如下(我假设您实际上不需要存储这些数字)。注意,setw()
可用于打印固定宽度的数字:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
// dimensions:
int x=6,y=8;
for (int i = 0; i < y; i++)
{
for (int j = 0; j < x; j++)
{
cout << setw(3) << ((i%2) ? i*x+j+1 : i*x+x-j) << " ";
}
cout << endl;
}
return 0;
}
首先删除数组。这是不必要的。
#include <iostream>
using namespace std;
int number(int i,int j,int width) { return j+i*width +1 ;}
int main() {
// dimensions:
int x=6,y=8;
for (int i = 0; i < y; i++) {
for (int j = 0; j < x; j++) {
auto n = number(i,j,x);
if (n <= 9) cout << " ";
cout << n << " ";
}
cout << endl;
}
return 0;
}
与您的代码输出相同。
接下来考虑当你反向时j
会发生什么。你应该仔细想想,答案是:你用width-j-1
代替j
。
int number_reverse(int i,int j, int width) { return number(i,width-j-1,width); }
最终你只需要在每次外层循环的迭代中调用正确的函数:
#include <iostream>
using namespace std;
int number(int i,int j,int width) { return j+i*width +1 ;}
int number_reverse(int i,int j, int width) { return number(i,width-j-1,width); }
int main() {
// dimensions:
int x=6,y=8;
for (int i = 0; i < y; i++) {
for (int j = 0; j < x; j++) {
auto n = (i%2) ? number_reverse(i,j,x) : number(i,j,x);
if (n <= 9) cout << " ";
cout << n << " ";
}
cout << endl;
}
return 0;
}
如果你确实需要将数字存储在数组中,这里有一个解决方案。
#include <iostream>
using namespace std;
int main() {
// dimensions:
int x=6,y=8;
int sum=0;
int numery[y][x];
for (int i = 0; i < y; i++)
for (int j = 0; j < x; j++)
numery[i][j]=++sum;
for(int i = 0; i < y; i++)
{
if(i%2 == 0)
{
for(int j = x-1; j >= 0; --j)
{
if(numery[i][j] < 10)
{
cout << " ";
}
cout << numery[i][j] << " ";
}
cout << endl;
}
else
{
for(int j = 0; j < x; j++)
{
if(numery[i][j] < 10)
{
cout << " ";
}
cout << numery[i][j] << " ";
}
cout << endl;
}
}
return 0;
}
首先将数字赋给数组。然后根据是偶数行还是奇数行从后到后打印数字。
如果您愿意以非线性顺序填充数组,则可以从右向左填充每隔一行:array[i][x-1-j]=++sum;
.
另一种方法是使用一个外部循环和两个内部循环,注意所有的行都是形式a*i + b*j + c
,其中b是+1或-1。对于偶数行简化为array[i][j] = 6*i + 6 - j
,对于奇数行简化为array[i][j]=6*i + 1 + j
。
另一个选择是有一个单一的内部循环,它将增加或减少一定的数量d = i % 2 == 0 ? -1 : 1;
for (int j = 0; j<x; j++) { arr[i][j]=sum; sum += d;}
sum+=6-d;
在每一行之后,我们需要补偿变量sum
,以便它以下一个索引i+1
的正确值开始。