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

C++, program, zły wynik

VPS Starter Arubacloud
0 głosów
629 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,020 p.)
A jak podam 'A'? Albo wpisze 65?

Podobne pytania

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

93,006 zapytań

141,973 odpowiedzi

321,254 komentarzy

62,345 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...