﻿#include <iostream>
#include <cmath>

using namespace std;

// funkcja wyswietlajaca czołówkę
void czolowka();
// funkcja wyświetlajaca menu
void wyswietlMenu();
// funkcja pobierająca liczbę od użytkownika
double pobierzLiczbe(string nazwa);
// funkcja ustawiajaca kolor czcionki oraz tła
void kolorCzcionkiOrazTła();
// funkcja pobierająca liczby i oblicząjaca wynik
void obliczenia();


int main()
{
    /*
    *
    * Jak efektywnie zaimplementować
    * zmianę kolorów tła i napisów?
    * (rozważania podczas zajęć)
    *
    *
    * /

    // zmienna napis jest wskaźnikiem (czyli
    // adresem w pamieci) na pierwszy
    // znak tablicy w której jest c-napis
    // (tablica znaków zakończona znakiem
    // specjalnym '\0' (NUL - zero))
    // nie ma żadnych metod, bo nie jest obiektem klasy
    // tylko adresem w pamieci
    const char* napis = "color 1A";

    // zmienna napi2 jest obiektem klasy string
    // ma wiele metod np. napis2.length()
    string napis2 = "color 1A";

    cout << napis;
    cout << napis2.length();

    // kolor tła
    string aa = "1";

    // kolor napisów
    string bb = "A";

    // konkatenacja stringów (sklejanie napisów)
    // pierwszy sposób
    string cc = "color " + aa + bb; //color 1A
    // drugi sposób
    string dd = aa.append(bb);

    // polecenie systemowe zmiany koloru tła i czcionki
    // funkcja system() przyjmuje jako parametr c-string
    // dlatego należy zamienić zmienną cc typu string na c-napis
    // robi się to za pomoca metody c_str()
    system(cc.c_str());

    // DONE
    */
    
    // wyświetlamy czołówkę programu
    czolowka();

    // ustawiamy kolor czcionki oraz tła za pomocą polecenia systemowego
    // system("color 1A");
    kolorCzcionkiOrazTła();

    // głowna funkcja pobierająca liczby i oblicząjaca wynik
    obliczenia();   

    return 0;
}

void czolowka()
{
    // wyświetlamy czołówkę programu
    // (jest nieco uboga, możesz coś dodać :) 
    cout << "Kalkulator\n\n";
}

void wyswietlMenu()
{
    // wyświetlamy menu kalkulatora
    cout << "\nwybierz działanie\n";

    cout << "\n[1] dodawanie\n";
    cout << "[2] odejmowanie\n";
    cout << "[3] mnozenie\n";
    cout << "[4] dzielenie\n";
    cout << "[5] potegowanie\n";
}

double pobierzLiczbe(string nazwa) {
    // zmienna w której będzie pobrana liczba
    double x;
    // komunikat
    cout << "\nPodaj " << nazwa << " liczbe\n";
    // pobieramy liczbę
    cin >> x;
    // funkcja zwraca pobraną liczbę
    return x;
}

void kolorCzcionkiOrazTła()
{
    
    // wyświetlamy menu zmiany koloru czcionki
    cout << "\nwybierz kolor czcionki\n";

    cout << "\n[8] szary\n";
    cout << "[9] jasnoniebieski\n";
    cout << "[A] jasnozielony\n";
    cout << "[B] jasnoblekitny\n";
    cout << "[C] jasnoczerwony\n";

    // zmienna na kolor czcionki
    string kolorCzcionki = "";

    // pobieramy kolor czcionki
    // (wilkość liter nie ma znaczenia)
    cin >> kolorCzcionki;

    // wyświetlamy menu zmiany koloru tła
    cout << "\nwybierz kolor tła\n";

    cout << "\n[0] czarne\n";
    cout << "[1] niebieske\n";
    cout << "[2] zielone\n";
    cout << "[3] blekitne\n";
    cout << "[4] czerwone\n";

    // zmienna na kolor tła
    string kolorTla = "";

    // pobieramy kolor tła
    cin >> kolorTla;

    // konkatenacja(sklejanie) stringów w celu uzyskania polecenia
    // systemowego zmiany koloru czcionki i tła
    string kolor = "color " + kolorTla + kolorCzcionki;

    // wywołujemy polecenie systemowe zmiany koloru
    // czcionki oraz tła,
    // funkcja system() przyjmuje jako parametr c-string
    // dlatego należy zamienić zmienną kolor typu string na c-napis
    // robi się to za pomoca metody c_str() obiektu kolor
    system(kolor.c_str());
}

void obliczenia()
{
    // zmienne na liczby
    double a = 0;
    double b = 0;
    // zmienna na wybrane przez uzytkownika menu
    short menu = 0;

    // flaga wyjścia z programu
    char wyjscie = 'w';

    // pętla obliczeniowa
    // petla zakończy sie jeśli zmienna wyjście 
    // będzie miała wartość 't' 
    // (na końcu petli pytamy czy uzytkownik chce opuścić 
    // program, jeśli tak to ma wybrać 't' czyli tak) 
    while (wyjscie != 't') {
      
        // pobieramy liczby
        a = pobierzLiczbe("pierwsza");
        b = pobierzLiczbe("druga"); 

        // wyswietlamy menu
        wyswietlMenu();

        // pobieramy wybór uzytkownika
        cin >> menu;

        // zmienna na wynik obliczeń
        double wynik;

        // instrukcja wyboru działania
        // wyświetlamy też wynik obliczeń
        switch (menu) {
        // jeśli użytkownik wybrał 1 czyli dodawanie
        // obliczmy i wypisujemy wynik
        case 1:
            wynik = a + b;
            cout << "Wynik: " << wynik;
            break;
        case 2:
            wynik = a - b;
            cout << "Wynik: " << wynik;
            break;
        case 3:
            wynik = a * b;
            cout << "Wynik: " << wynik;
            break;
        // jeśli użytkownik wybrał 4 czyli dzielenie
        // musimy być czujni, bo nie dzieli sie przez zero 
        case 4:
            if (b != 0) {
                wynik = a / b;
                cout << "Wynik: " << wynik;
            }
            // zabezpieczenie przed dzieleniem przez zero
            else {
                cout << "Nie dzielimy przez zero";
                // dopóki dzielnik (druga liczba) będzie zerem 
                // użytkownik ma ją podać
                while (b == 0) {
                    cout << "\nPodaj druga liczbe\n";
                    cin >> b;
                }
                wynik = a / b;
                cout << "Wynik: " << wynik;
            }
            break;
        case 5:
            wynik = pow(a, b);
            cout << "Wynik: " << wynik;
            break;
        default:
            cout << "niewlasciwe dzialanie\n";
        }

        // zapytanie o wyjście z programu
        cout << "\nwyjscie: t/n" << endl;
        // pobieramy wybór użytkownika co do dalszego ciagu działania
        // kalkulatora
        // jeśli użytkownik nacisnie znak 't'
        // wyjdziemy z petli obliczeniowej progarmu while
        cin >> wyjscie;

    }
}
