Permalänk

Programmering c# Array-problem

hellooo

Håller på med en uppgift i skolan, det jag försöker ta reda på är följande:

jag har skapat en int array (vektor som det kallas i boken), där ska användaren fylla in vektor med tal.
Jag ska kunna sedan välja en metod som jag kan ta bort ett värde/element där användaren har fyllt i.
Jag har fixat allt det så det fungerar MEN mitt problem är: om användaren fyller i ex. "tal: 3" fyra ggr, och jag sedan väljer att ta bort talet 3, så vill jag att endast att en av dom 3:orna försvinner så jag har tre 3:or kvar i arrayen.
Har försökt trixat med detta ett tag nu men inte kommit på nån lösning ännu.
någon som kan hjälpa mig?
tack på förhand!

Permalänk
Medlem
Skrivet av Astroastro:

hellooo

Håller på med en uppgift i skolan, det jag försöker ta reda på är följande:

jag har skapat en int array (vektor som det kallas i boken), där ska användaren fylla in vektor med tal.
Jag ska kunna sedan välja en metod som jag kan ta bort ett värde/element där användaren har fyllt i.
Jag har fixat allt det så det fungerar MEN mitt problem är: om användaren fyller i ex. "tal: 3" fyra ggr, och jag sedan väljer att ta bort talet 3, så vill jag att endast att en av dom 3:orna försvinner så jag har tre 3:or kvar i arrayen.
Har försökt trixat med detta ett tag nu men inte kommit på nån lösning ännu.
någon som kan hjälpa mig?
tack på förhand!

Lägg ut koden här med code-taggarna - [code] DIN KOD [/code]
så ska du se att det blir lättare att hjälpa dig.

Men kan det vara så att du loopar igenom din array för att leta efter värdet du matade in? Prova då att stoppa när du hittat ett korrekt värde istället för att fortsätta.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk

Använder en for loop nu
T.ex
For (int i = 0; i < array.length; i++)
If ( array[i] == usersNumber)
Break;

Kan skicka koden senare för mer exakt

Skickades från m.sweclockers.com

Permalänk
Vila i frid

I vissa fall kan en lista vara enklare att hantera än en array/vektor.

Permalänk

Aa, dock måste de va array enligt uppgiften

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av hasenfrasen:

I vissa fall kan en lista vara enklare att hantera än en array/vektor.

Det är sånt som brukar komma senare har jag märkt i många kurser, så det finns en stor sannolikhet att det inte är ett godkänt sätt att lösa uppgiften på

Visa signatur

🖥 → Ryzen 5 1600 • Asus GTX 1060 6GB • 16GB 3200Mhz
💻 → Macbook Pro Core i5 8GB 128GB SSD 13.3"

Permalänk
Medlem
Skrivet av Astroastro:

Ska göra det när jag kmr hem, har en for loop nu
T.ex
For (int i = 0; i < array.length; i++)
If ( array[i] == usersNumber)
Break;

Kan skicka koden senare för mer exakt

Skickades från m.sweclockers.com

Om du gör det där så ska din for-loop brytas vid första matchning.

Skrivet av hasenfrasen:

I vissa fall kan en lista vara enklare att hantera än en array/vektor.

Så är det säkert, men om uppgiften hänvisar till array/vektor så är det givetvis detta som TS ska använda i sin lösning

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk

Tycker det känns rätt oxå men resultat blir fel, alla av samma värden försvinner 🤔

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av Astroastro:

Tycker det känns rätt oxå men resultat blir fel, alla av samma värden försvinner 🤔

Vänligen skicka koden här i tråden så blir det mycket enklare att hjälpa dig

Använd också code-taggar så blir koden läsbar.

[code]
Din kod här :)
[/code]
ex.

if (something) { doStuff(); }

Visa signatur

| EVGA Z170 FTW | i7 6700k | ASUS RTX 3070 | 16GB DDR4 3200MHz | Cooler Master V850 | Samsung 840 Evo 250GB + 2x WD Black 500GB + Seagate 2TB SSHD + Samsung 970 Evo M.2 500GB |

Permalänk
Hedersmedlem
Skrivet av Astroastro:

hellooo

Håller på med en uppgift i skolan, det jag försöker ta reda på är följande:

jag har skapat en int array (vektor som det kallas i boken), där ska användaren fylla in vektor med tal.
Jag ska kunna sedan välja en metod som jag kan ta bort ett värde/element där användaren har fyllt i.
Jag har fixat allt det så det fungerar MEN mitt problem är: om användaren fyller i ex. "tal: 3" fyra ggr, och jag sedan väljer att ta bort talet 3, så vill jag att endast att en av dom 3:orna försvinner så jag har tre 3:or kvar i arrayen.
Har försökt trixat med detta ett tag nu men inte kommit på nån lösning ännu.
någon som kan hjälpa mig?
tack på förhand!

Steg 1: Leta upp vilket index (i) objeket du vill ta bort finns på.
Steg 2: Flytta det som finns på i+1 till i, från i+2 till i+1 etc
Steg 3: Minska räknaren som håller koll på hur många objekt du har i listan (eller så rensar du sista elementet, beroende på hur du har gjort)

Eller om ordningen på listan inte spelar någon roll så kan du flytta det sista värdet in i "hålet" där värdet du tog bort fanns.

Permalänk
Medlem
Skrivet av Astroastro:

Använder en for loop nu
T.ex
For (int i = 0; i < array.length; i++)
If ( array[i] == usersNumber)
Break;

Kan skicka koden senare för mer exakt

Skickades från m.sweclockers.com

Break ska skrivas med små bokstäver, break;

Det där kommer att avbryta loopen, jag ser inte i koden vart du tar bort något.
Just nu gör du detta,

FÖR VARJE TAL I array
OM DETTA VÄRDE I array ÄR LIKA MED usersNumber
AVBRYT LOOPEN.

Det är här du vill ta bort värdet på det indexet (i) innan ditt break; statement.

Du kan också använda IndexOf(object). Detta kommer att returera det första index som matchar det du söker.
Får du ingen träff så retureras -1 (out of bounds, alltså indexet finns inte i din array).

