[C#] Som probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben momenteel een rekenmachine aan het maken in C#.

Echter heb ik een probleem als ik tussentijds een som wil uitrekenen.

Zie code:
C#: 100
1
2
3
4
String lastSom = last;
String Tussensom = Werkgetal + lastSom + uitkfield.Text;
uitkfield.Text = Convert.ToString(EindSom);
i = 0;

Werkgetal is een double, last een String die bijvoorbeeld het teken + of - kan bevatten.
Als ik het debug, heeft hij deze waarde inderdaad bij zich, Maar als ik verder ga dan staat er op lastSom null in de som Tussensom.

De som moet dus bijvoorbeeld worden:
Tussensom = Werkgetal + waarde in uikfield.
Maar indien last een - bevat, moet het uiteraard een - som worden. Ik kan dit probleem verhelpen met een if/else if / else maar dat geeft weer veel regels onnodige code.

Hoe verhelp ik dit? _/-\o_

Acties:
  • 0 Henk 'm!

  • Soundless
  • Registratie: November 2008
  • Laatst online: 24-07 14:19
Is er een reden waarom je last aan lastsom assigned?
En je weet dat strings in C# reference types zijn?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Soundless schreef op vrijdag 26 november 2010 @ 00:28:
Is er een reden waarom je last aan lastsom assigned?
En je weet dat strings in C# reference types zijn?
Geen reden, als je ergens al een tijdje niet uit komt ga je van alles proberen.
Dat weet ik, alleen weet niet hoe ik het voor elkaar krijg om die waarde van last in de som te tonen.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 15-09 09:10
Zo te zien ben je met iets basaals aan het begin, dat is erg goed en ga vooral zo door. Echter is het handig om iets te leren over type conversie ook wel casten genoemd.

C# is namelijk een hard-typed taal. Concreet houdt dit in dat een object van een bepaald type nooit zomaar een ander type kan worden. Om jouw eigen code als voorbeeld te gebruiken; een double kan nooit zomaar een string worden.

Het is dus de bedoeling dat je voor je rekenmachine allereerst alle waarden gaat converteren. Dit houdt dus in dat je tijdens de verwerking van de som alleen maar getal-types wilt hebben (double, int, float, etc). Je moet hiervoor dus de invoer valideren (is het een nummer?) en omzetten naar jouw gewenst type. Daarna moet je de verwerking doen en weer terug omzetten naar een string om het aan de gebruiker te tonen. Dat laatste doe je overigens al in de derde regel van bovenstaande code.



Naast deze praktische hulp wil ik je ook even wijzen op een aantal programmeerstandaarden. Ik zie namelijk in jouw voorbeeld drie verschillende typen 'naming conventions' voortkomen, waarbij je er eigenlijk maar één correct gebruikt.
  • Een lokale variabele (in een functie/methode) begin je altijd met een kleine letter en woorden die daarop volgen krijgen een hoofdletter. Voorbeeld: tussenSom.
  • Een property (of methodenaam) begin je altijd met een hoofdletter en woorden die daarop volgen ook. Voorbeeld: EindSom.
  • Een privé variabele zou ik altijd beginnen met een _ waarnaast je daarna verder gaat met een kleine letter. Voorbeeld: _beginSom.
Zo wordt je code namelijk een stuk overzichtelijker!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt, ik ga het gelijk aanpassen! Alleen heb ik nog 1 vraag. last kan ik niet omzetten naar een cijfer, omdat het een teken + - / * ect. is. Hoe kan ik deze waarde dus in de som gebruiken ?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op vrijdag 26 november 2010 @ 00:38:
Bedankt, ik ga het gelijk aanpassen! Alleen heb ik nog 1 vraag. last kan ik niet omzetten naar een cijfer, omdat het een teken + - / * ect. is. Hoe kan ik deze waarde dus in de som gebruiken ?
Kijken welk teken het is en op basis daarvan een andere if/else in gaan?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
NMe, dat geef ik inderdaad aan dat dat een mogelijkheid is in mijn beginpost, alleen geeft dit extra regels code, ik was benieuwd of het op mijn manier ook kon.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op vrijdag 26 november 2010 @ 00:43:
NMe, dat geef ik inderdaad aan dat dat een mogelijkheid is in mijn beginpost, alleen geeft dit extra regels code, ik was benieuwd of het op mijn manier ook kon.
Het zal je vast verbazen, maar programmeren draait om regels code schrijven. :P

Er is in sommige talen een kortere variant (eval) maar gelukkig bestaat die in C# niet. En ik zeg gelukkig omdat 99 van de 100 keer dat eval gebruikt wordt, het een foute keuze is. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 17-09 10:59

Ventieldopje

I'm not your pal, mate!

Aanvullend op alex een voorbeeldje:

C#:
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
using System;

namespace Voorbeeld
{
    class Boerderij
    {
        private int _animalCount = 0;
        
        public VoorbeeldClass()
        {
            
        }

        public int AnimalCount
        {
             get { return _animalCount; }
             set { _animalCount = value }
        }

        public void ShowCount()
        {
            Console.WriteLine(_animalCount.ToString());
        }
    }
}


Eventueel kun je zelfs nog met regions gaan werken zodat je je code in visual studio mooi op kan klappen en kan structureren, mocht je code erg groot worden :) .. VS10x Code Map kan daar bij ook een handige aanvulling zijn voor visual studio 2010.

C#:
1
2
3
4
5
#region Voorbeeldje

// Hier je code

#endregion


C#:
1
Convert.ToString(EindSom);

Kun je natuurlijk makkelijker schrijven als
C#:
1
EindSom.ToString();


Maargoed,

Je zou dit op kunnen lossen door switch te gebruiken ..

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
switch(lastSom) // + of - of *
{
    case "+":
        Console.WriteLine("Ik had hier een plus sommetje moeten doen.");
        break;
    case "-":
        Console.WriteLine("Ik had hier een min sommetje moeten doen.");
        break;
    case "*":
        Console.WriteLine("Vermenigvuldigen doen we maar in bed!");
        break;
    case "sinterklaas":
        Console.WriteLine("Shit! had ik nou dat gat in het dak al gerepareert?");
        break;
    default:
        Console.WriteLine("Lekkah niks doen jongahhh.");
        break;
}


Scheelt je een hoop code wat je normaal kwijt was geweest aan if / elsejes ;)

@NME:
Er is wel een omweg, maar dat is via CSharpCodeProvider .. klikkerdeklik, een ietwat uitgebreide eval :+

[ Voor 5% gewijzigd door Ventieldopje op 26-11-2010 01:08 ]

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8

Pagina: 1