程序将不使用正确的数组值

时间:2013-11-06 17:21:29

标签: c arrays computation

该程序的目的是从文件中读取数据,然后使用该数据在六个不同温度下使用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");
}

2 个答案:

答案 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

现在结果有所不同,但我不确定负压是否应该在最后一行实际看到。


我看到的第二个问题是您将指向特定pressuretempF数组项的指针传递给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