Ludzie pragną czasami się rozstawać, żeby móc tęsknić, czekać i cieszyć się z powrotem.
2.2.35 (C++) Napisz funkcję, która dla dwóch dodatnich całkowitolicz-bowych argumentów m i n zwraca wartość true jeżeli n dzieli m
oraz false w przeciwnym wypadku. W przypadku podania jednego
argumentu funkcja powinna sprawdzać czy podana liczba jest parzy-
sta.
2.2.36 (C++,r,!) Napisz rodzinę dwuargumentowych funkcji pot, z których każda jako argumenty otrzymuje liczbę n i nieujemną liczbę całkowitą
m typu unsigned int (zakładamy, że co najmniej jeden z argumen-
tów jest różny od zera) i zwraca jako wartość nm. Przeciąż funkcję
pot dla n o typach: double, int, unsigned int. Wynik zwrócony
przez każdą z funkcji pot powinien być tego samego typu co n.
2.2.37 (C++) Rodzinę funkcji pot z zadania 2.2.36 rozszerz o funkcje, w któ-
rych m jest typu int. Funkcje te powinny zwracać wartości typu
double.
2.2.38 (C++) Napisz rodzinę funkcji maksimum zwracających maksimum z dwóch liczb otrzymanych w argumentach. Typem zwracanym powinien być bardziej pojemny z typów argumentów (tak jak to ma miejsce
w przypadku operacji arytmetycznych). Przykładowo dla jednego ar-
gumentu typu int a drugiego typu double zwrócony powinien zostać
wynik o typie doble.
2.2.39 (C++) Napisz rodzinę funkcji maksimum zwracających maksimum od dwóch do pięciu wartości otrzymanych w argumentach. Argumenty
funkcji oraz wartość zwracana przez funkcję powinny być typu int.
2.2.40 (C++) Napisz rodzinę funkcji srednia zwracających średnią arytmetyczną z dwóch lub trzech wartości podanych przez użytkownika.
Typem wyniku każdej z funkcji powinien być najbardziej pojemny
z typów argumentów.
Rozdział 3
Wskaźniki i referencje
3.1.
Wprowadzenie . . . . . . . . . . . . . . . . . . . . . .
14
3.2.
Zadania . . . . . . . . . . . . . . . . . . . . . . . . . .
14
14
3. Wskaźniki i referencje
3.1. Wprowadzenie
Autor niniejszego zbioru jest zwolennikiem tego, aby w procesie naucza-
nia języka C jako pierwszego języka programowania, najpierw mówić o ta-
blicach jednowymiarowych, a dopiero potem mówić o wskaźnikach i ich po-
wiązaniach z tablicami. Od lat w takiej właśnie kolejności był prezentowany materiał na kursie „Programowanie w języku C” na kierunku informatyka
na UMCS. Takie ułożenie materiału pozwala studentom oswoić się z podsta-wami programowania zanim zaczną poznawać trudne zagadnienia związane
ze wskaźnikami. Niniejszy zbiór zadań odszedł od takiego ułożenia materia-
łu ze względu na jednoczesną prezentację rozwiązań w językach C i C++.
O ile bowiem w języku C możemy używać jednowymiarowych tablic nie wie-
dząc nic o wskaźnikach ani dynamicznym zarządzaniu pamięcią, o tyle w ję-
zyku C++ jest to możliwe tylko wtedy, gdy używamy tablic o z góry
(t.j. w momencie kompilacji) znanych rozmiarach.
Ci spośród czytelników, którzy uczą się języka C i nie chcą jeszcze poznawać wskaźników mogą przejść od razu do rozdziału 4. Większość z prezen-
towanych tam zadań nie będzie wymagała od nich znajomości wskaźników.
3.2. Zadania
3.2.1 (r) Napisz funkcję otrzymującą jako argumenty wskaźniki do dwóch zmiennych typu int, która zwraca jako wartość mniejszą z liczb wskazywanych przez argumenty.
3.2.2 (r) Napisz funkcję otrzymującą jako argumenty wskaźniki do dwóch zmiennych typu int, która zwraca jako wartość wskaźnik na zmienną
przechowującą mniejszą z liczb wskazywanych przez argumenty.
3.2.3 (r) Napisz funkcję otrzymującą jako argumenty wskaźniki do dwóch zmiennych typu int, która zamienia ze sobą wartości wskazywanych
zmiennych.
3.2.4 Napisz funkcję otrzymującą jako argumenty wskaźniki do dwóch zmiennych typu int, która zamienia ze sobą wartości wskazywanych zmien-
nych tylko wtedy, gdy wskazywana przez drugi argument zmienna jest
mniejsza od zmiennej wskazywanej przez pierwszy argument.
3.2.5 Napisz funkcję, której argumentami są dwa wskaźniki do stałych typu int, zaś zwracaną wartością jest suma wartości zmiennych wskazywanych przez argumenty.
3.2.6 Napisz funkcję, której argumentami są n typu int oraz w wskaźnik
do int, która przepisuje wartość n do zmiennej wskazywanej przez w.
3.2. Zadania
15
3.2.7 (C++,r) Napisz funkcję otrzymującą jako argumenty referencje do dwóch zmiennych typu int, która zamienia ze sobą wartości zmiennych, do których referencje dostaliśmy w argumentach.
3.2.8 (C++) Napisz funkcję otrzymującą dwa argumenty referencję a oraz wskaźnik b do zmiennych typu int, która zamienia ze sobą wartości zmiennych, do których wskaźnik i referencję dostała w argumen-
tach.
3.2.9 (r,róż) Napisz bezargumentową funkcję, która rezerwuje pamięć dla pojedynczej zmiennej typu int i zwraca jako wartość wskaźnik
do niej.
3.2.10 Napisz bezargumentową funkcję, która rezerwuje pamięć dla pojedynczej zmiennej typu double i zwraca jako wartość wskaźnik do niej.
3.2.11 (r,róż) Napisz funkcję, która dostaje jako argument dodatnią liczbę całkowitą n, rezerwuje w pamięci blok n zmiennych typu int i zwraca
jako wartość wskaźnik do początku zarezerwowanego bloku pamięci.
3.2.12 Napisz funkcję, która dostaje jako argument dodatnią liczbę całkowitą n, rezerwuje w pamięci blok n zmiennych typu double i zwraca jako
wartość wskaźnik do początku zarezerwowanego bloku pamięci.
3.2.13 (*,r,!) Napisz funkcję o dwóch argumentach:
— wskaźnik na funkcję o jednym argumencie typu int zwracającą
wartość typu double,
— wartość typu int,
która zwraca wartość funkcji otrzymanej w pierwszym argumencie na
liczbie całkowitej podanej w drugim argumencie.
3.2.14 (*) Napisz funkcję, która otrzymuje trzy argumenty:
— dwa wskaźniki na funkcje o jednym argumencie typu int zwraca-
jące wartość typu int,
— wartość n typu unsigned int,
i zwraca true, jeżeli otrzymane w argumentach funkcje są równe
dla wartości od 0 do n i false w przeciwnym wypadku.
3.2.15 (r,!) Napisz funkcję, która dostaje dwa argumenty: wskaźnik na stałą typu int i wskaźnik na zmienną typu int, i przepisuje zawartość sta-
łej wskazywanej przez pierwszy argument do zmiennej wskazywanej
przez drugi argument.
3.2.16 (r,!) Napisz funkcję, która dostaje dwa argumenty: wskaźnik na stałą typu int i stały wskaźnik na zmienną typu int. I przepisuje zawartość
stałej wskazywanej przez pierwszy argument do zmiennej wskazywanej
przez drugi argument.