-1

我需要帮助我在 c# 中有任务来制作接受用户输入(字符串)的程序。你会得到不同动物发出的噪音,你可以在黑暗中听到,评估每个噪音以确定它属于哪个动物。狮子说“Grr”,老虎说“Rawr”,蛇说“Ssss”,鸟类说“啁啾”。

输入格式:一个字符串,表示您听到的噪音,它们之间有一个空格。

输出格式:一个字符串,其中包含您听到的每种动物,每个动物后面都有一个空格。(动物可以重复)

我做这个

    using System;
    using System.Reflection.Metadata;
    using System.Runtime.CompilerServices;
    using System.Security.Cryptography.X509Certificates;
    using System.Text;
    using System.Text.RegularExpressions;
    
    namespace nekaVjezba
    {
        class Program
        {
            static void Main(string[] args)
            {
    
    
                var text = Console.ReadLine();
    
                var matches = Regex.Matches(text, @"\w+[^\s]*\w+|\w");
               
    
    
                foreach (Match match in matches)
                {
                    var word = match.Value;
    
    
                     if (word == "Grr")
                          {
                        Console.WriteLine("Lion");
    
    
                    }
                          else if (word == "Rawr")
                          {
                        Console.WriteLine("Tiger");
    
                    }
                          else if (word == "Ssss")
                          {
                              Console.WriteLine("Snake");
                          }
                          else if (word == "Chirp")
                          {
                              Console.WriteLine("Bird");
                          }
                }
            }
        }
    }

那是工作,但我的输出是

  • 狮子
  • 狮子
  • 老虎

但应该是在一条线上 Lion Lion Tiger Snake

4

4 回答 4

1

有几种方法可以改善这一点,但最简单的建议可能是构建单个输出字符串,添加到它并在单个语句中将其写入控制台,如下所示(半伪代码):

//Intitialize an output string
var output = "";

foreach(Match match in matches)
//Add to output
If(word== "Grr")
    { outPut += "Lion ";}
      ...
}
//Then after all results are added to the string, print the string
Console.WriteLine(output)
于 2020-11-01T21:43:06.337 回答
1

写而不是Console.WriteLine("...")just Console.Write("..."),所以你不会写到新的line,而是写在同一行。然后在每个应该输出的单词后添加一个空格 ( Console.Write("Tiger ");),如以下代码所示:

using System;
using System.Reflection.Metadata;
using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Text.RegularExpressions;

namespace nekaVjezba
{
    class Program
    {
        static void Main(string[] args)
        {
            var text = Console.ReadLine();
            var matches = Regex.Matches(text, @"\w+[^\s]*\w+|\w");
           

        foreach (Match match in matches)
        {
          var word = match.Value;
          if (word == "Grr")
          {
            Console.WriteLine("Lion ");
          }
          else if (word == "Rawr")
          {
            Console.Write("Tiger ");
          }
          else if (word == "Ssss")
          {
            Console.Write("Snake ");
          }
          else if (word == "Chirp")
            Console.Write("Bird ");
          }
        }
    }
}

输出现在可以是:“Lion Lion Tiger Snake”

于 2020-11-01T21:44:26.683 回答
0

一些事情可以使这更容易做到。

首先,您不需要正则表达式来解析空格分隔的输入。因此,除非这是一个要求,否则您可以只使用 String.Split。

其次,您可以使用 switch 语句或 switch 表达式来匹配输入标记。你也可以把它分解成一个单独的方法。下面是一个使用 switch 表达式的示例:

    static IEnumerable<string> ToAnimal(IEnumerable<string> sounds)
    {
        foreach (var sound in sounds)
        {
            yield return sound switch
            {
                "Grr" => "Lion",
                "Rawr" => "Tiger",
                "Ssss" => "Snake",
                "Chirp" => "Bird",
                _ => throw new ArgumentException("unknown sound")
            };
        }
    }

您可以使用 string.Split 的结果调用它。像这样:

    static void Main(string[] _)
    {
        string RawInput = "Grr Grr Rawr Ssss";

        string[] sounds = RawInput.Split(' ');

        foreach (var animal in ToAnimal(sounds))
        {
            Console.Write(animal);
            Console.Write(' ');
        }

        Console.WriteLine();

    }

显然你会想要使用 Console.ReadLine 来获取输入字符串。

于 2020-11-01T22:59:19.030 回答
0

虽然有很多方法可以做到这一点。然而,这里有一个简洁的解决方案(到 ô̖p̖̝̃̉en̺͔͍͌̍̈́ y̯͇̦͌̍͌oũ̠͍̫̀͡r̜̚ m̠̞͑̍i̭̓ṇ̼̍͘d͈̪͍̑̚͝)使用 aDictionaryLINQ

由于单词是用空格分隔的,所以简单的string.Split就可以了。

var dict = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)
{
   {"Grr", "Lion"},
   {"Rawr", "Tiger"},
   {"Ssss", "Snake"},
   {"Chirp", "Bird"},
};

var animals = Console
   .ReadLine()?
   .Split(' ', StringSplitOptions.RemoveEmptyEntries)
   .Select(word => !dict.TryGetValue(word, out var animal) ? "N/A" : animal)
   .ToList();

if (animals?.Any() == true)
   Console.WriteLine(string.Join(", ", animals));
else
   Console.WriteLine("Nothing entered");

输入

grr bob chirp ssss

输出

Lion, N/A, Bird, Snake

其他资源

String.Split 方法

返回一个字符串数组,其中包含此实例中由指定字符串或 Unicode 字符数组的元素分隔的子字符串。

字典<TKey,TValue>(IEqualityComparer)

比较键时使用的IEqualityComparer<T>实现,或 null 以使用默认EqualityComparer<T>的键类型。

Dictionary<TKey,TValue>.TryGetValue(TKey, TValue) 方法

获取与指定键关联的值。

Enumerable.Select 方法

将序列的每个元素投影到新形式中。

字符串连接

使用每个元素或成员之间的指定分隔符连接指定数组的元素或集合的成员。

空条件运算符 ?. 和 ?[]

在 C# 6 及更高版本中可用,空条件运算符仅在该操作数的计算结果为非空时才将成员访问 ?. 或元素访问 ?[] 操作应用于其操作数;否则,它返回 null

语言集成查询 (LINQ)

语言集成查询 (LINQ) 是一组基于将查询功能直接集成到 C# 语言中的技术的名称。传统上,对数据的查询表示为简单的字符串,在编译时没有类型检查或 IntelliSense 支持。此外,您必须为每种类型的数据源学习不同的查询语言:SQL 数据库、XML 文档、各种 Web 服务等等。使用 LINQ,查询是一流的语言结构,就像类、方法、事件一样。您可以使用语言关键字和熟悉的运算符针对强类型的对象集合编写查询。

于 2020-11-01T23:00:03.073 回答