Проверить, является ли символ гласной или согласной?
есть код, чтобы проверить, является ли символ гласной или согласной? Что-то вроде char = IsVowel? Или нужно жесткий код?
case ‘a’:
case ‘e’:
case ‘i’:
case ‘o’:
case ‘u’:
case ‘A’:
case ‘E’:
case ‘I’:
case ‘O’:
case ‘U’:
13 ответов
вы могли бы сделать это:
char c = ...
bool isVowel = "aeiouAEIOU".IndexOf(c) >= 0;
или такой:
char c = ...
bool isVowel = "aeiou".IndexOf(c.ToString(), StringComparison.InvariantCultureIgnoreCase) >= 0;
как только вы добавите международную поддержку для таких вещей, как éèe̋ȅëêĕe̊æøи
etc. эта строка будет длинной, но основное решение будет таким же.
вот функция, которая работает:
public static class CharacterExtentions
{
public static bool IsVowel(this char c)
{
long x = (long)(char.ToUpper(c)) - 64;
if (x*x*x*x*x - 51*x*x*x*x + 914*x*x*x - 6894*x*x + 20205*x - 14175 == 0) return true;
else return false;
}
}
использовать его как:
char c = 'a';
if (c.IsVowel()) { // it's a Vowel!!! }
(Да, это действительно работает, но, очевидно, это шутка ответ. Не унижай меня. или еще что-нибудь.)
нет. Сначала нужно определить, что вы считаете гласной и согласной. Например, в английском языке " y "может быть согласной (как в" yes") или гласной (как в"by"). Такие буквы, как" é "и" ü", вероятно, являются гласными во всех языках, в которых они используются, но, похоже, вы их вообще не рассматривали. Прежде всего, вы должны определить почему вы хотите, чтобы классифицировать буквы, как согласные и гласные.
Console.WriteLine("Please input a word or phrase:");
string userInput = Console.ReadLine().ToLower();
for (int i = 0; i < userInput.Length; i++)
{
//c stores the index of userinput and converts it to string so it is readable and the program wont bomb out.[i]means position of the character.
string c = userInput[i].ToString();
if ("aeiou".Contains(c))
{
vowelcount++;
}
}
Console.WriteLine(vowelcount);
вы можете использовать "IsVowel", как вы хотели. Однако единственное, что, вероятно, нет библиотеки или функции C# по умолчанию, которая уже делает это из коробки, ну, если это то, что вы хотели. Для этого вам нужно будет написать метод util.
bool a = isVowel('A');//example method call
public bool isVowel(char charValue){
char[] vowelList = {'a', 'e', 'i', 'o', 'u'};
char casedChar = char.ToLower(charValue);//handle simple and capital vowels
foreach(char vowel in vowelList){
if(vowel == casedChar){
return true;
}
}
return false;
}
Вы можете использовать следующий метод расширения:
using System;
using System.Linq;
public static class CharExtentions
{
public static bool IsVowel(this char character)
{
return new[] {'a', 'e', 'i', 'o', 'u'}.Contains(char.ToLower(character));
}
}
использовать его как:
'c'.IsVowel(); // Returns false
'a'.IsVowel(); // Returns true
это работает просто отлично.
public static void Main(string[] args)
{
int vowelsInString = 0;
int consonants = 0;
int lengthOfString;
char[] vowels = new char[5] { 'a', 'e', 'i', 'o', 'u' };
string ourString;
Console.WriteLine("Enter a sentence or a word");
ourString = Console.ReadLine();
ourString = ourString.ToLower();
foreach (char character in ourString)
{
for (int i = 0; i < vowels.Length; i++)
{
if (vowels[i] == character)
{
vowelsInString++;
}
}
}
lengthOfString = ourString.Count(c => !char.IsWhiteSpace(c)); //gets the length of the string without any whitespaces
consonants = lengthOfString - vowelsInString; //Well, you get the idea.
Console.WriteLine();
Console.WriteLine("Vowels in our string: " + vowelsInString);
Console.WriteLine("Consonants in our string " + consonants);
Console.ReadKey();
}
}
другие методы данной работы. Здесь меня интересует производительность. Для двух подходов, которые я тестировал-используя любой метод LINQ и используя битную арифметику, использование битной арифметики было более чем в десять раз быстрее. Результаты:
время для LINQ = 117 МС
время для битовых масок = 8 мс
public static bool IsVowelLinq(char c)
{
char[] vowels = new[] { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
return vowels.Any(ch => ch == c);
}
private static int VowelMask = (1 << 1) | (1 << 5) | (1 << 9) | (1 << 15) | (1 << 21);
public static bool IsVowelBitArithmetic(char c)
{
// The OR with 0x20 lowercases the letters
// The test c > 64 rules out punctuation, digits, and control characters.
// An additional test would be required to eliminate characters above ASCII 127.
return (c > 64) && ((VowelMask & (1 << ((c | 0x20) % 32))) != 0);
}
см.https://dotnetfiddle.net/WbPHU4 для кода в тесте с таймингами.
ключевая идея с битовая маска заключается в том, что второй бит установлен для "a", шестой бит установлен для " e " и т. д. Затем вы берете букву, сдвигаете влево ее значение ASCII как целое число и смотрите, установлен ли этот бит в маске. Один бит устанавливается в маске для каждой гласной, и операция или сначала выполняет строчную букву.
вы можете сделать что-то вроде этого.
private bool IsCharacterAVowel(char c)
{
string vowels = "aeiou";
return vowels.IndexOf(c.ToString(),StringComparison.InvariantCultureIgnoreCase) >= 0;
}
попробуйте это:
char[] inputChars = Console.ReadLine().ToCharArray();
int vowels = 0;
int consonants = 0;
foreach (char c in inputChars)
{
if ("aeiou".Contains(c) || "AEIOU".Contains(c))
{
vowels++;
}
else
{
consonants++;
}
}
Console.WriteLine("Vowel count: {0} - Consonant count: {1}", vowels, consonants);
Console.ReadKey();
посмотреть этот код для проверки гласных и согласных , с#
private static void Vowel(string value)
{
int vowel = 0;
foreach (var x in value.ToLower())
{
if (x.Equals('a') || x.Equals('e') || x.Equals('i') || x.Equals('o') || x.Equals('u'))
{
vowel += 1;
}
}
Console.WriteLine( vowel + " number of vowels");
}
private static void Consonant(string value)
{
int cont = 0;
foreach (var x in value.ToLower())
{
if (x > 'a' && x <= 'd' || x > 'e' && x < 'i' || x > 'j' && x < 'o' || x >= 'p' && x < 'u' || x > 'v' && x < 'z')
{
cont += 1;
}
}
Console.WriteLine(cont + " number of consonant");
}