Gå til innhold

Trenger hjelp til retting av feil i kode


Anbefalte innlegg

Har prøvd i mer eller mindre hele dag å fikse koden, uten hell. Må med andre ord ty til hjelp her.

 

Får en rekke feilmeldinger ved kjøring av dette "spillet", klarer ikke å løse feilmeldingene.

 

Er det noen som kunne hjulpet meg?

 

Takker på forhånd for all hjelp!

 

 

import java.util.Scanner;

public class MasterMind1 {
 /*Den hemmelige strengen. */  
 public static final String hemmelig = "+-*#";

 /* Metoden teller hvor ofte en tegn forekommer i en streng.
  * @param tegn tegn som skal telles
  * @param streng strengen det skal søkes i
  * @return anntall forekomst av tegn */

 public static int antallForekomst(char tegn, String streng) {

   int[] teller = new int[4]; //Dekalerer teller

   for (int i = 0; i < hemmelig.length(); i++) { //teller hvor ofte et tegn forekommer i en streng

     if (streng.charAt(i) == '+') {teller [0] ++; } 
     if (streng.charAt(i) == '-') {teller [1] ++; } 
     if (streng.charAt(i) == '*') {teller [2] ++; } 
     if (streng.charAt(i) == '#') {teller [3] ++; }
   }
 }

 /*
  * Metoden kontrollere at alle tegn i den angitt strengen forekommer i den hemmelige strengen.
  * Denne metoden bruker metoden antallForekomst().
  * @param innStreng Tegn i denne strengen skal kontrolleres
  * @return true hvis alle tegn er lovlig (dvs. de forekommer i den hemmelig strengen),
  * false ellers */
 public static boolean harLovligeTegn(String innStreng) { 
   for (int n = 0; n < hemmelig.length(); n++) { 
     if (innStreng.indexOf(hemmelig.charAt(n)) == -1) { 
       return false; 
     } 
   } 
   return true; 
 }



 /* 
  * Metoden kontollerer at alle tegn fra den hemmelige strengen forekommer høyst én gang i 
  * den angitte strengen. Denne metoden bruker metoden antallForekomst().
  * @param innStreng Tegn i denne strengen skal kontolleres
  * @return true hvis alle tegn fra den hemmelige strengen forekommer høyst én gang i 
  * den angitte strengen, false ellers. */
 public static boolean kontrollerForekomster(String innStreng) {
   //
   if (hemmelig.charAt(innStreng) == tegn) int antall = 1;  {
     return false;
   }
 }
 return true;

}

/*
* Metoden kontrollere at strengen er gyldig:
* (a) den angitte strengen må ha samme lengden som den hemmelige strengen,
* (b) at alle tegn i den angitte strengen er lovlige og 
* (c) at hvert tegn fra den hemmelige strengen må forekomme høyst én gang i den angitte strengen.
* Denne metoden bruker metodene harLovligeTegn() og kontrollerForekomster().
* @param innStreng strengen som skal kontrolleres
* @return true hvis den angitte strengen er gyldig, false ellers */

public static boolean erGyldig(String innStreng, String hemmelig) {

 if(innStreng.length() != hemmelig.length()) {
   return false;
 }

 char[] charRekke = {'+', '-', '*', '#'};

 for(int inn = 0; inn < innStreng.length(); inn++) {
   for(int gyldig = 0; gyldig < charRekke.length; gyldig++) {
     if(innStreng.charAt(inn) != charRekke[gyldig]) {
       return false;
     }
   }
 }
 //metoden må returnere noe, og om den kommer gjennom alle hindrene kommer den hit
 return true;
}
}


     /** Metoden teller antall riktige tegn som er på riktig plass i den angitte strengen.
       * Metoden kontrollere også at innstrengen er gyldig ved å kall metoden erGyldig().
       * @param innStreng strengen som skal kontrolleres
       * @return antall riktige tegn */   
     public static int antallRiktige(String innStreng) {
       int antallRiktige = 0;
       if (erGyldig(innStreng)) {
         // teller antall tegn på riktig plass
         for (int i = 0; i < innStreng.length(); ++i) {
           if (innStreng.charAt(i) == hemmelig.charAt(i)) {
             ++antallRiktige;
           }
         }
         System.out.println("Strengen innholder " + antallRiktige + " tegn på riktig plass.");
       }
       return antallRiktige;
     }

     public static void main(String[] args) {
       //Sett opp lesing fra tastatur
       Scanner tastatur = new Scanner(System.in);

       boolean ferdig = false;
       do {
         // Les ny streng
         System.out.println("Angi streng med lengde " + hemmelig.length() + 
                            " som innholder tegn fra {+, -, *, #}:");
         String streng = tastatur.nextLine();

         // er programmet ferdig?
         ferdig = (antallRiktige(streng) == hemmelig.length());
       } while (!ferdig);

       System.out.println("Gratulerer! Strengen er lik hemmelig streng.");    
     }
   }

Endret av spelly
Lenke til kommentar
Videoannonse
Annonse

Takker for ekstremt raske tilbakemeldinger!

 

Følgende feilmeldinger får jeg:

5 errors found:

File: C:\Users\æ\Desktop\MasterMind1.java [line: 14]

Error: This method must return a result of type int

File: C:\Users\æ\Desktop\MasterMind1.java [line: 70]

Error: Syntax error on token "(", ; expected

File: C:\Users\æ\Desktop\MasterMind1.java [line: 70]

Error: Syntax error on token ",", ; expected

File: C:\Users\æ\Desktop\MasterMind1.java [line: 70]

Error: Syntax error on token ")", ; expected

File: C:\Users\æ\Desktop\MasterMind1.java [line: 100]

Error: The method erGyldig(java.lang.String) is undefined for the type MasterMind1

Lenke til kommentar

Takker for tilbakemeldinger, har forhåpentligis fått fikset de feilen dere oppdaget.

 

Følgende error får jeg no:

5 errors found:

File: C:\Users\æ\Desktop\MasterMind1.java [line: 26]

Error: Syntax error, insert "}" to complete Block

File: C:\Users\æ\Desktop\MasterMind1.java [line: 55]

Error: The method charAt(int) in the type java.lang.String is not applicable for the arguments (java.lang.String)

File: C:\Users\æ\Desktop\MasterMind1.java [line: 55]

Error: tegn cannot be resolved to a variable

File: C:\Users\æ\Desktop\MasterMind1.java [line: 55]

Error: antall cannot be resolved to a variable

File: C:\Users\æ\Desktop\MasterMind1.java [line: 103]

Error: Syntax error on token ")", AssignmentOperator expected after this token

 

Fikser jeg noen av de complete block osv, resulterer det bare til langt fler errors!

 

Kildekoden ser slik ut no:

 

 

import java.util.Scanner;
/*
* Enkelt mastermind spill
* @autor Stian 
*/
public class MasterMind1 {
 /*Den hemmelige strengen. */  
 public static final String hemmelig = "+-*#";

