Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <math.h>
- #include <string.h>
- #define dWszystkie 0
- #define dTylkoDodatnie 1 /* Wszędzie gdzie wstawię dWszystkie lub dTylkoDodatnie będą wartości odpowiednio 0 lub 1*/
- #include <termios.h>
- #include <unistd.h>
- #include <stdio.h>
- /* Bez echa, wzięte z: http://stackoverflow.com/questions/3276546/how-to-implement-getch-function-of-c-in-linux */
- int getch(void)
- {
- struct termios oldattr, newattr;
- int ch;
- tcgetattr( STDIN_FILENO, &oldattr );
- newattr = oldattr;
- newattr.c_lflag &= ~( ICANON | ECHO );
- tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
- ch = getchar();
- tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
- return ch;
- }
- /*oprocz funkcji glownej funkcja zajmująca się wprowadzaniem i sprawdzaniem co się wpisuje*/
- int podaj(char *dane, int tylko_dodatnie)
- {
- int c;
- int i;
- int kropka = 0; /* do blokowania wielokrotnego wprowadzenia kropki do liczby */
- for (i = 0; i < 31; i++)
- dane[i] = 0; /* Czyszczenie całej tablicy - przy tworzeniu mogą tam być dziwne rzeczy */
- i = 0; /* Po przejsciu petli i=31, czyli nastepny znak zapelni tablice */
- do
- {
- /* Czekam aż wciśnięty będzie klawisz */
- c = getch(); // daje nam bez echa na ekranie
- if ( (c >= '0') && (c <= '9') || (c == '-') || (c == '.')) /*Do mojej funkcji mogę przyjąć tylko cyfry od 0 do 9, kropkę i minus*/
- {
- // obslugujemy kropke - moze wystapic tylko jeden raz
- if (c == '.')
- {
- // to jest kropka - sprawdzamy czy juz jedna kropka byla wprowadzona
- if (kropka == 0)
- {
- // nie nie bylo kropki wiec zapamietujemy ja w wyniku
- kropka = 1; // blokujemy - wiecej kropek nie moze byc
- putchar(c);
- dane[i] = '.';
- i++;
- if(i > 31)
- break;
- }
- continue; // byla kropka - niezaleznie czy pierwszy raz czy kolejny - nie analizujemy czy to jest inny znak
- }
- if (tylko_dodatnie == dTylkoDodatnie)
- {
- // dopuszczamy tylko liczby dodatnie
- if ( c == '-') /*Ponieważ część danych może być tyklko dodatnia, przyjmujemy wszystko stwierdzone wyżej oprócz minusa*/
- continue; // pomijamy znak minus - nie moze byc wprowadzony
- putchar(c);
- dane[i] = c;
- i++;
- if(i > 31)
- break;
- continue;
- }
- // dopuszczamy wprowadzenie liczb ujemnych - minus moze byc tylko na samym poczatku
- if( (i == 0) || (c != '-')) /*Na pierwszym miejscu pozwalamy każdy ze znaków, na innym nie pozwalamy minusa*/
- {
- putchar(c);
- dane[i] = c;
- i++;
- if(i > 31)
- break;
- }
- continue; // nie jest konieczne, ale zwieksza czytelnosc
- }
- if( c == 27)
- {
- putchar('\n');
- return -1; /* Przy kliknieciu ESC konczymy wprowadzanie liczby z bledem - do przerwania programu */
- }
- if( c == '\n')
- break; /* Kończę wpisywanie do tablicy przyciskiem enter */
- } while (1); /*Nigdy nie mogę wyjść inaczej niż przerwaniem break*/
- return 0; /* ciag jest wprowadzony poprawnie */
- }
- //-------------------------------------------------------
- const char komunikaty[4][64] = {"\nWprowadz wspolczynnik przy i^3: ", "\nWprowadz wspolczynnik przy i^2: ", "\nWprowadz wspolczynnik przy i: ", "\nWprowadz wyraz wolny: "};
- // -------------------------------------------------------
- int main(void)
- {
- char dane[32];
- double wspolczynniki[4];
- int liczba_krokow;
- printf("Ten program słuzy do liczenia pola powierzchni pod wykresem funkcji trzeciego stopnia.\n"
- "Nalezy wprowadzic cztery parametry - wspolczynniki wielomianu, poczatek i koniec zakresu oraz liczbe krokow. Im wiecej krokow tym wieksza dokladnosc.\n\n"
- "Wprowadzanie danej zatwierdzamy klawiszem Enter\n\n"
- "Wprowadzanie mozna w dowolnym momencie przerwac klawiszem ESC\n");
- do
- {
- printf("Wprowadz liczbe krokow nie mniejsza niz 2: ");
- if (-1 == podaj(dane, dTylkoDodatnie))
- {
- printf("Przerwales wprowadzanie, zamykam program.\n");
- return 0;
- }
- liczba_krokow = atof(dane);
- if (liczba_krokow < 2)
- {
- printf("Wprowadzono liczbe krokow mniejsza od 2, wprowadz jeszcze raz liczbe krokow");
- }
- }while (liczba_krokow < 2); /*Wyjdę z pętli dopiero jak wprowadzę dobrą ilość kroków */
- /* Wprowadzanie 4 wspolczynników */
- {int i;
- for (i = 0; i < 4; i++)
- {
- printf(komunikaty[i]);
- if (-1 == podaj(dane, dWszystkie))
- {
- printf("Przerwales wprowadzanie, zamykam program.\n");
- return 0;
- }
- wspolczynniki[i] = atoi(dane);
- }
- }
- /*Początek i koniec zakresu */
- printf("\nPodaj poczatek zakresu: ");
- if (-1 == podaj(dane, dWszystkie))
- {
- printf("Przerwales wprowadzanie, zamykam program.\n");
- return 0;
- }
- double poczatek;
- poczatek = atof(dane);
- double koniec;
- do
- {
- printf("\nPodaj koniec zakresu, wiekszy niz poczatek: ");
- if (-1 == podaj(dane, dWszystkie))
- {
- printf("Przerwales wprowadzanie, zamykam program.\n");
- return 0;
- }
- koniec = atof(dane);
- if (koniec < poczatek)
- printf("\nWprowadzono koniec mniejszy od poczatku, wprowadz jeszcze raz koniec: ");
- }while (koniec < poczatek);
- // y = zmienne[0] * i^3 + zmienna[1] * i^2 + zmienna[2] * i + zmienna[3]
- // pole = pole + y * krok
- long double krok = (koniec - poczatek) / (double)liczba_krokow; /* Szerokość przeskoku w osi x */
- long double y, pole;
- long double i = poczatek + krok;
- pole = 0.0;
- for (i = poczatek + krok; i <= koniec; i += krok)
- {
- y = wspolczynniki[0] * i*i*i + wspolczynniki[1] * i*i + wspolczynniki[2] * i + wspolczynniki[3];
- if (y < 0)
- {
- y = -y;
- }
- pole += (y * krok);
- }
- printf("\nWyliczone pole wynosi %.4f\n\n Wcisnij dowolny przycisk aby zakonczyc program\n\n");
- getch();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement