#include <fstream>
#include <iomanip>
#include <iostream>
#include <string>

using namespace std;

int main()
{
    /*
        Zadanie 1
        Wczytać plik "text.txt" i zliczyć:
            a) ilość zdań
            b) ilość słów
            c) ilość znaków
    */
    
    ifstream plik_we;                                                   //  deklaracja strumienia pliku wejściowego
    string linia;                                                       //  zmienna przechowująca pojedynczą linię z pliku
    int zdania = 0;                                                     //  liczniki
    int slowa = 0;
    int znaki = 0;
    
    int linia_len;                                                      //  długość linii
    
    plik_we.open("D:\\C++\\text.txt");                                  //  otwarcie strumienia
    
    if (plik_we.is_open())                                              //  jeżeli plik jest otwarty
    {
        while (getline(plik_we, linia))                                     //  wczytaj linię to zmiennej
        {
            linia_len = linia.length();                                     //  ustaw długość linii
            znaki += linia_len;                                             //  ustaw ilość znaków
            
            for (int i = 0; i < linia_len; i++)                             //  pętla po znaku w linii
            {
                if (linia[i] == ' ')                                        //  spacja rozdziela słowa
                {
                    slowa++;
                }
                else if (linia[i] == '.')                                   //  kropka rozdziala zdania
                {
                    zdania++;
                }
            }
        }
        
        cout << "zdania: " << zdania << endl;                               //  wypisz liczniki
        cout << "slowa: " << slowa << endl;
        cout << "znaki: " << znaki << endl << endl;
    }
    else                                                                //  jeżeli plik nie został otwary pokaż błąd
    {
        perror("Blad otwarcia pliku");                                  //  perror zwraca nazwę błędu po argumencie
    }
    
    plik_we.close();                                                    //  zamykamy strumień
    
    /*
        Zadanie 2
        Utworzyć strukturę Produkt o polach nazwa, cena i producent.
        Program główny tworzy tablicę dynamiczną n produktów.
    */
    
    struct Produkt                                                      //  struktura lokalna wewnątrz funkcji
    {
        string nazwa;                                                       //  jej pola
        double cena;
        string producent;
        
        void wyswietl()                                                     //  funkcja wyświetlająca pola
        {
            cout << nazwa << " " << cena << " " << producent << endl;
        }
    };
    
    int n;                                                              //  ilość produktów
    cout << "n: "; cin >> n;
    
    Produkt *Produkty = new Produkt[n];                                 //  dynamiczna tablica produktów (w postaci sterty)
    
    for (int i = 0; i < n; i++)                                         //  funkcja po produkcie
    {
        cout << "Produkt " << i + 1 << endl;
        cout << "Nazwa: "; cin >> Produkty[i].nazwa;                        //  podajemy dane każdego produktu
        cout << "Cena: "; cin >> Produkty[i].cena;
        cout << "Producent: "; cin >> Produkty[i].producent;
        
        Produkty[i].wyswietl();                                             //  wyświetlenie produktu
    }
    
    delete[] Produkty;                                                  //  usunięcie (zwolnienie pamięci) tablicy dynamicznej
    
    /*
        Zadanie 3
        Wczytać z pliku 20 liczb całkowitych i posortować dowolną metodą
    */
    
    plik_we.open("D:\\C++\\liczby.txt");                                //  ponowne otwarcie strumienia
    
    int liczby[20];                                                     //  deklaracja tablicy liczb
    int i = 0;                                                          //  indeks dla tablicy liczb
    int temp;                                                           //  tymczasowa zmienna używana podczas sortowania
    
    if (plik_we.is_open())
    {
        while (plik_we >> liczby[i])                                        //  pobierz liczbę do tablicy
        {
            cout << setw(3) << liczby[i];
            i++;                                                            //  inkrementuj indeks
        }
        
        cout << endl;
        
        for (int i = 0; i < 20; i++)                                        //  pętla po indeksach od i = 0
        {
            for (int j = i; j < 20; j++)                                        //  pętla po indeksach od j = i
            {
                if (liczby[j] < liczby[i])                                      //  jeżeli kolejny element jest mniejszy to
                {
                    temp = liczby[i];                                           //  zamień elementy ze sobą
                    liczby[i] = liczby[j];
                    liczby[j] = temp;
                }
            }
        }
        
        for (int i = 0; i < 20; i++)                                        //  wyświetlanie tablicy
        {
            cout << setw(3) << liczby[i];
        }
    }
    else
    {
        perror("Blad otwarcia pliku");
    }
    
    plik_we.close();                                                    //  zamknięcie strumienia
    
    return 0;
}