对阵列执行操作

时间:2016-02-06 17:17:52

标签: c arrays

好的,所以我对这个网站的编程和发布都很陌生,我的问题有点复杂,但我会试着说明我的情况。我正在尝试编写一个代码来读取未知大小的文件(极坐标列表),将值存储在一个数组中,然后执行转换并获得一个包含转换数据的新数组(从技术上讲,我正在使用这个新数组在预先设计的函数中用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

1 个答案:

答案 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)的计算被丢弃了。