繁体   English   中英

在阵列上执行操作

[英]Performing Operations on an Array

好的,所以我对这个网站的编程和发布都是陌生的,我的问题有点复杂,但是我将尝试阐明我的情况。 我正在尝试编写代码以读取大小未知的文件(极坐标列表),将值存储在数组中,然后执行转换并使用转换后的数据获取新数组(从技术上讲,我正在使用这个预先设计好的函数中的这个新数组可以用C ++绘制数据,但这并不重要,因为它是分配的一部分,当然也不是错误的来源。

我有2个主要问题,第一个是可变数组大小。 在下面的代码中,您可以看到我的x和y数组没有约束,因此即使r []中除了r [40]之外也没有任何内容,循环仍将转换为x [999]。 我可以限制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

对于第一个问题,r和theta的for循环在文件末尾停止的原因是因为您有一个break; 当您检测到EOF时退出for循环。 您的x和y for循环中没有那个。

为了解决这个问题,而不是使用您的ARRAYSIZE常量,请编辑:{将Final i值保存在r和theta for循环中,它将是行数或+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)的计算被丢弃了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM