Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的特殊奇数倒三角形问题#_C# - Fatal编程技术网

C# C语言中的特殊奇数倒三角形问题#

C# C语言中的特殊奇数倒三角形问题#,c#,C#,我非常感谢您对这个问题的帮助,我将自己总结一下,但也包括到目前为止的实际说明和代码 编写控制台C#程序以执行以下操作: * *** ***** ******* ********* ********* ******* ***** *** * 询问用户最大字符数。如果用户输入偶数加1将其转换为奇数,则应为奇数 要求用户打印字符 然后,您的程序应该输出两个倒置的垂直三角形,其底边等于#1中输入的数字,由#2中的字符组成 三角形的一行中的字符数与其下一行中的字符

我非常感谢您对这个问题的帮助,我将自己总结一下,但也包括到目前为止的实际说明和代码

编写控制台C#程序以执行以下操作:

    *
   ***
  *****
 *******
*********
*********
 *******
  *****
   ***
    *
  • 询问用户最大字符数。如果用户输入偶数加1将其转换为奇数,则应为奇数
  • 要求用户打印字符
  • 然后,您的程序应该输出两个倒置的垂直三角形,其底边等于#1中输入的数字,由#2中的字符组成
  • 三角形的一行中的字符数与其下一行中的字符数应相差2,以便三角形的顶部只有1个字符
  • 三角形的顶部(单个字符)应适当集中 确保您的代码遵循这些准则 -输出字符串应作为单个字符串变量从类返回 -类应该有一个公共函数,该函数将返回字符串并将#1和#2的输入作为参数 -代码应该有很好的注释和缩进 -检查所有无效输入值(例如,对于#1,不应接受任何字符)。对于不正确的输入,应向用户显示适当的信息 -应满足所有5项要求 -代码应该编译并运行,没有任何错误或警告
  • 例如: 如果用户为#1输入9,并为#2输入字符“*”,则程序应打印以下内容:

        *
       ***
      *****
     *******
    *********
    *********
     *******
      *****
       ***
        *
    
    到目前为止,我可以让代码打印出正确的字符数,但不能正确对齐到这个形状。 我会在这篇文章的底部附上我的代码。不管是谁,你能确切地解释一下for循环是如何实现这一点的吗?我知道这不是一个非常难的问题,但C#对我来说是一门新语言,课程完全是在线的,我感到迷失在这种概念性思维中。非常感谢所有回应的人

     public class Class1
        {
            public void Main(string[] args)
            {
                int n;
                char ch;
                
           
                try
                {
                    Console.Write("Enter the Max Number of Characters   ::");
                    n = int.Parse(Console.ReadLine());
                    if (n % 2 == 0)
                        n++;
                    Console.Write("Enter Character Which You Want to Print ::");//output message for display
                    ch = char.Parse(Console.ReadLine());//value to get from user
                    Console.WriteLine(PatternPrint(n, ch));
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
    
            }
            public string PatternPrint(int n, char ch)
            {
                int i, j, k, l;//variable to declare
                string str = "";//string to display
                for (i = 1; i <= n; i++)
                {
                    for (j = 1; j <= n - i; j++)
                    {
                        str = str + " ";
                    }
                    for (k = 1; k <= i; k++)
                    {
                        str = str + ch;
                    }
                    for (l = i -1; l >= 1; l--)
                    {
                        str = str + ch;
    
                    }
                    str = str + "\n";
                }
                return str;//return string
            }
    
    
    
            
        }
    }
    
    公共类1
    {
    公共void Main(字符串[]参数)
    {
    int n;
    char ch;
    尝试
    {
    控制台。写入(“输入最大字符数::”;
    n=int.Parse(Console.ReadLine());
    如果(n%2==0)
    n++;
    Console.Write(“输入要打印的字符:”;//输出消息以供显示
    ch=char.Parse(Console.ReadLine());//从用户处获取的值
    控制台写入线(图案打印(n,ch));
    }
    捕获(例外e)
    {
    控制台写入线(e.Message);
    }
    }
    公共字符串模式打印(int n,char ch)
    {
    int i,j,k,l;//要声明的变量
    string str=”“;//要显示的字符串
    
    对于(i=1;i您的逻辑有问题,因为它只在一个方向上打印。然而,根据您的要求,您还需要反向模式

    您的代码输出是:

            *
           ***
          *****
         *******
        *********
       ***********
      *************
     ***************
    *****************
    
    请尝试下面的代码,因为它是双向打印的

    using System;
    
    public class Test
    {
        public static void Main()
        {
            Console.Write("Enter the Max Number of Characters   ::");
            int totalChar = Convert.ToInt32(Console.ReadLine());
            
            Console.Write("Enter Character Which You Want to Print ::")
            char character = char.Parse(Console.ReadLine());
        
            totalChar = (totalChar % 2 == 0) ? totalChar += 1 : totalChar;
    
            int mainIndex, spaceIndex, charIndex;
        
            for(mainIndex = 1; mainIndex <= totalChar; mainIndex += 2)
            {
                for(spaceIndex = totalChar; spaceIndex >= mainIndex; spaceIndex -= 2)
                    Console.Write(" ");
            
                for(charIndex = 1; charIndex <= mainIndex; charIndex++)
                    Console.Write(character);
            
                Console.WriteLine();
            }
        
            for(mainIndex = totalChar; mainIndex >= 1; mainIndex -= 2)
            {
                for(spaceIndex = mainIndex; spaceIndex <= totalChar; spaceIndex += 2)
                    Console.Write(" ");
            
                for(charIndex = 1; charIndex <= mainIndex; charIndex++)
                    Console.Write(character);
            
                Console.WriteLine();
            }
        }
    }
    

    此代码适用于我:

    public string PatternPrint(int n, char ch) =>
        String.Join(
            Environment.NewLine,
            Enumerable
                .Range(1 - n / 2, n - 1)
                .Select(x => Math.Abs(x))
                .Select(i => "".PadLeft(i) + "".PadLeft(n - 2 * i - 1, ch)));
    
    给定
    5
    #
    我得到:

      #
     ###
    #####
     ###
      #
    

    下面是我的简要解释-

    观察示例-

    输入=>要使用“*”字符,它最多可以出现9次(三角形的底边)

    三角形中的每一行可以用两种方式格式化-

  • 空格,然后是字符
  • 空格,然后是字符,然后是空格
  • 遵守您的代码-

  • 你似乎在使用第一种方法
  • 第一个循环添加空白
  • 你可能会感到惊讶,但是你的第二个和第三个循环做了同样的事情,它们添加了字符,除了第三个循环少了一个字符
  • 根据示例我们需要什么-

  • 如果每行的最大字符使用量为n,则需要有n+1行。(再多行一行,因为较低的三角形不共享基数)
  • 三角形在(n+1)/2行中完成
  • 要完成上三角,每条线需要,每条线需要
  • 从(n-1)/2开始的空白,减少1
  • 从1开始的字符,增加2
  • 要完成下三角,每条线都需要
  • 空格从0开始,增加1
  • 从n开始的字符,减少2
  • 我鼓励你自己尝试一下,但完成后,这里是参考代码-

        public static string PatternPrint(int n, char ch)
        {
            StringBuilder sb = new StringBuilder();
            int spaces, characters;
    
            // Upper triangle
            spaces = (n - 1) / 2;
            characters = 1;
            for (int i = 0; i < (n+1)/2; i++)
            {
                Enumerable.Repeat(' ', spaces).ToList().ForEach(space => sb.Append(space));
                Enumerable.Repeat(ch, characters).ToList().ForEach(character => sb.Append(character));
                sb.Append('\n');
                spaces -= 1;
                characters += 2;
            }
    
            // Lower triangle
            spaces = 0;
            characters = n;
            for (int i = 0; i < (n+1)/2; i++)
            {
                Enumerable.Repeat(' ', spaces).ToList().ForEach(space => sb.Append(space));
                Enumerable.Repeat(ch, characters).ToList().ForEach(character => sb.Append(character));
                sb.Append('\n');
                spaces += 1;
                characters -= 2;
            }
    
            return sb.ToString();
        }
    
    公共静态字符串模式打印(int n,char ch)
    {
    StringBuilder sb=新的StringBuilder();
    int空格、字符;
    //上三角
    空格=(n-1)/2;
    字符=1;
    对于(int i=0;i<(n+1)/2;i++)
    {
    可枚举的.Repeat(“”,空格).ToList().ForEach(空格=>sb.Append(空格));
    可枚举的.Repeat(ch,characters).ToList().ForEach(character=>sb.Append(character));
    sb.追加('\n');
    空格-=1;
    字符+=2;
    }
    //下三角
    空格=0;
    字符=n;
    对于(int i=0;i<(n+1)/2;i++)
    {
    可枚举的.Repeat(“”,空格).ToList().ForEach(空格=>sb.Append(空格));
    可枚举的.Repeat(ch,characters).ToList().ForEach(character=>sb.Append(character));
    sb.追加('\n');
    空格+=1;
    字符-=2;
    }
    使某人返回字符串();
    }
    
    以上代码相关注释-

  • 使用StringBuilder来操作字符串。我认为它更高效,也更简单。可在命名空间
    System.Text中找到
  • C#在名称空间
    系统中提供Linq库。Linq
    。代码中使用的可枚举性就是其中的一部分。它提供了更多的东西和扩展方法。真的很酷
  • 总有改进的余地。我的解决方案是基于假设的。当这些假设被忽略时,它会默默地失败