Eerste getal weghalen (C#)

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste allemaal,

voor mijn studie ben ik bezig met opdrachten in C#, echter loop ik tegen een probleem aan.

Ik moet vanuit een array alle getallen bij elkaar optellen, maar ik mag het EERSTE even getal niet meetellen.

Het optellen van alle getallen is uiteraard geen probleem, en in principe lukt het vinden van het eerste even getal (volgens mij) ook, alleen wanneer ik deze van het gehele getal af wil trekken krijg ik een error terug.
Misschien dat iemand er even met een frisse blik naar zou willen kijken _/-\o_

Dit is de vraagstelling + mijn stuk code:

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
        //Sum all the elements in an array up to but not including the first even number. 
        //(Write your unit tests. What about the case when there is no even number?)
        [Test]
        public void TestExercise5()
        {
            Programmeren2Tests.Chapter11Test.TestExercise5(Exercise5);
        }

        public int Exercise5(int[] xs)
        {
            int count = 0;


                foreach (var x in xs)
            {

                for (int i = 0; i < xs.Length; i++)
                {
                    if (xs[i] % 2 == 0)
                    {
                        return i;

                    }


                if (x != 0)
                {
                    count = count + x - i;
                }
            }
            return count;

}
        }


Ik hoop dat jullie mij hierbij kunnen helpen.

Groetjes

Beste antwoord (via Verwijderd op 29-01-2018 16:53)


  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 21:52

Rannasha

Does not compute.

Je kunt de code het beste binnen [ code ] tags plaatsen, dat bevordert de leesbaarheid. Bijvoorbeeld:

C#:
1
foo.Bar("Hello World!");


Specifiek over jouw code-voorbeeld, je hebt een dubbele lus. Eerst loop je middels de foreach() lus over alle x in xs. En vervolgens doe je binnen die lus hetzelfde maar dan met de for() lus. Zet in Visual Studio eens een breakpoint (F9) op de eerste regel van het programma en loop vervolgens stap voor stap (F11) door het programma heen. Bij iedere stap kun je kijken wat er wordt uitgevoerd en welke waarde iedere variabele heeft.

Je kunt ook een andere aanpak overwegen:

Hou in een aparte variabele bij of je al een even getal tegen bent gekomen. Zolang deze variabele aangeeft dat je nog geen even getal hebt gehad, controleer je bij ieder getal of het even is. Is het even en ben je nog niet eerder een even getal tegen gekomen, sla het dan over en update de eerdergenoemde variabele.

edit:

Om verder te gaan met je originele aanpak, het loont vaak om de code op te delen in verschillende functies met elk een eigen taak. Zo kun je iedere functie apart ontwikkelen en testen en loop je minder risico dat dingen door elkaar heen gaan lopen.

Bijvoorbeeld:
C#:
1
2
3
4
5
6
7
8
9
int FindFirstEvenNumber(int[] numbers)
{
    // Code om het eerste even getal te vinden
}

int ArraySum(int[] numbers)
{
    // Code om de som van de getallen te berekenen
}

[ Voor 89% gewijzigd door Rannasha op 29-01-2018 16:35 ]

|| Vierkant voor Wiskunde ||

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 21:52

Rannasha

Does not compute.

Je kunt de code het beste binnen [ code ] tags plaatsen, dat bevordert de leesbaarheid. Bijvoorbeeld:

C#:
1
foo.Bar("Hello World!");


Specifiek over jouw code-voorbeeld, je hebt een dubbele lus. Eerst loop je middels de foreach() lus over alle x in xs. En vervolgens doe je binnen die lus hetzelfde maar dan met de for() lus. Zet in Visual Studio eens een breakpoint (F9) op de eerste regel van het programma en loop vervolgens stap voor stap (F11) door het programma heen. Bij iedere stap kun je kijken wat er wordt uitgevoerd en welke waarde iedere variabele heeft.

Je kunt ook een andere aanpak overwegen:

Hou in een aparte variabele bij of je al een even getal tegen bent gekomen. Zolang deze variabele aangeeft dat je nog geen even getal hebt gehad, controleer je bij ieder getal of het even is. Is het even en ben je nog niet eerder een even getal tegen gekomen, sla het dan over en update de eerdergenoemde variabele.

edit:

Om verder te gaan met je originele aanpak, het loont vaak om de code op te delen in verschillende functies met elk een eigen taak. Zo kun je iedere functie apart ontwikkelen en testen en loop je minder risico dat dingen door elkaar heen gaan lopen.

Bijvoorbeeld:
C#:
1
2
3
4
5
6
7
8
9
int FindFirstEvenNumber(int[] numbers)
{
    // Code om het eerste even getal te vinden
}

int ArraySum(int[] numbers)
{
    // Code om de som van de getallen te berekenen
}

[ Voor 89% gewijzigd door Rannasha op 29-01-2018 16:35 ]

|| Vierkant voor Wiskunde ||


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Verwijderd schreef op maandag 29 januari 2018 @ 16:06:
Beste allemaal,

voor mijn studie ben ik bezig met opdrachten in C#, echter loop ik tegen een probleem aan.

Ik moet vanuit een array alle getallen bij elkaar optellen, maar ik mag het EERSTE even getal niet meetellen.

Het optellen van alle getallen is uiteraard geen probleem, en in principe lukt het vinden van het eerste even getal (volgens mij) ook, alleen wanneer ik deze van het gehele getal af wil trekken krijg ik een error terug.
Misschien dat iemand er even met een frisse blik naar zou willen kijken _/-\o_

Dit is de vraagstelling + mijn stuk code:


[...]


Ik hoop dat jullie mij hierbij kunnen helpen.

Groetjes
Jouw opdracht komt niet overeen met het commentaar. Je zegt dat je het eerste even getal niet mag meerekenen. Maar het commentaar spreekt over de getallen tot het eerste even getal, en alles daarna mag niet meegeteld worden. Da’s niet hetzelfde.

Acties:
  • 0 Henk 'm!

  • Stoelpoot
  • Registratie: September 2012
  • Niet online
Dit lijkt een schoolopdracht, en in principe geven we op t.net niet 1 op 1 het antwoord voor een schoolopdracht. Daarom houd ik het voor nu bij wat guidance over een mogelijke aanpak.

2 problemen. Het eerste: Ik mis je error. Met 'krijg ik een error terug' kunnen we vrij weinig helpen.

Het tweede (misschien ook een hint waar je naar moet kijken):
en in principe lukt het vinden van het eerste even getal (volgens mij) ook
Vanwege je 'geloof ik' krijg ik direct al het idee dat hier het probleem zit. Het beste plan van aanpak is wat mij betreft dus eerst uitwerken hoe je het eerste even getal vind, en dan het optellen en aftrekken uitwerken.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dat is geen voorbeeld meer, dat is 't (zo goed als) compleet voorgekauwd-en-wel de oplossing aanreiken ;)
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.

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


Acties:
  • 0 Henk 'm!

  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 21:52

Rannasha

Does not compute.

RobIII schreef op maandag 29 januari 2018 @ 16:33:
[...]

Dat is geen voorbeeld meer, dat is 't (zo goed als) compleet voorgekauwd-en-wel de oplossing aanreiken ;)

[...]
True. Heb even de bodies van de functies vervangen door een enkele regel commentaar over de gewenste invulling :)

