spelly Skrevet 17. februar 2011 Del Skrevet 17. februar 2011 (endret) 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 17. februar 2011 av spelly Lenke til kommentar
GeirGrusom Skrevet 17. februar 2011 Del Skrevet 17. februar 2011 antallForekomst returnerer ikke noe til tross for at den er definert til å skulle returnere en int. Lenke til kommentar
Matsemann Skrevet 17. februar 2011 Del Skrevet 17. februar 2011 Forøvrig greit å poste feilmeldingene du får i samme slengen. Gjør det lettere å hjelpe. Lenke til kommentar
spelly Skrevet 17. februar 2011 Forfatter Del Skrevet 17. februar 2011 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
Matsemann Skrevet 17. februar 2011 Del Skrevet 17. februar 2011 Første feilen sa GeirGrusom. siste feil: if (erGyldig(innStreng)) står det på den linjen. Du har ingen funksjon som heter erGyldig med ett parameter. Kun en erGyldig med to parametere. Lenke til kommentar
spelly Skrevet 17. februar 2011 Forfatter Del Skrevet 17. februar 2011 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
Matsemann Skrevet 17. februar 2011 Del Skrevet 17. februar 2011 Du har en tom for løkke i antallForekomster, og har ikke lukket metoden med } skikkelig. (hemmelig.charAt(innStreng) == tegn) Hvor har du tegn i fra?? Osv., sånn seriøst, kompilatoren din sier ganske greit hva problemene er. Lenke til kommentar
13375k1133z Skrevet 18. februar 2011 Del Skrevet 18. februar 2011 (endret) nevermind Endret 18. februar 2011 av 13375k1133z Lenke til kommentar
spelly Skrevet 18. februar 2011 Forfatter Del Skrevet 18. februar 2011 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
Sokkalf™ Skrevet 18. februar 2011 Del Skrevet 18. februar 2011 Da må du nesten bare fortsette å rette, for her er det mye rart. Mange, mange rare syntaxfeil. Du ser ikke ut til å ha kontroll på blokker, og plasserer kode utenfor metoder og sånne ting. Lenke til kommentar
Matsemann Skrevet 18. februar 2011 Del Skrevet 18. februar 2011 Du må lære deg å tolke feilmeldingene fra kompilator. Slik som missing block "}" at line XX betyr ikke at du bare kan kaste inn en } på linje XX. Den passer kanskje en annen plass, men det er først der det blir feil. Lenke til kommentar
srbz Skrevet 21. februar 2011 Del Skrevet 21. februar 2011 (endret) 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 21. februar 2011 av srbz 1 Lenke til kommentar
iKent Skrevet 1. mars 2011 Del Skrevet 1. mars 2011 Trykk for Guds skyld på denne linken NÅ! +1. Eclipse er win. Er det noe feil og du sliter med å se syntax feil er det bare å holde musa over der feilen står og du får mange gode forslag til hvordan du kan rette opp feilen, dog ikke alle alternativene er win, men gir deg en viss ide om hva som er feil der. 1 Lenke til kommentar
srbz Skrevet 1. mars 2011 Del Skrevet 1. mars 2011 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
Matsemann Skrevet 1. mars 2011 Del Skrevet 1. mars 2011 På eksamen skyter de deg ikke om du har glemt småtteri som gjør at det ikke skulle kompilert, f. eks. Ikke her, i hvert fall. Det er uansett logikken bak koden som teller. Enkelte eksamener kan man svare i pseudokode om man vil. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå