Java programmeringsuppgift hjälp

Permalänk

Java programmeringsuppgift hjälp

Någon som har något tips på hur man löser uppgift 1 (Gömda ord)
Uppgifter

Så har långt har jag kommit hittills (Jag vet att min kod inte ger önskat resultat.):

import java.util.*; public class Olympiaden { static Scanner scan = new Scanner(System.in); public static void kryptering(){ System.out.println("Input"); String svar = ""; String kry = scan.nextLine(); for(int i = 0; i <= (kry.length()-1);){ char bokstav = kry.charAt(i); svar = svar + bokstav; int ascii = (int) bokstav; i = i + (ascii-64); } System.out.println(svar); } }

Permalänk
Medlem
Skrivet av ericeric113:

Någon som har något tips på hur man löser uppgift 1 (Gömda ord)
Uppgifter

Så har långt har jag kommit hittills (Jag vet att min kod inte ger önskat resultat.):

import java.util.*; public class Olympiaden { static Scanner scan = new Scanner(System.in); static void kryptering(){ System.out.println("Input"); String svar = ""; String kry = scan.nextLine(); int langd = kry.length(); for(int i = 0; i <= langd;){ char bokstav = kry.charAt(i); svar = svar + bokstav; int ascii = (int) bokstav; i = i + (ascii-64); } System.out.println(svar); } }

Du verkar ju vara inne på rätt spår och så. Jag vet inte riktigt vad man ska tipsa om direkt gällande lösningen utan att bara ge lösningen.

Däremot undrar jag ju vad tillvägagångssättet är just i och med att du ser ut att vara rätt nära utan att ta dig hela vägen. Man kan ju visserligen stirra på koden och resonera och leta fel men att helt enkelt sätta en brytpunkt och stega igenom med en debugger känns ju som något som skulle kunna hjälpa en hel del. Vad använder du för IDE?

Edit: Du är väl t.o.m. extremt nära iom de uppdateringar du postat, mest att det utöver att lösa problemet även kraschar?

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk

@ericeric113:

Du är nära, men känns som du saknar att veta lite när du ska använda vad, ska se om jag kan få dig att förstå.

Om någon mod eller någon annan tycker att detta svaret ska tas bort så får ni anmäla inlägget.

Det som for loopen gör är att rada upp alla 26 bokstäverna i engelska alfabetet. Går säkert att lägga till ÅÄÖ men orkar inte kolla upp om dom är på platserna efter Z vilket jag inte tror dom är. Vill du så kan du lösa det.
Vill du läsa in strängarna från en fil eller att du skriver in det i konsolen så får du fixa det själv

do while:
Denna körs så länge nextValue inte överstiger längden av den krypterade strängen.
encrypted.substring tar ut första värdet eftersom nextValue är satt till 0 som default.
Sen hämtar den indexen(platsen) som bokstaven har i alfabetet i ascii arrayen. Jag lägger till +1 för en array börjar på 0, A är ju representerad som 1 och inte 0 i uppgiften. B som 2 osv.
Sen tar jag bokstaven jag kopierat med hjälp av substring och lägger till den i decrypted strängen.

Varför använda en do while över en while?
För att här vet du att du måste köra loopen en gång, du börjar alltid på index 0. att köra en kontroll innan du hoppar in i loopen är onödigt.

public class Encryption { public static void main(String[] args) { String encrypted = "HZBKRYAFEAAAAJ"; String decrypted = ""; int nextValue = 0; List<String> ascii = new ArrayList<String>(26); for(char c = 'A'; c <= 'Z'; c++) { ascii.add(String.valueOf(c)); } do { String tempChar = encrypted.substring(nextValue, nextValue + 1); nextValue += ascii.indexOf(tempChar) + 1; decrypted += tempChar; } while(nextValue <= encrypted.length()); System.out.println(decrypted); } }

Dold text
Permalänk
Skrivet av evil penguin:

Du verkar ju vara inne på rätt spår och så. Jag vet inte riktigt vad man ska tipsa om direkt gällande lösningen utan att bara ge lösningen.

Däremot undrar jag ju vad tillvägagångssättet är just i och med att du ser ut att vara rätt nära utan att ta dig hela vägen. Man kan ju visserligen stirra på koden och resonera och leta fel men att helt enkelt sätta en brytpunkt och stega igenom med en debugger känns ju som något som skulle kunna hjälpa en hel del. Vad använder du för IDE?

Edit: Du är väl t.o.m. extremt nära iom de uppdateringar du postat, mest att det utöver att lösa problemet även kraschar?

Skrivet av for_each_while:

@ericeric113:

Du är nära, men känns som du saknar att veta lite när du ska använda vad, ska se om jag kan få dig att förstå.

Om någon mod eller någon annan tycker att detta svaret ska tas bort så får ni anmäla inlägget.

Det som for loopen gör är att rada upp alla 26 bokstäverna i engelska alfabetet. Går säkert att lägga till ÅÄÖ men orkar inte kolla upp om dom är på platserna efter Z vilket jag inte tror dom är. Vill du så kan du lösa det.
Vill du läsa in strängarna från en fil eller att du skriver in det i konsolen så får du fixa det själv

do while:
Denna körs så länge nextValue inte överstiger längden av den krypterade strängen.
encrypted.substring tar ut första värdet eftersom nextValue är satt till 0 som default.
Sen hämtar den indexen(platsen) som bokstaven har i alfabetet i ascii arrayen. Jag lägger till +1 för en array börjar på 0, A är ju representerad som 1 och inte 0 i uppgiften. B som 2 osv.
Sen tar jag bokstaven jag kopierat med hjälp av substring och lägger till den i decrypted strängen.

Varför använda en do while över en while?
För att här vet du att du måste köra loopen en gång, du börjar alltid på index 0. att köra en kontroll innan du hoppar in i loopen är onödigt.

public class Encryption { public static void main(String[] args) { String encrypted = "HZBKRYAFEAAAAJ"; String decrypted = ""; int nextValue = 0; List<String> ascii = new ArrayList<String>(26); for(char c = 'A'; c <= 'Z'; c++) { ascii.add(String.valueOf(c)); } do { String tempChar = encrypted.substring(nextValue, nextValue + 1); nextValue += ascii.indexOf(tempChar) + 1; decrypted += tempChar; } while(nextValue <= encrypted.length()); System.out.println(decrypted); } }

Dold text

Koden som finns i posten funkar nu:)