Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[C++] Problem z funkcjami (nie widzi funkcji)


Phoenix_PL

Rekomendowane odpowiedzi

Opublikowano

Witam.

Po raz wtóry zacząłem zabawę z C++. Ale to nie tutaj

 

Chciałem napisać prosty kalkulator. Z dwoma funkcjami.

Problem mam właśnie z nimi.

 

Otóż oto mój kod:

 

 

#include <iostream>
#include <stdlib.h>
using namespace std;

//zmienne, zeby ich nie deklarowac milion razy przy wykonaniu kazde funkcji

int opcja;
float liczba1;
float liczba2;
float wynik;
int opcja_dzialanie;
bool rob;

int main() //funkcja główna
{
   //wyświetl wiadomość powitalną
   cout << "KALKULATOR\nWybierz opcje:\n\n[1] - Dodawanie\n[2] - Odejmowanie\n[3] - Mnozenie\n[4] - Dzielenie\n\n[5] - Wyjscie\n\n";

   //stwórz odnośnik do punktu
   program_start:

   //czekaj na wybór opcji
   cout << "Opcja: ";
   cin >> opcja;

   //sprawdź możliwe błędy
   //błąd strumienia
   if (cin.fail())
   {
       cin.clear();
       cin.sync();
       cout << "Nieprawidlowa opcja!\n";
       goto program_start;
   }
   //błąd nieprawidłowej opcji
   if (opcja <= 0 || opcja > 5)
   {
       cout << "Nieprawidlowa opcja!\n";
       goto program_start;
   }

   //switch z opcjami
   switch (opcja)
   {
       case 1:
       {
           dzialanie(1);
           break;
       }
       case 2:
       {
           dzialanie(2);
           break;
       }
       case 3:
       {
           dzialanie(3);
           break;
       }
       case 4:
       {
           dzialanie(4);
           break;
       }
   }
   return 0;
}