|| Vierkant voor Wiskunde ||


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Excuses voor het niet gebruiken van code tags in eerste instantie. Ik was ook niet op zoek naar het exacte antwoord alleen een duw in de goede richting, uiteindelijk wist ik het aan de hand van de gegeven informatie hier op te lossen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        public int Exercise5(int[] xs)
        {
            int count = 0;
            
                foreach (int x in xs)
                {
                    if (x % 2 == 0)
                    {
                        return count;
                    }
               
                else
                {
                    count = count + x;
                }

                }
            return count;

        }


Mijn dank is groot ;)

Acties:
  • +1 Henk 'm!

  • erik23
  • Registratie: April 2009
  • Laatst online: 15-09 21:56
Verwijderd schreef op maandag 29 januari 2018 @ 16:55:
Excuses voor het niet gebruiken van code tags in eerste instantie. Ik was ook niet op zoek naar het exacte antwoord alleen een duw in de goede richting, uiteindelijk wist ik het aan de hand van de gegeven informatie hier op te lossen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        public int Exercise5(int[] xs)
        {
            int count = 0;
            
                foreach (int x in xs)
                {
                    if (x % 2 == 0)
                    {
                        return count;
                    }
               
                else
                {
                    count = count + x;
                }

                }
            return count;

        }


Mijn dank is groot ;)
Weet je zeker dat dit klopt? Dit is namelijk niet het doel dat je aangaf:
Verwijderd schreef op maandag 29 januari 2018 @ 16:06:
Ik moet vanuit een array alle getallen bij elkaar optellen, maar ik mag het EERSTE even getal niet meetellen.
Nu stop je met tellen zodra je een even getal tegenkomt.

