首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C用科学符号将输入读入2d数组。

C用科学符号将输入读入2d数组。
EN

Stack Overflow用户
提问于 2016-10-30 12:53:34
回答 3查看 246关注 0票数 0

我得到了一列24个科学数字的列表,作为txt文件(使用%le格式)。

代码语言:javascript
复制
    #include <stdio.h>
    #include <stdlib.h>



    void main()
    {
      int i;
      int j;

    /*matrix*/

    double** mat=malloc(24*sizeof(double*)); 
    for(i=0;i<24;++i)
    mat[i]=malloc(1*sizeof(double));


        FILE *file;
        file=fopen("input.txt", "r");


        if ((file = fopen("input.txt", "r")) == NULL)
      {
         printf("Error! opening file");
         // Program exits if file pointer returns NULL.
        exit(1);         
      }

     else

   for(i = 0; i < 24; i++)
 {
  for(j = 0; j < 1; j++) 
  {

   if (!fscanf(file, "%le", &mat[i][j])) 
       break;

    printf("%le\n",mat[i][j]);
  } 


 }
  fclose(file);
 }

现在我想把这个由24个元素组成的一维数组放入一个4×6矩阵A中。

我该怎么做?

我试过doing=>

代码语言:javascript
复制
  for(m=1;m<=4;m++)
  {
    for(n=1;n<=6;n++)
        {
            mat[k][1]=A[i][j];

            k++;
        }   

  }

        printf("%lf \n",A[i][j]);   

但是这没什么,我对C是新手,所以非常感谢您的帮助。

对于一个简单的任务来说,这个程序太长了,比如我所知道的矩阵中的读写。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-30 13:57:11

代码语言:javascript
复制
for(m=1;m<=4;m++)
{
  for(n=1;n<=6;n++)
  {
    mat[k][1]=A[i][j];
    k++;
  }
}

您的循环索引是mn,但是您使用ij作为下标-- ij在循环中从未被初始化或更新。

更大的问题是,您正在将A[i][j]的值分配给mat[k][1],而不是相反。

但是这仍然有一个问题--记住,在C中,N元素数组被索引为0到N1.如果A是一个4x6数组,而mat是一个24x1数组(稍后会详细介绍),那么应该编写您的循环。

代码语言:javascript
复制
for ( m = 0; m < 4; m++ )
{
  for ( n = 0; n < 6; n++ )
  {
    A[m][n] = mat[k++][0];
  }
}

第一个元素位于索引0,第二个元素位于索引1,等等。

关于mat..。

如果您知道mat将存储24个值,那么为什么需要动态分配它呢?它也不清楚为什么它需要是一个24x1数组。只需将其声明为double的24元素数组即可。

代码语言:javascript
复制
double mat[24];
...
for ( i = 0; i < 24; i++ )
{
  if ( scanf( file, "%le", &mat[i] ) != 1 )
    // handle read error
}
...
for ( k = 0, i = 0; i < 4; i++ )
  for ( j = 0; j < 6; j++ )
    A[i][j] = mat[k++];

最后,void main()应该是int main( void )

票数 0
EN

Stack Overflow用户

发布于 2016-10-30 13:02:06

似乎您没有在循环中增加i,j索引,应该将printf放在第二个循环中。

尝尝这个

代码语言:javascript
复制
k=0;
for(i=0;i<4;i++)
 for(j=0;j<6;j++)
 {
  A[i][j] = *(mat[k++]);
  printf("%f\n",A[i][j]);
 }
票数 0
EN

Stack Overflow用户

发布于 2016-10-30 13:46:01

代码语言:javascript
复制
for(m=1;m<=4;m++) //wrong counters
{
    for(n=1;n<=6;n++)
    {
        mat[k][1]=A[i][j]; //does not assign anything
        k++;
    }   
}
printf("%lf \n",A[i][j]); //not in loop

应该在for循环中从0开始计数,因为数组是从0索引的。并确保使用正确的符号,并将k声明为int并初始化它,即int k = 0;

要将值赋值的东西必须在左边,所分配的东西必须在右边。

最后,您的print语句不在循环中。

下面是一个示例:

代码语言:javascript
复制
for(int i = 0; i < 4; i++){
    for(int j = 0; j < 6; j++){
        A[i][j] = mat[k][0];
        k++;
        printf("%lf \n",A[i][j]);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40329319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档