Skolfråga=/ relativt specifik dock

Permalänk
Medlem

Skolfråga=/ relativt specifik dock

Hej! Vi har som ni ser nedan gjort en lottorad. Som skrivs ut och sorteras. Denna fungerar (ska dock nämna att jag kanske inte vart drivande) . Det jag nu har en fråga om är inte på hela alltet utan snarare en specifik. Uppgiften går ut på att: Göra ett program som slumpar ut 7 tal av 35 möjliga, genom användandet av en vektor. Sekundärt är sedan att dessa ska sorteras

Frågan: I for loopen ligger en while loop. I boolean vektorer är ju alla siffror falska. While loopen är ju även den till för att kontrollera att ett tal inte upprepar sig själv. Men vart säger egentligen whileloopen det?
Som jag ser det så blir ett tal true, direkt i forloopen och därav önskar den gå in i whileloopen direkt iaf?

Jag förstår att skolfrågor inte är det som önskas här och förstår även avsaknad av svar därmed!Men är det någon vänlig skäl som önskar förklara sambandet och logiken bakom denna for/while loop i syftet att se till att talen blir unika så är jag dig mer än tacksam!

import java.util.*; public class Lotto { public static void main(String[] args){ Lotto l=new Lotto(); System.out.println(l.getLottorad()); } private String getLottorad() { //Skapar Vektor! Deklaration av variabler: index och tal, rad och r. boolean Vektor[]=new boolean[35]; int i,tal; String rad=""; Random r=new Random(); //Räknar upp till 7 slumpmassiga tal. for (i=0;i<7;i++){ tal=r.nextInt(Vektor.length); //Kollar om talet redan "har varit". while(Vektor[tal]==true){ tal=r.nextInt(Vektor.length); } //Skriver ut en rad med tal + 1 eftersom man inte kan få noll i lotto. Vektor[tal]=true; rad=rad+" "+(tal+1); } System.out.println(rad); rad=""; //Sorterar raden! for(i=0;i<Vektor.length;i++){ if(Vektor[i]==true) rad=rad+" "+(i+1); } //Skriver ut rad. System.out.println(rad); return "Programmet är klart." ; } }

Det handlar alltså om att förstå på vilket sätt whileloopen i detta fall fungerar och säkrar att det inte blir upprepning!
Tacksam för all hjälp jag kan få!

Lade till code-taggar
Permalänk
Keeper of Traditions

lägg det i code-taggar så blir det mer lättläst, indentering är väldigt viktigt.

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem
Skrivet av Zoem:

Hej! Vi har som ni ser nedan gjort en lottorad. Som skrivs ut och sorteras. Denna fungerar (ska dock nämna att jag kanske inte vart drivande) . Det jag nu har en fråga om är inte på hela alltet utan snarare en specifik. Uppgiften går ut på att: Göra ett program som slumpar ut 7 tal av 35 möjliga, genom användandet av en vektor. Sekundärt är sedan att dessa ska sorteras

Frågan: I for loopen ligger en while loop. I boolean vektorer är ju alla siffror falska. While loopen är ju även den till för att kontrollera att ett tal inte upprepar sig själv. Men vart säger egentligen whileloopen det?
Som jag ser det så blir ett tal true, direkt i forloopen och därav önskar den gå in i whileloopen direkt iaf?

Jag förstår att skolfrågor inte är det som önskas här och förstår även avsaknad av svar därmed!Men är det någon vänlig skäl som önskar förklara sambandet och logiken bakom denna for/while loop i syftet att se till att talen blir unika så är jag dig mer än tacksam!

import java.util.*;
public class Lotto {
public static void main(String[] args){
Lotto l=new Lotto();
System.out.println(l.getLottorad());
}

private String getLottorad() {

//Skapar Vektor! Deklaration av variabler: index och tal, rad och r.
boolean Vektor[]=new boolean[35];
int i,tal;
String rad="";
Random r=new Random();

//Räknar upp till 7 slumpmassiga tal.
for (i=0;i<7;i++){
tal=r.nextInt(Vektor.length);

//Kollar om talet redan "har varit".
while(Vektor[tal]==true){
tal=r.nextInt(Vektor.length);

}

//Skriver ut en rad med tal + 1 eftersom man inte kan få noll i lotto.
Vektor[tal]=true;
rad=rad+" "+(tal+1);
}
System.out.println(rad);
rad="";

//Sorterar raden!
for(i=0;i<Vektor.length;i++){
if(Vektor[i]==true)
rad=rad+" "+(i+1);
}
//Skriver ut rad.
System.out.println(rad);
return "Programmet är klart." ;
}

}

Det handlar alltså om att förstå på vilket sätt whileloopen i detta fall fungerar och säkrar att det inte blir upprepning!
Tacksam för all hjälp jag kan få!

Du har en specifik frågeställning, vilket är det som oftast saknas i skoluppgiftsfrågor, då det är "jag ska göra ett program som gör derp, gör det åt mig plz!!!11one!eleven". Alltså är din fråga en helt OK fråga, imho.

Rad 11 initierar ett fält av 35 boolska värden, dvs true eller false.

Rad 18 slumpar fram ett tal, i intervallet 0-34.

Ponera att 13 slumpas fram, då kollar rad 18 om Vektor[13] är sant. Man kan se att vektor[Ett tal] blir bara sant först vid rad 26.

Så i korthet,

det initieras ett fält för VARJE givet möjligt tal man kan få (0-34). Booleanen sätts till sant för ett visst tal först när det har slumpats fram.

Whileloopen kollar om det slumpade talet redan har slumpats en gång, isåfall slumpar den på nytt tills den når ett tal om inte tidigare har slumpats.

Edit: Insåg att jag är lika pedagogisk som ett träd, men citera så ska jag återkomma om du vill.

Visa signatur

Jag är en optimist; det är aldrig så dåligt så att det inte kan bli sämre.

Permalänk
Medlem

Gjorde denna "uppgiften" för ett tag sedan:

public class NewLotto { public static void main(String[] args) { long[] numbers = new long[7]; long tmp = 0; boolean unique; for (int i = 0; i < numbers.length; i++) { tmp = 0; unique = false; while (!unique) { tmp = Math.round((Math.random() * 34)) + 1; unique = true; for (int j = 0; j < numbers.length; j++) { if (tmp == numbers[j]) { unique = false; System.out.println("Duplicate #: " + tmp); } } } numbers[i] = tmp; } for (int i = 0; i < numbers.length; i++) { System.out.println("Number " + (i + 1) + " is: " + numbers[i]); } } }

Resultat:

Duplicate #: 24
Duplicate #: 28
Number 1 is: 24
Number 2 is: 12
Number 3 is: 13
Number 4 is: 28
Number 5 is: 9
Number 6 is: 20
Number 7 is: 17

Visa signatur

Intel i7 2700k@4.3 | Gigabyte Z68X-UD3H-B3 | Gigabyte R9 280X | Fractal Design Define R3 |
Corsair 8GB 1600MHz VENGEANCE | Corsair SSD 120GB Force GT | Templarius Imperator 850W | Corsair Hydro H60 |
BenQ XL2410T | BenQ GL2450 | SteelSeries Siberia v2 | Razer BlackWidow | Zowie EC1

Permalänk
Medlem

Jag är ledsen, men strukturen på din kod är rätt dålig och onödigt komplex för den uppgift du vill den skall utföra.
Varför gör du en boolean vektor (35 lång) för att skapa en lottorad som är 7 lång? enda anledningen som jag ser det är att du använder längden av den för att generera ditt intervall av din randomizer.

Gör om programmeringen, är relativt säker på att din lärare när han säger att du skall använda en vektor för din lottorad inte menade att du skall använda längden av en vektor för att generera din radomize, utan mer för att spara resultatet.

dvs en int vektor som är 7 lång.
du kan loopa dig igenom länden av vektorn, och för vaje plats stoppar du en (randomize 34) +1

Edit:
Eller så snor du uppgiften av herren ovan som var så snäll och gav dig lösningen...

Visa signatur

They say a little knowledge is a dangerous thing, but it's not one half so bad as a lot of ignorance
- Terry Pratchett
_____________________________

Permalänk
Hedersmedlem

Jag la till code-taggar i första inlägget. Det är helt okej att ställa specifika frågor som du gör. Det är frågor efter hela lösningar som inte är okej.

MVH
Moderator Shimonu

Permalänk
Medlem

Oj! Överväldigande respons. Jag la undan sweclockers efter jag skrivit det då jag vet (och förstår) att skolfrågor inte är det roligaste. Men det var ju kul att jag iaf hade någon struktur. Nu vill jag även tacka, kraften som finns i internet på dessa forum är fantastisk, människor hjälper människor utan något motkrav!

Permalänk
Medlem
Skrivet av MacAtax:

Gjorde denna "uppgiften" för ett tag sedan:

public class NewLotto { public static void main(String[] args) { long[] numbers = new long[7]; long tmp = 0; boolean unique; for (int i = 0; i < numbers.length; i++) { tmp = 0; unique = false; while (!unique) { tmp = Math.round((Math.random() * 34)) + 1; unique = true; for (int j = 0; j < numbers.length; j++) { if (tmp == numbers[j]) { unique = false; System.out.println("Duplicate #: " + tmp); } } } numbers[i] = tmp; } for (int i = 0; i < numbers.length; i++) { System.out.println("Number " + (i + 1) + " is: " + numbers[i]); } } }

Resultat:

Duplicate #: 24
Duplicate #: 28
Number 1 is: 24
Number 2 is: 12
Number 3 is: 13
Number 4 is: 28
Number 5 is: 9
Number 6 is: 20
Number 7 is: 17

Du är ju värd din vikt i guld! Tack! dena ska jag lära mig mycket från! Ska börja testa så snart jag lagt ned boken!
Problemet här är att det inte ska ligga i main utan som jag förstår det ska man åberopa denna från main. Stökar detta till det enormt?

Permalänk
Medlem
Skrivet av Cove:

Jag är ledsen, men strukturen på din kod är rätt dålig och onödigt komplex för den uppgift du vill den skall utföra.
Varför gör du en boolean vektor (35 lång) för att skapa en lottorad som är 7 lång? enda anledningen som jag ser det är att du använder längden av den för att generera ditt intervall av din randomizer.

Gör om programmeringen, är relativt säker på att din lärare när han säger att du skall använda en vektor för din lottorad inte menade att du skall använda längden av en vektor för att generera din radomize, utan mer för att spara resultatet.

dvs en int vektor som är 7 lång.
du kan loopa dig igenom länden av vektorn, och för vaje plats stoppar du en (randomize 34) +1

Edit:
Eller så snor du uppgiften av herren ovan som var så snäll och gav dig lösningen...

Medans denna gjorde kännde jag samma sak som du beskriver. Mycket onödigt och som för mig snarare ställde till det ur ett logiskt perspektiv! Ska garanterat kolla på herren ovan:)

Tack för din respons!

Permalänk
Medlem
Skrivet av zyberzero:

Du har en specifik frågeställning, vilket är det som oftast saknas i skoluppgiftsfrågor, då det är "jag ska göra ett program som gör derp, gör det åt mig plz!!!11one!eleven". Alltså är din fråga en helt OK fråga, imho.

Rad 11 initierar ett fält av 35 boolska värden, dvs true eller false.

Rad 18 slumpar fram ett tal, i intervallet 0-34.

Ponera att 13 slumpas fram, då kollar rad 18 om Vektor[13] är sant. Man kan se att vektor[Ett tal] blir bara sant först vid rad 26.

Så i korthet,

det initieras ett fält för VARJE givet möjligt tal man kan få (0-34). Booleanen sätts till sant för ett visst tal först när det har slumpats fram.

Whileloopen kollar om det slumpade talet redan har slumpats en gång, isåfall slumpar den på nytt tills den når ett tal om inte tidigare har slumpats.

Edit: Insåg att jag är lika pedagogisk som ett träd, men citera så ska jag återkomma om du vill.

Detta var precis vad jag sökte! Så med andra ord lämnar den for varje gång, men först om det är så att ett tal redan har varit så går den in i whileloopen och kör där tills den hittar ett unikt, då går den ut?

Problematiken för mig uppstod i själva "whilebeteckningen" då jag oftast i beteckningar, tex denna uppgifts "for beteckning" (i= etc etc).
Vad står det egentligen i whilesatsen?

while(Vektor[tal]==true)

Denna fråga känner jag hur jag försvinner ut i obegripligheten på, är det så att det är fallet så säg åt mig att sluta tänka så långt. Annars förklara gärna! (har pluggat i 13 timmar så förstår knappt mig själv, vill bara tillbaka till julbordets underbara tröstätande)

Vill återigen tacka ALLA som tagit sig tid!

Permalänk
Medlem
Skrivet av Shimonu:

Jag la till code-taggar i första inlägget. Det är helt okej att ställa specifika frågor som du gör. Det är frågor efter hela lösningar som inte är okej.

MVH
Moderator Shimonu

Tack! Ska komma ihåg att göra det nästa gång!

Mvh Zoem

Permalänk
Hedersmedlem

Försök också hålla dig till ett inlägg, nu har du 5 st direkt efter varandra. Det finns en knapp som heter Citera flera som du kan använda, då får du ett citat i svarsrutan för varje inlägg du tryckt "Citera flera" på.

Det som står i while(...) är ett villkor som säger om den ska köra koden som finns i while-satsen.

Så om man skriver while(1 == 1) så kör den för alltid eftersom 1 kommer alltid vara lika med sig självt. Om man däremot har en variabel while(i < 5) så kommer den köra allting i while-satsen så länge som _i _ är mindre än 5.

Var det vad du undrade efter?

Permalänk
Medlem
Skrivet av Shimonu:

Försök också hålla dig till ett inlägg, nu har du 5 st direkt efter varandra. Det finns en knapp som heter Citera flera som du kan använda, då får du ett citat i svarsrutan för varje inlägg du tryckt "Citera flera" på.

Det som står i while(...) är ett villkor som säger om den ska köra koden som finns i while-satsen.

Så om man skriver while(1 == 1) så kör den för alltid eftersom 1 kommer alltid vara lika med sig självt. Om man däremot har en variabel while(i < 5) så kommer den köra allting i while-satsen så länge som _i _ är mindre än 5.

Var det vad du undrade efter?

Hej! Då får jag ursäkta, är inte allt för bra på forum än. Uteblivna kodtaggar och rad-på-rad inlägg ska inte ske igen!

Jo precis, while utför ju en aktion så länge det i whilesatsen är sant. Problemet är att i en (i<5) whilesats så kan jag verkligen förstå att så länge i är mindre än 5 så kommer den köra while. I while(Vektor[tal]==true) så förstår jag inte exakt vad det står. Jag vet att i boolean vektorer så börjar man med falskt. Så kan det vara så att så länge vektor talet är sant (dvs redan blivit uppräknat så går den in).

En fråga är då varför det inte blir följande. I forsatsen så slumpas ett tal, detta tal blir då sant (?) direkt och därav borde den (trots att det kanske är första slumpade talet) gå in i whilesatsen och fastna där? Om du förstår min relativt abstrakta fråga!

Tackar för svar!

Edit:

Efter två timmars pluggande och ett ganska pinsamt mejl till lärare som inte önskade avslöja svar så måste jag även fråga. Vart fan i denna sker sorteringen? Vi misstänkte här men förstod inte varför det nedanstående skulle initiera sortering.

for(i=0;i<Vektor.length;i++){
if(Vektor[i]==true)
rad=rad+" "+(i+1);

Det visade sig att det inte var det, vilket vi förstår. Men vi kan ta mig fan inte förstå vart sorteringen i sig sker!! Såhär blir utskriften sorterad och fin:

20 10 8 1 16 34 13
1 8 10 13 16 20 34
Programmet är klart.

Känner mig helt fantastisk nu ! =/

Permalänk
Medlem

// 1: Hämta ett tal mellan 0 och 34 tal = r.nextInt(Vektor.length); // 2: Kolla om värdet på positionen 'tal' i vektorn är sant. while (Vektor[tal] == true) { // 3: Om det är sant, så slumpar vi fram ett nytt tal mellan 0 och 34 och kontrollerar värdet igen. (dvs hoppa tillbaka till 2) tal = r.nextInt(Vektor.length); } // 4: Sätt värdet på position 'tal' i vektorn till sant. Vektor[tal] = true;

ex:
1: tal slumpas till 7.
2: Vektor[7] är false, dvs vi hoppar över while-loopen och går direkt till punkt 4.
4: Vektor[7] sätts till true.

nästa steg i for-loopen:
1: tal slumpas till 7 igen.
2: Vektor[7] är true, dvs while-villkoret uppfylls och vi fortsätter in till steg 3.
3: tal slumpas till 7 igen!
2: Vektor[7] är fortfarande true. hoppa in i loopen igen.
3: tal slumpas till 1.
2: Vektor[1] är false, hoppa till steg 4.
4: Vektor[1] sätts till true.

gällande sorteringen, så sorteras aldrig den vektorn ni använder för utmatning, då det är en vektorn med bool som ni läser av från början till slut. (nummerföljd på indexet.)
ett alternativ (för att få med sortering i er uppgift) är att bara lagra de tal ni slumpar fram och sedan sortera den vektorn.

typ:
skapa en vektor med längden 7.
slumpa ett tal mellan 1 och 35.
kontrollera om vektorn redan innehåller talet.
stoppa in talet i vektorn (om det inte redan finns) och fortsätt tills vektorn är fylld.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av jovnas:

// 1: Hämta ett tal mellan 0 och 34 tal = r.nextInt(Vektor.length); // 2: Kolla om värdet på positionen 'tal' i vektorn är sant. while (Vektor[tal] == true) { // 3: Om det är sant, så slumpar vi fram ett nytt tal mellan 0 och 34 och kontrollerar värdet igen. (dvs hoppa tillbaka till 2) tal = r.nextInt(Vektor.length); } // 4: Sätt värdet på position 'tal' i vektorn till sant. Vektor[tal] = true;

ex:
1: tal slumpas till 7.
2: Vektor[7] är false, dvs vi hoppar över while-loopen och går direkt till punkt 4.
4: Vektor[7] sätts till true.

nästa steg i for-loopen:
1: tal slumpas till 7 igen.
2: Vektor[7] är true, dvs while-villkoret uppfylls och vi fortsätter in till steg 3.
3: tal slumpas till 7 igen!
2: Vektor[7] är fortfarande true. hoppa in i loopen igen.
3: tal slumpas till 1.
2: Vektor[1] är false, hoppa till steg 4.
4: Vektor[1] sätts till true.

gällande sorteringen, så sorteras aldrig den vektorn ni använder för utmatning, då det är en vektorn med bool som ni läser av från början till slut. (nummerföljd på indexet.)
ett alternativ (för att få med sortering i er uppgift) är att bara lagra de tal ni slumpar fram och sedan sortera den vektorn.

typ:
skapa en vektor med längden 7.
slumpa ett tal mellan 1 och 35.
kontrollera om vektorn redan innehåller talet.
stoppa in talet i vektorn (om det inte redan finns) och fortsätt tills vektorn är fylld.

Blev väldigt glad över ditt inlägg. Väldigt pedagogiskt och jag förstod verkligen stegen i följd och uppgiften i sig. Jag måste tacka dig stort för detta, kommer se tillbaka på detta flera gånger. Det konstiga är att denna uppgift sorterar talen. Först dumpar den ut de 7 talen helt random. Under det står de 7 talen i ordning istället. Jag har jätteproblem med att se vart i programmet denna sortering sker. Tycker inte alls det framgår (vilket det säkert gör, som ni förstår är jag inte en framgångssaga i detta ämne!...än!)

edit: Vill även be om ursäkt för att detta inte blev så specifikt som jag i ämnet påstår. Alla som har tagit tid och svara är jag väldigt tacksam mot!

Permalänk
Medlem
Skrivet av Zoem:

Blev väldigt glad över ditt inlägg. Väldigt pedagogiskt och jag förstod verkligen stegen i följd och uppgiften i sig. Jag måste tacka dig stort för detta, kommer se tillbaka på detta flera gånger. Det konstiga är att denna uppgift sorterar talen. Först dumpar den ut de 7 talen helt random. Under det står de 7 talen i ordning istället. Jag har jätteproblem med att se vart i programmet denna sortering sker. Tycker inte alls det framgår (vilket det säkert gör, som ni förstår är jag inte en framgångssaga i detta ämne!...än!)

edit: Vill även be om ursäkt för att detta inte blev så specifikt som jag i ämnet påstår. Alla som har tagit tid och svara är jag väldigt tacksam mot!

Det är faktiskt så; det är svårt att se var sorteringen sker. Fält som ändrar värde hit och dit inuti nästlade loopar är jättesvårt att följa. Loopar överhuvudtaget är ganska krångliga, men vanligtvis (underligt nog) något av det första man får lära sig.

Problemet hade förövrigt kunnats lösa på detta sätt:

Integer[] nummer = new Integer[35]; // en samling med 35 nummer, 1 till 35 for (int i=0; i<nummer.length; i++) { nummer[i] = i+1; } Collections.shuffle(Arrays.asList(nummer)); // blanda runt Set<Integer> första7 = new TreeSet<Integer>(); for (int i=0; i<7; i++) { // lägg till de första sju numrena i den numera blandade vektorn första7.add(nummer[i]); } for (int n : första7) { // skriv ut dem System.out.print(n + " "); }

Java är ett nästan löjligt komplicerat språk när det kommer till så här enkla saker, tyvärr.

edit: Det visade sig att min kod inte heller var helt glasklar. Nu ska den fungera.

I Scala (ett annat språk som använder sig av Java-plattformen) kan man skriva ovanstående som:

val slumpadeNummer = (util.Random.shuffle(1 to 35) take 7).sorted println(slumpadeNummer mkString " ")

Vilket är både snabbare och tydligare... knäppt stor skillnad.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Zoem:

Det konstiga är att denna uppgift sorterar talen. Först dumpar den ut de 7 talen helt random. Under det står de 7 talen i ordning istället. Jag har jätteproblem med att se vart i programmet denna sortering sker. Tycker inte alls det framgår (vilket det säkert gör, som ni förstår är jag inte en framgångssaga i detta ämne!...än!)

problemet med att lokalisera sorteringen beror på att inte sker någon explicit sortering!

betrakta följande:

// 1: loopa igenom hela vaktorn, från index 0 till 34. for (i = 0; i < Vektor.length; i++) { // 2: har aktuellt nummer slumpats fram? if (Vektor[i] == true) { // 3: om det har det, lägg till det (+1) till resultatsträngen. rad = rad + " " + (i + 1); } }

i detta fall kommer den alltså att gå igenom hela vektorn från index 0 till 34.
om vi återanvänder exemplet från mitt första inlägg, så sker följande:

1: börja loopa, i är nu 0.
2: Vektor[0] är false. eftersom villkoret inte är sant, så hoppar vi över steg tre och går tillbaka till steg 1.
1: fortsätt loopen, i är nu 1.
2: Vektor[1] är true. kör steg 3.
3: rad är en tom sträng. lägg till i+1 till strängen. strängen innehåller nu " 2". hoppa upp till 1 igen.
1: fortsätt loopen, i är nu 2.
2: Vektor[2] är false. eftersom villkoret inte är sant, så hoppar vi över steg tre och går tillbaka till steg 1.
1: fortsätt loopen, i är nu 3.
osv.
1: fortsätt loopen, i är nu 7.
2: Vektor[7] är true. kör steg 3.
3: rad är en sträng som innehåller " 2". lägg till i+1 till strängen. strängen innehåller nu " 2 8". hoppa upp till 1 igen.
osv.

när i är 35 så är inte villkoret 'i < Vektor.lenght' sant längre, så loopen avslutas och sedan skrivs 'rad' ut.
som sagt så sker det alltså ingen sortering, eftersom koden går igenom vektorn i tur och ordning.
ändrar man for-satsen till for(int i = 34; i >= 0; i--) istället, så kommer raden att skrivas ut baklänges istället.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem

Specifik skolfråga, igen=/!

import java.util.*; public class Labbtvaa extends L2 { Scanner tgb=new Scanner(System.in); int svar; int räkna=0; int vektor []=new int[100]; int i; public Labbtvaa(){ System.out.println("4 val börja med 1!"); do { svar = this.skrivVal(); //System.out.println("4 cases välj ett!!!!"); //svar=tgb.nextInt(); switch (svar){ case 1: randoma(); skrivUt(); räkna++; break; case 2: if (räkna>0){ sortera(); skrivUt(); räkna++; } else{ System.out.println("Du måste välja 1 förstför att slumpa 100 tal"); } break; case 3: break; case 4: break; } } while (svar != 0); } public int skrivVal(){ int val; System.out.println("1. Slumpa 100 tal"); System.out.println("2. Sortera talen"); System.out.println("3. Summera alla tal, samt ta ut ett medelvärde"); System.out.println("4. Sök efter ett tal"); System.out.println("0. Avsluta"); System.out.print("Ditt val: "); val = tgb.nextInt(); return val; } public void skrivUt(){ for (i=0;i<100;i++){ System.out.print(vektor[i]+" "); if ((i+1) %10==0){ System.out.println(""); } } } public void randoma() { int i=0; int tal; Random r=new Random(); for (i=0;i<vektor.length-1;i++){ tal=r.nextInt(899); vektor[i]=tal; } //for (int i=0;i<vektor.length;i++){ // System.out.print(vektor[i]+" "); //} } public void sortera() { int slask,i; boolean färdig=false; while (färdig=false){ färdig=true; for (i=0;i<vektor.length-1;i++){ if (vektor[i]>vektor[i+1]){ slask=vektor[i+1]; vektor[i+1]=vektor[i]; vektor[i]=slask; färdig=false; } } /*int i, j; int slask; for (i = 0; i < vektor.length; i++) { for (j = (vektor.length - 1); j > i; j--) { if (vektor[j - 1] > vektor[j]) { { slask = (vektor[j - 1]); vektor[j - 1] = vektor[j]; vektor[j] = slask; } } } */ } } }

Jag anser mig hyffsad på bubblesorting, dock funkar det ibland och ibland inte. Som ni ser här så har vi en fungerande metod men det gör mig tokig att jag inte kan få min bubblesort att fungera. (Vi anropar denna klass från annan klass). Är det så att någon orkar ta sig tid och svara vore de underbart. Ska även sägas att vi vet att vi inte gjort alla switchcases:D.

Case 1 funkar och case 2, vill viss del. Den skriver ut samma nummer som case 1 men utan sortering (när bubblesort används).
Några idéer?

Mvh Zoem

Permalänk
Medlem

Ser inga problem med din kod.
Prova ändra så ni kör typ 5 tal och kolla sen när det går fel.
Säg tex att ni får fel på 50,410,500,232,555
Hårdkoda in dessa talen i din vektor sen stepdebuga i dina metoder och gör utskrifter så ni är säkra på att den går in i din sorterings metod etc.
På så vis borde ni kunna se var det går fel.

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

Försök gå igenom din fråga nästa gång innan du postar så det blir lite lättare för folk (iaf såna som mig ) att tyda den, så kan du få svar lite snabbare utan att man ska gå igenom koden och gissa.

Efter att ha kollat lite mer på din kod så tror (kommer fungera om du byter) jag att felet ligger i detta:

while (färdig=false) {

Du sätter din done flagga istället för att kolla den.
Därför vill man aldrig använda == i if / while satser eller dylikt, för detta är väldigt enkelt att göra och lätt att "stirra sig blind på"

Permalänk
Medlem
Skrivet av NoPaiN^:

Ser inga problem med din kod.
Prova ändra så ni kör typ 5 tal och kolla sen när det går fel.
Säg tex att ni får fel på 50,410,500,232,555
Hårdkoda in dessa talen i din vektor sen stepdebuga i dina metoder och gör utskrifter så ni är säkra på att den går in i din sorterings metod etc.
På så vis borde ni kunna se var det går fel.

Detta ska genast testast också! Har haft lite problem med bubblesort i eclipse då jag flera gånger nu stött på att exakt samma sortering ibland bryter ihop!

Skrivet av nesohc:

Jag vet inte alls om jag fattar vad du vill åstadkomma.
Du får gärna skriva lite mer tydligt vad det är som är problemet och vad du vill göra, den ena sorteringen fungerar ju, men den är bortkommenterad?
Den andra fungerar inte.
Sen får du gärna avsluta dina code taggar när du ska skriva din fråga.

Är den fungerande metoden inte din bubblesort?
Ifall det bara är så att din bubblesort ska fungera så räcker det med att du bara skriver in den koden.

Den nedanstående koden fungerar men är inte en bubblesort. Önskan var att få bubblesorten att funka. Den koden vi har tagit i kommentar för tillfället vet vi funkar men eftersom man gärna vill lära sig så mycket som möjligt och inte riskera något på vägen önskar jag inte lämna en bubblesort som jag/min lärare (kort kommenterat) och herren ovanför dig anser ser korrekt ut! Den är säkert fel, någonstans men jag vill gärna veta var så jag kan förbättra det!

Permalänk
Medlem
Skrivet av Zoem:

Detta ska genast testast också! Har haft lite problem med bubblesort i eclipse då jag flera gånger nu stött på att exakt samma sortering ibland bryter ihop!

Den nedanstående koden fungerar men är inte en bubblesort. Önskan var att få bubblesorten att funka. Den koden vi har tagit i kommentar för tillfället vet vi funkar men eftersom man gärna vill lära sig så mycket som möjligt och inte riskera något på vägen önskar jag inte lämna en bubblesort som jag/min lärare (kort kommenterat) och herren ovanför dig anser ser korrekt ut! Den är säkert fel, någonstans men jag vill gärna veta var så jag kan förbättra det!

Se min edit på min kommentar ovan.

Permalänk

Du har ju en massa extrakod som inte behövs:O
T.ex. bootlean färdig=false;
while(färdig=false)

varför har du detta uttrycket? Du återställer ju denna bara efteråt i din for loop. Och du får exakt samma effekt vad jag kunde se. Gick inte igenom hela koden men så långt iaf.

Permalänk
Medlem
Skrivet av nesohc:

Därför vill man aldrig använda == i if / while satser eller dylikt, för detta är väldigt enkelt att göra och lätt att "stirra sig blind på"

Därför skriver man inte

if (var = 42)

utan

if (42 == var)

vilket såklart leder till felaktig syntax om man använder bara ett =-tecken då det inte går att spara data i en konstant.

Permalänk
Hedersmedlem

Slog samma dina två trådar, har du fortsatta frågor kan du skriva de i den här tråden, ämnet har ju inte direkt förändrats. För att undvika att det blir korspostning.

Citat:

§ 3.3 Det är inte tillåtet att skapa flera trådar om samma ämne, varken i samma eller olika forumdelar (så kallad korspostning). Om en moderator har låst en tråd, är det inte tillåtet att skapa en ny tråd om samma ämne.

Kanske kan vara värt att läsa reglerna?
http://www.sweclockers.com/forum/regler

MVH
Moderator Shimonu

Permalänk
Medlem
Skrivet av nesohc:

Försök gå igenom din fråga nästa gång innan du postar så det blir lite lättare för folk (iaf såna som mig ) att tyda den, så kan du få svar lite snabbare utan att man ska gå igenom koden och gissa.

Efter att ha kollat lite mer på din kod så tror (kommer fungera om du byter) jag att felet ligger i detta:

while (färdig=false) {

Du sätter din done flagga istället för att kolla den.
Därför vill man aldrig använda == i if / while satser eller dylikt, för detta är väldigt enkelt att göra och lätt att "stirra sig blind på"

Herregud, du är en ängel. Det var ett sånt fel efter allt. Vi var två som jobba men som du säger, vi hade kanske kollat på koden i en timme, tillslut ser man ingenting om inte eclipse ger direkt utslag. Hörde att man kunde bli programblind i programmering men herregud!

Skrivet av Deathdevil:

Du har ju en massa extrakod som inte behövs:O
T.ex. bootlean färdig=false;
while(färdig=false)

varför har du detta uttrycket? Du återställer ju denna bara efteråt i din for loop. Och du får exakt samma effekt vad jag kunde se. Gick inte igenom hela koden men så långt iaf.

Hej! jag måste ju ha boolean färdig = false, för att få in karln i whileloopen första gången? Som du noterat har jag inte användt boolean innan och vektorn är inte en boolean vektor. Jag använder alltså enbart boolean för att sätta in en motor i whileloopen!

Skrivet av toj_ts:

Därför skriver man inte

if (var = 42)

utan

if (42 == var)

vilket såklart leder till felaktig syntax om man använder bara ett =-tecken då det inte går att spara data i en konstant.

Japp, tyvärr stirrade jag mig fruktansvärt blind:( Tack för ditt svar!

Permalänk
Medlem
Skrivet av toj_ts:

Därför skriver man inte

if (var = 42)

utan

if (42 == var)

vilket såklart leder till felaktig syntax om man använder bara ett =-tecken då det inte går att spara data i en konstant.

Egentligen vill jag inte gå så pass mycket off-topic som detta är, men dåliga rekommendationer till nybörjare är det som kan skapa dåliga ovanor. Och då du citerar mig så känns det onekligen som att du anser att min rekommendation att vara försiktig med att använda == var felaktig.

1. Vi pratar om boolean jämförelse, då skriver man aldrig if (false == value), utan if (!value) för false och if (value) för true.
2. Att ha en obskyr siffra som 42 utan att namnge den genom en variabel, används aldrig i projekt där mer en än person jobbar. Vilket gör att ändra vilken variabel som skrivs först är meningslöst.
3. Att jämföra java objekt med == gör att man tappar kontroll då java kollar på minnesadressen istället för innehållet i objektet. Bör endast användas om man faktiskt vet precis vad man gör. Ett exempel på detta är:

Date date1 = new Date(1234567890); Date date2 = new Date(1234567890); System.out.println(date1 == date2); System.out.println(date1.equals(date2));

Den första kommer vara false, då det är två olika minnesadressen medan den andra kommer vara true då båda faktiskt pekar på samma datum.

Men det är helt upp till dig hur du programmerar, men detta är till TS att inte få den ovanan att alltid bara jämföra via ==, oavsett vilket tal man skriver först. Lycka till

Permalänk
Skrivet av Zoem:

Hej! Vi har som ni ser nedan gjort en lottorad. Som skrivs ut och sorteras. Denna fungerar (ska dock nämna att jag kanske inte vart drivande) . Det jag nu har en fråga om är inte på hela alltet utan snarare en specifik. Uppgiften går ut på att: Göra ett program som slumpar ut 7 tal av 35 möjliga, genom användandet av en vektor. Sekundärt är sedan att dessa ska sorteras

Frågan: I for loopen ligger en while loop. I boolean vektorer är ju alla siffror falska. While loopen är ju även den till för att kontrollera att ett tal inte upprepar sig själv. Men vart säger egentligen whileloopen det?
Som jag ser det så blir ett tal true, direkt i forloopen och därav önskar den gå in i whileloopen direkt iaf?

for (i=0;i<7;i++){ tal=r.nextInt(Vektor.length); //Kollar om talet redan "har varit". while(Vektor[tal]==true){ tal=r.nextInt(Vektor.length); } //Skriver ut en rad med tal + 1 eftersom man inte kan få noll i lotto. Vektor[tal]=true; rad=rad+" "+(tal+1); }

Koden körs uppifrån och ner i den ordning den står, så först i ett varv i for-loopen så slumpar man fram ett nytt tal (säg 13 på varv 1). Så tal = 13 nu. Nästa steg blir att kolla om plats 13 i vektor är true, det är den inte eftersom alla är false från början. Alltså hoppar vi över while den här gången och hoppar vidare till att sätta plats 13 till true. Anledningen att den inte är true när du kommer till while är helt enkelt att man inte sätter värdet till true förrän efter. while(Vektor[tal]==true){ är det som testar om talet är använt innan, om värdet på platsen är true så är den besökt innan om det är false är den inte besökt innan. Inget blir true magiskt utan man måste ge det värdet true och det händer först efter while. Fråga igen om du inte förstår så ska jag försöka formulera om mig...

Visa signatur

Corsair Vengeance LPX 4x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)