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;
}

Typy zmiennych

Typy zmiennych

Operatory

Operatory

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

  • math.h - funkcje matematyczne
    sin(), cos(), sqrt(), pow(), log(),log10(), exp(), …
  • stdlib.h - zbiór podstawowych funkcji, np.:
    • rand() generator liczb losowych
    • exit() zamknięcie programu
    • system() uruchomienie polecenia systemowego
  • time.h - obsługa czasu:
    • clock() czas wykonywania programu
    • time() 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

Warunek if

Pętla while

Pętla for

Pętla do while

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