@marmal95:
Odpaliłem twój program i wcale nie działa poprawnie dla testów z zadania. Dla testów z zadania zwraca:
a 5
k 1
l 1
m 1
o 1
t 1
Przez twoje kombinacje z cin program źle wczytuje linie. Chodzi mi o linijki:
cin.sync();
cin.clear();
4 months later
Dla przykładowego testu z treści zadania wypisujesz zły wynik - sprawdź na http://ideone.com34
Prawdopodobnie wpisujesz dane "z ręki" i wtedy błędu nie widać, ale tak SPOJ nie działa. Czy umiesz sobie wyobrazić, że ktoś tam siedzi i wpisuje dane wejściowe na klawiaturze do programu?
10 months later
2 months later
Witam. SPOJ nie chce zaakceptować mojego kodu (błędna odpowiedź), a pomimo usilnych prób i dużej ilości testów dalej nie jestem w stanie znaleźć błędu. Czy ktoś mógłby pomóc mi znaleźć błąd, podpowiedzieć co zrobiłem źle lub podać przykład testowy dla którego mój program wyrzuca błędną odpowiedź? Z góry dziękuję za pomoc.
-------KOD USUNIĘTY---------
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.
5 months later
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