Funkcje

Na zajęciach obowiązuje zakaz używania zmiennych globalnych !

#include <stdio.h>
 
/* deklaracja funkcji */
int silnia(int n);
 
int main()
{
   int liczba,s; 
 
   printf("Podaj liczbe: ");
   scanf("%d",&liczba);
   s = silnia(liczba);
   printf("Silnia z %d wynosi %d\n",liczba,s);
 
   return 0; 
}
 
/* definicja funkcji */
int silnia(int n)
{
   int i=2, s=1;
 
   while( i < n+1 )
   {
      s = s * i;
      i = i + 1;
   }
   return s;
}

Ćwiczenia

  • Napisz funkcję o nazwie jest_pierwsza, która dla danej liczby całkowitej zwraca wartość 1 gdy podana liczba jest liczbą pierwszą a wartość 0 - gdy jest nie jest
  • Korzystając z funkcji jest_pierwsza napisz program który wyświetli wszystkie liczby pierwsze mniejsze lub równe pewnej podanej przez użytkownika liczbie całkowitej
  • Napisz funkcję o nazwie trojkat, która dla danej liczby całkowitej wyświetla trójkąt prostokątny złożony z podanej liczby linii, np.:
  *****
  ****
  ***
  **
  * 
  • dodaj kolejny argument do funkcji trojkat(), który określa jaki znak będzie użyty zamiast *
  • Sprawdź dla jakich danych wejściowych program obliczający silnię przestaje dawać wiarygodne wyniki? Spróbuj zwiększyć zakres dokładnie obliczanych wartości.
  • Napisz funkcję o nazwie potega, która dla danych argumentów x (wartość rzeczywista) i y (wartość całkowita) wyznacza wartość potęgi xy
  • Napisz funkcję rpotega(), która dla danych argumentów float p i int w wyznacza rekurencyjnie wartość potęgi pw
  • Napisz funkcję o nazwie licznik, która zwraca liczbę określającą ile razy dotychczas ta funkcja została uruchomiona

Spis funkcji math.h

Ćwiczenia

  • zobacz opis funkcji scanf(), printf(), getchar() i putchar() (biblioteka stdio.h)
  • korzystając z odpowiednich funkcji z biblioteki standardowej napisz funkcję void pierwiastki(float a,float b,float c), która wyświetla miejsca zerowe równania y = ax2 + bx +c lub komunikat o ich braku

Uwaga Kompilując program korzystający z funkcji matematycznych zadeklarowanych w pliku math.h należy dodać opcję -lm, czyli dla programu zawartego w pliku pirwiatek.c kompilacja w Linuksie wygląda tak

cc pierwiastek.c -lm -o pierwiastek
  1. Napisz funkcję Fibonacci (w postaci iteracyjnej lub rekurencyjnej), która wyświetla n pierwszych elementów ciągu Fibonacciego.
    Elementy ciągu wynoszą: F0=0, F1=1 i Fn=Fn-1+Fn-2 dla n > 1
  2. Napisz funkcję Newton, która dla podanych dwóch liczb całkowitych oblicza wartość symbolu Newtona
  3. Napisz funkcję Gauss, która dla podanej wartości centrum (wartości średniej) i rozmycia (odchylenia standardowego) oblicza wartość funkcji Gaussa
  4. Napisz funkcję wyznaczającą sumę n pierwszych elementów ciągu arytmetycznego
  5. Napisz funkcję wyznaczającą sumę n pierwszych elementów ciągu geometrycznego
  6. Napisz i przetestuj funkcję, która znajduje największy wspólny dzielnik dwóch liczb naturalnych. Można skorzystać z algorytmu Euklidesa podanego poniżej

Dla danych dwóch liczb X i Y

 1. jeśli X jest równe Y to jest to największy dzielnik
 2. jeśli X > Y to niech X <- X - Y i wróć do punktu 1
 3. jeśli X < Y to niech Y <- Y - X i wróć do punktu 1

Zmianne lokalne vs. globalne

#include<stdio.h>
 
int globalna;
 
void f(void)
{
   int lokalna = 6;
   globalna++;  
   printf("wewnatrz funkcji: globalna = %d\tlokalna = %d\n",globalna,lokalna);
}
 
int main()
{
   int lokalna;
 
   printf("globalna = %d\tlokalna = %d\n",globalna,lokalna);
   f();
   printf("globalna = %d\tlokalna = %d\n",globalna,lokalna); 
 
   return 0;
}

Zmiene statyczne vs. automatyczne

#include <stdio.h>
 
void dodaj(int a)
{
    static int x = 0; /* zmienna statyczna */
    int y = 0;        /* zmienna automatyczna */
    x = x + a;
    y = y + a;
    printf("x = %d\ty = %d\n",x,y);
}
 
int main()
{
  dodaj(1);
  dodaj(3);
  dodaj(4);
  dodaj(1);
 
  return 0;
}

Iteracja vs. rekurencja

Wersja iteracyjna

int silnia(int n)
{
   int i, s=1;
   for(i=1; i < n+1 ; i++) s*= i;
   return s;
}

Wersja rekurencyjna

int rsilnia(int n)
{
   if(n <= 1) return 1;
   return n*rsilnia(n-1);
}