Hjälp med uppgiften gissa tal i C#

Permalänk

Hjälp med uppgiften gissa tal i C#

Hej!
Jag är ytterligare en newbee på det här med programmering då jag nyss börjat en kurs.
I uppgiften så ska vi slumpa fram ett tal och användaren skall gissa det slumpade talet.
Jag har letat efter mitt svar i alla tusentals trådar om den här uppgiften men ej hittat svaret.
Därför ber jag om lite hjälp här.
Jag har löst det mesta i koden och behöver väl därför inte lägga ut koden.
Men antingen så är mitt problem så lättlöst att ingen behöver hjälp med det, eller så har alla missat den detaljen.

Eftersom användaren skall skriva in det tal den gissar på så finns ju naturligtvis chans att den skriver fel och programmet kraschar.
Naturligtvis så kan detta enkelt lösas med en bool loop, MEN vi får avdrag på uppgiften om vi använder variabeln bool.

Nu förstår ni säkert frågan.
Vad/vilken metod kan man använda istället?

Tacksam för snabbt svar.

Mvh,
Patrik

Permalänk
Medlem

Lite oklart vad du egentligen menar, men jag antar att det är meningen att ni ska använda Int32.Parse istället för Int32.TryParse.

Int32.Parse gör inte att programmet kraschar när man försöker konvertera en sträng som inte representerar ett tal, det kastar ett exception som talar om vad som gick fel. Men om detta exception inte fångas så kommer programmet avslutas, vilket kan se ut som att det kraschat. Så läs på om hur exceptions fungerar, och följer du länken jag gav till dokumentationen för Int32.Parse så finns även exempel.

Permalänk

@Patrik Persson:

public class Guess
{
private readonly Random rand;
private int randomNumber;
public Guess(int min, int max)
{
rand = new Random();
randomNumber = rand.Next(min, max);
}
public bool GuessRandomNumber()
{
int number;
Console.Write($"Guess a number:");
if (int.TryParse(Console.ReadLine(), out number) == false)
{
Console.WriteLine("input nut a number");
return false;
}
int compare = randomNumber.CompareTo(number);

if (compare < 0)
{
Console.WriteLine("randomNumber is smaller than your guess");
return false;
}
else if (compare == 0)
{
Console.WriteLine("Correct!");
return true;
}
else
{
Console.WriteLine("randomNumber is bigger than your guess");
return false;
}
}
}

class Program
{
static void Main(string[] args)
{
Guess guess = new Guess(0, 10);
while (!guess.GuessRandomNumber());
}
}

Permalänk
Medlem
Skrivet av shakeshar:

@Patrik Persson:

public class Guess
{
private readonly Random rand;
private int randomNumber;
public Guess(int min, int max)
{
rand = new Random();
randomNumber = rand.Next(min, max);
}
public bool GuessRandomNumber()
{
int number;
Console.Write($"Guess a number:");
if (int.TryParse(Console.ReadLine(), out number) == false)
{
Console.WriteLine("input nut a number");
return false;
}
int compare = randomNumber.CompareTo(number);

if (compare < 0)
{
Console.WriteLine("randomNumber is smaller than your guess");
return false;
}
else if (compare == 0)
{
Console.WriteLine("Correct!");
return true;
}
else
{
Console.WriteLine("randomNumber is bigger than your guess");
return false;
}
}
}

class Program
{
static void Main(string[] args)
{
Guess guess = new Guess(0, 10);
while (!guess.GuessRandomNumber());
}
}

Hur hjälper det här med TS fråga?

TS:
Sett liknande frågor förut, tror er lärare vill att ni ska använda try/catch för att öva på det. Dock är det helt orimligt att lägga det runt en parse när det finns TryParse, men tyvärr verkar det vara vanligt inom gymnasieprogrammering att man ska lära sig allt på fel sätt.

Skickades från m.sweclockers.com

Permalänk
Medlem

Vadå, du får inte använda while(true)? Du behöver ju inte använda en variabel, loopen frågar på rätt siffra tills man svarat rätt och den hoppar vidare till någon annan del i ditt program.

Permalänk

@perost:
Jag har varit in och kikat lite på dom där.
Ska kolla lite mer imorgon när hjärnan klarnat lite.
Tack så länge.

Permalänk

@shakeshar:
Den där var lite overkill för den här uppgiften tror jag.
Sen tycker jag mig se en bool variabel i koden.
Tack i alla fall.

Permalänk
Skrivet av Harddrive:

Vadå, du får inte använda while(true)? Du behöver ju inte använda en variabel, loopen frågar på rätt siffra tills man svarat rätt och den hoppar vidare till någon annan del i ditt program.

Jag kanske missförstår ditt svar.
Men det jag vill är att kolla av så att användaren skrivit en siffra och inte en bokstav
Eller annat tecken.
Detta utan att använda mig av variabeln bool.

Permalänk
Skrivet av zaibuf:

Hur hjälper det här med TS fråga?

TS:
Sett liknande frågor förut, tror er lärare vill att ni ska använda try/catch för att öva på det. Dock är det helt orimligt att lägga det runt en parse när det finns TryParse, men tyvärr verkar det vara vanligt inom gymnasieprogrammering att man ska lära sig allt på fel sätt.

Skickades från m.sweclockers.com

Jag har provat en del med try/catchblock men inte fått det att funka.
Det kan ju hänga ihop med min låga kunskap.
När jag lägger upp ett try/catchblock så får jag felkod på en variabel.

Permalänk
Medlem
Skrivet av Patrik Persson:

Detta utan att använda mig av variabeln bool.

bool är ingen variabel, det är en typ. Du kan alltså ha en variabel som är en bool, men inte en variabel som heter bool.

Skrivet av Patrik Persson:

När jag lägger upp ett try/catchblock så får jag felkod på en variabel.

Nu gissar jag bara, men ett vanligt misstag jag sett nybörjare göra är att deklarera variabler inne i try-blocket. En variabel kan endast kommas åt i samma block som den deklarerats samt från nästlade block i det blocket. Detta gäller alltså för block generellt och inte bara för try/catch, där ett block öppnas med { och stängs med }. D.v.s.:

int a = 3; { int b = a; // Ok, a finns i ett omgivande block. } int c = b; // Fel, inget b finns deklarerat i detta block.

Du kan alltså inte skriva:

try { int i = Int32.Parse(Console.ReadLine()); } catch (...) { ... }

och sen försöka använda i efter try-catch-blocket. Du måste istället skriva t.ex.:

int i = 0; try { i = Int32.Parse(Console.ReadLine()); } catch (...) { ... }

Permalänk
Skrivet av perost:

bool är ingen variabel, det är en typ. Du kan alltså ha en variabel som är en bool, men inte en variabel som heter bool.
Nu gissar jag bara, men ett vanligt misstag jag sett nybörjare göra är att deklarera variabler inne i try-blocket. En variabel kan endast kommas åt i samma block som den deklarerats samt från nästlade block i det blocket. Detta gäller alltså för block generellt och inte bara för try/catch, där ett block öppnas med { och stängs med }. D.v.s.:

int a = 3; { int b = a; // Ok, a finns i ett omgivande block. } int c = b; // Fel, inget b finns deklarerat i detta block.

Du kan alltså inte skriva:

try { int i = Int32.Parse(Console.ReadLine()); } catch (...) { ... }

och sen försöka använda i efter try-catch-blocket. Du måste istället skriva t.ex.:

int i = 0; try { i = Int32.Parse(Console.ReadLine()); } catch (...) { ... }

Ja du ser vilken kunskapsnivå jag har när jag skriver att bool är en variabel.
Jag menade ju naturligtvis typen bool.
Jag lär mig.

Jag ska kika lite närmare på det och testa imorgon när hjärnan är lite piggare.
Tack för svar.

Permalänk
Skrivet av zaibuf:

Hur hjälper det här med TS fråga?

TS:
Sett liknande frågor förut, tror er lärare vill att ni ska använda try/catch för att öva på det. Dock är det helt orimligt att lägga det runt en parse när det finns TryParse, men tyvärr verkar det vara vanligt inom gymnasieprogrammering att man ska lära sig allt på fel sätt.

Skickades från m.sweclockers.com

Skrivet av Harddrive:

Vadå, du får inte använda while(true)? Du behöver ju inte använda en variabel, loopen frågar på rätt siffra tills man svarat rätt och den hoppar vidare till någon annan del i ditt program.

Skrivet av perost:

bool är ingen variabel, det är en typ. Du kan alltså ha en variabel som är en bool, men inte en variabel som heter bool.
Nu gissar jag bara, men ett vanligt misstag jag sett nybörjare göra är att deklarera variabler inne i try-blocket. En variabel kan endast kommas åt i samma block som den deklarerats samt från nästlade block i det blocket. Detta gäller alltså för block generellt och inte bara för try/catch, där ett block öppnas med { och stängs med }. D.v.s.:

int a = 3; { int b = a; // Ok, a finns i ett omgivande block. } int c = b; // Fel, inget b finns deklarerat i detta block.

Du kan alltså inte skriva:

try { int i = Int32.Parse(Console.ReadLine()); } catch (...) { ... }

och sen försöka använda i efter try-catch-blocket. Du måste istället skriva t.ex.:

int i = 0; try { i = Int32.Parse(Console.ReadLine()); } catch (...) { ... }

Skrivet av Patrik Persson:

Ja du ser vilken kunskapsnivå jag har när jag skriver att bool är en variabel.
Jag menade ju naturligtvis typen bool.
Jag lär mig.

Jag ska kika lite närmare på det och testa imorgon när hjärnan är lite piggare.
Tack för svar.

Hej igen,
Kursboken som jag beställde i oktober kom i förrgår så jag har suttit och lusläst lite.
Boken är till stor hjälp och lite festligt är att i slutet på kapitlet för denna övning så framgår det att vidare i kursen kommer vi inte att använda Try/Catch!

Jag har dock lagt in ett try/catch block nu och det verkar funka, men jag tycker inte att det verkar optimalt.
För att när användaren skriver annat än ett heltal så kastas ju naturligtvis ett meddelande.
Ett som jag skrivit själv och exception e för att jag valde att skriva ut båda. Kanske lite onödigt att ta med exception e.
Men när detta sker så slutar programmet!?
Jag skulle ju vilja att användaren får möjlighet att gå vidare med programmet och skriva in med siffror, men det kanske inte funkar med bara try/catch block?

Permalänk

Jag hade lagt try/catch blocket fel så nu funkar det. Tack för all hjälp ni bidragit med.

Permalänk
Medlem

Eftersom du lyckats lösa uppgiften så skickar jag mina svar här direkt:
Utan try catch och utan bool: https://repl.it/@johanbx/sweclocker-guess-num
Med try catch och utan bool: https://repl.it/@johanbx/sweclocker-guess-num-try-catch