Hjälp med programmering 1, igen...

Permalänk

Hjälp med programmering 1, igen...

Hej! Sitter och försöker klura ut hur jag skall koda en loop som ger användaren möjlighet att gissa sig fram till en random genererat nummer. Jag har fastnat lite just nu på att få in rätt villkor i loopen, mer specifikt vet jag inte riktigt hur jag skall kunna använda Console.ReadLine inne i loopen samtidigt som den finns utanför för att då definiera vad villkoret som ligger i slutet.

Här är min kod hitils:

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

namespace ConsoleApp4
{
class Program
{
static void Main(string[] args)
{
Random rng = new Random();
int random_nr = rng.Next(1, 100); // Random number generator, rng.
int lap = 0; //Håller reda på antalet varv
Console.WriteLine("Hej! Du skall nu gissa ett tal mellan 1-100, lycka till!");
string userNrText;
userNrText = Console.ReadLine();
int UserNr = int.Parse(userNrText);

do
{
random_nr = rng.Next(1, 100);
lap++;
if (UserNr > random_nr)
{
Console.WriteLine("Nej det var för högt. Försök igen!");
}
else if (UserNr < random_nr)
{
Console.WriteLine("För lågt tyvärr. Testa igen!");
}
else
{
Console.WriteLine("Helt rätt! Bra jobbat!");
}
} while (UserNr != random_nr);
Console.ReadKey();
}
}
}

Permalänk
Medlem
Skrivet av widell_1992:

Hej! Sitter och försöker klura ut hur jag skall koda en loop som ger användaren möjlighet att gissa sig fram till en random genererat nummer. Jag har fastnat lite just nu på att få in rätt villkor i loopen, mer specifikt vet jag inte riktigt hur jag skall kunna använda Console.ReadLine inne i loopen samtidigt som den finns utanför för att då definiera vad villkoret som ligger i slutet.

Här är min kod hitils:

namespace ConsoleApp4 { class Program { static void Main(string[] args) { Random rng = new Random(); int random_nr = rng.Next(1, 100); // Random number generator, rng. int lap = 0; //Håller reda på antalet varv Console.WriteLine("Hej! Du skall nu gissa ett tal mellan 1-100, lycka till!"); string userNrText; userNrText = Console.ReadLine(); int UserNr = int.Parse(userNrText); do { random_nr = rng.Next(1, 100); lap++; if (UserNr > random_nr) { Console.WriteLine("Nej det var för högt. Försök igen!"); } else if (UserNr < random_nr) { Console.WriteLine("För lågt tyvärr. Testa igen!"); } else { Console.WriteLine("Helt rätt! Bra jobbat!"); } } while (UserNr != random_nr); Console.ReadKey(); } } }

Tja, rent krasst är det bara att använda Console.ReadLine() inuti loopen.

Använder du en Do while loop av någon speciell anledning? Jag har aldrig sett någon använda det typ ever.

Visa signatur

Citera för svar

Permalänk

Jo försökte det nu, men då fastnade programmet efter att jag skrev in siffran.

Satt och kollade på en video där man gjorde en liknande uppgift och där användes en do while loop, har ingen riktig anledning utöver det.

Uppskattar hjälpen!

Permalänk

Ändrade om lite och satte in det i en while loop, jag får inmatning att fungera. Men varje inmatning oavsätt hur stor triggar händelsen där nummret är för lågt. Ser ut såhär nu:

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

namespace ConsoleApp4
{
class Program
{
static void Main(string[] args)
{
Random rng = new Random();
int random_nr = rng.Next(1, 100); // Random number generator, rng.
int lap = 0; //Håller reda på antalet varv
Console.WriteLine("Hej! Du skall nu gissa ett tal mellan 1-100, lycka till!");
string userNrText;
userNrText = Console.ReadLine();
int UserNr = int.Parse(userNrText);
while (UserNr != random_nr)
{

lap++;
Console.ReadLine();
if (UserNr > random_nr)
{
Console.WriteLine("Nej det var för högt. Försök igen!");
}
else if (UserNr < random_nr)
{
Console.WriteLine("För lågt tyvärr. Testa igen!");
}
else
{
Console.WriteLine("Helt rätt! Bra jobbat!");
}
}
Console.ReadKey();
}
}
}

Permalänk
Medlem
Skrivet av widell_1992:

Hej! Sitter och försöker klura ut hur jag skall koda en loop som ger användaren möjlighet att gissa sig fram till en random genererat nummer. Jag har fastnat lite just nu på att få in rätt villkor i loopen, mer specifikt vet jag inte riktigt hur jag skall kunna använda Console.ReadLine inne i loopen samtidigt som den finns utanför för att då definiera vad villkoret som ligger i slutet.

Här är min kod hitils:

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

namespace ConsoleApp4
{
class Program
{
static void Main(string[] args)
{
Random rng = new Random();
int random_nr = rng.Next(1, 100); // Random number generator, rng.
int lap = 0; //Håller reda på antalet varv
Console.WriteLine("Hej! Du skall nu gissa ett tal mellan 1-100, lycka till!");
string userNrText;
userNrText = Console.ReadLine();
int UserNr = int.Parse(userNrText);

do
{
random_nr = rng.Next(1, 100);
lap++;
if (UserNr > random_nr)
{
Console.WriteLine("Nej det var för högt. Försök igen!");
}
else if (UserNr < random_nr)
{
Console.WriteLine("För lågt tyvärr. Testa igen!");
}
else
{
Console.WriteLine("Helt rätt! Bra jobbat!");
}
} while (UserNr != random_nr);
Console.ReadKey();
}
}
}

Är inte helt säker på att jag förstår vad du menar, men efter att ha kollat på koden så finns det lite spontana saker såsom:
* Du använder aldrig "lap" mer än till att öka den. Ska den presenteras?
* Vid varje gissning så slumpar du ett nytt tal, är det tänkt att man bara har en gissning på sig?
* Du skriver Console.ReadLine i din beskrivning men i loopen är det ReadKey

Som det är just nu så tar du fram ett slumptal, tillåter användaren att mata in en gissning, sen slumpar du ett nytt tal, ökar lap, kollar om man gissat rätt, har man inte det så får man gissa igen. Här har man slumpat fram två tal på en gissning.

Om man ska gissa på samma tal tills man gissat rätt och sen får man köra programmet igen om man vill spela så skulle jag ta bort nya slumptalet i Do-clausen om du vill behålla din kod as-is.

I det här fallet eftersom programmet är så pass litet så kan du nog dela upp det i 3 delar.

1. Ta fram slumptalet
2. (While) hantera först användarens inmatning
3. (While) ge feedback på inmatat värde

Då slipper du ha gissningslogik på mer än ett ställe och flödet följer mer användningsfallet utifrån din beskrivning. Ett tips kan vara att först lösa problemet med pseudokod, sen använder du din pseudokod som specifikation för din implementation. Lycka till!

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av widell_1992:

Ändrade om lite och satte in det i en while loop, jag får inmatning att fungera. Men varje inmatning oavsätt hur stor triggar händelsen där nummret är för lågt. Ser ut såhär nu:

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

namespace ConsoleApp4
{
class Program
{
static void Main(string[] args)
{
Random rng = new Random();
int random_nr = rng.Next(1, 100); // Random number generator, rng.
int lap = 0; //Håller reda på antalet varv
Console.WriteLine("Hej! Du skall nu gissa ett tal mellan 1-100, lycka till!");
string userNrText;
userNrText = Console.ReadLine();
int UserNr = int.Parse(userNrText);
while (UserNr != random_nr)
{

lap++;
Console.ReadLine();
if (UserNr > random_nr)
{
Console.WriteLine("Nej det var för högt. Försök igen!");
}
else if (UserNr < random_nr)
{
Console.WriteLine("För lågt tyvärr. Testa igen!");
}
else
{
Console.WriteLine("Helt rätt! Bra jobbat!");
}
}
Console.ReadKey();
}
}
}

Haha skriver så djävulskt långsamt på telefonen att du han göra om din lösning! Ser bättre ut men med tanke på din fråga så kan du läsa på nätet om vad ReadKey gör och vad ReadLine gör. Bra jobbat.

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av widell_1992:

Ändrade om lite och satte in det i en while loop, jag får inmatning att fungera. Men varje inmatning oavsätt hur stor triggar händelsen där nummret är för lågt.

Felet är att du inte sparar användarens inmatning i loopen, utan kastar bara bort inmatningen och använder den första gissningen istället. Ett tips är att du inte behöver läsa in någon gissning före loopen, du kan ha all inläsning på ett enda ställe innuti loopen istället. En do-while-loop är faktiskt ett utmärkt val för denna uppgift.

Permalänk

@Jsandahl: hehe, tack för hjälpen. Sitter och försöker det där med psuedokoden, skam den som ger sig. Om det finns något annat som verkar knasigt med koden så är jag väldigt tacksam för all hjälp som jag kan få!

Lägger in hur den ser ut nu en gång till. (Stod även i min uppgift att det skulle vara en do-while loop, därav gick jag tillbaka till det.

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

namespace ConsoleApp4
{
class Program
{
static void Main(string[] args)
{
Random rng = new Random();
int random_nr = rng.Next(1, 100); // Random number generator, rng.
int lap = 0; //Håller reda på antalet varv
Console.WriteLine("Hej! Du skall nu gissa ett tal mellan 1-100, lycka till!");
string userNrText;
userNrText = Console.ReadLine();
int UserNr = int.Parse(userNrText);
do
{
Console.ReadLine();
lap++;
if (UserNr < random_nr)
{
Console.WriteLine("För lågt tyvärr. Testa igen!" + " " + lap + " Försök gjorda");
}
else if (UserNr > random_nr)
{
Console.WriteLine("Nej det var för högt. Försök igen!" + " " + lap + " Försök gjorda");
}
else
{
Console.WriteLine("Helt rätt! Bra jobbat!" + lap + " " + " Försök gjorda");
}
} while (UserNr != random_nr);

}
}
}

Permalänk

@perost: Jasså, Kan ha vart där det slog slint då Undrar bara en sak, hur kan jag göra vilkoret i slutet av loopen om jag inte har raderna som definerar inmatningen innan den börjar?

Permalänk
Medlem
Skrivet av widell_1992:

@perost: Jasså, Kan ha vart där det slog slint då Undrar bara en sak, hur kan jag göra vilkoret i slutet av loopen om jag inte har raderna som definerar inmatningen innan den börjar?

Du behöver inte definiera någon inmatning före loopen, bara variablerna du vill jämföra.

Permalänk
Medlem

Nu har jag inte använt en do-while på länge men som perost sagt så bör det gå att nyttja bra för just detta. Tror nedan bör vara ett vettigt flöde men överlåter implementationen till dig
1. Ta fram slumptal
2. (Do) hantera gissning och varv
3. (While) feedback vid fel gissning
4. Eftersom loopen avslutas vid korrekt gissning så kan du ge feedback på korrekt gissning utanför do-while som det sista som görs

Edit: nu sitter jag inte vid en dator men känns udda med dubbla scope på do-while. Kikade lite snabbt och det ser snarare ut som om det borde vara ett scope efter do som utförs minst en gång följt av enbart ett kriteria(while). Isf borde din kod funka om du bara tar bort sista scopet vid while.
Edit 2: förutsatt att du gör som svaret i en tidigare kommentar och sparar undan inmatningen i loopen
Skickades från m.sweclockers.com

Permalänk

@Jsandahl: Löste uppgiften tillslut, enormt tack för hjälpen. Det var det sista för veckan som skall in så kändes otroligt skönt att få det gjort.

En hjälte är du!