mboost-dp1

Find Data i Array i C#


Gå til bund
Gravatar #1 - Stewart
5. jan. 2009 21:51
Jeg er meget ny til C#, vi er næsten først lige gået i gang med det i skolen.

anyways, vi har lavet en windows console app. hvor vi indtaster hvor mange mm regn der falder på nogle dage.
Vi skal også vise gennemsnittet, max og min regn der faldt.

Indtil videre er der ingen problemer, det der er problemet er ved max/min regn. Jeg vil gerne have så jeg kan sige at f.eks. dag 4, dag 7 var der der faldt max regn.

Håber det er forståelig.

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

namespace Regnvejr
{
class Program
{
static void Main(string[] args)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Hvor mange dage vil du indtaste nedbør over?");
int dage = Convert.ToInt16(Console.ReadLine());

double[] nedboer = new double[dage];

for (int i = 0; i < nedboer.Length; i++)
{
Console.WriteLine("Indtast nedbør for dag " + (i + 1));
nedboer[i] = Convert.ToDouble(Console.ReadLine());
}



Menu();

ConsoleKeyInfo keyinfo = new ConsoleKeyInfo();
double sum = 0;

do
{
keyinfo = Console.ReadKey(true);
Console.ForegroundColor = ConsoleColor.White;
switch (keyinfo.KeyChar)
{
case '1':
sum = 0;
for (int i = 0; i < nedboer.Length; i++)
{
sum += nedboer[i];
Console.WriteLine("Dag {0} = {1} mm", i + 1, nedboer[i]);
}
Console.ReadKey();
break;
case '2':
sum = 0;
for (int i = 0; i < nedboer.Length; i++)
{
sum += nedboer[i];
}
Console.WriteLine("Ugens gennemsnitlige nedbør er: {0} mm", sum / nedboer.Length);
Console.ReadKey();
break;
case '3':
Console.WriteLine("Max. nedbør på de " + nedboer.Length + " dage var " + nedboer.Max() + " mm");
Console.ReadKey();
break;
case '4':
Console.WriteLine("Min. nedbør på de " + nedboer.Length + " dage var " + nedboer.Min() + " mm");
Console.ReadKey();
break;

}
Menu();
}
while (keyinfo.KeyChar != 'x');
}

public static void Menu()
{
//Console.BackgroundColor = ConsoleColor.White;
Console.ForegroundColor = ConsoleColor.Green;
Console.Clear();
Console.WriteLine("|------------------------|");
Console.WriteLine(" Du kan vælge følgende:");
Console.WriteLine(" 1 Vis Skema");
Console.WriteLine(" 2 Vis Gennemsnits nedbør");
Console.WriteLine(" 3 Vis Max nedbør");
Console.WriteLine(" 4 Vis Min nedbør");
Console.WriteLine(" x Afslut");
Console.WriteLine("|------------------------|");

}
}
}
Gravatar #2 - Windcape
5. jan. 2009 22:07
Nu vil jeg ikke skrive koden for dig, men her er hvad du bør kigge på.

Dictionary<dag, nedbør>

Dictionary<int,int> rain = new Dictionary<int,int>();

Derudover bør du parse dit nedbør til int eller double (i så fald, ændre typen af nedbør til double).

Og derudover bør du øve dig på at kode med max 80 char længde på dine linjer, det er god kodestandard!
Gravatar #3 - Windcape
5. jan. 2009 22:12
Eller lidt mere teknisk


enum WeekDay
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}

Dictionary<WeekDay,int> rain = new Dictionary<WeekDay,int>();

// og så kan værdier sættes sådan her:

raid.add(WeekDay.Monday, 4);
Gravatar #4 - Stewart
6. jan. 2009 07:12
hmm... det vil jeg da lige kigge på her på et tidspunkt :)

når jeg lige får tid..

men jeg takker da indtil videre.
Gravatar #5 - Jonasee
6. jan. 2009 07:19
Windcape (3) skrev:
Eller lidt mere teknisk


enum WeekDay
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}

Dictionary<WeekDay,int> rain = new Dictionary<WeekDay,int>();

