Usuwanie ze stringa spacji oraz jego modyfikacja

0

Hej, mam problem z pewnym zadaniem ze spoj http://pl.spoj.com/problems/JSPACE/ program przechodzi wszystkie testy, modyfikuje tekst poprawnie, ale niestety nie przechodzi na spoju, bo ciągle wyrzuca błąd niepoprawny wynik. Jeśli ktoś mógłby coś poradzić, byłbym bardzo wdzięczny, bo już nie wiem co robię źle. Wczytuje string poprzez getline, jak i wczytywałem też poprzez getline w while ale oba przypadki nie przechodzą.

Struktura służy tylko do testowania poprawności algorytmu.

Oto mój kod:

 
#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
using namespace std;

struct TestCase {
    string wejscie;
    string wyjscie;  
} daneTestowe[] = {
    { 
        "wyraz", 
        "wyraz"
    },
    {
        "wyraz ",
        "wyraz"
    },
    {
        " wyraz",
        "Wyraz"  
    },
    {
        "Ide na spacer z psem. Do zobaczenia.",
        "IdeNaSpacerZPsem.DoZobaczenia."  
    },
    {
        "Dzisiaj jest czwartek,",
        "DzisiajJestCzwartek,"
    },
    {
        "A jutro bedzie piatek.",
        "AJutroBedziePiatek."    
    },
    {
        "a to   jest tekst   z duza iloscia   spacji.\na  tu jest  druga linia",
        "aToJestTekstZDuzaIlosciaSpacji.\naTuJestDrugaLinia"    
    },
    {
        "aaa bbb     ccc          ddd e fff",
        "aaaBbbCccDddEFff"    
    },
    {
        "A A A",
        "AAA"    
    },
    {
        "zadanie         jakies",
        "zadanieJakies"    
    },
    {
        "tekst\n\ntekst",
        "tekst\n\ntekst"    
    },
    {
        "pierwszy wyraz",
        "pierwszyWyraz"    
    },
    {
        "dZiSiaj jest czwartek,\na jUTRo bEdZie piatek.",
        "dZiSiajJestCzwartek,\naJUTRoBEdZiePiatek."    
    }
};

const int ileTestow = sizeof(daneTestowe)/sizeof(daneTestowe[0]);

string przeksztalc(string nowy);

int main() {
    // test case part
    int ileZle = 0;
    for(int i = 0; i < ileTestow; ++i) {
        string wynik = przeksztalc(daneTestowe[i].wejscie);
        if(wynik != daneTestowe[i].wyjscie) {
            cout << "nadal jest zla dla wejscia: [" << daneTestowe[i].wejscie << ']' << endl;
            cout << "wyszlo                    : [" << wynik << ']' << " size: " << wynik.size() << endl;
            cout << "powinno                   : [" << daneTestowe[i].wyjscie << ']' << " size: " << daneTestowe[i].wyjscie.size() << endl;     
            ileZle++;
        }    
    }
    cout << "obecnie jest zle dla " << ileZle << " przypadkow " << endl;
    // test case part 

    /*string sms;
    
    getline(cin, sms);
    cout << przeksztalc(sms) << endl;
    */
 
    return 0;
}

string przeksztalc(string nowy) {
    string output = "";
/*
    for(unsigned int i = 0; i < nowy.size(); i++) {
        if(nowy[i] == ' ') {
            nowy.erase(i, 1);    
            nowy[i] = toupper(nowy[i]);
        }
    }
  */
    for(int i = 0; i < nowy.length(); ++i) {
        if(nowy[i] != ' ') output += nowy[i];
        if(nowy[i] == ' ') nowy[i+1] = toupper(nowy[i+1]);
    }

    return output;
}

0

Ale co ten kod ma wspólnego z zadaniem na spoju? o_O Zadanie jest trywialne a ten kod to jakiś turbo WTF.

#include <iostream>
#include <sstream>
using namespace std;

