Spis treści

Funkcje

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

Definicja funkcji i jej użycie

#include <stdio.h>
 
/* definicja funkcji */
 
int silnia(int n)
{
   int i=2;
   int s=1;
 
   while( i < n+1 )
   {
      s = s * i;
      i = i + 1;
   }
   return s;
}
 
float parabola(float x, float a, float b, float c)
{
   return  a * x * x + x * b + c;
}
 
int main()
{
   int liczba, s;
   float y;
 
   printf("Podaj liczbe: ");
   scanf("%d", &liczba);
   s = silnia(liczba);
   printf("Silnia z %d wynosi %d\n",liczba,s);
 
   y = parabola( 2.0, -4, 2, 3.3);
 
   return 0; 
}

Zadanie: Najmniejszy wspólny dzielnik

Zaimplementuj funkcję nwd, która dla dwóch liczb całkowitych wyznaczy najmniejszy wspólny dzielnik za pomocą algorytmu Euklidesa.

Algorytm euklidesa
Dane: liczby całkowite dodatnie a i b

  1. jeżeli a jest równe b to wartość a jest najmniejsym wspólnym dzielnikiem i zakończ algorytm
  2. jeżeli a > b to zastąp a wartością a-b i wróć do punktu 1
  3. jeżeli a < b to zastąp b wartością b-a i wróć do punktu 1

Napisz program, który wczyta 2 liczby całkowite dodatnie i wyświetli ich najmniejszy wspólny dzielnik.

Przykład

Podaj dwie liczby calkowite:
20
15
nwd=5
Podaj dwie liczby calkowite:
144
233
nwd=1

Podaj dwie liczby calkowite:
4673826832
47382974392
nwd=8

Zadanie: Potega

Zaimplementuj funkcję o nazwie potega, która dla danych argumentów x (wartość rzeczywista) i y (wartość całkowita) wyznacza wartość potęgi xy. Napisz program, który wczyta dwie liczby x i y a następnie korzystając z funkcji potega wypisze wartość xy. Spróbuj przystosować program tak aby działał poprawnie również dla wartości y<0.

Przykład

Podaj dwie liczby:
2
2
2.000000 do potegi 10 wynosi 4.000000 
Podaj dwie liczby:
2
10
2.000000 do potegi 10 wynosi 1024
Podaj dwie liczby:
2
-10
2.000000 do potegi -5 wynosi 0.031250
Podaj dwie liczby:
4.2
10
4.2 do potegi 10 wynosi 1708019.8

Zadanie: Liczby pierwsze

Zaimplementuj funkcję o nazwie czy_jest_pierwsza, która dla podanej liczby całkowitej n zwraca wartość 1 jeżeli n jest liczbą pierwszą. W przeciwnym wypadku funkcja zwraca wartość 0.
Napisz program, który wczyta dodatnią liczbę całkowitą xi wypisze wszystkie liczby pierwsze w zakresie od 1 do x.

Przykład

n = 10
Liczby pierwsze z zakresu od 1 do 10
1 2 3 5 7
n = 100
Liczby pierwsze z zakresu od 1 do 100
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

Tablica jako argument funkcji

#include <stdio.h>
#define MAX 100
 
void wczytaj(float t[], int n)
{
	int i;
	printf("\nPodaaj kolejne liczby:\n");
 
	for(i=0;i<n;i++)
	{
		printf("tab[%d]=",i);
		scanf("%f",&t[i]);
	}
}
 
int main()
{
	int n;
	float tablica[MAX];
	printf("Podaj rozmiar tablicy: ");
	scanf("%d",&n);
 
	wczytaj(tablica,n);
}

Zadanie: Statystyki

Do powyższego przykładu prezentującego użycie tablicy jako argumentu funkcji dodaj:

Napisz program, który wczyta n liczb rzeczywistych a następnie wyświetli wartość średnią, wartość odchylenia standardowego oraz posortowaną liste liczb.

Przykład:

Ile elementow ?
n = 5
t[0] = 5.3
t[1] = 2.3
t[2] = -5.4
t[3] = 3.14
t[4] = 32
Suma = 37.340000
Srednia = 7.468000
Odchylenie = 12.787060
Posortowane elementy tablicy:
t[0] = -5.400000
t[1] = 2.300000
t[2] = 3.140000
t[3] = 5.300000
t[4] = 32.000000

Pomocne przykłady

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

Zadania domowe

  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 funkcję, która odwróci kolejność elementów w tablicy
  7. Napisz funkcję, która dokona przesunięcia cyklicznego wszystkich elementów tablicy o podaną wartość elementów
  8. Napisz funkcję, która dla podanej liczby całkowitej n wypisze wszystkie liczby pierwsze od 1 do n korzystając z sita sita Eratotenesa