IGRODELOFF

ExplanatoryDictionary_v3

Mar 5th, 2026
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.87 KB | Gaming | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. enum MessageId
  6. {
  7.     Title,
  8.     InputPrompt,
  9.     EmptyInput,
  10.     WordNotFound,
  11.     ProgramEnded,
  12.     Border,
  13.     Header,
  14.     Help,
  15.  
  16.     Added,
  17.     AlreadyExistsUpdated,
  18.     ListEmpty,
  19.  
  20.     EnterEnglish,
  21.     EnterRussian,
  22.     InvalidAdd,
  23.  
  24.     ListTitle,
  25.  
  26.     EnterWordToDelete,
  27.     Deleted,
  28.     DeleteNotFound,
  29.  
  30.     EnterWordToEdit,
  31.     EnterNewTranslation,
  32.     Edited,
  33.     EditNotFound,
  34.     InvalidEditSame
  35. }
  36.  
  37. class Program
  38. {
  39.     private static readonly Dictionary<MessageId, string> Messages = CreateMessages();
  40.  
  41.     public static void Main()
  42.     {
  43.         Work();
  44.     }
  45.  
  46.     private static void Work()
  47.     {
  48.         Console.Clear();
  49.         Console.OutputEncoding = Encoding.UTF8;
  50.         Console.Title = Messages[MessageId.Title];
  51.  
  52.         (Dictionary<string, string> engToRus, Dictionary<string, string> rusToEng) = CreateDictionaries();
  53.  
  54.         PrintHeader();
  55.         ShowInfo(Messages[MessageId.Help]);
  56.         Console.WriteLine();
  57.  
  58.         bool isRunning = true;
  59.  
  60.         while (isRunning)
  61.         {
  62.             string input = RequestInput();
  63.  
  64.             if (IsExitCommand(input))
  65.             {
  66.                 ShowInfo(Messages[MessageId.ProgramEnded]);
  67.                 isRunning = false;
  68.                 continue;
  69.             }
  70.  
  71.             if (IsListCommand(input))
  72.             {
  73.                 PrintList(engToRus);
  74.                 continue;
  75.             }
  76.  
  77.             if (IsAddCommand(input))
  78.             {
  79.                 HandleAdd(engToRus, rusToEng);
  80.                 continue;
  81.             }
  82.  
  83.             if (IsDeleteCommand(input))
  84.             {
  85.                 HandleDelete(engToRus, rusToEng);
  86.                 continue;
  87.             }
  88.  
  89.             if (IsEditCommand(input))
  90.             {
  91.                 HandleEdit(engToRus, rusToEng);
  92.                 continue;
  93.             }
  94.  
  95.             ProcessQuery(engToRus, rusToEng, input);
  96.         }
  97.     }
  98.  
  99.     private static Dictionary<MessageId, string> CreateMessages()
  100.     {
  101.         return new Dictionary<MessageId, string>
  102.         {
  103.             { MessageId.Title, "ENG ⇄ RUS Dictionary" },
  104.  
  105.             {
  106.                 MessageId.InputPrompt,
  107.                 "Введите слово или команду (add/edit/delete/list/exit | добавить/редактировать/удалить/список/выход): "
  108.             },
  109.  
  110.             { MessageId.EmptyInput, "Пустой ввод. Попробуйте снова." },
  111.             { MessageId.WordNotFound, "Слово \"{0}\" не найдено в словаре." },
  112.             { MessageId.ProgramEnded, "Программа завершена." },
  113.             { MessageId.Border, "======================================" },
  114.             { MessageId.Header, "        ENG ⇄ RUS Dictionary          " },
  115.             { MessageId.ListTitle, "Список слов (ENG → RUS):" },
  116.  
  117.             {
  118.                 MessageId.Help,
  119.                 "Команды:\n" +
  120.                 "  add / добавить            — добавить пару слов\n" +
  121.                 "  edit / редактировать      — изменить перевод\n" +
  122.                 "  delete / удалить          — удалить слово\n" +
  123.                 "  list / список             — показать все слова\n" +
  124.                 "  exit / выход              — выйти\n" +
  125.                 "Можно также просто вводить слово для перевода."
  126.             },
  127.  
  128.             { MessageId.Added, "Пара добавлена." },
  129.             { MessageId.AlreadyExistsUpdated, "Слово/перевод уже существовали — запись обновлена." },
  130.             { MessageId.ListEmpty, "Словарь пуст." },
  131.  
  132.             { MessageId.EnterEnglish, "Введите английское слово: " },
  133.             { MessageId.EnterRussian, "Введите русский перевод: " },
  134.             { MessageId.InvalidAdd, "Некорректная пара (слова совпадают)." },
  135.  
  136.             { MessageId.EnterWordToDelete, "Введите слово для удаления (ENG или RUS): " },
  137.             { MessageId.Deleted, "Удалено: {0}" },
  138.             { MessageId.DeleteNotFound, "Не найдено для удаления: \"{0}\"" },
  139.  
  140.             { MessageId.EnterWordToEdit, "Введите слово для редактирования (ENG или RUS): " },
  141.             { MessageId.EnterNewTranslation, "Введите новый перевод: " },
  142.             { MessageId.Edited, "Обновлено: {0} → {1}" },
  143.             { MessageId.EditNotFound, "Не найдено для редактирования: \"{0}\"" },
  144.             { MessageId.InvalidEditSame, "Некорректно: слово и перевод совпадают." }
  145.         };
  146.     }
  147.  
  148.     private static (Dictionary<string, string> engToRus, Dictionary<string, string> rusToEng) CreateDictionaries()
  149.     {
  150.         var engToRus = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
  151.         var rusToEng = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
  152.  
  153.         var pairs = new (string Eng, string Rus)[]
  154.         {
  155.             ("apple", "яблоко"),
  156.             ("book", "книга"),
  157.             ("car", "машина"),
  158.             ("house", "дом"),
  159.             ("computer", "компьютер")
  160.         };
  161.  
  162.         foreach (var (eng, rus) in pairs)
  163.         {
  164.             engToRus[eng] = rus;
  165.             rusToEng[rus] = eng;
  166.         }
  167.  
  168.         return (engToRus, rusToEng);
  169.     }
  170.  
  171.     private static string RequestInput()
  172.     {
  173.         string? input;
  174.         bool isValid;
  175.  
  176.         do
  177.         {
  178.             Console.Write(Messages[MessageId.InputPrompt]);
  179.             input = Console.ReadLine();
  180.  
  181.             isValid = !string.IsNullOrWhiteSpace(input);
  182.  
  183.             if (!isValid)
  184.             {
  185.                 ShowWarning(Messages[MessageId.EmptyInput]);
  186.                 Console.WriteLine();
  187.             }
  188.  
  189.         } while (!isValid);
  190.  
  191.         return input!.Trim();
  192.     }
  193.  
  194.     private static string RequestNonEmpty(string prompt)
  195.     {
  196.         string? input;
  197.  
  198.         do
  199.         {
  200.             Console.Write(prompt);
  201.             input = Console.ReadLine();
  202.  
  203.             if (string.IsNullOrWhiteSpace(input))
  204.                 ShowWarning(Messages[MessageId.EmptyInput]);
  205.  
  206.         } while (string.IsNullOrWhiteSpace(input));
  207.  
  208.         return input.Trim();
  209.     }
  210.  
  211.     private static void ProcessQuery(
  212.         Dictionary<string, string> engToRus,
  213.         Dictionary<string, string> rusToEng,
  214.         string input)
  215.     {
  216.         bool isFound = TryFindTranslation(engToRus, rusToEng, input, out string result);
  217.  
  218.         if (isFound)
  219.             ShowSuccess(result);
  220.         else
  221.             ShowError(string.Format(Messages[MessageId.WordNotFound], input));
  222.  
  223.         Console.WriteLine();
  224.     }
  225.  
  226.     private static bool TryFindTranslation(
  227.         Dictionary<string, string> engToRus,
  228.         Dictionary<string, string> rusToEng,
  229.         string input,
  230.         out string result)
  231.     {
  232.         if (engToRus.TryGetValue(input, out string russianWord))
  233.         {
  234.             result = input + " → " + russianWord;
  235.             return true;
  236.         }
  237.  
  238.         if (rusToEng.TryGetValue(input, out string englishWord))
  239.         {
  240.             result = input + " → " + englishWord;
  241.             return true;
  242.         }
  243.  
  244.         result = string.Empty;
  245.         return false;
  246.     }
  247.  
  248.     private static bool IsAddCommand(string input) =>
  249.         input.Equals("add", StringComparison.OrdinalIgnoreCase) ||
  250.         input.Equals("добавить", StringComparison.OrdinalIgnoreCase);
  251.  
  252.     private static bool IsListCommand(string input) =>
  253.         input.Equals("list", StringComparison.OrdinalIgnoreCase) ||
  254.         input.Equals("список", StringComparison.OrdinalIgnoreCase);
  255.  
  256.     private static bool IsDeleteCommand(string input) =>
  257.         input.Equals("delete", StringComparison.OrdinalIgnoreCase) ||
  258.         input.Equals("удалить", StringComparison.OrdinalIgnoreCase);
  259.  
  260.     private static bool IsEditCommand(string input) =>
  261.         input.Equals("edit", StringComparison.OrdinalIgnoreCase) ||
  262.         input.Equals("редактировать", StringComparison.OrdinalIgnoreCase);
  263.  
  264.     private static bool IsExitCommand(string input) =>
  265.         input.Equals("exit", StringComparison.OrdinalIgnoreCase) ||
  266.         input.Equals("выход", StringComparison.OrdinalIgnoreCase);
  267.  
  268.     private static void HandleAdd(
  269.         Dictionary<string, string> engToRus,
  270.         Dictionary<string, string> rusToEng)
  271.     {
  272.         string eng = RequestNonEmpty(Messages[MessageId.EnterEnglish]);
  273.         string rus = RequestNonEmpty(Messages[MessageId.EnterRussian]);
  274.  
  275.         if (eng.Equals(rus, StringComparison.OrdinalIgnoreCase))
  276.         {
  277.             ShowError(Messages[MessageId.InvalidAdd]);
  278.             Console.WriteLine();
  279.             return;
  280.         }
  281.  
  282.         bool hadEng = engToRus.ContainsKey(eng);
  283.         bool hadRus = rusToEng.ContainsKey(rus);
  284.  
  285.         if (hadEng)
  286.         {
  287.             string oldRus = engToRus[eng];
  288.  
  289.             if (!oldRus.Equals(rus, StringComparison.OrdinalIgnoreCase))
  290.                 rusToEng.Remove(oldRus);
  291.         }
  292.  
  293.         if (hadRus)
  294.         {
  295.             string oldEng = rusToEng[rus];
  296.  
  297.             if (!oldEng.Equals(eng, StringComparison.OrdinalIgnoreCase))
  298.                 engToRus.Remove(oldEng);
  299.         }
  300.  
  301.         engToRus[eng] = rus;
  302.         rusToEng[rus] = eng;
  303.  
  304.         if (hadEng || hadRus)
  305.             ShowWarning(Messages[MessageId.AlreadyExistsUpdated]);
  306.         else
  307.             ShowSuccess(Messages[MessageId.Added]);
  308.  
  309.         Console.WriteLine();
  310.     }
  311.  
  312.     private static void HandleDelete(
  313.         Dictionary<string, string> engToRus,
  314.         Dictionary<string, string> rusToEng)
  315.     {
  316.         string word = RequestNonEmpty(Messages[MessageId.EnterWordToDelete]);
  317.  
  318.         if (engToRus.TryGetValue(word, out string rus))
  319.         {
  320.             engToRus.Remove(word);
  321.             rusToEng.Remove(rus);
  322.  
  323.             ShowSuccess(string.Format(Messages[MessageId.Deleted], word));
  324.             Console.WriteLine();
  325.             return;
  326.         }
  327.  
  328.         if (rusToEng.TryGetValue(word, out string eng))
  329.         {
  330.             rusToEng.Remove(word);
  331.             engToRus.Remove(eng);
  332.  
  333.             ShowSuccess(string.Format(Messages[MessageId.Deleted], word));
  334.             Console.WriteLine();
  335.             return;
  336.         }
  337.  
  338.         ShowError(string.Format(Messages[MessageId.DeleteNotFound], word));
  339.         Console.WriteLine();
  340.     }
  341.  
  342.     private static void HandleEdit(
  343.         Dictionary<string, string> engToRus,
  344.         Dictionary<string, string> rusToEng)
  345.     {
  346.         string word = RequestNonEmpty(Messages[MessageId.EnterWordToEdit]);
  347.  
  348.         if (engToRus.TryGetValue(word, out string oldRus))
  349.         {
  350.             string newRus = RequestNonEmpty(Messages[MessageId.EnterNewTranslation]);
  351.  
  352.             if (word.Equals(newRus, StringComparison.OrdinalIgnoreCase))
  353.             {
  354.                 ShowError(Messages[MessageId.InvalidEditSame]);
  355.                 Console.WriteLine();
  356.                 return;
  357.             }
  358.  
  359.             rusToEng.Remove(oldRus);
  360.  
  361.             if (rusToEng.TryGetValue(newRus, out string otherEng) &&
  362.                 !otherEng.Equals(word, StringComparison.OrdinalIgnoreCase))
  363.             {
  364.                 engToRus.Remove(otherEng);
  365.             }
  366.  
  367.             engToRus[word] = newRus;
  368.             rusToEng[newRus] = word;
  369.  
  370.             ShowSuccess(string.Format(Messages[MessageId.Edited], word, newRus));
  371.             Console.WriteLine();
  372.             return;
  373.         }
  374.  
  375.         if (rusToEng.TryGetValue(word, out string oldEng))
  376.         {
  377.             string newEng = RequestNonEmpty(Messages[MessageId.EnterNewTranslation]);
  378.  
  379.             if (word.Equals(newEng, StringComparison.OrdinalIgnoreCase))
  380.             {
  381.                 ShowError(Messages[MessageId.InvalidEditSame]);
  382.                 Console.WriteLine();
  383.                 return;
  384.             }
  385.  
  386.             engToRus.Remove(oldEng);
  387.  
  388.             if (engToRus.TryGetValue(newEng, out string otherRus) &&
  389.                 !otherRus.Equals(word, StringComparison.OrdinalIgnoreCase))
  390.             {
  391.                 rusToEng.Remove(otherRus);
  392.             }
  393.  
  394.             rusToEng[word] = newEng;
  395.             engToRus[newEng] = word;
  396.  
  397.             ShowSuccess(string.Format(Messages[MessageId.Edited], word, newEng));
  398.             Console.WriteLine();
  399.             return;
  400.         }
  401.  
  402.         ShowError(string.Format(Messages[MessageId.EditNotFound], word));
  403.         Console.WriteLine();
  404.     }
  405.  
  406.     private static void PrintList(Dictionary<string, string> engToRus)
  407.     {
  408.         if (engToRus.Count == 0)
  409.         {
  410.             ShowWarning(Messages[MessageId.ListEmpty]);
  411.             Console.WriteLine();
  412.             return;
  413.         }
  414.  
  415.         ShowHeader(Messages[MessageId.Border]);
  416.         ShowHeader(Messages[MessageId.ListTitle]);
  417.         ShowHeader(Messages[MessageId.Border]);
  418.  
  419.         foreach (var pair in engToRus)
  420.         {
  421.             Console.WriteLine($"{pair.Key} → {pair.Value}");
  422.         }
  423.  
  424.         Console.WriteLine();
  425.     }
  426.  
  427.     private static void PrintHeader()
  428.     {
  429.         ShowHeader(Messages[MessageId.Border]);
  430.         ShowHeader(Messages[MessageId.Header]);
  431.         ShowHeader(Messages[MessageId.Border]);
  432.         Console.WriteLine();
  433.     }
  434.  
  435.     private static void Display(string message, ConsoleColor color)
  436.     {
  437.         Console.ForegroundColor = color;
  438.         Console.WriteLine(message);
  439.         Console.ResetColor();
  440.     }
  441.  
  442.     private static void ShowHeader(string message) => Display(message, ConsoleColor.Cyan);
  443.     private static void ShowSuccess(string message) => Display("✔ " + message, ConsoleColor.Green);
  444.     private static void ShowError(string message) => Display("✘ " + message, ConsoleColor.Red);
  445.     private static void ShowWarning(string message) => Display("! " + message, ConsoleColor.Yellow);
  446.     private static void ShowInfo(string message) => Display(message, ConsoleColor.Cyan);
  447. }
Advertisement
Add Comment
Please, Sign In to add comment