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

Trädvy Permalänk
Medlem
Registrerad
Apr 2015

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!

Trädvy Permalänk
Hedersmedlem
Plats
Uppsala
Registrerad
Jul 2001

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.

X370 Taichi / R7 1700 @ 3.75 GHz 1.2 V / 2x8 GB 3200 MHz CL16 / MSI GTX 1070 Gaming, OC / Samsung 960 EVO 500 GB / Corsair RM650x
LG G6 (H870)

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

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.

Trädvy Permalänk
Medlem
Registrerad
Apr 2015
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

Trädvy Permalänk
Medlem
Registrerad
Apr 2015
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.

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

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.

Trädvy Permalänk
Hedersmedlem
Plats
Uppsala
Registrerad
Jul 2001
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.

X370 Taichi / R7 1700 @ 3.75 GHz 1.2 V / 2x8 GB 3200 MHz CL16 / MSI GTX 1070 Gaming, OC / Samsung 960 EVO 500 GB / Corsair RM650x
LG G6 (H870)

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Jan 2011

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.

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

Trädvy Permalänk
Medlem
Registrerad
Apr 2015
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!

Trädvy Permalänk
Medlem
Registrerad
Okt 2016

allt står i loopen!

Trädvy Permalänk
Medlem
Registrerad
Jun 2019

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