Pytania pomocnicze - INF.04
Projektowanie, programowanie i testowanie aplikacji
Pytania pomocnicze rozwijające tematy z pytań egzaminacyjnych. Każde pytanie ma krótką odpowiedź, która pomaga utrwalić wiedzę i przygotować się do egzaminu. Łącznie: 2975.
Strona 33 z 39.
Czym jest struktura `struct` w języku C?
Struktura to typ złożony, który pozwala połączyć kilka pól, często różnych typów, w jedną całość. Wszystkie pola struktury mogą przechowywać wartości jednocześnie.
Czym jest unia `union` w języku C?
Unia to typ złożony, którego pola współdzielą ten sam obszar pamięci. W praktyce poprawnie przechowuje jedną wartość naraz.
Dlaczego unia zwykle zajmuje mniej pamięci niż struktura?
Unia rezerwuje pamięć tylko dla największego ze swoich pól. Struktura musi mieć miejsce na wszystkie pola jednocześnie.
Co się stanie, gdy w unii zapisze się wartość do innego pola?
Nowa wartość nadpisze ten sam obszar pamięci, w którym znajdowała się poprzednia. Dlatego wcześniejsza wartość przestaje być poprawna.
Kiedy warto użyć struktury zamiast unii?
Struktury używa się wtedy, gdy trzeba przechowywać kilka powiązanych informacji jednocześnie, np. dane osoby: imię, wiek i wzrost.
Kiedy unia może być przydatna?
Unia jest przydatna, gdy zmienna może przechowywać dane różnych typów, ale tylko jeden z nich jest potrzebny w danej chwili. Może to oszczędzać pamięć.
Czy unia dynamicznie zmienia typ danych?
Nie. Unia nie zapewnia automatycznego ani dynamicznego typowania. Programista musi sam wiedzieć, które pole unii jest aktualnie używane.
Dlaczego plik trzeba najpierw otworzyć przed odczytem lub zapisem?
Otwieranie pliku daje programowi dostęp do zasobu w systemie plików. Program określa wtedy także tryb pracy, np. odczyt albo zapis.
Czym różni się odczytywanie pliku od zapisywania pliku?
Odczytywanie polega na pobieraniu danych z pliku do programu. Zapisywanie polega na umieszczaniu danych z programu w pliku.
Dlaczego należy zamykać pliki po zakończeniu pracy?
Zamknięcie pliku zwalnia zasoby systemowe i pozwala poprawnie zapisać dane z bufora. Brak zamknięcia może prowadzić do utraty danych lub blokowania pliku.
Co oznacza tryb otwarcia pliku?
Tryb otwarcia określa, co program może zrobić z plikiem, np. tylko czytać, zapisywać od początku albo dopisywać dane na końcu.
Jaka jest różnica między plikiem tekstowym a binarnym?
Plik tekstowy zawiera dane możliwe do interpretacji jako znaki, np. TXT lub CSV. Plik binarny zawiera dane w postaci bajtów, np. obraz, plik wykonywalny lub baza danych.
Jakie błędy mogą wystąpić podczas operacji na plikach?
Może wystąpić brak pliku, brak uprawnień, zajęcie pliku przez inny proces albo niepoprawna ścieżka. Takie sytuacje zwykle obsługuje się za pomocą wyjątków.
Czym wskaźnik różni się od zwykłej zmiennej?
Zwykła zmienna przechowuje wartość, np. liczbę. Wskaźnik przechowuje adres pamięci, pod którym może znajdować się taka wartość.
Do czego służy operator & w języku C?
Operator `&` służy do pobrania adresu zmiennej. Przykład: `&x` oznacza adres zmiennej `x`.
Do czego służy operator * przy wskaźnikach?
W deklaracji oznacza, że zmienna jest wskaźnikiem, np. `int *p`. Przy użyciu wskaźnika pozwala odczytać lub zmienić wartość znajdującą się pod danym adresem, np. `*p`.
Co oznacza dereferencja wskaźnika?
Dereferencja to odwołanie się do wartości znajdującej się pod adresem zapisanym we wskaźniku. W C wykonuje się ją operatorem `*`.
Dlaczego wskaźniki są ważne przy dynamicznej alokacji pamięci?
Funkcje takie jak `malloc` zwracają adres przydzielonego obszaru pamięci. Ten adres trzeba zapisać we wskaźniku, aby później korzystać z tej pamięci.
Czym jest wskaźnik pusty NULL?
`NULL` oznacza, że wskaźnik nie wskazuje na żaden poprawny obiekt w pamięci. Często używa się go do inicjalizacji wskaźników przed przypisaniem im właściwego adresu.
Do czego służy iterator w programowaniu?
Iterator służy do przechodzenia po kolejnych elementach kolekcji, np. listy, zbioru lub mapy. Pozwala odczytywać elementy bez znajomości wewnętrznej struktury kolekcji.
Czym różni się iterator od zwykłej pętli indeksowej?
Pętla indeksowa wymaga dostępu do elementów przez indeks, np. `tablica[i]`. Iterator działa także dla kolekcji, które nie mają indeksów, np. zbiorów.
Jakie metody często występują w iteratorze?
Często spotykane są metody typu `hasNext()` i `next()`. Pierwsza sprawdza, czy jest kolejny element, a druga go pobiera.
Czy iterator służy do kopiowania kolekcji?
Nie. Iterator nie tworzy kopii kolekcji, tylko umożliwia przechodzenie po jej elementach.
Czy iterator może być używany ze zbiorem, który nie ma indeksów?
Tak. To jedna z jego zalet — iterator pozwala przechodzić po elementach także wtedy, gdy kolekcja nie udostępnia dostępu przez numer indeksu.
Jaki jest związek między iteratorem a pętlą foreach?
Pętla `foreach` często korzysta z iteratora wewnętrznie. Programista pisze prostszą składnię, ale mechanizm nadal polega na pobieraniu kolejnych elementów.
Co oznacza skrót FIFO?
FIFO oznacza First In, First Out, czyli pierwszy wchodzi, pierwszy wychodzi. Element dodany najwcześniej jest pobierany jako pierwszy.
Dlaczego kolejka jest przykładem struktury FIFO?
Ponieważ elementy są pobierane w tej samej kolejności, w jakiej zostały dodane. Nie można pobrać elementu z końca kolejki przed wcześniejszymi elementami.
Czym różni się FIFO od LIFO?
W FIFO pierwszy dodany element jest pobierany jako pierwszy. W LIFO ostatni dodany element jest pobierany jako pierwszy, jak na stosie.
Jakie operacje są typowe dla kolejki?
Najczęstsze operacje to dodanie elementu do kolejki, pobranie elementu z początku kolejki oraz podejrzenie pierwszego elementu bez jego usuwania.
Gdzie w praktyce stosuje się kolejki FIFO?
Kolejki stosuje się np. w systemach drukowania, obsłudze zgłoszeń, kolejkach zadań, buforach danych i komunikacji między procesami.
Dlaczego tablica nie jest jednoznacznie kolekcją FIFO?
Tablica przechowuje elementy pod indeksami i pozwala zwykle na dostęp do dowolnego elementu. Sama z siebie nie narzuca zasady pierwszy wchodzi, pierwszy wychodzi.
Na czym polega zasada LIFO?
LIFO oznacza Last In, First Out, czyli ostatni dodany element jest pobierany jako pierwszy. Tak działa stos.
Czym różni się stos od kolejki?
Stos działa według zasady LIFO, a kolejka według zasady FIFO. W stosie pierwszy wychodzi ostatnio dodany element, a w kolejce pierwszy dodany element.
Jakie operacje wykonuje się na stosie?
Najważniejsze operacje to push, czyli dodanie elementu, pop, czyli zdjęcie elementu ze stosu, oraz peek/top, czyli podejrzenie elementu z wierzchu.
Dlaczego odpowiedzią nie jest lista?
Lista pozwala przechowywać wiele elementów i zwykle daje dostęp po indeksie lub przez iterację. Sama z siebie nie oznacza zasady LIFO.
Dlaczego odpowiedzią nie jest kolejka?
Kolejka obsługuje elementy według zasady FIFO, czyli pierwszy dodany element jest pobierany jako pierwszy. To odwrotność działania stosu.
Do czego w praktyce używa się stosu?
Stos stosuje się m.in. przy obsłudze wywołań funkcji, cofaniu operacji, sprawdzaniu nawiasów i algorytmach typu DFS.
Co oznacza pobranie elementu z wierzchu stosu?
Oznacza odczytanie elementu, który został dodany jako ostatni. W operacji pop element ten jest dodatkowo usuwany ze stosu.
Dlaczego lista jest lepsza od tablicy, gdy liczba elementów zmienia się dynamicznie?
Lista umożliwia łatwe dodawanie i usuwanie elementów bez ręcznego tworzenia nowej kolekcji. Tablica ma stały rozmiar, więc jej powiększanie wymaga utworzenia nowej tablicy i skopiowania danych.
Kiedy tablica będzie lepszym wyborem niż lista?
Tablica jest dobrym wyborem, gdy liczba elementów jest znana z góry i nie będzie się zmieniać. Zapewnia szybki dostęp do elementów przez indeks.
Czy lista również pozwala na dostęp do elementów przez indeks?
Tak, lista taka jak `List<T>` w C# pozwala odczytywać elementy przez indeks, np. `lista[0]`. Sama możliwość indeksowania nie jest więc główną przewagą tablicy nad listą.
Co oznacza dynamiczna zmiana liczby elementów w kolekcji?
Oznacza to, że w trakcie działania programu elementy mogą być dodawane lub usuwane. Przykładem jest lista produktów w koszyku sklepu internetowego.
Dlaczego odpowiedź o niezmiennej liczbie elementów nie pasuje do listy?
Jeśli liczba elementów jest stała, tablica zwykle wystarcza i może być prostszym rozwiązaniem. Lista jest szczególnie przydatna wtedy, gdy rozmiar kolekcji nie jest znany lub zmienia się podczas działania programu.
Co dzieje się, gdy lista przekroczy swoją aktualną pojemność?
Lista wewnętrznie tworzy większy obszar pamięci i kopiuje do niego dotychczasowe elementy. Programista zwykle nie musi wykonywać tego ręcznie.
Dlaczego zbiór jest najlepszy do przechowywania unikalnych elementów?
Ponieważ jego podstawową cechą jest brak duplikatów. Próba dodania elementu, który już istnieje, nie powoduje utworzenia drugiej kopii.
Czym różni się zbiór od tablicy?
Tablica przechowuje elementy według indeksów i może zawierać duplikaty. Zbiór nie służy głównie do dostępu po indeksie, lecz do przechowywania wartości bez powtórzeń.
Czym różni się zbiór od listy lub sekwencji?
Lista i sekwencja zwykle zachowują kolejność dodawania elementów i mogą zawierać powtórzenia. Zbiór skupia się na unikalności elementów, a kolejność często nie jest gwarantowana.
Do czego można wykorzystać zbiór w programowaniu?
Zbiór przydaje się do usuwania duplikatów, sprawdzania odwiedzonych elementów, przechowywania unikalnych identyfikatorów lub szybkiego testowania przynależności elementu do kolekcji.
Czy kolejka priorytetowa nadaje się do przechowywania unikalnych elementów?
Nie jest to jej główne zastosowanie. Kolejka priorytetowa służy do pobierania elementów według priorytetu, a nie do automatycznego pilnowania unikalności.
Jak działa dodawanie duplikatu do zbioru?
Jeśli element już istnieje w zbiorze, nie zostanie dodany ponownie. Zawartość zbioru pozostanie taka sama.
Czym różni się mapa od listy?
Lista przechowuje elementy zwykle według indeksów liczbowych, a mapa przechowuje pary klucz–wartość. W mapie element pobiera się po kluczu, np. po loginie użytkownika.
Dlaczego HashMap umożliwia szybki dostęp do danych?
HashMap wykorzystuje funkcję haszującą, która przekształca klucz na miejsce przechowywania wartości. Dzięki temu wyszukiwanie jest średnio bardzo szybkie.
Czy klucze w mapie muszą być unikalne?
Tak, w mapie każdy klucz powinien być unikalny. Dodanie nowej wartości pod istniejącym kluczem zwykle zastępuje poprzednią wartość.
Czy HashMap automatycznie sortuje dane?
Nie. HashMap nie gwarantuje uporządkowania elementów. Do przechowywania danych posortowanych po kluczach w Javie służy np. TreeMap.
Czy mapa zawsze zajmuje mniej pamięci niż tablica?
Nie. Mapy często mają dodatkowy narzut pamięciowy związany z przechowywaniem kluczy, wartości i struktur pomocniczych.
Kiedy mapa jest lepszym wyborem niż tablica?
Mapa jest lepsza, gdy elementy trzeba wyszukiwać po znaczącym kluczu, np. ID użytkownika, nazwie produktu lub loginie, a nie po numerze indeksu.
Jakie podstawowe operacje wykonuje się na mapie?
Najczęstsze operacje to dodawanie pary klucz–wartość, pobieranie wartości po kluczu, usuwanie elementu oraz sprawdzanie, czy dany klucz istnieje.
Dlaczego metoda alokacji pamięci ma znaczenie przy tworzeniu zestawów danych?
Wpływa na ilość zużytej pamięci RAM, szybkość działania programu i możliwość obsługi dużych zbiorów danych. Nieprawidłowa alokacja może prowadzić do błędów lub spadku wydajności.
Czym różni się alokacja statyczna od dynamicznej?
Alokacja statyczna zakłada rozmiar danych znany z góry. Alokacja dynamiczna pozwala przydzielać pamięć w trakcie działania programu, gdy liczba danych może się zmieniać.
Jakie problemy mogą wystąpić przy złym zarządzaniu pamięcią?
Mogą pojawić się wycieki pamięci, przepełnienie pamięci, fragmentacja lub spowolnienie działania aplikacji. W skrajnych przypadkach program może się zatrzymać.
Dlaczego liczba linii kodu nie jest kluczowym aspektem przy tworzeniu zestawów danych?
Liczba linii kodu nie mówi bezpośrednio o tym, jak dane są przechowywane i ile pamięci zajmują. Ważniejsza jest struktura danych oraz sposób zarządzania pamięcią.
Jak struktura danych wpływa na zużycie pamięci?
Różne struktury danych mają różny narzut pamięciowy. Na przykład tablica zwykle zajmuje mniej pamięci niż lista powiązana, ale może być mniej elastyczna przy zmianie rozmiaru.
Kiedy warto stosować dynamiczne struktury danych?
Gdy liczba elementów nie jest znana z góry lub zmienia się podczas działania programu. Przykładami są listy, wektory, kolekcje i dynamiczne tablice.