Подсчет прописных и строчных букв - C#
Формулировка задачи:
Суть программы такова, что она считает прописные, строчные буквы, а так же говорит каким является предложение(вопросит, воскл...) хотелось бы добавить немецкий язык, чтобы он воспринимал и его.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _54Вариант
{
class Program
{
static string symbolsPunctuation = "?!.";//набор символов, на которые может заканчиваться предложение
static byte[] arrCodeSymbolsPunctuation = getBytesString(symbolsPunctuation);//преобразуем в массив байтов строку, созданную выше
static char symEndString(string str)//метод типа char (символ), передаем в него строку
{
return str[str.Length - 1];//возвращает последний символ строки (предложения)
}
static string getRandomSetSymbols(int countSymbols)//метод возвращает строку из рандомных символов, в него передаем длину этой строки
{
List<byte> listBytes = new List<byte>();//создаем список элементов типа byte(целое число от 0 до 255)
Random r = new Random();//создаем экземпляр класса Random
for (int i = 0; i < countSymbols; i++)//открываем цикл от 0 до количества символов, которое передали в мтеод
listBytes.Add((byte)r.Next(192, 255));//добавляем в список рандомное число от 192 до 255 (в таблице символов строчные и прописные буквы как раз лежат в этом промежутке)
return Encoding.GetEncoding(1251).GetString(listBytes.ToArray()) + symbolsPunctuation[new Random().Next(0, symbolsPunctuation.Length)];
//возвращаем преобразованную строку из созданного списка (кодировка 1251 означает, что мы можем использовать кириллицу) + добавляем рандомный знак на конец предложения (? или ! или .)
//также для этого используем экземпляр класса Random, в метод Next передаем парамметры 0 и длинну строки символов (?!.), т.е. рандомим от 0 до 3
}
static int getRandomNumber(int minCountNumber, int maxCountNumber)//метод возвращает целое рандомное число в промежутке от переданных значений
{
return new Random().Next(minCountNumber, maxCountNumber);//также используем класс Random для случайного значения
}
static byte[] getBytesString(string str)//метод, который возвращает массив байтов строки, в него передаем переменную типа string
{
return Encoding.GetEncoding(1251).GetBytes(str);//возвращаем массив, используя класс Encoding в указанной кодировке (1251 - это кириллица)
}
static int getCountUpperLetters(string str)//метод возвращает количество прописных букв, в него передаем строку, из которой будем искать те самые символы (прописные буквы)
{
int count = 0;//инициализируем счетчик
byte[] tempArr = getBytesString(str);//создаем массив байтов, используя метод, описанный ранее
foreach (var item in tempArr)//открываем цикл foreach (отличается от for тем, что не используется итератор)
if ((item >= 192 && item <= 223) && isContainsSymbolsPunctuation(item) == false)//если текущий символ лежит в промежутке от 192 до 223 включительно (в таблице символов ascii - это все прописные буквы)
//(этот промежуток указывает на то, что код символа соответствует прописной букве) и код символа не является кодом ? или ! или .
count++;//увеличиваем счетчик
return count;//возвращаем счетчик
}
static bool isContainsSymbolsPunctuation(byte codeSym)//метод, который вернет true, если если код символа совпал с кодом ? или ! или ., иначе вернет false
{
bool result = false;//инициализируем переменную result
foreach (var item in arrCodeSymbolsPunctuation)//открываем цикл по массиву кодов строки symbolsPunctuation
if (item == codeSym)//если код текущего символа совпал
{
result = true;//result присваиваем true
break;//выходим из цикла
}
return result;//возвращаем result
}
static int getCountLowerLetters(string str)//метод возвращает количество строчных букв, в него передаем строку, из которой будем искать те самые символы (строчные буквы)
{
int count = 0;//инициализируем счетчик
byte[] tempArr = getBytesString(str);//создаем массив байтов, используя метод, описанный ранее
foreach (var item in tempArr)//открываем цикл foreach
if (item >= 224 && isContainsSymbolsPunctuation(item) == false)//если текущий код символа больше 224 (в таблице символов ascii - это все строчные буквы)
count++;//увеличиваем счетчик
return count;//возвращаем наш счетчик
}
static void answer(string str)//метод типа void (ничего не возращает), передаем в него строку (предложение по заданию)
{
switch(str[str.Length - 1])//смотрим его последний символов, делаем из этого вывод
{
case '.'://если точка
Console.WriteLine("Предложение является повествовательным");
break;
case '!'://если восклицательный знак
Console.WriteLine("Предложение является восклицательным");
break;
case '?'://если вопросительный знак
Console.WriteLine("Предложение является вопросительным");
break;
default://если ничего из выше перечисленного
Console.WriteLine("Предложение не заканчивается на какой-либо из знаков ?, !, .");
break;
}
Console.WriteLine("Количество прописных букв: {0}", getCountUpperLetters(str));//здесь выводим количество прописных букв
Console.WriteLine("Количество строчных букв: {0}", getCountLowerLetters(str));//здесь выводим количество строчных букв
}
static void menu()//метод menu, ничего не возращает, просто используем для вывода меню на экран консоли
{
Console.WriteLine("Выберите вариант задания");
Console.WriteLine(new string('-', 50));//строка из символа '-' длиной 50
Console.WriteLine("1. Ввести предложение с клавиатуры");
Console.WriteLine("2. Рандомный набор символов");
Console.WriteLine("3. Выход");
byte num = 0;//создаем переменную выбора пункта меню
if (byte.TryParse(Console.ReadLine(), out num))//если введенное значение корректно (лежит в промежутке от 0 до 255, т.к. это тип byte)
{
switch (num)//читаем то, что ввели
{
case 1://если 1
Console.WriteLine("Введите предложение: ");
answer(Console.ReadLine());//передаем в метод answer введенную строку с клавиатуры
break;
case 2://если 2
string randomString = getRandomSetSymbols(getRandomNumber(5, 10));//генерируем строку рандомной длины от 5 до 10
Console.WriteLine("Рандомный набор символов: {0}", randomString);//выводим ее на экран
answer(randomString);//передаем в метод answer сгенерированную строку
break;
case 3://если 3
Environment.Exit(0);//завершаем выполнение консоли
break;
default://если ничего из выше перечисленного, то выводим соответствующее сообщение
Console.WriteLine("Выбранный вами вариант отсутствует");
break;
}
}
else//если значение num некорректное, то выводим соответствующее сообщение
Console.WriteLine("Ввели некорректный номер варианта задания");
Console.WriteLine("Для продолжения нажмите любую клавишу");
Console.ReadKey();//ожидаем ввода какого-либо символа
Console.Clear();//чистим консоль
menu();//рекурсивный вызов метода menu, т.е. опять возвращаемся в начало
}
static void Main(string[] args)
{
menu();//отправная точка, вызываем метод menu для его выполнения
}
}
}Решение задачи: «Подсчет прописных и строчных букв»
textual
Листинг программы
const string GERMAN = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÄÖÜßäöü";
/// <summary>
/// метод возвращает строку из рандомных символов русского алфавита, в него передаем длину этой строки
/// </summary>
static string getRandomSetSymbolsInGerman(int countSymbols)
{
char[] chars = new char[countSymbols + 1];
Random r = new Random();//создаем экземпляр класса Random
for (int i = 0; i < countSymbols; i++)//открываем цикл от 0 до количества символов, которое передали в мтеод
{
chars[i] = GERMAN[r.Next(0, GERMAN.Length)];
}
chars[countSymbols] = symbolsPunctuation[r.Next(0, symbolsPunctuation.Length)];
return new string(chars);
}