Gå til innhold

C#: Minus, gange og plusse i samme funkson.


Anbefalte innlegg

Hei. Jeg prøver å lage en funskjon som som kan minus, gange og plusse.

 

Det jeg tenkte var å få det til i samme line. Jeg har gjort det på måten under, og da må jeg ha det på 3 linjer.

 

svar = tall1 - tall2;

svar = tall1 * tall2;

svar = tall1 + tall2;

 

Jeg tenkte noe mer som dette, men vet ikke helt hvordan jeg skal få det til.

 

string pluss = "+";
svar = tall1 pluss tall2;

 

Kan noen hjelpe meg med å komme fram til det jeg prøver å oppnå? :)

Lenke til kommentar
Videoannonse
Annonse

Jeg kan bruke den måte, men tenkte mer på å få det til å skje i en linje, men en form for variabel eller noe annet som kan brukes til endre hva den skal "gjøre".

 

kan prøve med en eksempelkode. Den koden vil selvfølgelig ikke fungere.

 

string tegn = "+";
svar = num1 tegn num 2;

 

I den koden som jeg har over tenkte jeg at den skal ta num1 + num2.

Hvis "tegn = "-";" så skal den gjøre "num1 - num2".

Lenke til kommentar

Jeg kan bruke den måte, men tenkte mer på å få det til å skje i en linje, men en form for variabel eller noe annet som kan brukes til endre hva den skal "gjøre".

 

kan prøve med en eksempelkode. Den koden vil selvfølgelig ikke fungere.

 

string tegn = "+";
svar = num1 tegn num 2;

 

I den koden som jeg har over tenkte jeg at den skal ta num1 + num2.

Hvis "tegn = "-";" så skal den gjøre "num1 - num2".

 

Hei, veit ikke om jeg helt forstå spørsmålet ditt.

Du kan skrive :

  var svar4 = 52.4m + 88;

 

Eller hvis du vil ha en method som kan lese ett regnestykke fra en string kan du jo lage en extension method på string. eks:

 

 

 

class Program
{
	static void Main(string[] args)
	{
		var svar1 = "54+22".RegnUt();
		var svar2 = "155- 25,5".RegnUt();
		var svar3 = "12 * 12".RegnUt();
		Console.WriteLine(svar1);
		Console.WriteLine(svar2);
		Console.WriteLine(svar3);
		Console.ReadLine();
	}
}

public static class MyExtensions
{
	public static string RegnUt(this string regneStykke)
	{
		regneStykke = regneStykke.Replace(" ", "");
		string tall1 = "";
		bool tall1Lest = false;
		string tall2 = "";
		if (regneStykke.Contains("+"))
		{
			foreach (var item in regneStykke.ToCharArray())
			{
				if (item == '+')
				{
					tall1Lest = true;
					continue;
				}
				if (!tall1Lest)
					tall1 += item.ToString();
				else
					tall2 += item.ToString();
			}
			return (decimal.Parse(tall1) + decimal.Parse(tall2)).ToString();
		}
		if (regneStykke.Contains("-"))
		{
			foreach (var item in regneStykke.ToCharArray())
			{
				if (item == ('-'))
				{
					tall1Lest = true;
					continue;
				}
				if (!tall1Lest)
					tall1 += item.ToString();
				else
					tall2 += item.ToString();
			}
			return (decimal.Parse(tall1) - decimal.Parse(tall2)).ToString();
		}
		if (regneStykke.Contains("*"))
		{
			foreach (var item in regneStykke.ToCharArray())
			{
				if (item == ('*'))
				{
					tall1Lest = true;
					continue;
				}
				if (!tall1Lest)
					tall1 += item.ToString();
				else
					tall2 += item.ToString();
			}
			return (decimal.Parse(tall1) * decimal.Parse(tall2)).ToString();
		}
		return "???";
	}
}

 

eller som en vanlig method.

 

var svar = RegnUt("51+46");

static string RegnUt(string regneStykke)
	{
		//samme implementering som over

	}

Lenke til kommentar

Takk for svar Gitarplekter_

 

Jeg tror jeg like gjerne kan poste koden.

 

http://pastebin.com/FNXAcVnn

 

Det er det at jeg har fått en skoleoppgave å lage en kalkulator, og nå har oppgaven blitt å gjøre regne delen med funksjon istede for if, else if, else.

Funskjonen skal også gjøres på en kortest mulig måte som også er fornuftig.

Som dere sikkert har skjønt er jeg ganske ny til programmering, så det er bare å spørre hvis dere mangler informasjon.

 

Edit; Kalkulatoren er en Windows form application. Jeg har ikke lagt ut koden for den visuelle delen.

Endret av GtHoo
Lenke til kommentar

Takk for svar Gitarplekter_

 

Jeg tror jeg like gjerne kan poste koden.

 

http://pastebin.com/FNXAcVnn

 

Det er det at jeg har fått en skoleoppgave å lage en kalkulator, og nå har oppgaven blitt å gjøre regne delen med funksjon istede for if, else if, else.

Funskjonen skal også gjøres på en kortest mulig måte som også er fornuftig.

Som dere sikkert har skjønt er jeg ganske ny til programmering, så det er bare å spørre hvis dere mangler informasjon.

 

Edit; Kalkulatoren er en Windows form application. Jeg har ikke lagt ut koden for den visuelle delen.

 

Ok, hvis du legger inn overnevnte extension method så trenger du egentlig bare så mye kode:

Da reduserer du kraftig mye kode og du gjør jo utregningen på en method.

extension methoden kan du også legge i en klasse for seg sjøl og kan brukes i samme namespace.

 

 

 

public partial class Form1 : Form
   {
    public Form1()
    {
	    InitializeComponent();
    }
    private void button_Click(object sender, EventArgs e)
    {
	    Button btn = (Button)sender;
	    if (btn.Text == "=")
	    {
		    var svar = textBox1.Text.RegnUt();
		    textBox1.Text = "= " + svar;
		    return;
	    }
	    textBox1.Text += btn.Text;
    }
   }

 

 

Forutsett at du har har satt teksten til alle knappene til 1,2,3,+,-,= osv.. og alle click events rettet til samme eventhandler.

Lenke til kommentar

Regular expressions komplett eksempel:

 

using System;
using System.Numerics;
using System.Text.RegularExpressions;
namespace TestConsole
{
   class Program
   {
    private static readonly Regex operationRegex = new Regex(@"^\s*(?<OperandA>[0-9]+)\s*(?<Operator>[*/+-])\s*(?<OperandB>[0-9]+)\s*$", RegexOptions.Compiled);
    /// <summary> Calculates the result of a string with two operators, using +, -, * or / as operator.</summary>
    public static BigInteger Calculate(string input)
    {
	    if (input == null)
		    throw new ArgumentNullException("input");
	    var match = operationRegex.Match(input);
	    if (!match.Success)
		    throw new ArgumentException("Input was not in a correct format.", "input");
	    var a = BigInteger.Parse(match.Groups["OperandA"].Value);
	    var b = BigInteger.Parse(match.Groups["OperandB"].Value);
	    string op = match.Groups["Operator"].Value;
	    switch (op)
	    {
		    case "+":
			    return a + b;
		    case "-":
			    return a - b;
		    case "*":
			    return a * b;
		    case "/":
			    if (b == BigInteger.Zero)
				    throw new DivideByZeroException();
			    return a / b;
		    default:
			    throw new InvalidOperationException(string.Format("Operator {0} not supported. There is probably a mismatch between the regular expression used and the functional specification for this method.", op));
	    }
    }
    static void Main(string[] args)
    {
	    string expression = Console.ReadLine();

	    try
	    {
		    BigInteger result = Calculate(expression);
		    Console.WriteLine(result.ToString());

	    }
	    catch(Exception ex)
	    {
		    Console.WriteLine(ex.Message);
	    }
	    Console.ReadKey();
    }
   }
}

Endret av GeirGrusom
Lenke til kommentar
  • 1 måned senere...

Ville valgt en annen fremgangs måte enn det jeg fikk med meg fra de første postene. TL;DR@resten

 

Først dele alle delene opp i stykker;

 

4 + 4 * (5 + 5)

 

Blir til, i prioritert rekke følge

[0] : (5 + 5)

[1] : 4 * [0]

[2] : 4 + [1]

 

Da kan du bare bruke "RegnUt" som noen introduserte lengre oppe for å gå nedover tréet.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...