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

SPACJE - zadanie ze SPOJA

Object Storage Arubacloud
+1 głos
696 wizyt
pytanie zadane 23 września 2018 w C i C++ przez stones321 Nowicjusz (200 p.)

Cześć! Napisałem rozwiązanie do zadania: https://pl.spoj.com/problems/JSPACE/

Program spełnia przykładowy test oraz wszystkie, które znalazłem w internecie pod innymi wątkami. Jestem początkujący, bardzo proszę o objaśnienie. Dzięki za pomoc.

 

#include <iostream>

using namespace std;

int main()
{
    string napis;
    while(getline(cin,napis))
    {
        int dlugosc=napis.length();
        int i=0;
        while(i<dlugosc)
        {
            if(napis[i]==32)
            {
                napis[i+1]=toupper(napis[i+1]);
                for(int j=i;j<dlugosc;j++)
                {
                    napis[j]=napis[j+1];
                    i=-1;
                }
            }



        i++;
        }

         cout<<napis<<"\n";

    }

    return 0;
}

 

komentarz 23 września 2018 przez bimbrownik Mądrala (5,180 p.)
Spróbuj zamienić "\n" na endl, które oprócz kończenia linii też czyści bufor. Jaki błąd wyrzuca SPOJ?
komentarz 23 września 2018 przez Aisekai Nałogowiec (42,190 p.)

@stones321, przepuść sobie do testu takie coś (skopiuj 1-1, ze spacja na końcu):

"Ale ma kota " <- bez ".

komentarz 23 września 2018 przez stones321 Nowicjusz (200 p.)

@Ceelmah,
 zmieniłem, nic nie pomogło. Spoj wyrzuca błędną odpowiedź.

komentarz 23 września 2018 przez stones321 Nowicjusz (200 p.)
@Aisekai

Wrzuciłem - na moje oko działa...
komentarz 23 września 2018 przez RafalS VIP (122,820 p.)
Spacje na końcu to nie problem. Testowałem.
komentarz 23 września 2018 przez Aisekai Nałogowiec (42,190 p.)
Ok, mój błąd. A co w przypadku, gdy na wejściu zdanie zaczyna się z małej litery? Czy pierwszy znak powinien zostać zastapiony wielka literą?
komentarz 23 września 2018 przez RafalS VIP (122,820 p.)
Nie
komentarz 23 września 2018 przez mokrowski Mędrzec (155,460 p.)

@stones321, o wiele zgrabniej to wygląda jeśli zaimplementujesz to na iteratorach.

komentarz 23 września 2018 przez RafalS VIP (122,820 p.)
Ja tam twierdze, że całe to rozwiązanie jest strasznie przekombinowane i pasowałoby je gruntownie przerobić.

Lecisz po napisie, jak spacja to nie wypisujesz, jak nie-spacja to sprawdzasz jaki był poprzedni i na tej podstawie wypisujesz toupper lub normalnie.

Nie potrzeba iterować kilka razy po tym samym stringu. Nie potrzeba nic przepisywać. Na dobrą sprawe mógłbyś nawet nie zapisywać stringa tylko wczytywać po literce i wypisywać na bieżąco :P

1 odpowiedź

0 głosów
odpowiedź 23 września 2018 przez RafalS VIP (122,820 p.)
edycja 23 września 2018 przez RafalS

Wychodzisz poza zakres stringa w dwóch miejscach:

napis[i + 1]
napis[j + 1]

a maksymalne i oraz j wynosi napis.length() - 1.

Działało to troszkę przez przypadek, bo bazowało na napis[dlugosc] == ' ', co nie jest gwarantowane w żaden sposób.

A poza tym to rozwiązanie jest strasznie przekombinowane :P. Iterujesz po całym stringu kilka razy, przepisujesz wartości podczas gdy można całość zrobić jedną iteracją.

komentarz 23 września 2018 przez niezalogowany
Dlatego należy go skrócić o ilość usuniętych spacji.
komentarz 23 września 2018 przez RafalS VIP (122,820 p.)
Aczkolwiek smieszne jest ze jak do wyniku dokleisz na koniec spacje to spoj przyjmuje :D
komentarz 23 września 2018 przez niezalogowany

SPOJ ignoruje niektóre białe znaki, bo jest mniej wątpliwości np w takich przypadkach:

|0 1 2 3 4 5 | // źle
|0 1 2 3 4 5| // dobrze

To całkiem przydatne ;)

komentarz 24 września 2018 przez stones321 Nowicjusz (200 p.)

@Hipcio,

Jak to zrobić? Przekopiować do innego stringa?

komentarz 26 września 2018 przez j23 Mędrzec (194,920 p.)
int main()
{
    std::string napis;
     
    while(std::getline(std::cin, napis))
    {
        char prev_c = 0;
        
        for(char c : napis)
        {
            if(c != ' ') std::cout << (prev_c == ' ' ? static_cast<char>(toupper(c)) : c);
            prev_c = c;
        }
        
        std::cout << '\n';
    }
}

 

Podobne pytania

0 głosów
1 odpowiedź 358 wizyt
pytanie zadane 11 grudnia 2020 w C i C++ przez KKEE Nowicjusz (120 p.)
0 głosów
1 odpowiedź 404 wizyt
pytanie zadane 15 czerwca 2020 w Python przez Piotr Patek Nowicjusz (170 p.)
0 głosów
1 odpowiedź 775 wizyt
pytanie zadane 19 października 2018 w SPOJ przez Archiwista Początkujący (250 p.)

92,572 zapytań

141,422 odpowiedzi

319,644 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!

...