Laden...

Kleiner Taschenrechner Projekt

Erstellt von ExilCoder vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.449 Views
E
ExilCoder Themenstarter:in
28 Beiträge seit 2015
vor 5 Jahren
Kleiner Taschenrechner Projekt

Hi, ich lerne aktuell wieder etwas C# und dachte mir ich mache mir einen etwas besseren taschenrechner als mein letzter. also wollte ich nur 1 textfelt machen das gesteuert wird von der tastatur 0 - 9 nummern und * - + / ich bin dabei leider jetzt auf einen Fehler gestoßen den ich nicht verstehe, kann mir bitte jemand sagen wieso das nicht geht und wie ich das problem lösen kann?
bitte nichts weiteres spoilern, ich will alles andere gerne alleine machen 😄


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Better_Calculator
{
    public partial class Form1 : Form
    {
        public int number1; //check
        public string divisor; //check
        public int number2; 

        public int countspaces; //check

        public int result;

        public Form1()
        {
            InitializeComponent();
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            
            
            char choice = 'a';

            switch (choice)
            {
                case '+':
                    number1 = Convert.ToInt32(textBox1.Text);
                    divisor = "+";
                    break;

                case '-':
                    number1 = Convert.ToInt32(textBox1.Text);
                    divisor = "-";
                    break;

                case ':':
                    number1 = Convert.ToInt32(textBox1.Text);
                    divisor = ":";
                    break;

                case '*':
                    number1 = Convert.ToInt32(textBox1.Text);
                    divisor = "*";
                    break;
            }
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            spacecounting();

            textBox1.Text = textBox1.Text.Remove(0, countspaces);

            //irgendetwas passiert mit dem Textbox1.text so das es nicht das gleiche resultat ergibt
            //Program cannot convert the String into a int for some reason
            number2 = Convert.ToInt32(textBox1.Text);

            textBox1.Clear();

            //Inform yourself howw to replace the divisor with a variable
            result = number1 + number2;

            textBox1.Text = "Result: " + result;
        }

        public void spacecounting()
        {
            foreach (char av in textBox1.Text)
            {
                countspaces++;
            }
        }
    }
}

Ich bin neu hier, und deshalb etwas unerfahren wenn du hilfreiche Tipps bezüglich dem lernen von C# hast lass sie mich wissen !

16.806 Beiträge seit 2008
vor 5 Jahren

Bitte Code Tags verwenden. Niemand hat Lust auf Plaintext-Code.
[Hinweis] Wie poste ich richtig? Punkt 6

Convert.ToInt32(textBox1.Text) kann nur funktioneren, wenn in der TextBox auch nen Int ist.
Das kann man aber alles prinzipiell debuggen:
[Artikel] Debugger: Wie verwende ich den von Visual Studio?
Für mich ist es ein Rätsel, was Du mit Spacecounting und dem Remove erreichen willst.
Die Methode macht alles - aber kein Space"counting". Sie erhöht einfach nur die Variable um die Länge der Eingabe. Spätestens bei der zweiten Eingabe muss das dermaßen knallen, dass die Korken fliegen.
Bezweifle, dass danach das in der Textbox steht, was drin stehen soll. Aber auch das siehst mit dem Debugger.

PS: Besser TryParse-Methoden (zB Int32.TryParse) statt die Convert-Methoden verwenden, wenn der Inhalt nicht garantiert von einem jeweiligen Datentypen ist.
Stichwort: defensive Programmierung.

E
ExilCoder Themenstarter:in
28 Beiträge seit 2015
vor 5 Jahren

Das Programm funktioniert, es zeigt mir beim Convertieren nur ein fehler ZEICHEN an und keine deutliche andeutung wo der Fehler liegt, ich habe aber eine relativ gute idee was ich machen kann um es zu fixen da ich es davor zum laufen brachte und jetzt nach umschreiben des codes die funktion selbst nichtmehr funktioniert ... naja egal dachte hier hat jemand evtl. ein leichten lösungsweg der sauberer ist

Ich bin neu hier, und deshalb etwas unerfahren wenn du hilfreiche Tipps bezüglich dem lernen von C# hast lass sie mich wissen !

T
461 Beiträge seit 2013
vor 5 Jahren

Hallo,

was wohl gemeint ist, daß das Käse ist:


        public void spacecounting()
        {
            foreach (char av in textBox1.Text)
            {
                countspaces++;
            }
        }

denn er berechnet keine spaces sondern nur die Textlänge.

