Cóż mam zrobić, else if (c==0) zawsze wypisuje testowe 'a', jakiekolwiek wartości nie zostaną wpisane
ostatni screenshot z case jest pod mainem
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;
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)
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();
}
#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;
}
w ten sposób, najważniejsze 14-20 , 55-82 ,126-130 . W 128 jest wczytaj liczby_2 bo zmienialem teraz troche
To nie ma prawa działać poprawnie, zakresy zmiennych nie działają w ten sposób w C++. Czym to kompilujesz? Bloodshed DevC++?
Jakieś g**no z codeblocksa, gnn gcc coś takiego, domyślny
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ć
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ą.
Nadal mnie jedno zastanawia, skoro nie ma prawa działać to czemu tylko potęgi nie działają, bo reszta tak ;p
A więc poda ktoś co mam poprawić w tym kodzie, pomijając opowiedzi typu wszystko?
#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;
}
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?
ale wiesz, że w C masz gotową funkcję pow
, która ci liczy potęgi?
wiem, tylko na studiach mialem zadanie żeby bez biblioteki c.math to zrobić
@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.
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.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.