C# nybörjare. I behov av tips och råd.

Permalänk
Medlem

C# nybörjare. I behov av tips och råd.

Hej, håller på läser programmering 1. och kommit till en uppgift som kallas ryggsäcken. Sett att det finns en del trådar om detta. Men ingen som jag riktigt hittar något svar.
Uppgiften är som följer

För att lösa uppgiften behöver du använda dig av följande delar från "Del II - Grunderna i programmering" i boken
Utskrift till konsollen (kapitel 3)

  • Inmatning av data, spara i variabler med korrekt datatyp (kapitel 3)

  • Selektion, IF eller SWITCH för menyn (kapitel 4)

  • Loop som accepterar menyval tills användaren väljer att avsluta programmet, se exempel 5.4 (s.58)

  • Kodblock och variablers livslängd, repetera Kapitel 6 och fundera på hur det påverkar ditt program

Programmet ska förutom att skriva ut och visa menyn innehålla möjlighet att

  • Spara ett föremål i ryggsäcken, användaren ska kunna mata in en sträng under menyval 1, detta ska sparas. Du kan göra det genom att tilldela en Console.ReadLine() till strängvariabeln. Se kapitel 3, och kom ihåg att du kan tilldela och deklarera på två olika platser.

  • Den inmatade strängen ska kunnas skrivas ut i menyval 2.

  • När användaren väljer menyval 3 ska strängens värde rensas eller nollställas. Tilldela strängvariabeln ett tomt ""-värde.

  • Menyval 4 ska avsluta menyloopen.

  • Kommentera och förklara din kod, försök att förklara och motivera dina val.

Jag har läst boken och sett de klipp kursen lagt upp.
MEN
det jag har problem är att användar inputen inte kommer till när man ber om att se innehållet i ryggsäcken. Får det bara tomt.

Ni får koden här under så kanske ni förstår. Känns som jag har gjort rätt, men antar att jag på något sätt är helt ute och cyklar.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ryggsäcken_2 { class Program { static void Main(string[] args) { bool isRunning = true; while (true) { Console.WriteLine("\n\tVälkommen till ryggsäcken!"); Console.WriteLine("\t[1]Lägg något i ryggsäcken"); Console.WriteLine("\t[2]Se innehållet i ryggsäcken"); Console.WriteLine("\t[3]Töm ryggsäcken"); Console.WriteLine("\t[4]Avsluta ryggsäcken"); Console.Write("Gör ett val:"); string anvVal = Console.ReadLine(); string anvInput = ""; if (anvVal == "1") { Console.Write("\tLägg något i ryggsäcken:"); anvInput += Console.ReadLine(); isRunning = true; } else if (anvVal == "2") { Console.WriteLine("\tRyggsäcken innehåller just nu, " + anvInput); isRunning = true; } else if (anvVal == "3") { isRunning = true; } else if (anvVal == "4") { isRunning = false; } } } } }

Tack på förhand!

Permalänk
Hedersmedlem

Hint: "Kodblock och variablers livslängd, repetera Kapitel 6 och fundera på hur det påverkar ditt program"


Redan när jag kom ner till "while (true)" såg jag problemet.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

En variabel i C# lever bara i sitt block, som i C# definieras av { }. T.ex.

for (int i = 0; i < 10; i++) { // Början på block string s = ""; // Här skapas en ny variabel s varje gång loopen kommer hit. s += "test"; Console.WriteLine(s); } // Slut på block, här "dör" alla variabler som är deklarerade inne i blocket.

Varje gång loopen börjar om från början så kommer alltså s vara en helt ny variabel, så detta exempel kommer helt enkelt skriva ut test 10 ggr. Om man istället skriver så här:

string s = ""; for (int i = 0; i< 10; ++i) { s += "test"; Console.WriteLine(s); }

så kommer loopen istället skriva ut test, testtest, o.s.v., eftersom s är deklarerad utanför loopen.

Permalänk
Medlem
Skrivet av Thomas:

Hint: "Kodblock och variablers livslängd, repetera Kapitel 6 och fundera på hur det påverkar ditt program"


Redan när jag kom ner till "while (true)" såg jag problemet.

Det där detta som står om Variabelns livslängd. Vet inte om jag är helt bakom flötet men jag får inte ut något utav det där. Förstår att programmet hoppar tillbaka till innan första IF satsen. Och där är anvInput tom.

while (true), menar du att jag skulle haft while (isRunning) istället? Jag ändrade till det men får fortfarande inte fram vad jag lagt i ryggsäcken i menyVal 2

Permalänk
Medlem
Skrivet av perost:

En variabel i C# lever bara i sitt block, som i C# definieras av { }. T.ex.

for (int i = 0; i < 10; i++) { // Början på block string s = ""; // Här skapas en ny variabel s varje gång loopen kommer hit. s += "test"; Console.WriteLine(s); } // Slut på block, här "dör" alla variabler som är deklarerade inne i blocket.

Varje gång loopen börjar om från början så kommer alltså s vara en helt ny variabel, så detta exempel kommer helt enkelt skriva ut test 10 ggr. Om man istället skriver så här:

string s = ""; for (int i = 0; i< 10; ++i) { s += "test"; Console.WriteLine(s); }

så kommer loopen istället skriva ut test, testtest, o.s.v., eftersom s är deklarerad utanför loopen.

Är det inte det jag gjort?

anvInput är definerat utanför.

sen i första if satsen är anvInput += Console.ReadLine();

eller missförstår jag dig.

Ber om ursäkt om jag är helt pantad.

Permalänk
Medlem

En rad behöver flyttas, en rad behöver ändras och en rad behöver läggas till, sedan har du ett fungerande program - tror jag.

Gå igenom flödet i programmet steg för steg och tänk över exakt vad som händer (eller vad som inte händer) på varje rad.

Detta görs med fördel med debuggern om du inte kan se det manuellt. Du kommer spara enorma mängder tid över kursens lopp om du lär dig använda debuggern för att inspektera variablers värden medan du kör programmet.

Permalänk
Hedersmedlem
Skrivet av CarlB:

Är det inte det jag gjort?

anvInput är definerat utanför.

sen i första if satsen är anvInput += Console.ReadLine();

eller missförstår jag dig.

Ber om ursäkt om jag är helt pantad.

Din

string anvInput = "";

står inuti loopen. Om den vore utanför skulle den stå tillsammans med isRunning.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Du har två fel.

1) While(true) ska helt riktigt vara While(isRunning) annars kommer inte alternativ 4 fungera.
While(true) betyder helt enkelt "Så länge sant är sant". Du är ju intresserad av "Så länge programmet kör" vilket i koden är "Så länge isRunning är sant".

2) Som andra nämnt här ovan så lever en variabel inom sitt block. Så vad du nu gör i din kod är lika med att du plockar fram en ryggsäck och stoppar något i den. Innan While börjar om så försvinner den, så du tar fram en ny ryggsäck och tittar i den. Den är ju då såklart tom.

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

Din

string anvInput = "";

står inuti loopen. Om den vore utanför skulle den stå tillsammans med isRunning.

Älskar dig!

Nu ska jag bara lista ut hur jag rensar stringen

Men tusen tusen tack!

Permalänk

allt står i loopen!

Permalänk
Medlem

Du hade nog fått en snyggare kod, rent syntaxmässigt, om du sparade användarinputen i en int och använde dig av switch statement.
https://docs.microsoft.com/en-us/dotnet/csharp/language-refer...

Exempel.
int anvVal = int.Parse(Console.ReadLine());

Sen kommer problemet med att användaren kan skriva in en bokstav och då crashar programmet, men det är lättlöst, kolla bara in TryParse metoden. Vill inte skriva uppgiften åt dig, då lär man sig ingenting.

Med switch-statement blir koden lättläst och kan säkert ge pluspoäng av läraren om du kör med annat än 4st IF-statements.

Men koden du har skrivit nu funkar så länge du ändar på while(true) till while(isRunning) och flyttar string anvInput; utanför loopen