PRM, Laboratorium nr 4, semestr letni 2014/2015
Tematyka: Funkcje, przekazywanie argumentów przez wartość
oraz przez wskazanie.
Zadanie 1. Wskaźniki, funkcje, zmienne globalne i lokalne, przekazywanie
argumentów przez wartość/wskazanie, modyfikator const.
- Utworzyć nowy projekt
l4z1
i do głównego pliku projektu
skopiować zawartość pliku źródłowego z1.c
- Zapoznać się z definicją funkcji
suma
, która zwraca pewną
wartość. (linie 6-8, linie 40-44)
- Zapoznać z uproszonym sposobem deklaracji funkcji. Co się stanie, gdy
usuniemy deklarację tej funkcji? Co się stanie, gdy
usuniemy definicję tej funkcji? (linie 10-14, linie 77-82, linie 46-47)
- Zaobserwować co stanie się, jeżeli argument funkcji zadeklarowano
jako
const
, a funkcja wykonuje operacje na tej zmiennej
(linie 25-27)
- Zapoznać się z widocznością zmiennych globalnych i lokalnych, oraz
sposobami deklarowania i wywoływania funkcji. (linia 3, linie
52-54)
- Zapoznać się ze sposobem deklaracji wskaźników,
operatorem adresowania (znak
&
) oraz operatorem
wyłuskania wartości ze wskaźnika (znak *
). Na jaką
wartość pokazuje wskaźnik po modyfikacji zmiennej rok
?
(linie 57-64)
- Zapoznać się ze sposobami przekazywania argumentów przez wartość i wskazanie. Na tej podstawie wytłumaczyć, dlaczego funkcja
scanf
wymaga argumentów poprzedzonych znakiem &
(linie 68-72, linie 29-35)
Zadanie 2. Przekazywanie argumentów do funkcji przez wartość i
wskazanie.
- Utworzyć nowy projekt
l4z2
i do głównego pliku projektu skopiować zawartość pliku
źródłowego z2.c
- Uruchomić program i zapoznać się z jego działaniem.
- Zmodyfikować program tak, aby realizował (poprawnie) zadanie zamiany
wartości zmiennych przez wywołanie funkcji. Wskazówki:
skorzystać z przekazania argumentu przez wskazanie i wprowadzić
dodatkową zmienną lokalną.
Zadanie 3. Zadanie samodzielne.
Grupa A
Napisać i uruchomić program do obliczania natężenia prądu stałego płynącego przez
rezystor oraz wydzielającej się na nim mocy. Użytkownik wprowadza wartość
oporu oraz napięcie odłożone na rezystorze. Program powinien zawierać
funkcję o sygnaturze:
int oblicz_parametry_rezystora(double opor, double napiecie, double* wsk_natezenie, double* wsk_moc);
Funkcja powinna zwracać 0 gdy obliczenia się powiodą, 1 gdy nie jest możliwe
wykonanie obliczeń (tzn. gdy opor <= 0
). Jeżeli obliczenia się
powiodą, wartości natężenia i mocy powinny być wpisane pod adresy w pamięci
zawarte we wskaźnikach wsk_natezenie
oraz wsk_moc
.
Przykładowy wynik działania programu:
Proszę podać opór rezystora [om]: 1
Proszę podać napięcie odłożone na rezystorze [V]: 5
Natężenie wynosi: 5 [A], moc: 25 [W]
Proszę podać opór rezystora [om]: 0
Proszę podać napięcie odłożone na rezystorze [V]: 5
Opór jest mniejszy bądź równy zero!
Grupa B
Napisać i uruchomić program wyznaczający pole powierzchni oraz objętość
kuli na podstawie jej promienia. Program powinien zawierać funkcję o sygnaturze:
int oblicz_pole_objetosc(double promien, double* wsk_pole, double* wsk_objetosc);
Funkcja ta zwraca 0 gdy obliczenia się powiodą i 1 gdy nie jest możliwe
wykonanie obliczeń (tzn. gdy promien < 0
). Jeżeli obliczenia się
powiodą, pole powierzchni i objetosc powinny być wpisywane pod adresy w pamięci zawarte we
wskaźnikach wsk_pole
oraz wsk_objetosc
.
Przykładowe wyniki działania programu:
Prosze podać promien kuli: 3
Pole powierzchni i objetosc wynosza: 12.57 i 4.19
Prosze podac promien kuli: -1.3
Promien mniejszy od zera!