Ćwiczenia: C/C++

Proste programy — operacje IO, instr. warunkowe i iteracyjne, funkcje

  1. „Za mało za dużo” — proszę napisać program pozwalający użytkownikowi na odgadnięcie liczby wylosowanej przez komputer. Program losuje nieznaną użytkownikowi liczbę (zakładamy np. przedział 1..100), użytkownik typuje liczbę, program odpowiada użytkownikowi czy to dobra liczba, czy też za mała, lub za duża. Gra trwa tak długo, aż użytkownik odgadnie wylosowaną liczbę.
  2. Odwrotne „Za mało za dużo” — proszę napisać program w wersji, w której komputer odgaduje liczbę wymyśloną przez użytkownika. Komputer typuje liczbę (zakładamy np. przedział 1..100) oraz pyta użytkownika czy to dobra liczba, czy też za mała, lub za duża. Gra trwa tak długo, aż użytkownik potwierdzi odgadnięcie liczby, lub komputer zorientuje się, że użytkownik oszukuje i podaje niewłaściwe odpowiedzi.
  3. Program Figury — proszę napisać program pozwalający na kalkulacje pól figur płaskich: kwadrat, prostokąt, koło, trójkąt, trapez. Wymagania użytkowe: program ma wyświetlać proste konsolowe menu pozwalające na wielokrotne powtarzanie obliczeń. Z poziomu menu użytkownik wybiera figurę, po wprowadzeniu liczb niezbędnych do wyznaczenia pól (długości boków, podstawy, wysokości, promienia) obliczona wartość jest wyświetlana. Program ma nie dopuścić do wprowadzenia ujemnych wartości liczbowych. Wymagania implementacyjne: program ma być podzielony na funkcje. Operacje potrzebne do obliczenia pola (wczytanie danych, uruchomienie obliczeń, wyświetlenie wyników) dla każdego rodzaju figury powinny być zawarte w osobnych funkcjach. Samo obliczenie pola figury ma być również zawarte w odpowiedniej funkcji. Do wprowadzania danych liczbowych z kontrolą ich nieujemności należy zdefiniować odpowiednią funkcję. Wskazowki: prezentacja koncepcji funkcji oraz wskazówki implementacyjne, szablon programu — menu konsolowe z podziałem na funkcje.

Wykorzystanie tablic jednowymiarowych

  1. W trakcie badań kardiologicznych dokonuje się pomiarów tętna pacjenta. Załóżmy, że tętno spoczynkowe to 60 uderzeń serca na minutę. Należy napisać funkcje otrzymującą tablicę pomiarów tętna. Rezultatem funkcji ma być liczba określająca ile razy tętno pacjenta podniosło lub obniżyło się znacznie. Taka sytuacja występuje, gdy pomiar tętna jest większy od 70 lub mniejszy od 50. Proszę napisać funkcję int skokiTetna( double pomiary[], int ilePomiarow ), gdzie tablica pomiary zawiera liczby odpowiadające pomiarom tętna a ilePomiarow to liczba określająca ile wartości zapisano w tablicy pomiary.
  2. Przy drodze szybkiego ruchu zainstalowano urządzenie zliczające liczbę przejeżdżających pojazdów. Zliczanie odbywa się na tej zasadzie, że czujnik optyczny dokonuje pomiaru co pewien, krótki czas. Generuje on daną o wartości 0 jeżeli nie zarejestrowano ruchu, wartość większą od zera, jeżeli czujnik wykrył ruch. Dane generowane przez czujnik są zapisywane w tablicy liczb rzeczywistych, przykładowy ciąg wartości 0 0 0 2 3 0 0 2 4 3 0 1 1 1 1. Pojazd uznajemy jako zliczony, jeżeli zarejestrowano ciąg przynajmniej trzech niezerowych pomiarów o wartości średniej większej od 1. Dla podanego wyżej ciągu jako zliczony zostanie uznany jeden pojazd. Proszę napisać funkcję int zliczPojazdy( double pomiary[], int ilePomiarow ), gdzie tablica pomiary zawiera wartości generowane prze czujnik a ilePomiarow to liczba określająca ile wartości zapisano w tablicy pomiary. Rezultatem funkcji ma być liczba pojazdów uznanych, wg powyższej reguły, jako zliczone.
  3. Program Roczny bilans: proszę napisać program pozwalający na przeprowadzenie rocznego bilansu dochodów związanych z prowadzeniem działalności gospodarczej. Przedsiębiorca w każdym miesiącu osiąga przychód, aby go osiągnąć ponosi też koszty. Różnica pomiędzy przychodem a kosztem jego uzyskania może być ujemna, wtedy przedsiębiorca ponosi stratę. Jeżeli różnica ta jest nieujemna to osiąga on dochód, być może zerowy. Zadaniem programu będzie umożliwienie przedsiębiorcy analizy rocznych przychodów, kosztów i dochodów. Wymagania użytkowe: program powiem wyświetlać proste konsolowe menu, pozwalające użytkownikowi na:

    • wprowadzenie przychodów z kolejnych dwunastu miesięcy,
    • wprowadzenie kosztów z kolejnych dwunastu miesięcy,
    • wyliczenie sumarycznego przychodu, sumarycznych kosztów oraz sumarycznego dochodu,
    • wyznaczenie wśród wprowadzonych danych minimalnego, maksymalnego i średniego przychodu, kosztu i dochodu, wraz z informacją, w których miesiącach te wartości wystąpiły.
    • bilans dla kolejnych miesięcy: program wyświetla cztery kolumny, w pierwszej wartość przychodu, w drugiej wartość kosztu, w trzeciej wartość dochodu, w czwartej odpowiednio napisy „strata”, „zysk” lub „zero” w zależności od relacji pomiędzy przychodem a kosztem. Każdy wiersz zawiera dane z jednego miesiąca.

    Wymagania implementacyjne: przychody i koszty to nieujemne liczby rzeczywiste. Należy kontrolować poprawność wprowadzanych danych. Przychody oraz koszty powinny zostać zapisane w tablicach liczb rzeczywistych o sparametryzowanym rozmiarze. Operacje wyznaczania dla przychodów i kosztów takich wartości jak suma, średnia, minimum, maksimum powinny być realizowane przez odpowiednie funkcje, obsługujące zarówno tablicę kosztów jak i przychodów. Można zastosować globalne tablice przychodów i kosztów, jednak powyższe funkcje mają pracować na tablicach przekazanych jako parametr. Kolumny przy zestawieniu bilansu z kolejnych miesięcy powinny być estetycznie ułożone, liczby wyrównane do lewej krawędzi kolumny, wartości w postaci dziesiętnej (nie wykładniczej) z dwoma miejscami po przecinku. Program (przy uwzględnieniu naturalnych ograniczeń trybu konsolowego) powinien być czytelny i komunikować się z użytkownikiem w zrozumiały sposób. Wskazowki: prezentacja koncepcji funkcji oraz wskazówki implementacyjne, Wskazowki: tablice i zasady ich przetwarzania, szablon programu — menu konsolowe z podziałem na funkcje.

