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 <stdio.h> /* 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; }
Funkcja printf() i scanf ()
Specyfikatory formatu
#include <stdio.h> /* 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
- stdlib.h - zbiór podstawowych funkcji, np.:
rand()
generator liczb losowychexit()
zamknięcie programusystem()
uruchomienie polecenia systemowego
- time.h - obsługa czasu:
clock()
czas wykonywania programutime()
czas od dnia 1 stycznia 1970 roku
- stdio.h - obsługa wejścia/wyjścia
- pierwiastek.c
#include<math.h> #include<stdio.h> int main() { float x, y; scanf("%f", &x); y = sqrt(x); printf("Pierwiastek z %f wynosi %f\n", x, y); }
Instrukcje sterujące
Reprezentacja liczb w komputerze
Co wyświetli poniższy kod?
#include <stdio.h> 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
Błąd względny i bezwzględny
Błąd bezwzględny - różnica pomiędzy wartością zmierzoną $x$ a wartością rzeczywistą $x_{0}$
$$\Delta x = x - x_{0} $$
Błąd względny - iloraz błędu bezwzględnego i wartości dokładnej $x_{0}$
$$\delta_x = \frac{\Delta x}{x_{0}}$$
Zadanie 1
Treść zadania znajduje się w Moodle pod adresem Zadanie 1
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 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ą 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ą?