====== Wskaźniki ======
**Adres zmiennej - operator ''&''**
Operator referencji ''&'' zwraca adres zmiennej
#include
int main()
{
int a = 42;
printf("adres zmiennej a %p\n", &a);
}
{{zajecia:pp1_2019_1:wsk1.c|wsk1.c}}
**Deklaracja zmiennej wskaźnikowej **
#include
int main()
{
int a = 42;
int *w;
w = &a;
printf("adres zmiennej a %p\n", w);
printf("adres zmiennej a %p\n", &a);
}
{{zajecia:pp1_2019_1:wsk2.c|wsk2.c}}
**Dostęp do adresu - operator ''*''**
Operator dereferencji ''*'' udostępnia wartość z danego adresu
#include
int main()
{
int a = 42;
int *w = &a;
*w = 13;
printf("a = %d\n", a);
}
{{zajecia:pp1_2019_1:wsk3.c|wsk3.c}}
**Wskaźnik argumentem funkcji **
Adres zmiennej przekazany w argumencie funkcji pozwala tej funkcji zmodyfikować wartość wskazywanej zmiennej
#include
void fun(int *a)
{
*a = 42;
}
int main()
{
int a = 1;
fun( &a );
printf("a = %d\n", a);
}
{{zajecia:pp1_2019_1:wsk4.c|wsk4.c}}
===== Zadanie - zamiana =====
Zaimplementuj funkcję o nazwie ''zamiana'', która pozwala zamienić wartości dwóch zmiennych typu ''float''.
Przetestuj działanie tej funkcji.
===== Zadanie - układ równań =====
Zaimplementuj funkcję rozwiązującą układ równań z 2 niewiadomymi.
''ax + by = c''\\
''dx + ey = f'' \\
**Argumenty funkcji**: liczby rzeczywiste ''a'', ''b'', ''c'', ''d'', ''e'', ''f'' defilujące układ równań oraz zmienne wskaźnikowe ''x'', ''y'', do których zostanie wstawiony wynik.\\
**Wartość zwracana z funkcji**: liczba całkowita równa:
* -1 gdy układ jest sprzeczny (brak rozwiązań), zmienne ''x'' i ''y'' nie są modyfikowane
* 0 gdy układ jest niejednoznaczny (posiada wiele rozwiązań), zmienne ''x'' i ''y'' nie są modyfikowane
* 1 gdy istnieje jednoznaczne rozwiązanie, do zmiennych wskazywanych przez ''x'' i ''y'' umieszczane jest rozwiązanie układu.
Napisz program, który wczyta wartości defilujące układ równań a następnie, korzystając z powyższej funkcji, wyznaczy rozwiązanie układu równań.\\
Przykład działania:
Podaj wspolczynniki ukladu rownan:
3 5 17 2 -3 5
Rozwiazanie x=4.000000, y=1.000000
Podaj wspolczynniki ukladu rownan:
-1 -1 3 1 1 -3
Uklad rownan jest nioznaczony
Podaj wspolczynniki ukladu rownan:
1 2 3 1 2 4
Uklad rownan jest sprzeczny
===== Zadanie - dominanta =====
Zaimplementuj funkcję, która zwróci dominantę oraz liczbę wystąpień dominanty z danego ciągu liczb rzeczywistych.
**Argumenty funkcji**: tablica ''t'' liczb rzeczywistych, liczba całkowita ''n'' określająca ilość liczb w tablicy ''t'', wskaźnik do zmiennej ''x'', która po zakończeniu funkcji będzie zawierała wartość dominującą z tablicy ''t''.\\
**Wartość zwracana z funkcji**: liczba całkowita określająca ilość wystąpień dominanty\\
Napisz program, który wczyta z klawiatury ''n'' liczb rzeczywistych i korzystając z powyższej funkcji wyznaczy wartość dominującą a następnie wypisze wynik.
Plik {{zajecia:pp1_2019_1:stat.c|stat.c}} zawiera funkcje ''wczytaj'' i ''wypisz'' , które można użyć w zadaniu.
Przykład działania:
Ile liczb?
5
Podaj liczby:
5
-3
5
5
4
Diminanata to 5
Ilosc wystapien 3
===== Tablice i wskaźniki =====
**Tablica jest zmienną wskaźnikową**
* Zmienna tablicowa zawiera adres początku tablicy, tzn. ''tab'' to to samo co ''&{tab[0]}''
* Dodanie wartości całkowitej do wskaźnika powoduje przesunięcie się do kolejnego elementu w tablicy (pamięci)
* Adres ''i''-tego elementu tablicy ''&(tab[i])'' to ''tab+i''
* Dostęp do ''i''-tego elementu tablicy ''tab[i]'' to ''*(tab+i)''
* Adresu przypisanego do zmiennej tablicowej nie można modyfikować, tzn. niedozwolona jest operacja ''tab%%++%%''
#include
int main()
{
int t[10];
int *p;
int i;
for( p=t; p < t+10; p++ ) *p = 42;
for(i=0; i<10; i++)
printf("%d\n", *(t+i));
}
{{zajecia:pp1_2019_1:wsk5.c|wsk5.c}}
===== Zadanie - Odwracanie kolejności =====
Zaimplementuj funkcję ''odwroc'', która odwróci kolejność elementów w tablicy z liczbami rzeczywistymi. W implementacji tej funkcji nie używaj indeksowania tablicy za pomocą liczb całkowitych lecz użyj wyłącznie zmiennych wskaźnikowych oraz funkcji ''zamiana'' z poprzedniego zadania.
**Argumenty funkcji**: tablica ''t'' liczb rzeczywistych, liczba całkowita ''n'' określająca ilość liczb w tablicy ''t''
**Wartość zwracana z funkcji**: adres tablicy ''t'' zawierającej elementy w odwrotnej kolejności
Napisz program, który wczyta z klawiatury ''n'' liczb rzeczywistych do tablicy i korzystając z powyższej funkcji odwróci kolejność elementów a następnie wypisze wszystkie elementy tablicy.
Plik {{zajecia:pp1_2019_1:stat.c|stat.c}} zawiera funkcje ''wczytaj'' i ''wypisz'' , które można użyć w zadaniu.
===== Zadania domowe =====
* we wszystkich funkcjach z zajęć dotyczących tablicy liczb rzeczywistych (wczytaj, wyswietl, srednia itd.) wprowadź wskaźniki zamiast indeksowania tablic zmienną całkowitą
* zaimplementuj funkcję ''**pierwiastki**'', która wyznacza pierwiastki paraboli. Argumentami funkcji są współczynniki ''a'', ''b'' i ''c'' równania kwadratowego oraz adresy zmiennych ''x1'' i ''x2'', do których zostaną wstawione wartości miejsc zerowych. Funkcja zwraca wartość 0, 1 lub 2 informującą o liczbie miejsc zerowych.