我将1列中的24个科学数字列表作为txt文件(使用%le格式)。
#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个元素的1d数组放入一个4乘6的矩阵A中。
我该怎么做?
我试过做=&gt;
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的新手,所以任何帮助都将非常感谢谢谢。
对于像我所知的矩阵中读取和写入这样的简单任务来说,程序太长了。
答案 0 :(得分:0)
似乎你不会在你的循环中增加i,j索引,你应该把printf放在第二个循环中。
试试这个
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]);
}
答案 1 :(得分:0)
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;
。< / p>
您想要分配值的内容必须位于左侧,而分配的内容必须位于右侧。
最后,您的print语句不在循环中。
以下是一个例子:
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]);
}
}
答案 2 :(得分:0)
for(m=1;m<=4;m++)
{
for(n=1;n<=6;n++)
{
mat[k][1]=A[i][j];
k++;
}
}
您的循环索引为m
和n
,但您使用i
和j
作为下标 - i
和j
永远不会在循环中初始化或更新。
更大的问题是,您要将A[i][j]
的值分配给mat[k][1]
,而不是相反。
但这仍有问题 - 请记住,在C中,N元素数组的索引从0到N-1。如果A
是一个4x6数组且mat
是一个24x1数组(后面会有更多),那么应该编写你的循环
for ( m = 0; m < 4; m++ )
{
for ( n = 0; n < 6; n++ )
{
A[m][n] = mat[k++][0];
}
}
第一个元素位于索引0,第二个元素位于索引1,等等
关于mat
...
如果你知道它将存储24个值,那么为什么你需要动态分配mat
并不清楚。它还不清楚为什么它需要是一个24x1阵列。只需将其声明为double
的24元素数组:
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 )
。