Permalänk
Medlem

Fråga om Array i c# nybörjare.

Har fastnat vid en grej som jag ej hittar verken på tuben eller i min lärobok(säkert missat något) tänkte kolla om någon kan göra en snabb förklaring.

jag gör ett projekt där jag har en huvudmeny, och den ska skicka användaren till addera person i en arrey! jag vet hur man fyller hela..

Men mitt problem är, hur fyller jag bara enstaka positioner i vektorn? alltså jag fyller pos. 1-3 första varvet i loopen, och nästa gång vill jag fylla på från 4 och framåt.. men när jag kommer in i andra varvet så skriver den bara över det gamla.. Kasnske förklarar lite dåligt! men här är koden.. Det är metoden add.passenger() som jag inte får till

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace test4 { class buss { int val = 0; public int[] passagerare = new int[20]; public int antal_passagerare; public void Run() { Console.WriteLine("Welcome to the Buss-simulator"); Console.WriteLine("Press any key to continue . . . "); Console.ReadKey(true); do { Console.WriteLine(" Vänligen ange alternativ :"); Console.WriteLine(" Alt 1: Lägg till passagerare :"); Console.WriteLine(" Alt 2 återgå till start :"); while (true) { int nr; if (int.TryParse(Console.ReadLine(), out nr)) { val = nr; break; } else { Console.Write("ange nr"); } } switch (val) { case 1: add_passenger(); break; default: break; } } while (val == 0); } public void add_passenger() { int antal = 0; Console.WriteLine("hur många passagerar vill du gå ombord med "); antal = int.Parse(Console.ReadLine()); for (int i = 0; i < antal; i++) { Console.WriteLine("Skriv åldern på passageraren : "); int antal_passagerare = int.Parse(Console.ReadLine()); passagerare[i] = antal_passagerare; } Console.WriteLine(passagerare[0]); Console.WriteLine(passagerare[1]); Console.WriteLine(passagerare[2]); val = 0; } } }

Permalänk
Medlem

För att komma åt objekt i en array används index. Array[0] , Array[1] osv. Du fyller alltid 0-2 i din array (Alltså skriver alltid över de gamla). Å andra sidan har du endast initierat en array med tre platser så du kan inte lägga till fler.

Jag rekommenderar dig att kolla in List. Då är det enklare att lägga till och ta bort objekt (i ditt fall passagerare).

Edit: Kändes som att jag var otydlig. Din loop går hela tiden från 0 till 2 eftersom du satt i = 0. Därav kommer du alltid skriva över dina tidigare värden.

Permalänk
99:e percentilen

Du låter alltid i gå från 0 och uppåt:

for (int i = 0; i < antal; i++)

Observera också att du har en public int antal_passagerare som du aldrig vare sig läser eller modifierar, samt en int antal_passagerare som namnet till trots verkar representera en ålder.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

passagerare[i] = antal_passagerare;

Du skriver på position "i" i Arrayen.

for (int i = 0; i < antal; i++)

"i" börjar alltid på 0 så du skriver över det du tidigare skrivit.

Istället för att skriva till position "i" i passagerare så vill du skriva till första lediga positionen. Antingen kan du hålla reda på hur många som du redan har i arrayen. Jag tror det är vad antal_passagerare egentligen ska användas till. Eller så kan du leta reda på första positionen som inte har ett värde.

Men din array är bara 3 positioner stor, så du kommer lätt få out of bounds error:

public int[] passagerare = new int[3];

Visa signatur

He who hasn't hacked assembly language as a youth has no heart. He who does so as an adult has no brain.
~John Moore

Permalänk
Medlem

@Anaii: ändrade storleken till 20 platser nu. Men okey, så i=0; så börjar jag alltid på 0. Det förklarar ju överskriften av redan inatade tal rätt så bra !

men behöver jag bara ändra något i for - loopens vilkor? eller hur hittar jag första lediga plats, den int veriablen som heter antal_passagerare förstår jag inte vart jag ska sätta in.

Permalänk
99:e percentilen
Skrivet av lallas91:

men behöver jag bara ändra något i for - loopens vilkor? eller hur hittar jag första lediga plats, den int veriablen som heter antal_passagerare förstår jag inte vart jag ska sätta in.

En for-loop brukar ha följande struktur:

for (setup; condition; between) body

Om du säger "for-loopens villkor" tänker nog de flesta på enbart condition; det kan vara bra att ha i åtanke.

Betrakta följande for-loop:

for (int i = x; condition; between) body

I den koden kan x vara vilket uttryck som helst av typen int.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

