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

C++, program, zły wynik

Object Storage Arubacloud
0 głosów
504 wizyt
pytanie zadane 25 lipca 2019 w C i C++ przez martin1724 Użytkownik (690 p.)
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
    string tekst;
    int text ,spacja, liczba_a, liczba_z, liczba_p;
    cout << "podaj tekst: ";
    spacja = 0;
    liczba_a = 0;
    liczba_z = 0;
    liczba_p = 0;
    getline(cin,tekst);
    tekst = text;
    switch(text)
    {
    case ' ':
            spacja++;
            break;
    case 'a':
            liczba_a++;
            break;
    case 'z':
            liczba_z++;
            break;
    case 'p':
            liczba_p++;
            break;
    }
    cout << "liczba spacji wynosi: " << spacja << endl;
    cout << "liczba a wynosi: " << liczba_a << endl;
    cout << "liczba z wynosi: " << liczba_z << endl;
    cout << "liczba p wynosi: " << liczba_p << endl;
    return 0;
}

Witam, problem w tym że funkcja switch nie zlicza danych liter. Mógłby ktoś powiedzieć gdzie jest błąd?
 

komentarz 25 lipca 2019 przez niezalogowany
edycja 25 lipca 2019

ja bym zrobił tak, no prawie tak:

 for (int i=0; i<tekst.size(),i++)

{text=(int)tekst[i];

switch((char)text)

.....

}

//i ogólnie dałbym text jako char text

 

komentarz 25 lipca 2019 przez Milesq Nałogowiec (32,020 p.)

@fikser

1) Może popraw czytelność, to znaczy:

for(int i = 0; i < tekst.size(); i++) {
    text = (int)tekst[i];
 
    switch((char)text)
    ....
}

2) w pierwszej linijce masz błąd składniowy. Już go poprawiłem, zamieniając przecinek na średnik

3) Rzutowania w stylu C (c-style cast) powinno się unikać w C++ zamiast nich masz do dyspozycji static_cast, dynamic_cast, const_cast, reinterpret_cast

https://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-const-cast-and-reinterpret-cast-be-used?answertab=oldest#tab-top

1
komentarz 25 lipca 2019 przez niezalogowany
edycja 26 lipca 2019

OK, trochę niechlujnie to zrobiłem. Moja wina, ....

Tylko jak być z sensem, to ja bym tego getline() nie użył po co dodatkowa zmienna, która nic nie robi, ale może się mylę. No i wtedy żadne rzutowanie nie było by potrzebne tylko while();

ale to też nie takie rozwiązanie jak być powinno, moim zdaniem poprawne mi nie działa.

#include <iostream>
using namespace std;
int main()
{
    int spacja=0, a=0;
    //char wybor; edit sam dodałem niepotrzebną zmienna
   // while (cin.get(wybor)&&cin.peek()!=10)
     while (cin.peek()!=10)
    {
       // switch (wybor)
          switch (get.char())
        {
        case ' ':
            spacja++;
            break;
        case 'a':
            a++;
            break;
        default:
            break;
        }
    }
    cout<<"a="<<a<<"  spacja="<<spacja<<endl;
    return 0;
}

 

3 odpowiedzi

0 głosów
odpowiedź 25 lipca 2019 przez Storm088 Obywatel (1,460 p.)
edycja 25 lipca 2019 przez Storm088
 
Najlepsza

Tu masz małą modyfikacje twojego kodu:

#include <iostream>
#include <string.h>

int main()
{
    std::string tekst;
    int  spacja=0, liczba_a=0, liczba_z=0, liczba_p=0;

    std::cout << "Podaj tekst:";
    getline(std::cin,tekst);

    for(std::size_t i=0; i<tekst.size(); i++)
    {
      switch(tekst.at(i))
      {
      case ' ':
            spacja++;
            break;
      case 'a':
            liczba_a++;
            break;
      case 'z':
            liczba_z++;
            break;
      case 'p':
            liczba_p++;
            break;
      default:  
            break;
      }
    }

    std::cout << "liczba spacji wynosi: " << spacja << std::endl;
    std::cout << "liczba a wynosi: " << liczba_a << std::endl;
    std::cout << "liczba z wynosi: " << liczba_z << std::endl;
    std::cout << "liczba p wynosi: " << liczba_p;
    
    return 0;
}

