• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcje są pomijane

Object Storage Arubacloud
0 głosów
365 wizyt
pytanie zadane 14 maja 2022 w C i C++ przez Mateusz525 Nowicjusz (120 p.)

Witam,mam problem dotyczący funkcji w programowaniu obiektowym c++
Wszystko się kompiluje aczkolwiek podczas interakcji z programem funkcje się nie wykonują i są pomijane
Jak prawidłowo powienien działać kod:

Program pyta które do którego zagadnienia przejść :

-fibonnaci,gdy wpisze 1

-euler,gdy wpisze 2

-pitagoras,gdy wpisze 3

po wpisaniu któryś z wartości automatycznie powinna odpalić się funkcja,która będzie kazała wpisać daną ilość liczb do tablicy typu deque,a po tej funkcji program zadaje pytanie czy ma obliczyc wynik dla danego ciagu

jesli wpisze 0 to nie a jak 1 to obliczy

zadna z funkcji sie nie wywoluje,probowalem juz na pare sposobow.

Bardzo prosiłbym o pomoc

Ponizej kod

#include <iostream>
#include <deque>
using namespace std;


class Start
{
friend class Fibonnaci;
friend class Euler;
friend class Pitagoras;
private:
    std::deque<int>liczba2;
    std::deque<int>n2;
    std::deque<int>a2;
    std::deque<int>b2;
public:
    void wybor();
    void wybor_fibonnaci();
    void wybor_euler();
    void wybor_pitagoras();
    Start(std::deque<int>liczba,std::deque<int>n2,std::deque<int>a2,std::deque<int>b2);

};

class Fibonnaci:public Start
{
public:
    void fibonnaci_dodaj(std::deque<int>liczba1);
    void fibonnaci_oblicz(std::deque<int>liczba1);

};

class Euler:public Start
{

public:
    void euler_dodaj(std::deque<int>liczba);
    void euler_oblicz(std::deque<int>liczba);
};

class Pitagoras:public Start
{
public:
    void pitagoras_dodaj(std::deque<int>bok1,std::deque<int>bok2);
    void pitagoras_oblicz(std::deque<int>bok1,std::deque<int>bok2);
};
#include <iostream>
#include <math.h>
#include <windows.h>
#include "headers.h"
using namespace std;

void Start::wybor() {
    int a;
    cout << "wybierz opcje wyboru\n";
    cout << "--------------------" << endl;
    cout << endl;
    cout << "Wpisz 1 aby przejsc do fibonnaciego" << endl;
    cout << "Wpisz 2 aby przejsc do Eulera" << endl;
    cout << "Wpisz 3 aby przejsc do Pitagorasa" << endl;
    cout << endl;
    cout << "--------------------" << endl;
    do {
    cin >> a;
        if(a<1 || a>3) {
            cout << "Podaj prawidlowa liczbe!"<< endl;
        }
    } while (a<1 || a>3);
    switch(a) {
        case 1 : wybor_fibonnaci();
        break;
        case 2 : wybor_euler();
        break;
        case 3 : wybor_pitagoras();
        break;
}
}

void Start::wybor_fibonnaci() {
    Fibonnaci fibonnaci_dodaj(Start liczba2);
    int wybor_funkcji;
    cout << "Czy chcesz otrzymac obliczenia dla wybranej przez ciebie liczby w nastepnym kroku? (wpisz 1 jesli tak lub 0 jesli nie)";
    cout << endl;
    cin >> wybor_funkcji;
    if (wybor_funkcji == 1) {
        Fibonnaci fibonnaci_oblicz(Start liczba2);
    }
    else if (wybor_funkcji == 0) {
            system("cls");
            wybor();
    }
}

void Start::wybor_euler() {
    Euler euler_dodaj(Start n2);
    int wybor_funkcji;
    cout << "Czy chcesz otrzymac obliczenia dla wybranej przez ciebie liczby w nastepnym kroku?";
    cin >> wybor_funkcji;
    if (wybor_funkcji == 1) {
        Euler euler_oblicz(Start n2);
    }
    else if (wybor_funkcji == 0) {
            system("cls");
            wybor();
    }
}

void Start::wybor_pitagoras() {
    Pitagoras pitagoras_dodaj(Start a2,Start b2);
    int wybor_funkcji;
    cout << "Czy chcesz otrzymac obliczenia dla wybranej przez ciebie liczby w nastepnym kroku?";
    cin >> wybor_funkcji;
    if (wybor_funkcji == 1) {
        Pitagoras pitagoras_oblicz(Start a2,Start b2);
    }
    else if (wybor_funkcji == 0) {
            system("cls");
            wybor();
    }
}

void Fibonnaci::fibonnaci_dodaj(std::deque<int>liczba1) {
    int wybor;
    int dlugosc;
    int a;
    cout << "Podaj dlugosc tablicy";
    cin >> dlugosc;
    liczba2.get_allocator().allocate(dlugosc);
    do {
    cout << "Chcesz dac liczby do tylu kolejki czy na sam jej przod? (wybierz 1 jesli chcesz pchnac do tylu lub 2 jesli do przodu) " << endl;
    cin >> wybor;
    } while(wybor > 2 || wybor < 1) ;
    if (wybor == 1) {
        cout << "Podaj liczby ktore chcesz pchnąć na tył kolejki" << endl;
        for (int i = 0;i<dlugosc;i++) {
            cin >> a;
            liczba2.push_back(a);
        }
    }
    else if (wybor == 2) {
        for (int i = 0;i<dlugosc;i++) {
            cin >> a;
            liczba2.push_front(a);
        }

    }
}


void Euler::euler_dodaj(std::deque<int>liczba) {
    int wybor;
    int dlugosc;
    int a;
    cout << "Podaj dlugosc tablicy " << endl;
    cin >> dlugosc;
    n2.get_allocator().allocate(dlugosc);
    do {
    cout << "Chcesz dac liczby do tylu kolejki czy na sam jej przod? (wybierz 1 jesli chcesz pchnac do tylu lub 2 jesli do przodu) " << endl;
    cin >> wybor;
    } while(wybor > 2 || wybor < 1) ;
    if (wybor == 1) {
        cout << "Podaj liczby ktore chcesz pchnac na tyl kolejki" << endl;
        for (int i = 0;i<dlugosc;i++) {
            cin >> a;
            n2.push_back(a);
        }
    }
    else if (wybor == 2) {
        for (int i = 0;i<dlugosc;i++) {
            cin >> a;
            n2.push_front(a);
        }

    }
}

void Pitagoras::pitagoras_dodaj(std::deque<int>bok1,std::deque<int>bok2) {
    int wybor_liczby;
    int dlugosc;
    int liczby;
    cout << "Podaj dlugosc tablicy";
    cin >> dlugosc;
    a2.get_allocator().allocate(dlugosc);
    b2.get_allocator().allocate(dlugosc);
    do {
    cout << "Chcesz dac liczby do tylu kolejki czy na sam jej przod? (wybierz 1 jesli chcesz pchnac do tylu lub 2 jesli do przodu) " << endl;
    cin >> wybor_liczby;
    } while(wybor_liczby > 2 || wybor_liczby < 1) ;
    if (wybor_liczby == 1) {
        cout << "Podaj liczby ktore chcesz pchnąć na tył kolejki dla pierwszego boku" << endl;
        for (int i = 0;i<dlugosc;i++) {
            cin >> liczby;
            a2.push_back(liczby);
        }
        cout << "Podaj liczby,które chcesz pchnąć na tył kolejki dla drugiego boku" << endl;
    }
    else if (wybor_liczby == 2) {
        cout << "Podaj liczby ktore chcesz pchnąć na przód kolejki dla pierwszego boku" << endl;
        for (int i = 0;i<dlugosc;i++) {
            cin >> liczby;
            a2.push_front(liczby);
        }
        cout << "Podaj liczby ktore chcesz pchnąć na przód kolejki dla drugiego boku" << endl;
        for (int i = 0;i<dlugosc;i++) {
            cin >> liczby;
            a2.push_front(liczby);
        }

    }
    Start wybor();
}

