C# integers uit een array opslaan in een nieuwe array

Pagina: 1
Acties:

Vraag


  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 03-10 17:50
Mijn vraag

Ik ben voor school bezig met een opdracht en een gedeelte daarvan is alle getallen uit een array die kleiner of gelijk zijn aan de gemiddelde waarde opslaan in een nieuwe array. Uiteraard is de opdracht nog een stuk uitgebreider maar in dit stuk loop ik even vast.

Bij dit stukje code geeft Visual Studio een "De index ligt buiten de matrixgrenzen" en hoewel dat normaal relatief eenvoudig is op te lossen lukt het me deze keer niet.

code:
1
2
3
4
5
6
7
8
9
10
// Making a for loop to add the numbers to the array below or equal to avg
            int p = 0;
            for(int i = 0; i <= n.Length-1; i++)
            {
                if (n[i] <= avg)
                {
                    belowAvg[p] = n[i];
                    p++;
                }
            }



Relevante software en hardware die ik gebruik

Microsoft Visual Studio 2017

Wat ik al gevonden of geprobeerd heb

Uiteraard flink gegoogled en op stack overflow rondgekeken maar ik kom er helaas zo niet uit dus vandaar dat ik de tweakers om hulp vraag.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
private void button1_Click(object sender, EventArgs e)
        {
            // The array containing the numbers to be sorted
            int[] n = { 4, 7, 3, 6, 9, 1, 8, 2, 5 };

            // Making an int var to add for calc avg
            int a = 0;
            int avg = 0;

            // For loop to calculate the avg
            for(int i = 0; i < n.Length; i++)
            {
                a += n[i];
            }
            
            // Store average number in variable avg
            avg = a / n.Length;

            // Making an array for numbers below and equal to avg
            int[] belowAvg = { };

            // Making a for loop to add the numbers to the array below or equal to avg
            int p = 0;
            for(int i = 0; i <= n.Length-1; i++)
            {
                if (n[i] <= avg)
                {
                    belowAvg[p] = n[i];
                    p++;
                }
            }

            // Checking if it works? 
            MessageBox.Show(belowAvg[0].ToString() + ", " + belowAvg[1].ToString());
        }

Alle reacties


Acties:
  • +2 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Je belowAvg array heeft nog geen ruimte om de getallen vast te houden.

Je zult hem dus dynamisch van een bepaalde grootte moeten voorzien.

Ask yourself if you are happy and then you cease to be.


Acties:
  • +1 Henk 'm!

  • W1LL3M
  • Registratie: Augustus 2001
  • Laatst online: 06-10 23:16

W1LL3M

⭐⭐⭐⭐⭐

Is er een reden dat je geen Linq gebruikt?
C#:
1
2
3
var n = new[] { 7, 8, 66, 77, 88, 34};
var avg = n.Average();
var result = n.Where(i => i < avg).ToArray();

https://dotnetfiddle.net/13xnE6

  • Merethil
  • Registratie: December 2008
  • Laatst online: 06:21
W1LL3M schreef op woensdag 12 september 2018 @ 22:05:
Is er een reden dat je geen Linq gebruikt?
C#:
1
2
3
var n = new[] { 7, 8, 66, 77, 88, 34};
var avg = n.Average();
var result = n.Where(i => i < avg).ToArray();

https://dotnetfiddle.net/13xnE6
Misschien omdat hij het voor school moet doen en nog geen kennis heeft van Linq? Daarnaast, misschien niet het antwoord direct geven? Dan leer je zo weinig...

Acties:
  • +1 Henk 'm!

  • W1LL3M
  • Registratie: Augustus 2001
  • Laatst online: 06-10 23:16

W1LL3M

⭐⭐⭐⭐⭐

Merethil schreef op woensdag 12 september 2018 @ 22:23:
[...]


Misschien omdat hij het voor school moet doen en nog geen kennis heeft van Linq? Daarnaast, misschien niet het antwoord direct geven? Dan leer je zo weinig...
Of je leert ineens heel veel, bijvoorbeeld dat Linq bestaat en hoe het werkt ;)
Ik denk (hoop) niet dat 3 regels code zijn gehele opdracht zullen oplossen.

Acties:
  • +2 Henk 'm!

  • Gropah
  • Registratie: December 2007
  • Niet online

Gropah

Admin Softe Goederen

Oompa-Loompa 💩

W1LL3M schreef op woensdag 12 september 2018 @ 22:26:
[...]

Of je leert ineens heel veel, bijvoorbeeld dat Linq bestaat en hoe het werkt ;)
Ik denk (hoop) niet dat 3 regels code zijn gehele opdracht zullen oplossen.
Heb totaal geen kennis van C#, maar Is LINQ niet relatief traag tov zelf itereren?

edit: sowieso ben ik wel fan van het eerst allemaal zelf doen, dan krijg je beter door wat er nu eigenlijk gebeurd. Maar als je nog aan het leren programmeren bent vind ik het vrij normaal dat je je eigen for-loopjes gaat schrijven

[ Voor 24% gewijzigd door Gropah op 12-09-2018 22:31 ]


  • Merethil
  • Registratie: December 2008
  • Laatst online: 06:21
W1LL3M schreef op woensdag 12 september 2018 @ 22:26:
[...]

Of je leert ineens heel veel, bijvoorbeeld dat Linq bestaat en hoe het werkt ;)
Ik denk (hoop) niet dat 3 regels code zijn gehele opdracht zullen oplossen.
Vast niet, maar je laat zo iemand totaal niet nadenken over een denkrichting of zelfredzaamheid in een relatief simpel iets. Nu kauw je dit voor en krijgt de persoon een hele nieuwe syntax te zien die dan klakkeloos gekopieerd kan worden en totaal niet weet wat daar precies gebeurt.

Natuurlijk, helpen is goed en zo kan iemand iets leren. Maar je leert het een stuk beter door het zelf te doen, zelf te beredeneren en zelf te ervaren.
Ik vraag me trouwens af of de docent Linq momenteel goed zou keuren als ze hier nog totaal niet mee bezig zijn geweest. (De kennis van de docent daargelaten, mijn docenten in 2012 hadden deze syntax echt nog niet gekend)

Acties:
  • +2 Henk 'm!

  • Sokoo
  • Registratie: Januari 2010
  • Laatst online: 10:40
Gropah schreef op woensdag 12 september 2018 @ 22:29:
[...]


Heb totaal geen kennis van C#, maar Is LINQ niet relatief traag tov zelf itereren?

edit: sowieso ben ik wel fan van het eerst allemaal zelf doen, dan krijg je beter door wat er nu eigenlijk gebeurd. Maar als je nog aan het leren programmeren bent vind ik het vrij normaal dat je je eigen for-loopjes gaat schrijven
Nee, de traagheid is verwaarloosbaar t.o.v. de leesbaarheid van je code.

Kijk hier maar is naar, let wel op dit is uit 2009, met de huidige PC's is dit echt geen probleem meer. Tenzij het hele ingewikkelde LINQ statements worden die mega lang zijn, maar then again maintainability/readability > performance imo.

http://www.schnieds.com/2...for-loop-performance.html

[ Voor 24% gewijzigd door Sokoo op 12-09-2018 22:52 ]


  • W1LL3M
  • Registratie: Augustus 2001
  • Laatst online: 06-10 23:16

W1LL3M

⭐⭐⭐⭐⭐

Gropah schreef op woensdag 12 september 2018 @ 22:29:
[...]


Heb totaal geen kennis van C#, maar Is LINQ niet relatief traag tov zelf itereren?
Het kan trager zijn, maar niet in dit soort simpele situaties. Groot voordeel t.o.v. bovenstaande code zijn leesbaarheid en het voorkomen van bugs (minder complexiteit in eigen code).
Merethil schreef op woensdag 12 september 2018 @ 22:31:
[...]

Vast niet, maar je laat zo iemand totaal niet nadenken over een denkrichting of zelfredzaamheid in een relatief simpel iets. Nu kauw je dit voor en krijgt de persoon een hele nieuwe syntax te zien die dan klakkeloos gekopieerd kan worden en totaal niet weet wat daar precies gebeurt.

Natuurlijk, helpen is goed en zo kan iemand iets leren. Maar je leert het een stuk beter door het zelf te doen, zelf te beredeneren en zelf te ervaren.
Ik vraag me trouwens af of de docent Linq momenteel goed zou keuren als ze hier nog totaal niet mee bezig zijn geweest. (De kennis van de docent daargelaten, mijn docenten in 2012 hadden deze syntax echt nog niet gekend)
Dit is natuurlijk maar een klein deel van zijn opdracht, en ik geef een voorbeeld met 2 (voor mij) vrij basic C# functies. Hopelijk kan deze kennis de rest van de opdracht ook toegepast worden.
Als ik Linq + Average + Where had genoemd had Google de rest gedaan.

Ik ken de spelregels van zijn opdracht niet, daarom vraag ik ook of er een reden is om geen Linq te gebruiken. En als het probleem is dat de docent dit niet kent dan moet hij zelf maar weer gaan bijleren :X

  • Merethil
  • Registratie: December 2008
  • Laatst online: 06:21
W1LL3M schreef op woensdag 12 september 2018 @ 22:54:
[...]

Het kan trager zijn, maar niet in dit soort simpele situaties. Groot voordeel t.o.v. bovenstaande code zijn leesbaarheid en het voorkomen van bugs (minder complexiteit in eigen code).

[...]


Dit is natuurlijk maar een klein deel van zijn opdracht, en ik geef een voorbeeld met 2 (voor mij) vrij basic C# functies. Hopelijk kan deze kennis de rest van de opdracht ook toegepast worden.
Als ik Linq + Average + Where had genoemd had Google de rest gedaan.

Ik ken de spelregels van zijn opdracht niet, daarom vraag ik ook of er een reden is om geen Linq te gebruiken. En als het probleem is dat de docent dit niet kent dan moet hij zelf maar weer gaan bijleren :X
Alleen al dat googlen is iets wat iemand ook moet leren. Maar goed, lekker doen, ik ben het niet eens dat dit een goede manier van mensen iets leren is, maar daar mogen meningen over verschillen ;)

Dat docentenprobleem is helaas volgens mij van alle jaren...

Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Merethil schreef op woensdag 12 september 2018 @ 22:57:
Alleen al dat googlen is iets wat iemand ook moet leren. Maar goed, lekker doen, ik ben het niet eens dat dit een goede manier van mensen iets leren is
En ik ook niet. Hier in de Devschuur® hanteren we dan ook:
Give a man a fish, feed him for a day. Teach a man how to fish, feed him for a lifetime
Gewoon het antwoord neerdumpen (hoe "simpel" het ook (voor jou) is) is dus nadrukkelijk niet de bedoeling hier.
W1LL3M schreef op woensdag 12 september 2018 @ 22:26:
Ik denk (hoop) niet dat 3 regels code zijn gehele opdracht zullen oplossen.
Nou, zo te zien (wijst naar topicstart) wel he? We hebben 't hier niet over een stageopdracht of afstudeerscriptie maar een simpele huiswerkopdracht waarvoor je dus zojuist 100% van de oplossing heb weggegeven. Daarnaast had TS véél meer gehad aan een uitleg waarom zijn/haar huidige gepostte code niet correct is of niet doet wat hij/zij wil.

(Overigens klopt je lambda operator niet in je gepostte code (->), wel in je fiddle (=>)). My bad, de => rendert blijkbaar wat gaar op mijn laptop.
Gropah schreef op woensdag 12 september 2018 @ 22:29:
Heb totaal geen kennis van C#, maar Is LINQ niet relatief traag tov zelf itereren?
Daar is weinig van te zeggen; sowieso is 't in de meeste gevallen verwaarloosbaar (microoptimalisatie) en vele malen leesbaarder maar daarbij is in LINQ behoorlijk wat ge-special-cased waardoor soms dingen zelfs sneller of iig vrij "optimaal" zijn.