// og så kan værdier sættes sådan her:

raid.add(WeekDay.Monday, 4);


Der bør nok også tages højde for at det kan ske over flere uger, så ham bør have dato/uge med.


enum WeekDay
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}

Dictionary<WeekDay,week,int> rain = new Dictionary<WeekDay,week,int>();


// så du indsætter sådan

Dictionary<WeekDay,int,int> rain = new Dictionary<WeekDay,int,int>();

raid.add(WeekDay.Monday,2,4);

Gravatar #6 - Stewart
6. jan. 2009 08:29
Jeg har bare brugt en lidt mere simpel metode (efter min mening)
Da jeg kun skal have et dag nummer:

foreach (int x in nedboer)
{
y++;
if (x == val)
{
found = true;
if (found)
Console.WriteLine("Dag " + y);
else
Console.WriteLine("ERROR");
}
}
Gravatar #7 - arne_v
6. jan. 2009 08:49
#5

En Dictionary med 3 typer ??
Gravatar #8 - arne_v
6. jan. 2009 08:51
#2

Med en key der er fortløbende int, så er List nok bedre end Dictionary.

Gravatar #9 - Jonasee
6. jan. 2009 08:52
#7

har aldrig brugt Dictionary, så ved ikke om man kan brug 3 type, men han bør have noget til at indekere hvor i året han er.
Gravatar #10 - Windcape
6. jan. 2009 10:27
Stewart (6) skrev:
Jeg har bare brugt en lidt mere simpel metode (efter min mening)
Da jeg kun skal have et dag nummer:
Pointen med den anden kode var jo at du kunne lave noget ala.

rain[WeekDay.Monday] eller rain[0] istedet for at skulle bruge en løkke. Det er dumt at itererer over alle elementer når du netop har en list med et index.

Selvom med en regular List<T> kan du gøre det.



Jonasee (9) skrev:
#7

har aldrig brugt Dictionary, så ved ikke om man kan brug 3 type, men han bør have noget til at indekere hvor i året han er.
Nej, det kan man ikke, Dictionary er jo bare et typisk hashmap, med key=>value indexing.

Hvis du skal have måneder med, så ville det være meget smartere at benytte noget ala:

Dictionary<DateTime,int>

Hvor DateTime så represent en dato.

Ellers skal du ud i noget ala.

List<List<int,int>,int> altså List<List<månede,dag>,nedbør>

Nestede lists er bare så grimme, og svære at gennemskue.
Gravatar #11 - Windcape
6. jan. 2009 10:29
arne_v (8) skrev:
#2

Med en key der er fortløbende int, så er List nok bedre end Dictionary.
Det er nok rigtigt, det er bare lidt mere af vane at jeg benytter Dictionary ligeså snart det er en fixed key, typisk fordi jeg til sådanne løsninger sjældent ville have en integer key.

Og i så fald, ville benytte et alm. fixed size array istedet.
Gravatar #12 - Benjamin Krogh
7. jan. 2009 11:19
Indtil videre er der ingen problemer, det der er problemet
Proof by contradiction!

Jeg vil gerne have så jeg kan sige at f.eks. dag 4, dag 7 var der der faldt max regn.


Console.WriteLine("dag 4, dag 7 var der der faldt max regn.");

Burde løse dit problem. Det er selvfølgelig helt okay at du ikke kendte til at Console.WriteLine kunne bruges på den måde.

Håber det er forståelig.
Jaja, ingen problemer der dude, det er altid rart at være behjælpelig med andres problemer :)
Gravatar #13 - arne_v
10. jan. 2009 22:54
#9 og 10

Jeg synes nu ikke at List<List<List<int>>> er så slemt.

Indexeringen er rimelig læsbar:

mylist[year][week][weekday]

Alternativet er at lave en class eller struct med 3 int felter og så bruge Dictionary<MyDay,int>.
Gravatar #14 - arne_v
10. jan. 2009 22:56
#flere

Med hensyn til enum WeekDay så eksisterer der faktisk en System.DayOfWeek sommåske kunne genbruges (selvom den starter med søndag).
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login