Wenn ich mir das ansehe:


textBox1.Text = textBox1.Text.Remove(0, countspaces);

weiß ich sofort, daß du einfach nur die Leerzeichen entfernen möchtest, das geht einfacher:
String.Replace

Somit könntest dir auch die Methode spacecounting sparen.

Die Eventmethode textBox1_KeyPress ist auch ein Stinkekäse, denn da wird immer mit dem char a geswitcht. Zudem bleibt in der Methode alles in der textBox1.Text drinnen stehen oder?
Z.Bsp.: 5 + 3
Das dann bei button1_Click in eine Nummer zu konvertieren geht natürlich nicht.

Grüße

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

16.806 Beiträge seit 2008
vor 5 Jahren

Wenn ich mir das ansehe:

  
textBox1.Text = textBox1.Text.Remove(0, countspaces);  
  

weiß ich sofort, daß du einfach nur die Leerzeichen entfernen möchtest

Nur, dass es einfach den kompletten String löscht.

countspaces ist hier die Länge des Strings (zumindest beim ersten Durchlauf).
Remove löscht damit von Position 0 bis countspaces alle Zeichen - und damit den gesamten String.

Im zweiten Durchlauf ist countspaces nicht die Länge des Strings der Textbox aus dem zweiten Durchlauf - sondern die Länge aus dem aktuellen wie auch alle vorherigen Durchläufen.
countspaces wird nirgends zurück gesetzt.

E
ExilCoder Themenstarter:in
28 Beiträge seit 2015
vor 5 Jahren

Ich hätte das evtl erklären sollen, also die idee dahinter ist

numer1 wird eingegeben, danach wird der divisor eingegeben, bevor der divisor theoretisch in die dafür vorgesehene variable gespeichert wird wird die erste nummer gespeichert nach dem druck von "+ - : *" in dem beispiel divisor gennant wird jede vom nutzer geschriebene stelle mit "countspaces" funktion gezählt also ja da werden alle bis dahin eingegebenen stellen gezählt und dann auch später gelöscht, und dannach gibt der nutzer eine neue nummer ein die nummer2 die dann mit dem click auf zeige ergebnis oder hier result in int32 convertiert werden soll und in number2 gespeichert werden soll

Ich bin neu hier, und deshalb etwas unerfahren wenn du hilfreiche Tipps bezüglich dem lernen von C# hast lass sie mich wissen !

E
ExilCoder Themenstarter:in
28 Beiträge seit 2015
vor 5 Jahren

Bessere erklärung wie mein Programm funktioniert:

!WARNING! Alle Namen der Variablen vergessen, Sie haben absolut nichts zu bedeuten !WARNING!

In diesem Programm wird später nur 0 - 9 und (- + : *) eines dieser zeichen eintippbar sein, nichts anderes, auch keine leertaste.


 public int number1;
 public string divisor;
 public int number2;

// Hier erstelle ich eine Variable die später gefüllt wird mit der anzahl an getipten nummern UND das zeichen zb. 44566+ (6)  
 public int countspaces; //check

        public int result;

I only show now one of the codes because the rest is irrelevant for what I am asking


  private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {

            char choice = 'a';

            switch (choice)
            {
                case '+':
                    number1 = Convert.ToInt32(textBox1.Text);
                    divisor = "+";
                    break;
            }

        }

my friend called me his bird died, I complete this later

Ich bin neu hier, und deshalb etwas unerfahren wenn du hilfreiche Tipps bezüglich dem lernen von C# hast lass sie mich wissen !

T
461 Beiträge seit 2013
vor 5 Jahren

🤔 🤔

Also space ist dann der falsche Ausdruck zu dem Sinn hier und die Spaghettischreibweise ist schwer zu lesen, tut mir leid 😉


textBox1.Text = textBox1.Text.Remove(0, countspaces);

countofspaces wird nie zurückgesetzt, was bedeuted, daß hier irgendwann mal eine Exception geworfen wird.

Wie schon gesagt, am Ende wirst du einen Leerstring in einen int konvertieren, was ebenfalls scheitert.

Zeig mal den aktuellen Code...

Grüße

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

E
ExilCoder Themenstarter:in
28 Beiträge seit 2015
vor 5 Jahren

habe es zum laufen gebracht, danke nochmal an alle die geposted haben -

Ich bin neu hier, und deshalb etwas unerfahren wenn du hilfreiche Tipps bezüglich dem lernen von C# hast lass sie mich wissen !