void Fibonnaci::fibonnaci_oblicz(std::deque<int>liczba1) {
    int dlugosc = liczba2.size();
    int wynik;
    int wybor_liczby;
    cout << "Wybierz Która liczbę chcesz obliczyć dla ciągu fibonnaciego\n";
    do {
        cin >> wybor_liczby;
    }while(wybor_liczby> dlugosc);
    if (liczba2.at(wybor_liczby) > 1) {
        wynik = (liczba2.at(wybor_liczby) - 1) + (liczba2.at(wybor_liczby) - 2);
    }
    else if (liczba2.at(wybor_liczby) == 1)  {
        wynik = 1;
    }
    else if (liczba2.at(wybor_liczby) == 0) {
        wynik = 0;
    }
    cout << "Wynik to: " << wynik << endl;
    Start wybor();
}

void Euler::euler_oblicz(std::deque<int>liczba) {
    int dlugosc = n2.size();
    int wynik;
    int wybor_liczby;
    cout << "Wybierz Która liczbę chcesz obliczyć dla ciągu Eulera\n";
    do {
        cin >> wybor_liczby;
    }while(wybor_liczby>dlugosc);
    wynik = pow(n2.at(wybor_liczby),2) - n2.at(wybor_liczby) + 41;
    cout << "Wynik dla ciagu eulera to: " << wynik << endl;
    Start wybor();
}

void Pitagoras::pitagoras_oblicz(std::deque<int>bok1,std::deque<int>bok2) {
    int dlugosc = a2.size();
    int wynik;
    int wybor_liczby;
    cout << "Wybierz Która liczbę chcesz obliczyć dla Pitagorasa\n";
    do {
        cin >> wybor_liczby;
    }while(wybor_liczby > dlugosc);
    wynik = pow(a2.at(wybor_liczby),2) + pow(b2.at(wybor_liczby),2);
    cout << "Przeciwprostokątna wynosi: " << wynik << endl;
    Start wybor();
}

Start::Start(std::deque<int>liczba0,std::deque<int>n20,std::deque<int>a20,std::deque<int>b20) {
    liczba2 = liczba0;
    n2 = n20;
    a2 = a20;
    b2 = b20;
}




#include <iostream>
#include "headers.h"
using namespace std;

std::deque<int>Fibo;
std::deque<int>Eul;
std::deque<int>A_p;
std::deque<int>B_p;

int main()
{
    Start p1(Fibo,Eul,A_p,B_p);
    p1.wybor();
    return 0;
}


 

komentarz 15 maja 2022 przez j23 Mędrzec (194,920 p.)
Dlaczego debugera nie użyjesz?
komentarz 15 maja 2022 przez TOWaD Mądrala (5,700 p.)
edycja 15 maja 2022 przez TOWaD

@Mateusz525, ? Fibonnaci fibonnaci_dodaj(Start liczba2);  Moim zdaniem dziwna składnia. Co to jest deklaracja? definicja? funkcji, konstruktor?

1 odpowiedź

0 głosów
odpowiedź 16 maja 2022 przez TOWaD Mądrala (5,700 p.)

Pozwoliłem sobie napisać program "aby automatycznie odpaliła się jakaś funkcja", a nie do psucia. Możliwe mało ingerując w headersF.cpp, ale przebudowując dość gruntownie main.cpp i headers.h.

#include <iostream>
#include <vector>
#include "headers.h"
using namespace std;
int menu();
int main()
{
    Fibonnaci f;
    Euler e;
    Pitagoras p;

    std::vector<ciagi*>tab ={&f,&e,&p};

    for (int i=menu();i!=-1;i=menu())tab.at(i)->wybor();
    return 0;
}

int menu() {
    int a;
    cout << "wybierz opcje wyboru\n";
    cout << "--------------------" << endl;
    cout << endl;
    cout << "Wpisz 0 aby zkonczyc program" << endl;
    cout << "Wpisz 1 aby przejsc do fibonnaciego" << endl;
    cout << "Wpisz 2 aby przejsc do Eulera" << endl;
    cout << "Wpisz 3 aby przejsc do Pitagorasa" << endl;
    cout << endl;
    cout << "--------------------" << endl;
    do {
    cin >> a;
        if(a<0 || a>3) {
            cout << "Podaj prawidlowa liczbe!"<< endl;
        }
    } while (a<0 || a>3);
 return --a;
}
#ifndef HEADERS_H
#define HEADERS_H
#include <deque>