Acties:
  • +1 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 23:21
@erik23 het klopt nu iig wel met het commentaar dat bij en zijn testfunctie staat (zoals al aangegeven was)

Acties:
  • 0 Henk 'm!

  • ThoNohT
  • Registratie: September 2006
  • Laatst online: 17-09 11:03
De code die je hier als laatste postte lijkt inderdaad te werken. Niks mis mee dus (alhoewel de indentation wat verwarrend is).

Deze manier van programmeren is ook zeker goed om te doen, en om te leren algoritmisch te denken, maar toch wil ik je even wijzen op een van de features van C#, namelijk Linq. Hiermee is de hele opdracht in een enkele regel, goed leesbaar op te schrijven. Het loont zeker om hier ook wat ervaring mee te krijgen.

Aangezien je toch al een correct antwoord hebt zal ik mijn versie maar gewoon geven, het is dan aan jou om uit te zoeken waarom en hoe dit werkt, mocht je hier meer over willen leren.
C#:
1
return xs.TakeWhile(x => x % 2 != 0).Sum();

[ Voor 1% gewijzigd door ThoNohT op 01-02-2018 12:09 . Reden: Nog korter na review van RobIII ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ThoNohT schreef op donderdag 1 februari 2018 @ 10:05:
C#:
1
return xs.AsEnumerable().TakeWhile(x => x % 2 != 0).Sum();
Vanwaar de AsEnumerable? xs is al een int array en is dus al enumerable.

[ Voor 10% gewijzigd door RobIII op 01-02-2018 10:43 ]

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


Acties:
  • 0 Henk 'm!

  • ThoNohT
  • Registratie: September 2006
  • Laatst online: 17-09 11:03
Dat is waar inderdaad. Het is door die aanroep wellicht wel iets duidelijker dat de Linq operaties primair op IEnumerable zijn gedefinieerd, en niet iets array specifieks zijn, maar het is geheel niet nodig.

Acties:
  • 0 Henk 'm!

  • RobLemmens
  • Registratie: Juni 2003
  • Laatst online: 16-09 14:28
ThoNohT schreef op donderdag 1 februari 2018 @ 12:14:
Dat is waar inderdaad. Het is door die aanroep wellicht wel iets duidelijker dat de Linq operaties primair op IEnumerable zijn gedefinieerd, en niet iets array specifieks zijn, maar het is geheel niet nodig.
Je voorbeeld klopt toch niet? Takewhile pakt alle elementen tot de conditie true is. Dus tot het eerste even cijfer. Dat is niet wat er gevraagd werd: som minus eerste even getal.

Acties:
  • 0 Henk 'm!

  • ThoNohT
  • Registratie: September 2006
  • Laatst online: 17-09 11:03
RobLemmens schreef op donderdag 1 februari 2018 @ 13:48:
[...]
Je voorbeeld klopt toch niet? Takewhile pakt alle elementen tot de conditie true is. Dus tot het eerste even cijfer. Dat is niet wat er gevraagd werd: som minus eerste even getal.
Dat is wat de titel en zijn inleiding vraagt. Maar als je naar het commentaar boven de eerste test kijkt, en zijn uiteindelijke implementatie, dan is mijn voorbeeld exact waar hij naar op zoek was.

C#:
1
2
        //Sum all the elements in an array up to but not including the first even number. 
        //(Write your unit tests. What about the case when there is no even number?)

Acties:
  • 0 Henk 'm!

  • RobLemmens
  • Registratie: Juni 2003
  • Laatst online: 16-09 14:28
Oei excuus
Pagina: 1