Permalänk
Medlem

C# den där j*kla ryggsäcken

Hej! Ni känner säkert till den här uppgiften, men hittar verkligen inget svar på min fråga på hela internet.

Såhär ser koden ut just nu:

case 1: for (int i = 0; i < rygga.Length; i++) { if (rygga[1] == null) { Console.Write("Lägg till: "); rygga[1] = Console.ReadLine(); } if (rygga[2] == null) { Console.Write("Lägg till: "); rygga[2] = Console.ReadLine(); } }

Mitt problem är att när man väljer [1] i menyn så körs case 1. Men efter att man lagrat en text i rygga[1] så hoppar den direkt till rygga[2]. Jag vill att den återgår direkt till menyn. Har provat att skriva hela case 1 på olika sätt men lyckas inte.
Så som jag vill ha det fungerar lätte enkelt med en lista istället. Men vi ska använda en array.

Mvh!

Lagt till code-taggar, tagit bort massa mellanslag i början / Mod
Visa signatur

CPU:Intel core i7 9700k@5.2Ghz, 1.37 vcore (Noctua NH-D14) GPU: EVGA GTX 1070 FTW @ 2210/4500mhz MINNE: Corsair 2133Mhz OC'd @ 3300Mhz 16-17-17-34, 16GB MODERKORT:GIGABYTE AORUS Z390 ELITE NÄTAGG: Corsair CX650M, Corsair 120Gb SSD, SAMSUNG SSD 850 EVO 500GB HDD, CHASSI: Cooler master 430 elite @ 3 fans. Skärm: ASUS ROG Swift

Permalänk
Hedersmedlem

Hej! Jag redigerade till ditt inlägg så att koden är enklare att läsa.

Använd gärna [code] före och [/code] efter din kod så blir den lättare att läsa med indrag.

Du har ju skrivit din kod som att du lägger till två objekt, så det är inte konstigt att du får en fråga om att skriva in två objekt att lägga till i ryggsäcken. Det du behöver är en variabel som räknar efter hur många objekt du har i ryggsäcken. Arrayen är alltid lika stor (säg 100 platser) men sen sparar du en variabel som säger hur många objekt du har, och därmed vet du också vilket "index" du ska lägga in ett nytt objekt i.

Permalänk
Medlem

Du använder ju aldrig ditt index inuti "for-loopen". Så i dagsläget så upprepar du endast samma kod i antal gånger.

För övrigt så känner jag inte till uppgiften och har ingen aning om vad du försöker göra...

Permalänk
Medlem

Båda dina if satser körs så det är helt rätt att både rygga[1] och rygga[2] delarna kommer att köras.
Använd if else, eller switch om du bara vill hantera två eller ett fåtal element
Bättre är att göra en generell if sats utan hårdkodad array position

missförstod problemet.
Permalänk

Ser inte varför du använder en for-loop utan att använda indexet som du har i din variabel i.

Permalänk
Medlem

Skippa loopen och sätt index 1 till texten bara?
Vet inte vad programmet ska göra dock, ska du ha en case för varje position i arrayen? verkar lite märkligt.
För övrigt så använder du inte loop variabeln i for-loopen heller.

Annars för att avbyta en loop tidigare använder du break;

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av zaibuf:

Skippa loopen och sätt index 1 till texten bara?
Vet inte vad programmet ska göra dock, ska du ha en case för varje position i arrayen? verkar lite märkligt.
För övrigt så använder du inte loop variabeln i for-loopen heller.

Annars för att avbyta en loop tidigare använder du break;

Skickades från m.sweclockers.com

Så skrev jag först.
typ såhär

case 1: Console.write("Lägg till "); rygga[1] = Console.ReadLine() Console.write("Lägg till "); rygga [2]=Console.ReadLine(); rygga[3] osv..

Programmet ska spara ner inmatade strängar i en array[5]

uppgiften var enkel för mig när jag använda klassen list. Men måste använda en array o vet inte hur jag ska göra för att återgå till menyn efter en inmatning sparats.

Visa signatur

CPU:Intel core i7 9700k@5.2Ghz, 1.37 vcore (Noctua NH-D14) GPU: EVGA GTX 1070 FTW @ 2210/4500mhz MINNE: Corsair 2133Mhz OC'd @ 3300Mhz 16-17-17-34, 16GB MODERKORT:GIGABYTE AORUS Z390 ELITE NÄTAGG: Corsair CX650M, Corsair 120Gb SSD, SAMSUNG SSD 850 EVO 500GB HDD, CHASSI: Cooler master 430 elite @ 3 fans. Skärm: ASUS ROG Swift

Permalänk
Medlem

När man sedan kommer till menyn och väljer att lägga till en string igen så ska den ju sparas på en tom plats i arrayn.

Visa signatur

CPU:Intel core i7 9700k@5.2Ghz, 1.37 vcore (Noctua NH-D14) GPU: EVGA GTX 1070 FTW @ 2210/4500mhz MINNE: Corsair 2133Mhz OC'd @ 3300Mhz 16-17-17-34, 16GB MODERKORT:GIGABYTE AORUS Z390 ELITE NÄTAGG: Corsair CX650M, Corsair 120Gb SSD, SAMSUNG SSD 850 EVO 500GB HDD, CHASSI: Cooler master 430 elite @ 3 fans. Skärm: ASUS ROG Swift

Permalänk
Medlem
Skrivet av kevvz0r:

När man sedan kommer till menyn och väljer att lägga till en string igen så ska den ju sparas på en tom plats i arrayn.

Så du ska bara lägga till om det är tomt?
För det första så måste du ha i som index i rygga, annars har ju loopen ingen funktion.

Ska du bara lägga till en sak i taget?
I så fall måste du bryta loopen efter att du lagt till något.
Ingen ide att någon annan löser uppgiften åt dig, men läs på om break; och return; när det gäller loopar.

Visa signatur

Ny signatur!

Permalänk
Medlem

Skillnaden mellan att göra detta med en List är ju liten mot en array.

Du vill ju loopa igenom alla platser i ryggan och lägga till den i första lediga sen kan du avbryta loopen.
kollat på break;?

Använd även variabeln i i for loopen annars har du ingen större nytta av loopen

Visa signatur

Fractal Design Node 304 -> ASUS ROG STRIX Z370-I GAMING ->i5 8600K -> be quiet! Pure Rock -> MSI GeForce RTX 4070 VENTUS 2X E 12G OC -> Corsair Vengeance LPX 3200 32GB -> Seasonic FOCUS Plus 650W Gold -> Samsung 960 EVO 500GB -> 2 * Western Digital Black 2 TB -> Samsung 850 EVO Basic SSD 500GB

Permalänk
Medlem
Skrivet av kevvz0r:

Så skrev jag först.
typ såhär

case 1: Console.write("Lägg till "); rygga[1] = Console.ReadLine() Console.write("Lägg till "); rygga [2]=Console.ReadLine(); rygga[3] osv..

Programmet ska spara ner inmatade strängar i en array[5]

uppgiften var enkel för mig när jag använda klassen list. Men måste använda en array o vet inte hur jag ska göra för att återgå till menyn efter en inmatning sparats.

Vad är menyn?
Du får exempelvis hålla din huvudmeny i en while loop som körs så länge programmet är i gång.

var isRunning = true; while(isRunning) { //... skriv ut meny //... välj input // ... Switch sats med cases // ... en knapp för att avsluta programmet (isRunning = false) }

Permalänk
Medlem
Skrivet av DanTheManSwe:

Så du ska bara lägga till om det är tomt?
För det första så måste du ha i som index i rygga, annars har ju loopen ingen funktion.

Ska du bara lägga till en sak i taget?
I så fall måste du bryta loopen efter att du lagt till något.
Ingen ide att någon annan löser uppgiften åt dig, men läs på om break; och return; när det gäller loopar.

Precis. Det är ju en jätte liten detalj jag missar de vet jag..Men kan inte komma på vad det är. Har googlat som en dåre men får inte fram något där någon beskriver just de problemet.
Jag har provat att sätta en break och en return. Jag har som sagt provat en hel del för att se vad som händer men jag har ju missat något.
Alltså uppgiften är redan godkänd. Men det är bättre om man kan få den som jag vill. och jag vill ju ha den på det visat så vill ju givetvis lär mig hur.
Om någon kan skriva en snutt kod som fungerar så kan jag prova den och titta så jag förstår precis vad som händer i step-in to.

Visa signatur

CPU:Intel core i7 9700k@5.2Ghz, 1.37 vcore (Noctua NH-D14) GPU: EVGA GTX 1070 FTW @ 2210/4500mhz MINNE: Corsair 2133Mhz OC'd @ 3300Mhz 16-17-17-34, 16GB MODERKORT:GIGABYTE AORUS Z390 ELITE NÄTAGG: Corsair CX650M, Corsair 120Gb SSD, SAMSUNG SSD 850 EVO 500GB HDD, CHASSI: Cooler master 430 elite @ 3 fans. Skärm: ASUS ROG Swift

Permalänk
Medlem
Skrivet av kevvz0r:

Precis. Det är ju en jätte liten detalj jag missar de vet jag..Men kan inte komma på vad det är. Har googlat som en dåre men får inte fram något där någon beskriver just de problemet.
Jag har provat att sätta en break och en return. Jag har som sagt provat en hel del för att se vad som händer men jag har ju missat något.
Alltså uppgiften är redan godkänd. Men det är bättre om man kan få den som jag vill. och jag vill ju ha den på det visat så vill ju givetvis lär mig hur.
Om någon kan skriva en snutt kod som fungerar så kan jag prova den och titta så jag förstår precis vad som händer i step-in to.

Vet inte exakt hur du menar, case 1 i switchen ska lägga till ett item i ryggsäcket oavsätt vilken position i arrayen man är?
Detta är ju en vanlig for-loop där du kommer loopa arrayen och första värdet som är null kommer få ditt värde. Vet inte om det är så du menar?

for(int i = 0; i < arr.length; i++) { if(arr[i] == null) { arr[i] = Console.ReadLine(); break; } }

Permalänk
Medlem

Ja om jag fattar rätt så gör du bara som inlägget ovan. Dvs loopa igenom tills du hittar Första tomma platsen i arrayen och sedan stoppar du in din string där

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av zaibuf:

Vet inte exakt hur du menar, case 1 i switchen ska lägga till ett item i ryggsäcket oavsätt vilken position i arrayen man är?
Detta är ju en vanlig for-loop där du kommer loopa arrayen och första värdet som är null kommer få ditt värde. Vet inte om det är så du menar?

for(int i = 0; i < arr.length; i++) { if(arr[i] == null) { arr[i] = Console.ReadLine(); break; } }

Nej. det blir precis samma sak som dom andra sätten jag provat.

Programmet återgår inte till menyn förrns man fyllt hela arrayen. Jag vill att man ska komma till menyn igen efter att man lagt till något.
Väljer man sedan 1 igen för att lägga till så ska den välja att fylla plats 2. Väljer man case 1 igen ska den lägga in i plats 3.

Men hur jag än gör även med era exempel så blir ser det ut såhär i konsolen.
[code] Lägg till: "inmatning"
Lägg till: "inmatning"
Lägg till: "inmatning"
Lägg till: "inmatning"

Raden lägg till ska alltså bara köras en gång¨, inte alla platser på samma gång. Hoppas ni förstår nu.

Visa signatur

CPU:Intel core i7 9700k@5.2Ghz, 1.37 vcore (Noctua NH-D14) GPU: EVGA GTX 1070 FTW @ 2210/4500mhz MINNE: Corsair 2133Mhz OC'd @ 3300Mhz 16-17-17-34, 16GB MODERKORT:GIGABYTE AORUS Z390 ELITE NÄTAGG: Corsair CX650M, Corsair 120Gb SSD, SAMSUNG SSD 850 EVO 500GB HDD, CHASSI: Cooler master 430 elite @ 3 fans. Skärm: ASUS ROG Swift

Permalänk
Keeper of Traditions
Skrivet av kevvz0r:

Nej. det blir precis samma sak som dom andra sätten jag provat.

Programmet återgår inte till menyn förrns man fyllt hela arrayen. Jag vill att man ska komma till menyn igen efter att man lagt till något.
Väljer man sedan 1 igen för att lägga till så ska den välja att fylla plats 2. Väljer man case 1 igen ska den lägga in i plats 3.

Men hur jag än gör även med era exempel så blir ser det ut såhär i konsolen.
[code] Lägg till: "inmatning"
Lägg till: "inmatning"
Lägg till: "inmatning"
Lägg till: "inmatning"

Raden lägg till ska alltså bara köras en gång¨, inte alla platser på samma gång. Hoppas ni förstår nu.

Så strunta i for-loopen och ha bara ett index som pekar på den senast ifyllda positionen i arrayen?

Så istället för index i, så kör du

if(arr[lastIndex] == null) { arr[i] = Console.ReadLine(); lastIndex++; }

EDIT: Ingen break om man nu tar bort for-loopen

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 kevvz0r:

Nej. det blir precis samma sak som dom andra sätten jag provat.

Programmet återgår inte till menyn förrns man fyllt hela arrayen. Jag vill att man ska komma till menyn igen efter att man lagt till något.
Väljer man sedan 1 igen för att lägga till så ska den välja att fylla plats 2. Väljer man case 1 igen ska den lägga in i plats 3.

Men hur jag än gör även med era exempel så blir ser det ut såhär i konsolen.
[code] Lägg till: "inmatning"
Lägg till: "inmatning"
Lägg till: "inmatning"
Lägg till: "inmatning"

Raden lägg till ska alltså bara köras en gång¨, inte alla platser på samma gång. Hoppas ni förstår nu.

Låter sjukt märkligt, break ska avbryta nuvarande loop och fortsätta till nästa kodrad. Behöver se mer kod för att kunna se vad som då strular. Låter som det är någon annan logik som strular i detta fall.

Skickades från m.sweclockers.com

Permalänk
Medlem

Kom över lösningen i en video. Jag facepalma så hårt.. Kanske ni med borde?

if (rygga[i] == null) { Console.Write("Lägg till: "); rygga[i] = Console.ReadLine(); if (rygga[i] != null) { Console.WriteLine("Du har lagt till: " + rygga[i]); i = rygga.Length; }

Det var alltså bara lägga till i = rygga.Length;

Visa signatur

CPU:Intel core i7 9700k@5.2Ghz, 1.37 vcore (Noctua NH-D14) GPU: EVGA GTX 1070 FTW @ 2210/4500mhz MINNE: Corsair 2133Mhz OC'd @ 3300Mhz 16-17-17-34, 16GB MODERKORT:GIGABYTE AORUS Z390 ELITE NÄTAGG: Corsair CX650M, Corsair 120Gb SSD, SAMSUNG SSD 850 EVO 500GB HDD, CHASSI: Cooler master 430 elite @ 3 fans. Skärm: ASUS ROG Swift

Permalänk
Medlem

Nu vet jag inte vad uppgiften faktiskt går ut på och hur din fullständiga lösning ser ut, men det känns spontant som att allt inte är korrekt. Den sista kodsnutten du visade oss tyder på att din array skulle vara variabel i storlek, vilket dem inte är i C# (till detta kan listor användas). Din "rygga" är, om det nu är en array, en konstant storlek vilket innebär att ditt "i" inte ändrar värde varje gång ovanstående kodsnutt körs. Kan du visa hela uppgiftsbeskrivningen och hela din lösning istället, så att man kan ge tips på hur du kan gå vidare?

Visa signatur

Skoj: Ryzen 9 5900x, RTX 3080, 32 GB RAM @3200MHz CL16
Jobb: Alienware M15 R6, RTX 3080, 32 GB RAM
Privat: Macbook Pro 13" late 2016

Permalänk
Medlem
Skrivet av kevvz0r:

Kom över lösningen i en video. Jag facepalma så hårt.. Kanske ni med borde?

if (rygga[i] == null) { Console.Write("Lägg till: "); rygga[i] = Console.ReadLine(); if (rygga[i] != null) { Console.WriteLine("Du har lagt till: " + rygga[i]); i = rygga.Length; }

Det var alltså bara lägga till i = rygga.Length;

Ingen annan än du borde facepalma, nej. Det har svarats flera gånger att du måste använda `i` som index istället för hårdkodade siffror. Din kod gör ungefär det fast halvkasst.

Visa signatur

WS: MSI B350M Mortar | AMD Ryzen 7 1700 | PH-TC14PE | 32GB DDR4 3000MHz | 1TB Kingston NV2 | Intel Arc A750 8GB | 2*BenQ G2420HDB
Router: Gigabyte GA-870-UD3 | AMD Phenom II x6 1055t @ 2600MHz, 1.25V | 12GB DDR3 | 2*250GB HDD @ RAID1 | 4TB HDD
Laptop: Thinkpad X220 4291-QF6

Permalänk
Medlem
Skrivet av kevvz0r:

Kom över lösningen i en video. Jag facepalma så hårt.. Kanske ni med borde?

if (rygga[i] == null) { Console.Write("Lägg till: "); rygga[i] = Console.ReadLine(); if (rygga[i] != null) { Console.WriteLine("Du har lagt till: " + rygga[i]); i = rygga.Length; }

Det var alltså bara lägga till i = rygga.Length;

Som redan nämnts här så är problemet bristen på information. Det har på inget sätt varit tydligt vad uppgiften är och vad din lösning försöker göra. Du pratar om problemet och din egen lösning ("åter gå till menyn", etc.) som om att det vore allmänt känt och ingen ytterligare information behövs. Dessutom har du endast lagt in snutt av din kod. Dessutom har lösningen du kommit fram till redan föreslagits flera gånger i tråden (och är väldigt trivial för alla som kan programmera).

Så i all välmening, du borde kanske se över hur du formulerar dina frågeställningar och försök se till att de som vill hjälpa dig har tillräckligt med information för att kunna göra det.

Permalänk
Keeper of Traditions
Skrivet av kevvz0r:

Kom över lösningen i en video. Jag facepalma så hårt.. Kanske ni med borde?

if (rygga[i] == null) { Console.Write("Lägg till: "); rygga[i] = Console.ReadLine(); if (rygga[i] != null) { Console.WriteLine("Du har lagt till: " + rygga[i]); i = rygga.Length; }

Det var alltså bara lägga till i = rygga.Length;

Det är ju precis den lösningen jag gav två inlägg ovanför...

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

Du har ju fått lösningen ovan men om du vill använda if satserna som du skrivit det behöver du använda "else"

if (rygga[1] == null) { Console.Write("Lägg till: "); rygga[1] = Console.ReadLine(); } else //Denna gör att bara en av dem körs. if (rygga[2] == null) { Console.Write("Lägg till: "); rygga[2] = Console.ReadLine(); }

Visa signatur

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu