2011-01-13 5 views
-1

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

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

#

##

###

## ##

#####

######

#####

####

###

##

#

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

 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 

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

ответ

2
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

Закрыть, но вы хотите начать уменьшаться, когда идете «назад». Вы можете либо сделать две петли;
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(); 
    } 
+0

+ 1 хорошо, но почему бы не написать строку с 'новой строки (символ, пик - Math.abs (строка-пик))' и drop a second для –

+0

Старалась держать его как можно ближе к его коду, чтобы сосредоточиться на логике кода, а не на синтаксисе – Rob

1

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

предупреждение не тестировалось

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

Вот версия с петля и версия с 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 
0
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)); 
     } 
    } 
} 
} 

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

Надеюсь, это поможет.С уважением

1

так, как я хотел бы сделать это:

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--)); 
     } 

    } 
0
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--; 
      }    
     } 
    } 
} 
Смежные вопросы