//funkcja arytmetyczna
//void bo nie potrzeba nam zwracania wartosci
void dzialanie(int typ)
{
   system("cls"); //czyszczenie ekranu konsoli

   //odnosnik do tego momentu
   wpisz_liczbe1:

   //pytanie o liczbe 1
   cout << "Wpisz liczbe pierwsza: ";
   cin >> liczba1;
   if (cin.fail()) //w razie trolla
   {
       cin.clear();
       cin.sync();
       cout << "Nieprawidlowa liczba!\n";
       goto wpisz_liczbe1;
   }

   //znowu odnosnik
   wpisz_liczbe2:

   //pytanie o liczbe 2
   cout << "Wpisz liczbe druga: ";
   cin >> liczba2;
   if (cin.fail()) //w razie trolla
   {
       cin.clear();
       cin.sync();
       cout << "Nieprawidlowa liczba!\n";
       goto wpisz_liczbe2;
   }

   //a teraz dzialanie
   switch (typ)
   {
       case 1:
       {
           wynik = liczba1 + liczba2; //działanie
           cout << "Wynik dodawania: " << wynik << "\n\n[1] - Powtorz dzialanie z innymi liczbami\n[2] - Wroc do menu\n"; //wynik i pytanie o wybór
           do {
               rob = false; //ustawiamy żeby nie wykonywać dalej pętli

               //pobieramy opcję
               cout << "\nOpcja: ";
               cin >> opcja_dzialanie;

               //znowu anty-trolling
               if (cin.fail() || (opcja_dzialanie != 1 && opcja_dzialanie != 2))
               {
                   if (cin.fail()) //synchro i czyszczenie tylko w wypadku błędu bufora
                   {
                   cin.clear();
                   cin.sync();
                   }
                   cout << "Nieprawidlowa opcja!";
                   rob = true; //przy wykonaniu błędu pętla ma się powrórzyć
               }
           } while (rob = true);

           //sprawdzamy opcje
           switch (opcja_dzialanie)
           {
               case 1: //jesli powtarzamy dzialanie
               {
                   dzialanie(1);
                   break;
               }
               case 2: //jesli wracamy do menu
               {
                   main();
                   break;
               }
           }
           break;
       }
       case 2:
       {
           wynik = liczba1 - liczba2; //działanie
           cout << "Wynik odejmowania: " << wynik << "\n\n[1] - Powtorz dzialanie z innymi liczbami\n[2] - Wroc do menu\n"; //wynik i pytanie o wybór

           do {
               rob = false; //ustawiamy żeby nie wykonywać dalej pętli

               //pobieramy opcję
               cout << "\nOpcja: ";
               cin >> opcja_dzialanie;

               //znowu anty-trolling
               if (cin.fail() || (opcja_dzialanie != 1 && opcja_dzialanie != 2))
               {
                   if (cin.fail()) //synchro i czyszczenie tylko w wypadku błędu bufora
                   {
                       cin.clear();
                       cin.sync();
                   }
                   cout << "Nieprawidlowa opcja!";
                   rob = true; //przy wykonaniu błędu pętla ma się powrórzyć
               }
           } while (rob = true);

           //sprawdzamy opcje
           switch (opcja_dzialanie)
           {
               case 1: //jesli powtarzamy dzialanie
               {
                   dzialanie(2);
                   break;
               }
               case 2: //jesli wracamy do menu
               {
                   main();
                   break;
               }
           }
           break;
       }
       case 3:
       {
           wynik = liczba1 * liczba2; //działanie
           cout << "Wynik mnozenia: " << wynik << "\n\n[1] - Powtorz dzialanie z innymi liczbami\n[2] - Wroc do menu\n"; //wynik i pytanie o wybór
           do {
               rob = false; //ustawiamy żeby nie wykonywać dalej pętli

               //pobieramy opcję
               cout << "\nOpcja: ";
               cin >> opcja_dzialanie;

               //znowu anty-trolling
               if (cin.fail() || (opcja_dzialanie != 1 && opcja_dzialanie != 2))
               {
                   if (cin.fail()) //synchro i czyszczenie tylko w wypadku błędu bufora
                   {
                   cin.clear();
                   cin.sync();
                   }
                   cout << "Nieprawidlowa opcja!";
                   rob = true; //przy wykonaniu błędu pętla ma się powrórzyć
               }
           } while (rob = true);

           //sprawdzamy opcje
           switch (opcja_dzialanie)
           {
               case 1: //jesli powtarzamy dzialanie
               {
                   dzialanie(3);
                   break;
               }
               case 2: //jesli wracamy do menu
               {
                   main();
                   break;
               }
           }
           break;
       }
       case 4:
       {
           wynik = liczba1 / liczba2; //działanie
           cout << "Wynik dzielenia: " << wynik << "\n\n[1] - Powtorz dzialanie z innymi liczbami\n[2] - Wroc do menu\n"; //wynik i pytanie o wybór
           do {
               rob = false; //ustawiamy żeby nie wykonywać dalej pętli

               //pobieramy opcję
               cout << "\nOpcja: ";
               cin >> opcja_dzialanie;

               //znowu anty-trolling
               if (cin.fail() || (opcja_dzialanie != 1 && opcja_dzialanie != 2))
               {
                   if (cin.fail()) //synchro i czyszczenie tylko w wypadku błędu bufora
                   {
                   cin.clear();
                   cin.sync();
                   }
                   cout << "Nieprawidlowa opcja!";
                   rob = true; //przy wykonaniu błędu pętla ma się powrórzyć
               }
           } while (rob = true);

           //sprawdzamy opcje
           switch (opcja_dzialanie)
           {
               case 1: //jesli powtarzamy dzialanie
               {
                   dzialanie(4);
                   break;
               }
               case 2: //jesli wracamy do menu
               {
                   main();
                   break;
               }
           }
           break;
       }
   }
}

 

 

Problem jest następujący

Kiedy próbuję to odpalić, to po chamsku wywala mi że nie widzi funkcji main().

Kiedy zamienię funkcje miejscami - nie widzi działanie().

 

Używam Code::Blocks (Visual Studio 2012 nie chce się zainstalować :<) i kompilatora GNU GCC (ściągałem wersję 70mb Code::Blocks)

 

Tutaj log z próby odpalenia tego syfu:

C:\Documents and Settings\Admin\Moje dokumenty\Dropbox\C++\kalkulator\kod.cpp||In function 'int main()':|
C:\Documents and Settings\Admin\Moje dokumenty\Dropbox\C++\kalkulator\kod.cpp|47|error: 'dzialanie' was not declared in this scope|
C:\Documents and Settings\Admin\Moje dokumenty\Dropbox\C++\kalkulator\kod.cpp|52|error: 'dzialanie' was not declared in this scope|
C:\Documents and Settings\Admin\Moje dokumenty\Dropbox\C++\kalkulator\kod.cpp|57|error: 'dzialanie' was not declared in this scope|
C:\Documents and Settings\Admin\Moje dokumenty\Dropbox\C++\kalkulator\kod.cpp|62|error: 'dzialanie' was not declared in this scope|
C:\Documents and Settings\Admin\Moje dokumenty\Dropbox\C++\kalkulator\kod.cpp||In function 'void dzialanie(int)':|
C:\Documents and Settings\Admin\Moje dokumenty\Dropbox\C++\kalkulator\kod.cpp|128|warning: suggest parentheses around assignment used as truth value|
C:\Documents and Settings\Admin\Moje dokumenty\Dropbox\C++\kalkulator\kod.cpp|169|warning: suggest parentheses around assignment used as truth value|
C:\Documents and Settings\Admin\Moje dokumenty\Dropbox\C++\kalkulator\kod.cpp|209|warning: suggest parentheses around assignment used as truth value|
C:\Documents and Settings\Admin\Moje dokumenty\Dropbox\C++\kalkulator\kod.cpp|249|warning: suggest parentheses around assignment used as truth value|
||=== Build finished: 4 errors, 4 warnings ===|

 

Zaznaczam że jestem (prawie) początkujący w C++... tzn. rzeczy typu składnia znam, aczkolwiek debugging to dla mnie narazie czarna magia...

 

//i w żadnym wypadku nie krępujcie się komentować i/lub oceniać mój kod :]

//chcę wiedzieć co spieprzyłem a co zrobiłem tu dobrze :D

 

//może mi ktoś powiedzieć co on chce od nawiasów przy while-ach?

846331404756772371599.jpeg
Opublikowano

Zadeklaruj void dzialanie(int typ);

przed mainem

 

Poza tym, w c++ 'standardem' jest

#include <cstdlib>

 

choć to dokładnie to samo, to mimo wszystko ;D

 

następne, zamiast:

 

	    switch (opcja)
    {
		    case 1:
		    {
				    dzialanie(1);
				    break;
		    }
		    case 2:
		    {
				    dzialanie(2);
				    break;
		    }
		    case 3:
		    {
				    dzialanie(3);
				    break;
		    }
		    case 4:
		    {
				    dzialanie(4);
				    break;
		    }
    }
    return 0;
}

 

wystarczy

 

dzialanie(opcja);


 

Opublikowano

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

//zmienne, zeby ich nie deklarowac milion razy przy wykonaniu kazde funkcji

int opcja;
float liczba1;
float liczba2;
float wynik;
int opcja_dzialanie;
bool rob;
void dzialanie(int typ);

int main() //funkcja g?ówna
{
    //wy?wietl wiadomo?? powitaln?
    cout << "KALKULATOR\nWybierz opcje:\n\n[1] - Dodawanie\n[2] - Odejmowanie\n[3] - Mnozenie\n[4] - Dzielenie\n\n[5] - Wyjscie\n\n";

    //stwórz odno?nik do punktu
    program_start:

    //czekaj na wybór opcji
    cout << "Opcja: ";
    cin >> opcja;

    //sprawd? mo?liwe b??dy
    //b??d strumienia
    if (cin.fail())
    {
		    cin.clear();
		    cin.sync();
		    cout << "Nieprawidlowa opcja!\n";
		    goto program_start;
    }
    //b??d nieprawid?owej opcji
    if (opcja <= 0 || opcja > 5)
    {
		    cout << "Nieprawidlowa opcja!\n";
		    goto program_start;
    }

    //switch z opcjami
    switch (opcja)
    {
		    case 1:
		    {
				    dzialanie(1);
				    break;
		    }
		    case 2:
		    {
				    dzialanie(2);
				    break;
		    }
		    case 3:
		    {
				    dzialanie(3);
				    break;
		    }
		    case 4:
		    {
				    dzialanie(4);
				    break;
		    }
    }
    return 0;
}

