该程序的目的是从文件中读取数据,然后使用该数据在六个不同温度下使用a和b值计算气体压力。目前在打印时,我认为该程序仅使用五个中的第一个a和b值,因此为每个a和b值打印出相同的信息。任何帮助,将不胜感激!我无法弄清楚如何上传文件,所以这里是数据:
数据:
0.0341 0.0237
0.244 0.0266
1.36 0.0318
5.46 0.0305
20.4 0.1383
代码:
#include <stdio.h>
#include <math.h>
#define R 0.08314472
#define MAXNUMBERGASES 10
#define NUMBERTEMPS 6
#define FILENAME "gasValues.txt"
//prototype functions
int getGasValues (double a[], double b []);
void printHeaders (double tempF[]);
void computePressure (double tempF[], double pressure[], double moles,
double volume, double a, double b);
void printGasInfo (double a, double b, double pressure[]);
int main()
{
int moles = 2; //mol (n)
int volume = 1; //Liters (V)
double a[MAXNUMBERGASES]; //L^2bar/mol^2
double b[MAXNUMBERGASES]; //L/mol
int numberGases, g;
double tempF[] = {0, 20, 40, 60, 80, 100};
double pressure[NUMBERTEMPS];
numberGases = getGasValues (a, b);
if (numberGases < 1) printf ("Error. No data read from file\n");
else
{
printHeaders(tempF);
for (g = 0; g < numberGases; g++)
{
computePressure (&tempF[g], &pressure[g], moles, volume, a[g], b[g]);
printGasInfo (a[g], b[g], &pressure[g]);
}
}
return 0;
}
int getGasValues (double a[], double b[])
{
FILE *gasFile; //file pointer
int g = 0; //counter for number of gases
gasFile = fopen("gasValues.txt", "r");
if (gasFile == NULL){
printf("File could not be opened. Program terminated.\n");
return 0; //end program if file cannot be opened or found
}
else
while ((fscanf (gasFile, "%lf" "%lf", &a[g], &b[g])) != EOF) g++;
return g;
}
void printHeaders (double tempF[NUMBERTEMPS])
{
printf ("\t\t\t Pressure (atm) using Waals' Ideal Gas Law\n\n");
printf ("L2atm/mol2 \tL/mol");
int t = 0;
for (t = 0; t < NUMBERTEMPS; t++)
{
printf (" %10.0lfF" ,tempF[t]);
}
printf ("\n");
}
void computePressure (double tempF[NUMBERTEMPS], double pressure[NUMBERTEMPS], double moles, double volume, double a, double b)
{
int t=0;
for (t = 0; t < 6; t++)
{
double tempK = (5/9) * (tempF[t]-32) + 273;
double part1 = (moles * R * tempK);
double part2 = volume - (moles*b);
double part3 = (a*(pow(moles,2)))/(volume*volume);
double part4 = part1/part2;
pressure[t] = part4 - part3;
}
}
void printGasInfo (double a, double b, double pressure[NUMBERTEMPS])
{
int p = 0;
printf("%8.4lf" "%13.4lf", a, b);
for (p = 0; p < NUMBERTEMPS; p++)
{
printf (" %8.4lf", pressure[p]);
}
printf ("\n");
}
答案 0 :(得分:1)
您有一个常见错误:
double tempK = (5/9) * (tempF[t]-32) + 273;
5/9 总是为零,因为它是整数除法。使用5.0/9.0
,结果就是
Pressure (atm) using Waals' Ideal Gas Law
L2atm/mol2 L/mol 0F 20F 40F 60F 80F 100F
0.0341 0.0237 44.4162 46.3557 48.2953 50.2349 52.1745 54.1141
0.2440 0.0266 45.8010 47.7524 49.7039 51.6554 53.6069 43.8495
1.3600 0.0318 43.8296 45.8028 47.7759 49.7491 39.8833 39.8833
5.4600 0.0305 29.2609 31.2286 33.1963 23.3578 23.3578 23.3602
20.4000 0.1383 -12.7150 -10.1609 -22.9315 -22.9315 -22.9285 -22.9281
现在结果有所不同,但我不确定负压是否应该在最后一行实际看到。
我看到的第二个问题是您将指向特定pressure
和tempF
数组项的指针传递给computePressure
,但正如computePressure
中所见,您的意思是传递指向数组的指针。由于tempF
(和pressure
)不必包含最多MAXNUMBERGASES项,并且您使用&tempF[g]
(和&pressure[g]
,因此也可以获得越界数组访问权限})其中g
仅限于文件中的行数,文件中的行数限制为MAXNUMBERGASES。
即。将这些行更改为
computePressure (tempF, pressure, moles, volume, a[g], b[g]);
printGasInfo (a[g], b[g], pressure);
。结果:
Pressure (atm) using Waals' Ideal Gas Law
L2atm/mol2 L/mol 0F 20F 40F 60F 80F 100F
0.0341 0.0237 44.4162 46.3557 48.2953 50.2349 52.1745 54.1141
0.2440 0.0266 43.8495 45.8010 47.7524 49.7039 51.6554 53.6069
1.3600 0.0318 39.8833 41.8565 43.8296 45.8028 47.7759 49.7491
5.4600 0.0305 23.3578 25.3255 27.2932 29.2609 31.2286 33.1963
20.4000 0.1383 -22.9315 -20.3774 -17.8233 -15.2691 -12.7150 -10.1609
注意:不再存在valgrind错误。
答案 1 :(得分:1)
您的代码中有一些错误。
当你将tempF和压力数组传递给computePressure时,我认为你不想传递gth元素的地址。看起来您的代码期望数组的起始地址。看起来应该是这样的:
computePressure (tempF, pressure, moles, volume, a[g], b[g]);
你在printGasInfo调用中遇到同样的问题,你已经传递了压力的第g个元素的地址。它应该改为类似的东西:
printGasInfo (a[g], b[g], pressure);
我看到的另一个问题是计算computePressure中的tempK。比率5/9将使用整数计算并返回0,因此tempK将始终产生值273,这不是您的意图。您需要将其更改为使用float / double常量。正确转换为开尔文也应使用273.15的偏移量。 tempK计算应如下所示:
double tempK = (5.0/9.0) * (tempF[t]-32) + 273.15;
我得到的这些变化的输出是:
Pressure (atm) using Waals' Ideal Gas Law
L2atm/mol2 L/mol 0F 20F 40F 60F 80F 100F
0.0341 0.0237 44.4423 46.3819 48.3215 50.2611 52.2007 54.1403
0.2440 0.0266 43.8758 45.8273 47.7788 49.7303 51.6817 53.6332
1.3600 0.0318 39.9100 41.8831 43.8563 45.8294 47.8026 49.7757
5.4600 0.0305 23.3844 25.3521 27.3198 29.2875 31.2551 33.2228
20.4000 0.1383 -22.8971 -20.3429 -17.7888 -15.2347 -12.6805 -10.1264