Wykorzystanie tablic dwuwymiarowych

  1. Proszę napisać funkcję void show( char tab[] [], int numOfRows, int numOfCols ) { ... }, której zadaniem jest wypisanie do strumienia wyjściowego programu zawartości dwuwymiarowej tablicy przekazanej parametrem tab. Tablica liczy numOfRows wierszy oraz numOfCols kolumn. Format wyprowadzanych danych powinien odpowiadać zawartości tablicy – w kolejnych wyprowadzanych wierszach powinny pojawiać się znaki zapisane w kolejnych wierszach tablicy. Uwaga, tę funkcję proszę wykorzystać do testowania działania omówionych niżej funkcji.
  2. Uwaga: ze względu na pewne zawiłości języka C/C++ parametr funkcji reprezentujący tablicę dwuwymiarową musi być zapisany w specjalny sposób. Zamiast spodziewanego zapisu:

    void fun( char tab[][] )
    {
      ...
    }
    

    trzeba użyć zapisu

    void fun( char (*tab)[] )
    {
      ...
    }
    

    Szczegóły zostaną wyjaśnione później.

  3. Zakładamy, że rozpatrujemy dwuwymiarową, kwadratową tablicę znaków (liczba wierszy jest równa liczbie kolumn). Proszę napisać funkcje (otrzymujące taką kwadratową tablicę jako parametr):
    • void backSlash( char tab[][], int size ) { … } — funkcja wpisuje znaki ‘*’ na głównej przekątnej (diagonalnej) tablicy tab o rozmiarze size, pozostałe elementy tablicy są wypełnione znakami spacji.

      5×5
      *
       * 
        *
         *
          *
      
    • void slash( char tab[][], int size ) { … } — funkcja wpisuje znaki ‘*’ na przekątnej niediagonalnej tablicy tab o rozmiarze size, pozostałe elementy tablicy są wypełnione znakami spacji.

      5×5
          *
         * 
        *
       *
      *
      
    • void x( char tab[][], int size ) { … } — funkcja wpisuje znaki ‘*’ na obu przekątnych tablicy tab o rozmiarze size, pozostałe elementy tablicy są wypełnione znakami spacji.

      5×5
      *   *
       * * 
        *
       * *
      *   *
      
    • void square( char tab[][], int size ) { … } — funkcja wpisuje znaki ‘*’ do wszystkich elementów pierwszego i ostatniego wiersza oraz pierwszej i ostatniej kolumny tablicy tab o rozmiarze size, pozostałe elementy tablicy są wypełnione znakami spacji.

      5×5
      *****
      *   * 
      *   *
      *   *
      *****
      
  4. Proszę napisać funkcję void characterA( char tab[][], int numOfRows, int numOfCols ) { ... }, której zadaniem jest zapisanie w tablicy znaków o nazwie tab wizerunku litery A zbudowanej ze znaków ‘*’. Tablica liczy numOfRows wierszy oraz numOfCols kolumn. Funkcja powinna przeanalizować wymiary tablicy tab rozmieścić w niej znaki ‘*’ maksymalnie wykorzystując obszar tablicy. Do testowania funkcji proszę wykorzystać napisaną wcześniej funkcję show. Można założyć, że dla tablic o rozmiarze mniejszym niż 3×3 funkcja nie będzie działać. Przykładowe rozmieszczeni znaków w tablicach o różnych wymiarach:
    4×4
     **   
    *  *  
    ****
    *  *
    
    4×7
     ***** 
    *     *
    *******
    *     *
    
    4×3
     * 
    * *
    ***
    * *
    * *
    
    3×3
     * 
    ***
    * *
    

    Proszę napisać analogiczne funkcje dla liter E, F, H, L, O, U. Można się pokusić o napisanie funkcji dla wszystkich dużych liter alfabetu angielskiego.

