2014-01-16 3 views
0

Я практикую свои навыки программирования с довольно распространенной проблемой, чтобы нарисовать дерево ASCII, состоящее из буквы (скажем, x), чтобы нарисовать дерево.Рисование дерева ASCII с использованием вложенных for-loops

Ie:

Prompt: Enter the number of lines for your tree: 5 
Output: 
    x 
    xxx 
xxxxx 
xxxxxxx 
    x 

Решение У меня в настоящее время работает, как я хочу, чтобы это. Мне не хватает одной функции (которая является частью моего вопроса). Проблема в том, что я не понимаю условия for-loop, которые я использовал. Да, я получил помощь от другого человека, и я до сих пор не понимаю их логики, но он работает. Пожалуйста, пожалуйста, пожалуйста, объясните мне, как условные выражения for for работают на самом деле для того, чтобы рисовать то, что я хочу. x.x Кроме того, я не могу нарисовать последний «пень» дерева, последний х в последней строке.

Вот мой код.

static void Main(string[] args) 
     { 
      int lines = 0; 
      Console.WriteLine("Enter number of lines: "); 
      string LinesAsString = Console.ReadLine(); 
      lines = Convert.ToInt32(LinesAsString); 
      print(lines); 
     } 


     public static void print(int lines) 
     { 

      for (int i = 0; i < lines; i++) 
      { 
       for (int a = 0; a < lines-i-1; a++) 
       { 
        Console.Write(" "); 
       } 

       for (int y = 0; y < i*2 + 1; y++) 
       { 

        Console.Write("x"); 


       } 
       Console.WriteLine(); 

      } 





     } 

Любая помощь приветствуется.

Спасибо.

ответ

0

Первый цикл for Х печатает в левую прокладку (все пространства). Выражение lines - i - 1 приходит образует тот факт, что вам нужно центрировать дерево, и вы знаете, что линия 0 имеет один x, линия 1 имеет 3 (xxx), линия 2 имеет 5 (xxxxx) и так далее. Но количество левых пространств зависит от общего количества строк, которые имеет дерево, поэтому вам нужно принять во внимание lines, а также индекс текущей строки (который является значением переменной i). Для того, чтобы выяснить отношения между этими двумя, вы можете просто попробовать с небольшим числом уровней, скажем, 3:

__x  2 for the 1st line. 
_xxx 1 for the 2nd line. 
xxxxx 0 for the 3rd line. 

Второй for цикл печатает x с. Он знает, что для первой строки (i = 0) необходимо распечатать один x, поэтому, когда i - 0, y должно быть 1, поэтому + 1. * 2 происходит от прогрессии i * 2 + 1 = {1, 3, 5, 7...}, которая представляет собой число x s в каждой строке.

Для печати последнего символа заглушки вы можете использовать ту же логику, что и в первом цикле for, вставив количество пробелов для первой строки, за которым следует один x.

Console.Write(new String(' ', lines - 1) + "x"); 

Это должно быть добавлено только после for цикла, который содержит два других петель.

+0

Тупой вопрос - что я могу сказать, когда вы имеете в виду «индекс текущей линии»? – TimelordViktorious

+0

Я имел в виду переменную 'i', которая указывает, какая строка печатается на выходе на каждой итерации' for', которая включает в себя две другие. Просто отредактировал ответ, чтобы уточнить этот момент. –

+0

Спасибо - это очень полезно. Кажется, я понимаю это сейчас. Моя единственная забота - в будущем, с подобными проблемами, мне, вероятно, понадобится помощь с такими вещами! Какие-нибудь подсказки для стратегий решения проблем такого рода? :п – TimelordViktorious

0

Это довольно просто:

Каждая итерация первый цикл рисует линию. Предположим, что вы имеете 4 линии (я не рассматривает один с одинокой х):

линии 1 (я = 0): 3 пространства 1 х
линия 2 (я = 1): 2 места 3 х
строка 3 (= 2): 1 пространства 5 х
строка 4 (я = 3): 0 пространства 7 х

из них можно получить соотношение между числом пространств, х годов, индекс строки i и количество строк.

spaces = (lines - i) - 1 // decreases by one every iteration starting at lines - 1 
    x = i * 2 + 1 // the odd numbers in increasing order 

Первый цикл нарисовать пространства, а второй

0
int count = 0; 
      for (int i = 0; i < 8; i++) 
      { 
       for (int x = 0; x < 8-i-1; x++) 
       { 
        Console.Write(" "); 
       } 
       for (int j = 0; j < i*2+1; j++) 
       { 
        Console.Write("X"); 
       } 
       Console.WriteLine(); 
      } 
      //solution to your stump problem 
      for (int i = 0; i < 4; i++)//the no. 4 means that you stump will be made from four X's 
      { 
       for (int x = 0; x < 8-count-1; x++) 
       { 
        Console.Write(" "); 

       } 
       Console.Write("X"); 
       Console.WriteLine(); 
      } 
      Console.ReadKey(); 
Смежные вопросы