我学习数组大约3到4天,但我被困在这项任务上。 我实际上需要做的是替换第一到第二个数组中的值,但是该列需要是一半,而另一半则需要替换为行。 例如: 我们插入 对于n = 3; 那么第一个数组列是n * 2 像这样
1,2,3,4,5,6
7,8,9,10,11,12
13,14,15,16,17,18
出口必须是
1,2,3
7,8,9
13,14,15
4,5,6
10,11,12
16,17,18
我编写的代码
#include <stdio.h>
int main ()
{
int n,m;
scanf("%d",&n);
int a=n*2,b=n;
m=n*2;
int firstarray[n][m],secondarray[a][b];
int i,j,k,l;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&firstarray[n][m]);
for(i=0;i<n;i++)
for(j=0;j<m/2;j++)
secondarray[i][j]=firstarray[i][j];
for(i=0;i<n;i++){
for(j=m/2;j<m;j++)
{
for(k=n;k<a;k++)
for(l=0;l<b;l++)
secondarray[k][l]=firstarray[i][j];
}
}
for(i=0;i<a;i++)
{
for(j=0;j<b;j++){
printf("%d",secondarray[i][j]);
}
printf("\n");
}
}
答案 0 :(得分:1)
在本节中,scanf语句尝试访问超出范围的数组元素:
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&firstarray[n][m]);//use i,j indexes, not n,m initializers
我认为这可能只是一个错字,但是使用n
和m
的这种方式在每个维度上都超出了数组的范围1。
更改为:
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&firstarray[i][j]);
^ ^
请注意,在执行显示的逻辑时,下游还有其他问题。在给定示例输入的情况下,这不是一个简单的transpose,结果将是:
1, 7, 13
2, 8, 14
3, 9, 15
4, 10, 16
5, 11, 17
6, 12, 18
请记住,原始数组的形状作为int
位置的连续序列存储在内存中:
|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|
因此,要执行显示第一个循环系列的操作,需要通过选择内存中的前三个,跳过下三个,以此类推的组合,将值分配给[6][3]
数组:
|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|
^ ^ ^ ^ ^ ^ ^ ^ ^
然后拾起其余的内容,首先跳过3,分配3,跳过...,依此类推。
|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|
^ ^ ^ ^ ^ ^ ^ ^ ^
然后这需要使用索引来进行转换,因此给定的数组创建为:
m=n*2;
int firstarray[n][m],secondarray[m][n];
输入内容如您的帖子所示,填充secondarray
分两步完成:
//get first 3 of 6 columns
for(i=0;i<n;i++)
{
for(j=0;j<m/2;j++)
{
secondarray[i][j]=firstarray[i][j];
}
}
//get second 3 of 6 columns
for(i=0;i<n;i++)
{
for(j=3;j<m;j++)
{
secondarray[i+3][j-3]=firstarray[i][j];
}
}