2017-04-16, 11:06
  #1
Medlem
IIMorbiids avatar
Hej allihopa! Ska försöka dra det kort. Pluggar för tillfället upp mina betyg på Flex Vux för att sedan kunna söka till en yrkeshögskola som spelprogrammerare.

Har fått en läxa där jag ska skapa en program som fungerar som en ryggsäck.

I programmet ska man kunna:

1. Lägga in 4 föremål i det s.k 'ytterfacket' i ryggsäcken.
2. Visa dessa 4 föremålen.
3. Lägga in valfritt antal föremål i ryggsäcken, det s.k 'stora facket'.
4. Visa föremålen i det 'stora facket.

Jag har Googlat, kollat i skolböckerna, kollat på instruktionsvideos som kommer med uppgiften, men nej jag får det fan ta mig inte att funka.

Så det slutade med att jag raderade hela programmet och har nu börjat om, men utan framgång, så nu vänder jag mig till er! Jag har dessutom sett liknande trådar på Flashback med samma uppgift, men jag kan ändå inte få det att fungera ..

Är det någon som kan hjälpa mig? Vill även förtydliga att jag inte vill att ni ska lösa den rätt av åt mig, utan jag vill självklart förstå hur/varför/vad man ska göra, så att jag lär mig det.

Tackar så jätte mycket för eran hjälp!

Nu till det största problemet. Jag kan göra själva arrayn, med värdet 4, jag kan skriva ut själva listan med hjälp av 'Console.WriteLine();' men problemet är att jag kan inte få ut själva värdena, hur kan jag få värdena från user input att sparas så att jag i nästa case kan printa ut dem?

Postar koden så ska vi se om ni kan komma på något.. Och ja jag vet att koden för tillfället är helt fel, men jag har testat så mycket olika metoder nu så jag är på gränsen till att ge upp .. Tackar återigen för er hjälp! Kommer att uppdatera om jag lyckas hitta någon lösning!

OBS: Jag vet att mycket fattas i koden, men som sagt så raderade jag hela skiten och gjorde om det, så därför är inte alla cases färdiga t.ex och jag har inte skrivit 4 st int's osv osv.

Kod:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Menu
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Welcome, please choose one of the following:");
            Console.WriteLine();

            bool exitprogram = true;
            while (exitprogram)
            {
                Console.WriteLine();          // Lägger till dessa för att få ett mellanrum mellan valen.
                Console.WriteLine("[1] Put four items in the small backpack compartment");
                Console.WriteLine("[2] Show items in the small backpack compartment ");
                Console.WriteLine("[3] Add items to your backpack");
                Console.WriteLine("[4] Show items in your backpack");
                Console.WriteLine("[5] Exit");

                Console.Write("Choose:");
                int menuoption = Convert.ToInt32(Console.ReadLine());

                // Meny färdig.

                int[] compartment = new int[4];


                switch (menuoption)
                {




                    case 1: // Ber användaren skriva in fyra föremål i ryggsäckens lilla fack.
                        {

                            Console.Write("Put items in the small compartment: ");
                            compartment[0] = Convert.ToInt32(Console.ReadLine());
                            Console.Write("Put items in the small compartment: ");
                            compartment[1] = Convert.ToInt32(Console.ReadLine());
                            Console.Write("Put items in the small compartment: ");
                            compartment[2] = Convert.ToInt32(Console.ReadLine());
                            Console.Write("Put items in the small compartment: ");
                            compartment[3] = Convert.ToInt32(Console.ReadLine());
                        }
                        break;

                        

                    case 2: // Skriver ut de fyra föremålen i ryggsäckens lilla fack

                        {
                            Console.WriteLine("The small compartment contains: {0} {1} {2} {3} ", compartment[0], compartment[1], compartment[2], compartment[3]);
                        }
                        break;
                       
            /*
                    case 3: // Ber användaren lägga till valfritt antal föremål i ryggsäcken
                        Console.WriteLine("Skriv in ditt önskade föremål till listan");
                       
                        break;

                    case 4: // Skriver ut ryggsäckens innehåll (exklusive the lilla facket)
                        foreach 
                        {
                            
                        }
                        break;

                    case 5: // Användaren avslutar programmet
                        exitprogram = false;
                        break;
                       
           */
                }

            }
        }
    }
}
      
Citera
2017-04-16, 11:29
  #2
Medlem
jordrobsss avatar
Tycker du borde använda dig utav klasser

En för ryggsäcken och dess funktioner, och en för items som ska stoppas in i ryggsäcken
Citera
2017-04-16, 11:46
  #3
Medlem
NMYs avatar
För att hjälpa dig lite på traven så bör du flytta int[] compartment = new int[4]; utanför loopen.

Förtydligande, då du kör koden inne i whileloopen så kommer du att instansiera en ny array/vektor varje gång du utför ett nytt kommando, vilket då gör att du blir av med dina sparade värden.
__________________
Senast redigerad av NMY 2017-04-16 kl. 11:58.
Citera
2017-04-16, 11:51
  #4
Medlem
NMYs avatar
Sen som nämnt tidigare i tråden. Försök att bryta isär koden, tänk på att återanvända kod som repeteras flera gånger, att då istället bryta ut dem till separata metoder. Det blir mindre stökigt och lättare att underhålla/ändra.
Citera
2017-04-16, 11:56
  #5
Medlem
IIMorbiids avatar
Tack! Sitter och äter sen frukost men ska ge mig på det senare så återkommer jag!

Får hoppas jag kan lösa det nu, blir galen på detta haha!
Citera
2017-04-16, 13:24
  #6
Medlem
IIMorbiids avatar
Citat:
Ursprungligen postat av NMY
För att hjälpa dig lite på traven så bör du flytta int[] compartment = new int[4]; utanför loopen.

Förtydligande, då du kör koden inne i whileloopen så kommer du att instansiera en ny array/vektor varje gång du utför ett nytt kommando, vilket då gör att du blir av med dina sparade värden.

Har lyckats få värdena att sparas nu, flyttade bara min int utanför loopen. Att jag inte tänkte på det innan.

Har dock ett annat problem nu, hur kan jag konvertera det till strings? Vill ju att användaren ska kunna lägga in föremål t.ex suddgummi, pennor, böcker osv och inte bara heltal!

EDIT: Herregud, ändrade bara från "int[] compartment = new int[4];" till string[] compartment = new string[4]; istället, trodde inte det skulle vara så simpelt. Tog även bort "Convert.ToInt32" i case 2.

Då var det problemet löst, nu ska jag bara lyckas göra en list där användaren kan ange valfritt antal föremål, återkommer!
__________________
Senast redigerad av IIMorbiid 2017-04-16 kl. 13:49.
Citera
2017-04-16, 14:33
  #7
Medlem
IIMorbiids avatar
Har kommit en bit nu, har dock stött på ett annat problem.

Hur kan jag förhindra att programmet crashar vid felaktigt user input?

När menyn öppnas kan användaren välja mellan 1-5, om användaren skriver "hej" så crashar programmet då den förväntar sig ett heltal.

Vet att man ska använda try catch eller try parse, läste även något om int.parse. Har försökt lite olika metoder men får det inte riktigt att funka .. Någon som kan leda mig på rätt väg?

Tack på förhand! Sorry för att jag postar flera gånger i rad men kan inte redigera mina gamla inlägg längre ..
Citera
2017-04-16, 14:59
  #8
Medlem
NMYs avatar
Citat:
Ursprungligen postat av IIMorbiid
Har kommit en bit nu, har dock stött på ett annat problem.

Hur kan jag förhindra att programmet crashar vid felaktigt user input?

När menyn öppnas kan användaren välja mellan 1-5, om användaren skriver "hej" så crashar programmet då den förväntar sig ett heltal.

Vet att man ska använda try catch eller try parse, läste även något om int.parse. Har försökt lite olika metoder men får det inte riktigt att funka .. Någon som kan leda mig på rätt väg?

Tack på förhand! Sorry för att jag postar flera gånger i rad men kan inte redigera mina gamla inlägg längre ..

Vart är det du fastnar? Som du är inne på så du kan köra antingen med try/catch eller en tryparse. Vilket som skulle funka i detta fallet. Normalt sätt vill man kanske begränsa inmatningen redan i gränssnittet men det blir lite svårt då det är en konsolapp.
Citera
2017-04-16, 15:18
  #9
Medlem
IIMorbiids avatar
Citat:
Ursprungligen postat av NMY
Vart är det du fastnar? Som du är inne på så du kan köra antingen med try/catch eller en tryparse. Vilket som skulle funka i detta fallet. Normalt sätt vill man kanske begränsa inmatningen redan i gränssnittet men det blir lite svårt då det är en konsolapp.

Hej igen! Har kommit en bit nu.

Det som jag har gjort är att:

Användaren kan lägga till 4 föremål.
Föremålen skrivs ut.
Användaren kan lägga till ett föremål i ryggsäcken.
Föremålet i ryggsäcken kan skrivas ut.

Så det som är kvar att göra är att jag ska hantera felaktig inmatning (try catch eller tryparse vid menyvalet) och att användaren ska kunna lägga till obegränsat med föremål i ryggsäcken (alltså inte det lilla facket med 4 slots.) och där har jag också fastnat.

Vet inte riktigt hur jag ska skriva för att användaren ska kunna lägga in obegränsat med föremål tills han väljer att avsluta, vilket jag tror man kan göra med Console.ReadKey(); om jag inte minns fel.

Isåfall vill jag att efter varje tillagt föremål ska användaren bli tillfrågad Vill du lägga till ännu ett föremål? J/N

Eller

Att användaren får texten "Lägg till föremål i ryggsäcken, avsluta genom att trycka Backspace" så får användaren själv lägga till föremål tills denne trycker backspace.

Vill göra det som blir lättast, men vet inte alls hur jag ska göra detta faktiskt ..

Angående try/catch och tryparse så skriver jag in koden, men den hinner inte läsa av det innan jag får errorn, vet inte om jag lägger in den på fel ställe .. Har testat ovanför Convert.ToInt32(Console.ReadLine());, utanför loopen och efter Convert.ToInt3.... men det funkar inte ...

Man blir så trött i skallen med av att sitta så många timmar med det, men behöver bli färdig så fort som möjligt helst!

Tackar som fan för hjälpen!


EDIT: Här är koden som den ser ut just nu:

Kod:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Menu
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Welcome, please choose one of the following:");

            string[] compartment = new string[4];
            List<string> backpack = new List<string>();

            bool exitprogram = true;
            while (exitprogram)


            {
                Console.WriteLine("\n[1] Put four items in the small backpack compartment");
                Console.WriteLine("[2] Show items in the small backpack compartment ");
                Console.WriteLine("[3] Add items to your backpack");
                Console.WriteLine("[4] Show items in your backpack");
                Console.WriteLine("[5] Exit");

                Console.Write("\nChoose:");


                int menuoption = Convert.ToInt32(Console.ReadLine());

                // Meny färdig.

                switch (menuoption)
                {




                    case 1: // Ber användaren skriva in fyra föremål i ryggsäckens lilla fack.
                        {

                            Console.Write("Put items in the small compartment: ");
                            compartment[0] = Console.ReadLine();
                            Console.Write("Put items in the small compartment: ");
                            compartment[1] = Console.ReadLine();
                            Console.Write("Put items in the small compartment: ");
                            compartment[2] = Console.ReadLine();
                            Console.Write("Put items in the small compartment: ");
                            compartment[3] = Console.ReadLine();
                        }
                        break;

                        

                    case 2: // Skriver ut de fyra föremålen i ryggsäckens lilla fack

                        {
                            Console.WriteLine("The small compartment contains: \n\n{0} \n{1} \n{2} \n{3} ", compartment[0], compartment[1], compartment[2], compartment[3]);
                            Console.Write("\nPress Enter to continue.");
                            Console.ReadLine();
                        }
                        break;
                       
                    case 3: // Ber användaren lägga till valfritt antal föremål i ryggsäcken
                        Console.WriteLine("Add item to your backpack: ");
                        backpack.Add(Console.ReadLine());
                        break;

                    case 4: // Skriver ut ryggsäckens innehåll (exklusive the lilla facket)
                        foreach (string item in backpack)
                        {
                            Console.WriteLine("You backpack contains: \n" + item);
                            Console.Write("\nPress Enter to continue.")
                            Console.ReadLine();
                        }
                        break;

                    case 5: // Användaren avslutar programmet
                        exitprogram = false;
                        break;
                       
                     
                }

            }
        }
    }
}
Citera
2017-04-16, 15:49
  #10
Medlem
NMYs avatar
Citat:
Ursprungligen postat av IIMorbiid
Hej igen! Har kommit en bit nu.

Det som jag har gjort är att:

Användaren kan lägga till 4 föremål.
Föremålen skrivs ut.
Användaren kan lägga till ett föremål i ryggsäcken.
Föremålet i ryggsäcken kan skrivas ut.

Så det som är kvar att göra är att jag ska hantera felaktig inmatning (try catch eller tryparse vid menyvalet) och att användaren ska kunna lägga till obegränsat med föremål i ryggsäcken (alltså inte det lilla facket med 4 slots.) och där har jag också fastnat.

Vet inte riktigt hur jag ska skriva för att användaren ska kunna lägga in obegränsat med föremål tills han väljer att avsluta, vilket jag tror man kan göra med Console.ReadKey(); om jag inte minns fel.

Isåfall vill jag att efter varje tillagt föremål ska användaren bli tillfrågad Vill du lägga till ännu ett föremål? J/N

Eller

Att användaren får texten "Lägg till föremål i ryggsäcken, avsluta genom att trycka Backspace" så får användaren själv lägga till föremål tills denne trycker backspace.

Vill göra det som blir lättast, men vet inte alls hur jag ska göra detta faktiskt ..

Angående try/catch och tryparse så skriver jag in koden, men den hinner inte läsa av det innan jag får errorn, vet inte om jag lägger in den på fel ställe .. Har testat ovanför Convert.ToInt32(Console.ReadLine());, utanför loopen och efter Convert.ToInt3.... men det funkar inte ...

Man blir så trött i skallen med av att sitta så många timmar med det, men behöver bli färdig så fort som möjligt helst!

Tackar som fan för hjälpen!



Tänk på att tryparse är ett statement, alltså något att använda i en if-sats t.ex. Något parse eller convert inte är, därav kommer de att krascha om det inte går att konvertera.

Gällande att lägga till obegränsat så är du på god väg, du har din lista(backpack) som du kan fylla upp. Hur du väljer att mata på med flera går att lösa på lite olika sätt som du beskriver, antingen med en if-sats, loop eller helt enkelt att man går om hela vändan som det är nu.

Det som sedan saknas är att presentera listan på rätt sätt i case4, där finns det också flera alternativ. Antingen som du har påbörjat med en loop, annars kan man kolla på string.Join.

Ett annat tips, som är lite OT. Använd gärna "var" när du deklarerar variabler så som string, int osv. Ger en renare kod.
Citera
2017-04-16, 16:01
  #11
Medlem
IIMorbiids avatar
Citat:
Ursprungligen postat av NMY
Tänk på att tryparse är ett statement, alltså något att använda i en if-sats t.ex. Något parse eller convert inte är, därav kommer de att krascha om det inte går att konvertera.

Gällande att lägga till obegränsat så är du på god väg, du har din lista(backpack) som du kan fylla upp. Hur du väljer att mata på med flera går att lösa på lite olika sätt som du beskriver, antingen med en if-sats, loop eller helt enkelt att man går om hela vändan som det är nu.

Det som sedan saknas är att presentera listan på rätt sätt i case4, där finns det också flera alternativ. Antingen som du har påbörjat med en loop, annars kan man kolla på string.Join.

Ett annat tips, som är lite OT. Använd gärna "var" när du deklarerar variabler så som string, int osv. Ger en renare kod.

Aha okej, ska gå tillbaka till det lite senare, vill ha färdigt hela programmet först!

Jag har kommit på detta gällande obegränsat antal föremål:

Kod:
case 3: // Ber användaren lägga till valfritt antal föremål i ryggsäcken
                        Console.WriteLine("Add item to your backpack: ");
                        backpack.Add(Console.ReadLine());
                        Console.WriteLine("Do you wish to add another item? Y/N");

                        string result = Console.ReadLine();

                        if (result.ToUpper().Equals("Y"))
                        {
                            goto case 3;
                        }
                        if (result.ToUpper().Equals("N"))
                        {
                            
                        }
                        break;

Allting funkar som det ska men, när jag då går till case 4 så printar den bara ut det första jag skrev. Är det då jag borde testa string.Join kanske?

Och vart menar du jag ska skriva var istället för string? t.ex foreach (var item in backpack) och att jag gör en List<var> istället för en string?

EDIT:

Har nu testat en kod som funkar, men då kan jag ej ha Console.WriteLine("Your backpack contains: \n" för då loopar den om det för alla items, jag antar att detta är för att den inte kombinerar alla strings (därav bad du mig använda join.String?) så jag fick ta bort det och då funkar allting.

Men vill ändå lära mig hur man kombinerar dom, försökte sätta koden utanför loopen men fick det ej att funka .. Du vill inte hjälpa mig lite på traven? Tack!

Kod:
case 3: // Ber användaren lägga till valfritt antal föremål i ryggsäcken
                        Console.WriteLine("Add item to your backpack: ");
                        backpack.Add(Console.ReadLine());
                        Console.WriteLine("Do you wish to add another item? Y/N");

                        string result = Console.ReadLine();

                        if (result.ToUpper().Equals("Y"))
                        {
                            goto case 3;
                        }
                        if (result.ToUpper().Equals("N"))
                        {
                            
                        }
                        break;

                    case 4: // Skriver ut ryggsäckens innehåll (exklusive the lilla facket)
                        foreach (string items in backpack)
                        {
                            Console.WriteLine(items);

                        }
                        break;
__________________
Senast redigerad av IIMorbiid 2017-04-16 kl. 16:17.
Citera
2017-04-16, 16:17
  #12
Medlem
NMYs avatar
Citat:
Ursprungligen postat av IIMorbiid
Allting funkar som det ska men, när jag då går till case 4 så printar den bara ut det första jag skrev. Är det då jag borde testa string.Join kanske?

Och vart menar du jag ska skriva var istället för string? t.ex foreach (var item in backpack) och att jag gör en List<var> istället för en string?

Gällande case 4, precis kolla på string.Join alternativt ändra om lite i foreach-loopen, så som den är nu så stannar den på första varvet pga ReadLine tills det att användaren klickar.

Var kan användas på variabler, så som " string result = Console.ReadLine();" man då byta till " var result = Console.ReadLine();" då Readline hanterar stängar.

Tydligare är exemplet "bool exitprogram = true;", då true är en boolean så behöver man inte deklarera att existprogram är en boolean. Det funkar då lika bra med var exitprogram.

Tittar vi istället på en lista så blir det liknande, men vi kan inte säga List<var> something = List<var>, då har vi inget som talar om för oss vad det är för variabel som används. En lista blir då istället, var backpack = new List<string>(), så värdet höger om = talar om vad det är för variabel vi hanterar.
Kanske inte något att lägga för stor vikt på i början, det blir enklare sen när man har lite mer koll på grejerna, man slipper deklarera onödigt mycket och repetera massa kod.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in