Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
Mifrilfortik
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 15
1

Консольный калькулятор в одну строку (парсинг выражения)

10.08.2014, 09:16. Просмотров 5417. Ответов 13
Метки нет (Все метки)

Товарищи программисты, помогите реализовать задачу. Вводится в консоли арифметическое выражение в виде: Все данные вводятся в одну строку и после = выдача результата или после нажатия ентера после равно без разницы, главное чтобы выражение в одну строку было. В несколько строк легко в одну ума не приложу как написать.(( типа мини калькулятор.
A*B=
Вывести его значение.

Начальные данные: арифметическое выражение с символами математических операций.
Вывод результата: одно целое число - решение арифметического выражения.

Добавлено через 7 минут
Ах, да, и еще нельзя юзать циклы и все такое. switch тоже нельзя
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2014, 09:16
Ответы с готовыми решениями:

Консольный калькулятор: ввод данных в строку
Я ща изучаю консоль С#, написал калькулятор, но получилось не так как я хотел...

Калькулятор в одну строку
Добрый день, решил создать калькулятор вроде бы все просто, но такая реализация...

Консольный калькулятор
калькулятор консольный на C# когда вводится выражение к примеру 5-4*(4-3) оно...

Консольный калькулятор
В общем, мне надо написать программу "Консольный калькулятор на с#". А я даже...

Консольный калькулятор
Всем привет! Знаю эта тема уже застарела но все таки... Я в С# новичёк, и вот...

13
I2um1
Злой няш
1407 / 1105 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
10.08.2014, 10:57 2
Без циклов и switch'ей, умножать можно сколько угодно раз:
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
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
private static void Main()
{
    double result = double.NaN;
    string number = string.Empty;
    var op = (char)0;
    checkKey:
    char symbol = Console.ReadKey(false).KeyChar;
    if (char.IsDigit(symbol))
    {
        number += symbol;
    }
    else if (symbol == '*' && number != string.Empty)
    {
        if (double.IsNaN(result))
        {
            result = double.Parse(number);
        }
        else if (op == '*')
        {
            result *= double.Parse(number);
        }
 
        op = '*';
        number = string.Empty;
    }
    else if (symbol == '=')
    {
        if (number != string.Empty)
        {
            if (op == '*')
            {
                result *= double.Parse(number);
            }
            else
            {
                result = double.Parse(number);
            }
        }
        else if (op == '*')
        {
            result *= result;
        }
 
        goto printResult;
    }
    goto checkKey;
 
    printResult:
    Console.Write(result);
    Console.WriteLine();
    Console.ReadKey(true);
}
Добавлено через 5 минут
P.S. Могу сделать без if'ов и реализовать Backspace, но тебе решение не понравится.
0
XRoy
861 / 711 / 305
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
10.08.2014, 11:38 3
Mifrilfortik,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void Main(string[] args)
        {
            string s = "10*16=";
            
            int pos = s.IndexOfAny(new char[]{ '*', '/', '+', '-'});
            var a = Int32.Parse(s.Substring(0, pos));
            var b = Int32.Parse(s.Substring(pos+1, s.IndexOf('=') - 1 - pos));
            
            s += (a*b).ToString();
            
            Console.WriteLine(s);
            
            Console.ReadLine();
        }
0
sk007
Life Builder
414 / 414 / 341
Регистрация: 12.01.2011
Сообщений: 1,521
Завершенные тесты: 6
10.08.2014, 12:20 4
Можно и так
C#
1
2
string res = Regex.Replace("30*2", @"(\d+?)\*(\d+?)", m => (int.Parse(m.Groups[1].Value)*int.Parse(m.Groups[2].Value)).ToString());
Console.WriteLine(res);
0
Mifrilfortik
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 15
10.08.2014, 15:32  [ТС] 5
Ребята, спасибо конечно, но не одна из них не работает правильно. Там подразумевается не только умножение, а любое арифметическое действие, те - + /.
0
I2um1
Злой няш
1407 / 1105 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
10.08.2014, 16:51 6
Цитата Сообщение от Mifrilfortik Посмотреть сообщение
но не одна из них не работает правильно
Цитата Сообщение от Mifrilfortik Посмотреть сообщение
Там подразумевается не только умножение
Консольный калькулятор в одну строку (парсинг выражения)
0
rattrapper
foo();
864 / 568 / 221
Регистрация: 03.07.2013
Сообщений: 1,547
Записей в блоге: 2
10.08.2014, 17:24 7
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Mifrilfortik,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var funcs = new Dictionary<char, Func<double, double, double>>
{
    {'+', (a, b) => a + b},
    {'-', (a, b) => a - b},
    {'*', (a, b) => a*b},
    {'/', (a, b) => a/b}
};
var input = Console.ReadLine().Replace("=", "");
var nums = input.Split(funcs.Keys.ToArray())
    .Select(double.Parse)
    .ToArray();
char @operator = funcs.Keys.First(input.Contains);
var result = funcs[@operator](nums[0], nums[1]);
Console.WriteLine(result);
Console.ReadKey();
10
some_name
Вежливость-главное оружие
227 / 226 / 86
Регистрация: 19.02.2013
Сообщений: 1,441
10.08.2014, 17:41 8
rattrapper, покажите свои using-и
0
rattrapper
foo();
864 / 568 / 221
Регистрация: 03.07.2013
Сообщений: 1,547
Записей в блоге: 2
10.08.2014, 17:54 9
some_name, без проблем:
C#
1
2
3
using System;
using System.Collections.Generic;
using System.Linq;
0
some_name
Вежливость-главное оружие
227 / 226 / 86
Регистрация: 19.02.2013
Сообщений: 1,441
10.08.2014, 18:00 10
rattrapper, довольно локаничное красивое решение.
0
tranquil
51 / 51 / 10
Регистрация: 26.09.2013
Сообщений: 277
10.08.2014, 19:27 11
rattrapper, идею про калькулятор с помощью делегатов от http://habrahabr.ru/post/143925/ сюда взяли? или сами придумали?
0
rattrapper
foo();
864 / 568 / 221
Регистрация: 03.07.2013
Сообщений: 1,547
Записей в блоге: 2
10.08.2014, 19:33 12
tranquil, сам, честно-честно. Хотя мой код невероятно похож на приведенный в статье. Но я раньше писал полноценный текстовый калькулятор. С начала думал провернуть с регулярками, а когда понял делегаты, то код стал таким
0
rutelun
147 / 73 / 17
Регистрация: 31.05.2014
Сообщений: 215
10.08.2014, 19:59 13
rattrapper,

Не по теме:

есть еще один очень хитрый метод - передача строки в VBA. Только я что-то никак не могу найти способ которым я это раньше делал(на VB.Net 2-3 действия, на C# - 6-7)

1
tranquil
10.08.2014, 20:03     Консольный калькулятор в одну строку (парсинг выражения)
  #14

Не по теме:

rattrapper, мне просто интересно стало :) просто не каждый до такого додумается,для меня было приятным удивлением, данное применение делегатов. У вас знаний по-больше,вы и сами додумались в ходе решения задачи. А идея с регулярными, мне понравилась, надо будет попробовать:)

0
10.08.2014, 20:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2014, 20:03
Привет! Вот еще темы с ответами:

Простой консольный калькулятор
Задание такое: Реализовать усовершенствованный консольный арифметический...

Усовершенствованный консольный арифметический калькулятор
Люди помогите Пж. Реализовать усовершенствованный консольный арифметический...

Консольный мини-калькулятор с паролем
Создайте консольное приложение. В начале работы производите запрос пароля, если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru