2015-03-05 3 views
0

У меня есть два бита кодаКак передать переменные в качестве параметров

Tree tree; 

void setup() { 
    int SZ = 512; // screen size 

    int d = 2; 
    int x = SZ/2; 
    int y = SZ; 

    size(SZ,SZ); 
    background(255); 
    noLoop(); 

    tree = new Tree(d, x, y); 
} 

void draw() { 
    tree.draw(); 
} 

, а также

class Tree { 

    // member variables 
    int m_lineLength;  // turtle line length 
    int m_x;    // initial x position 
    int m_y;    // initial y position 
    float m_branchAngle;  // turtle rotation at branch 
    float m_initOrientation; // initial orientation 
    String m_state;   // initial state 
    float m_scaleFactor;  // branch scale factor 
    String m_F_rule;   // F-rule substitution 
    String m_H_rule;   // H-rule substitution 
    String m_f_rule;   // f-rule substitution 
    int m_numIterations; // number of times to substitute 

    // constructor 
    // (d = line length, x & y = start position of drawing) 
    Tree(int d, int x, int y) { 
    m_lineLength = d; 
    m_x = x; 
    m_y = y; 
    m_branchAngle = (25.7/180.0)*PI; 
    m_initOrientation = -HALF_PI; 
    m_scaleFactor = 1; 
    m_state = "F"; 
    m_F_rule = "F[+F]F[-F]F"; 
    m_H_rule = ""; 
    m_f_rule = ""; 
    m_numIterations = 5; 

    // Perform L rounds of substitutions on the initial state 
    for (int k=0; k < m_numIterations; k++) { 
     m_state = substitute(m_state); 
    } 
    } 

    void draw() { 
    pushMatrix(); 
    pushStyle(); 

    stroke(0); 
    translate(m_x, m_y);  // initial position 
    rotate(m_initOrientation); // initial rotation 

    // now walk along the state string, executing the 
    // corresponding turtle command for each character 
    for (int i=0; i < m_state.length(); i++) { 
     turtle(m_state.charAt(i)); 
    } 

    popStyle(); 
    popMatrix(); 
    } 

    // Turtle command definitions for each character in our alphabet 
    void turtle(char c) { 
    switch(c) { 
    case 'F': // drop through to next case 
    case 'H': 
     line(0, 0, m_lineLength, 0); 
     translate(m_lineLength, 0); 
     break; 
    case 'f': 
     translate(m_lineLength, 0); 
     break; 
    case 's': 
     scale(m_scaleFactor); 
     break; 
    case '-': 
     rotate(m_branchAngle); 
     break; 
    case '+': 
     rotate(-m_branchAngle); 
     break; 
    case '[': 
     pushMatrix(); 
     break; 
    case ']': 
     popMatrix(); 
     break; 
    default: 
     println("Bad character: " + c); 
     exit(); 
    } 
    } 

    // apply substitution rules to string s and return the resulting string 
    String substitute(String s) { 
    String newState = new String(); 
    for (int j=0; j < s.length(); j++) { 
     switch (s.charAt(j)) { 
     case 'F': 
     newState += m_F_rule; 
     break; 
     case 'H': 
     newState += m_F_rule; 
     break; 
     case 'f': 
     newState += m_f_rule; 
     break; 
     default: 
     newState += s.charAt(j); 
     } 
    } 
    return newState; 
    } 

} 

Это не оценивается домашнее задание, это конец главы упражнения, но я очень застрял ,

Я хочу «расширить конструктор дерева так, чтобы значения для всех переменных-членов дерева могли быть переданы как параметры».

Хотя я понимаю, какие переменные и параметры есть, я очень зациклен на том, что начать читать/где начать редактирование кода.

Одна вещь, которая смутила меня и заставила меня понять, что, если я изменяю значения конструктора (например, m_numiterations = 10;), вывод, когда код запускается, тот же.

Любые указатели в правильном направлении были бы очень признательны.

+0

На каком языке это? Я предполагаю, что это 'Java'. Попробуйте найти конструкторы. –

+0

@LuisLavieri p rocessing.org basic java Thanks –

+0

Проверьте мой ответ Майк. Я пошел на другой уровень java. Но это тот же принцип. Я не уверен, что в процессе обработки у вас есть классы. Но, он должен быть таким же, как я объяснил ... –

ответ

3

У вас уже есть все, чтобы добавить больше материала на ваш Tree.

Вы видите, в вашем setup(), вы звоните:

tree = new Tree(d, x, y); 

Теперь, эта линия, на самом деле вызов застройщик реализован здесь:

Tree(int d, int x, int y) { 
    m_lineLength = d; 
    m_x = x; 
    etc.... 

Итак, если вы хотите, вы можете изменить это конструктор для принятия любой переменной, которую вы хотите передать от setup()

Например, Tree(int d, int x, int y, String word, float number, double bigNumber)

Попробуйте поэкспериментировать с этим. Если у вас есть какие-либо вопросы, PM мне

EDIT

Позвольте мне добавить немного больше аромата к нему:

Вы видите Конструкторы путь для инициализации класса. Не имеет значения уровень доступа (protected, public, private) или количество конструкторов.

Так, например, Скажем, у вас есть этот класс с двумя общими полями:

public class Book 
{ 
    public String Author; 
    public String Title; 
    public Book(String title, String author) 
    { 
     this.Title = title; 
     this.Author = author; 
    } 

    public Book() 
    { 
     this("Any title");//default title 
    } 
} 

Здесь Вы можете создавать книги как с автором и названием или только титул! не так ли? Вы можете создавать вещи, которые не включены в другие вещи!

Надеюсь, вы это поняли. Но в основном идея состоит в том, чтобы инкапсулировать все, что имеет значение для определенной темы, в свой класс.

правка

Майк, вы видите, в соответствии с вашим комментарием вы добавили эту строку:

int m_numIterations = 25;

Дело в том, что вы только что сделали только создать переменную. Переменная содержит информацию, которую вы в конечном итоге хотите использовать в программе. Предположим, вы находитесь в физике средней школы, пытаясь решить основную проблему свободного падения. Вы должны указать на гравитацию, не так ли?

Так, в записной книжке, вы бы:

g = 9.8 m/s^2

правильно? это постоянная. Но переменная, которую вы будете использовать в своей проблеме.

Ну, то же самое относится и к программированию.

Вы добавили строку. Это означает, что теперь вы можете использовать его в своей проблеме.

Теперь перейдите к этой линии,

tree = new Tree(d, x, y);

и изменить его на:

tree = new Tree(d, x, y, m_numIterations);

Как вы можете видеть, теперь вы готовы "использовать" переменную в ваше дерево. Однако! вы еще не закончили. Вы также должны обновить свой конструктор, потому что если нет, компилятор будет жаловаться!

Перейти к этой линии сейчас,

Tree(int d, int x, int y) { 
    m_lineLength = d; 
    m_x = x; 
    .... 

И изменить его на:

Tree(int d, int x, int y, int iterations) { 
    m_lineLength = d; 
    m_x = x; 
    .... 

Вы, видите, теперь, вы сообщаете свое дерево, чтобы принять новые итерации переменных вызовов, что вы установка из другого места.

Однако! Имейте в виду! Существует небольшая проблема :(

У вас нет кода, касающийся использования этой переменной. Итак, если вы ожидаете увидеть что-то другое в дереве, этого не произойдет! необходимо найти использование переменной в пределах области дерева (тот, который я назвал iterations). Итак, сначала найдите его для использования! или разместите еще какой-нибудь код, который поможет вам решить его. вызывая переменные итерации, это потому, что вы планируете использовать петлю где-то, амирит? Позаботься о себе. Маленькие шаги. Будьте терпеливы. Я добавил немного больше к примеру Книги. Я забыл объяснить это вчера: p

+0

Спасибо.Надеюсь, мне не понадобится. Проскальзывание через ваш ответ немного облегчило его. Я напечатал его, чтобы прочитать его внимательно. Еще раз спасибо. –

+0

Я не вижу, как до PM. Я полностью прочитал ваш ответ (еще раз спасибо), но не могу передать новые переменные. Должна ли переменная быть такой Дерево дерева; void setup() { int SZ = 512; // размер экрана int d = 2; int x = SZ/2; int y = SZ; int m_numIterations = 25; размер (SZ, SZ); фон (255); noLoop(); tree = новое дерево (d, x, y); } void draw() { tree.draw(); } Добавив строку int m_numIterations = 25; выход такой же. Спасибо –

+0

@mikeeustace У StackOverflow нет функции PM, о которой я знаю. Вы можете начать чат, но обычно лучше просто задать другой вопрос. Попытайтесь сварить свою проблему до [MCVE] (http://stackoverflow.com/help/mcve), а не весь ваш эскиз, сначала. –