Słuchaj, chodzi o to, że powinieneś objąć klamrami ({}) wszystkie instrukcje, jakie chcesz, aby były wykonywane po naciśnięciu 1 (case 1:). Tzn., ze jeśli napiszesz tak:
case 1 : int Wynik = L1 + L2;
To instrukcje kończą się dla case zaraz po napotkaniu średnika. Czyli zmienna Wynik jest znana tylko w zakresie case 1 Dalej już nie Czyli tu:
cout<<"Wynik to "<
Zmienna Wynik jest już nieznana, więc kompilator protestuje, ponieważ nie zna tej zmiennej Więc jeśli chcesz, aby była ona znana w całym bloku case 1:, powinieneś umieścić wszystkie instrukcje, w których chcesz użyć tej zmiennej, i które mają być wykonane po naciśnięciu 1, pomiędzy klamrami. Przykład:
case 1 :
{
int Wynik = L1 + L2;
cout<<"Wynik to "<
cin>>Wynik;
break;
}
Słyszałeś o czymś takim jak formatowanie kodu? Przecież tego nie da się czytać! W czym Ty to piszesz? Obstawiam Dev-Cpp.
Nazwy zmiennych piszemy małymi literami (np. “l1”), natomiast w nazwach funkcji każde słowo zaczynamy wielką (np. Liczba1())
Nazwy funkcji powinny jasno mówić, co dana funkcja robi. Twoja “liczba1” nie mówi nic. Natomiast np. “PobierzLiczbyOdUzytkownika” wygląda zdecydowanie lepiej.
Dlaczego Twoja funkcja ma zadeklarowany zwracany typ int, mimo że niczego nie zwraca? Nie sądzisz, że powinien być to typ void?
Dlaczego w case’ach 1-4 masz coś takiego “cin>>Wynik;”. Czemu to ma służyć?
Dlaczego w case 0 i w default nie masz brake?
Ogólnie nie rozumiem koncepcji tworzenia jakichś lokalnych zmiennych w case’ach. Po co to? W tym programie wystarczą 4 zmienne zadeklarowane na początku main, do których dane będą pobierane i wyliczane w odpowiednich case’ach.
Fajnie, że wpadłeś na pomysł zrobienia oddzielnej funkcji do pobierania liczb od użytkownika. Ale jeśli chcesz, aby funkcja zwróciła kilka zmiennych, to najlepiej przekazać je do niej w argumentach jako wskaźniki. Wtedy Twoja funkcja pobierająca będzie mogła pobrać liczby od użytkownika i zapisać je w zmiennych będących w funkcji main.
Teraz wreszcie zrozumiałem temat. Ty nie chcesz skompilować kodu. Ty chcesz sobie wszystko niepotrzebnie skomplikować
Pioter233, ten ostatni kod który wrzuciłeś jasno pokazuje, że nie znasz C++ zbyt dobrze. Ok, rozumiem że dopiero się uczysz, szanuję to, ale ta funkcja liczba1 i to co prawdopodobnie chciałeś uzyskać może tylko bawić kogoś znającego C++. Zalecam więcej nauki, zdecydowanie.
Również uczulam na formatowanie kodu, czyli wszelkie zabiegi czyniące go bardziej czytelnym, przede wszystkim zwracaj uwagę na odstępy i wcięcia. I muszę zgodzić się z somekind, że temat wątku świetnie pasuje do tego co robisz z tym kodem. Zobacz jak ten kod mógłby wyglądać:
#include
#include
int main()
{
int opcja;
std::cout << "Wybierz dzialanie : \n 1.Dodawanie \n 2.Odejmowanie\n 3.Mnożenie \n 4.Dzielenie \n 0.Wyjdz\nTwój wybór: ";
std::cin >> opcja; // zauważ - spacje między operatorami zwiększają czytelność
if(0 == opcja)
return 0;
double result = NAN;
double larg, rarg;
std::cout << "Podaj lewy argument: ";
std::cin >> larg;
std::cout << "Podaj prawy argument: ";
std::cin >> rarg;
if(4 == opcja && 0 == rarg)
{
std::cout << "Błąd: Dzielenie przez zero!\n";
return 1;
}
switch(opcja) // zwróć uwagę na wcięcia robione Tabem - bardzo polepszają czytelność kodu
{
case 1:
result = larg + rarg;
break;
case 2:
result = larg - rarg;
break;
case 3:
result = larg * rarg;
break;
case 4:
result = larg / rarg;
break;
default:
std::cout << "Nieznana opcja\n";
}
std::cout << "Wynik to: " << result << "\n";
return 0;
}
Jest do bani, by nie powiedzieć inaczej. Chociażby właśnie dlatego, że formatuje kod w losowy, nieprzewidywalny i najbardziej nieczytelny z możliwych sposób.
Jeśli potrzebujesz lekkiego i wygodnego IDE, to polecam CodeBlocks.
To nie ortografia, tylko konwencje. Taki jest dobry, programistyczny obyczaj. Wówczas ktoś patrząc na Twój kod łatwiej go zrozumie. Powiesz, że teraz to nie ma znaczenia - otóż ma. Jeśli nabierzesz złych nawyków teraz, będziesz miał problem z ich zmianą w przyszłości.
Tobie najwyraźniej się to udało. Gdyby tak nie było, to nie prosiłbyś o pomoc tutaj, prawda?
Więc skąd wziąłeś pomysł, że trzeba? Czytałeś jakiś kurs, książkę o C++?
Jedna do przechowywania opcji wybranej przez użytkownika, dwie to przechowywania argumentów działania i jedna na wynik. Razem cztery - tyle jest w kodzie nr47.
Rozumiem, że się uczysz. Dlatego w poprzednim przedstawiłem Ci kilka spraw/problemów, abyś je sobie przemyślał i ewentualnie dopytał.
Dlatego też nie rzuciłem Ci gotowca, ale skoro nr47 , to przynajmniej masz szansę zobaczyć bardzo dobrze napisany kod.
Ale tu już nie. Konwencja nazewnictwa to już sprawa indywidualna, przynajmniej na tym poziomie, później sprawa zespołu. Ja wszystko nazywam wielką literą, tylko że przed zmienną daję typy (np. iCalkowita, fZmiennoprzecinkowa, piPointerCałkowitej), więc dla mnie Twoje nazewnictwo też nie dostarcza wystarczającej ilości informacji.
Mały błąd, początkujący nie musi tego wszystkiego kojarzyć. Problem z tym powinien się ograniczyć do ostrzeżenia kompilatora.
Bo zapomniał?
Trochę na pointer jeszcze za wcześnie…
Chłopak dopiero się uczy, zamiast go zniechęcać i pokazywać jaki jesteś dobry, mógłbyś pomóc…
#include oraz double result to tylko dwie linijki, a to na pewno jest jest 1/3 kodu cmath to nagłówek z funkcjami matematycznymi, użyłem go tylko dla wartości NAN liczb zmiennoprzecinkowych. A double to typ, tak samo jak int. int jest dla liczby całkowitych (jak ang. integer - całkowity), a double jest dla liczb zmiennoprzecinkowych (tu nieco mniej oczywisty mnemonik - and. double - podwójny od liczby zmiennoprzecinkowej podwójnej precyzji)
Jeżeli chodzi o naukę to wg mnie nie ma sensu marnować czasu na jakieś kursy internetowe, wydajniejszym rozwiązaniem wydaje się być zakup dobrej książki. Jeżeli naprawdę zależy Ci na nauczeniu się C++ i ogólnie na nauce programowania to radzę kupić Ci dobrą książkę. Jaką? Było bardzo dużo wątków “Jaka książka do nauki X” - wystarczy poszukać na tym forum/Google.
Piszesz o notacji węgierskiej, od której raczej się odchodzi, bo np:
dodatkowe zaciemnianie kodu przedrostkami zmniejsza jego czytelność;
nie ma potrzeby redundancji informacji o typie zmiennej, kompilator przecież i tak to wie;
w nowoczesnych IDE wystarczy najechać na nazwę zmiennej w dowolnym miejscu kodu, aby zobaczyć jaki ma typ;
gdy w pewnym momencie zmieniasz typ zmiennej, musisz zmienić też jej nazwę.
Przeciwnikami tej notacji są np. Bjarne Stroustrup (on się chyba trochę zna na C++ ^^) i Linus Torvalds (myślę, że on też “coś” napisać umie).
To tyle o naszych bratankach znad Balatonu. Ale jakby nie patrzeć ważne jest, żeby:
jakąś konwencję mieć - a nie raz tak, raz siak;
nazwy zmiennych i funkcji jednak coś mówiły, a nie brzmiały “adfadas”, bo później patrząc w kod po miesiącu nie załapie się o co chodziło w trakcie jego pisania.
I o to trzeba dbać już od samego początku zabawy w programowanie, bo jak nie, to później będzie źle.
Dlatego mu zwróciłem na to uwagę. “Małe błedy”, ale są.
Nie chciałem nikogo zniechęcać (zresztą wątpię, aby to nastąpiło), tylko zwrócić uwagę na parę rzeczy. I nie jestem wcale dobry, raczej upierdliwy
Jeśli masz jeszcze problemy z podstawową składnią, instrukcjami i typami zmiennych, to może zacznij od tego: http://pl.wikibooks.org/wiki/C#Spis_tre.C5.9Bci. To C, a nie C++, ale zasady te same, na pewno nie zaszkodzi.
Natomiast, podobnie jak nr47 uważam, że lepszym wyjściem są książki. Np. “Symfonia C++ Standard”.