//funkcja arytmetyczna
//void bo nie potrzeba nam zwracania wartosci
void dzialanie(int typ)
{
    system("cls"); //czyszczenie ekranu konsoli

    //odnosnik do tego momentu
    wpisz_liczbe1:

    //pytanie o liczbe 1
    cout << "Wpisz liczbe pierwsza: ";
    cin >> liczba1;
    if (cin.fail()) //w razie trolla
    {
		    cin.clear();
		    cin.sync();
		    cout << "Nieprawidlowa liczba!\n";
		    goto wpisz_liczbe1;
    }

    //znowu odnosnik
    wpisz_liczbe2:

    //pytanie o liczbe 2
    cout << "Wpisz liczbe druga: ";
    cin >> liczba2;
    if (cin.fail()) //w razie trolla
    {
		    cin.clear();
		    cin.sync();
		    cout << "Nieprawidlowa liczba!\n";
		    goto wpisz_liczbe2;
    }

    //a teraz dzialanie
    switch (typ)
    {
		    case 1:
		    {
				    wynik = liczba1 + liczba2; //dzia?anie
				    cout << "Wynik dodawania: " << wynik << "\n\n[1] - Powtorz dzialanie z innymi liczbami\n[2] - Wroc do menu\n"; //wynik i pytanie o wybór
				    do {
						    rob = false; //ustawiamy ?eby nie wykonywa? dalej p?tli

						    //pobieramy opcj?
						    cout << "\nOpcja: ";
						    cin >> opcja_dzialanie;

						    //znowu anty-trolling
						    if (cin.fail() || opcja_dzialanie != 1 && opcja_dzialanie != 2)
						    {
								    if (cin.fail()) //synchro i czyszczenie tylko w wypadku b??du bufora
								    {
								    cin.clear();
								    cin.sync();
								    }
								    cout << "Nieprawidlowa opcja!";
								    rob = true; //przy wykonaniu b??du p?tla ma si? powrórzy?
						    }
				    } while (rob = true);

				    //sprawdzamy opcje
				    switch (opcja_dzialanie)
				    {
						    case 1: //jesli powtarzamy dzialanie
						    {
								    dzialanie(1);
								    break;
						    }
						    case 2: //jesli wracamy do menu
						    {
								    main();
								    break;
						    }
				    }
				    break;
		    }
		    case 2:
		    {
				    wynik = liczba1 - liczba2; //dzia?anie
				    cout << "Wynik odejmowania: " << wynik << "\n\n[1] - Powtorz dzialanie z innymi liczbami\n[2] - Wroc do menu\n"; //wynik i pytanie o wybór

				    do {
						    rob = false; //ustawiamy ?eby nie wykonywa? dalej p?tli

						    //pobieramy opcj?
						    cout << "\nOpcja: ";
						    cin >> opcja_dzialanie;

						    //znowu anty-trolling
						    if (cin.fail() || opcja_dzialanie != 1 && opcja_dzialanie != 2)
						    {
								    if (cin.fail()) //synchro i czyszczenie tylko w wypadku b??du bufora
								    {
										    cin.clear();
										    cin.sync();
								    }
								    cout << "Nieprawidlowa opcja!";
								    rob = true; //przy wykonaniu b??du p?tla ma si? powrórzy?
						    }
				    } while (rob = true);

				    //sprawdzamy opcje
				    switch (opcja_dzialanie)
				    {
						    case 1: //jesli powtarzamy dzialanie
						    {
								    dzialanie(2);
								    break;
						    }
						    case 2: //jesli wracamy do menu
						    {
								    main();
								    break;
						    }
				    }
				    break;
		    }
		    case 3:
		    {
				    wynik = liczba1 * liczba2; //dzia?anie
				    cout << "Wynik mnozenia: " << wynik << "\n\n[1] - Powtorz dzialanie z innymi liczbami\n[2] - Wroc do menu\n"; //wynik i pytanie o wybór
				    do {
						    rob = false; //ustawiamy ?eby nie wykonywa? dalej p?tli

						    //pobieramy opcj?
						    cout << "\nOpcja: ";
						    cin >> opcja_dzialanie;

						    //znowu anty-trolling
						    if (cin.fail() || opcja_dzialanie != 1 && opcja_dzialanie != 2)
						    {
								    if (cin.fail()) //synchro i czyszczenie tylko w wypadku b??du bufora
								    {
								    cin.clear();
								    cin.sync();
								    }
								    cout << "Nieprawidlowa opcja!";
								    rob = true; //przy wykonaniu b??du p?tla ma si? powrórzy?
						    }
				    } while (rob = true);

				    //sprawdzamy opcje
				    switch (opcja_dzialanie)
				    {
						    case 1: //jesli powtarzamy dzialanie
						    {
								    dzialanie(3);
								    break;
						    }
						    case 2: //jesli wracamy do menu
						    {
								    main();
								    break;
						    }
				    }
				    break;
		    }
		    case 4:
		    {
				    wynik = liczba1 / liczba2; //dzia?anie
				    cout << "Wynik dzielenia: " << wynik << "\n\n[1] - Powtorz dzialanie z innymi liczbami\n[2] - Wroc do menu\n"; //wynik i pytanie o wybór
				    do {
						    rob = false; //ustawiamy ?eby nie wykonywa? dalej p?tli

						    //pobieramy opcj?
						    cout << "\nOpcja: ";
						    cin >> opcja_dzialanie;

						    //znowu anty-trolling
						    if (cin.fail() || opcja_dzialanie != 1 && opcja_dzialanie != 2)
						    {
								    if (cin.fail()) //synchro i czyszczenie tylko w wypadku b??du bufora
								    {
								    cin.clear();
								    cin.sync();
								    }
								    cout << "Nieprawidlowa opcja!";
								    rob = true; //przy wykonaniu b??du p?tla ma si? powrórzy?
						    }
				    } while (rob = true);

				    //sprawdzamy opcje
				    switch (opcja_dzialanie)
				    {
						    case 1: //jesli powtarzamy dzialanie
						    {
								    dzialanie(4);
								    break;
						    }
						    case 2: //jesli wracamy do menu
						    {
								    main();
								    break;
						    }
				    }
				    break;
		    }
    }
}

 

bez problemu kompiluje.


 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...