我不知道接下来要做什么元音计数器

时间:2015-11-18 13:23:23

标签: c#

当我输入我的程序名字时,我很难理解为什么我得到25岁。它应该计算元音,上次我检查追逐只有2.这里也是picture of assignment

/* Program      :   Ch5Ex12a - CountVowels
 * Programmer   :   Chase Mitchell
 * Date         :   11/18/2015
 * Description  :   User's vowels are counted
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch5Ex12a
{
    class Program
    {
        static void Main(string[] args)
        {
            int bacon=0;
            string Phrase;

            Console.WriteLine("Enter in letters");
            Phrase = Console.ReadLine();





                foreach (char a in Phrase)

                    bacon += 1;

                foreach (char e in Phrase)
                    bacon += 1;

                foreach (char i in Phrase)
                    bacon += 1;

                foreach (char o in Phrase)
                    bacon += 1;

                foreach (char u in Phrase)
                    bacon += 1;



            Console.WriteLine(bacon);
            Console.ReadKey();
        }
    }
}

5 个答案:

答案 0 :(得分:9)

foreach (char a in Phrase)
    bacon += 1;

您认为这有什么作用?这迭代'a'中的所有Phrase个字符。相反,它会迭代Phase中的所有字符并计算它们。只是在每次迭代中为每个字符分配的变量名称称为a。但这与内容无关。

您尝试过这样的事情:

foreach (char c in Phrase)
{
    if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
        bacon += 1;
}

您还应检查大写字符;显式或首先将Phrase转换为小写。您可以通过循环Phrase.ToLower()而不是Phrase来完成此操作。

答案 1 :(得分:3)

您的问题出在以下代码中:

foreach (char a in Phrase)
    bacon += 1;

它的作用:

  1. 迭代(遍历)Phrase变量并逐个出现每个字符。
  2. 它将当前值分配给名为a的变量。
  3. 它向bacon添加一个。 (注意:不做检查!)
  4. 我猜你认为它确实得到了所有'a' ......它没有。

    有一些方法可以解决这个问题。 poke已经放了一个。另一种选择是LINQ Count声明:

    char[] vowels = new char[] { 'a', 'e', 'i', 'o', 'u' };
    int vowelCount = Phrase.Count(c => vowels.Contains(c));
    

答案 2 :(得分:2)

首先,为什么你的变量叫bacon?您应该将其称为有意义的内容,例如numVowels

其次,foreach声明并不像您期望的那样发挥作用。

foreach (char a in Phrase)
    bacon += 1;

这并不是说"对于短语中的每个A,添加一个到培根"。它实际上说的是,对于短语中的每个 thing (在这种情况下每个字符)将它存储在一个临时变量中(你将其称为e,i,o和u)并做某事(在这种情况下:在你的柜台加一个)。因此,您获得25的原因是您正在进行5个相同的循环,每个循环为计数器添加一个循环(5 x 5 = 25)。

你真正想做的是一个foreach并比较每个角色,看它是否是一个元音:

foreach (char character in Phrase) {
    if (character == 'a' || character == 'e' || ... ) {
        numVowels += 1;
    }
}

答案 3 :(得分:0)

建立一个vowelList数组。如果vowelList包含c,则增加培根计数。

String vowelList = "aeiou";
foreach (char c in Phrase)
{
    if(vowelList.Contains(c))
        bacon += 1;
}

答案 4 :(得分:0)

好吧,循环遍历字符串并计算。要避免代码中出现 mess (以及错误),请尝试不要将所有代码塞入一个Main方法。

  // Model: what is/are vowel. 
  // So if you're asked to count vowels in, say, Russian you know what to change 
  private static HashSet<Char> s_Vowels = new HashSet<Char>() {
    'a', 'e', 'i', 'o', 'u', // is 'w' considered being vowel?
    'A', 'E', 'I', 'O', 'U', 
  };

  // Routine: count vowels in a given phrase
  // No input/output here, so it will work in WinForms, Command Line, ASP... 
  private static int CountVowels(String phrase) {
    if (String.IsNullOrEmpty(phrase))
      return 0;

    int result = 0;

    foreach (char letter in phrase)
      if (s_Vowels.Contains(letter))
        result += 1;

    return result;
  }

  // Input/output
  static void Main(string[] args) {
    Console.WriteLine("Enter in letters");
    string Phrase = Console.ReadLine();
    Console.WriteLine(String.Format("It contains {0} vowels.", CountVowels(Phrase)));
  }

修改:如果你故意 ,你的初始代码有一行using System.Linq;,并且你被允许使用 Linq ,例程可以缩短

  private static int CountVowels(String phrase) {
    if (String.IsNullOrEmpty(phrase))
      return 0;
    else
      return phrase.Count(letter => s_Vowels.Contains(letter)); 
  }