gpt4 book ai didi

c - 对数组执行操作

转载 作者:行者123 更新时间:2023-11-30 17:05:33 25 4
gpt4 key购买 nike

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

我有两个主要问题,第一个问题是可变数组大小。在下面的代码中,您可以看到我的 x 和 y 数组没有约束,因此循环继续将值转换为 x[999],即使 r[] 中没有超出 r[40] 的任何内容。我可以限制 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 常量,而是编辑: { 将最终 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) 的计算将被丢弃。

关于c - 对数组执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35243952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com