Как напечатать равнобедренный треугольник - PullRequest
0 голосов
/ 13 января 2011

Я пытаюсь изучать программирование самостоятельно, я работаю из книги, в которой есть следующая проблема, которую я не могу решить:

Разрешить пользователю вводить два значения: aсимвол, который будет использоваться для печати равнобедренного треугольника и размера вершины треугольника.Например, если пользователь вводит # для символа и 6 для пика, вы должны отобразить следующее:

#

##

###

####

#####

######

#####

* 20* ####

###

##

#

Это код, который я получил до сих пор:

        char character;
        int peak;

        InputValues(out character, out peak);

        for (int row = 1; row < peak * 2; row++)
        {
            for (int col = 1; col <= row; col++)
            {                    
                Console.Write(character);
            }
            Console.WriteLine();
        }
        Console.Read() // hold console open

Заранее спасибо.

Ответы [ 7 ]

2 голосов
/ 13 января 2011
for (int row = 0; row < peak; row++)
{
    Console.WriteLine(new string(character, row + 1));
}
for (int row = 1; row < peak; row++)
{
    Console.WriteLine(new string(character, peak - row));
}
2 голосов
/ 13 января 2011

Близко, но вы хотите начать снижаться, когда вы идете «обратно вниз».Вы можете сделать две петли;0 -> peak, затем (peak - 1 -> 0), который напечатает оба «направления».

Альтернативой является выяснение того, насколько далеко вы находитесь от вершины в терминах строк, и распечатка такого количества символов.

    for (int row = 0; row < peak*2; row++)
    {
        for(var i = 0; i < peak -  Math.Abs(row - peak); i++)
            Console.Write(character);
        Console.WriteLine();
    }
1 голос
/ 21 июля 2013

Как я это сделал:

    static void drawIsoscelesTraiangle(char repeatChar, int peak, int current)
    {
        for (int i = 0; i < peak; i++)
        {
            Console.WriteLine(new String(repeatChar, current++));
        }
        for (int i = current; i > 0; i--)
        {
            Console.WriteLine(new String(repeatChar, current--));
        }

    }
1 голос
/ 13 января 2011

Небольшая альтернатива ответу Юрия Факторовича (мне никогда не удавалось использовать понижения, поэтому я не мог устоять)

предупреждение не проверено

for (int row = 0; row < peak; row++)
{
    Console.WriteLine(new string(character, row + 1));
}
for (int row = peak, row > 1; row--)
{
    Console.WriteLine(new string(character, row));
}
0 голосов
/ 21 мая 2016
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Ch6ex10
{
    class Isosceles
    {
        static void Main(string[] args)
        {            
            OutputTraiangle(InputCharacter(), InputPeak());
            Console.ReadLine();
        }

        //Allow user to input a character to be used as the triangle
        public static char InputCharacter()
        {
            string inputValue;
            char character;

            Console.Write("Enter the character to be used to display the  triangle: ");
            inputValue = Console.ReadLine();
            character = Convert.ToChar(inputValue);
            return character;
        }

        //Allow user to input an integer for the peak of the triangle
        public static int InputPeak()
        {
            string inputPeak;
            int peak;

            Console.Write("Enter the integer amount for the peak of the triangle: ");
            inputPeak = Console.ReadLine();
            peak = Convert.ToInt32(inputPeak);
            return peak;
        }

        //Output the triangle using the users character choice and peak size (first half)
        public static void OutputTraiangle(char character, int peak)
        {
            int start = 1;
            int finish = (peak - 1);

            while (start != peak)
            {
                for (int amount = 1; amount <= start; amount++)
                {
                    Console.Write(character);
                }
                Console.WriteLine();
                start++;                
            }

            for (int amount = 1; amount <= peak; amount++)
                {
                     Console.Write(character);
                }
            Console.WriteLine();

            while (finish != 0)
            {
                for (int amount = 1; amount <= finish; amount++)
                {
                    Console.Write(character);
                }
                Console.WriteLine();
                finish--;
            }            
        }
    }
}
0 голосов
/ 13 января 2011
using System;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char drawChar = '#';
            int repeatNumber = 5;
        Program.drawIsoscelesTraiangle(drawChar, repeatNumber, 1);
        Console.ReadKey();
    }
    static void drawIsoscelesTraiangle(char repeatChar, int peak, int current)
    {
        if (current < peak)
        {
            Console.WriteLine(new string(repeatChar, current));
            Program.drawIsoscelesTraiangle(repeatChar, peak, current + 1);
            Console.WriteLine(new string(repeatChar, current));
        }
        else
        {
            Console.WriteLine(new string(repeatChar, current));
        }
    }
}
}

Я не позаботился о том, чтобы получать пользовательские вводы, а довольно жестко запрограммировал их.Но если я не правильно понял, это то, что вы хотели.Это очень просто, если вы подумаете об этом :) При этом используется тактика под названием «рекурсия», которую вы должны изучить, если у вас ее еще нет.Привет

0 голосов
/ 13 января 2011

Вот версия с циклом и версия с LINQ ...

Console.WriteLine("peak");
var peak = int.Parse(Console.ReadLine());
Console.WriteLine("char");
var @char = (char)Console.Read();

//As LINQ
var query = (from row in Enumerable.Range(0, peak * 2)
             let count = peak - Math.Abs(peak - row)
             let str = new string(@char, count)
             select str
            ).ToArray(); //if you have .Net 4.0+ you don't need the .ToArray()
Console.WriteLine(string.Join(Environment.NewLine, query));

//As Loop
for (int r = 1; r < peak * 2; r++)
    Console.WriteLine("{0}", new string(@char, peak - Math.Abs(peak - r)));
Console.Read(); // hold console open 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...