 /* Metoden teller hvor ofte en tegn forekommer i en streng.
  * @param tegn tegn som skal telles
  * @param streng strengen det skal søkes i
  * @return anntall forekomst av tegn */
 public static int antallForekomst(char tegn, String streng) {

   int[] teller = new int[4]; //Dekalerer teller

   for (int i = 0; i < hemmelig.length(); i++) { //teller hvor ofte et tegn forekommer i en streng

     if (streng.charAt(i) == '+') {teller [0] ++; } 
     if (streng.charAt(i) == '-') {teller [1] ++; } 
     if (streng.charAt(i) == '*') {teller [2] ++; } 
     if (streng.charAt(i) == '#') {teller [3] ++; }
   }

   for(int i = 0; i < teller.length; i++) {

 }

 /*
  * Metoden kontrollere at alle tegn i den angitt strengen forekommer i den hemmelige strengen.
  * Denne metoden bruker metoden antallForekomst().
  * @param innStreng Tegn i denne strengen skal kontrolleres
  * @return true hvis alle tegn er lovlig (dvs. de forekommer i den hemmelig strengen),
  * false ellers */
 public static boolean harLovligeTegn(String innStreng) { 
   for (int n = 0; n < hemmelig.length(); n++) { 
     if (innStreng.indexOf(hemmelig.charAt(n)) == -1) { 
       return false; 
     } 
   } 
   return true; 
 }



 /* 
  * Metoden kontollerer at alle tegn fra den hemmelige strengen forekommer høyst én gang i 
  * den angitte strengen. Denne metoden bruker metoden antallForekomst().
  * @param innStreng Tegn i denne strengen skal kontolleres
  * @return true hvis alle tegn fra den hemmelige strengen forekommer høyst én gang i 
  * den angitte strengen, false ellers. */
 public static boolean kontrollerForekomster(String innStreng) {
   //
   if (hemmelig.charAt(innStreng) == tegn) antall = 1;  {
     return false;
   }
   {

 return true;
   }


}

/*
* Metoden kontrollere at strengen er gyldig:
* (a) den angitte strengen må ha samme lengden som den hemmelige strengen,
* (b) at alle tegn i den angitte strengen er lovlige og 
* (c) at hvert tegn fra den hemmelige strengen må forekomme høyst én gang i den angitte strengen.
* Denne metoden bruker metodene harLovligeTegn() og kontrollerForekomster().
* @param innStreng strengen som skal kontrolleres
* @return true hvis den angitte strengen er gyldig, false ellers */

public static boolean erGyldig(String innStreng, String hemmelig) {

 //Har ikke noen vits å gjøre noe mer i metoden om denne returnerer false
 if(innStreng.length() != hemmelig.length()) {
   return false;
 }

 char[] charRekke = {'+', '-', '*', '#'};

 for(int inn = 0; inn < innStreng.length(); inn++) {
   for(int gyldig = 0; gyldig < charRekke.length; gyldig++) {
     if(innStreng.charAt(inn) != charRekke[gyldig]) {
       return false;
     }
   }
 }
 //metoden må returnere noe, og om den kommer gjennom alle hindrene kommer den hit
 return true;
}



     /** Metoden teller antall riktige tegn som er på riktig plass i den angitte strengen.
       * Metoden kontrollere også at innstrengen er gyldig ved å kall metoden erGyldig().
       * @param innStreng strengen som skal kontrolleres
       * @return antall riktige tegn */   
     public static int antallRiktige(String innStreng) {
       int antallRiktige = 0;
       if (erGyldig()(innStreng)) {
         // teller antall tegn på riktig plass
         for (int i = 0; i < innStreng.length(); ++i) {
           if (innStreng.charAt(i) == hemmelig.charAt(i)) {
             ++antallRiktige;
           }
         }
         System.out.println("Strengen innholder " + antallRiktige + " tegn på riktig plass.");
       }
       return antallRiktige;
     }

     public static void main(String[] args) {
       //Sett opp lesing fra tastatur
       Scanner tastatur = new Scanner(System.in);

       boolean ferdig = false;
       do {
         // Les ny streng
         System.out.println("Angi streng med lengde " + hemmelig.length() + 
                            " som innholder tegn fra {+, -, *, #}:");
         String streng = tastatur.nextLine();

         // er programmet ferdig?
         ferdig = (antallRiktige(streng) == hemmelig.length());
       } while (!ferdig);

       System.out.println("Gratulerer! Strengen er lik hemmelig streng.");    
     }
   }

Lenke til kommentar

Takker for tilbakemelding!

 

Problemet er at gjør jeg noe med feilmeldingene i kompilatoren, fører det bare til fler feilmeldinger.

 

No har jeg endt opp med 19 nye feilmeldinger f.eks.

 

Koden ser slik ut no:

 

import java.util.Scanner;
/*
* Enkelt mastermind spill
* @autor Stian 
*/
public class MasterMind1 {
 /*Den hemmelige strengen. */  
 public static final String hemmelig = "+-*#";

 /* Metoden teller hvor ofte en tegn forekommer i en streng.
  * @param tegn tegn som skal telles
  * @param streng strengen det skal søkes i
  * @return anntall forekomst av tegn */
 public static int antallForekomst(char tegn, String streng) {

   int[] teller = new int[4]; //Dekalerer teller

   for (int i = 0; i < hemmelig.length(); i++) { //teller hvor ofte et tegn forekommer i en streng

     if (streng.charAt(i) == '+') {teller [0] ++; } 
     if (streng.charAt(i) == '-') {teller [1] ++; } 
     if (streng.charAt(i) == '*') {teller [2] ++; } 
     if (streng.charAt(i) == '#') {teller [3] ++; }
   }
 }
 for(int i = 0; i < teller.length; i++) {

 }

 /*
  * Metoden kontrollere at alle tegn i den angitt strengen forekommer i den hemmelige strengen.
  * Denne metoden bruker metoden antallForekomst().
  * @param innStreng Tegn i denne strengen skal kontrolleres
  * @return true hvis alle tegn er lovlig (dvs. de forekommer i den hemmelig strengen),
  * false ellers */
 public static boolean harLovligeTegn(String innStreng) { 
   for (int n = 0; n < hemmelig.length(); n++) { 
     if (innStreng.indexOf(hemmelig.charAt(n)) == -1) { 
       return false; 
     } 
   } 
   return true; 
 }



 /* 
  * Metoden kontollerer at alle tegn fra den hemmelige strengen forekommer høyst én gang i 
  * den angitte strengen. Denne metoden bruker metoden antallForekomst().
  * @param innStreng Tegn i denne strengen skal kontolleres
  * @return true hvis alle tegn fra den hemmelige strengen forekommer høyst én gang i 
  * den angitte strengen, false ellers. */
 public static boolean kontrollerForekomster(String innStreng) {
   //
   if (hemmelig.charAt(innStreng) == tegn) antall = 1;  {
     return false;
   }
   {

 return true;
   }


}

/*
* Metoden kontrollere at strengen er gyldig:
* (a) den angitte strengen må ha samme lengden som den hemmelige strengen,
* (b) at alle tegn i den angitte strengen er lovlige og 
* (c) at hvert tegn fra den hemmelige strengen må forekomme høyst én gang i den angitte strengen.
* Denne metoden bruker metodene harLovligeTegn() og kontrollerForekomster().
* @param innStreng strengen som skal kontrolleres
* @return true hvis den angitte strengen er gyldig, false ellers */

public static boolean erGyldig(String innStreng, String hemmelig) {

 //Har ikke noen vits å gjøre noe mer i metoden om denne returnerer false
 for(int inn = 0; inn < innStreng.length(); inn++) {
   int teller = 0;
   for(int gyldig = 0; gyldig < charRekke.length; gyldig++) {
     if(innStreng.charAt(inn) != charRekke[gyldig]) {
       teller++;
     }
     if(teller >= 4) {
       return false;
     }
     else {
       teller = 0;
   }
 }



     /** Metoden teller antall riktige tegn som er på riktig plass i den angitte strengen.
       * Metoden kontrollere også at innstrengen er gyldig ved å kall metoden erGyldig().
       * @param innStreng strengen som skal kontrolleres
       * @return antall riktige tegn */   
     public static int antallRiktige(String innStreng) {
       int antallRiktige = 0;
       if (erGyldig()(innStreng)) {
         // teller antall tegn på riktig plass
         for (int i = 0; i < innStreng.length(); ++i) {
           if (innStreng.charAt(i) == hemmelig.charAt(i)) {
             ++antallRiktige;
           }
         }
         System.out.println("Strengen innholder " + antallRiktige + " tegn på riktig plass.");
       }
       return antallRiktige;
     }

     public static void main(String[] args) {
       //Sett opp lesing fra tastatur
       Scanner tastatur = new Scanner(System.in);

       boolean ferdig = false;
       do {
         // Les ny streng
         System.out.println("Angi streng med lengde " + hemmelig.length() + 
                            " som innholder tegn fra {+, -, *, #}:");
         String streng = tastatur.nextLine();

         // er programmet ferdig?
         ferdig = (antallRiktige(streng) == hemmelig.length());
       } while (!ferdig);

       System.out.println("Gratulerer! Strengen er lik hemmelig streng.");    
     }
}    
}

Lenke til kommentar

Skriver du i notepad? Bruk heller en skikkelig editor. Eclipse kommenterer feil fortløpende, og kjører også koden for deg. I tillegg kan den automatisk indentere koden slik at det ser ålreit ut. Indenteringen din nå er rimelig på trynet. Du har også mulighet for å vise linjenummer, og med det i bakhodet vil jeg skrive noen kommentarer med henvisning til linjenummer. Flere av disse tingene har allerede blitt påpekt av andre i tråden, men er fremdeles tilstedeværende i din siste versjon:

 

Linje 26: her har du en tom for-løkke som står rett i klassen (utenfor metode-braces). Ved å kun fjerne denne forsvinner 11 av de 21 feilmeldingene jeg får opp.

Linje 37: hva har strengen hemmelig med dette å gjøre? Hvis du vil sjekke tegn i strengen innStreng, bør du ikke heller sjekke for hver tegn i innStreng istedenfor hvert tegn i hemmelig?

Linje 55:

