2013-11-06 3 views
0

Цель этой программы - считывать данные из файла, а затем использовать эти данные для расчета давления газов с использованием значений a и b при шести разных температурах. В настоящее время при распечатке программа, я полагаю, использует только первые значения a и b из пяти, и поэтому печатает одну и ту же информацию для каждого значения a и b. Любая помощь будет оценена! Я could't выяснить, как загрузить файл так, здесь есть данные:Программа не будет использовать правильные значения массива

данных:

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"); 
} 
+1

Я не могу воспроизвести ваш error-- выход выглядит хорошо, все строки различны. Упростите проблему: уменьшите данные до двух строк, скопируйте эти значения, упростите 'computePressure', пока все, что он делает, не сообщит' a' и т. Д. Скорее всего, вы сами заметите ошибку, и если вы не сможете опубликовать [минимальный полный пример] (http://sscce.org). – Beta

+0

Можете ли вы показать, как вы его скомпилируете? Я не могу воспроизвести вашу ошибку. – ZyX

+0

Можете ли вы показать мне, как выглядит ваш вывод, чтобы я мог сравнить его с ответами, чтобы убедиться, что он действительно работает правильно? Также вы используете Mac или ПК? Может быть, это проблема компилятора? – pbush25

ответ

1

У вас есть несколько ошибок в коде.

Когда вы проходите массив tempF и массив давления, чтобы вычислитьPressure, я не думаю, что вы хотели передать адрес g-го элемента. Похоже, ваш код ожидает адрес начала массива. Это должно выглядеть примерно так:

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

У вас есть такая же проблема в вызове printGasInfo, где прошли адрес Gth элемента давления. Это должно быть изменение к чему-то похожее на это:

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

Другая проблема, которую я вижу в расчете tempK в computePressure. Соотношение 5/9 будет вычисляться с использованием целых чисел и будет возвращать 0, поэтому tempK всегда будет иметь значение 273, которое не является тем, что вы намеревались. Вам нужно изменить это, чтобы использовать константы float/double. Также правильное преобразование в Kelvin должно использовать смещение 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 
+0

Я внес изменения, которые вы предложили, но я все еще получаю ответы, которые немного отключаются. «computePressure (tempF, давление, моль, объем, [g], b [g]); printGasInfo (a [g], b [g], давление); Извините, я действительно не могу понять, как форматировать, чтобы он выглядел как код. Но я внес изменения в main() и все еще получаю более ранние результаты. – pbush25

+0

Поцарапать это. Просто чтобы он работал правильно. Большое спасибо за Вашу помощь! – pbush25

1

У вас есть общая ошибка: в

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

5/9 равно всегда ноль, потому что это integer деление. Используйте 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 вы имели в виду передать указатель на массив. Также возможно получить доступ к массиву вне пределов, поскольку tempFpressure) не должен содержать до MAXNUMBERGASES элементов, и вы используете &tempF[g]&pressure[g]), где g ограничено количеством строк в файле с количеством строк в файле, ограниченном MAXNUMBERGASES.

I.e. изменить эти линии до

 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.

+0

Хорошо, спасибо, это делает его намного лучше, но все же это неверно. В качестве контрольной точки для 0F ответы должны быть следующими: 44.4423, 43.8758, 39.9100, 23.3844, -22.8971 – pbush25

+0

@PatrickBush У моего результата есть ошибка в третьей цифре. Не знаю почему, но лучше первого варианта с ошибкой в ​​первой или второй цифре. – ZyX

Смежные вопросы