Permalänk
Medlem

Hjälp med Java

Hej, jag har ett problem som jag blir galen på. Uppgiften är att skriva ett program som kollar upp primtalspar till jämna tal. (Goldbachs hypotes).
Det var ett tag sedan jag höll på med Java och har precis kommit igång. Här kommer koden.

import java.util.Scanner; public class primeCombo{ // Testa om inmatat tal är mindre än två eller ojämnt. Skapa variabler public static int hittaKombinationer(int number){ if(number <= 2 || number%2 == 1){ System.out.println("Felinmatning, try again"); return 0; } int halfnumber = number/2; int AntalKombinationer = 0; // Anropar från metoden primtal. Om i är ett primtal och number - i är ett primtal så skapar det en kombination. //Testar upp till hälften av talet för att undvika dubbla kombinationer. for(int i=2;i<=halfnumber;i++){ if(primtal(i) && primtal(number-i)){ AntalKombinationer++; System.out.println("Komination funnen: "+i+"+"+(number-i)); } } // Returnerar Antalet funna kombinationer till metoden. return AntalKombinationer; } public static boolean primtal(int number){ // Letar efter primtal i. Hittas detta returneras true till metoden ovan. // Om i inte är ett primtal returneras false och nästa värde på i testas. for (int i=2; i<number; i++) { if (number%i==0) { return false; } } return true; } public static void main(String[] args){ // Inmatning användare Scanner in = new Scanner(System.in); int indata = 1; // Loopar tills användaren skriver in 0 while (indata != 0){ System.out.print("Mata in ett jämnt tal >2: "); indata = in.nextInt(); System.out.println( "Antal olika kombinationer : " + hittaKombinationer(indata) + "\n" ); } } }

Programmet fungerar fint och utskriften blir till exempel
Mata in ett jämnt tal >2
*matar in ex 10*
Kombination funnen 3+7
Kombination funnen 5+5
Antal kombinationer 2

Saken är den att jag egentligen inte vill ha antal kombinationer, men kommer inte på hur jag ska få programmet att fungera korrekt om jag inte vill returnera detta värdet i metoden

public static int hittaKombinationer(int number)

Utskriften jag söker är:
Mata in ett jämnt tal >2
*matar in ex 10*
Kombination funnen 3+7
Kombination funnen 5+5

Det går även bra att skriva programmet med endast for loopar och if satser, men efter några timmar har jag inte kommit på hur jag ska strukturera upp programmet på det sättet och frågar därför efter hjälp.

Kort och gott
- Hitta ett sätt att köra programmet korrekt utan att behöva returnera ett värde till

public static int hittaKombinationer(int number)

eller
skriva programmet endast med hjälp av forloopar och if-satser.

Mvh.

Permalänk
Medlem
Skrivet av NoToes:

Hej, jag har ett problem som jag blir galen på. Uppgiften är att skriva ett program som kollar upp primtalspar till jämna tal. (Goldbachs hypotes).
Det var ett tag sedan jag höll på med Java och har precis kommit igång. Här kommer koden.

import java.util.Scanner; public class primeCombo{ // Testa om inmatat tal är mindre än två eller ojämnt. Skapa variabler public static int hittaKombinationer(int number){ if(number <= 2 || number%2 == 1){ System.out.println("Felinmatning, try again"); return 0; } int halfnumber = number/2; int AntalKombinationer = 0; // Anropar från metoden primtal. Om i är ett primtal och number - i är ett primtal så skapar det en kombination. //Testar upp till hälften av talet för att undvika dubbla kombinationer. for(int i=2;i<=halfnumber;i++){ if(primtal(i) && primtal(number-i)){ AntalKombinationer++; System.out.println("Komination funnen: "+i+"+"+(number-i)); } } // Returnerar Antalet funna kombinationer till metoden. return AntalKombinationer; } public static boolean primtal(int number){ // Letar efter primtal i. Hittas detta returneras true till metoden ovan. // Om i inte är ett primtal returneras false och nästa värde på i testas. for (int i=2; i<number; i++) { if (number%i==0) { return false; } } return true; } public static void main(String[] args){ // Inmatning användare Scanner in = new Scanner(System.in); int indata = 1; // Loopar tills användaren skriver in 0 while (indata != 0){ System.out.print("Mata in ett jämnt tal >2: "); indata = in.nextInt(); System.out.println( "Antal olika kombinationer : " + hittaKombinationer(indata) + "\n" ); } } }

Programmet fungerar fint och utskriften blir till exempel
Mata in ett jämnt tal >2
*matar in ex 10*
Kombination funnen 3+7
Kombination funnen 5+5
Antal kombinationer 2

Saken är den att jag egentligen inte vill ha antal kombinationer, men kommer inte på hur jag ska få programmet att fungera korrekt om jag inte vill returnera detta värdet i metoden

public static int hittaKombinationer(int number)

Utskriften jag söker är:
Mata in ett jämnt tal >2
*matar in ex 10*
Kombination funnen 3+7
Kombination funnen 5+5

Det går även bra att skriva programmet med endast for loopar och if satser, men efter några timmar har jag inte kommit på hur jag ska strukturera upp programmet på det sättet och frågar därför efter hjälp.

Kort och gott
- Hitta ett sätt att köra programmet korrekt utan att behöva returnera ett värde till

public static int hittaKombinationer(int number)

eller
skriva programmet endast med hjälp av forloopar och if-satser.

Mvh.

Låt bli och skriv ut den då? Jag har tyvärr aldrig hållt på med java, så kände mig lite vilsen när jag läste koden. Lycka till!

Visa signatur

HTPC - Bygglogg; http://www.sweclockers.com/album/?id=2902
HTPC - Galleri; http://www.sweclockers.com/galleri/6562-htpc-galleribilder
42U - Bygglogg; http://www.sweclockers.com/galleri/7862-42u-rackskap-i-hemmet
i7 8700K, Antec kühler 620, Asus ROG Strix Z370-I Gaming, Corsair Vengeance RGB DDR4-2666 2x16GB RAM, ASUS GTX 1070

Permalänk
Medlem

När du skapar metoden hittaKombinationer så kan du istället för att returnera en int skriva void vilket betyder att den inte returnerar någonting. Alltså "public static void hittaKombinationer". Du måste sedan ta bort raden "return AntalKombinationer;" då den inte kan returnera något då den är en void. Sen kan du ju ta bort allt som har med "AntalKombinationer" att göra då dem inte verkar behövas.

I main-metoden får du då byta ut denna rad, "System.out.println( "Antal olika kombinationer : " + hittaKombinationer(indata) + "\n" );" mot bara "hittaKombinationer(indata)" som kommer att köra koden i den metoden.

Jag hoppas att det var det du ville veta?

Visa signatur

Chassi: Corsair 650D | Processor: Intel Core i5 3570K | Moderkort: Gigabyte GA-Z68XP-UD3P | Minne: Corsair 16 GB | SSD: Corsair Force GT 128 GB | Lagring: 3,5 TB | Grafikkort: HIS HD7870 | Nätaggregat: Corsair AX750W | Tangentbord: Microsoft Sidewinder X4 | Mus: Mionix Naos 5000

Permalänk
Medlem

Nu var det ett tag sen jag höll på med java så antagligen efterblivet att jag ens försöker med risk för att göra bort mig men i alla fall. Om du kör void hittaKombinationer istället, vad är det print skriver ut då? Kommer inte riktigt ihåg. En inre referens av något slag? Du borde väl kunna skriva om toString i så fall, men finns säkert en mindre omständig lösning på det hela.

Känns fint att den första som svarar inte håller på med java och den andra som svarar inte använt sig av java på ett bra tag... sorry dude.

Permalänk
Medlem
Skrivet av Klimpen2:

När du skapar metoden hittaKombinationer så kan du istället för att returnera en int skriva void vilket betyder att den inte returnerar någonting. Alltså "public static void hittaKombinationer". Du måste sedan ta bort raden "return AntalKombinationer;" då den inte kan returnera något då den är en void. Sen kan du ju ta bort allt som har med "AntalKombinationer" att göra då dem inte verkar behövas.

I main-metoden får du då byta ut denna rad, "System.out.println( "Antal olika kombinationer : " + hittaKombinationer(indata) + "\n" );" mot bara "hittaKombinationer(indata)" som kommer att köra koden i den metoden.

Jag hoppas att det var det du ville veta?

haha herregud känner mig så dum. Har suttit i minst tre timmar och testat med void eftersom jag vet att den inte returnerar ett värde, lagt till en funktion med mera. Har då fått felmeddelandet att jag inte kan hämta från en void. Antar att det var för att jag skrev System.out.println(hittaKombinationer(indata);

Tack för hjälpen! I was *insert close enough meme*

Permalänk
Medlem

Finns alltid folk att fråga i Hubben och på IT:s IRC om du kör fast på uppgifter framöver i utbildningen! Lycka till med programmeringen!

Permalänk
Medlem

Har inte införskaffat mig en laptop än så kunde inte pallra mig dit!
(Tråden kan stängas)

Permalänk
Hedersmedlem

Du borde nysta upp det där lite. Det ser inte bra ut att hålla på och skriva ut relaterad information i olika metoder (main och hittaKombinationer).

Jag skulle låtit main (i ett sådant här litet program) ansvara för att skriva ut kombinationerna som hittaKombinationer returnerar, i form av en lista. Vad listan ska innehålla kan man ju fundera på men som första steg kan du köra med strängar. Alltså List<String> som returtyp. Java har ingen Pair klass, det får man bygga själv. Ofta kan det vara vettigt när man kan beskriva ett samband mellan två objekt (t.ex. Map.Entry) men här där det inte gör något alls så känns det könligt att göra sin egen klass (på rätt vis) för att föra över värdena. Du skulle också kunna fula in en array. Så typen är List<Integer[]> och sen lagra arrayer av längden 2 i varje element i listan.

Det går också att optimera första for-loopen, fast man travar nog in på kodning som inte är så läsbar här. Skriver loopens första rad så här:
for(int i=2;i<=halfnumber;i += i != 2 ? 2 : 1){

Det sista är en ternär operator, villkorsoperatorn ?:.
i += i != 2 ? 2 : 1
Betyder addera till i resultatet av Om i är skilt från 2, ge 2, annars 1.
Vad som händer är att den första gången kommer bli falsk och det blir i + 1, dvs 3. Efter det så kommer den alltid att addera 2 till i, så serien blir 2,3,5,7,9,11,13,15 osv.
Jag skulle nog faktiskt själv inte skriva detta men det är bra att känna till lite sådant.

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