4 / 4
Mar 2017

Witam!
Próbuję rozwiązać zadanie z nadaktywną literą. Kiedy już wydaje mi się, że jestem coraz bliżej rozwiązania, natrafiam na dziwny błąd. Mianowicie dla
input
Ala ma kota, ale kot nie. - program działa normalnie i zwraca a
Ala ma kota, ale kot nie . - program się wysypuje
(Różnica w spacji na końcu przed kropką)

include

include

include

using namespace std;

char literka(string a)
{ int c, maksj=0, maksd=0;
char b, maxi;
for (int ile=0;ile<a.length();ile++)
{
c=0;
for (int i=0; i<a.length();i++)
{
b=a[ile];
if((b==(char)a[i]) && ((char)a[i]!=' '))
c++;
}
if (c>=maksj)
{maksj=c;
maxi=b;}
else if (c>=maksd)
maksd=c;
}

if (maksj>2*maksd)
return maxi;
else return '0';
}

int main()
{ int i=0, zdania=0, j=0;
string zdanie,a;

getline(cin,zdanie);
transform(zdanie.begin(),zdanie.end(),zdanie.begin(),::tolower);

for (int ile=0;ile<zdanie.length();ile++)
    if(zdanie[ile]=='.')
        zdania++;
char dominujace[zdania];
while (zdanie[j]!='\0')
    {i=0;
        while (zdanie[i]!='.')
        i++;
a=zdanie.substr(0,i);
dominujace[j]=literka(a);
zdanie.erase(0,i+2);
j++;
}

for (i=0;i<zdania;i++)
{if (dominujace[i]!='0')
cout << i+1 << " - " << dominujace[i] << endl;
else cout << i+1 << " - BRAK" << endl;
}
return 0;
}

  • created

    Mar '17
  • last reply

    Mar '17
  • 3

    replies

  • 513

    views

  • 3

    users

Dla mnie podejrzanie wygląda ta pętla:
while (zdanie[j] != '\0') {
++j;
}

stringi w C++ w odróżnieniu od c_stringów nie kończą się znakiem '\0'. Jeśli o to Ci chodziło, to zastąp ją tym:
while (j < zdanie.length()) {
++j;
}

Dobra, zamiana w while'u sprawiła, że program przestał się wysypywać. Dzięki wielkie! :wink:

musiałem też zmienić na "i+1", ale niestety wywala błędną odpowiedź :confused:

EDIT:
Dla pierwszych 4 zdań jest wszystko dobrze, a dla piątego zaczyna coś świrować. No i gdy wypisałem całą tablicę
char dominujace[zdania] to wyskoczyło mi 7 znaków zamiast 5 i kończyła się znakiem |