Mam nadzieję, że pomożewink, lecz lepiej wykorzystać rzutowanie typu char (string to nic innego jak tablica char'ów) na typ int bądź unsigned int a następnie sprawdzanie odpowiednich wartości za pomocą tablicy ASCII. Kod poniżej:

#include <iostream>
#include <string.h>

int main()
{
    std::string tekst;
    int  spacja=0, liczba_a=0, liczba_z=0, liczba_p=0;

    std::cout << "Podaj tekst:";
    getline(std::cin,tekst);

    for(std::size_t i=0; i<tekst.size(); i++)
    {
      switch(static_cast<unsigned int>(tekst.at(i)))
      {
      case 32:
            spacja++;
            break;
      case 97:
            liczba_a++;
            break;
      case 122:
            liczba_z++;
            break;
      case 112:
            liczba_p++;
            break;
      default:
            break;
      }
    }

    std::cout << "liczba spacji wynosi: " << spacja << std::endl;
    std::cout << "liczba a wynosi: " << liczba_a << std::endl;
    std::cout << "liczba z wynosi: " << liczba_z << std::endl;
    std::cout << "liczba p wynosi: " << liczba_p;

    return 0;
}

 

komentarz 26 lipca 2019 przez criss Mędrzec (172,590 p.)

lecz lepiej wykorzystać rzutowanie typu char na typ int bądź unsigned int a następnie sprawdzanie odpowiednich wartości za pomocą tablicy ASCII.

Dlaczego lepiej? Nic nie zmienia, a jest mniej czytelne. 

0 głosów
odpowiedź 25 lipca 2019 przez MsMaciek123 Pasjonat (24,760 p.)
tekst = text;

Przypisujesz inta do stringa.

int text ...
    tekst = text;
    switch(text)
case 'a'

Powiedz mi, kiedy int text, będzie literką?

Po prostu zamień text w switch na tekst.

Polecam ci użyć innych nazw dla tych zmiennych :)

 

0 głosów
odpowiedź 25 lipca 2019 przez martin1724 Użytkownik (690 p.)
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
    string tekst;
    int  spacja, liczba_a, liczba_z, liczba_p;
    cout << "podaj tekst: ";
    spacja = 0;
    liczba_a = 0;
    liczba_z = 0;
    liczba_p = 0;
    getline(cin,tekst);
    switch(tekst)
    {
    case ' ':
            spacja++;
            break;
    case 'a':
            liczba_a++;
            break;
    case 'z':
            liczba_z++;
            break;
    case 'p':
            liczba_p++;
            break;
    }
    cout << "liczba spacji wynosi: " << spacja << endl;
    cout << "liczba a wynosi: " << liczba_a << endl;
    cout << "liczba z wynosi: " << liczba_z << endl;
    cout << "liczba p wynosi: " << liczba_p << endl;
    return 0;
}

po zmienieniu występuje błąd: switch quantity not an integer

 

komentarz 25 lipca 2019 przez tkz Nałogowiec (42,000 p.)
A jak podam 'A'? Albo wpisze 65?

Podobne pytania

0 głosów
1 odpowiedź 205 wizyt
pytanie zadane 13 sierpnia 2019 w C i C++ przez martin1724 Użytkownik (690 p.)
0 głosów
3 odpowiedzi 177 wizyt
pytanie zadane 6 sierpnia 2020 w C i C++ przez ewelinqq Nowicjusz (120 p.)
0 głosów
1 odpowiedź 380 wizyt
pytanie zadane 30 lipca 2019 w C i C++ przez martin1724 Użytkownik (690 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...