int main() {
	string input;
	while(getline(cin, input)){
		istringstream inputStream(input);
		string word;
		while(inputStream>>word){
			word[0]=toupper(word[0]);
			cout<<word;
		}
		cout<<"\n";
	}
	return 0;
}
0

Nie wiem czemu Shalom w swoich wypowiedziach zawsze każdego równasz z ziemią, zamiast pomóc, wskazać błąd co się zrobiło źle i pokierować na dobrą ścieżkę. Nikt nagle nie staje się mistrzem programowania :/
Btw Twój kod również nie przechodzi na spoj i pokazuje "błędna odpowiedź", nie zmieniamy pierwszej litery zdania, tylko tą która się znajduje po spacji.
a ze swoim szukam pomocy, aby ktoś mnie pokierował, czy o czymś nie zapomniałem, że w spoju nie chce go zaliczyć

1
#include<iostream>
#include<string>
#include<ctype.h>
using namespace std;
 
int main()
{
	string text;
	while(getline(cin, text))
	{
		for(unsigned i=0;i<text.length();i++)
		{
			while(text[i]==' ')
			{
				text.erase(i, 1);
				text[i]=toupper(text[i]);
			}
			
		}
		cout << text << endl;
	}
} 
2

Albo kompletny prymityw:

#include <cstdio>
#include <cctype>
using namespace std;

int main()
  {
   int ch,sp=1;
   while((ch=getchar())!=EOF)
     {
      if(ch==' ') sp=1;
      else if(ch=='\n') putchar('\n');
      else if(!sp) putchar(ch);
      else { putchar(toupper(ch)); sp=0; }
     }
   return 0;
  }
1

@jackoi ale twój kod nie nadaje się do niczego. Tam nie ma miejsca gdzie jest błąd. Ten cały kod to jeden wielki błąd.
Mój kod jest prawie dobry, z dokładnością do błędu w zadaniu, który to błąd jest opisany wyraźnie w komentarzach pod zadaniem. Poprawienie go jest trywialne.
Twój kod jest bez sensu bo bazuje na hardkodowanych testach. Równie dobrze mógłbyś w ogóle ręcznie sobie to "rozwiązać" i wypisywać hardkodowane wyniki :D
Popatrz na swój kod a następnie na 3 kody podane przez użytkowników w tym temacie. Widzisz jakieś punkty wspólne? Bo te 3 kody są do siebie bardzo podobne, a twój kod nijak do zadnego z nich...

0

Chciałbym się dowiedzieć, dlaczego według Ciebie mój pomysł na algorytm jest do niczego choć jest bardzo podobny do tych zaproponowanych, dla testów działał choć jakiś błędzik i tak się pojawiał?
A dlaczego używam tych hardkorowanych testów jak to mówisz, dlatego je używam, bo wziąłem je z forum spoju dla testów co tam ludzie proponowali input oraz poprawny output.

Dla mnie pomocne są odpowiedzi w stylu "tutaj zrobiłeś błąd, bo robisz tak i tak i przez to omijasz coś tam" a nie w stylu "twój kod się nie nadaje do niczego, bo tak jest prościej napisać"

Mam:

 
string output = "";
for(int i = 0; i < nowy.length(); ++i) {
        if(nowy[i] != ' ') output += nowy[i];  // przepisz do output znak jesli rozny od spacji
        if(nowy[i] == ' ') nowy[i+1] = toupper(nowy[i+1]);   // z malej na duza litere oraz  ( erase + toupper ) 
    }

Powinno być poprawnie (podpowiedz Jerylee):

for(unsigned i=0;i<text.length();i++) {
            while(text[i]==' ') {
                text.erase(i, 1);
                text[i]=toupper(text[i]);
            }
}

Miałem również, zakomentowany tekst:

for(unsigned int i = 0; i < nowy.size(); i++) {
        if(nowy[i] == ' ') {    //  powinno byc while zamiast if
            nowy.erase(i, 1);    
            nowy[i] = toupper(nowy[i]);
        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1