Operators met en zonder spatie gebruiken in c#

Pagina: 1
Acties:
  • 1.278 views

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik maak een programma waarin je een bedrag kunt uitrekenen. En haal er een resultaat uit nu het werkt als ik operator 1 + 1 uitvoer, maar niet zonder spaties als 1+1 uitvoer. Nu wil ik dat het in beide gevallen werkt. Kan iemand me hiermee helpen? Aangezien ik niet weet of dat ook mogelijk is in me code.

de spatie word aangeroepen met dit
code:
1
private char[] SPACE = new char[] { ' ' };


Ik wil daarom dat het in beide gevallen met of zonder ruimte werkt
Zal iemand me kunnen helpen?

Dit is mijn 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
    private char[] SPACE = new char[] { ' ' };
    private void GetAnswer(string clipboardText)
    {
        //Loop through all questions and answers
        foreach (question q in questionList)
        {
            //If we have found an answer that is exactly the same show an Notification

            //Startwith zoekt naar alle vragen die matchen vanaf het begin van de zin en Endwith alle vragen die matchen vanaf het eind van de zin//
            if (q._question.StartsWith(clipboardText) || q._question.EndsWith(clipboardText))
            {
                ShowNotification(q._question, q._answer);
                break;
            }
        }
        var parts = clipboardText.Split(SPACE);
        var isValid = true;
        Double a, b;

        // Make sure it's format A # B
        if (parts.Length != 3)
            return;

        // Parse first number
        isValid = Double.TryParse(parts[0], out a);
        if (!isValid)
            return;

        var validOperators = new char[] { '+', '-', ':', 'x' };

        // Parse operator
        if (parts[1].Length != 1)
            return;
        var op = parts[1][0];
        if (!validOperators.Contains(op))
            return;

        // Parse 2nd number
        isValid = Double.TryParse(parts[2], out b);
        if (!isValid)
            return;

        // Now calculate the answer
        string answer = null;
        switch (op)
        {
            case '+':
                answer = (a + b).ToString();
                break;
            case '-':
                answer = (a - b).ToString();
                break;
            case ':':
                if (b == 0)
                    answer = "NaN";
                else
                    answer = (a / b).ToString();
                break;
            case 'x':
                answer = (a * b).ToString();
                break;
            default:
                throw new InvalidOperationException();
        }

        // Show the answer
        ShowNotification(clipboardText, answer);
    }

