【发布时间】:2015-09-30 00:40:06
【问题描述】:
所以这个程序应该询问用户Kelvins 的温度和起始Ne。然后进行插值以找到给定的值。
temp 数组是所有温度,用于查找我们之间的温度。
n 数组是所有 Ne 的,用于查找我们之间的 Ne。
我们在每个点中获得的任何点最终都会成为我们在更大的阵列 HPE 中插值的点。
主函数要求用户输入温度和Ne,并调用插值函数。
interpol 函数是进行插值的函数。首先,它找到给定温度在 temp 数组中的位置。然后它找到给定的 Ne 在 n 数组中的位置。然后它使用该点 (HPE[k][l]) 进行 2D 插值。
我的问题是当我运行它并输入应该给我答案的值时,我得到“确定的值是nan”
我做错了什么?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double interpol(double Ti, double Ne);
int main()
{
int ni;
double Ti, result, Ne;
printf("\nEnter the temperature in kelvins and Ne separated by a space.\n");
ni = scanf("%lf %lf", &Ti, &Ne);
result = interpol(Ti, Ne);
printf("\nThe value determined is %lf\n", result);
}
double interpol(double Ti, double Ne)
{
int i, j, k, l;
double y1, y2, y3, y4, t, u, p;
double temp[15] = {
1000.0, 2000.0, 3000.0, 4000.0, 5000.0,
6000.0, 7000.0, 8000.0, 9000.0, 10000.0,
11000.0, 12000.0, 13000.0, 14000.0, 15000.0};
double n[8] = {10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0};
double HPE[15][8] = {
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
{0.0017, 0.0002, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
{0.2980, 0.0407, 0.0042, 0.0004, 0.0, 0.0, 0.0, 0.0},
{0.9582, 0.6961, 0.1864, 0.0224, 0.0023, 0.0002, 0.0, 0.0},
{0.9979, 0.9791, 0.8241, 0.3191, 0.0448, 0.0047, 0.0005, 0.0},
{0.9998, 0.9980, 0.9804, 0.8335, 0.3335, 0.0477, 0.0050, 0.0005},
{1.0, 0.9997, 0.9971, 0.9713, 0.7719, 0.2529, 0.0327, 0.0034},
{1.0, 0.9999, 0.9994, 0.9939, 0.9425, 0.6211, 0.1408, 0.0161},
{1.0, 1.0, 0.9998, 0.9984, 0.9841, 0.8606, 0.3817, 0.0581},
{1.0, 1.0, 0.9999, 0.9995, 0.9948, 0.9503, 0.6568, 0.1607},
{1.0, 1.0, 1.0, 0.9998, 0.9980, 0.9807, 0.8358, 0.3373},
{1.0, 1.0, 1.0, 0.9999, 0.9992, 0.9917, 0.9229, 0.5448}
};
for (i = 1 ; i < 16 ; i++)
{
if (temp[i] <= Ti && temp[i+1] >= Ti)
{
k = i;
break;
}
}
for (j = 1 ; j < 9 ; j++)
{
if (n[j] <= Ne && n[j+1] >= Ne)
{
l = j;
break;
}
}
y1 = HPE[k][l];
y2 = HPE[k+1][l];
y3 = HPE[k+1][l+1];
y4 = HPE[k][l+1];
t = (Ti - (HPE[k][0])) / ((HPE[k+1][0]) - (HPE[k][0]));
u = (Ne - (HPE[0][l])) / ((HPE[0][l+1]) - (HPE[0][l]));
p = ((1 - t) * (1 - u) * y1) + (t * (1 - u) * y2) + (t * u * y3) + ((1 - t) * u * y4);
return (p);
}
【问题讨论】:
-
您从
scanf()捕获返回值,但您不使用它,为什么?并且请不要为return使用括号,这很丑,并且使return看起来像一个函数。 -
你在哪里防止被
0(或你的除数接近0)分割? -
变量
ni正在设置中,但从未使用过。强烈指示逻辑错误。 -
代码中有几个“幻数”(如 16、9、15、8)以避免这些幻数在理解代码时产生的问题并避免未来的维护问题,强烈建议使用 enum 或 #define 为这些幻数赋予有意义的名称,并在整个代码中使用这些有意义的名称
-
这个语句(类似于代码中的一些其他语句:)
for (i = 1 ; i < 16 ; i++)因为 C 中的数组偏移量从 0 开始,所以不能正确处理temp数组中的偏移量。更好的说法是:for (i = 0 ; i < 15 ; i++)甚至更好:for (i = 0 ; i < (sizeof( temp)/sizeof(temp[0]) ; i++)
标签: c arrays multidimensional-array interpolation