Permalänk
Medlem

Problem med array C#

Hej!

Det är så att jag sitter här och försöker få ihop ett C# skript, man ska kunna bestämma hur många tal som ska skrivas samt sen mata in talen och efter det så ska skriptet skriva ut det största, minsta och mellanvärdet av alla talen. Får inte ihop det med min array och jag har kollat runt men förstår inget :S

Här är koden jag har fått ihop än så länge:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication10 { class Program { static void Main(string[] args) { double average = 0d; double summa = 0; int storlek = ReadInt(); int[] resultat; double[] resultat2; double tal = ReadDouble(); resultat = new int[storlek]; resultat2 = new double[(int)tal]; // ProcessArray(resultat2); for (int i = 0; i < resultat.Length; i++) { summa += resultat[i]; } } static void ProcessArray(double[] values, out double average, out double max, out double min) { max = values[0]; for (double i = 1; i < values.Length; i++) { if (max < values[(int)i]) { max = values[(int)i]; } min = values[0]; for (double e = 1; e < values.Length; e++) { if (min > values[(int)e]) { min = values[(int)e]; Console.WriteLine(values.Average()); Console.WriteLine("Största talet är: {0}", max); Console.WriteLine("Minsta talet är: {0}", min); } } } } private static double ReadDouble() { double tal; Console.Write("Ange {0} flyttal"); tal = double.Parse(Console.ReadLine()); while(!double.TryParse(Console.ReadLine(), out tal)) { Console.WriteLine("Fel! Ange ett flyttal!"); } return tal; } private static int ReadInt() { int storlek; Console.Write("Ange storleken på arrayen:"); storlek = int.Parse(Console.ReadLine()); return storlek; } } }

Hjälp!

Visa signatur

Moderkort: ASUS Maximus VIII Hero/Alpha | CPU: Intel i7 6700k 4 GHz | Minne: Kingston HyperX 8GB DDR4 2133MHz x4| Systemdisk: Samsung pro 950 256GB | Lagring: WD Purple 3TB x2 | GPU: Asus Strix GTX 970 DirectCU II | Ljudkort: Asus Essence STXII | Display: Samsung S24A650D x2 | Tangentbord: Qpad MK-85 | Mus: Razer Mamba 4G

Permalänk
Medlem

Din main-metod gör i dagsläget inte mycket alls om man skulle köra programmet. Du är nästan där, det är bara lite omplacering av kodrader som behövs för att lösa det.

Stega igenom koden. Du har alla bitarna de görs bara i fel ordning eller inte alls.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av Leedow:

Din main-metod gör i dagsläget inte mycket alls om man skulle köra programmet. Du är nästan där, det är bara lite omplacering av kodrader som behövs för att lösa det.

Stega igenom koden. Du har alla bitarna de görs bara i fel ordning eller inte alls.

Kan du förklara lite mer tack? Sitter och stirrar på skärmen och fattar fortfarande ingenting :S är riktigt dålig på skript

Visa signatur

Moderkort: ASUS Maximus VIII Hero/Alpha | CPU: Intel i7 6700k 4 GHz | Minne: Kingston HyperX 8GB DDR4 2133MHz x4| Systemdisk: Samsung pro 950 256GB | Lagring: WD Purple 3TB x2 | GPU: Asus Strix GTX 970 DirectCU II | Ljudkort: Asus Essence STXII | Display: Samsung S24A650D x2 | Tangentbord: Qpad MK-85 | Mus: Razer Mamba 4G

Permalänk
Hedersmedlem

Skulle tipsa dig att kanske dela upp problemet lite mer. Gör en metod som tar ut det största talet ur en array, en som tar minsta ur en array och en som kan dela ut medelvärdet. Du har som sagt gjort en del av det här redan.

Permalänk
Medlem

Okej, kollat och ändrat lite men har fortfarande problem :S

Min array växer inte och den tar bara 2 tal oavsett vad och sen så avslutas skriptet utan att ProcessArray metoden används.

Så här ser koden ut nu:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication10 { class Program { static void Main(string[] args) { int storlek = ReadInt(); double[] resultat; resultat = new double[storlek]; for (int i = 0; i < resultat.Length; i++) { resultat[i] += storlek; } double tal = ReadDouble(); resultat = new double[(int)tal]; } static void ProcessArray(double[] values, out double average, out double max, out double min) { max = values[0]; for (double i = 1; i < values.Length; i++) { if (max < values[(int)i]) { max = values[(int)i]; } min = values[0]; for (double e = 1; e < values.Length; e++) { if (min > values[(int)e]) { min = values[(int)e]; } Console.WriteLine("Medelvärdet av de inmatade talen: {0}",values.Average()); Console.WriteLine("Största talet är: {0}", max); Console.WriteLine("Minsta talet är: {0}", min); } } average = 0; min = 0; max = 0; } private static double ReadDouble() { double tal; Console.Write("Ange {0} flyttal: ",ReadInt()); tal = double.Parse(Console.ReadLine()); while(!double.TryParse(Console.ReadLine(), out tal)) { Console.WriteLine("Fel! Ange ett flyttal!"); } return tal; } private static int ReadInt() { int storlek; Console.Write("Ange storleken på arrayen:"); storlek = int.Parse(Console.ReadLine()); return storlek; } } }

Visa signatur

Moderkort: ASUS Maximus VIII Hero/Alpha | CPU: Intel i7 6700k 4 GHz | Minne: Kingston HyperX 8GB DDR4 2133MHz x4| Systemdisk: Samsung pro 950 256GB | Lagring: WD Purple 3TB x2 | GPU: Asus Strix GTX 970 DirectCU II | Ljudkort: Asus Essence STXII | Display: Samsung S24A650D x2 | Tangentbord: Qpad MK-85 | Mus: Razer Mamba 4G

Permalänk
Medlem
Skrivet av Delapsus:

Okej, kollat och ändrat lite men har fortfarande problem :S

Min array växer inte och den tar bara 2 tal oavsett vad och sen så avslutas skriptet utan att ProcessArray metoden används.

Du värkar ha rejält svårt med att se flödet i ditt program så ska gå igenom det för dig. Ett tips i framtiden kan vara att skriva ner Pseudocode http://en.wikipedia.org/wiki/Pseudocode på ett papper om du har fortsatta problem med detta.

#1 Du skapar bara en tom array av typen double som du själv väljer storlek på.
T.ex. 5. Då skapas en array med 5 st element { 0.0, 0.0, 0.0, 0.0, 0.0 } Dvs 5 st doubles. en Double's default värde är 0.0.

#2. Sedan går du igenom arrayen och lägger till numret på hur stor arrayen var. Tex. matade du in 5 så får du nu en array som innehåller { 5.0, 5.0, 5.0, 5.0, 5.0 }

#3 Sedan läser du in ett double tal. Metoden där är också lite knas. Titta på denna rad Console.Write("Ange {0} flyttal: ",ReadInt());
Låt oss säga att du fixar denna metod lite och sedan läser en en double 5.0

#4 Sedan förstör du din resultat array och återkspar en tom array igen med resultat = new double[(int)tal];
T.ex. läste du in en double med 5 som åvan så är nu din resultat array { 0.0, 0.0, 0.0, 0.0, 0.0 }

#5 Programmet avslutas

#6 Du kallar aldrig på ProcessArray så självklart används den inte.

#6 ProcessArray gör mycket konstiga saker. t.ex. när metoden är så got som slut sätter du alla värden till 0 t.ex. gå igenom den, kanske till och med skriva om den helt.

Visa signatur

Speldator: i7-8700k, 32GB DDR4, RTX2080
Server 1: SB 2500k, MZI -P67GD55, 32GB DDR3, Corsair MX 240GB SSD
Surface Pro 2017, Konsoler: Typ alla, Oculus Rift

Permalänk
Medlem
Skrivet av Delapsus:

Kan du förklara lite mer tack? Sitter och stirrar på skärmen och fattar fortfarande ingenting :S är riktigt dålig på skript

Det du hittills är gjort är ett steg i rätt riktning.

static void Main(string[] args) { int storlek = ReadInt(); double[] resultat; resultat = new double[storlek]; for (int i = 0; i < resultat.Length; i++) { resultat[i] += storlek; } double tal = ReadDouble(); resultat = new double[(int)tal]; }

Vad som sker i din kod(ovanför):
1. Hämtar ett heltal med ReadInt() och stoppar in det i variabeln "storlek"
2. Definierar en array av typen double som heter "resultat"
3. Initierar "resultat" med en ny array av typen double som har antalet "storlek"
4. Loopar igenom hela doublearrayen och fyller den med heltalet "storlek" ???
5. Efter loopen hämtas ett double-tal från ReadDouble() och stoppas in i variabeln "tal" ???
6. "resultat" definieras igen och initieras till antalet "tal" ???

Som du ser har jag svårt att förstå varför du vill göra punkt 4-6.
Gör istället detta:

4. Loopa igenom hela doublearrayen
4a. För varje loop så ska du tilldela "resultat[i]" med data från ReadDouble()
5. Efter loopen så kallar du på ProcessArray() och skickar med "resultat".

"out"-parametrarna för ProcessArray är helt meningslösa om du inte använder dessa utanför metoden. Ta bort dessa eller definiera dessa lokalt i metoden istället. Som jag ser det så använder du bara dessa lokalt i metoden dessutom så nollställer du dessa när metoden är slut vilket gör "out"-parametern praktiskt taget oanvändbar (eftersom värdet som kommer ut är alltid 0).

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Kan med stor glädje nu berätta att jag har lyckats med skriptet ^^

Här kan ni se hur koden blev sen

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication10 { class Program { static void Main(string[] args) { int storlek = ReadInt(); double[] resultat; resultat = new double[storlek]; Console.WriteLine("Ange {0} flyttal:", storlek); for (int i = 0; i < resultat.Length; i++) { resultat[i] += ReadDouble(); } double average = 0; double min = 0; double max = 0; ProcessArray(resultat, out average, out min, out max); } static void ProcessArray(double[] values,out double average, out double min, out double max) { average = 0; min = 0; max = values[0]; for (double i = 1; i < values.Length; i++) { if (max < values[(int)i]) { max = values[(int)i]; } min = values[0]; for (double e = 1; e < values.Length; e++) { if (min > values[(int)e]) { min = values[(int)e]; } } } Console.WriteLine("Medelvärdet av de inmatade talen: {0}", values.Average()); Console.WriteLine("Största talet är: {0}", max); Console.WriteLine("Minsta talet är: {0}", min); } private static double ReadDouble() { while (true) { double tal; try { Console.Write(""); tal = double.Parse(Console.ReadLine()); return tal; } catch (Exception) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Du skrev inte ett flyttal!"); Console.ResetColor(); } } } private static int ReadInt() { while (true) { int storlek; try { Console.Write("Ange storleken på arrayen:"); storlek = int.Parse(Console.ReadLine()); return storlek; } catch (Exception) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Du angav inte ett heltal!"); Console.ResetColor(); } } } } }

Visa signatur

Moderkort: ASUS Maximus VIII Hero/Alpha | CPU: Intel i7 6700k 4 GHz | Minne: Kingston HyperX 8GB DDR4 2133MHz x4| Systemdisk: Samsung pro 950 256GB | Lagring: WD Purple 3TB x2 | GPU: Asus Strix GTX 970 DirectCU II | Ljudkort: Asus Essence STXII | Display: Samsung S24A650D x2 | Tangentbord: Qpad MK-85 | Mus: Razer Mamba 4G