    if (hemmelig.charAt(innStreng) == tegn) antall = 1;  {
     return false;
   }

Dette gir ikke mening. For det første er syntaks mellom "if" og første "{" på trynet, for det andre - hvor får du variablene "tegn" og "antall" fra? For det tredje kan ikke metoden charAt ta noe annet enn int som argument.

Linje 80&81: Hvor får du variabelen charRekke fra?

Linje 100: "if (erGyldig()(innStreng))" gir ikke mening. Du har et sett parenteser for mye. Riktig skal være "if (erGyldig(innStreng))"

Linje 130: Når du får fikset opp linje 26-28 vil du ha en lukke-brace for mye helt i slutten av koden (som riktignok da vil bli linje 128).

 

Alle disse feilene har Eclipse påpekt for meg. Bruk en ordentlig editor, og du slipper å plage deg selv og oss andre med slike trivielle bugs.

 

edit: Jeg la ut koden din på pastie.org slik at du enklere ser linjenummerne dersom du skulle ha problemer med dette. Alle referanser til linjenummer er relative til hvor linjen er i din siste publiserte versjon.

 

Trykk for Guds skyld på denne linken NÅ!

Endret av srbz
  • Liker 1
Lenke til kommentar

Jeg snakket med en i går som mente at det å bruke en lettanvendelig IDE (som Eclipse) som hjelper deg med feilretting osv. vil "forkrøple" deg på eksamen og slikt, når du ikke har disse hjelpeverktøyene tilgjengelig, fordi du selv blir for avhengig av dem.

Jeg er ikke enig. Jeg føler at Eclipse har hjulpet meg i stor grad med å forstå basic syntax i Java, og jeg tror ikke at det å begynne å bruke Eclipse så tidlig i utdanningen min som jeg gjorde har hemmet meg på noen som helst måte, heller omvendt.

 

I starten hjalp Eclipse meg å forstå Java, nå er Eclipse en tidssparer i den forstand at den autofullfører eksempelvis metodenavn etterhvert som jeg skriver, og påpeker slurvefeil som jeg kanskje har oversett i farten.

 

Får du feilmelding og Eclipse gir deg flere alternativer, er alternativ nr 1 det gunstigste i 95% av tilfellene imo. ;)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...