~~NOCACHE~~ ~~REVEAL theme=simple&size=1024x800~~ ====== Lab. 1 Język C - powtórka ====== ===== ===== * wybór środowiska programistycznego IDE * struktura programu * deklaracja zmiennych, podstawowe typy * wczytanie danych i wydruk na ekran (rożne dokładności, liczba miejsc znaczących) * pętle, instrukcje warunkowe * funkcje, .... * tablica, macierze * zapis/odczyt plik * programujemy bez grafiki, ew. wykresy ilustrujące w Excelu, Originie, Matlabie ===== Struktura programu ===== #include /* definicja funkcji */ int nwd(int a, int b) { int c; while (b != 0) { c = a % b; a = b; b = c; } return a; } int main() { /* deklaracje zmiennych */ int a, b; /* instrukjce programu */ printf("Podaj dwie liczby calkowite dodatnie: "); scanf("%d %d", &a, &b); if ( a >0 && b > 0) printf("NWD(%d,%d) = %d\n", a, b, nwd(a,b)); else printf("Niepoprawne dane\n"); return 0; } ===== Typy zmiennych===== {{zajecia:pp1_2021_1:typy.png?600|}} [[https://pl.wikibooks.org/wiki/C/Zmienne#Typy_zmiennych|Typy zmiennych]] ===== Operatory ===== {{zajecia:mn1_2021_2:operatory.png?600|}} [[https://pl.wikibooks.org/wiki/C/Operatory|Operatory]] ===== Funkcja printf() i scanf ()===== {{zajecia:pp1_2021_1:printf3.png?450|}} **Specyfikatory formatu** {{zajecia:pp1_2021_1:printf.png?450|}} ===== ===== #include /* program wczytuje i wyswietla wartosc podanej liczby rzeczywistej */ int main() { float x; printf("Podaj liczbe: "); scanf("%f", &x); printf("Podales liczbe %.3f \n", x); printf("Notacja naukowa %e \n", x); return 0; } ===== Biblioteka standardowa ===== * [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#math.h|math.h]] - funkcje matematyczne \\ ''sin()'', ''cos()'', ''sqrt()'', ''pow()'', ''log()'',''log10()'', ''exp()'', ... * [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#stdlib.h|stdlib.h]] - zbiór podstawowych funkcji, np.: * ''rand()'' generator liczb losowych * ''exit()'' zamknięcie programu * ''system()'' uruchomienie polecenia systemowego * [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#time.h|time.h]] - obsługa czasu: * ''clock()'' czas wykonywania programu * ''time()'' czas od dnia 1 stycznia 1970 roku * [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#stdio.h|stdio.h]] - obsługa wejścia/wyjścia * [[http://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny|Biblioteka standardowa]] ===== ===== #include #include int main() { float x, y; scanf("%f", &x); y = sqrt(x); printf("Pierwiastek z %f wynosi %f\n", x, y); } ===== Instrukcje sterujące ===== * Warunki: * [[http://pl.wikibooks.org/wiki/C/Instrukcje_steruj%C4%85ce#if|if]] * [[http://pl.wikibooks.org/wiki/C/Instrukcje_steruj%C4%85ce#switch|switch]] - lista wyboru * Pętle: * [[http://pl.wikibooks.org/wiki/C/Instrukcje_steruj%C4%85ce#while|while]] * [[http://pl.wikibooks.org/wiki/C/Instrukcje_steruj%C4%85ce#for|for]] * [[http://pl.wikibooks.org/wiki/C/Instrukcje_steruj%C4%85ce#do..while|do while]] * Skok * [[http://pl.wikibooks.org/wiki/C/Instrukcje_steruj%C4%85ce#goto|goto]] - NAJLEPIEJ NIE UŻYWAĆ!!!! * [[https://pl.wikibooks.org/wiki/C/Instrukcje_steruj%C4%85ce#continue|continue]] - kontynuacja pętli * [[https://pl.wikibooks.org/wiki/C/Instrukcje_steruj%C4%85ce#break|break]] - przerwanie pętli lub instrukcji ''switch'' ===== Warunek if ===== {{zajecia:pp1_2021_1:if3.png?600|}} {{zajecia:pp1_2021_1:if_else3.png?600|}} ===== Pętla while ===== {{zajecia:pp1_2021_1:while3.png?600|}} ===== Pętla for ===== {{zajecia:mn1_2021_2:for.png?600|}} ===== Pętla do while ===== {{zajecia:mn1_2021_2:do_while.png?500|}} ===== Reprezentacja liczb w komputerze ===== * typy całkowite \\ ''char'', ''short'', ''int'', ''long'' \\ [[wppl>Kod uzupełnień do dwóch]] * typy **zmiennoprzecinkowe** (//floating point//) \\ ''float'', ''double'' \\ [[wppl>Liczba zmiennoprzecinkowa]] ===== ===== Co wyświetli poniższy kod? #include int main ( ) { float x = 0.1; if ( x == 0.1 ) printf ( "OK" ) ; else printf ( "Nie OK") ; } ===== Błędy wynikające z reprezentacji ==== * **nadmiar** (overflow ) - przekroczenie zakresu * **niedomiar** (underflow ) - zaokrąglenie bardzo małej liczby do 0 * błędy zaokrągleń * redukcja cyfr przy odejmowaniu bardzo bliskich sobie liczb zmiennoprzecinkowych * dodawanie (lub odejmowanie) dużej i małej liczby zmiennoprzecinkowej * kolejność operacji arytmetycznych może mieć wpływ na wielkość błędu ===== Zadanie - Epsilon maszynowy ===== Napisz program wyznaczający precyzję obliczeniową ([[wppl>epsilon maszynowy]]) dla typu ''**float**''. Porównaj uzyskany wynik z wartością stałej ''**FLT_EPSILON**'' zadeklarowanej w pliku nagłówkowym ''****''. ===== Dodatkowe ćwiczenia ===== Dodatkowe ćwiczenia nie podlegające ocenie. **Ćw. 1** Napisz program znajdujący pierwiastki równania kwadratowego $$y = ax^2 + bx + c$$ dla dowolnych $a, b, c$. Przy wyznaczaniu pierwiastków tradycyjnym podejściem (z wyznaczeniem delty) może dojść do istotnego błędu zaokrągleń gdy delta $\sqrt{\Delta}$ jest bliska $b$. Spróbuj zniwelować wpływ tego błędu wykorzystując [[wppl>Wzory Viète’a]] **Ćw. 2** Napisz program wyznaczający $\sqrt{2}$ a następnie podnieś wynik do kwadratu. Wypisz wartość bledu względnego uzyskanego wyniku dla typu ''float'' oraz osobno dla typu ''double''. **Ćw.3** Napisz program wyznaczający wartość wielomianu $f(x) = a_{n}x^n + \ldots + a_2x^2 +a_1x + a_0$ za pomocą [[wppl>Schemat_hornera|schematu Hornera]] **Ćw. 4** Napisz program wyznaczający sumę szeregu $$\sum_{n=0}^{\infty} q^{n}=1+q+q^{2}+q^{3}+\ldots \qquad \text{dla}\quad |q| < 1$$ Dla podanych przez użytkownika wartości $q$ oraz $k$ program wypisuje: * informację, że szereg jest rozbieżny, gdy nie jest spełniony warunek $|q|<1$ * dokładną wartość sumy szeregu równą $\frac{1}{1-q}$ * przybliżoną wartość sumy szeregu uzyskaną po dodaniu $k$ kolejnych elementów ciągu $\sum_{n=0}^{k} q^{n}$ oraz wartość błędu względnego i bezwzględnego * przybliżoną wartość sumy szeregu uzyskaną po dodaniu $k$ kolejnych elementów ciągu w odwrotnej kolejności $\sum_{n=k}^{0} q^{n}$ oraz wartość błędu względnego i bezwzględnego Sprawdź wyniki programu dla $q=0.99$ i $k=10^6$. Dlaczego błędy obu przybliżeń się różnią?