32 / 85
Dec 2014

@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();

Poczytaj o cplusplus.com/reference/istr ... am/ignore/19

czy to na pewno jest program do tego zadania co w tytule ?, bo mój ma jakieś 20 linii i jeszcze można by go skrócić smile

więc na twój tylko spojrzałem i zrezygnowałem - napisz jeszcze raz, tak aby miał góra 30 linii, i oczywiście żadnych funkcji ani sort(), naprawdę nie są potrzebne

4 months later

Witam. Nie wiem co zrobiłem źle. Czy może jest to kwestia użycia getline? Program testy przechodzi ale na spoju dostaję "błędna odpowiedź".
[bbone=cpp,2179]
[ [narbej: po AC i nie tylko, nalezy kasowac swoj kod
[/bbone]

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?

Nie wiem co to ideon. U mnie program wypisuje dobry wynik dla testu z zadania.

Dzięki ideone znalazłem rozwiązanie. Trzeba było zapętlić cin. Dziękuję i pozdrawiam.

10 months later

Witam, spoj wyświetla błędną odpowiedź. Pomoże ktoś, np w znalezieniu testu, dla którego mój program wyświetla złą wartość?
--wycięty kod--

Dowolny test zawierający duże Z, twój program je pomija. Niestety przekombinowałeś go tak że nie wiem dlaczego.

edit: znalazłem, w 2 miejscach masz < 51 zamiast <=. Jak już to poprawisz to usuń kod z forum bo będzie AC

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---------

Spójrz na tę pętlę:

i powiedz co w niej nie gra smile Jak do tego dojdziesz to będzie AC smile

Edit: zamiast cin.sync zastosuj cin.ignore.... ale to nie jest główny problem . Problem leży w pętli smile

Ok zaakceptowane, dzięki wielkie za pomoc smile . 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)?

Witam wszystkich serdecznie, zadanie rozwiązałem kodem poniżej, jednak sędzie go nie przyjmuje. Jestem ciekawy co robię źle. Z góry dziękuje za podpowiedź smile

kod usunięty

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.

Dzięki za szybką odpowiedź. Z tą liczbą na początku to coś sobie sprawdzałem i zapomniałem usunąć przed wrzuceniem tego do postu blush. Ostatnia litera to spacja. Spróbuje to wszystko bardziej przejrzyście napisać i idąc za radą pozbędę się do... while.

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 :wink:

Na pewno masz błąd w tej for(int i=0; i<=ilosc_linijek; i++) linijce, dla danych testowych czyli 2 wykona się 3 razy dla0, 1, 2. Więc albo zmień i na 1 albo usuń = . Błąd jest gdzieś jeszcze ale niestety nie wiem gdzie.

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. :wink:

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