Permalänk
Medlem

Ditt alternativ heter ju "Lägg till en passagerare", men metoden ser ut att köra så länge som inte bussen är full. Är det meningen så?

Rimligtvis borde du först kontrollera om bussen är full. Om så är fallet så kan man inte lägga till flera passagerare.
Är bussen inte full kan man lägga till ett antal.

Säg att det finns 20 personer på bussen redan (Jag antar att man inte måste fylla bussen i ett svep) och att användaren därefter matar in att den vill lägga till 7 personer. Det skulle bli för mycket eller hur?

Du har då två alternativ: Endera får du förhindra att någon användare läggs till, eller också så får du efter varje ny person kontrollera om det finns mer plats.

Så som du har skrivit din kod nu

do
{
...
}
while (antal_Passagerare <= 25);

Kommer ju Add_passenger att hålla på så länge villkoret är uppfyllt, d.v.s. så länge som antalet passagerare är mindre än eller lika med 25 st.

Permalänk
Medlem

@Olsv: Du kontrollerar om bussen är full först efter att du redan lagt till alla passagerare, så användaren kan ändå mata in fler än 25 passagerare och krascha programmet.

Jag vet dock inte varför du får meddelandet om att lägga till fler passagerare om du lägger till fler än 25, loopen borde bryta när antal_Passagerare överstiger 25. Däremot kan jag inte riktigt se vad loopen fyller för funktion, är det verkligen meningen att du ska tvinga användaren att mata in 25 passagerare?

Din for-loop börjar för övrigt alltid på 0, så varje gång Add_passenger anropas eller do-while-loopen kör ett nytt varv så kommer du skriva över passagerarna du redan lagt till.

Permalänk
Medlem

Tack för alla tips! Jag har nu ändrat om lite. Får det dock inte att fungera mer än första gången. Så fort jag ska lägga till passagerare (via menyn) en andra gång så hoppar jag bara tillbaka till menyn. Jag inser också att if borde ligga ett steg upp men det lyckas inte heller. Men egentligen är väl (som någon sa) if loopen helt onödig eftersom jag redan ha en for loop som kontrollerar att antalet inte överskrider 25. Men hur kan jag då få ut ett meddelande när bussen är full?

public void Add_passenger() { Console.WriteLine(antal_Passagerare); int antal; Console.WriteLine("Hur många passagerare vill du lägga till?"); antal = int.Parse(Console.ReadLine()); if (antal_Passagerare + antal < 26) { for (int i = antal_Passagerare; antal_Passagerare < antal; i++) { Console.WriteLine("Hur gammal är passageraren?"); int nyPassagerare = int.Parse(Console.ReadLine()); passagerare[i] = nyPassagerare; antal_Passagerare++; } } else { int platserKvar = 25 - antal_Passagerare; Console.WriteLine("Du försöker att lägga till " + antal + " stycken passagerare, det går inte eftersom bussen då blir full"); Console.WriteLine("Det finns " + platserKvar + " stycken platser kvar. Vänligen försök igen"); } }

Permalänk
Medlem

@Olsv: För det första måste du bestämma vad som ska hända om användaren vill lägga till fler passagerare än det finns plats för. Vill du att användaren ska få mata in ett nytt antal? Eller ska användaren skickas tillbaka till menyn istället? Eller vill du lägga till så många passagerare som det får plats? O.s.v.

Försök sen bryta ner problemet i mindre delar. Att bestämma hur många passagerare som ska läggas till är t.ex. ett separat problem från att faktiskt lägga till dem, så du kan dela upp din Add_passenger-metod i två faser: bestämma antal och lägga till passagerare. Just nu är din kod ganska invecklad eftersom du blandar dessa faser, d.v.s. koden för att lägga till passagerare ligger mitt i metoden istället för i slutet.

Permalänk
Medlem

