ulvis.paste.net - pastebin

Paste Search Dynamic
Recent pastes
Konstrukcje sterujące
  1. #include <stdlib.h> // USES
  2. #include <stdio.h> // USES
  3. #include <math.h> // USES
  4.  
  5. #define SCALAR double
  6. //#define SCALAR float
  7.  
  8. #define SMALL_NUMBER 1.e-20 // czy wystarczy jedna wartość dla float i dla double?
  9.  
  10. // Konstrukcje sterujące (nazwy zmiennych, zakresy widoczności i czas życia)
  11. int main(void)
  12. {
  13.   // rozwiązanie równania kwadratowego ax^2 + bx + c = 0
  14.  
  15.   printf("\nProgram rozwiązywania równania kwadratowego ax^2 + bx + c = 0\n");
  16.  
  17.   // prosta wersja: int a, b, c;
  18.   SCALAR a, b, c,x1,x2,x;
  19.   // rozważania o kontrakcie... (czy uwzględnia skończoną precyzję?)
  20.   // input - uodpornianie na błędy wczytywania danych
  21.   printf("\nPodaj parametr a: "); scanf("%lf",&a); // adres! (miejsce na wpisanie wartości)
  22.   printf("Podaj parametr b: "); scanf("%lf", &b); // uwaga: inny format dla float!
  23.   printf("Podaj parametr c: "); scanf("%lf", &c);
  24.  
  25.   // if(a==0 && b==0){ // alternatywa: if( a==0 || b==0 ) - zależnie od kontraktu
  26.   if( fabs(a)<SMALL_NUMBER && fabs(b)<SMALL_NUMBER ){ // poprawnie
  27.     printf("Błędne dane: a i b równe 0 (zbyt bliskie 0). Przerwanie programu.\n");
  28.     exit(-1);
  29.   }
  30.   else{
  31.     if(a==0) { // równanie liniowe
  32.       printf("Funckja liniowa y=%lfx+%lf\n",
  33.                 b,c);
  34.     }
  35.     else{
  36.       SCALAR delta;  // zakres widoczności nazwy - powiązanie z czasem życia  
  37.       delta = b*b - 4*a*c; // czy delta = b*b (w skończonej precyzji)?
  38.       if(delta<0){
  39.         printf("Pierwiastki zespolone\n");
  40.         SCALAR temp = sqrt(-delta);
  41.         printf("Dwa pierwiastki zespolone: x1 = %20.15lfi, x2 = %20.15lfi\n",
  42.                (-b-temp)/(2*a), (-b+temp)/(2*a) );
  43.       } else if (delta == 0){
  44.         printf("Jeden pierwiastek rzeczywisty: x = %20.15lf\n", -b/(2*a) );
  45.         x=-b/(2*a);
  46.         if((x*x*a)+(x*b)+c==0){
  47.                 printf("x się zgadza\n");
  48.         }else{
  49.         printf("x sie zgadza ale niedokladnosc floata uniemozliwa uzyskanie dokladnego wyniku... Wynik=%20.15lf\n",
  50.                 (x*x*a)+(x*b)+c==0);   
  51.         }
  52.       } else {
  53.         SCALAR temp = sqrt(delta);
  54.         printf("Dwa pierwiastki rzeczywiste: x1 = %20.15lf, x2 = %20.15lf\n",
  55.                (-b-temp)/(2*a), (-b+temp)/(2*a) );
  56.         x1=(-b-temp)/(2*a);
  57.         x2=(-b+temp)/(2*a);
  58.         //Sprawdzenie
  59.         if((x1*x1*a)+(x1*b)+c==0){
  60.                 printf("x1 się zgadza\n");
  61.         }
  62.         else{
  63.         printf("x1 sie zgadza ale niedokladnosc floata uniemozliwa uzyskanie dokladnego wyniku... Wynik=%20.15lf\n",
  64.                 (x1*x1*a)+(x1*b)+c==0)
  65.         }
  66.         if((x2*x2*a)+(x2*b)+c==0){
  67.                 printf("x2 się zgadza\n");
  68.         }else{
  69.         printf("x2 sie zgadza ale niedokladnosc floata uniemozliwa uzyskanie dokladnego wyniku... Wynik=%20.15lf\n",
  70.                 (x2*x2*a)+(x2*b)+c==0);
  71.         }
  72.       }  
  73.     } // znaczenie wcięć i nawiasów klamrowych dla zwiekszenia czytelności kodu
  74.   }
  75.  
  76.  
  77.   return(0);
  78. }
  79.  
  80. // Lab
  81. // Uzupełnienie programu o obsługę wszystkich przypadków liczbowych danych wejściowych
  82. // Różne przypadki kontraktu - uwzględniające lub nie skończoną precyzję
Parsed in 0.013 seconds