PRM, Laboratorium nr 7, semestr letni 2014/2015


Tematyka: Struktury, dynamiczna alokacja pamięci.

Zadanie 1. Wprowadzenie do struktur

  1. Utworzyć nowy projekt l7z1 i do głównego pliku projektu skopiować zawartość pliku źródłowego zad1.c
  2. Dlaczego napisy kopiujemy do struktury, a nie przypisujemy (funkcja opisz_przedmiot)?
  3. Dla jakich argumentów funkcja opisz_przedmiot nie wykona się poprawnie? Wprowadzić odpowiednią modyfikację zapewniającą poprawność tej funkcji.
  4. Sprawdzić wynik wywołania funkcji print_koszyk (linia 99) i porównać go ze sposobem wywołania funkcji dodaj_koszyk (linie 95-97). Dlaczego koszyk klienta jest niezgodny z oczekiwaniami? (sprawdzić implementację funkcji dodaj_przedmiot, linie 66-69).
  5. Czy funkcja dodaj_przedmiot zawsze wykona się poprawnie? Wprowadzić odpowiednią modyfikację zapewniającą poprawność tej funkcji.
  6. Wprowadzić prostą modyfikację do funkcji zaplac, dzięki której sprawdzimy, czy klienta stać na same owoce.

Zadanie 2. Alokacja pamięci

  1. Opracować strukturę String przechowującą ciąg znaków o dowolnym rozmiarze oraz informację o jego obecnej długości.
  2. Opracować funkcje
              struct String utworz_string(char* zrodlo)
              void usun_string(struct String string)
            
    które umożliwią odpowiednio: utworzenie struktury String wraz z zawartością oraz usunięcie zawartości tej struktury. W implementacji wykorzystać funkcje malloc oraz free (dlaczego zwykłe przypisanie wskaźników jest niebezpieczne?)
  3. Zmienić typ pola nazwa struktury Przedmiot na String.
  4. W funkcji main skopiować strukturę (operatorem przypisania =) nazwę przedmiotu do oddzielnej zmiennej:
              struct String nazwa_banana = banan.nazwa;
            
    Następnie zamienić pierwszą literę tego ciągu znaków na małą literę b. Czy nazwa przedmiotu banan zmieniła się?
  5. W funkcji main skopiować strukturę przedmiotu banan przy użyciu operatora przypisania:
              struct Banan kopia_banana = banan;
            
    Następnie zamienić pierwszą literę ciągu znaków kopia_banana.kolor[0] na dużą literę Z. Czy nazwa koloru przedmiotu banan zmieniła się?

Zadanie 3.

  1. Przygotować strukturę przechowującą część rzeczywistą oraz urojoną liczby zespolonej:
            
              typedef struct Complex {
                 float r, i;
              } C;
            
          
  2. Zaimplementować operacje dodawania oraz mnożenia liczb zespolonych:
            C dodaj(C a, C b);
            C pomnoz(C a, C b);
          
  3. Zaimplementować operację iloczynu skalarnego dwóch wektorów zespolonych o podanej przez użytkownika długości:
            C pomnoz_skalarnie(C *v, C *w, int dlugosc);
          
    Iloczynem skalarnym dwóch wektorów jest suma wyników mnożenia odpowiadających sobie składowych wektora. Na przykład:
            [2, j, 1] [1 ] = 2*1 + j*j3 + 1*4 = 3
                      |j3|
                      [4 ] 
          
  4. Przykładowy wynik działania programu:

    
          Podaj dlugosc wektora: 3
          Podaj skladowe wektora A: 1+j0 2+j2 0+j3
          Podaj skladowe wektora B: 2+j1 1+j0 0+j3
          Iloczyn skalarny wynosi: -5+j3