Min tanke är att kontrollera om summan som användaren ska lägga till får plats - gör den inte det så meddelas hur många platser det finns kvar och man återgår till menyn. Så långt fungerar det men när man sedan väljer att lägga till ytterligare användare så går det bara ibland. Om man väljer exempelvis 2 fungerar det inte, men 10 fungerar. Jag kan verkligen inte hitta felet...

Permalänk
Medlem
Skrivet av Olsv:

Min tanke är att kontrollera om summan som användaren ska lägga till får plats - gör den inte det så meddelas hur många platser det finns kvar och man återgår till menyn. Så långt fungerar det men när man sedan väljer att lägga till ytterligare användare så går det bara ibland. Om man väljer exempelvis 2 fungerar det inte, men 10 fungerar. Jag kan verkligen inte hitta felet...

Första kontrollen för att avgöra om insättningen skulle ge en full buss eller inte är ju bra.
Och sedan så har du tänkt rätt, du ska börja att loopa (iterera) med ett index som är lika med det nuvarande antalet passagerare som finns på bussen. På så vis blir det ju rätt plats för dem med en gång när de sätts in.

Ett annat alternativ hade t.ex. varit att loopa över antalet och lägga till ett offset motsvarande antalet som var med på bussen när loopen påbörjades.

Problemet ligger i ditt loopvillkor. Om det från början finns två passagerare på bussen och användaren vill lägga två till så kommer
antal_Passagerare < antal (2 < 2) inte att bli uppfyllt och loopen körs inte.

Edit: Jag var tvungen att koda ihop det själv och det finns faktiskt ett ännu bättre sätt att göra det. Eftersom du hela tiden håller koll på hur många som finns på bussen genom att anropa antal_Passagerare++; efter varje insättning så finns ju svaret där. Då behöver du inte hålla på att räkna fram vilken nästa platsen ska bli. Jag tänkte inte säga mer än så nu. Försök igen själv och se om du lyckas.

Permalänk
Medlem
Skrivet av MickeBoy:

Edit: Jag var tvungen att koda ihop det själv och det finns faktiskt ett ännu bättre sätt att göra det. Eftersom du hela tiden håller koll på hur många som finns på bussen genom att anropa antal_Passagerare++; efter varje insättning så finns ju svaret där. Då behöver du inte hålla på att räkna fram vilken nästa platsen ska bli. Jag tänkte inte säga mer än så nu. Försök igen själv och se om du lyckas.

Såklart lyckas jag inte. Men bör jag ändra i for loopen eller if? Har testat i båda men det verkar inte fungera...

Permalänk
Medlem
Skrivet av Olsv:

Såklart lyckas jag inte. Men bör jag ändra i for loopen eller if? Har testat i båda men det verkar inte fungera...

Det slutade med att jag ändrade på / i loopen, både villkoren och hur nästa insättning ser ut.

Såhär blir min insättning:
passagerare[antal_Passagerare] = nyPassagerare;

Permalänk
Medlem
Skrivet av Olsv:

Min tanke är att kontrollera om summan som användaren ska lägga till får plats - gör den inte det så meddelas hur många platser det finns kvar och man återgår till menyn. Så långt fungerar det men när man sedan väljer att lägga till ytterligare användare så går det bara ibland. Om man väljer exempelvis 2 fungerar det inte, men 10 fungerar. Jag kan verkligen inte hitta felet...

Din for-loop är som redan påpekats fel. Ett tips är att för tillfället ta bort for-loopen och bara skriva koden för att lägga till en enda passagerare. När det fungerar behöver du bara upprepa den koden antal gånger med en loop.

Ett annat tips är att du kan använda return även i en metod som inte returnerar något för att direkt hoppa ur den. Din metod kan med andra ord skrivas om så här:

public void Add_passenger() { Console.WriteLine(antal_Passagerare); int antal; Console.WriteLine("Hur många passagerare vill du lägga till?"); antal = int.Parse(Console.ReadLine()); if (antal_Passagerare + antal > 25) { int platserKvar = 25 - antal_Passagerare; Console.WriteLine("Du försöker att lägga till " + antal + " stycken passagerare, det går inte eftersom bussen då blir full"); Console.WriteLine("Det finns " + platserKvar + " stycken platser kvar. Vänligen försök igen"); return; } for (int i = antal_Passagerare; antal_Passagerare < antal; i++) { Console.WriteLine("Hur gammal är passageraren?"); int nyPassagerare = int.Parse(Console.ReadLine()); passagerare[i] = nyPassagerare; antal_Passagerare++; } }

Det enda jag gjort här är alltså att vända på if-satsen och hoppa ur metoden med return om det blir fel, vilket gör koden "plattare" (färre nästlade satser) eftersom for-loopen inte längre behöver vara inne i if-satsen. Koden gör samma sak som tidigare (inklusive felen), men den är i min åsikt mindre komplicerad och enklare att resonera kring.

Permalänk
Medlem
Skrivet av perost:

Din for-loop är som redan påpekats fel. Ett tips är att för tillfället ta bort for-loopen och bara skriva koden för att lägga till en enda passagerare. När det fungerar behöver du bara upprepa den koden antal gånger med en loop.

Ett annat tips är att du kan använda return även i en metod som inte returnerar något för att direkt hoppa ur den. Din metod kan med andra ord skrivas om så här:

public void Add_passenger() { Console.WriteLine(antal_Passagerare); int antal; Console.WriteLine("Hur många passagerare vill du lägga till?"); antal = int.Parse(Console.ReadLine()); if (antal_Passagerare + antal > 25) { int platserKvar = 25 - antal_Passagerare; Console.WriteLine("Du försöker att lägga till " + antal + " stycken passagerare, det går inte eftersom bussen då blir full"); Console.WriteLine("Det finns " + platserKvar + " stycken platser kvar. Vänligen försök igen"); return; } for (int i = antal_Passagerare; antal_Passagerare < antal; i++) { Console.WriteLine("Hur gammal är passageraren?"); int nyPassagerare = int.Parse(Console.ReadLine()); passagerare[i] = nyPassagerare; antal_Passagerare++; } }

Det enda jag gjort här är alltså att vända på if-satsen och hoppa ur metoden med return om det blir fel, vilket gör koden "plattare" (färre nästlade satser) eftersom for-loopen inte längre behöver vara inne i if-satsen. Koden gör samma sak som tidigare (inklusive felen), men den är i min åsikt mindre komplicerad och enklare att resonera kring.

Tack snälla för all hjälp! Dessvärre får jag det fortfarande inte att fungera trots att jag använder koden ovan. Problemet är det samma - jag kan bara lägga till användare först gången. Jag antar att det beror på att antal passagerare aldrig nollställs (vilket väl inte heller borde) och därför blir antal mindre än antal passagerare nästa gången loopen körs. Har försökt att lösa problemet men på olika vis men inte lyckats..

Permalänk
Vila i frid
Skrivet av Olsv:

Har försökt att lösa problemet men på olika vis men inte lyckats.

Hur ser tänket bakom det hela ut då? Om du inte kan bryta upp ditt program i smådelar och förklara det för dig själv (eller andra) hur det är tänkt att fungera är det svårt att knacka kod. Systemera lite istället för att våndas över koden. Börja med en kravspec - det kan låta löjligt med ett så pass litet program men kommer man inte framåt trots ivrigt påhejande är det nog enda vägen att gå - förrutom att låta någon annan skriva programmet åt dig - och det förmodar jag iaf att du inte vill. Right?

Permalänk
Medlem
Skrivet av Olsv:

Tack snälla för all hjälp! Dessvärre får jag det fortfarande inte att fungera trots att jag använder koden ovan. Problemet är det samma - jag kan bara lägga till användare först gången. Jag antar att det beror på att antal passagerare aldrig nollställs (vilket väl inte heller borde) och därför blir antal mindre än antal passagerare nästa gången loopen körs. Har försökt att lösa problemet men på olika vis men inte lyckats..

Kolla igenom logiken en extra gång. Närmare bestämt din for-loop från kodsnutten ovan:

for (int i = antal_Passagerare; antal_Passagerare < antal; i++) { Console.WriteLine("Hur gammal är passageraren?"); int nyPassagerare = int.Parse(Console.ReadLine()); passagerare[i] = nyPassagerare; antal_Passagerare++; }

Går vi igenom tänket för denna loop, så ser vi att index börjar vid antal_Passagerare vilket är korrekt, du vill ju fortsätta öka på tills dess att antalet är rätt.
Men sen då? Vad är villkoret för att for-loopen ska iterera? Jo, det är nämligen antal_Passagerare är mindre än antal. Vad är antal? Det är antalet passagerare som du vill lägga till.

För att visa hur detta blir galet, kan vi ta ett exempel nedan:
Ponera att du har 3st passagerare (antal_Passagerare = 3) och vill nu lägga till två nya passagerare (antal = 2).
Hur skulle din for-loop då se ut?

for (int i = 3; 3 < 2; i++)

Detta fungerar inte, ellerhur? antal_Passagerare är 3, men du jämför med ditt nya antal som är 2. 3 är större än 2 och ditt villkor fungerar därför inte längre.
Vill du däremot lägga till fler än nuvarande antal passagerare så fungerar det.

Här är alltså problemet att du måste justera villkoret. Du vill iterera din for-loop för varje ny person som du vill lägga till, fram tills dess att du antingen; nått max-kapaciteten för bussen - eller - nått antal personer som du vill lägga till.
Detta kan då skrivas som följande;

for(int i = 0; i < antal; i++) // Kolla om du har plats för en till person // Om ja; lägg till personen (antal_Passagerare + 1) // Om nej; Avbryt loopen och skriv ut meddelande?

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

Permalänk
Medlem
Skrivet av hasenfrasen:

Hur ser tänket bakom det hela ut då? Om du inte kan bryta upp ditt program i smådelar och förklara det för dig själv (eller andra) hur det är tänkt att fungera är det svårt att knacka kod. Systemera lite istället för att våndas över koden. Börja med en kravspec - det kan låta löjligt med ett så pass litet program men kommer man inte framåt trots ivrigt påhejande är det nog enda vägen att gå - förrutom att låta någon annan skriva programmet åt dig - och det förmodar jag iaf att du inte vill. Right?

Nejdå, är inte intresserad av att någon skriver programmet åt mig. I så fall hade jag kunnat kopiera en av lösningarna som finns på detta forum. I uppgiften ingår att skriva en kravspec - vilket jag har gjort. Det är den specifika detaljen att jag inte lyckas förstå hur jag ska lyckas återställa "antal". Jag förutsätter inte att någon här ska ge mig svaret men eftersom jag under tre dagar inte lyckats lösa problemet så vänder jag mig hit i förhoppning om att förstå vad jag gör fel, för jag vill lära mig

Permalänk
Medlem
Skrivet av Olsv:

Tack snälla för all hjälp! Dessvärre får jag det fortfarande inte att fungera trots att jag använder koden ovan.

Koden jag visade var inte ett förslag på en lösning, den innehåller samma fel som din kod. Det var bara ett förslag på hur du kan organisera koden på ett enklare sätt.

Skrivet av Olsv:

Problemet är det samma - jag kan bara lägga till användare först gången. Jag antar att det beror på att antal passagerare aldrig nollställs (vilket väl inte heller borde) och därför blir antal mindre än antal passagerare nästa gången loopen körs. Har försökt att lösa problemet men på olika vis men inte lyckats..

Jag skulle som sagt föreslå att du börjar med att skriva kod för att lägga till en enda passagerare på nästa tomma plats, du kan göra det utan att blanda in några loopar. När du kan lägga till en passagerare så kan du lägga till flera genom att bara köra den koden flera gånger.

Permalänk
Medlem

Och så ska du få ett tips av mig också. Rita upp datastrukturen för dig själv för ett enkelt testfall med papper och penna.

Från början så är antal_Passagerare = 0 och
vektorn
passagerare[0] = 0
passagerare[1] = 0
...
passagerare[24] = 0

Efter en första insättning av två personer 10 och 12 år gamla så borde det vara som så att:

antal_Passagerare = 2 och
vektorn
passagerare[0] = 10
passagerare[1] = 12
passagerare[2] = 0
passagerare[3] = 0
...
passagerare[24] = 0

Hur kan du nu få fram vilken nästa plats någon ska sparas i?

Kanske kan det hjälpa dig att formulera för dig själv hur programmet ska fungera.
Rita också för dig själv upp hur strukturen ser ut när det är några fler som har hoppat på bussen för att se ett samband.

Edit: Tog bort citat, det blev lite konstigt då tipset mer är riktat till TS.

Permalänk
Vila i frid
Skrivet av Olsv:

Det är den specifika detaljen att jag inte lyckas förstå hur jag ska lyckas återställa "antal".

Koncentrera dig på "antal" och greppa först vad den används till, när den används och hur den påverkas samt vad annat som påverkas av den.

Att stega igenom koden med en debugger och ha "watch" på ingående variabler brukar oftast ge en snabb inblick i vad det är man missat i sina tankegångar. För koden är det aldrig fel på så länge den går att kompilera utan det är tänket bakom koden som felar.

Permalänk
Medlem

Tack alla som hjälpt! Med era tips har jag äntligen fått ordning på koden Inser nu att jag inte är någon stjärna på detta...

Permalänk
Medlem

Hej sitter med denna uppgift, hur löste du den?

Skrivet av exaaivilo:

Haha, okej... Vilket slarvfel, tack för hjälpen. Nu funkar det finfint!

Hur löste du den? Varför funkade inte den loopen,: 'Index was outside the bounds of the array.'"

Super tacksam för hjälp, tack på förhand.

Permalänk
Medlem
Skrivet av oswen97:

Hur löste du den? Varför funkade inte den loopen,: 'Index was outside the bounds of the array.'"

Super tacksam för hjälp, tack på förhand.

Svårt att säga exakt var du gjort fel eftersom du inte delar din kod, men som felmeddelandet säger så försöker du skriva eller läsa från ett index som inte finns i din array. Antagligen så rör det sig om ett så kallat "fence post error", där du bara är en siffra ifrån, så +-1.

Visa signatur

| MSI B650 Tomahawk | Ryzen 7 9800X3D | ASUS RTX 3070 | 64GB DDR5 6000MHz | MSI MPG A1000G | Samsung 970 Evo M.2 1TB + 2x WD Black SN850X 2TB|

Permalänk
Medlem

Så ser den delen av kod ut

Skrivet av BrutalSwede:

Svårt att säga exakt var du gjort fel eftersom du inte delar din kod, men som felmeddelandet säger så försöker du skriva eller läsa från ett index som inte finns i din array. Antagligen så rör det sig om ett så kallat "fence post error", där du bara är en siffra ifrån, så +-1.

public void Sort_buss()
{
int max = passenger.Length - 1;
for (int i = 0; i < max; i++)
{
int nrLeft = max - i;

for (int j = 0; i < nrLeft; j++)
{
if (passenger[j] > passenger[j + 1])
{
int temp = passenger[j];
passenger[j] = passenger[j + 1];
passenger[j + 1] = temp;
}
}
}

Permalänk
Medlem
Skrivet av oswen97:

public void Sort_buss() { int max = passenger.Length - 1; for (int i = 0; i < max; i++) { int nrLeft = max - i; for (int j = 0; i < nrLeft; j++) { if (passenger[j] > passenger[j + 1]) { int temp = passenger[j]; passenger[j] = passenger[j + 1]; passenger[j + 1] = temp; } } }

for (int j = 0; i < nrLeft; j++)

Du deklarerar "j" som variabel för din loop och inkrementerar den, men du jämför "nrLeft" med "i". Den loopen kommer inte stanna i tid.

Rekommenderar att du övar på att använda breakpoints och debuggern i Visual Studio

Visa signatur

| MSI B650 Tomahawk | Ryzen 7 9800X3D | ASUS RTX 3070 | 64GB DDR5 6000MHz | MSI MPG A1000G | Samsung 970 Evo M.2 1TB + 2x WD Black SN850X 2TB|

Permalänk
Medlem
Skrivet av BrutalSwede:

for (int j = 0; i < nrLeft; j++)

Du deklarerar "j" som variabel för din loop och inkrementerar den, men du jämför "nrLeft" med "i". Den loopen kommer aldrig stanna.

Rekommenderar att du övar på att använda breakpoints och debuggern i Visual Studio

Du har inget tipps på hur jag skulle kunna få den att funka ?

Permalänk
Medlem
Skrivet av oswen97:

Du har inget tipps på hur jag skulle kunna få den att funka ?

Fundera lite på varför loopen inte kommer stanna i tid. Vilken del av loopen bestämmer det? Innuti loopen använder du "j" och "j + 1" för att läsa från din array, men du loopar så länge "i < nrLeft". Var inkrementerar du "i", och när kommer den bli större eller lika med nrLeft?

Mitt tips till dig är att du testar att använda debuggern och en breakpoint för att stega igenom dina loppar och förstå varför det inte fungerar Jag har redan gett dig exakt var felet är.

https://learn.microsoft.com/en-us/visualstudio/debugger/using...

Visa signatur

| MSI B650 Tomahawk | Ryzen 7 9800X3D | ASUS RTX 3070 | 64GB DDR5 6000MHz | MSI MPG A1000G | Samsung 970 Evo M.2 1TB + 2x WD Black SN850X 2TB|

Permalänk
Medlem
Skrivet av BrutalSwede:

Fundera lite på varför loopen inte kommer stanna i tid. Vilken del av loopen bestämmer det? Innuti loopen använder du "j" och "j + 1" för att läsa från din array, men du loopar så länge "i < nrLeft". Var inkrementerar du "i", och när kommer den bli större eller lika med nrLeft?

Mitt tips till dig är att du testar att använda debuggern och en breakpoint för att stega igenom dina loppar och förstå varför det inte fungerar Jag har redan gett dig exakt var felet är.

https://learn.microsoft.com/en-us/visualstudio/debugger/using...

Försökt använvända debuggern men funkar inte, väldigt ny kring detta, förstår inte riktigt vad du menar tyvärr :/ Tack för svaren iallafall.

Permalänk
Medlem
Skrivet av BrutalSwede:

Fundera lite på varför loopen inte kommer stanna i tid. Vilken del av loopen bestämmer det? Innuti loopen använder du "j" och "j + 1" för att läsa från din array, men du loopar så länge "i < nrLeft". Var inkrementerar du "i", och när kommer den bli större eller lika med nrLeft?

Mitt tips till dig är att du testar att använda debuggern och en breakpoint för att stega igenom dina loppar och förstå varför det inte fungerar Jag har redan gett dig exakt var felet är.

https://learn.microsoft.com/en-us/visualstudio/debugger/using...

public void Sort_buss()
{
int max = passenger.Length - 1;
for (int i = 1; i < max; i++)
{
int nrLeft = max - i;

for (int j = 0; j < nrLeft; j++)
{
if (passenger[j] > passenger[j + 1])
{
int temp = passenger[j];
passenger[j] = passenger[j + 1];
passenger[j + 1] = temp;
}
}
}
for (int i = 1; i < passenger.Length; i++)
Console.WriteLine(passenger[i]);
}
Så ser den ut nu haha men det verkar inte hella funka riktigt.