Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ====== Wskaźniki ====== **Adres zmiennej - operator ''&''** Operator referencji ''&'' zwraca adres zmiennej <code C> #include<stdio.h> int main() { int a = 42; printf("adres zmiennej a %p\n", &a); } </code> {{zajecia:pp1_2019_1:wsk1.c|wsk1.c}} **Deklaracja zmiennej wskaźnikowej ** <code C> #include<stdio.h> int main() { int a = 42; int *w; w = &a; printf("adres zmiennej a %p\n", w); printf("adres zmiennej a %p\n", &a); } </code> {{zajecia:pp1_2019_1:wsk2.c|wsk2.c}} **Dostęp do adresu - operator ''*''** Operator dereferencji ''*'' udostępnia wartość z danego adresu <code C> #include<stdio.h> int main() { int a = 42; int *w = &a; *w = 13; printf("a = %d\n", a); } </code> {{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 <code C> #include<stdio.h> void fun(int *a) { *a = 42; } int main() { int a = 1; fun( &a ); printf("a = %d\n", a); } </code> {{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%%++%%'' <code C> #include<stdio.h> 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)); } </code> {{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.