C# Array problem, tips önskas!

Permalänk
Medlem
Skrivet av PapaDiouf:

Okej, har testat mig fram en del med modulus operatorn, jag använder den i detta fall då vi har gått igenom det innan så jag "bör" ju kunna den, har dock blivit mkt fokus på massa andra saker inom programmeringen så den har kommit lite i skymundan. Jag har en parkering och en multidimensionell array med 100 rader och 2 kolumner. Syftet med denna metod var att när jag lägger till en bil skall platsen bli röd för "upptagen", går såklart att göra det på mycket bättre sätt men av någon anledning fungerar det, förklara gärna för mig vad jag har gjort med modulus operatorn, ska även snygga till raderna osv imorgon.

Satt bara och matade in olika värden och har försökt googla men poletten trillar inte riktigt ner när det kommer till vad den gör.

Console.WriteLine("Parking lot: \n\n"); for (int row = 0; row < 100; row++) { if (allVehicles[row, 0] == null && allVehicles[row, 1] == null) { if (row % 1 == 0) { Console.ForegroundColor = ConsoleColor.Green; Console.Write("{0} ", row + 1); Console.ForegroundColor = ConsoleColor.Gray; } } else if (allVehicles[row, 0] != null || allVehicles[row, 1] != null) { Console.ForegroundColor = ConsoleColor.Red; Console.Write("{0} ", row + 1); Console.ForegroundColor = ConsoleColor.Gray; } }

Svårt att säga då man inte ser hela din kod, vad består din array av till att börja med?. Är det objekt då du gör null checkar?
Istället för else-if bör du bara kunna göra en else. Om allVehicles[row, 0] och allVehicles[row, 1] inte är null så är ju någon av de i else-if sanna, så då räcker det att göra en else.

Vet dock inte om koden fungerar som du tänkt nu, för om första if-satsen är korrekt men din modulo ger false (vilken den dock aldrig gör nu) så kommer den inte att skriva ut talet alls. Modulo tar som jag skrev ovan, resten som blir kvar av en division. Vilket ofta används för att skriva ut jämna/udda tal eller t.ex. skapa en grid där varannan rad är i en annan färg.

Din modulo kommer i detta fall alltid att vara sann då divisioner med 1 inte ger rest. Så du kan ta bort din if-sats med modulo och få samma resultat.

Sedan istället för att hårdkoda in 100 i din loop bör du använda allVehicles.GetLength(0) för att hämta ut längden på din första dimension i arrayen (rows). Detta är för att om du skulle vilja utöka dina parkeringsplatser med fler rader så behöver du ändra koden på flera stället. Detta är ofta är grunden till att konstiga buggar kan uppstå, då man kommer ihåg att ändra på ett ställe men glömmer på det andra.

Permalänk
Medlem
Skrivet av PapaDiouf:

Precis, det är en array av objekt, bilar och MC's, tvådimensionell med 100 rader och 2 kolumner. Just nu skriver den ut 1-100 på rad, mitt mål är att få den att skriva ut 10 rader på en rad och fortsätta så 1-100, så tio rader total skall det väl bli. Resttalet utav modulus, säg att 10%9 exempelvis, då blir det väl 1 i rest om jag inte är helt ute och cyklar? I detta fallet, betyder det att den skriver ut en rad då? Ska ioförsig testa lite mer också, men passar på att fråga medans jag håller på.

Kanske ska ta ett problem i taget men skriver ut mitt andra o sista problem på denna uppgiften när jag ändå är här.
Jag kan lägga till bilar utan problem, samt två MC's, när jag försöker lägga till en tredje MC får jag upp felmeddelandet som egentligen skall komma när hela parkeringen är full.

for(int i = 0; i < 100; i++) { for(int j = 0; j < 2; j++) { if(allVehicles[i,0] == null) { allVehicles[i, 0] = addVehicle; Console.WriteLine("An {0} with the licenseplate [{1}] has been added to parking space [{2}]\n", typeOfVehicle, licenseNumber, i + 1); Console.WriteLine("Arrived: [{0}]\n\n", parkingTime); Console.WriteLine("Press ENTER to return to the menu. . ."); Console.ReadLine(); Console.Clear(); break; } if (allVehicles[i, 0].typeOfVehicles == MC && allVehicles[i, 1] == null) { allVehicles[i, 1] = addVehicle; Console.WriteLine("An {0} with the licenseplate [{1}] has been added to parking space [{2}]\n", typeOfVehicle, licenseNumber, i + 1); Console.WriteLine("Arrived: [{0}]\n\n", parkingTime); Console.WriteLine("Press ENTER to return to the menu. . ."); Console.ReadLine(); Console.Clear(); break; } if (allVehicles[i, j] != null) { Console.Clear(); Console.ForegroundColor = ConsoleColor.Red; Console.Write("The parkinglot is full!\n\n"); Console.ForegroundColor = ConsoleColor.Gray; Console.Write("Press ENTER to return to the menu. . ."); break; } } }

Det har väl något att göra med sista if satsen tänker jag ^^

Precis, har du 10 kakor och 9 personer och alla får en kaka var så har du 1 kaka över. Dvs 10%9 blir 1. Och 9%9 blir 0 då alla får en kaka var och inget blir över.

Så om du vill få ett radbryt efter 10 så får du göra en row % 10 == 0, men också kontrollera att row inte är 0 för annars får du ett radbryt på första iterationen då 0%10 också kommer att bli 0.

Sen kan du lägga på den fina formateringen som @ZecretW tipsade om, så får du en snygg 10x10 grid.

for (int row = 0; row < allVehicles.GetLength(0); row++) { if (row % 10 == 0 && row != 0) { Console.WriteLine(); } if (allVehicles[row, 0] != null && allVehicles[row, 1] != null) { Console.ForegroundColor = ConsoleColor.Green; Console.Write(string.Format("{0,5}", (row+1).ToString())); Console.ForegroundColor = ConsoleColor.Gray; } else { Console.ForegroundColor = ConsoleColor.Red; Console.Write(string.Format("{0,5}", (row + 1).ToString())); Console.ForegroundColor = ConsoleColor.Gray; } }

Permalänk

Dra åt helv*** va bra de blev, exakt så jag tänkte mig! Uppskattas enormt, tack snälla!

Permalänk

Sedan har jag mitt sista problem innan jag kan snygga till programmet, anledningen till den tvådimensionella arrayen är endast för att jag ska kunna ha två mc's på samma plats, och bilen tar upp "båda" dessa så den var enkel, jag kan lägga till två mcs men när den tredje ska in får jag felmeddelande om att det är fullt, behöver jag kolla detta med en nästlad for loop eller räcker det egentligen med att kolla row bara?

for(int i = 0; i < 100; i++) { for(int j = 0; j < 2; j++) { if(allVehicles[i,0] == null) { allVehicles[i, 0] = addVehicle; Console.WriteLine("An {0} with the licenseplate [{1}] has been added to parking space [{2}]\n", typeOfVehicle, licenseNumber, i + 1); Console.WriteLine("Arrived: [{0}]\n\n", parkingTime); Console.WriteLine("Press ENTER to return to the menu. . ."); Console.ReadLine(); Console.Clear(); break; } if (allVehicles[i, 0].typeOfVehicles == MC && allVehicles[j, 0] == null) { allVehicles[i, 1] = addVehicle; Console.WriteLine("An {0} with the licenseplate [{1}] has been added to parking space [{2}]\n", typeOfVehicle, licenseNumber, i + 1, j + 1); Console.WriteLine("Arrived: [{0}]\n\n", parkingTime); Console.WriteLine("Press ENTER to return to the menu. . ."); Console.ReadLine(); Console.Clear(); return; } if (allVehicles[i, j] != null) { Console.Clear(); Console.ForegroundColor = ConsoleColor.Red; Console.Write("The parkinglot is full!\n\n"); Console.ForegroundColor = ConsoleColor.Gray; Console.Write("Press ENTER to return to the menu. . ."); return; } } }

Permalänk
Medlem
Skrivet av PapaDiouf:

Sedan har jag mitt sista problem innan jag kan snygga till programmet, anledningen till den tvådimensionella arrayen är endast för att jag ska kunna ha två mc's på samma plats, och bilen tar upp "båda" dessa så den var enkel, jag kan lägga till två mcs men när den tredje ska in får jag felmeddelande om att det är fullt, behöver jag kolla detta med en nästlad for loop eller räcker det egentligen med att kolla row bara?

for(int i = 0; i < 100; i++) { for(int j = 0; j < 2; j++) { if(allVehicles[i,0] == null) { allVehicles[i, 0] = addVehicle; Console.WriteLine("An {0} with the licenseplate [{1}] has been added to parking space [{2}]\n", typeOfVehicle, licenseNumber, i + 1); Console.WriteLine("Arrived: [{0}]\n\n", parkingTime); Console.WriteLine("Press ENTER to return to the menu. . ."); Console.ReadLine(); Console.Clear(); break; } if (allVehicles[i, 0].typeOfVehicles == MC && allVehicles[j, 0] == null) { allVehicles[i, 1] = addVehicle; Console.WriteLine("An {0} with the licenseplate [{1}] has been added to parking space [{2}]\n", typeOfVehicle, licenseNumber, i + 1, j + 1); Console.WriteLine("Arrived: [{0}]\n\n", parkingTime); Console.WriteLine("Press ENTER to return to the menu. . ."); Console.ReadLine(); Console.Clear(); return; } if (allVehicles[i, j] != null) { Console.Clear(); Console.ForegroundColor = ConsoleColor.Red; Console.Write("The parkinglot is full!\n\n"); Console.ForegroundColor = ConsoleColor.Gray; Console.Write("Press ENTER to return to the menu. . ."); return; } } }

Vad menar du med tredje? Varje row har 2 kolumner.
Så första varvet kommer den kolla om 0,0 inte är null (detta efter du eventuellt satt in en bil/mc redan i if-satserna ovanför) därefter 0,1. Sen går den vidare till 1,0 och 1,1 osv.
Återigen så vill du nog använda else-if och else, annars kommer alla statements att köras i varje iteration.

Har ni lärt er använda debuggern? Känns som man bör kunna den då man ändå börjar hålla på med lite mer avancerade uppgifter än att plussa ihop två tal.

Mitt tips att sätta en breakpoint vid loopen och stega igenom koden rad för rad, på så sätt kommer du enklare att se se varför det blir fel.

Permalänk

Jahaa, jag menar att om jag lägger till två MC's så läggs dom tillsammans i två kolumner, två mc's tar en plats medans en bil tar en hel plats liksom, men försöker jag lägga till en tredje MC så får jag meddelandet att parkeringen är full vilket den inte är. Så jag skriver fel någonstans här men hittar inte felet. Debuggern är inget vi har fått lära oss i skolan men självklart är det ett bra hjälpmedel. Detta är en utbildning på yrkeshögskolan och vi är drygt en månad in, kanske kommer!

Permalänk
Medlem

@PapaDiouf: Just nu skriver du ut meddelandet om att parkeringen är full inne i loopen, men det är ju först efter loopen som du kan avgöra om alla platser faktiskt var fulla. Nu avslutar du loopen och säger att parkeringen är full så fort du hittar en full plats.

allVehicles[j, 0] == null i villkoret för den andra if-satsen är nog för övrigt fel.

Om du fixar dessa två saker och vad zaibuf nämnde om else if så borde du upptäcka att den inre for-loopen nog egentligen är helt onödig, eftersom du bara kollar antingen om platsen är ledig eller om det får plats en MC.

När det gäller debuggern så ska du inte lita på att ni kommer gå igenom den, av någon ofattbar anledning så brukar nybörjarkurser ofta hoppa över det. Det är lite som att lära sig cykla på en grusplan utan stödhjul, det går men är onödigt smärtsamt. Microsoft har en kort guide som går igenom hur debuggern fungerar, gör dig själv en tjänst och lägg några minuter på den så kommer du spara mycket tid i längden.

Permalänk
Medlem
Skrivet av PapaDiouf:

Jahaa, jag menar att om jag lägger till två MC's så läggs dom tillsammans i två kolumner, två mc's tar en plats medans en bil tar en hel plats liksom, men försöker jag lägga till en tredje MC så får jag meddelandet att parkeringen är full vilket den inte är. Så jag skriver fel någonstans här men hittar inte felet. Debuggern är inget vi har fått lära oss i skolan men självklart är det ett bra hjälpmedel. Detta är en utbildning på yrkeshögskolan och vi är drygt en månad in, kanske kommer!

Vänta inte på att skolan ska lära dig saker. Sök kunskap på egen hand Debuggern är det mest värdefulla verktyget som du har som utvecklare, så att lära sig den är ett enormt hjälpmedel för att förstå hur programmen fungerar.

Här är en genomgång av Visual Studio 2019s debugger: https://docs.microsoft.com/en-us/visualstudio/debugger/debugg...

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
Skrivet av perost:

@PapaDiouf: Just nu skriver du ut meddelandet om att parkeringen är full inne i loopen, men det är ju först efter loopen som du kan avgöra om alla platser faktiskt var fulla. Nu avslutar du loopen och säger att parkeringen är full så fort du hittar en full plats.

allVehicles[j, 0] == null i villkoret för den andra if-satsen är nog för övrigt fel.

Om du fixar dessa två saker och vad zaibuf nämnde om else if så borde du upptäcka att den inre for-loopen nog egentligen är helt onödig, eftersom du bara kollar antingen om platsen är ledig eller om det får plats en MC.

När det gäller debuggern så ska du inte lita på att ni kommer gå igenom den, av någon ofattbar anledning så brukar nybörjarkurser ofta hoppa över det. Det är lite som att lära sig cykla på en grusplan utan stödhjul, det går men är onödigt smärtsamt. Microsoft har en kort guide som går igenom hur debuggern fungerar, gör dig själv en tjänst och lägg några minuter på den så kommer du spara mycket tid i längden.

Åh, ja jäklar ja.. fan så slarvigt o missa det! Har ändrat nu, har endast en loop nu och samt att jag la till en vehicleCount som håller reda på antalet fordon i parkeringen och ökar den när det läggs till och tar bort om man checkar ut, så nu fick jag till det! Jättetack, suttit som en dåre me den o bara försökt ändra i loopen men nu så!

Permalänk
Skrivet av BrutalSwede:

Vänta inte på att skolan ska lära dig saker. Sök kunskap på egen hand Debuggern är det mest värdefulla verktyget som du har som utvecklare, så att lära sig den är ett enormt hjälpmedel för att förstå hur programmen fungerar.

Här är en genomgång av Visual Studio 2019s debugger: https://docs.microsoft.com/en-us/visualstudio/debugger/debugg...

Sant! Kom inget angående den på gymnasiekurserna jag gjorde innan och inte heller nu på denna nivån, får nog bli att läsa på om de själv och ska börja asap! Tack för hjälp!

Permalänk
Medlem

Vill du ha ett tips från någon som gjort detta sedan Jesus var påg så undvik multidimensionella arrayer.

skapa hellre en lista som heter parkering[100] av typen int[].

då kan du i varje ruta välja. Vill du lägga in en int[1] är det en bil. är det en int[2] är det motorcyklar.

då kan du snabbt kolla igenom listan för de poster som är null(tomma), de som har .Length == 1 (bil) eller de som har Length==2 (motorcyklar) Därefter kan du vidare lägga in motorcyklar i var och en av dem.

Dessutom, senare när du kommer på att du vill bygga ut detta ytterligare för att kunna parkera tre sparkcyklar i samma parkeringsruta så behöver du inte skriva om något som hanterar listan parkering, utan bara den lilla delen som hanterar urvalet vilket typ det är.

Denna övning hade blivit väldig mycket enklare med klasser men då det är en övning förstår jag.

Överkurs, googla på Tuple. Den är nog egentligen vad du vill använda istället för array[,]

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

Permalänk
Medlem
Skrivet av zaibuf:

for (int row = 0; row < allVehicles.GetLength(0); row++) { if (row % 10 == 0 && row != 0) { Console.WriteLine(); } if (allVehicles[row, 0] != null && allVehicles[row, 1] != null) { Console.ForegroundColor = ConsoleColor.Green; Console.Write(string.Format("{0,5}", (row+1).ToString())); <-- SAMMA Console.ForegroundColor = ConsoleColor.Gray; } else { Console.ForegroundColor = ConsoleColor.Red; Console.Write(string.Format("{0,5}", (row + 1).ToString())); <-- SOM DETTA Console.ForegroundColor = ConsoleColor.Gray; } }

Det gäller att vara så lat som möjligt och bara skriva saker en gång. Dessutom är det lättare om man vill ändra tex avståndet till 6 tecken.

for (int row = 0; row < allVehicles.GetLength(0); row++) { if (row % 10 == 0 && row != 0) { Console.WriteLine(); } if (allVehicles[row, 0] != null && allVehicles[row, 1] != null) { Console.ForegroundColor = ConsoleColor.Green; <-- BARA DETTA ÄR OLIKA } else { Console.ForegroundColor = ConsoleColor.Red; <-- BARA DETTA ÄR OLIKA } Console.Write(string.Format("{0,5}", (row + 1).ToString())); <-- BARA EN GÅNG ATT ÄNDRA } Console.ForegroundColor = ConsoleColor.Gray; <-- I HELA LOOPEN ANVÄNDS BARA GRÖN OCH RÖD, SÄTT TILLBAKA FÄRGEN EFTERRÅT.

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

Permalänk
Medlem
Skrivet av ZecretW:

Det gäller att vara så lat som möjligt och bara skriva saker en gång. Dessutom är det lättare om man vill ändra tex avståndet till 6 tecken.

for (int row = 0; row < allVehicles.GetLength(0); row++) { if (row % 10 == 0 && row != 0) { Console.WriteLine(); } if (allVehicles[row, 0] != null && allVehicles[row, 1] != null) { Console.ForegroundColor = ConsoleColor.Green; <-- BARA DETTA ÄR OLIKA } else { Console.ForegroundColor = ConsoleColor.Red; <-- BARA DETTA ÄR OLIKA } Console.Write(string.Format("{0,5}", (row + 1).ToString())); <-- BARA EN GÅNG ATT ÄNDRA } Console.ForegroundColor = ConsoleColor.Gray; <-- I HELA LOOPEN ANVÄNDS BARA GRÖN OCH RÖD, SÄTT TILLBAKA FÄRGEN EFTERRÅT.

Givetvis. I detta fall ville jag inte ändra i TS kod mer än lägga till det som behövdes för att han skulle komma vidare. Jag hade samme i åtanke men valde att inte ändra det.
Det som efterfrågades var radbryt efter var tionde siffra. Sedan skulle man kunna refaktorera hela koden, men då är det inte längre han som skrivit den.
Och det blir svårare för han att förklara för sin lärare.
Speciellt då man är ny i en utbildning.

Men det är bra tips att ta med sig. Städa alltid i koden efter man fått det att fungera. Ser man t.ex. upprepade kodblock bör det flyttas ut i en metod, gör man en copy paste av kod ska det ringa en varningsklocka att man ska göra en metod.
Men det kan vara ok till en början då man håller på att lösa ett problem, bara man städar upp.

Permalänk

Jättebra tips, tar till mig det! Vill självklart vara så effektiv som möjligt och skriva så lite kod som möjligt, nu i början har man tyckt det är jäkligt skoj att koda bara men man märker också att det snabbt drar iväg i rader haha! Vi hade 4 dagar på oss att göra programmet och satt in i det sista med det, och som vanligt kommer man på saker i efterhand som man velat ha med, nåja! Tack för grym hjälp som vanligt, ska googla på Tuple och försöka se lite exempel på det, även om vi inte gått igenom det så uppmanar vår lärare oss att googla och testa nya saker så är ju inga konstigheter att använda sånt så länge man kan förklara va det är man gjort

Permalänk
Medlem
Skrivet av PapaDiouf:

Jättebra tips, tar till mig det! Vill självklart vara så effektiv som möjligt och skriva så lite kod som möjligt, nu i början har man tyckt det är jäkligt skoj att koda bara men man märker också att det snabbt drar iväg i rader haha! Vi hade 4 dagar på oss att göra programmet och satt in i det sista med det, och som vanligt kommer man på saker i efterhand som man velat ha med, nåja! Tack för grym hjälp som vanligt, ska googla på Tuple och försöka se lite exempel på det, även om vi inte gått igenom det så uppmanar vår lärare oss att googla och testa nya saker så är ju inga konstigheter att använda sånt så länge man kan förklara va det är man gjort

Tuples har generellt nischade användningsområden. Jag hade inte lagt så mycket krut på det nu i början, men är du nyfiken så är det inte fel att kolla upp.

Något att fokusera på i början är bl.s. stränghantering och LINQ. Sitt gärna och gör code katas (öva på algoritmer), dessa har oftast detta inbakat i lite olika nivåer. Det som är bra med dessa är att efter man löst en uppgift kan man jämföra sitt svar med andras, ofta får man då upp ögonen för saker man inte tänkte på.

Permalänk
Medlem
Skrivet av zaibuf:

Givetvis. I detta fall ville jag inte ändra i TS kod mer än lägga till det som behövdes för att han skulle komma vidare. Jag hade samme i åtanke men valde att inte ändra det.
Det som efterfrågades var radbryt efter var tionde siffra. Sedan skulle man kunna refaktorera hela koden, men då är det inte längre han som skrivit den.
Och det blir svårare för han att förklara för sin lärare.
Speciellt då man är ny i en utbildning.

Men det är bra tips att ta med sig. Städa alltid i koden efter man fått det att fungera. Ser man t.ex. upprepade kodblock bör det flyttas ut i en metod, gör man en copy paste av kod ska det ringa en varningsklocka att man ska göra en metod.
Men det kan vara ok till en början då man håller på att lösa ett problem, bara man städar upp.

Det var ingen kritik mot dig, bara ett tips till TS.

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