Advertisement
akzolt

Operations with different systems

Oct 31st, 2014
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.42 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7.  
  8. namespace ConsoleApplication2
  9. {
  10.     class Program
  11.     {
  12.         static void Main()
  13.         {
  14.             Console.WriteLine("Введите выражение вида: \"A^a+B^b\".");
  15.             Console.WriteLine("Где A и B - числа, a и b - системы исчисления, + - действие (+,-,*,/)");
  16.             while (true)
  17.             {
  18.                 int[] ops = { 0, 1, 2, 3 }; //номера действий
  19.                 string[] op_names = { "Сложение", "Вычитание", "Умножение", "Деление" };//названия действий
  20.                 char[] operations = { '+', '-', '*', '/' };//знаки действий
  21.                 int operation = -1;//выбранное действие
  22.                 int syst_i = -1;//номер переменной в массиве syst[]
  23.                 int[] syst = { -1, -1 };//система исчисления для 1 и 2-го
  24.                 int middle = -1, end;
  25.                 int number1end = -1, number2end = -1;
  26.                 int number1, number2;
  27.                 Console.Title = "Calculator";
  28.                 Console.WriteLine("");
  29.                 string text = Console.ReadLine();
  30.                 end = text.Length;
  31.                 for (int i = 0; i < text.Length; i++)
  32.                 {
  33.                     char symbol = text[i];
  34.                     for (int o = 0; o < 4; o++)
  35.                     {
  36.                         if (symbol.Equals(operations[o]))
  37.                         {
  38.                             if (operation == -1)
  39.                             {
  40.                                 operation = ops[o];
  41.                                 Console.WriteLine("Выбрано действие: " + op_names[o]);
  42.                                 Console.WriteLine();
  43.                                 middle = i;
  44.                                 break;
  45.                             }
  46.                             else { ShowError("Error: не больше одного действия"); }
  47.                         }
  48.                     }
  49.                 }
  50.                 if (operation == -1) { ShowError("Error: не найден знак действия"); }
  51.                 if (middle == -1) { ShowError("Error: не найден знак действия0"); }
  52.                 for (int i = 0; i < text.Length; i++)
  53.                 {
  54.                     char symbol = text[i];
  55.                     if (symbol.Equals('^'))
  56.                     {
  57.                         syst_i++;
  58.                         if (syst_i == 0)
  59.                         {
  60.  
  61.                             if (Int32.TryParse(CutStr(text, i + 1, middle), out syst[syst_i])) number1end = i - 1;
  62.  
  63.                         }
  64.                         else if (syst_i == 1)
  65.                         {
  66.                             if(Int32.TryParse(CutStr(text, i + 1, end), out syst[syst_i])) number2end = i - 1;
  67.                         }
  68.                     }
  69.                 }
  70.                 if (number1end == -1 || number2end == -1) { ShowError("Error: невозможно найти начальную и конечную позицию одного из чисел"); }
  71.                 if (syst_i != 1) { ShowError("Error: неверно указаны системы исчисления, или их больше двух"); }
  72.                 if (syst[0] > 16 || syst[1] > 16) { ShowError("Error: система исчисления от 2 до 16 включительно"); }
  73.                 number1 = ToDec(CutStr(text, 0, number1end + 1), syst[0]);
  74.                 number2 = ToDec(CutStr(text, middle + 1, number2end + 1), syst[1]);
  75.                 //Console.WriteLine(number1);
  76.                 //Console.WriteLine(number2);
  77.                 switch (operation)
  78.                 {
  79.                     case 0:
  80.                         Console.WriteLine("Ответ("+syst[0]+"): " + ToAny(number1+number2, syst[0]));
  81.                         Console.WriteLine("Ответ: " + number1.ToString() + "+" + number2.ToString() + "=" + (number1 + number2).ToString());
  82.                         break;
  83.                     case 1:
  84.                         Console.WriteLine("Ответ("+syst[0]+"): " + ToAny(number1 - number2, syst[0]));
  85.                         Console.WriteLine("Ответ: " + number1.ToString() + "-" + number2.ToString() + "=" + (number1 - number2).ToString());
  86.                         break;
  87.                     case 2:
  88.                         Console.WriteLine("Ответ("+syst[0]+"): " + ToAny(number1 * number2, syst[0]));
  89.                         Console.WriteLine("Ответ: " + number1.ToString() + "*" + number2.ToString() + "=" + (number1 * number2).ToString());
  90.                         break;
  91.                     case 3:
  92.                         Console.WriteLine("Ответ(" + syst[0] + "): " + ToAny(number1 / number2, syst[0]) + " + остаток: " + ToAny(number1 % number2, syst[0]));
  93.                         Console.WriteLine("Ответ: " + number1.ToString() + "/" + number2.ToString() +"="+(number1 / number2).ToString() + " + остаток: " + (number1 % number2).ToString());
  94.                         break;
  95.                 }
  96.                 Console.WriteLine("");
  97.                 Console.Write("Продолжить (y / any key)? ");
  98.                 char tt = Console.ReadKey().KeyChar;
  99.                 Console.WriteLine();
  100.                 if (tt == 'y') { Console.WriteLine("Введите новый пример:"); }
  101.                 else { break; }
  102.             }
  103.         }
  104.         static string CutStr(string str, int start, int end)
  105.         {
  106.             if (end - start > 100) { ShowError("Error: не больше 100 символов"); }
  107.             char[] toconvert = new char[end - start];
  108.             int o = 0;
  109.             for (int i = start; i < end; i++)
  110.             {
  111.                     char symb = str[i];
  112.                     toconvert[o] = symb;
  113.                     o++;
  114.             }
  115.             return new string(toconvert);
  116.         }
  117.         static string ToAny(int a, int b)
  118.         {
  119.             char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F' };
  120.             int[] numbers = {10,11,12,13,14,15,16};
  121.             int c;
  122.             string text = "";
  123.             int octatok = -1;
  124.             while (true)
  125.             {
  126.                 c = a / b;
  127.                 octatok = a % b;
  128.                 a = c;
  129.                 if (octatok < 10)
  130.                 {
  131.                     text = octatok.ToString() + text;
  132.                 }
  133.                 else
  134.                 {
  135.                     for (int i = 0; i < letters.Length; i++)
  136.                     {
  137.                         if (numbers[i] == octatok)
  138.                         {
  139.                             text = letters[i].ToString() + text;
  140.                         }
  141.                     }
  142.                 }
  143.                 if (c == 0) { break; }
  144.  
  145.             }
  146.             return text;
  147.         }
  148.         static int ToDec(string str, int syst)
  149.         {
  150.             int ret = 0;
  151.             int num = 0;
  152.             char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F' };
  153.             for (int i = 0; i < str.Length; i++)
  154.             {
  155.                 char symb = str[i];
  156.                 if (!Int32.TryParse(Convert.ToString(symb), out num))
  157.                 {
  158.                     for (int o = 0; o < letters.Length; o++)
  159.                     {
  160.                         if (symb.Equals(letters[o]))
  161.                         {
  162.                             num = o + 10;
  163.                             break;
  164.                         }
  165.                         else
  166.                         {
  167.                             if (o == 6) { ShowError("Error: в одном из чисел присутствует неизвестный символ"); break; }
  168.                         }
  169.                     }
  170.                 }
  171.                 ret = (ret + num) * syst;
  172.             }
  173.             return (ret / syst);
  174.         }
  175.  
  176.         static void ShowError(string err)
  177.         {
  178.                 Console.WriteLine(err);
  179.                 Console.Write("Для выхода нажмите любую клавишу...");
  180.                 Console.ReadKey();
  181.                 Console.WriteLine();
  182.                 Console.WriteLine("Выходим...");
  183.                 System.Environment.Exit(1);
  184.         }
  185.     }
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement