52 / 85
Sep 2016

Faktycznie o jeden element za mało zadeklarowałem :slight_smile: dzięki wielkie. Naprawdę fajne te sposoby z czyszczeniem tablicy i przekształcaniem liter na ich odpowiedniki ascii nie znałem ich wcześniej. Jeszcze raz dzięki :slight_smile:

1 month later

Hej,
Pomoże ktoś z zadaniem?
Mianowicie...
To jest program który wykasuje litere 'a' ze zdania. (rozwiazanie tego problemu rozwiążę mój problem z całym zadaniem
(...)
string b = "Karde ale wtopa";
char c;
c = 97;
size_t pozycja=b.find(c);
while(pozycja!=string::npos);
{
b.erase(pozycja,1);
//cout<<pozycja; //dla sprawdzenia
size_t szukaj=b.find(c);
}
(...)

Okazuje się że pod zmienną pozycja po wykasowaniu wszystkich 'a' ze zdania, pojawia się jakaś dziwna wielka wartość 186446744(...). I pętla się nigdy nie kończy, o co chodzi ?

Można też się posłużyć może trochę prostszym kodem:

(...)
string b = "Karde ale wtopa";
char c;
c = 97;
for(int i = 0; i<10; i++)
{
size_t szukaj=b.find(c);
cout<<szukaj;
if(szukaj!=string::npos);
b.erase(szukaj,1);
}
(...)

szukaj wypisze na której pozycji znajduje się 'a' a następnie gdy go nie ma - jakąś wielką wartość.

Rzeczywiście bardzo dziwna.
Jak policzysz: 2⁶⁴ może będzie mniej dziwna?

Ale tym twoim sposobem nie widzę szans na zaliczenie tego zadania, chyba, że dane wejściowe są [bardzo] małe a limit czasu [bardzo] duży - nie sprawdzałem.

Nie znalazł, na żadnej pozycji, więc podstawił taką dużą wartość, która jest dużo większa od każdej rozsądnej [dopuszczalnej] długości stringa.

Dlaczego więc wyrażenie if(szukaj!=string::npos); czy while(szukaj!=string::npos); nadal zwraca wartość true? ;<

Hmm
Może, dlatego, że w tak małym fragmencie kodu masz aż dwa poważne błędy, aż się boję pomyśleć ile w całym.
Zobacz sam:
http://ideone.com/gKBVPL30

Ale jedno zgadza się: "... Ale wtopa!" :wink:

Zdecydowanie za długo przed komputerem :joy:
btw; dostałem AC z time 0:00 z tą dziwną moją metodą :stuck_out_tongue:

Faktycznie, danych w tym zadaniu jest jak kot napłakał i uzyskanie czasu powyżej 0.00 w c/c++ tego zadania jest chyba niewykonalne. Dużo łatwiej w innych językach:
http://pl.spoj.com/ranks/JZLICZ/start=384012 i poniżej.

PS
Dziwna metoda, w sensie bardzo nieefektywna, a 0.00 bo małe testy.

Faktycznie musi być tych danych bardzo mało.
Metoda wydawała mi się efektywna z tego względu że po każdym przejściu pętli, string do przeszukiwania będzie coraz mniejszy.
W sensie:
Znajdź 'a', licz ile razy wystąpi 'a', usuń wszystkie 'a' ze stringa, wypisz ile razy wystąpił 'a';
String mniejszy o ilość wystąpień 'a'
Znajdź 'b' licz ile razy wystąpi 'b', usuń wszystkie 'b' ze stringa, wypisz ile razy wystąpił 'b';
String mniejszy o ilość wystąpień 'b'
itd
pętla przejdzie tyle razy ile szukamy literek. (około 50)
Dopiero zaczynam zabawę z programowaniem stąd pewnie błędne założenia :smiley:
efektywniejszy sposób na rozwiązanie tego zadania będzie jaki ?

Każdy inny? :wink:
Zadanie nie polega na znalezieniu szukanej literki, policzeniu jej i wypisaniu poprawionego tekstu, a Ty mniej więcej to robisz. Jeżeli więc zrobisz tylko jedno z poniższych [lub wszystko]:

  1. zrezygnujesz z kasowania
  2. zrezygnujesz z wyszukiwania - metodą find - za każdym razem od początku stringa
  3. tylko jednokrotnie przejście stringu i dodawanie wystąpienia danej literki do tablicy wystąpień

to uzyskasz efektywniejsze rozwiązanie.

7 months later

Witam :slight_smile:
Mam problem z tym zadankiem, a konkretniej z vectorami. Sprawdzalam krok po kroku gdzie jest blad i zaznaczylam ten fragment, jakby ktos wiedzial o co chodzi to bylabym bardzo wdzieczna za kazda odpowiedz :slight_smile:
PS Nie zwracajcie uwagi na to, ze najpierw wyswietlane sa duze litery - jeszcze nie napisalam tego w kodzie, zajme sie tym potem.
PS2 Kod jest w trybie roboczym, wiec moze nie byc do konca jasny. Potem ladnie go streszcze i bedzie cacy :blush:
Moj kod: https://ideone.com/9iB1EG22

Tak, tam jest błąd. Powinno być:

tab.insert(tab.begin()+j+1, x);

Jednak nic to nie da jeśli nie poprawisz błędu, który jest powyżej. No i, jak słusznie zauważyłaś, należy zająć się tymi WIELKIMI literami :slight_smile:

Sprawdzam, analizuje i cos mi nie trybi :smiley: Jakas wskazowka, gdzie jest jeszcze blad?

Wskazówka: co znajduje się w elemencie vectora o indeksie równym jego rozmiarowi?

1 month later

Cześć.
Mam mały problem z tym zadankiem, sprawdzałem na wielu testach, wszystko w porządku. Na ideone też jest ok. Spoj mi nie przyjmuje wyrzuca błąd kompilacji. Nie ma problemu, moge to zrobić w inny sposób, jednak jestem ciekaw, dlaczego to nie chce pyknąć, za wszystkie uwagi byłbym bardzo wdzięczny :wink:
http://ideone.com/5SJVSh66

  1. Kliknij na swoim zgłoszeniu na napis błąd kompilacji i wyświetli się powód błędu - wyjście kompilacji.
  2. Użyj nowszej wersji kompilatora c++, na SPOJu jest dostępny 6.3.
  3. Ewentualnie popraw to co powoduje błąd kompilacji i wtedy powinno też pyknąć na starym c++ v 4.3

PS
Zarówno na ideone.com jak i u siebie zapewne użyłeś nowszych kompilatorów (> 4.3) niż na SPOJ'u.

Dzięki śliczne, działa, wystarczyło wybrać 6.3.
Z tym błędem kompilacji też już wcześniej próbwałem, ale nie do końca rozumiałem co mi wyskakiwało, za małą wiedze mam na ten moment.

14 days later

Hey.
Dostaje błędną odpowiedź, chociaż sprawdzałem na różnych testach i według mnie działa poprawnie.

`#include

using namespace std;

int main()
{
int ile,dlugosc;
string zdanie;
cin>>ile;

int tab_male[26]= {};
int tab_duze[26]= {};
char male='a';
char duze='A';

for(int i=0; i<ile; i++)
{
    cin.sync();
    getline(cin, zdanie);
    dlugosc=zdanie.length();

    for(int m=97;  m<=122; m++)
    {
        for(int k=0; k<dlugosc; k++)
        {
            if(zdanie[k]==m) tab_male[m-97]+=1;
        }
    }

    for(int m=65;  m<=90; m++)
    {
        for(int k=0; k<dlugosc; k++)
        {
            if(zdanie[k]==m) tab_duze[m-65]+=1;
        }
    }
}

for(int i=0; i<26; i++)
{
    if(tab_male[i]==0) ;
    else cout<<male<<" "<<tab_male[i]<<endl;
    male+=1;
}

for(int i=0; i<26; i++)
{
    if(tab_duze[i]==0) ;
    else cout<<duze<<" "<<tab_duze[i]<<endl;
    duze+=1;
}
return 0;

}
`