Tror kanske jag löste det nu! Ser detta bättre ut? eller hade de gått göra på ett bättre sätt?

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace test4 { class buss { int val = 0; public int[] passagerare = new int[20]; public int antal_passagerare; public void Run() { Console.WriteLine("Welcome to the Buss-simulator"); Console.WriteLine("Press any key to continue . . . "); Console.ReadKey(true); do { Console.WriteLine(" Vänligen ange alternativ :"); Console.WriteLine(" Alt 1: Lägg till passagerare :"); Console.WriteLine(" Alt 2 återgå till start :"); while (true) { int nr; if (int.TryParse(Console.ReadLine(), out nr)) { val = nr; break; } else { Console.Write("ange nr"); } } switch (val) { case 1: add_passenger(); break; default: break; } } while (val == 0); } public void add_passenger() { int antal = 0; Console.WriteLine("hur många passagerar vill du gå ombord med "); antal = int.Parse(Console.ReadLine()); for (int i=0 ; i < antal; i++) { Console.WriteLine("antal passagerare : "); int antal_passagerare1 = int.Parse(Console.ReadLine()); passagerare[antal_passagerare] = antal_passagerare1; antal_passagerare++; } Console.WriteLine(passagerare[0]); Console.WriteLine(passagerare[1]); Console.WriteLine(passagerare[2]); Console.WriteLine(passagerare[3]); Console.WriteLine(passagerare[4]); Console.WriteLine(passagerare[5]); Console.WriteLine(passagerare[6]); Console.WriteLine(passagerare[7]); val = 0; } } }

Permalänk
Medlem

@lallas91: Vad händer om du skriver in att du vill gå ombord med 25 passagerare? Och nej, du har inte löst det.

Permalänk
Medlem

@ToddTheOdd: Det tror jag jag ska lösa med lite tillagda if satser. Men jag vet inte ens om koden får se ut så här rörig. Men jag tror de ska funka iaf. är väldigt tidigt in på denna uppgiften så har många timmar kvar.

public void add_passenger() { int antal = 0; Console.WriteLine("hur många passagerar vill du gå ombord med "); antal = int.Parse(Console.ReadLine()); if (antal <= 25) { for (int i = 0; i < antal; i++) if (antal_passagerare < passagerare.Length) { Console.WriteLine("ålder på passagerana "); int antal_passagerare1 = int.Parse(Console.ReadLine()); passagerare[antal_passagerare] = antal_passagerare1; antal_passagerare++; }else { Console.WriteLine("fullt i bussen"); break; } } else { Console.Write("ge upp"); }

Permalänk
Medlem

@lallas91 Din kod må vara rörig, men den innehåller även otydliga variabelnamn.

Exempelvis frågar du vad åldern är på passagerarna och lägger sedan in detta i en variabel som heter "antal_passagerare1" vilket känns skumt. Sedan bör du endast fråga åldern på en passagerare eftersom du endast lägger in en åt gången.

Så ett lämpligare namn hade kunna vara "ålderPåPassagerare". Rekommenderar dock att köra engelska redan från början av sin programmeringskarriär.

Samt det du gör här:

if (antal <= 25)

är ju att kolla om det du skriver in i konsollen om hur många passagerare som ska stiga på denna gång är sant eller falskt. Du ska kolla mot hur många passagerare som faktiskt sitter i bussen.

Edit: Läste inte koden så noga så jag såg att du hade satt in det där jag nämnde innan för att säkerställa att användare inte skriver över din arraystorlek redan från början.

Permalänk
Medlem

Några tips;

if (antal <= 25)

Undersök istället om antalet man matar in får plats i arrayen;

if (antal < passagerare.length)

Sen kan du kanske lägga till en undersökning kring hur många platser som faktiskt är tagna;

if ((antal+antal_passagerare) < passagerare.length)

Sen som tidigare påpeka. Tänk igenom dina variablenamn, det blir otroligt grötigt när många heter snarlikt.

Permalänk
99:e percentilen
Skrivet av lallas91:

for (int i=0 ; i < antal; i++) { Console.WriteLine("antal passagerare : "); int antal_passagerare1 = int.Parse(Console.ReadLine()); passagerare[antal_passagerare] = antal_passagerare1; antal_passagerare++; }

Har du reflekterat över mitt tips ovan?

Skrivet av Alling:

I den koden kan x vara vilket uttryck som helst av typen int.

Alltså, for-loopen måste inte ha int i = 0 eller int i = 5; den kan ha int i = x, där x är vilket uttryck som helst av typen int.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

@Alling: Absolut ett bra tips! stirrar mig blint på läroboken ibland! Där det i alla exemplaren på en for-loop används I=0!

Men det ska jag testa lite med. Tack för tipset

Permalänk
Medlem

@Forsgren: Det ska jag tänka på , måste börja tänka på kommentera min kod också. Tack för tipset

Permalänk
99:e percentilen
Skrivet av lallas91:

@Alling: Absolut ett bra tips! stirrar mig blint på läroboken ibland! Där det i alla exemplaren på en for-loop används I=0!

Det är också det vanligaste i verkligheten. Däremot tycker jag att "standard-for-loopar", där en hel lista itereras över, ofta med fördel kan ersättas med foreach-loopar. De uttrycker tydligare programmerarens intention, eliminerar risken för OBOE och innehåller mindre så kallad boilerplate – för att inte tala om hur mycket lättare de är att läsa. Betrakta själv dessa två ekvivalenta loopar:

var fibNumbers = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13 }; foreach (int element in fibNumbers) { Console.WriteLine($"Element: {element}"); } for (int i = 0; i < fibNumbers.Count; i++) { Console.WriteLine($"Element: {fibNumbers[i]}"); }

Därmed inte sagt att foreach alltid är att föredra framför for. Men jag är personligen väldigt mycket för att skriva så lättläst och expressiv kod som möjligt, så foreach är mitt förstahandsval.

Visa signatur

Skrivet med hjälp av Better SweClockers