好的,所以我对这个网站的编程和发布都很陌生,我的问题有点复杂,但我会试着说明我的情况。我正在尝试编写一个代码来读取未知大小的文件(极坐标列表),将值存储在一个数组中,然后执行转换并获得一个包含转换数据的新数组(从技术上讲,我正在使用这个新数组在预先设计的函数中用C ++绘制数据图形,但这并不重要,因为它是赋值的一部分,当然不是错误的来源)。
我有两个主要问题,第一个是变量数组大小。在下面的代码中,您可以看到我的x和y数组没有约束,因此循环继续将值转换为x [999],即使r [40]中的r []中没有任何内容。我可以约束我的r和theta数组的大小,因为当fscanf函数到达文件末尾时我可以编码停止读取值,但我不知道我的x和y数组的类比。 (另外,如果有人可以解释为什么我的角色阵列没有这个问题,我会非常感激,即使它被定义为最多128个字符。它可能会给我我需要的洞察力)
其次,转换并不完全匹配。因此,当我打印转换后的值时,函数会正确转换它们,但会将从r [i]和theta [i]转换为x [i + 1]和y [i + 1]的值存储起来。我真的不知道是什么导致了这个问题。
我当然希望我的问题有意义。任何帮助,将不胜感激!如果有任何不清楚的地方,请告诉我,我会尽力解释。谢谢!
#include <stdio.h>
#include <math.h>
#define ARRAYSIZE 1000
#define FILENAMESIZE 128
float convertx(float r[], float theta[], int numPoints);
float converty(float r[], float theta[], int numPoints);
int cmain() {
int i;
float r[ARRAYSIZE], theta[ARRAYSIZE], x[ARRAYSIZE], y[ARRAYSIZE];
char filename[FILENAMESIZE];
FILE *InputFile;
printf("Type the data file name: ");
scanf("%s", filename);
InputFile = fopen(filename,"r");
if(InputFile == NULL){
printf("Error, could not open file: %s.\n",filename);
return 1;
}
for(i=0; i < ARRAYSIZE; i++){
if(fscanf(InputFile,"%f %f", &r[i], &theta[i]) == EOF) break;
printf("Value %d is %f\n",i+1,r[i]);
}
fclose(InputFile);
for(i=0; i < ARRAYSIZE; i++){
x[i] = convertx(r,theta,i);
printf("Value %d is %f\n",i+1,x[i]);
}
for(i=0; i < ARRAYSIZE; i++){
y[i] = converty(r,theta,i);
}
return 0;
}
float convertx(float r[], float theta[], int numPoints){
int i;
float x;
for(i=0; i < numPoints; i++)
x = r[i]*cos(theta[i]);
return x;
}
float converty(float r[], float theta[], int numPoints){
int i;
float y;
for(i=0; i < numPoints; i++)
y = r[i]*sin(theta[i]);
return y;
}
编辑:请求是输入文件的片段。这是前几个点(文件中没有逗号,只有空格。不幸的是,我在这个网站上的格式化技巧很糟糕):
60,3.9269875
60,0.7853975
0,0
1,0.25
2,0.5
答案 0 :(得分:0)
对于第一个问题,r和theta的for循环在文件末尾停止的原因是因为你有一个break;
在你检测到EOF时退出for循环。你不能在你的x和y for循环中拥有它。
要解决这个问题,不要使用ARRAYSIZE常量,编辑:{保存r和theta for循环中的Final i值,它将是行数或+1,并将其用于结束值在你的x和y for循环中。像这样:
for(i=0; i < ARRAYSIZE; i++){
if(fscanf(InputFile,"%f %f", &r[i], &theta[i]) == EOF) {
int final = i;
break;
}
printf("Value %d is %f\n",i+1,r[i]);
}
fclose(InputFile);
for(i=0; i < final; i++){
x[i] = convertx(r,theta,i);
printf("Value %d is %f\n",i+1,x[i]);
}
我之前说过你可以使用数组的大小来表示r或theta:for (i=0; i < r.size(); i++) {
,但是因为你把它的长度初始化为1000而不能工作。 }
对于你的第二个问题:我认为如果你摆脱了convertx和converty函数中的for循环,那将解决问题。那是因为只返回了计算出的x或y的最后一个值,所以从i = 0到i =(numPoints-2)的计算被丢弃了。