class ciagi {
public:
    ciagi(){};
    virtual ~ciagi();
   // void wybor();
    virtual void wybor();
    virtual void dodaj()=0;
    virtual void oblicz()=0;
    int dlugosc (int d);
protected:
    int wybor_liczby;
    int mdlugosc;
    int mwybor;
};

class Fibonnaci:public ciagi {
public:
    void dodaj();
    void oblicz();
    virtual ~Fibonnaci(){};
    private:
    std::deque<int>liczba;
};

class Euler:public ciagi {
public:
    void dodaj();
    void oblicz();
    virtual ~Euler(){};
private:
    std::deque<int>liczba;
};

class Pitagoras:public ciagi {
public:
//    void pitagoras_dodaj(std::deque<int>bok1,std::deque<int>bok2);
//    void pitagoras_oblicz(std::deque<int>bok1,std::deque<int>bok2);
    void dodaj();
    void oblicz();
    virtual ~Pitagoras(){};
private:
    std::deque<int>bok1;
    std::deque<int>bok2;
};
#endif // HEADERS_H
#include "headers.h"
#include <iostream>
#include <math.h>
#include <windows.h>

using namespace std;
ciagi::~ciagi(){};
void ciagi::wybor() {
        dodaj();
    int wybor_funkcji;
    cout << "Czy chcesz otrzymac obliczenia dla wybranej przez ciebie liczby w nastepnym kroku? (wpisz 1 jesli tak lub 0 jesli nie)";
    cout << endl;
    cin >> wybor_funkcji;
    if (wybor_funkcji == 1) {
        this->oblicz();
    } else if (wybor_funkcji == 0) {
        system("cls");
    }
}
int ciagi::dlugosc(int d) {

    if (d==0) {
        std::cerr<< "Brak danych, dodaj elementy"<<std::endl;
        return -1;
    }
    do {
        cout << "Podaj liczbe z zakresu ["<<1<<"-"<<d<<"]:";
        cin >> wybor_liczby;
        wybor_liczby--;
    } while(wybor_liczby > (d-1) || wybor_liczby < 0);
    return wybor_liczby;
}
void Fibonnaci::dodaj() {
    int wybor;
    int dlugosc;
    int a;
    cout << "Podaj dlugosc tablicy: ";
    cin >> dlugosc;
    //  liczba.get_allocator().allocate(dlugosc);
    do {
        cout << "Chcesz dac liczby do tylu kolejki czy na sam jej przod? (wybierz 1 jesli chcesz pchnac do tylu lub 2 jesli do przodu) " << endl;
        cin >> wybor;
    } while(wybor > 2 || wybor < 1) ;
    if (wybor == 1) {
        cout << "Podaj liczby ktore chcesz pchn?? na ty? kolejki" << endl;
        for (int i = 0; i<dlugosc; i++) {
            cin >> a;
            liczba.push_back(a);
        }
    } else if (wybor == 2) {
        for (int i = 0; i<dlugosc; i++) {
            cin >> a;
            liczba.push_front(a);
        }

    }
}
void Euler::dodaj() {
    int wybor;
    int dlugosc;
    int a;
    cout << "Podaj dlugosc tablicy: " << endl;
    cin >> dlugosc;
   // liczba.get_allocator().allocate(dlugosc);
    do {
        cout << "Chcesz dac liczby do tylu kolejki czy na sam jej przod? (wybierz 1 jesli chcesz pchnac do tylu lub 2 jesli do przodu) " << endl;
        cin >> wybor;
    } while(wybor > 2 || wybor < 1) ;
    if (wybor == 1) {
        cout << "Podaj liczby ktore chcesz pchnac na tyl kolejki" << endl;
        for (int i = 0; i<dlugosc; i++) {
            cin >> a;
            liczba.push_back(a);
        }
    } else if (wybor == 2) {
        for (int i = 0; i<dlugosc; i++) {
            cin >> a;
            liczba.push_front(a);
        }

    }
}
void Pitagoras::dodaj() {
    int wybor;
    int dlugosc;
    int liczby;
    cout << "Podaj dlugosc tablicy: " << endl;
    cin >> dlugosc;
  //  bok1.get_allocator().allocate(dlugosc);
  //  bok2.get_allocator().allocate(dlugosc);
    do {
        cout<<"\ndlugosc"<<dlugosc;
        cout<<"\ndlugosc"<<bok1.size();
        cout << "\nChcesz dac liczby do tylu kolejki czy na sam jej przod? (wybierz 1 jesli chcesz pchnac do tylu lub 2 jesli do przodu) " << endl;
        cin >> wybor;
    } while(wybor > 2 || wybor < 1) ;

    if (wybor== 1) {
        cout << "Podaj liczby ktore chcesz pchn?? na ty? kolejki dla pierwszego boku" << endl;
        for (int i = 0; i<dlugosc; i++) {
            cin >> liczby;
            bok1.push_back(liczby);
            cout << "\nsize: "<< bok1.size()<< endl;
        }
        cout << "Podaj liczby,które chcesz pchn?? na ty? kolejki dla drugiego boku" << endl;
         for (int i = 0; i<dlugosc; i++) {
            cin >> liczby;
            bok2.push_back(liczby);
        }
    } else if (wybor == 2) {
        cout << "Podaj liczby ktore chcesz pchn?? na przód kolejki dla pierwszego boku" << endl;
        for (int i = 0; i<dlugosc; i++) {
            cin >> liczby;
            bok1.push_front(liczby);
        }
        cout << "Podaj liczby ktore chcesz pchn?? na przód kolejki dla drugiego boku" << endl;
        for (int i = 0; i<dlugosc; i++) {
            cin >> liczby;
            bok2.push_front(liczby);
        }

    }

}
void Fibonnaci::oblicz() {
    int wynik;
    wybor_liczby=dlugosc(liczba.size());
    try {
        if (liczba.at(wybor_liczby) > 1) {
            wynik = (liczba.at(wybor_liczby) - 1) + (liczba.at(wybor_liczby) - 2);
        } else if (liczba.at(wybor_liczby) == 1)  {
            wynik = 1;
        } else if (liczba.at(wybor_liczby) == 0) {
            wynik = 0;
        }
        cout << "Wynik to: " << wynik << endl;
    } catch (std::bad_alloc) {
         std::cerr << "bledne dane, przekroczony rozmiar tablicy" << std::endl;
    }

}
void Euler::oblicz() {
    int wynik;
    cout << "Wybierz wyraz ciagu chesz obliczyc: \n";
    wybor_liczby=dlugosc(liczba.size());
    try {
        wynik = pow(liczba.at(wybor_liczby),2) - liczba.at(wybor_liczby) + 41;
        cout << "Wynik dla ciagu eulera to: " << wynik << endl;
    } catch (std::bad_alloc) {
        std::cerr << "bledne dane, przekroczony rozmiar tablicy" << std::endl;
    }
}
void Pitagoras::oblicz() {
    int wynik;
    cout << "Wybierz która liczb chcesz obliczyc dla Pitagorasa: \n";
    wybor_liczby=dlugosc(std::min(bok1.size(),bok2.size()));
    try {
        std::cout<< bok1.at(wybor_liczby)<<"^2+"<<bok2.at(wybor_liczby)<<"^2=";
        wynik = pow(bok1.at(wybor_liczby),2) + pow(bok2.at(wybor_liczby),2);
        cout << "Przeciwprostokatna wynosi: " << wynik << endl;
    } catch (std::bad_alloc) {
        std::cerr << "bledne dane, przekroczony rozmiar tablicy" << std::endl;
    }

}

 

Podobne pytania

0 głosów
1 odpowiedź 161 wizyt
0 głosów
1 odpowiedź 137 wizyt
pytanie zadane 20 września 2015 w C i C++ przez tomasztopolewski Początkujący (430 p.)
0 głosów
3 odpowiedzi 502 wizyt
pytanie zadane 4 stycznia 2021 w Matematyka, fizyka, logika przez MateuszFisch Początkujący (250 p.)

92,555 zapytań

141,404 odpowiedzi

319,559 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...