poniedziałek, 5 marca 2018

00030 - 1042 - Transponowanie macierzy - www.pl.spoj.com

Treść zadania:

Transponuj podaną macierz.

Wejście
W pierwszym wierszu znajdują się dwie liczby m n (1<=m,n<=200) oznaczające odpowiednio liczbę wierszy oraz liczbę kolumn. Następnie następuje m wierszy, w każdym n liczb.

Wyjście
Na wyjściu powinna znaleźć się macierz transponowana do zadanej

Przykład

Wejście:
4 3
1 2 5
4 3 3
3 4 9
8 7 7

Wyjście:
1 4 3 8
2 3 4 7
5 3 9 7


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int m, n, i, j;
    int tab [200][200];

    scanf("%d%d",&m,&n);

    for(i=0;i<m;++i)
    {
        for(j=0;j<n;++j)
        {
            scanf("%d",&tab[i][j]);
        }
    }
    for(i=0;i<n;++i)
    {
        for(j=0;j<m;++j)
        {
            printf("%d ",tab[j][i]);
        }
        printf("\n");
    }
    return 0;
}



Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    int m, n, i, j;
    int tab [200][200];

 cin>>m>>n;
 
    for(i=0;i<m;++i)
    {
        for(j=0;j<n;++j)
        {
            cin>>tab[i][j];
        }
    }
    for(i=0;i<n;++i)
    {
        for(j=0;j<m;++j)
        {
            cout<<tab[j][i]<<" ";
        }
        cout<<endl;
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/TRN/

czwartek, 1 marca 2018

[C++] Biblioteka Tmenu - przewijane menu w konsoli

Witajcie,

Przedstawiam bibliotekę Tmenu.h która pozwala na proste tworzenie przewijanych menu za pomocą strzałek.
Z części programu można skorzystać jako biblioteka lub jako część kodu bez dołączania dodatkowych bibliotek.

Aktywna opcja w programie zanaczona jest na kolor czerwony. Aby ją aktywować należy naciskąć w konsoli kalwisz enter.





Aby przewinąć opcję do góry należy nacisnąć strzałkę do góry.



Aby przewinąć opcję do dołu należy nacisnąć strzałkę do dołu.


Skorzystanie z programu jako biblioteka:

Do katalogu z programem dodaj plik Tmenu.h a następnie w dodaj do programu jako bibliotekę używając

#include "Tmenu.h"



Można także dodać zawartość biblioteki do swojego programu wtedy nie jest wymagane tworzenie biblioteki jednak w praktyce rozdziela się programy na biblioteki.

Obsług biblioteki jest bardzo prosta:
W kontekście każdego z menu należy dodać jego tytuł:
TMenu Menu("Tytuł menu");


Następnie kolejne opcje w menu wraz z nazwą dodajemy za pomocą Menu.add podając najpierw nazwę następnie funkcję którą wywołuje (w tym przypadku tytuł to Funkcja 1 a opcja wywołuje funkcję f1:
Menu.add("Funkcja 1", f1);


Screany z dzialania programu:












Kody źródłowe z dwoma przykładami wykorzystania przewijanego menu - jako część kodu źródłowego programu oraz jako dołączona biblioteka do projektu.

Kod źródłowy biblioteki Tmenu.h:
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <vector>
#include <windows.h>
#include <iomanip>

using namespace std;

class TMenu
{
    public:
        TMenu(string _Title);
        TMenu(void);

        void add(string _Name, void (*procedure) () );
        void view();
        void SetTitle(string _Title);


    private:
        struct TItem
        {
            string Name;
            void (*procedure)();
        };
        string Title;
        string Max;
        string spac;

        int max;
        int index;

        vector <TItem> List;
};

TMenu::TMenu(string _Title)
{
    //system("windows1250");
    Title = _Title;
    max = Title.size() + 4;

    index = 0;
}

void TMenu::add(string Name, void (*procedure) ())
{
    if (Name != "")
    {
        TItem item;
        item.Name = Name;
        item.procedure = procedure;

        List.push_back(item);

        max = (Name.size() + 4 > max)? Name.size() + 4 : max;

        Max  = "";
        spac = "";
        for (int i = 0; i < max; i ++)
        {
            Max += '-';
            spac += ' ';
        }
    }
}

void TMenu::view()
{
    //system("windows1250");
    char c = '/0';
    do
    {
        system("cls");

        cout << endl;

        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                    FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        cout << "  +" << Max << '+' << endl;

        cout << "  |"
                << spac.substr(0, (max - Title.size()) / 2)
                << Title
                << spac.substr(0, max - Title.size() - ((max - Title.size()) / 2))
                << '|' << endl;

        cout << "  +" << Max.substr(0, max) << '+' << endl;

        for (int i = 0; i < List.size(); i ++)
        {
            cout << "  |";
            if (i == index)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_INTENSITY);
            }
            else
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_INTENSITY);
            }

            cout << spac.substr(0, (max - List[i].Name.size()) / 2)
                 << List[i].Name
                 << spac.substr(0, (max - (List[i].Name.size()) - (max - List[i].Name.size()) / 2) );

            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                    FOREGROUND_GREEN | FOREGROUND_INTENSITY);

            cout << '|' << endl;
        }

        cout << "  +" << Max << "+";

        c = getch();
        if (c == 72 && index > 0) //down
        {
            index --;
        }

        if (c == 80 && index < List.size() - 1) //up
        {
            index ++;
        }
    }
    while (c != 13 && c != 27);

    if (c == 27)
    {
        system("exit");
    }

    if (c  == 13)
    {
        //cout << index << endl; //80 down
        system("cls");
        (*List[index].procedure)();
    }
}