Przetwarzanie łańcuchów znaków

  1. Opierając się na wykładzie poświęconym przetwarzaniu napisów proszę o zaimplementowanie funkcji wg programu wzorcowego 1 oraz funkcji dodatkowych. Implementacja z wykorzystaniem klasycznych operacji indeksowania tablicy i operatora [].
  2. Opierając się na wykładzie poświęconym przetwarzaniu napisów z wykorzystaniem wskaźników proszę o zaimplementowanie funkcji wg programu wzorcowego 2. Implementacja z wykorzystaniem wskaźników char *.

Elementy programowania obiektowego

  1. Definiowanie prostych klas, pola prywatne, konstruktory, metody set/get, realizatory.. Proszę zdefiniować klasy reprezentujące podstawowe figury geometryczne: kwadrat, prostokąt, koło, trójkąt. Każda z klas powinna przechowywać w prywatnych polach informacje potrzebne do obliczenia pola powierzchni danej figury. Dla każdego pola prywatnego należy zdefiniować metodę ustawiającą i pobierającą wartość. Należy zadbać o to, aby nie było możliwe ustawienie ujemnej wartości parametrów figur (np. boku kwadratu czy promienia koła). Każda klasa powinna posiadać zdefiniowane metody obliczające pole powierzchni figury. Należy również zdefiniować dla każdej klasy konstruktor bezparametrowy oraz konstruktor ogólny. Proszę napisać program pozwalający na obliczanie pól figur płaskich, realizowanych z wykorzystaniem zdefiniowanych klas. Uwaga, proszę przećwiczyć elementy charakterystyczne dla języka C++, takie jak:
    • definiowanie funkcji składowych poza klasą,
    • wykorzystanie operatora zakresu „::”,
    • wykorzystanie parametrów domyślnych w celu ograniczenia liczby konstruktorów,
    • wykorzystanie w konstruktorach list inicjalizacyjnych.

    Przykład prostej klasy Kwadrat:

    class Kwadrat
    {
      public:
        Kwadrat( double bok = 0 );
        void ustawBok( double bok );
        double podajBok();
        double obliczPole();
      private:
        double bok;
    };
    
    Kwadrat::Kwadrat( double bok ) : bok( 0 )
    {
      ustawBok( bok );
    }
    
    void Kwadrat::ustawBok( double bok )
    {
      if( bok >= 0 )
        Kwadrat::bok = bok;
    }
    
    double Kwadrat::podajBok()
    {
      return bok;
    }
    
    double Kwadrat::obliczPole()
    {
      return bok * bok;
    }
    
  2. Wymagania implementacyjne: program ma być podzielony na funkcje. Operacje potrzebne do obliczenia pola (wczytanie danych, utworzenie obiektów, przekazanie danych, realizacja obliczeń) dla każdego rodzaju figury powinny być zawarte w osobnych funkcjach. Wskazowki:

  3. Dziedziczenie..Bazując na klasach (zadanie powyższe) reprezentujących podstawowe figury geometryczne: kwadrat, prostokąt, koło, trójkąt, proszę zdefiniować klasy reprezentujące bryły: sześcian, prostopadłościan, kula, graniastosłup. Proszę wykorzystać dziedziczenie. Klasy reprezentujące bryły powinny posiadać funkcję składową obliczania pola, wyznaczającą wartość odpowiednią dla każdej z figur. Proszę rozszerzyć program z poprzedniego zadania, tak aby oferował możliwość obliczania pól nie tylko figur, ale również brył (sześcian, prostopadłościan, koło, graniastosłup). Wskazowki:

Przejdź do strony wykładu