Ok zaakceptowane, dzięki wielkie za pomoc . Swoją drogą szkoda, że w treści zadania nie było ujęte, żeby na końcu każdego wiersza była spacja, zwłaszcza, że nie ma to zdaje się wpływu na wynik końcowy. Jeszcze jedno pytanie bo nie do końca rozumiem - cin.sync(); użyłem gdy natrafiłem na problem z opuszczeniem inputu w pierwszym obrocie pętli i wyguglowałem podobny przypadek, po czym zastosowałem to u siebie w kodzie i zadziałało, ale dalej nie do końca kumam o co chodzi i czemu lepiej użyć cin.ignore(); mógłbyś mi przybliżyć ten temat (ew. podesłać miejsce gdzie jest to klarownie wytłumaczone)?
Bardzo ciężki kawałek kodu napisałeś Ci powiem. Widziałeś chociaż swój out dla przykładu spod zadania? :
-1078343384
a 7
k 1
l 2
m 2
o 1
p 1
s 1
t 1
4
na początku jakaś liczba, poprzedzona tabulacjami, ostatniej litery brakuje. O do ... while możesz spokojnie zapomnieć w programowaniu - więcej z nim kłopotów niż pożytku.
Ja, jako "stary wyjadacz" czytałbym te dane np. tak:
#include <iostream>
using namespace std;
int main() {
int ile;
char ch;
cin >> ile;
while(cin >> ch){
//zrób to coś z ch
}
return 0;
}
Masz wczytane dane w 5 linijkach, bez białych znaków, możesz spokojnie zająć się liczeniem ile razy która była.
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