2017-02-13 17 views
-3

Я попытался преобразовать код из цикла while в цикл For, но Im не получил желаемый результат.Преобразование всего кода из цикла while в цикл для Java в Java

Для кода Loop является:

public static void diamond1() { 
     System.out.println("Diamond Height: " + DIAMOND_SIZE); 
     System.out.println("Output for: For Loop"); 

     int noOfRows = DIAMOND_SIZE; 
     int md=noOfRows%2; 


     //Getting midRow of the diamond 
     int midRow = (noOfRows)/2; 

     //Printing upper half of the diamond 
     for (int i = noOfRows; i >= 0;i=(i-2)) 
     { 
      //Printing i spaces at the beginning of each row 
      for (int j = 1; j <= i-md; j++) { 
       System.out.print(" "); 
      } 
      //Printing j *'s at the end of each row 
      for (int j = 1; j <= (noOfRows+1-md); j++) { 
       if (i-md==0 && j==midRow+1) { 
        System.out.print("o "); 
       } 
       else { 
        System.out.print("* "); 
       } 
      } 
      System.out.println(); 
     } 

     //Printing lower half of the diamond 
     for (int i = 2; i <= noOfRows;i=(i+2)) { 
      //Printing i spaces at the beginning of each row 
      for (int j = 1; j <= i; j++) { 
       System.out.print(" "); 
      } 

      //Printing j *'s at the end of each row 
      for (int j=0; j <= (noOfRows); j++) { 
       System.out.print("* "); 
      } 

      System.out.println(); 
     } 
    } 

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

* * * 
* o * 
    * * * * 

Вывод, что нужно:

* 
* o * 
    * 

Оригинал в то время как цикл у меня был было получено:

public static void diamond2() { 

      System.out.println(""); 
      System.out.println("Output for: While loop"); 

    int noOfRows = DIAMOND_SIZE; 
    int md=noOfRows%2; 

    //Getting midRow of the diamond 
    int midRow = (noOfRows)/2; 
    int i = noOfRows; 
    while(i >= 0){ 
     //Printing i spaces at the beginning of each row 
     int j = 1; 
     while(j <= i-md){ 
      if(i-md==0)break; 
      System.out.print(" "); 
      j++; 
     } 

     //Printing j *'s at the end of each row 
     while(j <= (noOfRows+1-md)){ 
      if (i-md==0 && j==midRow+1) { 
       System.out.print("o "); 
      } 
      else { 
       System.out.print("* "); 
      } 
      j++; 
     } 
     System.out.println(); 
     i=(i-2); 
    } 

    i = 2; 
    while(i <= noOfRows){ 
    //Printing i spaces at the beginning of each row 
     int j = 1; 
     while(j <= i){ 
      System.out.print(" "); 
      j++; 
     } 

     //Printing j *'s at the end of each row 
     while(j <= (noOfRows+1-md)){ 

       System.out.print("* "); 
       j++; 

     } 
       System.out.println(); 
       i=(i+2); 
     } 

    } 

Может кто-нибудь помочь мне выяснить, что я делаю неправильно здесь?

+1

Ваш отладчик поможет вам здесь. –

+0

@ AndyTurner Я знаю, это может показаться глупым, но как я отлаживаю это? – donk2017

+1

Какова была ваша петля while? –

ответ

0

Когда вы использовали j в своих циклах while, вы использовали его как переменную для исходного цикла while. В ваших циклах вы используете j в своих вложенных циклах, которые отбрасывают ваш счет j. Чтобы исправить это, добавьте глобальную переменную int и добавьте 2 к ее значению в конце вашей верхней кольцевой петли. В нижнем цикле он установил значение j +1 в конце вашего первого вложенного цикла. Вот что готовый код для вашего для петель должен выглядеть следующим образом:

int count = 0; 
//Printing upper half of the diamond 
for (int i = noOfRows; i >= 0; i-=2) { 
    //Printing i spaces at the beginning of each row 
    for (int j = 1; j <= i-md; j++) { 
     if(i-md==0) { 
      break; 
     } 
     System.out.print(" "); 
    } 
    //Printing j *'s at the end of each row 
    for (int j = noOfRows - count; j <= (noOfRows+1-md); j++) { 
     if (i-md==0 && j==midRow+1) { 
      System.out.print("o "); 
     } 
     else { 
      System.out.print("* "); 
     } 
    } 
    System.out.println(); 
    count += 2; 
} 

//Printing lower half of the diamond 
count = 0; 
for (int i = 2; i <= noOfRows; i+=2) { 
    //Printing i spaces at the beginning of each row 
    for (int j = 1; j <= i; j++) { 
     System.out.print(" "); 
     count = j+1; 
    } 
    //Printing j *'s at the end of each row 
    for (int j = count; j <= (noOfRows); j++) { 
     System.out.print("* "); 
    } 
    System.out.println(); 
} 
0

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

Для меня быстрый взгляд на последнее время цикла в нижнем бриллианта показывает у вас есть следующий

//Printing j *'s at the end of each row 
     while(j <= (noOfRows+1-md)){ 

Но ваш последний цикл имеет это;

//Printing j *'s at the end of each row 
      for (int j=0; j <= (noOfRows); j++) { 

Таким образом, в то время как вы сравниваете j <= (noOfRows + 1 - md) , но в течение цикла вы только сравнивая j <= noOfRows

Это, кажется, вопрос.

+0

Я попытался изменить его, но не имеет значения. – donk2017

+0

Я также пробовал отлаживать, но не смог понять, где я ошибся. – donk2017

0

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

для цикла в Java состоит из трех частей:

  • Начальное значение
  • состоянии перед каждой итерации
  • действий после каждой итерации

Мы используем это для преобразования из while в for в трех шагах.

  1. На первом этапе, вы берете всю вашу while петли и заменить их for петли только с заполнением условия. напримерfor(;j <= i - md;).
  2. На втором шаге вы ищете действия. Если вы найдете в большинстве случаев последнюю строку ваших циклов while, поместите их в часть действия соответствующего цикла for. например, for(;j <= i - md; j++). Внимание! Будут случаи, когда это невозможно.
  3. Последний шаг - управление начальными состояниями. Определите случаи, когда можно указать начальное состояние для цикла for, потому что переменная не используется вне области (после) цикла. Затем вы можете поместить последнее значение в исходное состояние в свой цикл. например for(int j=1;j <= i - md; j++). Внимание! Будут случаи, когда это невозможно. В вашем случае этот шаг не имеет никакого смысла.

решение будет выглядеть следующим образом:

public static void diamond2() { 

    System.out.println("Solved by Stackoverflow.com. Have fun with it."); 
    System.out.println("Output for: For loops"); 

    int noOfRows = DIAMOND_SIZE; 
    int md = noOfRows % 2; 

    // Getting midRow of the diamond 
    int midRow = (noOfRows)/2; 
    int i = noOfRows; 
    for (; i >= 0; i = (i - 2)) { 
     // Printing i spaces at the beginning of each row 
     int j = 1; 
     for (; j <= i - md; j++) { 
      if (i - md == 0) 
       break; 
      System.out.print(" "); 
     } 

     // Printing j *'s at the end of each row 
     for (; j <= (noOfRows + 1 - md); j++) { 
      if (i - md == 0 && j == midRow + 1) { 
       System.out.print("o "); 
      } else { 
       System.out.print("* "); 
      } 
     } 
     System.out.println(); 
    } 

    for (i = 2; i <= noOfRows; i = (i + 2)) { 
     // Printing i spaces at the beginning of each row 
     int j = 1; 
     for (; j <= i; j++) { 
      System.out.print(" "); 
     } 
     // Printing j *'s at the end of each row 
     for (; j <= (noOfRows + 1 - md); j++) { 
      System.out.print("* "); 
      j++; 
     } 
     System.out.println(); 
    } 

} 

Кстати, ваш код не является правильным. Он не работает для равных размеров алмаза. Если вы хотите исправить это: выбросьте свой код, откиньтесь назад и подумайте о расстоянии до середины. Повеселись.

 Смежные вопросы

  • Нет связанных вопросов^_^