[ Voor 108% gewijzigd door Verwijderd op 09-05-2019 10:07 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • Stoelpoot
  • Registratie: September 2012
  • Niet online
Dat is best mogelijk. In je eerste regel gebruik je "var parts = clipboardText.Split(SPACE);" Alles wat je daarna gebruikt werkt al o.b.v. de losse waardes, dus je code werkt in principe. Hetgeen wat je wilt aanpassen is dat je a.d.h.v. je invoer op dezelfe output moet komen, met of zonder spaties.

Ga om te beginnen eens na hoe je dat zou doen als je het uit je hoofd zou kunnen uitvoeren, zonder computer er bij. Daarvandaan kan je die stappen omzetten in stappen die een computer kan uitvoeren.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@Stoelpoot ik dacht aan dit erbij aan te maken
code:
1
private char[] NOSPACE = new char[] { ''};


En dan in me variable er achter te zetten ,NOSPACE maar dat werkt niet.
code:
1
 var parts = clipboardText.Split(SPACE, NOSPACE);


Iemand een mogelijke oplossing? Aangezien ik wil dat het met en zonder spatie werkt

[ Voor 8% gewijzigd door Verwijderd op 09-05-2019 09:42 ]


Acties:
  • 0 Henk 'm!

  • ThomasG
  • Registratie: Juni 2006
  • Nu online
Er zijn twee oplossingen voor het probleem. De netste oplossing is het gebruik maken van String.ToCharArray in plaats van splitten op een spatie. Maar als ik de rest van de code zie gaat dat problemen geven met getallen hoger dan 9 (omdat 15+3 dan bijvoorbeeld char[] {'1', '5', '+', '3'} wordt. De code wordt daardoor vele malen complexer.

De makkelijkste optie om de bestaande code werkend te krijgen is de string vooraf te bewerken. Zo zou je alle +, -, : en x in de string kunnen vervangen door varianten met een spatie eromheen, en vervolgens alle dubbele spaties vervangen door een enkele. Zodat 15+3 en
15  +     3
worden bewerkt naar 15 + 3 voordat het gesplit wordt op spaties.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@Thomas Zal je daarvan een voorbeeldje kunnen laten zien hoe je dat moet doen?

Acties:
  • 0 Henk 'm!

  • Stoelpoot
  • Registratie: September 2012
  • Niet online
Verwijderd schreef op donderdag 9 mei 2019 @ 09:42:
@Stoelpoot ik dacht aan dit erbij aan te maken
code:
1
private char[] NOSPACE = new char[] { ''};


En dan in me variable er achter te zetten ,NOSPACE maar dat werkt niet.
code:
1
 var parts = clipboardText.Split(SPACE, NOSPACE);


Iemand een mogelijke oplossing? Aangezien ik wil dat het met en zonder spatie werkt
Er zijn twee redenen waarom dat niet werkt:

1. Jouw NOSPACE en SPACE zijn arrays. Een array is een lijst van meerdere karakters. String.Split accepteert standaard 1 array aan karakters om op te splitsen. Die kan je dus samenvoegen als 1 array met meerdere elementen.

2. '' is geen karakter om op te splitsen. Het splitsen moet echt op een teken, niet op de absentie van een teken. Daarnaast zou je met een split zoals deze jezelf ook limiteren tot getallen tot en met 9, want 10 bestaan al uit twee karakters (1 en 0). Dus opnieuw, laat de code even achterwege en werk eerst uit hoe je het handmatig zou uitvoeren. Als je dat volledig hebt, kan je vanaf die werkwijze beredeneren wat je code zou moeten doen. Maar als je nog niet precies weet welke werkwijze je kan gebruiken, kan je dat ook niet uitwerken in code.

Acties:
  • 0 Henk 'm!

  • Sandor_Clegane
  • Registratie: Januari 2012
  • Niet online

Sandor_Clegane

Fancy plans and pants to match

Ik zou splitten op de operators en removeemptyentries aanzetten. Dit is redelijk foolproof met je huidige code. Je zou dit kunnen doen met een switch statement of pattern matching.

Een andere manier is om te loopen over alle characters in de string.

Less alienation, more cooperation.


Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Dit is eigenlijk wel een interessante oefening. Het lijkt hier wel verleidelijk om een regular expression te gebruiken, ofwel char per char te evalueren tot je een operator tegenkomt.
Ik zou splitten op de operators
Probleem is dat je dan je operators kwijtbent :p
*edit* Tenzij je split op 1 operator tegelijk, in de volgorde van de bewerkingen alles split, en alle gesplitte waarden samenvoegt volgens de operators die je gebruikt hebt. Dit lijkt nog een elegante oplossing.

[ Voor 49% gewijzigd door boe2 op 09-05-2019 09:55 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@Stoelpoot @ThomasG Zal iemand me dan een voorbeeld code kunnen laten zien hoe ik het moet aanpakken het liefst zal ik het met splitten willen doen

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Op regel 4 split je op spaties; je bent dus 100% afhankelijk van spaties. Dat betekent dat je daar al iets moet aanpassen. Wat jij moet doen is zoeken naar een tokenizer. Hier is een willekeurig gegooglede start.
boe2 schreef op donderdag 9 mei 2019 @ 09:52:
Het lijkt hier wel verleidelijk om een regular expression te gebruiken
Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems - Jamie Zawinski

[ Voor 11% gewijzigd door RobIII op 09-05-2019 09:55 ]

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!

  • Stoelpoot
  • Registratie: September 2012
  • Niet online
boe2 schreef op donderdag 9 mei 2019 @ 09:52:
Dit is eigenlijk wel een interessante oefening. Het lijkt hier wel verleidelijk om een regular expression te gebruiken, dan wel char per char te evalueren tot je een operator tegenkomt.
Ik zou 'm persoonlijk regexen, denk ik. Maar ik denk dat dat het niveau van de TS net te boven gaat, gezien de complixiteit van Regex gegroepeerd uitlezen.

@RobIII Tja, maar in dit geval is het toch wel beperkt genoeg IMO :P
Verwijderd schreef op donderdag 9 mei 2019 @ 09:53:
@Stoelpoot @ThomasG Zal iemand me dan een voorbeeld code kunnen laten zien hoe ik het moet aanpakken het liefst zal ik het met splitten willen doen
Met splitten gaat het niet lukken, want je hebt geen karakters staan tussen de onderdelen die je wilt splitten. Dus is er niets om mee te splitten, en als je alsnog elk karakter los neemt verlies je de mogelijkheid tot getallen boven de 9 (zoals ik al aangaf). Dus zal je toch naar een andere aanpak moeten kijken.

@Marco Die vis die hij niet zelf heeft gevangen zals alsnog gefileerd moeten worden ;)

[ Voor 45% gewijzigd door Stoelpoot op 09-05-2019 10:01 ]


Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Ik wist dat dit antwoord er ging komen, daarom gebruikte ik het woord "verleiding" :p.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

  • Marco1994
  • Registratie: Juli 2012
  • Nu online
Ik zou alle spaties in je string verwijderen en dan elk karakter splitsen. Dus eerst vervang (replace) je alle spaties in je string door string.Empty en daarna splits je op een leeg karakter

Acties:
  • 0 Henk 'm!

  • Sandor_Clegane
  • Registratie: Januari 2012
  • Niet online

Sandor_Clegane

Fancy plans and pants to match

Dit zou moeten werken:

code:
1
2
3
4
5
6
7
8
9
10
11
> let b = "1+1";;
val b : string = "1+1"

> b.Split([|'+';' '|], StringSplitOptions.RemoveEmptyEntries);;
val it : string [] = [|"1"; "1"|]

> i;;
val it : string = "1 + 1"

> i.Split([|'+';' '|], StringSplitOptions.RemoveEmptyEntries);;
val it : string [] = [|"1"; "1"|]


Je kan op meerdere characters splitten. Dit is zo even in FSI gedaan, in C# zal het niet veel lastiger zijn.

[ Voor 14% gewijzigd door Sandor_Clegane op 09-05-2019 10:00 ]

Less alienation, more cooperation.


Acties:
  • 0 Henk 'm!

  • Marco1994
  • Registratie: Juli 2012
  • Nu online
Sandor_Clegane schreef op donderdag 9 mei 2019 @ 09:59:
Dit zou moeten werken:

code:
1
2
3
4
5
6
7
8
9
10
11
> let b = "1+1";;
val b : string = "1+1"

> b.Split([|'+';' '|], StringSplitOptions.RemoveEmptyEntries);;
val it : string [] = [|"1"; "1"|]

> i;;
val it : string = "1 + 1"

> i.Split([|'+';' '|], StringSplitOptions.RemoveEmptyEntries);;
val it : string [] = [|"1"; "1"|]
Iets met een vis en leren vissen...

Acties:
  • 0 Henk 'm!

  • Sandor_Clegane
  • Registratie: Januari 2012
  • Niet online

Sandor_Clegane

Fancy plans and pants to match

Marco1994 schreef op donderdag 9 mei 2019 @ 10:00:
[...]

Iets met een vis en leren vissen...
Hij vroeg om een voorbeeld.

Less alienation, more cooperation.


Acties:
  • +2 Henk 'm!

  • heuveltje
  • Registratie: Februari 2000
  • Laatst online: 16:46

heuveltje

KoelkastFilosoof

Marco1994 schreef op donderdag 9 mei 2019 @ 10:00:
[...]

Iets met een vis en leren vissen...
Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.
-terry pratchett

Die bedoel je ? >:)

Heuveltjes CPU geschiedenis door de jaren heen : AMD 486dx4 100, Cyrix PR166+, Intel P233MMX, Intel Celeron 366Mhz, AMD K6-450, AMD duron 600, AMD Thunderbird 1200mhz, AMD Athlon 64 x2 5600, AMD Phenom X3 720, Intel i5 4460, AMD Ryzen 5 3600 5800x3d


Acties:
  • 0 Henk 'm!

  • Sandor_Clegane
  • Registratie: Januari 2012
  • Niet online

Sandor_Clegane

Fancy plans and pants to match

Die is echt briljant.

Less alienation, more cooperation.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@Sandor_Clegane bedankt maar denk dat dit voorbeeld niet gaat werken aangezien ik de werkwijze van
mijn code zal willen behouden.

Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 18:40
Verwijderd schreef op donderdag 9 mei 2019 @ 10:03:
@Sandor_Clegane bedankt maar denk dat dit voorbeeld niet gaat werken aangezien ik de werkwijze van
mijn code zal willen behouden.
Hij zegt ook niet dat het een kant-en-klaar antwoord is. Het is een voorbeeld, waar je inspiratie uit kan halen.

Acties:
  • 0 Henk 'm!

  • Marco1994
  • Registratie: Juli 2012
  • Nu online
Klopt, maar het lijkt erop dat het een voorbeeld is voor school (correct me if im wrong) en dat stuk code zal lastig te begrijpen zijn. Probeer er dan tenminste bij te vermelden wat het doet, een stuk code dumpen draagt weinig bij aan de ontwikkeling van de TS

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@Marco1994 nee het is niet voor school. het is voor eigen gebruik

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb een programma waarbij als je 1 + 1 kopieerd er netjes een notificatie komt met 2 als uitkomst. Maar als ik 1+1 pak gebeurt er niks

Acties:
  • 0 Henk 'm!

  • Sandor_Clegane
  • Registratie: Januari 2012
  • Niet online

Sandor_Clegane

Fancy plans and pants to match

Marco1994 schreef op donderdag 9 mei 2019 @ 10:04:
[...]

Klopt, maar het lijkt erop dat het een voorbeeld is voor school (correct me if im wrong) en dat stuk code zal lastig te begrijpen zijn. Probeer er dan tenminste bij te vermelden wat het doet, een stuk code dumpen draagt weinig bij aan de ontwikkeling van de TS
Hmmm het lijkt me redelijk duidelijk, maar misschien zit ik er naast. Dat gebeurt wel eens. :)
Verwijderd schreef op donderdag 9 mei 2019 @ 10:05:
@Marco1994 nee het is niet voor school. het is voor eigen gebruik
Je program flow kan gewoon hetzelfde blijven als je even een stapje terug doet.

Less alienation, more cooperation.


Acties:
  • 0 Henk 'm!

  • Marco1994
  • Registratie: Juli 2012
  • Nu online
Verwijderd schreef op donderdag 9 mei 2019 @ 10:06:
ik heb een programma waarbij als je 1 + 1 kopieerd er netjes een notificatie komt met 2 als uitkomst. Maar als ik 1+1 pak gebeurt er niks
Verwijderd schreef op donderdag 9 mei 2019 @ 10:06:
ik heb een programma waarbij als je 1 + 1 kopieerd er netjes een notificatie komt met 2 als uitkomst. Maar als ik 1+1 pak gebeurt er niks
Oke je probleem is dus dat je programma kapot gaat op het moment dat je een spatie invoert, de oplossing is dan heel simpel: verwijder het probleem (zie mijn eerdere comment)

Acties:
  • 0 Henk 'm!

  • Stoelpoot
  • Registratie: September 2012
  • Niet online
Verwijderd schreef op donderdag 9 mei 2019 @ 10:03:
@Sandor_Clegane bedankt maar denk dat dit voorbeeld niet gaat werken aangezien ik de werkwijze van
mijn code zal willen behouden.
De werkwijze van je code zoals nu blijft afhankelijk van spaties (of een ander splitsingsteken). Dat is dus sowieso geen realistische optie. Je moet je parts variabele op line 1 op een andere manier uitwerken. Die output kan je prime hetzelfde houden, zonder de rest van je programma aan te passen.

Met jouw idee om op lege karakters te splitsen, is dat juist niet mogelijk omdat je een andere output zal krijgen in gevallen zoals 10+10.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Sorry jongens en meisjes. Einde topic. We hebben een notoire lutser clone te pakken :Y)

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

Pagina: 1

Dit topic is gesloten.