Permalänk
Medlem

Hjälp en nybörjare med C#

Varför funkar inte denna kod?

namespace ConsoleTest { class Program { static void Main(string[] args) { List<byte> resultHolder = new List<byte>(); Console.WriteLine("Welcome to the average testresult calculator!\n"); Console.WriteLine("How many results do you have?"); byte numberOfResults = System.Convert.ToByte(Console.ReadLine()); Console.WriteLine("\nNow write them in one by one.\n"); while (numberOfResults > 0) { byte aResult = System.Convert.ToByte(Console.ReadLine()); resultHolder.Add(aResult); short sum =+ aResult; } Console.WriteLine("\nThe average result was " + sum /resultHolder.Count()); Console.ReadKey(); } } }

Det här är det första programmet jag försöker skriva i C#.

Permalänk
Avstängd

Läst vad kompilatorn säger?

Fel 1:
short sum =+ aResult;
ska ändras till
short sum += aResult;

Fel 2:
Sen måste du läsa på lite om scopade variabler, du kan inte deklarera sum inne i loopen, då försvinner den utanför.

Fel 3:
Loopen tar aldrig slut.. Fixa något slutvillkor!

Här är fungerande kod:

static void Main(string[] args) { List<byte> resultHolder = new List<byte>(); short sum = 0; Console.WriteLine("Welcome to the average testresult calculator!\n"); Console.WriteLine("How many results do you have?"); byte numberOfResults = System.Convert.ToByte(Console.ReadLine()); Console.WriteLine("\nNow write them in one by one.\n"); while (numberOfResults > 0) { byte aResult = System.Convert.ToByte(Console.ReadLine()); resultHolder.Add(aResult); sum += aResult; numberOfResults--; } Console.WriteLine("\nThe average result was " + sum / resultHolder.Count()); Console.ReadKey(); }

Puss och kram

Permalänk
Avstängd

Sen ska du givetvis abstrahera upp mer än så, hantera felaktig input osv.. Men det är nästa steg.

Permalänk
Medlem

Tack, det där med += var ett slarvfel. Dock är jag inte van vid att variabler från loopar inte kan användas utanför loopen då jag kommer från Ruby och Python till C#.

Och loopen tror jag blev bättre som en for-loop

for (; numberOfResults > 0; numberOfResults--)

Permalänk
Avstängd
Skrivet av Murloc:

Tack, det där med += var ett slarvfel. Dock är jag inte van vid att variabler från loopar inte kan användas utanför loopen då jag kommer från Ruby och Python till C#.

Och loopen tror jag blev bättre som en for-loop

for (; numberOfResults > 0; numberOfResults--)

Absolut. Sen är det som vanligt i OO att bara abstrahera på för fullt. Ett första steg är väl att lägga ut en readfunktion som tar hand om giltiga tal. Är inte minnesanvändning jätteviktig hade jag lagrat resultat i en lista av integers (inlästa som bytes) för att använda inbyggda Average() i Linq:

static byte readAByte() { byte result = 0; while (byte.TryParse(Console.ReadLine(), out result) == false) { Console.WriteLine("Please input a positive number"); } return result; } static void Main(string[] args) { var results = new List<int>(); Console.WriteLine("Welcome to the average testresult calculator!"); Console.WriteLine(); Console.WriteLine("How many results do you have?"); byte numberOfResults = readAByte(); Console.WriteLine(); Console.WriteLine("Now write them in one by one."); Console.WriteLine(); for (; numberOfResults > 0; numberOfResults--) { results.Add(readAByte()); } Console.WriteLine(string.Format("The average result was {0}", results.Average())); Console.ReadKey(); }

Som du ser är jag inte förtjust i "\n" och massa + i strängar. Det känns för oabstrakt - kör enbart med string.format() i olika varianter.

Permalänk
Medlem

Vet inte ens vad som menas med abstrahera, är inte direkt en professionell programmerare (än). Vi har precis börjat med OOP i min programmeringskurs på gymnasiet.

En annan som som jag inte förstår är varför det här inte funkar:

Console.WriteLine("\nThe average result was " + System.Convert.ToFloat(sum) / resultHolder.Count());

Istället måste jag använda Double eller Decimal, finns det ingen ToFloat eller? Jag vet ju att det finns en datatyp i C# som heter float som ska vara mindre och spara minne.