Permalänk

C# nöjesprojekt

Hejsan, håller på med ett litet projekt för skojs skull. Man ska kunna mata in antal kurser man har läst och sedan betygen till kurserna.
Programmet skriver sedan ut hur många MVG,VG,G och IG man har. Tänkte att jag börjar med att fråga; När man ska ange antal kurser så vill jag att programmet går in i en loop där man stiger ur loopen om inmatningen är korrekt. Har ingen aning hur det ska göras, kan någon komma med lite tips?

using System; namespace Betyg { class Program { static void Main(string[] args) { int inPut = 0; do { Console.WriteLine("Ange antal kurser:"); try { inPut = int.Parse(Console.ReadLine()); } catch (Exception) { Console.WriteLine("Du får endast ange siffror"); } } while (inPut !=); //så länge inmatning inte är en siffra? string[] array = new string[inPut]; int i = 0; for (i=0 ; i < array.Length; i++) { Console.WriteLine($"Ange betyg för kurs {i}"); array[i] = Console.ReadLine(); } Console.WriteLine("Vill du se alla betyg?Y/N"); char yesorNo = Convert.ToChar(Console.ReadLine()); if (yesorNo == 'Y') { for (i = 0; i < array.Length; i++) { Console.WriteLine($"Betyg {i}: {array[i]}"); } } Console.ReadKey(); } } }

Permalänk
Medlem

Nu kan jag egentligen Java och inte C#, men finns lite olika alternativ att lösa ditt problem:

1. Ha while (inPut <= 0), eftersom det inte är en valid input ändå (kanske ändra din error till siffror större än 0)
2. Ha while (true) och sedan en break i ditt try-block efter parsen.
3. En bool variabel typ "correctInput" som initieras som false, kör while (!correctInput) och sedan sätter den till true i try-blocket, också efter parsen.

EDIT: Kan tillägga att du inte måste kolla ifall inPut är en siffra eller ej, eftersom C# är ett statiskt språk där man inte kan ändra variabeltyper. Variabeln inPut kommer alltså alltid vara en int, eftersom du har deklarerat det. Men den kommer inte få ett nytt värde om din parse ger ett exception, utan vara kvar som 0. Skriver användaren in en siffra korrekt så uppdateras värdet.

Permalänk
Medlem
Skrivet av Camomille:

Hejsan, håller på med ett litet projekt för skojs skull. Man ska kunna mata in antal kurser man har läst och sedan betygen till kurserna.
Programmet skriver sedan ut hur många MVG,VG,G och IG man har. Tänkte att jag börjar med att fråga; När man ska ange antal kurser så vill jag att programmet går in i en loop där man stiger ur loopen om inmatningen är korrekt. Har ingen aning hur det ska göras, kan någon komma med lite tips?

För att köra vidare på din kod, tror det är tryparse du letar efter (https://docs.microsoft.com/en-us/dotnet/api/system.int32.tryp...)

int kurser = 0; do { Console.WriteLine("Ange antal kurser:"); } while (!int.TryParse(Console.ReadLine(), out kurser));

Permalänk

@MrNubcake: Nice! det fungerade med while (inPut<=0) fattar dock inte logiken bakom detta, om vi matar in text betyder de då att input >= 0? låter kanske jättedum nu men då får jag försvara mig med att jag är trött

Permalänk
Medlem
Skrivet av Camomille:

@MrNubcake: Nice! det fungerade med while (inPut<=0) fattar dock inte logiken bakom detta, om vi matar in text betyder de då att input >= 0? låter kanske jättedum nu men då får jag försvara mig med att jag är trött

Du sätter inPut = 0 i början. Om användaren matar in text (som inte är en siffra) kommer värdet fortfarande vara 0, eftersom parsningen kommer misslyckas och värdet inte uppdateras. Du kan ju ha inPut == 0 också, men tror inte du vill att användare ska kunna mata in -5 t.ex. heller!

Permalänk

@MrNubcake: Snygg förklaring, nu är jag med. Tack så mycket!

Permalänk
Medlem

Exempelvis

int inPut = 0; bool kontroll = false; while(kontroll == false) { Console.Write("Ange antal kurser: "); kontroll = int.TryParse(Console.ReadLine(), out inPut); if (kontroll == false) { Console.WriteLine("Du får endast ange siffror"); } }

Visa signatur

AMD Ryzen 7 5800X3D | EVGA GeForce RTX 3080 10GB FTW3 ULTRA | ASUS ROG Strix B450-F Gaming | Corsair RM750X V2 | Crucial Ballistix Sport LT 3200MHz 16GB | Samsung 980 Pro 1TB | Crucial MX500 2TB | NZXT H500