Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.70 KB | None | 0 0
  1. #include <stdlib.h>
  2.  
  3. #include <math.h>
  4. #include <string.h>
  5.  
  6. #define dWszystkie 0
  7. #define dTylkoDodatnie 1 /* Wszędzie gdzie wstawię dWszystkie lub dTylkoDodatnie będą wartości odpowiednio 0 lub 1*/
  8.  
  9. #include <termios.h>
  10. #include <unistd.h>
  11. #include <stdio.h>
  12.  
  13. /* Bez echa, wzięte z: http://stackoverflow.com/questions/3276546/how-to-implement-getch-function-of-c-in-linux */
  14. int getch(void)
  15. {
  16. struct termios oldattr, newattr;
  17. int ch;
  18. tcgetattr( STDIN_FILENO, &oldattr );
  19. newattr = oldattr;
  20. newattr.c_lflag &= ~( ICANON | ECHO );
  21. tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
  22. ch = getchar();
  23. tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
  24. return ch;
  25. }
  26.  
  27. /*oprocz funkcji glownej funkcja zajmująca się wprowadzaniem i sprawdzaniem co się wpisuje*/
  28.  
  29. int podaj(char *dane, int tylko_dodatnie)
  30. {
  31. int c;
  32. int i;
  33. int kropka = 0; /* do blokowania wielokrotnego wprowadzenia kropki do liczby */
  34.  
  35. for (i = 0; i < 31; i++)
  36. dane[i] = 0; /* Czyszczenie całej tablicy - przy tworzeniu mogą tam być dziwne rzeczy */
  37.  
  38. i = 0; /* Po przejsciu petli i=31, czyli nastepny znak zapelni tablice */
  39. do
  40. {
  41. /* Czekam aż wciśnięty będzie klawisz */
  42. c = getch(); // daje nam bez echa na ekranie
  43.  
  44. if ( (c >= '0') && (c <= '9') || (c == '-') || (c == '.')) /*Do mojej funkcji mogę przyjąć tylko cyfry od 0 do 9, kropkę i minus*/
  45. {
  46. // obslugujemy kropke - moze wystapic tylko jeden raz
  47. if (c == '.')
  48. {
  49. // to jest kropka - sprawdzamy czy juz jedna kropka byla wprowadzona
  50. if (kropka == 0)
  51. {
  52. // nie nie bylo kropki wiec zapamietujemy ja w wyniku
  53. kropka = 1; // blokujemy - wiecej kropek nie moze byc
  54. putchar(c);
  55. dane[i] = '.';
  56. i++;
  57. if(i > 31)
  58. break;
  59. }
  60. continue; // byla kropka - niezaleznie czy pierwszy raz czy kolejny - nie analizujemy czy to jest inny znak
  61. }
  62.  
  63. if (tylko_dodatnie == dTylkoDodatnie)
  64. {
  65. // dopuszczamy tylko liczby dodatnie
  66. if ( c == '-') /*Ponieważ część danych może być tyklko dodatnia, przyjmujemy wszystko stwierdzone wyżej oprócz minusa*/
  67. continue; // pomijamy znak minus - nie moze byc wprowadzony
  68. putchar(c);
  69. dane[i] = c;
  70. i++;
  71. if(i > 31)
  72. break;
  73. continue;
  74.  
  75. }
  76. // dopuszczamy wprowadzenie liczb ujemnych - minus moze byc tylko na samym poczatku
  77. if( (i == 0) || (c != '-')) /*Na pierwszym miejscu pozwalamy każdy ze znaków, na innym nie pozwalamy minusa*/
  78. {
  79. putchar(c);
  80. dane[i] = c;
  81. i++;
  82. if(i > 31)
  83. break;
  84. }
  85.  
  86. continue; // nie jest konieczne, ale zwieksza czytelnosc
  87. }
  88.  
  89. if( c == 27)
  90. {
  91. putchar('\n');
  92. return -1; /* Przy kliknieciu ESC konczymy wprowadzanie liczby z bledem - do przerwania programu */
  93. }
  94. if( c == '\n')
  95. break; /* Kończę wpisywanie do tablicy przyciskiem enter */
  96.  
  97. } while (1); /*Nigdy nie mogę wyjść inaczej niż przerwaniem break*/
  98. return 0; /* ciag jest wprowadzony poprawnie */
  99. }
  100. //-------------------------------------------------------
  101. const char komunikaty[4][64] = {"\nWprowadz wspolczynnik przy i^3: ", "\nWprowadz wspolczynnik przy i^2: ", "\nWprowadz wspolczynnik przy i: ", "\nWprowadz wyraz wolny: "};
  102. // -------------------------------------------------------
  103. int main(void)
  104. {
  105. char dane[32];
  106. double wspolczynniki[4];
  107. int liczba_krokow;
  108.  
  109. printf("Ten program słuzy do liczenia pola powierzchni pod wykresem funkcji trzeciego stopnia.\n"
  110. "Nalezy wprowadzic cztery parametry - wspolczynniki wielomianu, poczatek i koniec zakresu oraz liczbe krokow. Im wiecej krokow tym wieksza dokladnosc.\n\n"
  111. "Wprowadzanie danej zatwierdzamy klawiszem Enter\n\n"
  112. "Wprowadzanie mozna w dowolnym momencie przerwac klawiszem ESC\n");
  113. do
  114. {
  115. printf("Wprowadz liczbe krokow nie mniejsza niz 2: ");
  116. if (-1 == podaj(dane, dTylkoDodatnie))
  117. {
  118. printf("Przerwales wprowadzanie, zamykam program.\n");
  119. return 0;
  120. }
  121. liczba_krokow = atof(dane);
  122. if (liczba_krokow < 2)
  123. {
  124. printf("Wprowadzono liczbe krokow mniejsza od 2, wprowadz jeszcze raz liczbe krokow");
  125. }
  126. }while (liczba_krokow < 2); /*Wyjdę z pętli dopiero jak wprowadzę dobrą ilość kroków */
  127.  
  128. /* Wprowadzanie 4 wspolczynników */
  129. {int i;
  130. for (i = 0; i < 4; i++)
  131. {
  132. printf(komunikaty[i]);
  133. if (-1 == podaj(dane, dWszystkie))
  134. {
  135. printf("Przerwales wprowadzanie, zamykam program.\n");
  136. return 0;
  137. }
  138. wspolczynniki[i] = atoi(dane);
  139. }
  140. }
  141. /*Początek i koniec zakresu */
  142.  
  143. printf("\nPodaj poczatek zakresu: ");
  144. if (-1 == podaj(dane, dWszystkie))
  145. {
  146. printf("Przerwales wprowadzanie, zamykam program.\n");
  147. return 0;
  148. }
  149. double poczatek;
  150. poczatek = atof(dane);
  151.  
  152. double koniec;
  153.  
  154. do
  155. {
  156. printf("\nPodaj koniec zakresu, wiekszy niz poczatek: ");
  157.  
  158. if (-1 == podaj(dane, dWszystkie))
  159. {
  160. printf("Przerwales wprowadzanie, zamykam program.\n");
  161. return 0;
  162. }
  163. koniec = atof(dane);
  164. if (koniec < poczatek)
  165. printf("\nWprowadzono koniec mniejszy od poczatku, wprowadz jeszcze raz koniec: ");
  166. }while (koniec < poczatek);
  167.  
  168. // y = zmienne[0] * i^3 + zmienna[1] * i^2 + zmienna[2] * i + zmienna[3]
  169. // pole = pole + y * krok
  170.  
  171. long double krok = (koniec - poczatek) / (double)liczba_krokow; /* Szerokość przeskoku w osi x */
  172. long double y, pole;
  173. long double i = poczatek + krok;
  174. pole = 0.0;
  175.  
  176. for (i = poczatek + krok; i <= koniec; i += krok)
  177. {
  178. y = wspolczynniki[0] * i*i*i + wspolczynniki[1] * i*i + wspolczynniki[2] * i + wspolczynniki[3];
  179. if (y < 0)
  180. {
  181. y = -y;
  182. }
  183.  
  184. pole += (y * krok);
  185. }
  186.  
  187. printf("\nWyliczone pole wynosi %.4f\n\n Wcisnij dowolny przycisk aby zakonczyc program\n\n");
  188. getch();
  189.  
  190.  
  191. return 0;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement