Permalänk
Avstängd

Jag hade nog lagt upp det så att du ställer frågan först utanför loopen och sen kör while (input != svaret)...

Sen if-satser i loopen för de olika alternativen, för stort, litet osv. med ny fråga på slutet förstås.

Permalänk
Medlem
Skrivet av kundun:

Jo du har lite tankefel i hur den kollar talet.

Kolla igenom flödet:
För varje körning i while ska den ju kolla om det är ett tal mellan 1-20. Om det är så ska den berätta om talet är för stort/litet eller rätt. Om det inte är så ska den säga det och börja om igen.

Sen vill du ju inte kolla om ett tal är mindre än speltalet om den redan gått in i if-satsen där den är större an.
Kolla på if(){}else if(){}

Skickades från m.sweclockers.com

Sorry men fattar 0

Permalänk
Medlem
Skrivet av snajk:

Jag hade nog lagt upp det så att du ställer frågan först utanför loopen och sen kör while (input != svaret)...

Sen if-satser i loopen för de olika alternativen, för stort, litet osv. med ny fråga på slutet förstås.

Står att man inte kan ha != när bool används?
while (spela != speltal)
{

Permalänk
Skrivet av micke_mj:

Så här fick ja det till iaf

{ Random slumpat = new Random(); // skapar ett random objekt int speltal = slumpat.Next(1, 20); // Använder Next för att slumpa tal mellan 2 angivna tal bool spela = true; // Variabel för att fortsätta tills rätt siffra skrivits in while (spela) //Tog bort ! <-- { int tal; Console.WriteLine("\n\tGissa på ett tal mellan 1 och 20: "); bool ombokstav = Int32.TryParse(Console.ReadLine(), out tal);//Använder TryParse, om bokstav skrivs in tas det som en nolla if (tal < speltal) { if (ombokstav) { } else { Console.WriteLine("Du måste skriva ett tal"); } } { Console.WriteLine("\tDet inmatade talet " + tal + " är för litet, försök igen."); Console.ReadLine(); } if (tal > speltal) { Console.WriteLine("\tDet inmatade talet " + tal + " är för stort, försök igen.");// + <-- fattades Console.ReadLine(); } if (tal == speltal) // Ett = fattades { Console.WriteLine("\tGrattis, du gissade rätt!"); Console.ReadLine(); // La till ReadLine då programmet avslutades direkt spela = false; } } } // la till } <--

Du behöver inte skapa en variabel bool spela räcker med att skriva while(true) och sen använda break; när tal == speltal

Permalänk
Avstängd

@micke_mj: Slängde ihop något som funkar ganska bra men du behöver fixa omstarten själv, dock gjort med vänster armbåge och en skrikande unge i knät så ta det med en nypa salt...

var rättSvar = new Random().Next(1, 20); var fortsätt = true; var svar = 0; Console.WriteLine("Gissa..."); while (fortsätt) { if (!int.TryParse(Console.ReadLine(), out svar)) { Console.WriteLine("Ingen siffra. Försök igen..."); continue; } if (svar > rättSvar) Console.WriteLine("För stort. Försök igen..."); if (svar < rättSvar) Console.WriteLine("För litet. Försök igen..."); else { Console.WriteLine("Rätt svar"); fortsätt = false; Console.Read(); //För att inte fönstret ska stängas innan man hinner läsa } }

Permalänk
Medlem
Skrivet av ZalamanderRelic:

Du behöver inte skapa en variabel bool spela räcker med att skriva while(true) och sen använda break; när tal == speltal

Tar jag bort bool spela = true; och skriver while (true) samt avslutar med break i sista kodblocket så måste jag fortfarande trycka enter 1 gång extra för att få gissa igen

Permalänk

@micke_mj: så här gjorde jag. jag får gissa flera gånger. Har inte lagt in någon säkerhet på att användaren gissar på siffror men funkar

namespace GuessTheNumber { class Program { static void Main(string[] args) { Random rand = new Random(); int randNumber = rand.Next(1, 20); while (true) { Console.WriteLine("Gissa talet mellan 1 och 20"); int userInput = Convert.ToInt32(Console.ReadLine()); if(userInput < randNumber) { Console.WriteLine("Du gissade för lågt"); } else if(userInput > randNumber) { Console.WriteLine("Du gissade för högt"); } else if(userInput == randNumber) { Console.WriteLine("Du gissade rätt"); break; } } Console.ReadKey(); } } }

Permalänk

@micke_mj: med säkerhet

static void Main(string[] args) { Random rand = new Random(); int randNumber = rand.Next(1, 21); while (true) { Console.WriteLine("Gissa talet mellan 1 och 20"); int userInput; if (!int.TryParse(Console.ReadLine(),out userInput)) { Console.WriteLine("Du måse skriva in siffror"); continue; } if(userInput < randNumber) { Console.WriteLine("Du gissade för lågt"); } else if(userInput > randNumber) { Console.WriteLine("Du gissade för högt"); } else if(userInput == randNumber) { Console.WriteLine("Du gissade rätt"); break; } } Console.ReadKey(); } } }

Permalänk
Medlem
Skrivet av ZalamanderRelic:

@micke_mj: med säkerhet

static void Main(string[] args) { Random rand = new Random(); int randNumber = rand.Next(1, 21); while (true) { Console.WriteLine("Gissa talet mellan 1 och 20"); int userInput; if (!int.TryParse(Console.ReadLine(),out userInput)) { Console.WriteLine("Du måse skriva in siffror"); continue; } if(userInput < randNumber) { Console.WriteLine("Du gissade för lågt"); } else if(userInput > randNumber) { Console.WriteLine("Du gissade för högt"); } else if(userInput == randNumber) { Console.WriteLine("Du gissade rätt"); break; } } Console.ReadKey(); } } }

Nu är jag väldigt tacksam att du hjälper mig men programmet fungerande inte klockrent när jag testade det.
Andra gången man gissar hinner man bara trycka på 1 tangent innan den går vidare?

Permalänk
Skrivet av micke_mj:

Nu är jag väldigt tacksam att du hjälper mig men programmet fungerande inte klockrent när jag testade det.
Andra gången man gissar hinner man bara trycka på 1 tangent innan den går vidare?

skumt fungerar klockrent för mig. gissade fel en gång fungerade klockrent sen vid nästa steg tryckte jag en siffra väntade jätte länge och det hände inget tryckte en siffra till hände inget. skriver fel och sen enter och då får jag att jag skrivit fel.

Den har nu vid detta skrivande stått och väntat på att jag ska göra något aktivt i ungefär 2minuter och det har inte hänt något än

Permalänk
Medlem

Ryggsäcken

Hej, behöver hjälp med TryParse.
Jag vill att programmet skall fånga upp om man skriver något annat än 1, 2, 3 eller 4 så ska FEL VAL! skrivas ut.
Nu skrivs bara FEL VAL! ut om man väljer bokstav eller trycker ENTER. Om man skriver in siffran 5 så händer inget. Vill alltså att då oxå FEL VAL! skall skrivas ut.

{ List<string> lista = new List<string> { }; string[] föremål = new string[5]; //föremål[0] = ""; //föremål[1] = ""; //föremål[2] = ""; //föremål[3] = ""; //föremål[4] = ""; bool loop = true; //Skapa loopen while (loop) { Console.WriteLine("\n\tVälkommen till ryggsäcken!:");// Menyvalen Console.WriteLine("\t[1] Lägg till ett föremål"); Console.WriteLine("\t[2] Skriv ut innehållet"); Console.WriteLine("\t[3] Rensa innehållet"); Console.WriteLine("\t[4] Avsluta"); Console.Write("\tVälj: "); string menyVal = Console.ReadLine();// Skapa sträng för varibel "menyval" int nr = 0; { //TryParse - skriver ut FEL VAL om bokstav eller enter väljs bool resultat = Int32.TryParse(menyVal, out nr); if (!resultat) { Console.WriteLine("FEL VAL!"); } } //Nedan förslag på TRY CATCH istället som oxå funkar /*try { nr = Convert.ToInt32(menyVal);//Convertera sträng till int(nr) } catch (Exception e) { Console.WriteLine(" Fel val!" + e); }*/ switch (nr) { case 1: Console.WriteLine("Lägg till högst 5 föremål i ryggsäcken: "); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); break; case 2: Console.WriteLine("Ryggsäcken innehåller: "); foreach (string item in lista) Console.WriteLine(item); break; case 3: lista.Clear(); Console.WriteLine("Ryggsäcken är tömd!"); break; case 4: loop = false; Console.WriteLine("HejDå!"); break; } Console.ReadLine(); }

Permalänk
Medlem
Skrivet av micke_mj:

Hej, behöver hjälp med TryParse.
Jag vill att programmet skall fånga upp om man skriver något annat än 1, 2, 3 eller 4 så ska FEL VAL! skrivas ut.
Nu skrivs bara FEL VAL! ut om man väljer bokstav eller trycker ENTER. Om man skriver in siffran 5 så händer inget. Vill alltså att då oxå FEL VAL! skall skrivas ut.

{ List<string> lista = new List<string> { }; string[] föremål = new string[5]; //föremål[0] = ""; //föremål[1] = ""; //föremål[2] = ""; //föremål[3] = ""; //föremål[4] = ""; bool loop = true; //Skapa loopen while (loop) { Console.WriteLine("\n\tVälkommen till ryggsäcken!:");// Menyvalen Console.WriteLine("\t[1] Lägg till ett föremål"); Console.WriteLine("\t[2] Skriv ut innehållet"); Console.WriteLine("\t[3] Rensa innehållet"); Console.WriteLine("\t[4] Avsluta"); Console.Write("\tVälj: "); string menyVal = Console.ReadLine();// Skapa sträng för varibel "menyval" int nr = 0; { //TryParse - skriver ut FEL VAL om bokstav eller enter väljs bool resultat = Int32.TryParse(menyVal, out nr); if (!resultat) { Console.WriteLine("FEL VAL!"); } } //Nedan förslag på TRY CATCH istället som oxå funkar /*try { nr = Convert.ToInt32(menyVal);//Convertera sträng till int(nr) } catch (Exception e) { Console.WriteLine(" Fel val!" + e); }*/ switch (nr) { case 1: Console.WriteLine("Lägg till högst 5 föremål i ryggsäcken: "); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); lista.Add(Console.ReadLine()); break; case 2: Console.WriteLine("Ryggsäcken innehåller: "); foreach (string item in lista) Console.WriteLine(item); break; case 3: lista.Clear(); Console.WriteLine("Ryggsäcken är tömd!"); break; case 4: loop = false; Console.WriteLine("HejDå!"); break; } Console.ReadLine(); }

Sen undrar jag oxå varför jag kan skriva in 6 föremål i ryggsäcken?
lista.Add(Console.ReadLine()); Finns det ju bara 5 av?

Permalänk
Medlem

TryParse godkänner ju inmatningen "5" därför fångar den inte ett fel där. Vad du kan göra är att lägga till en default i din switch-sats, så den avslutar på allt annat än 1-4.

switch (nr) { // dina case här default: Console.WriteLine("Felaktigt menyalternativ"); break; }

Edit:

TS, en lista, till skillnad från en vanlig array, expanderar, även om du satt en ursprunglig _minsta_ storlek, så när du kör Add() läggs ett nytt element till i slutet på listan (praktiskt taget så tror jag att listan kopieras till en ny lista).

I din switch-sats lägger du alltså till 5 nya element utöver de 5 tomma elementen du skapar i början av programmet.

Så antingen får du sluta använda Add() och Remove(), och arbeta direkt med elementen, dvs. sätta värden i case 1 och sätta tomma värden i case 2, eller så får du ha lite fler kontroller som t.ex. kolla om listan har 5 element innan du lägger till ett osv.
Förslagsvis är det inte fel att skriva metoder för alla funktioner som ditt program ska utföra. som att lägga till och/eller ta bort element, som du sen anropar i switch-satsen, så blir programmet mer överskådligt.

Permalänk
Avstängd
Skrivet av elBenko:

TryParse godkänner ju inmatningen "5" därför fångar den inte ett fel där. Vad du kan göra är att lägga till en default i din switch-sats, så den avslutar på allt annat än 1-4.

switch (nr) {
// dina case här
default:
Console.WriteLine("Felaktigt menyalternativ");
break;
}

Eller så ändrar man bara if-satsen, typ:

if (!resultat || nr > 4 || nr < 1)

Permalänk
Medlem

@snajk: Japp, självklart kan man även göra så, men jag tycker det är bra praxis att alltid ha en default med i en switch-sats.

Permalänk
Avstängd
Skrivet av elBenko:

@snajk: Japp, självklart kan man även göra så, men jag tycker det är bra praxis att alltid ha en default med i en switch-sats.

Jo, du har förstås rätt. Länge sedan jag skrev konsollprogram med input från en mänsklig användare.

Permalänk
Medlem
Skrivet av elBenko:

TryParse godkänner ju inmatningen "5" därför fångar den inte ett fel där. Vad du kan göra är att lägga till en default i din switch-sats, så den avslutar på allt annat än 1-4.

switch (nr) { // dina case här default: Console.WriteLine("Felaktigt menyalternativ"); break; }

Edit:

TS, en lista, till skillnad från en vanlig array, expanderar, även om du satt en ursprunglig _minsta_ storlek, så när du kör Add() läggs ett nytt element till i slutet på listan (praktiskt taget så tror jag att listan kopieras till en ny lista).

I din switch-sats lägger du alltså till 5 nya element utöver de 5 tomma elementen du skapar i början av programmet.

Så antingen får du sluta använda Add() och Remove(), och arbeta direkt med elementen, dvs. sätta värden i case 1 och sätta tomma värden i case 2, eller så får du ha lite fler kontroller som t.ex. kolla om listan har 5 element innan du lägger till ett osv.
Förslagsvis är det inte fel att skriva metoder för alla funktioner som ditt program ska utföra. som att lägga till och/eller ta bort element, som du sen anropar i switch-satsen, så blir programmet mer överskådligt.

Vad menar du med att sätta värden i case 1 och tomma värden i case 2?
Jag vill ju att man ska lägga till 5 egna föremål.

Permalänk
Medlem

@micke_mj: Vad jag menar är att du just nu skapar fem tomma element i din lista redan i början av programmet, vilket innebär att när du sen kör Add() så lägger du till _fler_ element i slutet av listan, därför får du fler än 5 element.

Så antingen skippar du att sätta en storlek på listan samt sätta nollvärden, som du gör nu, och kör med Add() i din case-sats, men se då till att ha en if som kollar så listan inte redan har 5 element. Eller så kör du som du gör nu, men skippar Add() och Clear() och jobbar direkt mot de befintliga elementen när du sätter dina värden - precis så som du gör i början av programmet när du sätter nollvärden.

Förstår du hur jag menar?

Edit: Sen för övrigt så printar ditt program "Lägg till _ett_ föremål", men du tvingar användaren att mata in 5 på stört, räcker det inte att ta emot ett åt gången?

Permalänk
Medlem
Skrivet av elBenko:

@micke_mj: Vad jag menar är att du just nu skapar fem tomma element i din lista redan i början av programmet, vilket innebär att när du sen kör Add() så lägger du till _fler_ element i slutet av listan, därför får du fler än 5 element.

Så antingen skippar du att sätta en storlek på listan samt sätta nollvärden, som du gör nu, och kör med Add() i din case-sats, men se då till att ha en if som kollar så listan inte redan har 5 element. Eller så kör du som du gör nu, men skippar Add() och Clear() och jobbar direkt mot de befintliga elementen när du sätter dina värden - precis så som du gör i början av programmet när du sätter nollvärden.

Förstår du hur jag menar?

Edit: Sen för övrigt så printar ditt program "Lägg till _ett_ föremål", men du tvingar användaren att mata in 5 på stört, räcker det inte att ta emot ett åt gången?

Enligt uppgiften ska vi jobba med Arrays och har ju nu en Lista så borde ändra det och använda mig av string [] föremål istället.

Och Nej jag förstår inte vad du menar............ blir fucking galen på detta.
Så antingen skippar du att sätta en storlek på listan samt sätta nollvärden, som du gör nu, och kör med Add() i din case-sats, men se då till att ha en if som kollar så listan inte redan har 5 element. Eller så kör du som du gör nu, men skippar Add() och Clear() och jobbar direkt mot de befintliga elementen när du sätter dina värden - precis så som du gör i början av programmet när du sätter nollvärden.

Permalänk
Medlem

@micke_mj: Börja med att skriva om uppgiften med array först, fila lite på det. Såg precis att jag läst fel i din kod och uppfattat "lista" och "föremål" som samma, fel av mig där (skyller på klockslaget) ;D Så du kan bortse från mitt yrande om Add() i tidigare poster.

Förslag:

Skapa en array med längden 5 i början, men sätt inte tomma strängar som värden i alla elementen, låt dem vara så defaultar dem till null som du kan använda i kontroller sen när du kollar efter ledig plats i din "lägg till"-metod.

I din "lägg till"-metod loopar du igenom hela arrayen och letar upp första lediga plats, dvs. första värdet som är null, och lagrar inmatningen här. Detta gör du för att när användaren sen tar bort ett specifikt element så blir det "hål" i arrayen.

"ta bort"-metoden, om du ska tillåta användaren att ta bort specifika element, tar en inmatning i form av 1-5 för vilket element som ska tas bort. Detta element sätts därefter till null. Ska du bara rensa hela arrayen så sätt alla element till null direkt.

i "visa innehåll"-metoden får du även där loopa genom arrayen, men kör där en if för varje iteration som kollar efter element som inte är null, och printar dessa.

Permalänk
Medlem
Skrivet av elBenko:

@micke_mj: Börja med att skriva om uppgiften med array först, fila lite på det. Såg precis att jag läst fel i din kod och uppfattat "lista" och "föremål" som samma, fel av mig där (skyller på klockslaget) ;D Så du kan bortse från mitt yrande om Add() i tidigare poster.

Förslag:

Skapa en array med längden 5 i början, men sätt inte tomma strängar som värden i alla elementen, låt dem vara så defaultar dem till null som du kan använda i kontroller sen när du kollar efter ledig plats i din "lägg till"-metod.

I din "lägg till"-metod loopar du igenom hela arrayen och letar upp första lediga plats, dvs. första värdet som är null, och lagrar inmatningen här. Detta gör du för att när användaren sen tar bort ett specifikt element så blir det "hål" i arrayen.

"ta bort"-metoden, om du ska tillåta användaren att ta bort specifika element, tar en inmatning i form av 1-5 för vilket element som ska tas bort. Detta element sätts därefter till null. Ska du bara rensa hela arrayen så sätt alla element till null direkt.

i "visa innehåll"-metoden får du även där loopa genom arrayen, men kör där en if för varje iteration som kollar efter element som inte är null, och printar dessa.

blir bara mer o mer förvirrad:) men tack ändå

Permalänk
Medlem
Permalänk
Medlem

Tack, men åt helvete för svår för min nivå, så luskar vidare på min orginalkod

Permalänk
Medlem

@micke_mj: Äsch, är egentligen inte så svårt, gå igenom raderna steg för steg så ser du vad de gör. Men om inte annat så har du någon form av referens att glo på/labba med

Permalänk
Medlem

Men nu dååå

Nu är jag Ganska nöjd med koden, eller säger man programmet?
Men jag kan fortfarande gissa 6 ggr, vrf? Jag har ju array satt till 5?

{ string[] föremål = new string[5]; bool isRunning = true; // loop för att köra tills användaren väljer 4 (HejDå) while (isRunning)// while loop startar { //utskrift av menyn Console.WriteLine("\n\tVälkommen till ryggsäcken!:");// Menyvalen Console.WriteLine("\t[1] Lägg till 5 föremål"); Console.WriteLine("\t[2] Skriv ut innehållet"); Console.WriteLine("\t[3] Rensa innehållet"); Console.WriteLine("\t[4] Avsluta"); Console.Write("\tVälj: "); //variabel för menyval int menyVal;//= Convert.ToInt32(Console.ReadLine()); Int32.TryParse(Console.ReadLine(), out menyVal);// Undantagshantering med TryParse switch (menyVal) { case 1: // ber användaren att fylla ryggsäcken med 5 föremål Console.WriteLine("Lägg till 5 föremål!"); for (int i = 0; i < föremål.Length; i++) { föremål[i] = Console.ReadLine();//Sparar innehållet som användaren lagt i } break; case 2: Console.WriteLine("Ryggsäcken innehåller: "); foreach (string item in föremål) { Console.WriteLine(item);// Visar föremålen som lagt till. } break; case 3: for (int i = 0; i < föremål.Length; i++) { föremål[i] = null; //Tömmer ryggsäcken! } Console.WriteLine("Ryggsäcken är tömd!"); break; case 4: // Avslutar programmet Console.WriteLine("HejDå!"); isRunning = false; break; default: Console.WriteLine("Felaktigt val!"); // Skriver ut när användaren väljer allt annat än 1,2,3,4 break; } Console.ReadLine(); }

Permalänk
Medlem
Skrivet av micke_mj:

Nu är jag Ganska nöjd med koden, eller säger man programmet?
Men jag kan fortfarande gissa 6 ggr, vrf? Jag har ju array satt till 5?

{ string[] föremål = new string[5]; bool isRunning = true; // loop för att köra tills användaren väljer 4 (HejDå) while (isRunning)// while loop startar { //utskrift av menyn Console.WriteLine("\n\tVälkommen till ryggsäcken!:");// Menyvalen Console.WriteLine("\t[1] Lägg till 5 föremål"); Console.WriteLine("\t[2] Skriv ut innehållet"); Console.WriteLine("\t[3] Rensa innehållet"); Console.WriteLine("\t[4] Avsluta"); Console.Write("\tVälj: "); //variabel för menyval int menyVal;//= Convert.ToInt32(Console.ReadLine()); Int32.TryParse(Console.ReadLine(), out menyVal);// Undantagshantering med TryParse switch (menyVal) { case 1: // ber användaren att fylla ryggsäcken med 5 föremål Console.WriteLine("Lägg till 5 föremål!"); for (int i = 0; i < föremål.Length; i++) { föremål[i] = Console.ReadLine();//Sparar innehållet som användaren lagt i } break; case 2: Console.WriteLine("Ryggsäcken innehåller: "); foreach (string item in föremål) { Console.WriteLine(item);// Visar föremålen som lagt till. } break; case 3: for (int i = 0; i < föremål.Length; i++) { föremål[i] = null; //Tömmer ryggsäcken! } Console.WriteLine("Ryggsäcken är tömd!"); break; case 4: // Avslutar programmet Console.WriteLine("HejDå!"); isRunning = false; break; default: Console.WriteLine("Felaktigt val!"); // Skriver ut när användaren väljer allt annat än 1,2,3,4 break; } Console.ReadLine(); }

Jag vill ha in:

int femVal = Convert.ToInt32(Console.ReadLine()); if (femVal == föremål.Length) { Console.WriteLine("Ryggsäcken är full"); }

Men får den inte att fungera i koden...

Permalänk
Medlem
Skrivet av micke_mj:

Nu är jag Ganska nöjd med koden, eller säger man programmet?
Men jag kan fortfarande gissa 6 ggr, vrf? Jag har ju array satt till 5?

Ta bort "Console.ReadLine();" från näst sista raden...den är helt meningslös (du gör inget med den inmatningen). Dina inmatningar är fem stycken från menyval nummer ett och sedan en från nämnda rad, det är därför du får en sjätte.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem
Skrivet av PeCe:

Ta bort "Console.ReadLine();" från näst sista raden...den är helt meningslös (du gör inget med den inmatningen). Dina inmatningar är fem stycken från menyval nummer ett och sedan en från nämnda rad, det är därför du får en sjätte.

Så jvla enkelt det kan vara ibland...:) Tack