cpp kalkulator problem z potęgami

0

Cóż mam zrobić, else if (c==0) zawsze wypisuje testowe 'a', jakiekolwiek wartości nie zostaną wpisane
screenshot-20220306143700.png
screenshot-20220306143757.png
screenshot-20220306143739.png

0

ostatni screenshot z case jest pod mainem

2

Dlaczego nie należy zamieszczać kodu w postaci obrazków

Zmienne int c,d; w funkcji wczytajLiczby_2 to zmienne lokalne tejże funkcji, funkcja potegowanie ma swoje własne zmienne int c,d; które nie mają nic wspólnego z tak samo nazwanymi zmiennymi w innych funkcjach.

Zdefiniuj potegowanie w ten sposób void potegowanie(int c, int d); i zawołaj ją ten wposób potegowanie(c, d);.

Jeśli korzystasz z C++17 to całość może wyglądać w ten sposób

struct Wejscie {int c, d; };

Wejscie wczytajLiczby_2()
{
  int c,d;
  // .....

  return Wejscie{c, d};
}

//..............
case 5:
  const auto [c,d] = wczytajLiczby_2();
  potegowanie(c,d);
  break;
0

czyli pomimo tego ze pod mainem zadeklarowalem c oraz d, to i tak program odczytuje je w funkcji jako osobne zmienne?
Tym bardziej jestem zdziwiony bo dla dodawania, odjemowania mnozenia wszystko działa (tam mam użyte a i b, ale na tej samej zasadzie co c i d)

0

czyli pomimo tego ze pod mainem zadeklarowalem c oraz d, to i tak program odczytuje je w funkcji jako osobne zmienne?

Tak.

odjemowania mnozenia wszystko działa (tam mam użyte a i b, ale na tej samej zasadzie co c i d)

Nie widziałem tego kodu, żeby się do tego ustosunkować, jednak na pewno na takiej samej zasadzie? Nie używasz tam może zmiennych globalnych? Np. w ten sposób

int a,b;

int mnoz() 
{
  return a * b;
}

int main()
{
  std::cout << "...";
  std::cin >> a >> b;

  std::cout << mnoz();
}
0
#include <iostream>
#include <cmath>
using namespace std;
void opcje ()
{
    cout << "1. Dodawanie" << endl;
    cout << "2. Odejmowanie" << endl;
    cout << "3. Mnozenie" << endl;
    cout << "4. Dzielenie"<< endl;
    cout << "5. Potegowanie"<< endl;
    cout << "6. Silnia"<< endl;
    cout << "0. Zakoncz" << endl << endl;
}
void wczytajLiczby_1 ()
{
    int a, b;
    cout << "Podaj pierwsza liczbe" << endl;
    cin >> a;
    cout << "Podaj druga liczbe" << endl;
    cin >> b;
}
void wczytajLiczby_2 ()
{
    int c, d;
    cout << "Podaj podstawe potegi" << endl;
    cin >> c;
    cout << "Podaj wykladnik potegi" << endl;
    cin >> d;
}

void dodawanie()
{
    int a, b;
    int suma = a + b;
    cout << endl << "Wynik dodawania: " << suma;
}
void odejmowanie()
{
    int a, b;
    int roznica = a - b;
    cout << endl << "Wynik odejmowania: " << roznica;
}
void mnozenie ()
{
    int a, b;
    int iloczyn = a * b;
    cout << endl << "Wynik mnozenia: " << iloczyn;
}
void dzielenie()
{
    int a, b;
    int iloraz = a / b;
    cout << endl << "Wynik dzielenia: " << iloraz;
}
void potegowanie ()
{
    int a, b;
    if (a != 0 && b == 2)
    {
        int wynik = a*a;
        cout << "Wynik potegowania: " << a * a; // być może << wynik;
    }
    else if (b == 0 && a != 0)
    {
        cout << "Wynik potegowania: 1" << endl;
    }
    else if (b == 1 && a != 0)
    {
        cout << "Wynik potegowania: " << a << endl;
    }
    else if (a==0)
    {
        cout << "Wynik potegowania: a" << endl;
    }
    else if (b > 2)
    {
        int potega = a;
            for(int i = 0; i < b; i++)
            {
                potega = potega * a;
            }
        cout << "Wynik potegowania: " << potega << endl;
    }



}
int main()
{
    int a,b,c,d;
    int wybor;
    opcje();//na koniec pętli do wstaw opcje
do
{


    {
    cout << endl << "Wybierz dzialanie: " << endl;
    cin >> wybor;
    switch(wybor)
    {
    case 1:
        {
            wczytajLiczby_1();
            dodawanie();
            break;
        }
    case 2:
        {
            wczytajLiczby_1();
            odejmowanie();
            break;
        }
    case 3:
        {
            wczytajLiczby_1();
            mnozenie();
            break;
        }
    case 4:
        {
            wczytajLiczby_1();
            dzielenie();
            break;
        }
    case 5:
        {
            wczytajLiczby_2();
            potegowanie();
            break;
        }

    }

    }
}
while (wybor != 0);




    return 0;
}

0

w ten sposób, najważniejsze 14-20 , 55-82 ,126-130 . W 128 jest wczytaj liczby_2 bo zmienialem teraz troche

0

To nie ma prawa działać poprawnie, zakresy zmiennych nie działają w ten sposób w C++. Czym to kompilujesz? Bloodshed DevC++?

0

Jakieś g**no z codeblocksa, gnn gcc coś takiego, domyślny

0

czyli jakieś referencje wskaźniki do funkcji mam użyć coś w tym stylu? Jak to dłuższy temat to nie zagłębiaj się specjalnie, zobaczę jak znajomi zrobili/próbowali zrobić

0
PaawllooPL napisał(a):

czyli jakieś referencje wskaźniki do funkcji mam użyć coś w tym stylu? Jak to dłuższy temat to nie zagłębiaj się specjalnie, zobaczę jak znajomi zrobili/próbowali zrobić

Cofnij się trochę do postaw. Ten kod ma WIELE poważnych podstawowych błędów.

BTW trudność do pięknego rozwiązania w prawdziwym obiektowym C++. Ale to później, najpierw podstawy.
Np analiza ostrzeżeń, zakresy zmiennych jak koledzy wspominają.

0

Nadal mnie jedno zastanawia, skoro nie ma prawa działać to czemu tylko potęgi nie działają, bo reszta tak ;p

0

A więc poda ktoś co mam poprawić w tym kodzie, pomijając opowiedzi typu wszystko?

2
#include <iostream>
#include <cmath>
using namespace std;
void opcje ()
{
    cout << "1. Dodawanie" << endl;
    cout << "2. Odejmowanie" << endl;
    cout << "3. Mnozenie" << endl;
    cout << "4. Dzielenie"<< endl;
    cout << "5. Potegowanie"<< endl;
    cout << "6. Silnia"<< endl;
    cout << "0. Zakoncz" << endl << endl;
}
void wczytajLiczby_1 (int& a, int& b)
{
    cout << "Podaj pierwsza liczbe" << endl;    cin >> a;
    cout << "Podaj druga liczbe" << endl;
    cin >> b;
}
void wczytajLiczby_2 (int& c, int& d)
{
    cout << "Podaj podstawe potegi" << endl;    cin >> c;
    cout << "Podaj wykladnik potegi" << endl;
    cin >> d;
}

void dodawanie(int a, int b)
{
    int suma = a + b;    cout << endl << "Wynik dodawania: " << suma;
}
void odejmowanie(int a, int b)
{
    int roznica = a - b;    cout << endl << "Wynik odejmowania: " << roznica;
}
void mnozenie (int a, int b)
{
    int iloczyn = a * b;    cout << endl << "Wynik mnozenia: " << iloczyn;
}
void dzielenie(int a, int b)
{
    int iloraz = a / b;    cout << endl << "Wynik dzielenia: " << iloraz;
}
void potegowanie (int a, int b)
{
    if (a != 0 && b == 2)
    {
        int wynik = a*a;
        cout << "Wynik potegowania: " << a * a; // być może << wynik;
    }
    else if (b == 0 && a != 0)
    {
        cout << "Wynik potegowania: 1" << endl;
    }
    else if (b == 1 && a != 0)
    {
        cout << "Wynik potegowania: " << a << endl;
    }
    else if (a==0)
    {
        cout << "Wynik potegowania: " << a << endl;
    }
    else if (b > 2)
    {
        int potega = a;
            for(int i = 0; i < b; i++)
            {
                potega = potega * a;
            }
        cout << "Wynik potegowania: " << potega << endl;
    }



}
int main()
{
    int a,b;
    int wybor;
    opcje();//na koniec pętli do wstaw opcje
    do
    {


    {
    cout << endl << "Wybierz dzialanie: " << endl;
    cin >> wybor;
    switch(wybor)
    {
    case 1:
        {
            wczytajLiczby_1(a, b);
            dodawanie(a, b);
            break;
        }
    case 2:
        {
            wczytajLiczby_1(a, b);
            odejmowanie(a, b);
            break;
        }
    case 3:
        {
            wczytajLiczby_1(a, b);
            mnozenie(a, b);
            break;
        }
    case 4:
        {
            wczytajLiczby_1(a, b);
            dzielenie(a, b);
            break;
        }
    case 5:
        {
            wczytajLiczby_2(a, b);
            potegowanie(a, b);
            break;
        }

    }

    }
}
while (wybor != 0);
    return 0;
}
0

Ogólnie to cały program tak jak wysłałem działa u mojego znajomego dobrze, już drugi raz mam taką sytuację. Pierwsza to musiałem wypełnić macierz zerami przed mnożeniem żeby wyszło tak jak u mojego znajomego, teraz nic nie robiłem a jemu działa dobrze. Wina kompilatora czy mój laptop strzela fochy?

1

ale wiesz, że w C masz gotową funkcję pow, która ci liczy potęgi?

0

wiem, tylko na studiach mialem zadanie żeby bez biblioteki c.math to zrobić

0

@PaawllooPL: problem polega na tym, że jak odwołujesz się do zmiennych którym nie nadasz wartości, to kompilator może zrobić cokolwiek z Twoim kodem. Więc wystrzegaj się jak możesz takich sytuacji, bo w ogólnym przypadku ciężko ocenić jakie są możliwe konsekwencje. Przykładowo, miałeś wcześniej

void mnozenie ()
{
    int a, b;
    int iloczyn = a * b;
    cout << endl << "Wynik mnozenia: " << iloczyn;
}

Liczby a i b nie mają nadanej wartości. Więc tak naprawdę, kompilator mógłby założyć, że nigdy nie wywołasz funkcji mnozenie, gdyż używasz tam zmiennych a i b które są niezainicjalizowane.

1

Czemu tak strasznie przekombinujecie?

#include <iostream>
using namespace std;

int Add(int a,int b) { return a+b; }
int Sub(int a,int b) { return a-b; }
int Mul(int a,int b) { return a*b; }
int Div(int a,int b) { return a/b; }
//int Mod(int a,int b) { return a%b; }
int Pow(int a,int b) 
{
	if(!a) return 0;
	int result=1;
	for(;b;a*=a,b>>=1) if(b&1) result*=a;
	return result;
}
int Factorial(int a,int) 
{
	int result=1;
	while(a) result*=(a--);
	return result;
}

typedef int Operation(int f,int s);

struct 
{
	const char *option;
	const char *result;
	const char *first;
	const char *second;
	Operation *function;
}
OP[]
{
	{"Dodawanie","dodawania","pierwszy skladnik","drugi skladnik",&Add},
	{"Odejmowanie","odejmowania","odjemna","odjemnik",&Sub},
	{"Mnozenie","mnozenia","mnozna","mnoznik",&Mul},
	{"Dzielenie","dzielenia","dzielna","dzielnik",&Div},
	{"Potegowanie","potegowania","podstawe","wykladnik",&Pow},
	{"Silnia","silni","argument",nullptr,&Factorial},
	//{"Reszta z dzielenia","reszty z dzelenia","dzielna","dzielnik",&Mod},
};

int input()
{
	while(true)
	{
		int value;
		if(cin>>value) return value;
		cout<<"\tNieporawne wprowadzenie, powtorz."<<endl;
		cin.clear();
		while(cin.get()!='\n') {}
	}
}

int menu()
{
	while(true)
	{
		for(int i=0;i<sizeof(OP)/sizeof(*OP);++i)
		{
			cout<<(i+1)<<". "<<OP[i].option<<endl;
		}
		cout<<"0. Zakoncz"<<endl<<"Wybierz dzialanie: ";
		int choise=input();
		if(!choise) exit(0);
		else if((0>choise)||(choise>sizeof(OP)/sizeof(*OP))) cout<<"Nie ma takiej opcji"<<endl<<endl;
		else return choise-1;
	}
}

int main()
{
    while(true)
    {
    	int choise=menu();
    	int a,b=0;
    	cout<<"Podaj "<<OP[choise].first<<": ";
    	a=input();
    	if(OP[choise].second)
    	{
	    	cout<<"Podaj "<<OP[choise].second<<": ";
    		b=input();
		}
		cout<<"Wynik "<<OP[choise].result<<": "<<OP[choise].function(a,b)<<endl<<endl;
    }
}

Proszę zauważyć że dodanie kolejnej operacji np. reszta z dzielenia to tylko dwa dodatkowych wiersza (ba przy użyciu lambd tylko jednego).
Na dodatek jest znacznie krótsze od wszystkich poprzednich propozycji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1