Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- namespace ConsoleApplication2
- {
- class Program
- {
- static void Main()
- {
- Console.WriteLine("Введите выражение вида: \"A^a+B^b\".");
- Console.WriteLine("Где A и B - числа, a и b - системы исчисления, + - действие (+,-,*,/)");
- while (true)
- {
- int[] ops = { 0, 1, 2, 3 }; //номера действий
- string[] op_names = { "Сложение", "Вычитание", "Умножение", "Деление" };//названия действий
- char[] operations = { '+', '-', '*', '/' };//знаки действий
- int operation = -1;//выбранное действие
- int syst_i = -1;//номер переменной в массиве syst[]
- int[] syst = { -1, -1 };//система исчисления для 1 и 2-го
- int middle = -1, end;
- int number1end = -1, number2end = -1;
- int number1, number2;
- Console.Title = "Calculator";
- Console.WriteLine("");
- string text = Console.ReadLine();
- end = text.Length;
- for (int i = 0; i < text.Length; i++)
- {
- char symbol = text[i];
- for (int o = 0; o < 4; o++)
- {
- if (symbol.Equals(operations[o]))
- {
- if (operation == -1)
- {
- operation = ops[o];
- Console.WriteLine("Выбрано действие: " + op_names[o]);
- Console.WriteLine();
- middle = i;
- break;
- }
- else { ShowError("Error: не больше одного действия"); }
- }
- }
- }
- if (operation == -1) { ShowError("Error: не найден знак действия"); }
- if (middle == -1) { ShowError("Error: не найден знак действия0"); }
- for (int i = 0; i < text.Length; i++)
- {
- char symbol = text[i];
- if (symbol.Equals('^'))
- {
- syst_i++;
- if (syst_i == 0)
- {
- if (Int32.TryParse(CutStr(text, i + 1, middle), out syst[syst_i])) number1end = i - 1;
- }
- else if (syst_i == 1)
- {
- if(Int32.TryParse(CutStr(text, i + 1, end), out syst[syst_i])) number2end = i - 1;
- }
- }
- }
- if (number1end == -1 || number2end == -1) { ShowError("Error: невозможно найти начальную и конечную позицию одного из чисел"); }
- if (syst_i != 1) { ShowError("Error: неверно указаны системы исчисления, или их больше двух"); }
- if (syst[0] > 16 || syst[1] > 16) { ShowError("Error: система исчисления от 2 до 16 включительно"); }
- number1 = ToDec(CutStr(text, 0, number1end + 1), syst[0]);
- number2 = ToDec(CutStr(text, middle + 1, number2end + 1), syst[1]);
- //Console.WriteLine(number1);
- //Console.WriteLine(number2);
- switch (operation)
- {
- case 0:
- Console.WriteLine("Ответ("+syst[0]+"): " + ToAny(number1+number2, syst[0]));
- Console.WriteLine("Ответ: " + number1.ToString() + "+" + number2.ToString() + "=" + (number1 + number2).ToString());
- break;
- case 1:
- Console.WriteLine("Ответ("+syst[0]+"): " + ToAny(number1 - number2, syst[0]));
- Console.WriteLine("Ответ: " + number1.ToString() + "-" + number2.ToString() + "=" + (number1 - number2).ToString());
- break;
- case 2:
- Console.WriteLine("Ответ("+syst[0]+"): " + ToAny(number1 * number2, syst[0]));
- Console.WriteLine("Ответ: " + number1.ToString() + "*" + number2.ToString() + "=" + (number1 * number2).ToString());
- break;
- case 3:
- Console.WriteLine("Ответ(" + syst[0] + "): " + ToAny(number1 / number2, syst[0]) + " + остаток: " + ToAny(number1 % number2, syst[0]));
- Console.WriteLine("Ответ: " + number1.ToString() + "/" + number2.ToString() +"="+(number1 / number2).ToString() + " + остаток: " + (number1 % number2).ToString());
- break;
- }
- Console.WriteLine("");
- Console.Write("Продолжить (y / any key)? ");
- char tt = Console.ReadKey().KeyChar;
- Console.WriteLine();
- if (tt == 'y') { Console.WriteLine("Введите новый пример:"); }
- else { break; }
- }
- }
- static string CutStr(string str, int start, int end)
- {
- if (end - start > 100) { ShowError("Error: не больше 100 символов"); }
- char[] toconvert = new char[end - start];
- int o = 0;
- for (int i = start; i < end; i++)
- {
- char symb = str[i];
- toconvert[o] = symb;
- o++;
- }
- return new string(toconvert);
- }
- static string ToAny(int a, int b)
- {
- char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F' };
- int[] numbers = {10,11,12,13,14,15,16};
- int c;
- string text = "";
- int octatok = -1;
- while (true)
- {
- c = a / b;
- octatok = a % b;
- a = c;
- if (octatok < 10)
- {
- text = octatok.ToString() + text;
- }
- else
- {
- for (int i = 0; i < letters.Length; i++)
- {
- if (numbers[i] == octatok)
- {
- text = letters[i].ToString() + text;
- }
- }
- }
- if (c == 0) { break; }
- }
- return text;
- }
- static int ToDec(string str, int syst)
- {
- int ret = 0;
- int num = 0;
- char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F' };
- for (int i = 0; i < str.Length; i++)
- {
- char symb = str[i];
- if (!Int32.TryParse(Convert.ToString(symb), out num))
- {
- for (int o = 0; o < letters.Length; o++)
- {
- if (symb.Equals(letters[o]))
- {
- num = o + 10;
- break;
- }
- else
- {
- if (o == 6) { ShowError("Error: в одном из чисел присутствует неизвестный символ"); break; }
- }
- }
- }
- ret = (ret + num) * syst;
- }
- return (ret / syst);
- }
- static void ShowError(string err)
- {
- Console.WriteLine(err);
- Console.Write("Для выхода нажмите любую клавишу...");
- Console.ReadKey();
- Console.WriteLine();
- Console.WriteLine("Выходим...");
- System.Environment.Exit(1);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement