Kleine hulpvraag C#

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo mensen,

Ik beetje bij beetje meer van C# maar soms raak ik echt zo door de war dat ik 2 uur aan het zoeken ben naar de fout en hem dan nog niet heb gevonden. Misschien dat jullie mij kunnen helpen.

Het is een opdracht voor school en gebruik een if/else binnen een get/set.

Ik moet een fiets " samenstellen" met bepaalde klassen.

Op een gegeven moment vraag ik in program.cs:

code:
1
2
Console.WriteLine("Welk kleur frame wilt u? 1=groen en 2=rood");
bicycle.Frame.Color = Console.ReadLine();


bicycle = de hele namespace
Frame = Frame.cs
Color = een private string in Frame.cs


Dan kom je in de Frame.cs terecht:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 private string _color;
        
        public string Color
        
        {
            get
            {
                return _color;
            }
            set
            {
                if (Color == "1") 
                _color="Groen";
                
                else
                 _color="Foute waarde ingevoerd. Begin opnieuw";
                
            }
        }


Echter, wanneer ik 1 toets voor groen (rood heb ik nog even achterwegen gelaten) gaat ie alsnog naar de Else en is _color="Foute waarde...." ipv " Groen)

Op de een of andere manier is Color in het if-statement op het moment van uitvoeren nog leeg, waardoor ie naar else springt.

Aan het einde krijgt de gebruiker dus een terugkoppeling met de gemaakte keuzes. Zoals:
Frame: Rood

Ik kom er alleen helemaal niet meer uit |:(

(Het liefst had ik in de else statement trouwens een console.write gehad met "foute waarde" waarna het programma stopte maar dat werd me even te ingewikkeld.)

Wie kan mij helpen?

Bedankt.

Acties:
  • 0 Henk 'm!

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 17-09 17:58
Domme opmerking misschien, maar krijg je bij "readline()" ook niet de newline aan het eind terug (wat je als gebruiker dus intypt)?

Probeer het eens met "readchar()" (weet zo niet of die bestaat) of sloop de newline er uit (trim)?

Edit: ik zie het probleem. Zet in je if eens "value" neer, i.p.v. Color.
Zie hieronder :p Alleen is het niet de waarde van de huidige Color, omdat die _color heet.

[ Voor 27% gewijzigd door aaajeetee op 30-04-2012 19:32 ]


Acties:
  • 0 Henk 'm!

  • Q00101100
  • Registratie: Augustus 2005
  • Laatst online: 09:12
Het gaat mis in de if van je setter. Je controleert daar nu de huidige waarde van de Color-property (dus eigenlijk de getter), terwijl je de nieuwe waarde (waarmee de set wordt aangeroepen) wilt controleren.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
aaajeetee schreef op maandag 30 april 2012 @ 19:27:
Domme opmerking misschien, maar krijg je bij "readline()" ook niet de newline aan het eind terug (wat je als gebruiker dus intypt)?

Probeer het eens met "readchar()" (weet zo niet of die bestaat) of sloop de newline er uit (trim)?
Hmmm ik snap niet echt wat je bedoeld.

Ik heb dus die get/set methode.. Dat moest ik gebruiken om het te snappen (niet heel nuttig in deze). Een private string maak ik dus public in frame.cs met die get/set.

Het enige dat ik wil voorkomen, is dat als de gebruiker de vraag krijgt om een kleur in te typen, hij niet zomaar wat onzin in kan typen wat dus in een variabelen wordt opgeslagen. Dan krijg je straks frame kleur: blababla

De gebruiker krijgt dus telkens de keuze uit 2 mogelijkheden. 1 voor groen en 2 voor rood bijv.

Dan wil ik dat er dmv het if-statement wordt bepaald wat 1 betekend en 2. En alles behalve 1 of 2 is direct "foute waarde"

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Q00101100 schreef op maandag 30 april 2012 @ 19:30:
Het gaat mis in de if van je setter. Je controleert daar nu de huidige waarde van de Color-property (dus eigenlijk de getter), terwijl je de nieuwe waarde (waarmee de set wordt aangeroepen) wilt controleren.
In die richting dacht ik ook al.. hoe kan ik dat dan nu oplossen? Zie post hier boven even voor de duidelijkheid.

Acties:
  • 0 Henk 'm!

  • Q00101100
  • Registratie: Augustus 2005
  • Laatst online: 09:12
Verwijderd schreef op maandag 30 april 2012 @ 19:34:
[...]

In die richting dacht ik ook al.. hoe kan ik dat dan nu oplossen? Zie post hier boven even voor de duidelijkheid.
Zie de edit van aaajeetee, hij heeft het al voorgezegd. :)

Acties:
  • 0 Henk 'm!

  • Big4SMK
  • Registratie: September 2001
  • Laatst online: 17-09 09:30
Je setter krijgt een parameter mee, die heet "value", en die zul je dus moeten gebruiken/controleren.

stel: je type bicycle.Frame.Color = "oranje", dan wordt er bicycle.Frame.Color.set(value="oranje") aangeroepen. In de setter kan je dan dus iets tikken als console.write(value) (die dan oranje print), print je echter console.write(_color) dan krijg je de _huidige_ _color waarde, dus niet de 'nieuwe' oranje.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
YEEEEAH!

Het werkt! Die value wordt inderdaad veel gebruikt in die get/set methode. Maar toen kon ik dus alle waarden in die value stoppen waardoor ik hem had weggehaald..

Thanks
Big4SMK schreef op maandag 30 april 2012 @ 19:37:
Je setter krijgt een parameter mee, die heet "value", en die zul je dus moeten gebruiken/controleren.

stel: je type bicycle.Frame.Color = "oranje", dan wordt er bicycle.Frame.Color.set(value="oranje") aangeroepen. In de setter kan je dan dus iets tikken als console.write(value) (die dan oranje print), print je echter console.write(_color) dan krijg je de _huidige_ _color waarde, dus niet de 'nieuwe' oranje.
Bedankt. Ik snap het !

/Edit:

Weet iemand dan misschien ook het volgende?:

Wanneer je dus alles behalve 1 of 2 invoert schiet ie naar else en krijgt je dus Frame kleur: Foute invoer begin opnieuw.

Liever zou ik hebben dat er een console.writeline komt en er direct "foute invoer" neerzet en de console stopt.

Echter werkt het natuurlijk niet wanneer ik in die else statement een console.writeline neerzet, dat moet in de program.cs, maar hoe weet die nu dat er een foute waarde is ingevoerd?

[ Voor 84% gewijzigd door Verwijderd op 30-04-2012 19:44 ]


Acties:
  • 0 Henk 'm!

  • kutagh
  • Registratie: Augustus 2009
  • Laatst online: 17-09 21:37
Dan pak je het denk ik verkeerd aan: Een setter is alleen maar om een waarde te setten, niet om constant om een nieuwe waarde te vragen of een resultaat terug te geven. Wat wel kan is iets als dit:

code:
1
2
3
4
5
6
7
8
9
10
11
public void requestColor(){
Console.WriteLine("Voer een kleur in");
bicycle.Frame.Color = Console.ReadLine();
}

public Color color {
set {
if(value == "1") _color = groen;
else requestColor();
}
}

Dit is nog steeds niet ideaal, maar wel dichtbij wat je initieel wilde.
Als je puur wilt dat bij een foutieve waarde een error komt, kun je kiezen om een exception te throwen en die daarna catchen.

Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Verwijderd schreef op maandag 30 april 2012 @ 19:38:
[...]

Echter werkt het natuurlijk niet wanneer ik in die else statement een console.writeline neerzet, dat moet in de program.cs, maar hoe weet die nu dat er een foute waarde is ingevoerd?
Je moet het gedrag in je applicatie opsplitsen in kleine behapbare stukken. Denk eerst eens goed na over hoe je wilt dat je applicatie werkt, en ga dit daarna opsplitsen in lossen stukken waarbij ieder stuk een enkele verantwoordelijkheid heeft. Dan komt er vanzelf een model uitrollen ;)

Een manier hoe een beginner dit zou kunnen doen is om het gedrag van je applicatie uit te schrijven in een verhaal. Om daarna elk zelfstandig naamwoord te onderstrepen. Als je dan klaar bent is als t goed is bijna elk onderstreept woord een klasse in je model.

Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
Waarom gebruik je een string voor je color ID. Zou er precies gewoon een integer van maken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Lunacy schreef op maandag 30 april 2012 @ 22:59:
Waarom gebruik je een string voor je color ID. Zou er precies gewoon een integer van maken.
Ja dat is inderdaad niet heel praktisch... je bedoeld dat je daardoor eerst nog op enter moet drukken waarna een readline plaatsvindt die kijkt of de stringwaarde "1" is?

If van de setter in fiets.cs
code:
1
2
3
4
if  "1" 
{
merk = Giant
}


Ik heb dus even gezocht hoe je nu kan zorgen dat wanneer je op 1 drukt er meteen een "readkey" komt die ziet: er is op 1 gedrukt, dus ik moet de string "Giant" teruggeven

Ik kwam uit op een char.. en dat ziet er dan ongeveer zo uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 char merkInput = '*';
            Console.Clear();
            Console.WriteLine("Wil je een Giant(1) of een Trek(2)?\n");

            ConsoleKeyInfo cki = Console.ReadKey();
            merkInput = cki.KeyChar;

            if (merkInput == '1') 
            {
                Fiets.Merk="1";
            }

            if (merkInput == '2')
            {
                Fiets.Merk="2";
            }


'1' is dus de fysieke toets 1..

Wanneer die wordt ingedrukt wordt er dus "1" (een string dus) naar de setter gestuurd waarna weer die IF plaatsvindt die ik hier boven noem.

Maarja... echt heel efficient is het niet... toets 1 wordt dan een string, en die wordt weer aan de setter doorgegeven.


code:
1
2
3
4
if  "1" 
{
merk = Giant
}



Hoef nu dus niet meer op enter te drukken.

Wanneer ik in de setter echter aangeef:

code:
1
2
  if (value == '1') [i]// dit is dus de de fysieke toets 1[/i]
                    _merk = "Giant";


Krijg ik de melding:

Operator '==' cannot be applied to operands of type 'string' and 'char'

Heeft iemand hier misschien een oplossing voor?

Acties:
  • 0 Henk 'm!

  • [x]
  • Registratie: Maart 2010
  • Laatst online: 17-09 07:20

[x]

Je char casten naar een string? Zorg dat beide variabelen op zijn minst hetzelfde type zijn!
.ToString()


Als je meer dan 3 ifs gebruikt zou je beter een switch kunnen implementeren.

[ Voor 67% gewijzigd door [x] op 01-05-2012 13:33 ]


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 00:53
Lunacy schreef op maandag 30 april 2012 @ 22:59:
Waarom gebruik je een string voor je color ID. Zou er precies gewoon een integer van maken.
Ik zou een color enum maken en gewoon de int-waardes uit de console proberen te casten naar een enum value.

== gebruiken om strings te comparen is sowieso sterk af te raden. Gebruik daar Equals() voor.

[ Voor 13% gewijzigd door Avalaxy op 01-05-2012 13:36 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is gelukt:

Dus in program.cs als volgt:

code:
1
2
3
4
5
6
7
8
9
char Merkinput = '*';
            
            Console.Clear();
            Console.WriteLine("Wil je een Giant(1) of een Trek(2)?\n");

            ConsoleKeyInfo qwe = Console.ReadKey();
            Merkinput = qwe.KeyChar;

            Fiets.Merk = Merkinput.ToString();


Nu alleen nog zorgen (dmv een while?) zorgen dat wanneer je op elke andere toets drukt dan 1 of 2, er niets gebeurd..

code:
1
while (Merkinput=='1')||(Merkinput=='2');


Bovenstaande werkt iig niet... " Invalid expression term '||' "

/Edit: wat is nu precies het doel van "qwe" ? Ik kon namelijk ook 123 invoeren.. het maakt voor de werking niets uit.

[ Voor 239% gewijzigd door Verwijderd op 01-05-2012 16:24 ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Nu online

Haan

dotnetter

Om het helemaal goed te doen, zou ik nog wel de input direct controleren (dus na Console.ReadKey() ) en niet pas later in een property (dat kan je daar wel laten staan in het kader van defensief programmeren).

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Haan schreef op dinsdag 01 mei 2012 @ 16:15:
Om het helemaal goed te doen, zou ik nog wel de input direct controleren (dus na Console.ReadKey() ) en niet pas later in een property (dat kan je daar wel laten staan in het kader van defensief programmeren).
De input controlleer ik in die andere klasse.. middels een if in die get/set. Of bedoel je dat niet?

zo dus:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 public string Merk
        {

            get
            {
                return _merk;
            }
            set
            {
                if (value == "1")
                    _merk = "Giant";

                else if (value == "2")
                    _merk = "Trek";

                else
                    _merk = "Je hebt niet uit de beschikbare merken gekozen. Begin opnieuw.";


Ik wil dus zorgen dat alles behalve 1 of 2 niet wordt geaccepteerd..

[ Voor 39% gewijzigd door Verwijderd op 01-05-2012 16:29 ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Nu online

Haan

dotnetter

Ik bedoel precies wat ik zeg ;) Die logica voer je beter al direct na de invoer uit en niet pas in de property.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Haan schreef op dinsdag 01 mei 2012 @ 16:35:
Ik bedoel precies wat ik zeg ;) Die logica voer je beter al direct na de invoer uit en niet pas in de property.
Dus in de program.cs?

Ik snap niet helemaal wat je bedoeld.. maar dat char stukje heb ik dan ook ergens van internet geplukt en moet hem nog even doorhebben.

Wat ik nu dus heb is dat die die toetsaanslag converteert naar de string van die toets. Die wordt dan vergeleken in de setter dmv de if en wordt er zodoende gekozen tussen Trek en Giant.

Acties:
  • 0 Henk 'm!

  • Mint
  • Registratie: Mei 2005
  • Nu online
Verwijderd schreef op dinsdag 01 mei 2012 @ 16:52:
[...]


Dus in de program.cs?

Ik snap niet helemaal wat je bedoeld.. maar dat char stukje heb ik dan ook ergens van internet geplukt en moet hem nog even doorhebben.

Wat ik nu dus heb is dat die die toetsaanslag converteert naar de string van die toets. Die wordt dan vergeleken in de setter dmv de if en wordt er zodoende gekozen tussen Trek en Giant.
Als je die logica niet in de setter doet, maar in je Program.cs , kun je direct in je venster tonen dat de input niet klopt (zoals je ook aangeeft in je startpost).

Ik zou in je Program.cs een switch case maken, waarin je per ID een value doorgeeft aan de setter in je class met een default action een terugkoppeling naar het venster met een melding dat het setten mislukt is.

Wat betreft je while loop: enerzijds vraag ik me af waarom die erin zit. In ieder geval een hint waarom het niet werkt: check je haakjes.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
adyta schreef op dinsdag 01 mei 2012 @ 16:59:
[...]


Als je die logica niet in de setter doet, maar in je Program.cs , kun je direct in je venster tonen dat de input niet klopt (zoals je ook aangeeft in je startpost).

Ik zou in je Program.cs een switch case maken, waarin je per ID een value doorgeeft aan de setter in je class met een default action een terugkoppeling naar het venster met een melding dat het setten mislukt is.

Wat betreft je while loop: enerzijds vraag ik me af waarom die erin zit. In ieder geval een hint waarom het niet werkt: check je haakjes.
Dus die hele if else moet ik naar program.cs halen? Zo had ik het in het alle eerste begin :P

Die while is toch zo gewoon goed?

code:
1
while (Merkinput=='1')||(Merkinput=='2');

Acties:
  • 0 Henk 'm!

  • Mint
  • Registratie: Mei 2005
  • Nu online
Verwijderd schreef op dinsdag 01 mei 2012 @ 17:03:
[...]


Dus die hele if else moet ik naar program.cs halen? Zo had ik het in het alle eerste begin :P

Die while is toch zo gewoon goed?

code:
1
while (Merkinput=='1')||(Merkinput=='2');
Die if/else zou ik inderdaad naar Program.cs halen.

Die while loop klopt niet qua syntax. Hint twee: je sluit de conditie van de while loop af waarna je een andere conditie geeft. Daarbij kom je, voor zover ik het in kan schatten, in een infinite loop terecht. Wat als je 1 invult in de command prompt? Ga je handmatig uit de while loop? Zo ja, wat is dan het nut van die while loop?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
adyta schreef op dinsdag 01 mei 2012 @ 17:06:
[...]


Die if/else zou ik inderdaad naar Program.cs halen.

Die while loop klopt niet qua syntax. Hint twee: je sluit de conditie van de while loop af waarna je een andere conditie geeft. Daarbij kom je, voor zover ik het in kan schatten, in een infinite loop terecht. Wat als je 1 invult in de command prompt? Ga je handmatig uit de while loop? Zo ja, wat is dan het nut van die while loop?
Hmmm.. ja..

Als ik had geschreven: while != S (ongelijk aan S) dan zou de console stoppen op het moment ik op S druk..

Maar nu krijg ik dus de melding " Operator '==' cannot be applied to operands of type 'string' and 'char' "

(Het mooiste zou zijn dat er alleen wordt gereageerd op 1 of 2.. Elke andere toets wordt dan gewoon genegeerd.)


Ik ga nog even aanklooien. Allemaal bedankt zo ver :*)

[ Voor 10% gewijzigd door Verwijderd op 01-05-2012 17:11 ]


Acties:
  • 0 Henk 'm!

  • Mint
  • Registratie: Mei 2005
  • Nu online
Verwijderd schreef op dinsdag 01 mei 2012 @ 17:09:
[...]


Hmmm.. ja..

Als ik had geschreven: while != S (ongelijk aan S) dan zou de console stoppen op het moment ik op S druk..

Maar nu krijg ik dus de melding " Operator '==' cannot be applied to operands of type 'string' and 'char' "
Je kunt toch de vraag stellen in de command prompt, waarna je een ReadLine() doet?

Verder, wat zegt de compiler hier precies? String- en char-objecten zijn niet gelijk. Je zult de waarden van de objecten met elkaar vergelijkbaar moeten maken. Voor zover ik weet heeft een char-object een ToString()-methode, daar moet je een eind mee komen.

Edit:
Alleen reageren op bepaalde toetsaanslagen lijkt me qua GUI-design niet handig. Waarom mag een gebruiker niet weten waarom de software niets doet? Alles kun je regelen in je if-statement (of een switch case). Als de door de gebruiker ingevoerde input geen '1' of '2' is, geef je een 'Try again'-melding. Zo vang jij input af die jij niet wilt hebben en weet je gebruiker dat zijn input niet correct is.

[ Voor 22% gewijzigd door Mint op 01-05-2012 17:14 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
adyta schreef op dinsdag 01 mei 2012 @ 17:12:
[...]


Je kunt toch de vraag stellen in de command prompt, waarna je een ReadLine() doet?

Verder, wat zegt de compiler hier precies? String- en char-objecten zijn niet gelijk. Je zult de waarden van de objecten met elkaar vergelijkbaar moeten maken. Voor zover ik weet heeft een char-object een ToString()-methode, daar moet je een eind mee komen.
Als ik het dmv een ReadLine doe, moet er eerst op enter worden gedrukt. Nu druk ik op 1 of 2 en krijg ik de volgende vraag. Char toString heb ik gebruikt :)
Edit:
Alleen reageren op bepaalde toetsaanslagen lijkt me qua GUI-design niet handig. Waarom mag een gebruiker niet weten waarom de software niets doet? Alles kun je regelen in je if-statement (of een switch case). Als de door de gebruiker ingevoerde input geen '1' of '2' is, geef je een 'Try again'-melding. Zo vang jij input af die jij niet wilt hebben en weet je gebruiker dat zijn input niet correct is.
Uiteraard is dat het mooiste. Maar ik ben pas 6 weken geleden begonnen met C# dus niet alles weet ik op te lossen.. een switch case heb ik nog nooit gebruikt..

Voor degenen die het eindproduct willen zien... klik
Pagina: 1