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

Problem z zadaniem

+1 głos
223 wizyt
pytanie zadane 19 kwietnia 2017 w C i C++ przez niezalogowany

Witam, robię zadanie z:LINK

Mam kod:

#include <iostream>

using namespace std;

int main()
{
	int n;
	cin>>n;
	string q;
	int m[26]={0};
	int d[26]={0};
	for(int i=0; i<n; i++)
	{
		getline(cin, q);
		for(int j=0; j<q.length(); j++)
		{
			if((q[j]>=65) && (q[j]<=90))
			{
				int a = q[j] - 65;
				d[a]++;
			}
			else if((q[j]>=97) && (q[j]<=122))
			{
				int a = q[j] - 97;
				m[a]++;
			}
		}	
	}
	for(int i=0; i<26; i++)
	{
		if(m[i]>=1)
		{
			char c = m[i]+97;
			cout<<c<<" "<<m[i]<<endl;
		}
	}
	for(int i=0; i<26; i++)
	{
		if(d[i]>=1)
		{
			char c = d[i]+65;
			cout<<c<<" "<<d[i]<<endl;
		}
	}
}

Nie działa, jak wpisze przykład, to pobiera tylko 

ala ma kota

I wypisuje od razu liczby, i to nawet złe.

Pozdrawiam i z góry dzięki za każdą pomoc.

1
komentarz 19 kwietnia 2017 przez vector Dyskutant (9,200 p.)

Błąd jest dosyć prosty mianowicie cin>>n; wczyta liczbę do zmiennej n pozostawiając w buforze wejścia znak '\n'. getline przed "ala ma kota" napotka znak '\n' i zwróci Ci pusty ciąg. Można to poprawić za pomocą std::istream::ignore.

1
komentarz 19 kwietnia 2017 przez mokrowski Mędrzec (158,940 p.)
edycja 19 kwietnia 2017 przez mokrowski

Dlaczego robisz to "na piechotę"? Masz przecież takie kontenery jak:

1. vector - zachowujący kolejność i wykonujący automatyczną alokację pamięci.

2. unordered_map - umożliwiający w bardzo łatwy sposób wykonanie przy unikalnym kluczu (litera), obliczenie jest wystąpień.

3. copy_if - algorytm umożliwiający skopiowanie danych tylko tych które chcesz później wyświetlić (czyli z niezerowym licznikiem i nie spacja).

4. sort - wykona sortowanie danych do wyświetlenia.

Poza tym te "magiczne" 26, 97, 122, 65, 90. To jest popelina

Po wczytaniu n, powinno być:

//...
#include <limits>
//...
std::cin > n;
std::cin.clear();                                                           
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

 

1 odpowiedź

–1 głos
odpowiedź 19 kwietnia 2017 przez degrek Bywalec (2,380 p.)
wybrane 19 kwietnia 2017
 
Najlepsza
Poprawione błędy opatrzone komentarzem, w razie niejasności, pytaj ;)

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin>>n;
    getchar(); //musisz złapać "Entera"
    string q;
    int m[26]={0};
    int d[26]={0};
    for(int i=0; i<n; i++)
    {
        int zmienna = 0;
        getline(cin, q);
        for(int j=0; j<q.length(); j++)
        {
            zmienna = int(q[j]); // zamiana litery na cyfre reprezentujaca ja w kodzie ASCII
            if((zmienna>=65) && (zmienna<=90))   
            {
                int a = zmienna - 65;
                d[a]++;
            }
            else if((zmienna>=97) && (zmienna<=122))
            {
                int a = zmienna - 97;
                m[a]++;
            }
        }
    }
    for(int i=0; i<26; i++)
    {
        if(m[i]>=1)
        {
            char c = i+97;   // tutaj masz brac po kolei litery a Ty dodawales do wartosci spod tablicy
            cout<<c<<" "<<m[i]<<endl;
        }
    }
    for(int i=0; i<26; i++)
    {
        if(d[i]>=1)
        {
            char c = i+65;  // to samo :D
            cout<<c<<" "<<d[i]<<endl;
        }
    }
}

 

Podobne pytania

0 głosów
0 odpowiedzi 708 wizyt
pytanie zadane 29 września 2021 w C i C++ przez diedassel Użytkownik (570 p.)
0 głosów
1 odpowiedź 533 wizyt
pytanie zadane 20 marca 2018 w C i C++ przez kuba1245677 Obywatel (1,080 p.)
0 głosów
0 odpowiedzi 1,655 wizyt
pytanie zadane 1 grudnia 2017 w C i C++ przez Krystek102 Bywalec (2,440 p.)

93,600 zapytań

142,524 odpowiedzi

322,993 komentarzy

63,085 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

Kursy INF.02 i INF.03
...