freesky

task_sem2_2.1

Nov 3rd, 2012
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.17 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define A 40.5322
  5. #define B -71080.3
  6. #define C -2.49974
  7. #define D 3.4742e-4
  8. #define E -1.5409e-8
  9. #define F 3.9912e5
  10. #define e 1e-6
  11. #define dl 1e-10
  12.  
  13. double k(double t) {
  14.     return exp(A + (B / t) + (C * log(t)) + (D * t) + (E * pow(t, 2.0)) + (F / pow(t, 2.0)));
  15. }
  16.  
  17. double f(double p, double t, double v_a, double v_b, double v_c, double x) {
  18.     return (((v_c + x) * pow((v_b + 2 * x), 2.0) * p) - (k(t) * pow((v_a - 2 * x), 2.0) * (v_a + v_b + v_c + x)));
  19. }
  20.  
  21. double sign(double x) {
  22.     return (x / fabs(x));
  23. }
  24.  
  25. int main(int argc, char *argv[]) {
  26.     double v_a, v_b, v_c; // v_a = CO2
  27.                           // v_b = CO
  28.                           // v_c = O2
  29.     double t; // temperature
  30.     double p; // pressure
  31.  
  32.     printf("Температура (К) = "); scanf("%lf", &t);
  33.     printf("Давление (атм) = "); scanf("%lf", &p);
  34.     putchar('\n');
  35.     printf("Количество CO₂ (моль) = "); scanf("%lf", &v_a);
  36.     printf("Количество CO (моль) = "); scanf("%lf", &v_b);
  37.     printf("Количество O₂ (моль) = "); scanf("%lf", &v_c);
  38.  
  39.  
  40.     double a, b, c, x; // variables for calculations
  41.  
  42.     if (-(v_b / 2) > -v_c)
  43.         a = -(v_b / 2);
  44.     else
  45.         a = -v_c;
  46.  
  47.     b = v_a / 2;
  48.  
  49.  
  50.     do {
  51.         c = a + (b - a) / 2;
  52.         double tmp = f(p, t, v_a, v_b, v_c, c);
  53.         if (tmp == 0.0 || fabs(tmp) <= dl) {
  54.             x = c;
  55.             break;
  56.         }
  57.         if ((b - a) <= e) {
  58.             x = c;
  59.             break;
  60.         }
  61.         if (sign(f(p, t, v_a, v_b, v_c, a)) * sign(tmp) < 0)
  62.             b = c;
  63.         else
  64.             a = c;
  65.     } while (1);
  66.  
  67.     double s = v_a + v_b + v_c + x;
  68.     putchar('\n');
  69.     printf("\tНачальные количества\tРавновесные количества\tПарциальное давление\n");
  70.     printf("CO₂\t%-20.4lf\t%-22.4lf\t%-20.4e\n", v_a, v_a - 2 * x, (v_a - 2 * x) / s * p);
  71.     printf("CO\t%-20.4lf\t%-22.4lf\t%-20.4e\n", v_b, v_b + 2 * x, (v_b + 2 * x) / s * p);
  72.     printf("O₂\t%-20.4lf\t%-22.4lf\t%-20.4e\n", v_c, v_c + x, (v_c + x) / s * p);
  73.  
  74.     return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment