Условие задачи
На входе программа получает строку любого вида, а на выход она выдает строку, в который все символы заменены на:
«-», если данный символ встречается только один раз в оригинальной строке;
«+», если символ встречается более одного раза.
При установлении факта дублирования символов следует игнорировать их регистр. Например:
Входные данные / Результат
«din» «---» «recede» «-+-+-+» «Success» «+-++-++» «erpr» «-+-+»
Решение
Разобьем программу на блоки; 1 — ввод строки, 2 — перевод символов в заглавные (русские буквы также переводит), 3 — формирование массива счетчиков различных символов (с использованием подпрограммы IsChar), 4 — строка результата с заменой символов на «+» или «-» , 5 — вывод.
Подпрограмма IsChar, получая на вход с1, cow, k(где k — число различных букв — размерность cow), возвращает либо номер элемента массива cow, в котором уже есть символ c1, либо -1, если его нет. При вызове ее в 1 цикле результат используется для формирования массива cow, во 2 цикле — для замены символа тем или иным знаком. Частотность повторения символов содержится в массиве cow из k элементов (символ/число вхождений). Другой вариант решения подобной задачи (для расшифровки сообщений) смотрите здесь.
Программный код:
using System; namespace Brackets { public struct CN { public char c; public int n; } class Program { static void Main(string[] args) { Console.WriteLine("Enter string:"); string s = Console.ReadLine(); s = s.ToUpper(); // в верхний регистр CN[] cow = new CN[s.Length]; // счетчик "Символ - количество" // начало подсчета int k = 0; // число различных символов в строке (k+1) int g; cow[k].c = s[0]; cow[k].n = 1; // по остальным, кроме 0-го символа for (int i=1; i < s.Length; i++) { g = IsChar(s[i], cow, k); if (g >= 0) { cow[g].n++; } else { k++; cow[k].c = s[i]; cow[k].n = 1; } } // строка из скобок - результат string s1 = ""; for (int i = 0; i < s.Length; i++) { g = IsChar(s[i], cow, k); if (cow[g].n == 1) s1 += "-"; else s1 += "+"; } Console.WriteLine(s1); } // Есть ли символ с1 в увеличивающемся массиве cow static int IsChar(char c1, CN[] cow, int k) { int r=-1; for (int i=0; i <= k; i++) if (c1==cow[i].c) { r = i; break; } return r; } } }
NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.
/// Думаю это решение гораздо компактнее и понятнее.
string Word = «Helloe»;
SwapSimbol(ref Word);
}public static void SwapSimbol(ref string Line)
{
string Line1 =»»;
Line = Line.ToLower();
foreach (char e in Line)
{
if (Line.Count(i => i == e) > 1)
Line1 += ‘+’;
else Line1 += ‘-‘;
}
Line = Line1;
}