Kod źródłowy programu wykorzystującego bibliotekę Tmenu.h:
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <vector>
#include <windows.h>
#include <iomanip>
#include "Tmenu.h"

using namespace std;

void main_menu();

void f1()
{
    TMenu Menu("Funkcja 1");
    Menu.add("Funkcja 1.1", f1);
    Menu.add("Funkcja 1.2", f1);
    Menu.add("Funkcja 1.3", f1);
    Menu.add("Funkcja 1.4", f1);
    Menu.add("Funkcja 1.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f2()
{
    TMenu Menu("Funkcja 2");
    Menu.add("Funkcja 2.1", f2);
    Menu.add("Funkcja 2.2", f2);
    Menu.add("Funkcja 2.3", f2);
    Menu.add("Funkcja 2.4", f2);
    Menu.add("Funkcja 2.5", f2);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f3()
{
    TMenu Menu("Funkcja 3");
    Menu.add("Funkcja 3.1", f1);
    Menu.add("Funkcja 3.2", f1);
    Menu.add("Funkcja 3.3", f1);
    Menu.add("Funkcja 3.4", f1);
    Menu.add("Funkcja 3.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f4()
{
    TMenu Menu("Funkcja 4");
    Menu.add("Funkcja 4.1", f1);
    Menu.add("Funkcja 4.2", f1);
    Menu.add("Funkcja 4.3", f1);
    Menu.add("Funkcja 4.4", f1);
    Menu.add("Funkcja 4.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f5()
{
    TMenu Menu("Funkcja 5");
    Menu.add("Funkcja 5.1", f1);
    Menu.add("Funkcja 5.2", f1);
    Menu.add("Funkcja 5.3", f1);
    Menu.add("Funkcja 5.4", f1);
    Menu.add("Funkcja 5.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f_exit()
{
    cout<<"Program zostanie zamknięty"<<endl;
    _sleep(1000);
    system("cls");
    system("color f");
    exit(0);
}

void main_menu()
{
    TMenu Menu("Program");
    Menu.add("Funkcja 1", f1);
    Menu.add("Funkcja 2", f2);
    Menu.add("Funkcja 3", f3);
    Menu.add("Funkcja 4", f4);
    Menu.add("Funkcja 5", f5);
    Menu.add("Zamknij program", f_exit);
    Menu.view();
}

int main()
{
    setlocale( LC_ALL, "" );
    main_menu();
    return 0;
}

Kod źródłowy programu bez dodawania biblioteki (jako część programu):
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <vector>
#include <windows.h>
#include <iomanip>

using namespace std;

void main_menu();

class TMenu
{
    public:
        TMenu(string _Title);
        TMenu(void);

        void add(string _Name, void (*procedure) () );
        void view();
        void SetTitle(string _Title);


    private:
        struct TItem
        {
            string Name;
            void (*procedure)();
        };
        string Title;
        string Max;
        string spac;

        int max;
        int index;

        vector <TItem> List;
};

TMenu::TMenu(string _Title)
{
    //system("windows1250");
    Title = _Title;
    max = Title.size() + 4;

    index = 0;
}

void TMenu::add(string Name, void (*procedure) ())
{
    if (Name != "")
    {
        TItem item;
        item.Name = Name;
        item.procedure = procedure;

        List.push_back(item);

        max = (Name.size() + 4 > max)? Name.size() + 4 : max;

        Max  = "";
        spac = "";
        for (int i = 0; i < max; i ++)
        {
            Max += '-';
            spac += ' ';
        }
    }
}

void TMenu::view()
{
    //system("windows1250");
    char c = '/0';
    do
    {
        system("cls");

        cout << endl;

        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                    FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        cout << "  +" << Max << '+' << endl;

        cout << "  |"
                << spac.substr(0, (max - Title.size()) / 2)
                << Title
                << spac.substr(0, max - Title.size() - ((max - Title.size()) / 2))
                << '|' << endl;

        cout << "  +" << Max.substr(0, max) << '+' << endl;

        for (int i = 0; i < List.size(); i ++)
        {
            cout << "  |";
            if (i == index)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_INTENSITY);
            }
            else
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_INTENSITY);
            }

            cout << spac.substr(0, (max - List[i].Name.size()) / 2)
                 << List[i].Name
                 << spac.substr(0, (max - (List[i].Name.size()) - (max - List[i].Name.size()) / 2) );

            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                                    FOREGROUND_GREEN | FOREGROUND_INTENSITY);

            cout << '|' << endl;
        }

        cout << "  +" << Max << "+";

        c = getch();
        if (c == 72 && index > 0) //down
        {
            index --;
        }

        if (c == 80 && index < List.size() - 1) //up
        {
            index ++;
        }
    }
    while (c != 13 && c != 27);

    if (c == 27)
    {
        system("exit");
    }

    if (c  == 13)
    {
        //cout << index << endl; //80 down
        system("cls");
        (*List[index].procedure)();
    }
}

void f1()
{
    TMenu Menu("Funkcja 1");
    Menu.add("Funkcja 1.1", f1);
    Menu.add("Funkcja 1.2", f1);
    Menu.add("Funkcja 1.3", f1);
    Menu.add("Funkcja 1.4", f1);
    Menu.add("Funkcja 1.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f2()
{
    TMenu Menu("Funkcja 2");
    Menu.add("Funkcja 2.1", f2);
    Menu.add("Funkcja 2.2", f2);
    Menu.add("Funkcja 2.3", f2);
    Menu.add("Funkcja 2.4", f2);
    Menu.add("Funkcja 2.5", f2);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f3()
{
    TMenu Menu("Funkcja 3");
    Menu.add("Funkcja 3.1", f1);
    Menu.add("Funkcja 3.2", f1);
    Menu.add("Funkcja 3.3", f1);
    Menu.add("Funkcja 3.4", f1);
    Menu.add("Funkcja 3.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f4()
{
    TMenu Menu("Funkcja 4");
    Menu.add("Funkcja 4.1", f1);
    Menu.add("Funkcja 4.2", f1);
    Menu.add("Funkcja 4.3", f1);
    Menu.add("Funkcja 4.4", f1);
    Menu.add("Funkcja 4.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f5()
{
    TMenu Menu("Funkcja 5");
    Menu.add("Funkcja 5.1", f1);
    Menu.add("Funkcja 5.2", f1);
    Menu.add("Funkcja 5.3", f1);
    Menu.add("Funkcja 5.4", f1);
    Menu.add("Funkcja 5.5", f1);
    Menu.add("Cofnij", main_menu);
    Menu.view();
}

void f_exit()
{
    cout<<"Program zostanie zamknięty"<<endl;
    _sleep(1000);
    system("cls");
    system("color f");
    exit(0);
}

void main_menu()
{
    TMenu Menu("Program");
    Menu.add("Funkcja 1", f1);
    Menu.add("Funkcja 2", f2);
    Menu.add("Funkcja 3", f3);
    Menu.add("Funkcja 4", f4);
    Menu.add("Funkcja 5", f5);
    Menu.add("Zamknij program", f_exit);
    Menu.view();
}

int main()
{
    setlocale( LC_ALL, "" );
    main_menu();
    return 0;
}

środa, 28 lutego 2018

00029 - 1830 - Nierówność trójkąta - www.pl.spoj.com

Treść zadania:

Napisz program, który sprawdza, czy istnieje trójkąt o bokach o podanej długości.

Wejście
Na wejście programu podana zostanie pewna nieokreślona liczba zestawów danych. Każdy z zestawów składa się z 3 liczb rozdzielonych spacjami. Poszczególne zestawy zostaną rozdzielone znakiem nowej linii.

Wyjście
Na wyjściu ma się pojawić ciąg binarny, którego i-ty wyraz jest równy 1, jeżeli istnieje trójkąt o długościach boków podanych w i-tym wczytanym z wejścia zestawie. Poszczególne elementy tego ciągu należy rozdzielić znakiem nowej linii.

Przykład

Wejście:
1.2 1.2 1.2
1.5 2.5 3.5
-1.5 6.0 4.5
2 4 8

Wyjście:
1
1
0
0


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    double a, b, c;
    for(;scanf("%lf%lf%lf",&a,&b,&c)!=EOF;)
    {
        if((a+b)>c && (a+c)>b && (b+c)>a && a>0 && b>0 && c>0)
        {
            printf("1\n");
        }
        else
        {
            printf("0\n");
        }
    }
    return 0;
}


Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    double a, b, c;
    for(;cin>>a>>b>>c;)
    {
        if((a+b)>c && (a+c)>b && (b+c)>a && a>0 && b>0 && c>0)
        {
            cout<<1<<endl;
        }
        else
        {
            cout<<0<<endl;
        }
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/KC003/

poniedziałek, 26 lutego 2018

00028 - 998 - Kalkulator 2 - www.pl.spoj.com

Treść zadania:

Napisz program, który działa jak prosty kalkulator z pamięcią obsługujący pięć operacji: dodawanie, odejmowanie, mnożenie, dzielenie i obliczanie reszty z dzielenia liczb całkowitych. Przyjmujemy, że nasz kalkulator ma w pamięci 10 rejestrów o numerach 0 - 9 oraz że wszystkie rejestry zawierają na początku zera.

Wejście
Na wejście programu podana zostanie pewna nieokreślona liczba zestawów danych. Zestawy składają się z jednoznakowego symbolu operacji do wykonania (+, -, *, /, % i z) oraz następujących po nim dwóch liczb całkowitych.

Wyjście
Na wyjściu programu ma się pojawić ciąg liczb będących rezultatem wykonania pojawiających się na wejściu poleceń. Poszczególne liczby należy rozdzielić znakami nowej linii. To, co należy wykonać, zależy od symbolu operacji. Symbole +, -, *, / i % nakazują wykonanie odpowiednio dodawania, odejmowania, mnożenia, dzielenia i obliczenia reszty z dzielenia liczb, które są przechowywane w rejestrach o podanych numerach. Symbol z nakazuje zapis wartości podanej jako drugi argument w rejestrze o numerze podanym jako pierwszy argument. (Po wykonaniu tej operacji nie trzeba nic wyświetlać). Uwaga! Można założyć, że dane wejściowe nie zawierają polecenia dzielenia przez 0.

Przykład

Wejście:
z 3 6
z 1 89
z 2 60
z 0 11
+ 0 1
- 1 2
* 2 3
/ 3 0
% 3 1

Wyjście:
100
29
360
0
6


Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    unsigned short int r[9];
    int q, w;
    char o;
    for(;cin>>o>>q>>w;)
    {
        --q;
        switch(o)
        {
            case 'z':
                r[q]=w;
            break;

            case '+':
                cout<<r[q]+r[w-1]<<endl;
            break;

            case '-':
                cout<<r[q]-r[w-1]<<endl;
            break;

            case '*':
                cout<<r[q]*r[w-1]<<endl;
            break;

            case '/':
                cout<<r[q]/r[w-1]<<endl;
            break;

            case '%':
                cout<<r[q]%r[w-1]<<endl;
            break;
        }

    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/CALC2/

środa, 21 lutego 2018

00027 - 708 - Problem Collatza - www.pl.spoj.com

Treść zadania:

Dany jest ciąg xn określony rekurencyjnie:
x0=s,
xn+1=3*xn+1, jeśli xn jest nieparzyste i
xn+1=xn/2, jeśli xn jest parzyste

Napisz program, który oblicza pierwsze takie n, dla którego xn=1.

Wejście
W pierwszej linii liczba testów t. W każdym z t kolejnych wierszy
jedna liczba całkowita s, 1 <= s <= 10000.

Wyjście
W każdej linii jedna liczba - obliczona wartość n.

Przykład

Wejście:
5
1
2
8
3
567

Wyjście:
0
1
3
7
61


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int t, s, c;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&s);
        c=0;
        for(;;)
        {
            if(s==1)
            {
                break;
            }
            ++c;
            if(s%2==0)
            {
                s=s/2;
            }
            else
            {
                s=(3*s)+1;
            }
        }
        printf("%d\n",c);
    }
    return 0;
}



Kod źródło w C++:
#include <iostream>

using namespace std;

int main()
{
    int t, s, c;
    cin>>t;
    while(t--)
    {
        cin>>s;
        c=0;
        for(;;)
        {
            if(s==1)
            {
                break;
            }
            ++c;
            if(s%2==0)
            {
                s=s/2;
            }
            else
            {
                s=(3*s)+1;
            }
        }
        cout<<c<<endl;
    }
    return 0;
}


Źródło: http://pl.spoj.com/problems/PTCLTZ/

poniedziałek, 19 lutego 2018

00026 - 1262 - ROL (k) - www.pl.spoj.com

Treść zadania:

Przesuń elementy tablicy cyklicznie w lewo o zadaną liczbę miejsc.

Input
Najpierw dwie liczby n i k takie, że 1 < k < n < 10000, a następnie w kolejnym wierszu n liczb.

Output
W jednym wierszu n liczb w zmienionym porządku (przesuniętych cyklicznie o k miejsc).

Example

Input:
5 3
1 2 3 4 5

Output:
4 5 1 2 3


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, k, i;
    int tab[10000];
    scanf("%d%d",&n,&k);
    for(i=0; i<n; ++i)
    {
        scanf("%d",&tab[i]);
    }
    for(i=k; i<n; ++i)
    {
        printf("%d ",tab[i]);
    }
    for(i=0; i<k; ++i)
    {
        printf("%d ",tab[i]);
    }
    return 0;
}


Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    int n, k, i;
    int tab[10000];
    cin>>n>>k;
    for(i=0; i<n; ++i)
    {
        cin>>tab[i];
    }
    for(i=k; i<n; ++i)
    {
        cout<<tab[i]<<" ";
    }
    for(i=0; i<k; ++i)
    {
        cout<<tab[i]<<" ";
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/PP0602D/

czwartek, 15 lutego 2018

Program Kwiaciarnia - programowanie obiektowe

Treść zadania:

Napisać program, w którym zostaną zdefiniowane trzy klasy zgodnie z poniższym opisem:

Klasy:
• "Kwiat", zawiera dane prywatne: identyfikator rośliny, nazwa, typ ( cięte pojedyncze, doniczkowe, wiązanki, do zasadzenia);
• "Kwiaciarnia", zawiera dane prywatne: identyfikator kwiaciarni, adres (np. nazwa ulicy);
• "Stan", zawiera dane prywatne: identyfikator kwiaciarni; identyfikator rośliny, liczba sztuk;

Każda klasa powinna posiadać publiczne metody umożliwiające operowanie na jej prywatnych danych, w tym publiczne konstruktory nadające wartości danym.

Program powinien.
1. Zapisywać do plików dane z obiektów powyższych klas oraz odczytywać dane z plików do obiektów odpowiednich klas;
2. Wyświetlać:
    a) listę dostępnych typów dla rośliny (kwiatu) o wskazanej nazwie;
    b) liczbę sztuk doniczkowych róż znajdujących się w kwiaciarni o danym adresie;
    c) listę kwiaciarni (adresy) posiadających w sprzedaży przynajmniej jedną wiązankę z rośliną o podanej nazwie.


Kod źródłowy w C++:
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>

using namespace std;

void menu();
void dodaj_kwiat();
void dodaj_stan();
void odczytywanie_danych();
void zadanie_2_a();
void zadanie_2_b();
void zadanie_2_c();

class kwiat
{
    private:
        string nazwa_rosliny,typ_rosliny;
        int id_rosliny;

    public:
        kwiat()
        {
            nazwa_rosliny="";
            typ_rosliny="";
            id_rosliny=(-1);
        }

        kwiat(int id_rosliny,string typ_rosliny,string nazwa_rosliny)
        {
            this->id_rosliny=id_rosliny;
            this->typ_rosliny=typ_rosliny;
            this->nazwa_rosliny=nazwa_rosliny;
        }

        int daj_id_rosliny()
        {
            return id_rosliny;
        }

        string daj_typ_rosliny()
        {
            return typ_rosliny;
        }

        string daj_nazwe_rosliny()
        {
            return nazwa_rosliny;
        }
};

class kwiaciarnia
{
    private:
        string adres_kwiaciarni;
        int id_kwiaciarni;

    public:
        kwiaciarnia()
        {
            id_kwiaciarni=1;
            adres_kwiaciarni="Warszawska 4";
        }

        kwiaciarnia(int id_kwiaciarni,string adres_kwiaciarni)
        {
            this->id_kwiaciarni=id_kwiaciarni;
            this->adres_kwiaciarni=adres_kwiaciarni;
        }

        int daj_id_kwiaciarni()
        {
            return id_kwiaciarni;
        }

        string daj_adres_kwiaciarni()
        {
            return adres_kwiaciarni;
        }
};

class stan
{
    private:
        int id_kwiaciarni;
        int id_rosliny;
        int liczba_sztuk;

    public:
        stan()
        {
            id_kwiaciarni=1;
            id_rosliny=1;
            liczba_sztuk=2;
        }

        stan(int id_kwiaciarni,int id_rosliny,int liczba_sztuk)
        {
            this->id_kwiaciarni=id_kwiaciarni;
            this->id_rosliny=id_rosliny;
            this->liczba_sztuk=liczba_sztuk;
        }

        int daj_id_rosliny()
        {
            return id_rosliny;
        }

        int daj_id_kwiaciarni()
        {
            return id_kwiaciarni;
        }

        int daj_liczbe_sztuk()
        {
            return liczba_sztuk;
        }
};

// Kwiacairnia
kwiaciarnia tk[100];
int liczba_kwiaciarnia=0;
int liczba_kwiaciarnia1=0;
string adres_k;
int id_k;
int id_kwiaciarni;
string adres_kwiaciarni;
// Kwiat
kwiat tr[100];
int liczba_kwiat=0;
int liczba_kwiat1=0;
string nazwa_r;
string typ_r;
int id_r;
// Stan
int ilosc;
stan ts[100];
int liczba_stan=0;
int liczba_stan1=0;


void dodaj_kwiaciarnie()
{
    cout<<endl<<"Podaj id kwiaciarni: ";
    cin>>id_kwiaciarni;
    cout<<endl<<"Podaj adres kwiaciarni ";
    cin>>adres_kwiaciarni;
    system("cls");
    cout<<"Dane wprowadzono poprawnie."<<endl<<"Wprowadzone dane to: "<<id_kwiaciarni<<" "<<adres_kwiaciarni<<"."<<endl;

    kwiaciarnia tmp(id_kwiaciarni,adres_kwiaciarni);
 tk[liczba_kwiaciarnia]=tmp;
 liczba_kwiaciarnia++;

 ofstream dopliku2("kwiaciarnia.txt",ios_base::app);
 for(int i=liczba_kwiaciarnia1;i<liczba_kwiaciarnia;i++)
 {
  dopliku2<<tk[i].daj_id_kwiaciarni()<<" "<<tk[i].daj_adres_kwiaciarni()<<endl;
 }
 dopliku2.close();

    system("pause");
    system("cls");
    menu();
}

void dodaj_kwiat()
{
 liczba_kwiat1=liczba_kwiat;
 cout<<endl<<"podaj id rosliny: ";
 cin>>id_r;
 cout<<endl<<"podaj typ rosliny ";
 cin>>typ_r;
 cout<<endl<<"podaj nazwe rosliny ";
 cin>>nazwa_r;
 kwiat tmp(id_r,typ_r,nazwa_r);
 tr[liczba_kwiat]=tmp;
 liczba_kwiat++;

 ofstream dopliku("kwiat.txt",ios_base::app);
 for(int i=liczba_kwiat1;i<liczba_kwiat;i++)
 {
  dopliku<<tr[i].daj_id_rosliny()<<" "<<tr[i].daj_typ_rosliny()<<" "<<tr[i].daj_nazwe_rosliny()<<endl;
 }
 dopliku.close();

    system("pause");
    system("cls");
    menu();
}

void dodaj_stan()
{
 cout<<endl<<"podaj id kwiaciarni: ";
 cin>>id_k;
 cout<<endl<<"podaj id rosliny ";
 cin>>id_r;
 cout<<endl<<"podaj ilosc ";
 cin>>ilosc;
 stan tmp(id_k,id_r,ilosc);
 ts[liczba_stan]=tmp;
 liczba_stan++;

 ofstream dopliku3("stan.txt",ios_base::app);
 for(int i=liczba_stan1;i<liczba_stan;i++)
 {
  dopliku3<<ts[i].daj_id_kwiaciarni()<<" "<<ts[i].daj_id_rosliny()<<" "<<ts[i].daj_liczbe_sztuk()<<endl;
 }
 dopliku3.close();

 system("pause");
    system("cls");
    menu();
}

wyswietl_kwiaciarnie()
{
 for(int i=0;i<liczba_kwiaciarnia;i++)
 {
        cout<<"\nid kwiaciarni: "<<tk[i].daj_id_kwiaciarni()<<" ";
        cout<<"adres kwiaciarni: "<<tk[i].daj_adres_kwiaciarni();
 }
 cout<<endl;
 system("pause");
 system("cls");
 menu();
}

wyswietl_kwiat()
{
 for(int i=0;i<liczba_kwiat;i++)
 {
        cout<<endl<<"id rosliny: "<<tr[i].daj_id_rosliny()<<" ";
        cout<<"typ: "<<tr[i].daj_typ_rosliny()<<" ";
        cout<<"nazwa: "<<tr[i].daj_nazwe_rosliny();
 }
 cout<<endl;
 system("pause");
 system("cls");
 menu();
}

wyswietl_stan()
{
 for(int i=0;i<liczba_stan;i++)
 {
  cout<<endl<<"Id kwiaciarni: "<<ts[i].daj_id_kwiaciarni()<<" ";
  cout<<"Id rosliny: "<<ts[i].daj_id_rosliny()<<" ";
  cout<<"Ilosc: "<<ts[i].daj_liczbe_sztuk();
 }
 cout<<endl;
 system("pause");
 system("cls");
 menu();
}

void zadanie_2_a()
{
 string typy[100];
 string nazwa_rosliny;

 cout<<"Tresc zadania:"<<endl;
 cout<<"Wyswietl liste dostepnych typow dla rosliny (kwiatu) o wskazanej nazwie."<<endl<<endl;
 cout<<"Podaj nazwe rosliny: "<<endl;
 cin>>nazwa_rosliny;

 for(int i=0; i<100; ++i)
 {
        if(nazwa_rosliny==tr[i].daj_nazwe_rosliny())
        {
            typy[i]=tr[i].daj_typ_rosliny();
        }
        else
        {
            typy[i]="0";
        }
 }

 cout<<"Lista typow rosliny dla "<<nazwa_rosliny<<":"<<endl;

 for (int i=0; i<100; ++i)
 {
  if(typy[i]!="0")
  {
            cout<<typy[i]<<endl;
  }
 }

 system("pause");
 system("cls");
 menu();
}

void zadanie_2_b()
{
 float wartosc=0;
 int ididr=0;
 int ididkw=0;
 string nazwa;

 cout<<"Tresc zadania:"<<endl;
 cout<<"Wyswietl liczbe sztuk doniczkowych roz znajdujacych sie w kwiaciarni o danym adresie."<<endl<<endl;
 cout<<"Podaj adres kwiaciarni aby  pokazac ilosc roz doniczkowych :";
 cin>>nazwa;

 for(int i=0;i<liczba_kwiaciarnia;i++)
 {
  if(tk[i].daj_adres_kwiaciarni()==nazwa)
  {
   ididkw=tk[i].daj_id_kwiaciarni();
  }
 }

  for(int i=0;i<liczba_kwiat;i++)
 {
     if((tr[i].daj_typ_rosliny()=="doniczkowa")&&(tr[i].daj_nazwe_rosliny()=="roza"))
  {
       ididr=tr[i].daj_id_rosliny();
      for(int j=0;j<liczba_stan;j++)
      {
       if((ts[j].daj_id_kwiaciarni()==ididkw)&&(ts[j].daj_id_rosliny()==ididr))
          {
     wartosc=wartosc+ts[j].daj_liczbe_sztuk();
    }
         }
  }
 }
 cout<<"W kwiaciarni o adresie: "<<nazwa<<" znajduje sie: "<<wartosc<<" sztuk roz doniczkowych"<<endl;
 system("pause");
 system("cls");
 menu();
}

void zadanie_2_c()
{
 cout<<"Tresc zadania:"<<endl;
 cout<<"Wyswietl liste kwiaciarni (adresy) posiadajacych w sprzedazy przynajmniej jedna wiazanke z roslin o podanej nazwie."<<endl;
 cout<<endl<<endl;
 int ididr=0;
 int ididkw=0;
 string nazwa_rosliny;
 cout<<"Podaj nazwe rosliny:"<<endl;
 cin>>nazwa_rosliny;

 for(int i=0;i<liczba_kwiat;i++)
 {
  if((tr[i].daj_typ_rosliny()=="wiazanka")&&(tr[i].daj_nazwe_rosliny()==nazwa_rosliny))
  {
   ididr=tr[i].daj_id_rosliny();
   for(int j=0;j<liczba_stan;j++)
   {
    if((ts[j].daj_id_rosliny()==ididr)&&(ts[j].daj_liczbe_sztuk()>=1))
    {
     ididkw=ts[j].daj_id_kwiaciarni();
     for(int k=0;k<liczba_kwiaciarnia;k++)
     {
      if(tk[k].daj_id_kwiaciarni()==ididkw)
      {
       cout<<tk[k].daj_adres_kwiaciarni()<<" "<<endl;
      }
     }
    }
   }
  }
 }
 cout<<endl;
 system("pause");
 system("cls");
 menu();
}

void odczytywanie_danych()
{
    int s;
    cout << "\n +----------------------------+"<< endl;
    cout << " |     Program Kwiaciarnia    |"<< endl;
    cout << " |     Odczytywanie danych    |"<< endl;
    cout << " |                            |"<< endl;
    cout << " |  1 - Wyswietl kwiacairnie  |"<< endl;
    cout << " |  2 - Wyswietl kwiaty       |"<< endl;
    cout << " |  3 - Wyswietl stan         |"<< endl;
    cout << " |  4 - Zadanie 2 a)          |"<< endl;
    cout << " |  5 - Zadanie 2 b)          |"<< endl;
    cout << " |  6 - Zadanie 2 c)          |"<< endl;
    cout << " |  7 - Cofnij                |"<< endl;
    cout << " +----------------------------+"<< endl;

    cin >> s;
    system("cls");
    switch(s)
    {
        case 1:
            wyswietl_kwiaciarnie();
            break;

        case 2:
            wyswietl_kwiat();
            break;

        case 3:
            wyswietl_stan();
            break;

        case 4:
            zadanie_2_a();
            break;

        case 5:
            zadanie_2_b();
            break;

        case 6:
            zadanie_2_c();
            break;

        case 7:
            menu();
            break;
    }
}

void wprowadzanie_danych()
{
    int s;
    cout << "\n +----------------------------+"<< endl;
    cout << " |     Program Kwiaciarnia    |"<< endl;
    cout << " |     Wprowadzanie danych    |"<< endl;
    cout << " |                            |"<< endl;
    cout << " |  1 - Dodaj kwiaciarnie     |"<< endl;
    cout << " |  2 - Dodaj kwiat           |"<< endl;
    cout << " |  3 - Dodaj stan            |"<< endl;
    cout << " |  4 - Cofnij                |"<< endl;
    cout << " +----------------------------+"<< endl;
    cin >> s;
    system("cls");
    switch(s)
    {
        case 1:
            dodaj_kwiaciarnie();
            break;

        case 2:
            dodaj_kwiat();
            break;

        case 3:
            dodaj_stan();

        case 4:
            menu();
            break;
    }
}

void menu()
{
    int s;
    cout << endl;
    cout << " +----------------------------+"<< endl;
    cout << " |     Program Kwiaciarnia    |"<< endl;
    cout << " |                            |"<< endl;
    cout << " |  1 - Wprowadzanie danych   |"<< endl;
    cout << " |  2 - Odczytywanie danych   |"<< endl;
    cout << " |  3 - Koniec                |"<< endl;
    cout << " +----------------------------+"<< endl;
    cin >> s;
    system("cls");
    switch(s)
    {
        case 1:
            wprowadzanie_danych();
            break;

        case 2:
            odczytywanie_danych();
            break;

        case 3:
            system("exit");
            break;
    }
}

int main()
{
 ifstream zpliku("kwiat.txt");

 for(;;)
 {
  if(!(zpliku>>id_r))
  break;
  zpliku>>typ_r>>nazwa_r;
  kwiat tmp(id_r,typ_r,nazwa_r);
  tr[liczba_kwiat]=tmp;
  liczba_kwiat++;
 }

 ifstream zpliku2("kwiaciarnia.txt");
 for(;;)
    {
  if(!(zpliku2>>id_k))
  break;
  zpliku2>>adres_k;
  kwiaciarnia tmp(id_k,adres_k);
  tk[liczba_kwiaciarnia]=tmp;
  liczba_kwiaciarnia++;
 }

 ifstream zpliku3("stan.txt");
 for(;;)
 {
  if(!(zpliku3>>id_k))
  break;
  zpliku3>>id_r>>ilosc;
  stan tmp(id_k,id_r,ilosc);
  ts[liczba_stan]=tmp;
  liczba_stan++;
 }

 menu();
}



Zawartość pliku kwiaciarnia.txt:
1 Warszawska_5
2 Al_Tysiaclecia_43
3 Dzialkowa_27
4 Klemensiewicza_54
5 Osiedlowa_102
6 Wrzosowa_91
7 Wolska_33
8 Lesna_1
9 Bajkowa_56
10 Hallera_8
11 Sarenki_84
12 Mar_Jozefa_Pildsuckiego_27
13 Zielona_3
14 Gorzysta_20
15 Husarska_37
16 Domaniewska_76
17 Adama_Mickiewicza_10
18 Sosnowa_40
19 Podlesna_39
20 Sportowa_83



Zawartość pliku kwiat.txt:
1 wiazanka roza
2 doniczkowa storczyk
3 bukiet tulipan
4 doniczkowa fiolki
5 doniczkowa hiacynt
6 bukiet niezapominajka
7 doniczkowa roza
8 bukiet chryzantema
9 doniczkowa kaktus
10 wiazanka chryzantema
11 bukiet mlecz
12 doniczkowa krokus
13 wiazanka lilia
14 wiazanka krokus
15 doniczkowa pelargonia
16 wiazanka tulipan
17 bukiet lilia
18 wiazanka kalia
19 doniczkowa zonkil
20 bukiet roza
21 do_zasadzenia krokus
22 ciete_pojedyncze roza
23 do_zasadzenia kaktus
24 do_zasadzenia tulipan
25 do_zasadzenia fiolki
26 do_zasadzenia storczyk
27 ciete_pojedyncze mlecz
28 do_zasadzenia chryzantema
29 do_zasadzenia roza
30 ciete_pojedyncze storczyk




Zawartość pliku stan.txt:
1 1 33
1 1 33
1 15 2
1 14 63
2 17 32
2 11 43
2 6 23
2 1 43
2 13 21
2 8 23
5 2 53
3 6 23
2 8 34
5 12 63
1 20 12
6 20 43
5 3 63
2 1 63
5 3 53
15 16 44
18 13 74
20 12 63
12 6 23
3 8 23
4 9 43
7 6 34
1 20 5
10 4 32
13 6 32
17 10 23
1 7 43
15 1 11
17 1 10
1 1 2
6 1 7