Question

The purpose of this program is to read data in from a file and then use that data to compute the pressure of the gases using the a and b values at six different temperatures. Currently when printing out, the program I believe uses only the first a and b values out of five, and therefore is printing out the same information for every a and b value. Any help would be appreciated! I could't figure out how to upload the file so here is the data:

Data:

0.0341   0.0237
0.244    0.0266
1.36     0.0318
5.46     0.0305
20.4     0.1383

Code:

 #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");
}
Was it helpful?

Solution

You have a few errors in your code.

When you are passing the tempF and pressure array to computePressure I don't think you wanted to pass the address of the gth element. It looks like your code is expecting the address of the start of the array. It should look something like this:

computePressure (tempF, pressure, moles, volume, a[g], b[g]);

You have the same problem in the call to printGasInfo where you have passed the address of the gth element of pressure. It should be change to something similar to this:

printGasInfo (a[g], b[g], pressure);

The other problem I see is in the calculation of tempK in computePressure. The ratio 5/9 will be calculated using integers and will return 0 so tempK will always result in a value of 273 which is not what you intended. You need to change that to use float/double constants. Also the correct conversion to Kelvin should use an offset of 273.15. The tempK calculation should look like this:

double tempK = (5.0/9.0) * (tempF[t]-32) + 273.15;

The output I get with these changes are:

                            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

OTHER TIPS

You have a common error: in

        double tempK = (5/9) * (tempF[t]-32) + 273;

5/9 is always zero because it is integer division. Use 5.0/9.0, this way the results are

                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

Now the results differ, though I am not sure whether negative pressure is what should be actually seen in the last line.


Second problem I saw is that you pass a pointer to a specific pressure and tempF array item to computePressure, but as it may be seen in computePressure you meant to pass a pointer to an array. It is also possible to get out-of-bounds array access since tempF (and pressure) does not have to contain up to MAXNUMBERGASES items and you use &tempF[g] (and &pressure[g]) where g is limited to number of lines in the file with number of lines in the file limited to MAXNUMBERGASES.

I.e. change these lines to

        computePressure (tempF, pressure, moles, volume, a[g], b[g]);

        printGasInfo (a[g], b[g], pressure);

. Result:

                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

Note: there are no longer valgrind errors.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top