Gå til innhold

Anbefalte innlegg

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

namespace ConsoleApplication2
{
   class Program
   {
       static void Main(string[] args)
       {
           Console.Write("Enter Race: ");
               string sRace = Console.ReadLine();
               if (sRace != "Protoss")
               {
                   Console.WriteLine("That is not a Starcraft race!");
               }
               else if (sRace != "Zerg")
               {
                   Console.WriteLine("That is not a Starcraft Race!");
               }
               else if (sRace != "Terran")
               {
                   Console.WriteLine("That is not a Starcraft Race!");
               }
           if (sRace = "Protoss")
           {
               Console.WriteLine("Strategy");
           }
           Console.WriteLine("Press Enter to terminate...");
           Console.Read();
       }
   }
}

 

 

Skal lage et enkelt program hvor brukeren setter inn navn på en rase i sc2, så vil den gi ut forskjellige strategier. Problemet er at jeg ikke vet helt hvordan jeg skal sette det opp.

 

Når jeg skriver inn Protoss så kommer det ikke Strategy opp, og jeg kan tenke meg litt hvorfor. siden jeg har satt :

 

else if (sRace != "Terran")

 

så sier den bare når jeg skriver inn Terran?

Lenke til kommentar
Videoannonse
Annonse

Et eksempel på hvordan du kan sette det opp:

 

if (sRace == "Protoss" || sRace == "Zerg" || sRace == "Terran")
{
 Console.WriteLine("Strategy for " + sRace + ": ");
}
else
{
 Console.WriteLine("That is not a Starcraft Race!");
}

 

Slik du hadde det ville testen feile uansett hva du skrev inn, pluss at den siste if-setningen mangler en '='.

Endret av Jassogitt
Lenke til kommentar

Tankegangen din er litt rar. Istedet for å sjekke hva teksten er, så sjekker du heller hva den ikke er?

 

tenkte først at programmet skulle sjekke om brukeren skrev inn en riktig rase

 

 

takk for tipset Jassogitt alt ble plutselig veldig enkelt

Endret av jeIIy
Lenke til kommentar

switch er vel bedre å bruke enn if her

edit: men om det er for å lære deg if så blir det jo noe annet

 

har nettopp kommet til kapitlet med if, så jeg tester litt rundt der :)

 

 

Edit: har et lite problem... Jeg må skrive Protoss med stor "P" hvis det skal funke, hvordan skal det funke med begge deler?

Endret av jeIIy
Lenke til kommentar

Du må gjøre en case-insesnstivie sammenligning.

 

if(sRace.Equals("protoss", StringComparison.CurrentCultureIgnoreCase))

 

takk! er det noen måte jeg kan si at hele sRace variabelen bare skal ignorere case sensitiv?

Endret av jeIIy
Lenke til kommentar

Nei. sRace er av type System.String, og disse er immutable (dvs. du kan ikke endre innholdet etter objektet er opprettet).

Det er mulig du kan endre CurrentCulture til å bli IgnoreCase, men det er ikke helt stuerent.

 

Det du derimot kan gjøre, er å skrive en metode som gjør sammenligningen for deg, så slipper du å skrive det flere ganger. Men når det uansett bare er tre utfall ville jeg bare skrevet det samme flere ganger.

Lenke til kommentar

Jeg ville gjort noe sånn som dette:

 

static void Main(string[] args)
{
   var races = new[] { "Protos", "Zerg", "Terran" };

   Console.Write("Enter Race: ");
   string sRace = Console.ReadLine();

   if (races.Any(r => r.Equals(sRace, StringComparison.CurrentCultureIgnoreCase)))
   {
       // do your stuff
   }
   else
   {
       Console.WriteLine("That is not a Starcraft Race!");
   }

   Console.WriteLine("Press Enter to terminate...");
   Console.Read();
}

 

Når du gjør det samme flere ganger finnes det alltid en bedre måte..

Endret av torbjørn marø
Lenke til kommentar

Det er også mulig å bruke enumeration her:

 

public enum Race
{
 Protoss,
 Zerg,
 Terran
}

 

Race result;
if(Enum.TryParse(sRace, true, out result))
{
 // Teksten som er skrevet inn er definert i enum-en, og vil ligge i result
}

 

På denne måten får du Enum-en til å være case-insensitive (det er det 'true' gjør) og samtidig slipper du å sammenligne strings i fremtiden, men istedet så er hver rase representert ved et integer.

Lenke til kommentar

takk! er det noen måte jeg kan si at hele sRace variabelen bare skal ignorere case sensitiv?

 

Du har alltids mulighet til å jobbe helt med lowercase ved å sørge for å sette alle variablene til lowercase i utgangspunktet.

 

Det hele går på preferanser på hvordan du liker å skrive det. Forskjellig utviklere har forskjellige preferanser på hva de synes ser best ut og er best.

 

string sRace = Console.ReadLine().ToLower();
if (sRace == "protoss" || sRace == "zerg" || sRace == "terran")

 

Alternativ kan du lage en string extension klasse for det:

 

   public static partial class StringExtensions {
       public static bool EqualsIgnoreCase(this string obj, string value) {
           if (obj == null) return (value == null);
           return obj.Equals(value, StringComparison.InvariantCultureIgnoreCase);
       }
   }

   string sRace = Console.ReadLine().ToLower();
   if (sRace.EqualsIgnoreCase("Protoss") || sRace.EqualsIgnoreCase("Zerg") || sRace.EqualsIgnoreCase("Terran")) 

 

Mange måter å gjøre det på. Finn den måten du synes er best leselig og ryddig for deg og benytt den metoden.

Endret av wolf5
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...