[ Voor 58% gewijzigd door RobIII op 13-09-2018 00:25 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 03-10 17:50
W1LL3M schreef op woensdag 12 september 2018 @ 22:05:
Is er een reden dat je geen Linq gebruikt?
C#:
1
2
3
var n = new[] { 7, 8, 66, 77, 88, 34};
var avg = n.Average();
var result = n.Where(i => i < avg).ToArray();

https://dotnetfiddle.net/13xnE6
Nog nooit van gehoord idd. Zal er zeker naar kijken iig. Ik zie hoe jouw oplossing werkt bedankt daarvoor maar heeft iemand ook een hint wat er bij mijn code misgaat?

Acties:
  • +2 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Jasper_S1985 schreef op woensdag 12 september 2018 @ 23:13:
heeft iemand ook een hint wat er bij mijn code misgaat?
Mijn vraag is vooral: heb je zelf al eens met een debugger door je code gestapt en gekeken of alles gaat zoals je dénkt dat 't gaat en doet wat je dénkt wat 't moet doen? Lees anders even Debuggen: Hoe doe ik dat? of Navigate Code with the Visual Studio Debugger. Stap met de debugger, stap voor stap, door de code, inspect de waardes van je variabelen, kijk of ze zijn wat je dénkt dat ze zijn en ga dan na waar 't mis gaat. Dan moet je er met een paar minuutjes wel uit zijn. Alternatief plaats je, op strategische plekken, wat Console.WriteLine(<variabele>); regels waarmee je wat zaken "dumpt" naar de console om zo na te gaan of alles gaat zoals je wil dat 't gaat (maar wen je dit niet aan; leer een debugger gebruiken. Dit is "poor man's debugging").

[ Voor 56% gewijzigd door RobIII op 12-09-2018 23:21 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 03-10 17:50
RobIII schreef op woensdag 12 september 2018 @ 23:15:
[...]

Mijn vraag is vooral: heb je zelf al eens met een debugger door je code gestapt en gekeken of alles gaat zoals je dénkt dat 't gaat en doet wat je dénkt wat 't moet doen? Lees anders even Debuggen: Hoe doe ik dat? of Navigate Code with the Visual Studio Debugger
Ik ga er direct naar kijken, zal laten weten of ik eruit kom

Acties:
  • +1 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Jasper_S1985 schreef op woensdag 12 september 2018 @ 23:13:
[...]


Nog nooit van gehoord idd. Zal er zeker naar kijken iig. Ik zie hoe jouw oplossing werkt bedankt daarvoor maar heeft iemand ook een hint wat er bij mijn code misgaat?
Ja, die hint gaf ik jou in mijn eerste reactie.

Je kan niet zomaar getallen in een array stoppen als daar geen ruimte voor gereserveerd is.

Een array heeft in principe een vaste grootte waar een vast aantal items in passen.

int[] belowAvg = { };

Geeft een array met een grootte van 0. Daar kun je dus niet zomaar iets in zetten.

Als je dit in C zou doen, zou je een buffer overflow krijgen en feitelijk jouw eigen code in memory overschrijven ;) .NET waarschuwt jou netjes dat het er niet in past.

[ Voor 40% gewijzigd door Lethalis op 12-09-2018 23:35 ]

Ask yourself if you are happy and then you cease to be.


  • PageFault
  • Registratie: April 2002
  • Laatst online: 13:02
Het zoi helpen als je wist welke array out of range is en vooral wanneer. Gebruik de debugger om dat uit te vissen.

Acties:
  • +5 Henk 'm!

  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 03-10 17:50
Oke volgens mij ben ik eruit... als ik met een stukje code tel hoeveel nummers er in de array komen en dat vervolgens als
code:
1
int[] belowAvg = new int[count];


ipv

code:
1
int[] belowAvg = { };


lijkt het te gaan werken.
Bedankt!
Pagina: 1