Permalänk

Javakod Skoluppgift Hjälp

Håller nu på med det sista inom programmering och har fått i uppgift att göra en parentestestare med hjälp av en stack. Den ska testa om alla parenteser är par och annars skriva ut vad felet är och rad tex. "} på rad 15", koden den ska läsa av och bedöma tas från en textfil på datorn. Får just nu fel på att kompilatorn inte hittar variabeln "line". Hade varit grymt tacksam för lite hjälp då detta är en galet viktig uppgift.

import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.FileReader; import java.util.Stack; public class Uppgift8A { /** * @param args */ public static void main(String[] args) throws FileNotFoundException, IOException { // Här MÅSTE den EXAKTA sökvägen till filen stå mellan citat-tecknen // MEN med dubbla \\-tecken istället för enkla \-tecken File file = new File("C:\\test.txt"); String line; BufferedReader input = new BufferedReader(new FileReader(file)); try { int radNr = 1; // Följande snurra läser EN hel textrad från textfilen i taget // Efter varje varv byter den till nästa rad // Snurran avbryts när det inte finns fler rader att läsa från filen radNr++; int StackLängd = line.length(); Stack<String> testare = new Stack<>(); int i = 0; while (i<StackLängd) { String chpush = String.valueOf(line.charAt(i)); //String chpop = String.valueOf(line.charAt(i)); if (chpush == "{" || chpush == "[" || chpush == "(") { testare.push(chpush); i++; } else { String chpop = testare.pop(); i++; if ((chpush == "}" && chpop != "{") || (chpush == "]" && chpop != "[") || (chpush == ")" && chpop != "(" )) i++; System.out.println("Fel på: " + chpush + " rad nummer " + radNr); //else i++; System.out.println("Fel på: " + chpush + " rad nummer " + radNr); } } } finally { input.close(); } } }

Permalänk
Medlem

Jag ser inte att du sätter variabeln "line" någonstans. Jag ser var du deklarerar den och nästa gång du använder den så anropar du line.length(). Du måste väl tilldela variabeln ett värde innan? Disclaimer: Det var mer än 10 år sedan jag programmerade Java.

Permalänk

Men line ska bestå av den inlästa texten dvs. en textfil på hårddisken. Tycker att den borde hitta den men kan inte förstå varför inte:

Permalänk

Men du måste säga vad "line" ska innehålla den är tom just nu. Eftersom den är tom så kan du inte använda line.length(); Den har ingen längd för den är tom.
Du borde säga " line = input.readLine();" så att du ger den värdet av raden du vill läsa.
Tror jag ^^

Permalänk

Men variabeln line är en textfil som ligger på datorn som läses in i toppen av koden så den har ett värde, felet måste nästan ligga någon annanstans?

Permalänk
Inaktiv

Numero eins: Använd aldrig svenska någonsin när du programmerar. Engelska är ett krav. StackLängd inte okej, inte ens i kommentarer! StackLength = okej.

Numero zwei: Det finns ett par fel i koden men vill inte göra hela uppgiften åt dig utan ska bara fösöka hinta dig rätt genom ett par frågor. Var ger du line ett värde explicit? Av det du visar här har du endast deklarerat som inte är samma sak som att definiera även om det är diffust och svårt att se i java kanske. Vad gör du med input som de tidigare frågat här och vad vill du göra med den?

För att göra det lite enkelt för mig så ber jag dig titta på denna länken: http://www.mkyong.com/java/how-to-read-file-from-java-buffere...

EDIT: Jag skriver väldigt väl i denna värmen ser jag.

Permalänk

Tack ska läsa och försöka förstå det hela bättre.

Permalänk

Ok har testat en annan lösning men får:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2 at java.lang.String.charAt(Unknown Source) at U8A.main(U8A.java:33)

import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.*; public class U8A { public static void main(String[] args ) { try (BufferedReader br = new BufferedReader(new FileReader("C:\\test.txt"))) { //int radNr = 1; //radNr++; String line; Stack<String> testare = new Stack<>(); //int i = 1; int i = 0; while ((line = br.readLine()) != null) { i++; String chpush = String.valueOf(line.charAt(i)); switch (chpush) { case "{": case "(": case "[": testare.push(chpush); break; case "}": case ")": case "]": if (!testare.isEmpty()) { String chpop=testare.pop(); if (chpush=="}" && chpop != "{"|| chpush==")" && chpop != "(" || chpush=="]" && chpop != "[") { System.out.println("Error "+chpush+"at"+i); } } break; default: break; } }} catch (IOException e) { e.printStackTrace(); } } }

Några ideer? :S

Permalänk
Inaktiv

Jag tycker du ska ta dig en titt på : http://docs.oracle.com/javase/tutorial/java/nutsandbolts/swit...

Samt fundera på vad en String är för något och hur den indexeras. Börjar man räkna positioner i strängar på 0 eller 1? : http://www.geom.uiuc.edu/~daeron/docs/apidocs/java.lang.Strin...

Det error som du får berättar för dig att du nu försöker komma åt en symbol på en plats i en Sträng som inte finns.

Sedan tycker jag du kan titta lite på dessa:
http://www.tutorialspoint.com/java/java_string_charat.htm
http://www.tutorialspoint.com/java/java_string_valueof.htm

Nu tar du nämligen ut en symbol/char ifrån strängen och sedan gör om den till en sträng vilket är ganska onödigt eftersom du lika gärna kan kolla om den char som du tar ur strängen med charAt är '(' där fnuttar påvisar att det är en char det handlar om som vi jämför med.

Kämpa på.

Permalänk
Medlem
Skrivet av Murmelmannen:

Ok har testat en annan lösning men får:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2 at java.lang.String.charAt(Unknown Source) at U8A.main(U8A.java:33)

Några ideer? :S

Du saknar en kontroll för när i överstiger storleken på din lästa sträng och du nollställer aldrig i inuti loop-kroppen, så i=0 gäller bara första gången du läser en sträng.

Permalänk

Ok tack för alla länkar blir att läsa ikväll får hoppas jag får in det innan deadline imorgon. :S

Permalänk
Medlem

Grundproblemet är att du försöker du plocka ut bokstav i på rad i. Dvs på rad 100 försöker du plocka ut bokstav nr 100 på den raden och på rad 1000 bokstav nr 1000. Jag låter det vara upp till dig att avgöra hur det ska vara då jag antar att det är del av upgiften.

Visa signatur

Chasi: Thermaltake XaserVI LBNS | Mobo: P9X79 PRO
Cpu: SB-E 3930k 4.8ghz @ 1.34v | Kylning: 2x Laing DCC, EK supreme HF Cu, 45*60cm nissan bilkylare.
Ram: 6x4GB G.skill 2133mhz cl11 | Disk: Samsung 830 256GB

Permalänk
Inaktiv

För att du kanske ska se tydligare vad vi säger här så kan du själv använda system.out.println (Alla intressanta variabler); där du tror att saker går snett så kan du se direkt i vilket tillstånd som programmet befinner sig i och fortsätta stega dig vidare och sysout;a tills du ser var du tänkt fel och du får ett tillstånd som du inte vill befinna dig i.

Permalänk

Tack för alla svar hjälpte stort, lyckades lösa den tillslut.

Permalänk
Hedersmedlem

En liten slamkrypare med den här uppgiften (det är en standarduppgift) är att bedöma ordningen.
Nu har jag inte lösningen du lämnade in men om jag tittar på senaste koden du skrev så verkar det inte tänka till anmärka på fallet om detta som input:

}{

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG