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

Problem z zadaniem

Object Storage Arubacloud
+1 głos
153 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 (155,460 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 337 wizyt
pytanie zadane 29 września 2021 w C i C++ przez diedassel Użytkownik (570 p.)
0 głosów
1 odpowiedź 434 wizyt
pytanie zadane 20 marca 2018 w C i C++ przez kuba1245677 Obywatel (1,080 p.)
0 głosów
0 odpowiedzi 1,269 wizyt
pytanie zadane 1 grudnia 2017 w C i C++ przez Krystek102 Bywalec (2,440 p.)

92,573 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 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!

...