• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Instrukcja switch

42 Warsaw Coding Academy
+1 głos
940 wizyt
pytanie zadane 7 kwietnia 2015 w C i C++ przez WojtekK Nowicjusz (170 p.)
int main()
{
    char ch;
    cin>>ch;

    switch(int(ch))
    {
        case 65:    a();
                    break;

        case 66:    a();
                    break;

        case 67:    c();
                    break;

        case 68:    d();
                    break;

    }

    return 0;
}

 

Dlaczego ten kod nie działa? Próbuje uzależnić wykonywany kod od wpisanej z klawiatury litery (A, B, C, D). Próbowałem z normalnym char'em oraz konwersji. Kod się kompiluje ale zamiast oczekiwanych działań w  konsoli wypisuje sie tylko tekst: "nan" chociaż takiego działania nie wywołuje żaden element programu!

Proszę o pomoc :)

7 odpowiedzi

+2 głosów
odpowiedź 7 kwietnia 2015 przez Grabarz Bywalec (2,880 p.)

Nie musisz robić rzutowania, aby konstrukcja była poprawna. Możesz porównać zmienną ch ze znakami w warunkach case.

#include <iostream>

int main()
{ char ch;
  cin >> ch;

  switch (ch)
  { case 'A':
    case 'a':
     a();
     break;
    case 'B':
    case 'b':
     b();
     break;
    case 'C':
    case 'c':
     c():
     break;
    case 'D':
    case 'd':
     d();
     break;
    default:
     /* Czynność, gdy zmienna ch nie jest żadną z powyższych */ 
  } }

Jeśli chcesz konieczne robić rzutowanie, użyj operatora rzutowania z C++.

static_cast<int>(ch)

 

+1 głos
odpowiedź 7 kwietnia 2015 przez Valtuil Pasjonat (22,460 p.)

U mnie program działa bez problemu: (wymagane duże litery)

#include <iostream>

using namespace std;

int main()
{
    char ch;
    cin>>ch;

    switch(int(ch))
    {
        case 65:    cout<<"A";
                    break;

        case 66:    cout<<"B";
                    break;

        case 67:    cout<<"C";
                    break;

        case 68:    cout<<"D";
                    break;

    }

    return 0;
}

 

komentarz 7 kwietnia 2015 przez Sebastian Westfal Obywatel (1,020 p.)
Po co korzystać z tablicy ASCI, jeżeli można zrobić to dużo prościej z użyciem sprawdzania char'u w apostrofach.
0 głosów
odpowiedź 7 kwietnia 2015 przez Sebastian Westfal Obywatel (1,020 p.)
Wybór z char'u zawsze podaje się w pojedyńczych apostrofach czyli np.: 'A'

Pozdrawiam.
komentarz 7 kwietnia 2015 przez WojtekK Nowicjusz (170 p.)
Ale zauważyłeś, że skonwertowałem char na integer?!
Wiem, że używa się pojedyńczych apostrofów. Próbowałem tak na początku, ale też taki sam efekt!
komentarz 7 kwietnia 2015 przez Sebastian Westfal Obywatel (1,020 p.)
#include <iostream>

using namespace std;

int main()
{
    char w;
    cin >> w;

    switch(w)
    {
        case 'A':
                    cout << "A";
                    break;
        case 'B':
                    cout << "B";
                    break;
        case 'C':
                    cout << "C";
                    break;
        case 'D':
                    cout << "D";
                    break;
    }
    return 0;
}

Polecam także https://www.youtube.com/watch?v=ib7LXBNfZ7g

Pozdrawiam.

0 głosów
odpowiedź 7 kwietnia 2015 przez Harsay Pasjonat (23,640 p.)
edycja 7 kwietnia 2015 przez Harsay

Aby zamienić char na int musisz wykonać rzutowanie.

char a = 'Z';
int i = (int) a;
int i = static_cast<int>(a);

Można je wykonać w stylu C (pierwszy sposób) lub w stylu C++ (drugi sposób).

U Ciebie występuje int(a) co jest błędne.
TFU! Jest to rzutowanie w stylu funkcjonalnym wprowadzone w C++.

komentarz 7 kwietnia 2015 przez Piotr Batko Stary wyjadacz (13,210 p.)

Skompiluj sobie to:

#include <iostream>

using namespace std;

int main()
{
    char ch='A';
    if( int(ch) == (int)ch )
    cout<<"Dziala i tak i tak:\nint(ch) = "<<int(ch)<<endl<<"(int)ch = "<<(int)ch<<endl;
    return 0;
}

Mógłbyś wytłumaczyć dlaczego taki zapis jest błędny?

komentarz 7 kwietnia 2015 przez Harsay Pasjonat (23,640 p.)
Zmuszony jestem przeprosić za wprowadzenie w błąd. Nigdy nie widziałem takiego zapisu, a po dłuższym przewertowowaniu Internetu dowiedziałem się, że istnieje rzutowanie w stylu funkcjonalnym (zastosowane w pytaniu).
0 głosów
odpowiedź 7 kwietnia 2015 przez mes Nowicjusz (240 p.)

Nie miałem zbyt wiele styczności z c++ ale z tego co zauwazyłem to źle przeprowadzasz konwersję typu jeśli o to chodzi w twoim programie. W 6 linijce powinieneś mieć:

switch((int)ch)

zamiast

switch(int(ch))

 

0 głosów
odpowiedź 7 kwietnia 2015 przez krecik1334 Maniak (58,390 p.)
Nie używaj konwersji. Daj do switcha znaki pomiędzy '' np. jak literka A to zamiast 65 daj 'A' i zadziała.
0 głosów
odpowiedź 7 kwietnia 2015 przez Artix Bywalec (2,110 p.)
#include <iostream>
 
using namespace std;
 
int main()
{
    char ch;
    cin>>ch;

    switch((int)ch) // złe rzutowanie
    {
        case 65:    cout<<"A";
                    break;
 
        case 66:    cout<<"B";
                    break;
 
        case 67:    cout<<"C";
                    break;
 
        case 68:    cout<<"D";
                    break;
 
    }
 
    return 0;
}

 

Podobne pytania

+1 głos
1 odpowiedź 841 wizyt
pytanie zadane 9 lutego 2022 w C i C++ przez Dynamic Bywalec (2,910 p.)
+3 głosów
1 odpowiedź 772 wizyt
pytanie zadane 22 października 2021 w C i C++ przez CrisGoldmann Nowicjusz (200 p.)
0 głosów
3 odpowiedzi 232 wizyt
pytanie zadane 13 grudnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)

93,379 zapytań

142,380 odpowiedzi

322,533 komentarzy

62,734 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...