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

Spacje SPOJ - czemu to nie działa ?

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
837 wizyt
pytanie zadane 20 marca 2020 w SPOJ przez Sashimo Użytkownik (740 p.)

Dla czego program nie usuwa znaków jeśli podaję jego pozycję ?

 

#include <iostream>
#include <string>
#include <algorithm>


using namespace std;

int main()
{

    string napis;
    char spacja=' ';

    getline(cin,napis);
    cout << napis << endl;

    size_t pozycja = napis.find(spacja);

    do{

          cout << "pozycja: " << pozycja <<endl; // dla testu
          pozycja = napis.find(spacja,pozycja+1);
          napis.erase(pozycja,1);

    }while(pozycja != string::npos);

    return 0;
}


 

 

Dodatkowo mam pytanie czy w CodeBlocks jest opcja żeby samo wyrównywało mi linie ?

2 odpowiedzi

+1 głos
odpowiedź 20 marca 2020 przez SimiVoid Pasjonat (19,790 p.)
wybrane 20 marca 2020 przez Sashimo
 
Najlepsza

Pętlę do while przerobiłem na while i działa jak należy:

while(auto pozycja = napis.find(spacja, pozycja), pozycja != string::npos){

        cout << "pozycja: " << pozycja <<endl; // dla testu

        napis = napis.erase(pozycja,1);
    }

I usuwasz linijkę 17. I zapamiętaj że std::string::erase nie modyfikuje konkretnego stringa tylko zwraca rezultat.

komentarz 20 marca 2020 przez Whistleroosh Maniak (57,400 p.)
To nie jest tak, że erase właśnie modyfikuje stringa?
komentarz 20 marca 2020 przez SimiVoid Pasjonat (19,790 p.)
Według dokumentacji powinno tak działać, ale z doświadczenia wiem, że to działa tak tylko w kompilatorze clang a w pozostałych są błędy i to nie działa (tak jak std::thread)
komentarz 20 marca 2020 przez Sashimo Użytkownik (740 p.)

@SimiVoid,

 

kopiuję twój kod i nie działa :

#include <iostream>
#include <string>
#include <algorithm>


using namespace std;

int main()
{

    string napis;
    char spacja=' ';

    getline(cin,napis);
    cout << napis << endl;

   while(auto pozycja = napis.find(spacja, pozycja), pozycja != string::npos){
 
        cout << "pozycja: " << pozycja <<endl; // dla testu
 
        napis = napis.erase(pozycja,1);
    }

    return 0;
}


jak usunę linię 17 to czym będzie "pozycja"?

std::string::erase  to z kursu wiem że ma usuwać dane znaki :P

https://youtu.be/ZGtdSv7Ktt4?t=1172

PS: ciężko to wszystko ogarnąć tak na początku XD i tu mam pytanie czy rozwiązywanie zadań na spoju w taki sposób jak ja to robię jest w porządku? Ja robię to w taki sposób :

- piszę sam ile mogę

- szukam informacji w google i na forum

- sklejam to wszystko w całość i sprawdzam czy działa

Czy to jest dobry sposób na naukę ? Jestem ogólnie początkującym bo może spędziłem nad kodem z 20h (łącznie z kursem)

 

 

 

 

komentarz 20 marca 2020 przez Whistleroosh Maniak (57,400 p.)

Spróbuj tak:

#include<algorithm>
#include<iostream>
#include<string>

using namespace std;

int main()
{

    string napis;
    char spacja = ' ';
    int pozycja = 0;

    getline(cin, napis);

    while ((pozycja = napis.find(spacja, pozycja)) != string::npos)
    {
        cout << "pozycja: " << pozycja << endl;
        napis = napis.erase(pozycja, 1);
    }

    cout << napis << "\n";

    return 0;
}

 

komentarz 20 marca 2020 przez SimiVoid Pasjonat (19,790 p.)
Musisz załączyc obsługę c++11, ponieważ w tym może być problem
0 głosów
odpowiedź 20 marca 2020 przez Sashimo Użytkownik (740 p.)

ok program działa ale z jednym mam problem obecnie co zrobić żeby tekst wpisywać z enterem tak jak  w zadaniu ?

https://pl.spoj.com/problems/JSPACE/

 

tu mój kod :

 

#include <iostream>
#include <string>
#include <algorithm>


using namespace std;



   int main()
{

    string napis;
    char spacja = ' ';
    int pozycja = 0;


    getline(cin, napis);

    while ((pozycja = napis.find(spacja, pozycja)) != string::npos)
    {

        if((napis[0]>=97)&&(napis[0]<=122))
            {
                napis[0]=napis[0]-32;
            }
        if((napis[pozycja+1]>=97)&&(napis[pozycja+1]<=122))
            {
                napis[pozycja+1]=napis[pozycja+1]-32;
            }
        napis = napis.erase(pozycja, 1);
    }


    cout << napis << "\n";



    return 0;
}


 

komentarz 20 marca 2020 przez Whistleroosh Maniak (57,400 p.)

Dodajesz dodatkową pętlę:

while(getline(cin, napis))

I w nią wrzucasz to co dotychczas napisałeś

komentarz 20 marca 2020 przez Sashimo Użytkownik (740 p.)
ok tylko jak zakończyć program bo tak też próbowałem

i w tym wypadku enterem lecę w nieskończoność :P
komentarz 20 marca 2020 przez Whistleroosh Maniak (57,400 p.)
SPOJ przyjmie to w takiej formie, chyba że chcesz to robić dla siebie a nie na SPOJa. Wtedy musiałbyś ustawić jakiś specjalny znak, który oznaczałby koniec wczytywania danych
komentarz 20 marca 2020 przez Sashimo Użytkownik (740 p.)
edycja 20 marca 2020 przez Sashimo

pętla nie działa ale dodałem" ." jako koniec tylko że teraz usuwa mi kropkę i tekst od nowej linii nie jest pisany z dużej litery

 

(getline(cin, napis,'.')) o czym nawet nie wiedziałem że coś takiego jest

//wczytywanie ciagu znaków do momentu
	//napotkania znaku x
	getline(cin, tekst, 'x');
#include <iostream>
#include <string>
#include <algorithm>


using namespace std;



   int main()
{

    string napis;
    char spacja = ' ';
    int pozycja = 0;



getline(cin, napis,'.');







    while ((pozycja = napis.find(spacja, pozycja)) != string::npos)
    {

        if((napis[0]>=97)&&(napis[0]<=122))
            {
                napis[0]=napis[0]-32;
            }
        if((napis[pozycja+1]>=97)&&(napis[pozycja+1]<=122))
            {
                napis[pozycja+1]=napis[pozycja+1]-32;
            }
        napis = napis.erase(pozycja, 1);

    }



    cout << napis ;



    return 0;
}


 

komentarz 20 marca 2020 przez Whistleroosh Maniak (57,400 p.)

Przyznaję, że nie wiem dlaczego to nie działa. Znaczy na pewno nie zerujesz zmiennej pozycja przy każdej iteracji tej pierwszej pętli while, ale nawet jak to poprawię to i tak SPOJ nie przyjmuje. To musi być coś z zamianą liter na wielkie, dlatego ja skorzystałbym tu z bezpieczniejszego podejścia:

#include<algorithm>
#include<iostream>
#include<string>
 
using namespace std;
 
int main()
{
 
    string napis;
    char spacja = ' ';
    int pozycja = 0;
 
    while(getline(cin, napis))
    {
        pozycja = 0;
        while ((pozycja = napis.find(spacja, pozycja)) != string::npos)
        {
            if(pozycja + 1 < napis.length())
                napis[pozycja+1]  = toupper(napis[pozycja+1]);

            napis = napis.erase(pozycja, 1);
        }
 
        cout << napis << "\n";
    }
 
    return 0;
}

 

1
komentarz 20 marca 2020 przez Sashimo Użytkownik (740 p.)
twój sposób zadziałał :) no nic poległem tutaj ale zawsze czegoś się nauczyłem :)

Podobne pytania

0 głosów
1 odpowiedź 908 wizyt
pytanie zadane 19 października 2018 w SPOJ przez Archiwista Początkujący (250 p.)
+1 głos
1 odpowiedź 538 wizyt
pytanie zadane 2 kwietnia 2023 w SPOJ przez skyynet Początkujący (410 p.)
0 głosów
2 odpowiedzi 862 wizyt
pytanie zadane 4 września 2018 w SPOJ przez Piotr Błaszczak Bywalec (2,890 p.)

93,430 zapytań

142,427 odpowiedzi

322,652 komentarzy

62,792 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

...