Hej próbuję odpalić program z zadanka Zliczacz liter na spoju dostaję informację o błędnej odpowiedzi na idleone segmentation fault. https://ideone.com/Eq7jtl29 Lokalnie kompiluje się bez problemu zarówno g++ jak i przez gcc z parametrem --std=c99 Gdyby ktoś podpowiedział gdzie jest błąd będę wdzięczny
Przy wierszu w którym sugerujesz, że ma być tylko znak mniejszości program wczytywał zawsze o jedną linię mniej niż oczekiwałem przez co zamieniłem go na mniejsze bądź równe. Też się zastanawiałem dlaczego ten getchar łapał EOL z poprzedniej lini. Dla pewności zmieniłem ten parametr i wysłałem ponownie na spoja. Nadal wyświetla się błąd.
scanf("%i", &ilosc_linijek); <-- nie wczytuje znaku końca tej linii.
Możesz to poprawić w poniższy sposób:
scanf("%i\n", &ilosc_linijek);
i wtedy nie musisz już powiększać [sztucznie?] pętli.
Błąd powodowany jest za małą tablicą [o jeden znak]
Trzeba znać tablicę kodów ascii ale nie aż tak dokładnie.
zamiast:
int tablica[122]; // + co najmniej 1, a najlepiej od razu 255
.......
for(int i=0;i<123;i++)
tablica[i] = 0;
można [lepiej?]
int tab ['z' + 1] = {0}; // = {0} zastępuje twoją pętlę zerującą
zamiast:
while((znak = getchar()) != 10)
bezpieczniej
while((znak = getchar()) >= ' ')
bo uwzględnia znak eof w ostatniej linii, bez entera
zamiast:
for(char i=97; i<123; i++){
dużo czytelniej:
for (char i = 'a'; i <= 'z'; i++){
czy też
for (int i = 'a'; i <= 'z'; i++){
itd
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ść.
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!"
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
efektywniejszy sposób na rozwiązanie tego zadania będzie jaki ?
Każdy inny?
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]:
- zrezygnujesz z kasowania
- zrezygnujesz z wyszukiwania - metodą find - za każdym razem od początku stringa
- tylko jednokrotnie przejście stringu i dodawanie wystąpienia danej literki do tablicy wystąpień
to uzyskasz efektywniejsze rozwiązanie.
Witam
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
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
Moj kod: https://ideone.com/9iB1EG22
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
http://ideone.com/5SJVSh66