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

Switch


Rekomendowane odpowiedzi

Opublikowano

Witam, mam pytanie a mianowicie, jak zrobić funkcję switch w switchu ?

 

#include <iostream>

using namespace std;

void Zadanie1()
{
cout << "xxxx" << endl;
}
void Zadanie2()
{
int liczba1;
cout << "Wpisz pierwsza liczbe: ";
cin >> liczba1;
int liczba2;
cout << "Wpisz druga liczbe: ";
cin >> liczba2;
int wynik;
cout << "Otrzymany wynik to: " << liczba1*liczba2 << endl;
}
void Zadanie3()
{
int jakaFigura;
cout << "Jaka figure chcesz wybrac ?: ";
cin >> jakaFigura;
}

//void Zadanie4()

int main()
{
int numerZadania;
cout << "Wpisz numer zadania: ";
cin >> numerZadania;
switch (numerZadania)
 {
	 case 1: Zadanie1(); break;
	 case 2: Zadanie2(); break;
	 case 3: Zadanie3(); break;
	 //case 4: Zadanie4(); break;
 }
system ("pause");
return 0;
}

 

Chciałbym w zadaniu3 mieć switcha by wybrac jaka figurę jak to zrobić ?

 

Prosze o pomoc !

Opublikowano

Hmm... W funkcji wstawiasz normalnie switch. Chyba że ci chodzi o coś takiego:

void Zadanie3()
{
string jakaFigura;
cout << "Jaka figure chcesz wybrac ?: ";
cin >> jakaFigura;
switch(jakaFigura)
{
case "kwadrat":/*tutaj kod*/;break;
case "trojkat":/*tutaj kod*/;break;
//...
default: cout<<"Blad.";break;
}
}


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

Tak oto chodzi ale nie działa kod...

 

void Zadanie3()
{
   int jakaFigura;
   cout << "Jaka figure chcesz wybrac ?: ";
   cin >> jakaFigura;
   switch (jakaFigura)
    {
	    case prostokat: cout << "ble"; break;

    }
}

 

mam tak wpisane

Opublikowano

Jak umieścić to w tej składni by wrócić do wyboru zadania ?:

 

Składnia:

void Zadanie2()
{
 int liczba1;
 cout << "\n\n";
 cout << "Wpisz pierwsza liczbe: ";
 cin >> liczba1;
 int liczba2;
 cout << "Wpisz druga liczbe: ";
 cin >> liczba2;
 int wynik;
 cout << "Otrzymany wynik to: " << liczba1*liczba2 << endl;
}

Opublikowano
int main()
{
int numerZadania;
kupa:
cout << "Wpisz numer zadania: ";
cin >> numerZadania;
switch (numerZadania)
        {
                case 1: Zadanie1(); break;
                case 2: Zadanie2(); break;
                case 3: Zadanie3(); break;
                //case 4: Zadanie4(); break;
        }
goto kupa;
system ("pause");
return 0;
}

Opublikowano

@UP

Czemu używasz goto? Słyszałem, że to jest niezdrowe.

 

#include <stdlib.h>

while(warunek)
{
 system("cls");
 cin >> numerZadania;
 switch (numerZadania)
 {...}
}

 

A jak sobie poradziłeś z tym switchem o którym pisałeś w temacie?

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Opublikowano

Okrzycz też swój kompilator że z twoich pętli robi zwykłą instrukcję z goto.

Twoja stara robi catch the clowny w Game Makerze.

Opublikowano

Po co używać goto jak masz o wiele czytelniejsze i wygodniejsze pętle?

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Opublikowano

Lepiej parametryzowac funkcje bo kod jest wtedy ladniejszy i czytelniejszy. Twoj problem mozna rozwiazac np. tak. (uzyty wskaznik na funkcje, dla wiekszej przejrzystosci i "obiektowosci" kodu)

 

#include <iostream>
#include <conio.h>
#include <cstdlib>

using namespace std;

int kw(int a, int){
   return a*a;
}

int pr(int a, int {
   return a*b;
}

int tr(int a, int h){
   return 0.5*a*h; // zaokraglone
}

int pole(int a, int b,int(*func)(int,int))
{
   return func(a,;
}

void Zadanie(int nr)
{
   switch(nr)
   {
   case 1:
       int a,b;
       system("cls");
       cout << "1 Liczba: "; cin >> a;
       cout << "2 Liczba: "; cin >> b;
       cout << "Wynik: " << a+b;
       break;
   case 2:
       system("cls");
       int figura;
       cout << "1. Kwadrat\n"
               "2. Prostokat\n"
               "3. Trojkat\n"
               "Wybor: ";
       figura = getch()-48;
       if(figura==1)
       {
           int a;
           system("cls");
           cout << "Dlugosc boku: "; cin >> a;
           cout << "Pole: " << pole(a,0,kw);
       }
       else if(figura==2)
       {
           int a,b;
           system("cls");
           cout << "Bok a: "; cin >> a;
           cout << "Bok b: "; cin >> b;
           cout << "Pole: " << pole(a,b,pr);
       }
       else if(figura==3)
       {
           int a,h;
           system("cls");
           cout << "Podstawa: "; cin >> a;
           cout << "Wysokosc: "; cin >> h;
           cout << "Pole: " << pole(a,h,tr);
       }
   }

}

int main()
{
   int nr_zad;
   cout << "Numery zadan 1-2\n"
           "0 - Wyjscie\n"
           "Podaj numer zadania: ";
   while(cin >> nr_zad && nr_zad!=0)
   {
       Zadanie(nr_zad);
       cout << "\nNumery zadan 1-2\n"
               "0 - Wyjscie\n"
               "Podaj numer zadania: ";
   }
   cout << endl;
   return 0;
}

Opublikowano

@UP

Czemu

figura = getch()-48;

a nie

 cin>>figura;

?

 

void Zadanie(int nr)
{
    int a, b, h, figura;
    switch(nr)
    {
    case 1:
		    system("cls");
		    cout << "1 Liczba: "; cin >> a;
		    cout << "2 Liczba: "; cin >> b;
		    cout << "Wynik: " << a+b;
		    break;
    case 2:
		    system("cls");
		    cout << "1. Kwadrat\n"
				    "2. Prostokat\n"
				    "3. Trojkat\n"
				    "Wybor: ";
		    cin >> figura;
		    system("cls");
		    switch(figura)
		    {
			    case 1:					   
				    cout << "Dlugosc boku: "; cin >> a;
				    cout << "Pole: " << pole(a,0,kw);
				    break;
			    case 2:
				    cout << "Bok a: "; cin >> a;
				    cout << "Bok b: "; cin >> b;
				    cout << "Pole: " << pole(a,b,pr);
				    break;
			    case 3:
				    cout << "Podstawa: "; cin >> a;
				    cout << "Wysokosc: "; cin >> h;
				    cout << "Pole: " << pole(a,h,tr);
				    break;
		    }
		    break;
    }
}

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Opublikowano

Zeby nie trzeba bylo klikac entera ;) takie mini menu.

Zeby nie trzeba bylo klikac entera ;) takie mini menu.

 

Ale to już lepiej by było chyba użyć cin.get(), przynajmniej nie trzeba includować innych bibliotek poza iostream.

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Opublikowano

Ale widze, ze juz nie ma sie czego czepiac to najwiekszych pierdol sie szuka? Ciesz sie ze nie wrzucilem windows.h i nie uzylem GetAsyncKeyState

Opublikowano

Nie, tylko, że koleś z tego tematu nauczy się używać gorszych wyjść

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Opublikowano

Ale widze, ze juz nie ma sie czego czepiac to najwiekszych pierdol sie szuka? Ciesz sie ze nie wrzucilem windows.h i nie uzylem GetAsyncKeyState

 

No tak, bo wtedy to kod byłby totalnie bezużyteczny ;> W końcu nie skompilował by się na linuxie OMFG !

Opublikowano

Nie, tylko, że koleś z tego tematu nauczy się używać gorszych wyjść

 

Pod jakim wzgledem gorsze? Tym ze jest szybsze? Tym ze nie musze sie bawic we wrzucanie do chara, a odrazu sobie do inta przypisalem? Tym ze zwraca mi tylko 1 znak z wejscia, a nie sluzy do pobierania calych linii?

 

Bardzo czesto uzywam tego na spoju i sie bardzo dobrze sprawdza. Nigdy nie narzekalem.

Opublikowano

Może w użyteczności - nie widać co się wpisuje w tym getch, nie wiem jak dla was, ale dla mnie to jest trochę irytujące (działa?, wpisało się?, czy po prostu mam laga ?). Lepsze jest IMO potwierdzanie enterem.

 

ad wydajność - szybki test run tracem:

 

getch 2122 linii kodu

 

cin 2349 linii kodu

 

Więc w ilości wykonanego kodu nie ma różnicy która byłaby jakkolwiek znacząca dla szybkości egzekucji - nie oznacza to jednak że funkcje wykonują się z taką samą prędkością gdyż jedna funkcja moze mieć np linijki kodu bardziej procesorożerne - lecz nie sądze by tak było w tym wypadku.

 

Wniosek - nie ma różnicy w wydajności.

Opublikowano

Wniosek? Linie kodu nic nie znacza. wszelkie funkcje cin sa oparte na strumieniach, ktore same w sobie nie powalaja wydajnoscia w stricte algorytmicznych rozwiazaniach. Jest to klasa dziedziczaca, i na pewno odwoluje sie w kodzie do wielu innych funkcji, chocby musi sprawdzic formatowanie, bledy, przepelnienia itd. getch? Zwraca nam po prostu nr kodu ascii wcisnietego klawisza.

Opublikowano

To są wykonane linie kodu.

 

Dla np instrukcji REP STOSB, mimo że jest to jedna instrukcja to może się wykonać nawet milon razy. Nie chodzi więc o ilość kodu tylko o ilość wykonanych instrukcji.

 

Więc jak widzisz getch wcale nie wywołuje dużo mniej funkcji niż cin. Może Ci się wydawać ze to takie proste ale spójrz na ten graph:

 

I3vdR.png

 

"Zwraca nam po prostu nr kodu ascii wcisnietego klawisza. " :ninja:

Aha i mój run trace uwzględnia wszystkie wykonane linie kodu, także w innych funkcjach wywoływanych przez te funkcje i funkcjach przez nie wywoływane itd ;>

 

 

I właśnie linie wykonanego kodu pokazują że getch nie jest dużo szybszy (prawie wcale, moze o jedną nanosekunde, czyli właściwie błąd pomiaru) od cin. A co do jakości jakiś tam algorytmów - nie ma to znaczenia.

Opublikowano

Jesli naprawde chcesz poznac szybkosc wykonania to zajrzyj do debuggera, a nie taki trace samych funkcji. 90% tego prawie nigdy sie nie wykona, bo bedzie to obsluga bledow, wyjatki, pewne nieokreslone sytuacje. Wystarczy spojrzec ile instrukcji w czystym asmie trzeba przejsc przy wykonaniu getch, a cin.get() i wtedy bedzies zmial jasnosc. Dodatkowo pewne instrukcje zajmuja wiecej taktow procesora od innych, choc nie wiem czy kompilator az tak optymalizuje kod aby uzywac dadatkowych instrukcji z zakresu sse,mmx itd.

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...