Permalänk
Medlem

Programmering 1 felhantering

Hjälp!
Läser Programmering 1, Varför startar inte programmet?
Jag får den här felkoden...
Error (active) CS0029 Cannot implicitly convert type 'int' to 'bool'

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

namespace slumpat
{
internal class Program
{
static void Main(string[] args)
{
// Deklaration av variabler
Random slumpat = new Random(); // skapar ett random objekt
int speltal = slumpat.Next(); // anropar Next metoden för att skapa ett slumptal mellan 1 och 20
// läs på, vad är overload metoder? https://msdn.microsoft.com/en-us/library/system.random.next(v...
bool spela = true; // Variabel för att kontrollera om spelet ska fortsätta köras

while (!spela)
{
Console.Write("\n\tGissa på ett tal mellan 1 och 20: ");
int tal = Convert.ToInt32(Console.ReadLine());

if (tal < speltal)
{
Console.WriteLine("\tDet inmatade talet " + tal + " är för litet, försök igen.");
}

if (tal > speltal)
{
Console.WriteLine("\tDet inmatade talet " + tal + " är för stort, försök igen."); // Finns inget +, syntaxfel.
}

if (tal = speltal)
{
Console.WriteLine("\tGrattis, du gissade rätt!");
spela = false;
}

}
}

}

}

Tänker att jag ska ha if, else if och else ?? Men det löser ju inte felkoden. Tacksam för hjälp.

Permalänk
Medlem

Din felkod CS0029 Cannot implicitly convert type 'int' to 'bool' uppstår på grund av att du använder en enda likhetstecken = istället för dubbla likhetstecken == i din jämförelse i if (tal = speltal). Enkla likhetstecken används för tilldelning, medan dubbla likhetstecken används för jämförelse.

För att lösa detta, ändra if (tal = speltal) till if (tal == speltal). Dessutom har du ett logiskt fel i din while-slinga där villkoret while (!spela) kommer att göra att spelet avslutas direkt eftersom spela är satt till true från början. Du vill istället ha while (spela).

Här är en rättad version av ditt program:

csharp
Kopiera kod
using System;

namespace slumpat
{
internal class Program
{
static void Main(string[] args)
{
// Deklaration av variabler
Random slumpat = new Random(); // skapar ett random objekt
int speltal = slumpat.Next(1, 21); // anropar Next metoden för att skapa ett slumptal mellan 1 och 20
bool spela = true; // Variabel för att kontrollera om spelet ska fortsätta köras

while (spela)
{
Console.Write("\n\tGissa på ett tal mellan 1 och 20: ");
int tal = Convert.ToInt32(Console.ReadLine());

if (tal < speltal)
{
Console.WriteLine("\tDet inmatade talet " + tal + " är för litet, försök igen.");
}
else if (tal > speltal)
{
Console.WriteLine("\tDet inmatade talet " + tal + " är för stort, försök igen.");
}
else if (tal == speltal)
{
Console.WriteLine("\tGrattis, du gissade rätt!");
spela = false;
}
}
}
}
}
Förklaringar av ändringarna:
Ändrat if (tal = speltal) till if (tal == speltal): Fixade jämförelsefel.
Ändrat while (!spela) till while (spela): Fixade logiskt fel så att spelet fortsätter tills användaren gissar rätt.
Använt else if och else för bättre logik: Förbättrade kodstruktur.
Nu bör ditt program fungera som förväntat och låta användaren gissa ett tal tills rätt tal är gissat.

Du bord prova nyttja AI eftersom du läser programmering

Permalänk
Medlem

Läs den här raden igen:

if (tal = speltal)

Permalänk
Medlem

Använd kod-taggar. Sen saknar du ett = i sista if sattsen

Permalänk
Medlem

Din kompilator berättar för dig på vilka rader det finns kompileringsfel. Använd den hjälpen. Det går troligen att klicka/dubbelklicka på felmeddelandet för att hoppa till raden där felet finns.

I det här fallet handlar det om att du använt tilldelningsoperatorn när du egentligen ville använda jämförelseoperatorn.

I fortsättningen, lägg in din kod så här:
[code]koden här[/code]
så blir den lättare att läsa och ökar chansen att du får hjälp.

(Du har tur som kodar i ett språk där kompilatorn inte släpper igenom det här felet hur som helst. En C-kompilator hade i stället givit dig en bugg vid körning.)

Edit: jag måste tydligen bli snabbare på att skriva inlägg på mobilen

Permalänk
Medlem

När du skriver tal = speltal så sätter du värdet på tal till speltals värde. Om du vill jämföra så använder du ==. Läs på om operatorer. Det är något av det viktigaste när man börjar annars funkar ingenting

Permalänk
Medlem
Skrivet av klockish:

Din felkod CS0029 Cannot implicitly convert type 'int' to 'bool' uppstår på grund av att du använder en enda likhetstecken = istället för dubbla likhetstecken == i din jämförelse i if (tal = speltal). Enkla likhetstecken används för tilldelning, medan dubbla likhetstecken används för jämförelse.

För att lösa detta, ändra if (tal = speltal) till if (tal == speltal). Dessutom har du ett logiskt fel i din while-slinga där villkoret while (!spela) kommer att göra att spelet avslutas direkt eftersom spela är satt till true från början. Du vill istället ha while (spela).

Här är en rättad version av ditt program:

csharp
Kopiera kod
using System;

namespace slumpat
{
internal class Program
{
static void Main(string[] args)
{
// Deklaration av variabler
Random slumpat = new Random(); // skapar ett random objekt
int speltal = slumpat.Next(1, 21); // anropar Next metoden för att skapa ett slumptal mellan 1 och 20
bool spela = true; // Variabel för att kontrollera om spelet ska fortsätta köras

while (spela)
{
Console.Write("\n\tGissa på ett tal mellan 1 och 20: ");1
int tal = Convert.ToInt32(Console.ReadLine());

if (tal < speltal)
{
Console.WriteLine("\tDet inmatade talet " + tal + " är för litet, försök igen.");
}
else if (tal > speltal)
{
Console.WriteLine("\tDet inmatade talet " + tal + " är för stort, försök igen.");
}
else if (tal == speltal)
{
Console.WriteLine("\tGrattis, du gissade rätt!");
spela = false;
}
}
}
}
}
Förklaringar av ändringarna:
Ändrat if (tal = speltal) till if (tal == speltal): Fixade jämförelsefel.
Ändrat while (!spela) till while (spela): Fixade logiskt fel så att spelet fortsätter tills användaren gissar rätt.
Använt else if och else för bättre logik: Förbättrade kodstruktur.
Nu bör ditt program fungera som förväntat och låta användaren gissa ett tal tills rätt tal är gissat.

Du bord prova nyttja AI eftersom du läser programmering

Tusen tack.
Nu får jag dock ett fel CS0201 på nedersta else (tal ==speltal). Den rödmarkerar efter ) men när jag sätter ut semicolon efter så blir hela raden röd? Tankar?

Om jag slulle vilja använda TryParse för att hantera den felaktiga inmatningen, hur skulle det isåfall se ut?

Permalänk
Medlem
Skrivet av Viccis:

Tusen tack.
Nu får jag dock ett fel CS0201 på nedersta else (tal ==speltal). Den rödmarkerar efter ) men när jag sätter ut semicolon efter så blir hela raden röd? Tankar?

Om jag slulle vilja använda TryParse för att hantera den felaktiga inmatningen, hur skulle det isåfall se ut?

Hejsan. För att kunna hjälpa dig kan du skriva nuvarande koden inom kodtaggar, så kan jag kolla vad som är fel.
Jag är lite ringrostig inom C#, men något liknande:

int.TryParse(Console.ReadLine(), out var tal);