Wszystkie ćwiczenia


Ćwiczenia 3

Wskaźniki

Witaj, o pamięć RAM!

I. Wprowadzenie

Załóżmy, że mamy dom. Znamy jego własności, takie jak adres, wymiary, kolor dachu etc. Chcemy kupić prezent w popularnym serwisie aukcyjnym lub sklepie internetowym.

Mamy dwa wyjścia:

  1. Podać adres domu (w naszym przypadku miejsce w pamięci)
  2. Zapakować dom na ciężarówkę, pojechać do sprzedawcy i powiedzieć: "Dostarcz do tego domu!" (przekazać przez kopię wartości)
Zadanie 0

Wskaż nowe elementy języka


#include <iostream>
#include <string>

struct house
{
    std::string city;
    std::string street;
    int number;
};

void buyingOnline(house *addr)
{
    std::cout << (*addr).city   << std::endl
              << (*addr).street << std::endl
              << (*addr).number << std::endl;
}

int main()
{
    house home;
    home.city = "Warszawa";
    home.street = "Koszykowa";
    home.number = 86;

    buyingOnline(&home);
}

II. Używanie wskaźników na typach prostych

Zadanie 1

Zastąp znaki zapytania odpowiednim kodem.


#include <iostream>

using std::cout;
using std::endl;

int main()
{
    int x = 10;

    cout << "adres zmiennej x: " << ? << endl;
    cout << "wyświetlenie wartości zmiennej x za pomocą jej adresu: " << ? << endl;

}
Zadanie 2
  1. Utwórz nową zmienną "px". Niech będzie wskaźnikiem na zmienną "x".
  2. Następnie, za pomocą "px", zwiększ wartość "x" o 3.
  3. Potem spraw, aby "px" zaczął pokazywać na "y".
  4. Zwiększ wartość "px" o 1.
  5. Spróbuj zwiększyć wartość, na którą pokazuje "px".
  6. Wyciągnij wnioski.

#include <iostream>

using std::cout;
using std::endl;

int main()
{
    int x = 10;
    int y = 20;
}
Zadanie 3
  1. Utwórz dwie metody o nazwie "modify". Jedna niech przyjmuje jako parametr int, a druga int*.
  2. Niech każda metoda "modify" powiększy wartość parametru o 1.
  3. Wywołaj metody na rzecz zmiennej typu int w obrębie metody main.
  4. Wyciągnij wnioski (przyda się wypisywanie wyników).

III. Używanie wskaźników na tablicach

Zadanie 4

Przeanalizuj kod poniżej. Znajdź nowe elementy i podaj ich znaczenie.


#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;
using std::cin;

int main()
{
    int size;
    cout << "Podaj rozmiar tablicy: ";
    cin >> size;

    int *arr = new int[size];

    for (int i = 0; i < size; ++i)
    {
        cin >> arr[i];
    }

    delete[] arr;
}
    
Zadanie 5
  1. Wyświetl wartość *arr. Czemu to odpowiada?
  2. Zmodyfikuj kod z zadania 4. tak, aby nie używał zapisu "[ ]" przy dostępie do elementu tablicy.

IV. Używanie wskaźników w/na strukturach

Zadanie 6

Przeanalizuj kod poniżej. Jedno z odwołań do pól jest niepoprawne. Zakomentuj odpowiedni wiersz.


#include <iostream>
#include <string>
#include <cstdlib>

using std::cout;
using std::endl;
using std::cin;

struct house
{
    std::string city;
    std::string street;
    int number;
};

int main()
{
    house *h = new house();
    
    *h.city = "Warszawa";
    (*h).street = "Koszykowa";
    h->number = 86;

    delete h;
}
        
Zadanie 7

Która definicja elementu listy jest poprawna? Dlaczego?


// A
struct item {
    item next;
};
                    

// B
struct item {
    item* next;
};
                    

V. Do domu (dla chętnych)

Zadanie 8

Przygotuj strukturę listy oraz metody, które umożliwią:

  1. wstawianie elementu
  2. pobieranie n-tego elementu
  3. usuwanie n-tego elementu
Zadanie 9

Zbuduj strukturę, która pozwoli na zbudowanie drzewa binarnego oraz metody, które pozwolą na:

  1. wstawianie elementu
  2. wyszukiwanie elementu
Zadbaj o optymalność: mniejszy element odkładaj do lewego syna, większy do prawego (Pomocny materiał).
Zadanie 10

Zmodyfikuj bazę danych z poprzenich zajęć tak, aby program używał mniejszej ilości pamięci i pozwalał na dowolne powiększanie wielkości zbioru (dynamiczna alokacja pamięci).

Warto użyć struktur z poprzednich zadań, można napisać nowe.