数组,将第一个数组替换为另一个列到行

时间:2020-02-19 12:58:42

标签: c arrays

我学习数组大约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");
         }  
}

1 个答案:

答案 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  

我认为这可能只是一个错字,但是使用nm的这种方式在每个维度上都超出了数组的范围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];
        }
    }
相关问题