Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2015-10-17, 10:34
  #1
Medlem
Hej!

Var inte säker vart jag skulle lägga denna tråd men hoppas det blev rätt. Försöker översätta detta program: https://github.com/marioyc/Online-Ju...%20systems.cpp som är den här uppgiften: https://open.kattis.com/problems/subway. Jag har den här koden just nu: http://pastebin.com/v6Tff8sE men den skriver ut different och different när den ska skriva ut same och different, som det står i exempeloutputen på andra länken.

Någon som vet vad som är fel? För har debuggat men hittar inte riktigt.
Citera
2015-10-17, 10:53
  #2
Medlem
Har du kollat innehållet i s1 och s2? Den kan skriva ut different på flera ställen. Vilken rad sker det på? Använd tydligare debugmeddelanden.
__________________
Senast redigerad av RulleRivare 2015-10-17 kl. 10:56.
Citera
2015-10-17, 10:58
  #3
Medlem
Citat:
Ursprungligen postat av RulleRivare
Har du kollat innehållet i s1 och s2? Den kan skriva ut different på flera ställen. Vilken rad sker det på? Använd tydligare debugmeddelanden.

Verkar som det är där det är fel för kolla här: http://puu.sh/kNeFe/8bcd027b8d.png. S1 blir en tom sträng. Så är något med att nextLine inte fungerar som den ska. t blir ju nextInt vilket är 2 i det här fallet. Sen borde s1 = input.nextLine(); göra att andra raden blir s1 men den verkar bara hoppa över s1. Förstår inte riktigt varför.
Citera
2015-10-17, 11:01
  #4
Medlem
Citat:
Ursprungligen postat av pkj
Verkar som det är där det är fel för kolla här: http://puu.sh/kNeFe/8bcd027b8d.png. S1 blir en tom sträng. Så är något med att nextLine inte fungerar som den ska. t blir ju nextInt vilket är 2 i det här fallet. Sen borde s1 = input.nextLine(); göra att andra raden blir s1 men den verkar bara hoppa över s1. Förstår inte riktigt varför.
Skulle tro att du behöver läsa radbrytningen efter att du har läst t. Släng in en input.nextLine() före loopen.
Citera
2015-10-17, 11:06
  #5
Medlem
Citat:
Ursprungligen postat av RulleRivare
Skulle tro att du behöver läsa radbrytningen efter att du har läst t. Släng in en input.nextLine() före loopen.

Ah det låter logiskt. Då läser den rad 2 och 3 rätt men sen slutar den: http://puu.sh/kNeVY/3f03f604f2.png. Märkligt att den slutar för jag har inge break eller dylikt. Är det kanske min t-- som inte funkar som den ska? Om du kollar på c++ koden för den delen så kör de while(t--) och det går inte i java så tänkte att man kör while(t ! = 0) och sen minskar t med 1 inuti while-loopen. Men det kanske inte är rätt?
Citera
2015-10-17, 11:16
  #6
Medlem
Citat:
Ursprungligen postat av pkj
Ah det låter logiskt. Då läser den rad 2 och 3 rätt men sen slutar den: http://puu.sh/kNeVY/3f03f604f2.png. Märkligt att den slutar för jag har inge break eller dylikt. Är det kanske min t-- som inte funkar som den ska? Om du kollar på c++ koden för den delen så kör de while(t--) och det går inte i java så tänkte att man kör while(t ! = 0) och sen minskar t med 1 inuti while-loopen. Men det kanske inte är rätt?
Alltså, du har fortfarande inte fixat till debugutskrifterna som jag sa åt dig. Nu vet jag återigen inte var det är den skriver ut "different".
Citera
2015-10-17, 11:28
  #7
Medlem
Jag skrev om koden lite.
http://pastebin.com/TF9JFUEb

Inga eventuella buggar är fixade. Jag gjorde fyra saker.
1) Tog bort en jävla massa onödig luft i koden så att mer får plats på skärmen
2) Tog bort en del onödiga måsvingar. Vissa använder alltid måsvingar i ifsatser. Jag lägger dit dem när det är fler än en sats som ska köras.
3) Tog bort tempvariablerna length1 och length2
4) Fixade bättre felmeddelanden
Citera
2015-10-17, 11:31
  #8
Medlem
Och ännu bättre är om du kör:
System.out.println("different length s1: " + st.length() + " s2: " + s2.length());
respektive
System.out.println("different hash s1: " + x + " s2: " + y);
Citera
2015-10-17, 12:15
  #9
Medlem
Citat:
Ursprungligen postat av RulleRivare
Och ännu bättre är om du kör:
System.out.println("different length s1: " + st.length() + " s2: " + s2.length());
respektive
System.out.println("different hash s1: " + x + " s2: " + y);

Aa sant du har rätt, borde vara tydligare med felmeddelanden. Har fixat som du sa nu. Brukar alltid köra måsvingar men ska börja att inte köra det då man bara har ett kommando i satsen, blir mycket space annars.

Testade att köra nu och fick detta: http://puu.sh/kNhcB/148815b250.png. Den verkar inte skriva ut different hash andra gången, så den kommer inte in i loopen igen typ.
Citera
2015-10-17, 12:33
  #10
Medlem
Citat:
Ursprungligen postat av pkj
Aa sant du har rätt, borde vara tydligare med felmeddelanden. Har fixat som du sa nu. Brukar alltid köra måsvingar men ska börja att inte köra det då man bara har ett kommando i satsen, blir mycket space annars.
Finns olika skolor där. Nackdelen med min metod är när man vill lägga till något, men glömmer måsvingarna. Då kan man få roliga fel.
Citat:
Testade att köra nu och fick detta: http://puu.sh/kNhcB/148815b250.png. Den verkar inte skriva ut different hash andra gången, så den kommer inte in i loopen igen typ.
Om du tittar på den felutskriften så märker du rätt snart att den ligger helt fel. Den skriver ju ut different length oavsett. Ändra utskriften till att skriva ut längderna, men utan att säga att de är olika eller också flyttar du in den till ifsatsen.

Skriv ut t i varje loop. Ta reda på vad som händer.
Citera
2015-10-17, 12:47
  #11
Medlem
Citat:
Ursprungligen postat av RulleRivare
Finns olika skolor där. Nackdelen med min metod är när man vill lägga till något, men glömmer måsvingarna. Då kan man få roliga fel.

Om du tittar på den felutskriften så märker du rätt snart att den ligger helt fel. Den skriver ju ut different length oavsett. Ändra utskriften till att skriva ut längderna, men utan att säga att de är olika eller också flyttar du in den till ifsatsen.

Skriv ut t i varje loop. Ta reda på vad som händer.

Är inte helt med på vad du menar, men flyttade in length print-raden i else-satsen såhär: http://puu.sh/kNiie/9bbfc8c67d.png. Sen ändrade jag även om t-- som jag la i slutet av else-satsen då den ska vara där. Men angående t så körs while loopen 2 gånger nu(den printar det också, först 2 och sen 1). Det är ju korrekt.
Citera
2015-10-17, 12:54
  #12
Medlem
Citat:
Ursprungligen postat av pkj
Är inte helt med på vad du menar, men flyttade in length print-raden i else-satsen såhär: http://puu.sh/kNiie/9bbfc8c67d.png.
Nu verkar det som att du har slutat tänka. Är det rimligt att ditt program skriver ut "different length s1: 16 s2: 16"?

Citat:
Sen ändrade jag även om t-- som jag la i slutet av else-satsen då den ska vara där. Men angående t så körs while loopen 2 gånger nu(den printar det också, först 2 och sen 1). Det är ju korrekt.
Så allt fungerar nu? Bra.

Btw.
Eftersom t bara är en counter skulle jag använda en forloop istället. Något i den här stilen:
Kod:
final int T = input.nextInt();
for(int t=0; t<T; t++)

alternativt

for(int t = input.nextInt(); t>0; t--)

eller

int t = input.nextInt();
for(; t>0; t--)

Personligen föredrar jag den första. Den sista ska du undvika.
__________________
Senast redigerad av RulleRivare 2015-10-17 kl. 13:07.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback