9

我正在学习编程 C#,我正在尝试计算元音。我让程序循环遍历句子,但不是返回元音计数,而是返回字符串的长度。任何帮助将不胜感激。

    static void Main()
    {
        int total = 0;

        Console.WriteLine("Enter a Sentence");
        string sentence = Console.ReadLine().ToLower();

        for (int i = 0; i < sentence.Length; i++)
        {
            if (sentence.Contains("a") || sentence.Contains("e") || sentence.Contains("i") || sentence.Contains("o") || sentence.Contains("u"))
            {
                total++;
            }
        }
        Console.WriteLine("Your total number of vowels is: {0}", total);

        Console.ReadLine();
    }
4

19 回答 19

29

现在,您正在检查整个句子是否contains有元音,每个字符一次。您需要改为检查各个字符。

   for (int i = 0; i < sentence.Length; i++)
    {
        if (sentence[i]  == 'a' || sentence[i] == 'e' || sentence[i] == 'i' || sentence[i] == 'o' || sentence[i] == 'u')
        {
            total++;
        }
    }

话虽如此,您可以将其简化很多:

static void Main()
{
    int total = 0;
    // Build a list of vowels up front:
    var vowels = new HashSet<char> { 'a', 'e', 'i', 'o', 'u' };

    Console.WriteLine("Enter a Sentence");
    string sentence = Console.ReadLine().ToLower();

    for (int i = 0; i < sentence.Length; i++)
    {
        if (vowels.Contains(sentence[i]))
        {
            total++;
        }
    }
    Console.WriteLine("Your total number of vowels is: {0}", total);

    Console.ReadLine();
}

如果您想使用 LINQ,可以进一步简化它:

static void Main()
{
    // Build a list of vowels up front:
    var vowels = new HashSet<char> { 'a', 'e', 'i', 'o', 'u' };

    Console.WriteLine("Enter a Sentence");
    string sentence = Console.ReadLine().ToLower();

    int total = sentence.Count(c => vowels.Contains(c));
    Console.WriteLine("Your total number of vowels is: {0}", total);
    Console.ReadLine();
}
于 2013-08-07T17:29:13.590 回答
6

由于 Reed 已经回答了您的问题,我将为您提供另一种实现方式。您可以使用 LINQ 和 lambda 表达式消除循环:

string sentence = "The quick brown fox jumps over the lazy dog.";
int vowelCount = sentence.Count(c => "aeiou".Contains(Char.ToLower(c)));

如果您不理解这段代码,我强烈建议您在 C# 中查找 LINQ 和 Lambda 表达式。在许多情况下,您可以通过以这种方式消除循环来使您的代码更简洁。

本质上,这段代码是说“计算句子中包含在字符串“aeiou”中的每个字符。”

于 2013-08-07T17:35:55.583 回答
3

那是因为你的 if 语句总是正确的,你需要比较句子 [i] 处的字符,看它是否是元音,而不是看句子是否包含元音。

于 2013-08-07T17:29:59.750 回答
2

或者使用 linq。

static void Main()
    {
        int total = 0;

        Console.WriteLine("Enter a Sentence");
        string sentence = Console.ReadLine().ToLower();
        char[] vowels = { 'a', 'e', 'i', 'o', 'u' };

        total = sentence.Count(x => vowels.Contains(x));

        Console.WriteLine("Your total number of vowels is: {0}", total);

        Console.ReadLine();
    }
于 2013-08-07T17:30:58.653 回答
2

您正在检查您的整个句子是否包含循环的每次迭代的元音,这就是为什么您的总数只是句子字符串中的字符数。

foreach(char ch in sentence.ToLower())
    if("aeiou".Contains(ch))
        total++;

最好使用正则表达式。编辑您只想将正则表达式用于比匹配元音更复杂的东西。

using System.Text.RegularExpressions;
...
int total = Regex.Matches(sentence, @"[AEIOUaeiou]").Count;

编辑只是为了完整性最快/最有效的(如果你要在一百万个字符串上执行此操作)解决方案。如果性能不是问题,我会使用 Linq 简洁。

public static HashSet<char> SVowels = new HashSet<char>{'a', 'e', 'i', 'o', 'u'};
public static int VowelsFor(string s) {
    int total = 0;
    foreach(char c in s)
        if(SVowels.Contains(c))
            total++;
    return total;
}
于 2013-08-07T17:33:00.313 回答
1
int cnt = 0;
for (char c in sentence.ToLower())
    if ("aeiou".Contains(c))
       cnt++;
return cnt;
于 2013-08-07T17:31:07.127 回答
1

给猫剥皮的方法有很多 :-) 在编程中,一点横向思维可能会很有用......

total += sentence.Length - sentence.Replace("a", "").Length;
total += sentence.Length - sentence.Replace("e", "").Length;
total += sentence.Length - sentence.Replace("i", "").Length;
total += sentence.Length - sentence.Replace("o", "").Length;
total += sentence.Length - sentence.Replace("u", "").Length;

例如,您可以尝试从句子中删除元音并查看没有元音的句子是否更小,以及减少了多少。

于 2013-08-07T17:43:05.920 回答
0

对于初学者来说可能太高级了,但这是您在 C# 中执行此操作的方式:

var vowels = new[] {'a','e','i','o','u'};

Console.WriteLine("Enter a Sentence");
var sentence = Console.ReadLine().ToLower();

var vowelcount = sentence.Count(x => vowels.Contains(x));

Console.WriteLine("Your total number of vowels is: {0}", vowelcount);
Console.ReadLine();
于 2013-08-07T17:32:23.050 回答
0

这就是我将如何处理这个问题。

var sentence = "Hello my good friend";
            var sb = sentence.ToLower().ToCharArray();
            var count = 0;
            foreach (var character in sb)
            {
                if (character.Equals('a') || character.Equals('e') || character.Equals('i') || character.Equals('o') ||
                    character.Equals('u'))
                {
                    count++;
                }
            }
于 2013-08-07T17:33:49.293 回答
0

您也可以使用 switch 语句执行此操作

        var total = 0;
        var sentence = "Hello, I'm Chris";
        foreach (char c in sentence.ToLower())
        {
            switch (c)
            {
                case 'a':
                case 'e':
                case 'i':
                case 'o':
                case 'u':
                    total++;
                    break;
                default: continue;
            }

        }
        Console.WriteLine(total.ToString());
于 2013-08-07T18:30:33.073 回答
0

TMTOWTDI(正如他们所说的 Tim Toadie:有不止一种方法可以做到)。

怎么样

static char[] vowels = "AEIOUaeiou".ToCharArray() ;
public int VowelsInString( string s  )
{

  int n = 0 ;
  for ( int i = 0 ; (i=s.IndexOfAny(vowels,i)) >= 0 ; )
  {
    ++n ;
  }

  return n;
}

或者(另一种正则表达式方法)

static readonly Regex rxVowels = new Regex( @"[^AEIOU]+" , RegexOptions.IgnoreCase ) ;
public int VowelCount( string s )
{
  int n = rxVowels.Replace(s,"").Length ;
  return n ;
}

最直接的可能也是最快的:

public int VowelCount( string s )
{
  int n = 0 ;
  for ( int i = 0 ; i < s.Length ; +i )
  {
    switch( s[i] )
    {
    case 'A' : case 'a' :
    case 'E' : case 'e' :
    case 'I' : case 'i' :
    case 'O' : case 'o' :
    case 'U' : case 'u' :
      ++n ;
      break ;
    }
  }
  return n ;
}
于 2013-08-07T18:33:52.860 回答
0
    static void Main(string[] args)
    {
        Char[] ch;
        Console.WriteLine("Create a sentence");
        String letters = Console.ReadLine().Replace(" ", "").ToUpper();
        ch = letters.ToCharArray();
        int vowelCounter = 0;
        int consonantCounter = 0;

       for(int x = 0; x < letters.Length; x++)
        {
            if(ch[x].ToString().Equals("A") || ch[x].ToString().Equals("E") || ch[x].ToString().Equals("I") || ch[x].ToString().Equals("O") || ch[x].ToString().Equals("U"))
            {
                vowelCounter++;
            }
            else
            {
                consonantCounter ++;
            }
        }
        System.Console.WriteLine("Vowels counted : " + vowelCounter);
        System.Console.WriteLine("Consonants counted : " + consonantCounter);
于 2016-03-08T13:07:44.317 回答
0

应用计算句子中的元音和辅音字母。这是另一种代码行更少的解决方案,它了解使用循环和嵌套循环与 char 数组的想法。

具有控件名称的应用程序接口:

带有控件名称的应用程序界面

namespace Program8_4
{
  public partial class Form1 : Form
  {
    // declare the counter variables in field
    int iNumberOfVowels = 0;
    int iNumberOfConsonants = 0;
    public Form1()
    {
        InitializeComponent();
    }

    private void btnFind_Click(object sender, EventArgs e)
    {
        // call the methods in this event
        GetVowels(txtStringInput.Text);
        GetConsonants(txtStringInput.Text);
        // show the result in a label
        lblOutput.Text = "The number of vowels : " + iNumberOfVowels.ToString()+ Environment.NewLine+
            "The number of consonants : " + iNumberOfConsonants.ToString();
        // assign zero the counters to not add the previous number to new number, and start counting from zero again
        iNumberOfVowels = 0;
        iNumberOfConsonants = 0;

    }

    private int GetConsonants(string strFindConsonants)
    {
        // Declare char array to contain consonants letters
        char[] chrConsonants = { 'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'X',
            'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'x' };

        // loop to get each letter from sentence
        foreach (char Consonants in strFindConsonants)
        {
        // another nested loop to compare each letter with all letters contains in chrConsonants array
            for (int index= 0; index<chrConsonants.Length;index++)
            {
                // compare each letter with each element in charConsonants array
                if (Consonants == chrConsonants[index])

                {
                    // If it is true add one to the counter iNumberOfConsonants
                    iNumberOfConsonants++;
              }

            }
        }
        // return the value of iNumberOfConsonants
        return iNumberOfConsonants;
    }

    private int GetVowels(string strFindVowels)

    {
        // Declare char array to contain vowels letters
        char[] chrVowels = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O','U' };

        // loop to get each letter from sentence
        foreach (char Vowels in strFindVowels)
        {
            // another nested loop to compare each letter with all letters contains in chrVowels array
            for (int index = 0; index< chrVowels.Length; index++)
            {
                // compare each letter with each element in chrVowels array
                if (Vowels == chrVowels[index])

            {
                    // If it is true add one to the counter iNumberOfVowels
                    iNumberOfVowels = iNumberOfVowels+1;

            }
            }
        }
        // return the value of iNumberOfVowels
        return iNumberOfVowels;
    }
于 2016-11-05T18:57:00.713 回答
0

我们可以使用正则表达式来匹配句子中的元音。

Regex.Matches()函数将返回一个包含所有出现元音的数组。然后我们可以使用 count 属性来查找元音的数量。

匹配字符串中元音的正则表达式:[aeiouAEIOU]+

以下是工作代码片段:

 public static void Main()
   {
       string pattern = @"[aeiouAEIOU]+";
       Regex rgx = new Regex(pattern);
       string sentence = "Who writes these notes?";
       Console.WriteLine(rgx.Matches(sentence).Count);
   }
于 2020-05-13T20:28:24.640 回答
0

// 使用两个循环。

        char[] vowels= new char[]{'a', 'e', 'i', 'o', 'u',
                                   'A', 'E', 'I', 'O', 'U'}; 
        string myWord= "This is a beautiful word.";
        
        int numVowels = 0;
        
        foreach(char c in  myWord.ToCharArray())
        {
            foreach(char c2 in vowels)
            {
                if(c == c2) numVowels++;    
            }  
        }
        
        Console.WriteLine($"{numVowels} vowels in: {myWord}");
于 2020-09-12T23:23:59.387 回答
0

我们检查表达式的每个后续字母是否等于数组中的元音

class Program
{

    private static void Main(string[] args)
    {
        string random = Console.ReadLine();
        string toLower = random.ToLower();
        char []isVowels = { 'a','e','i','o','u','y' };
        byte count = 0;
        for (int i = 0; i < toLower.Length; i++)
        {
            for (int j = 0; j < isVowels.Length; j++)
            {
                if (toLower[i]==isVowels[j])
                {
                    count++;
                }
            }
        }
        Console.WriteLine(count);
    }
    

}
于 2021-02-07T20:04:57.603 回答
0
`public static void Main()
{
    Console.WriteLine("Enter a Sentence");
    string sentence = Console.ReadLine().ToLower();

    string voval="aeiou";
    int cnt=0;
    foreach(char ch in sentence)
    {
        if(voval.Contains(ch.ToString()))
        {
            cnt++;
        }
    }
    Console.WriteLine(cnt); 
}`
于 2021-12-14T07:21:50.173 回答
-1

这是一种很好的计算元音的通用方法,从这里你可以做各种各样的事情。计算元音,返回排序列表等。

public static int VowelCount(String vowelName) {
            int counter = 0;
            char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
            for (int index = 0; index < vowelName.Length; index++)
            {
                if (vowels.Contains(vowelName[index])) 
                {
                    counter++;
                }
            }
            return counter;
        }
于 2014-06-08T18:20:27.573 回答
-1
void main()
{
    int x=0;
    char ch;
    printf("enter a statement:");
    while((ch=getche())='\r')
    {
        if(ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u')
        x++;
    }
    printf("total vowels=");
    getch();
}
于 2015-06-14T12:02:41.847 回答