var indexToDelete = array.IndexOf(usersNumber); if(indexToDelete != -1) { array[indexToDelete] = 0; // 0 Är default för int, använder du nullable types (int?) kan du använda null. } // ...Annars gör det du vill göra om numret inte finns.

Permalänk

Tack för alla svar

string str; int getOff; while (true) { try // Ålder skrivs in på den avgående passageraren. { Console.WriteLine("Avgående passagerare"); Console.WriteLine("------------------------"); Console.Write("Vänligen skriv in ålder: "); str = Console.ReadLine(); getOff = Convert.ToInt32(str); break; } catch { Console.WriteLine(".............."); Console.WriteLine("OGILTIGT VAL ."); Console.WriteLine("Försök igen ."); Console.WriteLine("--------------"); } } for (int i = 0; i < passengers.Length; i++) { if (getOff == passengers[i]) // Tar bort passagerare sedan flyttar upp resten av värdena i arrayen. { passengers = passengers.Where(f => f != getOff).ToArray(); Array.Resize(ref passengers, 25); // Lägger till ett nytt element i arrayen. break; } } antal_passagerare--; Console.WriteLine("Passagerare med ålder: " + getOff + " har lämnat bussen."); Console.WriteLine("Återgå till meny: Tryck valfri tangent"); Console.ReadKey();

Permalänk
Skrivet av zaibuf:

Break ska skrivas med små bokstäver, break;

Det där kommer att avbryta loopen, jag ser inte i koden vart du tar bort något.
Just nu gör du detta,

FÖR VARJE TAL I array
OM DETTA VÄRDE I array ÄR LIKA MED usersNumber
AVBRYT LOOPEN.

Det är här du vill ta bort värdet på det indexet (i) innan ditt break; statement.

Du kan också använda IndexOf(object). Detta kommer att returera det första index som matchar det du söker.
Får du ingen träff så retureras -1 (out of bounds, alltså indexet finns inte i din array).

var indexToDelete = array.IndexOf(usersNumber); if(indexToDelete != -1) { array[indexToDelete] = 0; // 0 Är default för int, använder du nullable types (int?) kan du använda null. } // ...Annars gör det du vill göra om numret inte finns.

Kod upplagd

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av Astroastro:

for (int i = 0; i < passengers.Length; i++) { if (getOff == passengers[i]) // Tar bort passagerare sedan flyttar upp resten av värdena i arrayen. { passengers = passengers.Where(f => f != getOff).ToArray(); Array.Resize(ref passengers, 25); // Lägger till ett nytt element i arrayen. break; } }

Du kommer nästan garanterat inte få godkänt för en sån här lösning, helt enkelt eftersom den använder mer avancerade konstruktioner än ni lär ha lärt er än. Poängen med såna här uppgifter är att visa att du förstår grunderna, med din nuvarande lösning ser mer ut som att du bara kopierat någon (väldigt oeffektiv¹) lösning från nätet.

Det finns i stort sett två olika sätt att lösa problemet på. Det mest effektiva sättet att lösa det på är att helt enkelt bara kopiera den sista passageraren till platsen för passageraren som du vill ta bort. Den sista passageraren blir då duplicerad, men det löser sig när du sen minskar antal_passagerare med ett eftersom den sista platsen i bussen då "glöms bort". Nackdelen med denna lösning är att ordningen på passagerarna kastas om när du bort passagerare.

Om ordningen på passagerarna måste bibehållas så är den andra lösningen att göra vad din nuvarande kod gör, d.v.s. ta reda på vilket index passageraren som ska tas bort ligger på och flytta upp alla element efter det indexet ett steg. Men använd for-loopar för att loopa igenom och flytta elementen "manuellt" istället. Om du vill kunna tala om för användaren att det inte fanns någon passagerare som matchade så är det troligtvis enklast att använda två separata for-loopar, en som letar efter passageraren och en som flyttar passagerarna, istället för att nästla for-loopar.

Du behöver för övrigt inte gå igenom hela arrayen, utan bara så många element som det finns passagerare. D.v.s. använd inte passengers.Length när du loopar igenom arrayen, utan antal_passagerare.

¹ Koden är oeffektiv eftersom den först går igenom hela arrayen för att leta efter rätt passagerare, struntar sen i indexet som hittats och går igenom hela arrayen igen för att skapa en lista som sen direkt konverteras till en array, och till sist skapar en ny array med 25 element och kopierar alla element från den gamla arrayen till den nya.

Permalänk
Skrivet av perost:

Du kommer nästan garanterat inte få godkänt för en sån här lösning, helt enkelt eftersom den använder mer avancerade konstruktioner än ni lär ha lärt er än. Poängen med såna här uppgifter är att visa att du förstår grunderna, med din nuvarande lösning ser mer ut som att du bara kopierat någon (väldigt oeffektiv¹) lösning från nätet.

Det finns i stort sett två olika sätt att lösa problemet på. Det mest effektiva sättet att lösa det på är att helt enkelt bara kopiera den sista passageraren till platsen för passageraren som du vill ta bort. Den sista passageraren blir då duplicerad, men det löser sig när du sen minskar antal_passagerare med ett eftersom den sista platsen i bussen då "glöms bort". Nackdelen med denna lösning är att ordningen på passagerarna kastas om när du bort passagerare.

Om ordningen på passagerarna måste bibehållas så är den andra lösningen att göra vad din nuvarande kod gör, d.v.s. ta reda på vilket index passageraren som ska tas bort ligger på och flytta upp alla element efter det indexet ett steg. Men använd for-loopar för att loopa igenom och flytta elementen "manuellt" istället. Om du vill kunna tala om för användaren att det inte fanns någon passagerare som matchade så är det troligtvis enklast att använda två separata for-loopar, en som letar efter passageraren och en som flyttar passagerarna, istället för att nästla for-loopar.

Du behöver för övrigt inte gå igenom hela arrayen, utan bara så många element som det finns passagerare. D.v.s. använd inte passengers.Length när du loopar igenom arrayen, utan antal_passagerare.

¹ Koden är oeffektiv eftersom den först går igenom hela arrayen för att leta efter rätt passagerare, struntar sen i indexet som hittats och går igenom hela arrayen igen för att skapa en lista som sen direkt konverteras till en array, och till sist skapar en ny array med 25 element och kopierar alla element från den gamla arrayen till den nya.

Tack så mycket för informationen!

Skickades från m.sweclockers.com

Permalänk
Medlem

Är tanken att alla element ska flyttas? I verkligheten så byter inte alla plats i en buss bara för att en person kliver av. Det kanske räcker att sätta den platsen i arrayn till noll för att representera en ledig plats? Står det specifikt i uppgiften att alla index behöver flytas upp ett steg så att sista platsen alltid är den som ska fyllas?

Permalänk

En lösning som är väldigt smidig är att använda sig av en List istället för en array. Inte lika fint för prestandan dock. Man kan även kombinera dom två. Då en List kan bli översatt till en array. Där hittar du funktioner som jag tror du skulle ha bra använding för tex, .Add(vector) .Remove(vector) .Contains(vector) .RemoveAt(int index) .ToArray()

https://docs.microsoft.com/en-us/dotnet/api/system.collection...

Rekomenderar även Linq bibloteket som låter dig sortera listor/arrays på ett smidigt sätt. (using System.Linq)

https://www.geeksforgeeks.org/linq-sorting-operator-orderby/

Glöm inte att google är din bästa vän när du börjar med programmering

Permalänk
Medlem
Skrivet av SimonLarsson:

En lösning som är väldigt smidig är att använda sig av en List istället för en array. Inte lika fint för prestandan dock. Man kan även kombinera dom två. Då en List kan bli översatt till en array. Där hittar du funktioner som jag tror du skulle ha bra använding för tex, .Add(vector) .Remove(vector) .Contains(vector) .RemoveAt(int index) .ToArray()

https://docs.microsoft.com/en-us/dotnet/api/system.collection...

Rekomenderar även Linq bibloteket som låter dig sortera listor/arrays på ett smidigt sätt. (using System.Linq)

https://www.geeksforgeeks.org/linq-sorting-operator-orderby/

Glöm inte att google är din bästa vän när du börjar med programmering

Brukar vara krav att använda arrayer i grundläggande programmering för att implementera de funktionerna själv. Lists får inte användas, då det gör uppgiften enkel.
Men annars är list att föredra då man har behov av att ändra värden i sin array.

Det viktiga med uppgiften är att förstå hur indexering i arrayer fungerar och hur man kan flytta elementen. Listor abstraherar bort allt detta åt dig.

Skulle undvika LINQ tills att man är bekväm med loopar och det grundläggande.

Skickades från m.sweclockers.com

Permalänk
Skrivet av zaibuf:

Brukar vara krav att använda arrayer i grundläggande programmering för att implementera de funktionerna själv. Lists får inte användas, då det gör uppgiften enkel.
Men annars är list att föredra då man har behov av att ändra värden i sin array.

Det viktiga med uppgiften är att förstå hur indexering i arrayer fungerar och hur man kan flytta elementen. Listor abstraherar bort allt detta åt dig.

Skulle undvika LINQ tills att man är bekväm med loopar och det grundläggande.

Skickades från m.sweclockers.com

jo rimligt, Värt att notera också är att linq har en del minnesläckor som kan vara bra att veta om i framtiden.

Permalänk
Medlem
Skrivet av SimonLarsson:

jo rimligt, Värt att notera också är att linq har en del minnesläckor som kan vara bra att veta om i framtiden.

Intressant, dela gärna med dig. Specifikt i LINQ eller LINQ till SQL med Entity Framework? Har själv inte stött på några läckor ännu.

Skickades från m.sweclockers.com

Permalänk
Skrivet av zaibuf:

Intressant, dela gärna med dig. Specifikt i LINQ eller LINQ till SQL med Entity Framework? Har själv inte stött på några läckor ännu.

Skickades från m.sweclockers.com

Lite fel forumtråd för det men kortfattat. Linq .orderby och många av deras andra metoder har minnesläckor som är väldigt små men kan ha påverkan beroende på vad man gör. Håller på med spelutveckling och tex en update funktion med en linq sortering kan leda till mb av skräpdata. Garbage collector kan oftast lösa det men kostar på cpun för att den ska utföra sina grejer också.

Permalänk

Bra information för vidare studier. Stämmer att vi måste jobba med arrayer endast

Skickades från m.sweclockers.com

Permalänk

Har lyckats med koden nu och med endast for loopar,
Tack för hjälpen!

Skickades från m.sweclockers.com