Permalänk
Medlem

Ser väl ok ut, om man bortser från att du saknar kontroll över vad som matas in. Men tänk på att Math.Round() returnerar ett avrundat decimaltal, så om man ska vara riktigt noga så testa att casta om värdet, såhär: (int)Math.Round(decimaltal).

Casting innebär att du tvingar en typomvandling där du kommer förlora data i omvandlingen, t.ex. här förlorar du decimalerna.

Permalänk
Medlem
Skrivet av Roffe:

@micke_mj: Jag tycker det där är ganska läsbart men en aning tillkrånglat. Vill du snygga till det lite så kan du göra så här:

static void Main () { Console.WriteLine ("Skriv ett decimaltal: "); string str = Console.ReadLine (); decimal decimaltal = Convert.ToDecimal (str); Console.WriteLine ("Decimaltalet" + " " + decimaltal + " " + "avrudans till heltalet" + " " + Math.Round (decimaltal)); Console.ReadKey (); }

Du behöver i detta fallet inte deklarera variabeln "decimaltal" i förväg utan kan göra det på samma rad som konverteringen sker.

Vill du korta ner ytterligare kan du strunta i att lägga inmatningen i en egen strängvariabel. Kan dock vara lite svårare att läsa för en nybörjare.

decimal decimaltal = Convert.ToDecimal (Console.ReadLine ());

Du kan även göra så här så slipper du att det kraschar om användaren skriver in ogiltiga tecken:

static void Main () { Console.WriteLine ("Skriv ett decimaltal: "); bool success = float.TryParse (Console.ReadLine (), out float decimaltal); if (success == true) Console.WriteLine ("Decimaltalet" + " " + decimaltal + " " + "avrudans till heltalet" + " " + Math.Round (decimaltal)); else Console.WriteLine ("Felaktig inmatning."); Console.ReadKey (); }

Hoppas det inte snurrar för mycket i skallen nu.

Vilken jevla klippa du är! Tack!
Kommer en till kod snart, som är sjukt "nybörjig" som du gärna får hjälpa mig med oxå!

Permalänk

@micke_mj: alla är vi nybörjare

Permalänk
Medlem
Skrivet av micke_mj:

Vilken jevla klippa du är! Tack!
Kommer en till kod snart, som är sjukt "nybörjig" som du gärna får hjälpa mig med oxå!

Ingen fara. Det är bara kul att hjälpa till.

Den här gången kanske jag var lite för hjälpsam men du hade ju redan en fungerande lösning. Bara du förstår vad koden gör så är det väl lugnt.

Visa signatur

Idioter förbokar datorspel.

Permalänk
Skrivet av Roffe:

@micke_mj: Jag tycker det där är ganska läsbart men en aning tillkrånglat. Vill du snygga till det lite så kan du göra så här:

static void Main () { Console.WriteLine ("Skriv ett decimaltal: "); string str = Console.ReadLine (); decimal decimaltal = Convert.ToDecimal (str); Console.WriteLine ("Decimaltalet" + " " + decimaltal + " " + "avrudans till heltalet" + " " + Math.Round (decimaltal)); Console.ReadKey (); }

Du behöver i detta fallet inte deklarera variabeln "decimaltal" i förväg utan kan göra det på samma rad som konverteringen sker.

Vill du korta ner ytterligare kan du strunta i att lägga inmatningen i en egen strängvariabel. Kan dock vara lite svårare att läsa för en nybörjare.

decimal decimaltal = Convert.ToDecimal (Console.ReadLine ());

Du kan även göra så här så slipper du att det kraschar om användaren skriver in ogiltiga tecken:

static void Main () { Console.WriteLine ("Skriv ett decimaltal: "); bool success = float.TryParse (Console.ReadLine (), out float decimaltal); if (success == true) Console.WriteLine ("Decimaltalet" + " " + decimaltal + " " + "avrudans till heltalet" + " " + Math.Round (decimaltal)); else Console.WriteLine ("Felaktig inmatning."); Console.ReadKey (); }

Hoppas det inte snurrar för mycket i skallen nu.

En fråga bara. Varför lägger ni in " " är det enbart för att det ska se enkelt ut eller finns det någon speciell anledning? jag brukar bara göra ett extra space framför " på meningen före eller efter. T ex "Decimaltalet " samt " avbrundas till heltalet "

Permalänk
Medlem
Skrivet av ZalamanderRelic:

En fråga bara. Varför lägger ni in " " är det enbart för att det ska se enkelt ut eller finns det någon speciell anledning? jag brukar bara göra ett extra space framför " på meningen före eller efter. T ex "Decimaltalet " samt " avbrundas till heltalet "

Ärligt talat, jag reflekterade aldrig över det. Bara kopierade TS kod och klistrade in i Visual Studio. Det är ju rätt onödigt, ja...

Visa signatur

Idioter förbokar datorspel.

Permalänk
Skrivet av Roffe:

Ärligt talat, jag reflekterade aldrig över det. Bara kopierade TS kod och klistrade in i Visual Studio. Det är ju rätt onödigt, ja...

En annan onödig grej är att skapa en variabel med " " det går men kanske inte är snyggt en class variabel som enbart innehåller space hm nja

Permalänk
Medlem
Skrivet av ZalamanderRelic:

En annan onödig grej är att skapa en variabel med " " det går men kanske inte är snyggt en class variabel som enbart innehåller space hm nja

Console.WriteLine ("Decimaltalet" + " " + decimaltal + " " + "avrudans till heltalet" + " " + Math.Round (decimaltal));

borde skrivas om till

Console.WriteLine ("Decimaltalet " + decimaltal + " avrundas till heltalet " + Math.Round (decimaltal));

Det är jag helt med på. Var det något annat du menade?

Visa signatur

Idioter förbokar datorspel.

Permalänk

@Roffe: nepp. inte direkt. var mest bara en fundering på om det fanns någon speciell anledning till att det var så men då är det inte det

Permalänk
Medlem

En kort variant:

public void Main() { double decimalNumber; Console.WriteLine("Input a decimal number: "); Console.WriteLine(double.TryParse(Console.ReadLine(), out decimalNumber) ? String.Format("{0} rounded is {1}", decimalNumber, Math.Round(decimalNumber)) : "Incorrect input format!"); }

Att korta ner kod för mycket kan dock gå ut över läsbarheten. Att exempelvis använda (väl namngivna) variabler för mellanlagring istället för funktionsanrop som parametrar i funktionsanrop kan göra koden mer lättläst.

public void Main() { string inputText; bool textIsNumber; double decimalNumber; int roundedNumber; Console.WriteLine("Input a decimal number: "); inputText = Console.ReadLine(); textIsNumber = double.TryParse(inputText, out decimalNumber); if(textIsNumber){ roundedNumber = Convert.ToInt32(Math.Round(decimalNumber)); Console.WriteLine("{0} rounded is {1}", decimalNumber, roundedNumber); } else { Console.WriteLine("Incorrect input format!"); } }

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem
Skrivet av ZalamanderRelic:

@Roffe: nepp. inte direkt. var mest bara en fundering på om det fanns någon speciell anledning till att det var så men då är det inte det

Visste inte det gick att göra så=) Tack för ytterligare tips!

Permalänk
Medlem
Skrivet av PeCe:

En kort variant:

public void Main() { double decimalNumber; Console.WriteLine("Input a decimal number: "); Console.WriteLine(double.TryParse(Console.ReadLine(), out decimalNumber) ? String.Format("{0} rounded is {1}", decimalNumber, Math.Round(decimalNumber)) : "Incorrect input format!"); }

Att korta ner kod för mycket kan dock gå ut över läsbarheten. Att exempelvis använda (väl namngivna) variabler för mellanlagring istället för funktionsanrop som parametrar i funktionsanrop kan göra koden mer lättläst.

public void Main() { string inputText; bool textIsNumber; double decimalNumber; int roundedNumber; Console.WriteLine("Input a decimal number: "); inputText = Console.ReadLine(); textIsNumber = double.TryParse(inputText, out decimalNumber); if(textIsNumber){ roundedNumber = Convert.ToInt32(Math.Round(decimalNumber)); Console.WriteLine("{0} rounded is {1}", decimalNumber, roundedNumber); } else { Console.WriteLine("Incorrect input format!"); } }

Vad har ? för funktion i första koden du skrev?
Ser att det inte funkar utan men vad gör den?:)

Permalänk
Medlem

@micke_mj:
The conditional operator (?:) returns one of two values depending on the value of a Boolean expression.
https://docs.microsoft.com/en-us/dotnet/csharp/language-refer...

Så i koden ovan så skrivs "Incorrect input format" ut om TryParse inte returnerar true.

Permalänk
Medlem
Skrivet av micke_mj:

Vad har ? för funktion i första koden du skrev?
Ser att det inte funkar utan men vad gör den?:)

Vanligt förekommande i programmering är konstruktionen "Om A så gör x med B annars gör x med C":

if(A) { x(B) } else { x(C) }

Denna konstruktion har även en kortform som kan skrivas:

x(A ? B : C)

Exempel 1:

if(tal >= 0) { outputText = "Talet är positivt"; } else { outputText = "Talet är negativt"; }

kan skrivas

outputText = tal >= 0 ? "Talet är positivt" : "Talet är negativt";

Exempel 2:

public double AbsoluteValue(double value) { if(value > 0) { return value; } else { return value * -1; } }

kan skrivas

public double AbsoluteValue(double value) { return value > 0 ? value : value * -1; }

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem

Enklare uppgift!

Fick en något enklare uppgift där Användaren skall skriva namn på 2 personer sedan skriva ut en kort berättelse om dessa 2.
Löste det Väldigt enkelt enligt nedan. Hur hade ni löst det?

{
Console.WriteLine("Type in the names on two persons!");
Console.Write("Person 1: ");
string person1 = Console.ReadLine();
Console.Write("Person 2: ");
string person2 = Console.ReadLine();

Console.WriteLine("Write a short story about those two perons!");
string story = Console.ReadLine();

Console.WriteLine("\n\tStory about " + person1 + " & " + person2);
Console.WriteLine("\n\t" + story);
Console.ReadLine();

}

Permalänk
Inaktiv
Skrivet av micke_mj:

Fick en något enklare uppgift där Användaren skall skriva namn på 2 personer sedan skriva ut en kort berättelse om dessa 2.
Löste det Väldigt enkelt enligt nedan. Hur hade ni löst det?

Lite mer modulärt

void Main() { var persons = new List<string>(); var personsToRead = 3; for (int i = 0; i < personsToRead; i++) { persons.Add(ReadPerson(i)); } Console.WriteLine($"Story about {string.Join(", ", persons.Take(persons.Count() - 1))} and {persons.Last()}"); Console.WriteLine("Bacon ipsum...."); } public string ReadPerson(int i) { Console.WriteLine($"Person {i}: "); return Console.ReadLine(); }

Tänk på att det du skriver är program, som består av kod, när du pratar om det. Det låter som himla knasigt annars.
"Jag skall skriva en kod som..." -> "Jag skall skriva ett program som"

Permalänk
Medlem
Skrivet av micke_mj:

Fick en något enklare uppgift där Användaren skall skriva namn på 2 personer sedan skriva ut en kort berättelse om dessa 2.
Löste det Väldigt enkelt enligt nedan. Hur hade ni löst det?
...

Jag hade satt in namnen i texten/storyn (antar att det är en av grejerna med uppgiften).

String story = "text" + person1 + "text" + person2 + "text" + person1 + "text";

Skrivs enklare och snyggare som:

String story = String.Format("text {0} text {1} text {0} text", person1, person2);

Man kan även använda detta format (för mer info, googla "composite formatting") direkt i Console.WriteLine:

Console.WriteLine("text {0} text {1} text {0} text", person1, person2);

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem
Skrivet av anon81912:

Lite mer modulärt

void Main() { var persons = new List<string>(); var personsToRead = 3; for (int i = 0; i < personsToRead; i++) { persons.Add(ReadPerson(i)); } Console.WriteLine($"Story about {string.Join(", ", persons.Take(persons.Count() - 1))} and {persons.Last()}"); Console.WriteLine("Bacon ipsum...."); } public string ReadPerson(int i) { Console.WriteLine($"Person {i}: "); return Console.ReadLine(); }

Tänk på att det du skriver är program, som består av kod, när du pratar om det. Det låter som himla knasigt annars.
"Jag skall skriva en kod som..." -> "Jag skall skriva ett program som"

Får följande meddelande "Program does not contain a static 'Main' method suitable for an entry point"! Why?=)

Permalänk
Inaktiv
Skrivet av micke_mj:

Får följande meddelande "Program does not contain a static 'Main' method suitable for an entry point"! Why?=)

Du borde skriva public static void Main.

Jag satte ihop programmet i linqpad och då behöver man inte sånt bjäfs

Permalänk
Medlem

Ny övn =)

Hej, kan någon vänlig själ säga hur man postar koden läslig här?:)

Iaf, jag behöver hjälp med att få in try catch i nedan kod.

Hur får jag den att fungera?

// Deklaration av variabler Random slumpat = new Random(); // skapar ett random objekt int speltal = slumpat.Next(1, 20); // anropar Next metoden för att skapa ett slumptal mellan 1 och 20 // Gräns mellan minsta och största värde saknades bool spela = true; // Variabel för att kontrollera om spelet ska fortsätta köras while (spela) //Tagit bort ! från (spela) { int tal; Console.WriteLine("\n\tGissa på ett tal mellan 1 och 20: "); //int tal = Convert.ToInt32(Console.ReadLine()); Int32.TryParse(Console.ReadLine(), out tal);//försökte med TryParse för att undvika Format Exceptions. if (tal < speltal) try { Console.WriteLine("\tDet inmatade talet " + tal + " är för litet, försök igen."); Console.ReadLine(); } catch (Exception) { Console.WriteLine("DU måste skriva in ett tal mellan 1-20"); } if (tal > speltal) { Console.WriteLine("\tDet inmatade talet " + tal + " är för stort, försök igen.");// + tecken saknades Console.ReadLine(); } if (tal == speltal) // = tecken saknades { Console.WriteLine("\tGrattis, du gissade rätt!"); //Program avslutas utan att berätta svaret Console.ReadLine(); spela = false; }

Permalänk
Medlem

Sätt koden inom code-taggar: [ code ] //kod här [ /code ]

Tänk på att tryParse() returnerar en boolean och om du får en false där så sätter den talet till defaultvärdet, dvs 0. Du får alltså alltid ett värde på talet, även om användaren matar in en bokstav.
Det du typiskt skulle vilja ha är en check om inmatningen är ok eller inte. En if-sats eller switch på tryparse() och sen en koll om talet håller sig inom intervallet

Visa signatur

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.

Permalänk
Medlem

@micke_mj: try/catch ska du använda för att fånga oväntade fel som kan uppstå. Du ska inte använda det som en if/switch!

Så här kan du använda tryparse:

int tal; bool isInputNumber = Int32.TryParse(Console.ReadLine(), out tal); if(isInputNumber){ // du skrev ett tal. 'tal' är integern som parsats från användarens input }else{ // du skrev inget tal. 'tal' är 0, eftersom parsningen misslyckades }

Visa signatur

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.

Permalänk
Medlem

Om du inte använder TryParse() kan du använda try/catch för att hantera den exception som kan komma från Parse():

try{ tal = int32.Parse(Console.ReadLine()); }catch{ Console.WriteLine("Du måste skriva in ett tal!"); }

Du kan alltid kolla vad metoderna du använder returnerar. TryParse() returnerar antingen true eller false och genererar inga exceptions, så den behöver inte hanteras i en try/catch. Parse() gör däremot det.

TryParse() metoden kan du tänka dig såhär:

public int TryParse(string s){ try{ return int32.Parse(s); }catch{ return 0; } }

Visa signatur

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.

Permalänk
Medlem
Skrivet av kundun:

Om du inte använder TryParse() kan du använda try/catch för att hantera den exception som kan komma från Parse():

try{ tal = int32.Parse(Console.ReadLine()); }catch{ Console.WriteLine("Du måste skriva in ett tal!"); }

Du kan alltid kolla vad metoderna du använder returnerar. TryParse() returnerar antingen true eller false och genererar inga exceptions, så den behöver inte hanteras i en try/catch. Parse() gör däremot det.

TryParse() metoden kan du tänka dig såhär:

public int TryParse(string s){ try{ return int32.Parse(s); }catch{ return 0; } }

Tacksam för hjälp men fattar inte var jag lägger in detta i befintligt program/kod.

Permalänk
Medlem

Så här fick ja det till iaf

{ Random slumpat = new Random(); // skapar ett random objekt int speltal = slumpat.Next(1, 20); // Använder Next för att slumpa tal mellan 2 angivna tal bool spela = true; // Variabel för att fortsätta tills rätt siffra skrivits in while (spela) //Tog bort ! <-- { int tal; Console.WriteLine("\n\tGissa på ett tal mellan 1 och 20: "); bool ombokstav = Int32.TryParse(Console.ReadLine(), out tal);//Använder TryParse, om bokstav skrivs in tas det som en nolla if (tal < speltal) { if (ombokstav) { } else { Console.WriteLine("Du måste skriva ett tal"); } } { Console.WriteLine("\tDet inmatade talet " + tal + " är för litet, försök igen."); Console.ReadLine(); } if (tal > speltal) { Console.WriteLine("\tDet inmatade talet " + tal + " är för stort, försök igen.");// + <-- fattades Console.ReadLine(); } if (tal == speltal) // Ett = fattades { Console.WriteLine("\tGrattis, du gissade rätt!"); Console.ReadLine(); // La till ReadLine då programmet avslutades direkt spela = false; } } } // la till } <--

Permalänk
Medlem

Och detta blev pseudokoden

START SÅ LÄNGE Tills användaren gissar rätt tal Skriv ut ” Gissa på ett tal mellan 1-20 OM Användaren skriver ett tal Gissa igen ANNARS Användaren skriver bokstav Informera att tal måste skrivas OM tal är för litet Tal för litet, gissa igen OM tal är för stort Tal för stort, gissa igen SLUT OM rätt tal Rätt gissat

Permalänk
Medlem

Fundera på vad som händer och i vilken ordning.
Du ber användaren om en siffra mellan 1 och 20.
Så det första du bör göra är ju att kolla så det verkligen är en siffra mellan 1 och 20 du får.
Du behöver alltså kolla att dom tre villkoren är sanna innan du går vidare och kollar om gissningen är rätt eller fel. Är det en siffra? Är den över 1? Är den under 20?
Tänk även på hur du döper dina variabler; ombokstav är ju sant om det är ett tal!
Du är på god väg, bra jobbat!

Skickades från m.sweclockers.com

Visa signatur

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.

Permalänk
Medlem

START SÅ LÄNGE Tills användaren gissar rätt tal Skriv ut ” Gissa på ett tal mellan 1-20 OM Användaren skriver ett tal Gissa igen? Här vill man kanske kolla om gissningen var rätt eller fel! ANNARS Användaren skriver bokstav Informera att tal måste skrivas OM tal är för litet Tal för litet, gissa igen OM tal är för stort Tal för stort, gissa igen SLUT OM rätt tal Rätt gissat

Tänk på att du kan nästla OM(if):
If(){
if(){
}
}

Skickades från m.sweclockers.com

Visa signatur

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.

Permalänk
Medlem
Skrivet av kundun:

START SÅ LÄNGE Tills användaren gissar rätt tal Skriv ut ” Gissa på ett tal mellan 1-20 OM Användaren skriver ett tal Gissa igen? Här vill man kanske kolla om gissningen var rätt eller fel! ANNARS Användaren skriver bokstav Informera att tal måste skrivas OM tal är för litet Tal för litet, gissa igen OM tal är för stort Tal för stort, gissa igen SLUT OM rätt tal Rätt gissat

Tänk på att du kan nästla OM(if):
If(){
if(){
}
}

Skickades från m.sweclockers.com

Den funkar inte riktigt klockrent.
Nu blir det så här
Gissa på ett tal
12
Det inmatade talet är för stort, försök igen
11

Gissa på ett tal mellan 1 och 20!

Varför? Sista vill jag att den säger Det inmatade talet är för stort/litet, försök igen.

Permalänk
Medlem

Jo du har lite tankefel i hur den kollar talet.

Kolla igenom flödet:
För varje körning i while ska den ju kolla om det är ett tal mellan 1-20. Om det är så ska den berätta om talet är för stort/litet eller rätt. Om det inte är så ska den säga det och börja om igen.

Sen vill du ju inte kolla om ett tal är mindre än speltalet om den redan gått in i if-satsen där den är större an.
Kolla på if(){}else if(){}

Skickades från m.sweclockers.com

Visa signatur

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.