~~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ą?