for문을 사용한 별 찍기
<풀이 1>
public class Main{
public static void main(String[] args) {
for(int i=0;i<5;i++) {
for(int j = 5;j-i>0;j--) {
System.out.print("*");
}
System.out.println();
}
}
}
<풀이 2>
public class Main{
public static void main(String[] args) {
for(int i=5;i>0;i--) {
for(int j = 0;j<i;j++) {
System.out.print("*");
}
System.out.println();
}
}
}
while문을 사용해 별 찍기
<오답>
public class Main{
public static void main(String[] args) {
int i =0;
int j =5;
while(i<5) {
while(j-i>0) {
System.out.print("*");
j--;
}
i++;
System.out.println();
}
}
}
중첩이 되어있는 while문을 보면 j값이 첫 번째 반복에서 j = 0이 돼버린다. 그래서 그 뒤로 어떤 i값이 와도 조건식 연산에서 0 - i 가돼 버리니 조건에 맞지 않아 반복문을 수행할 수 없는 상태가 돼버리는 것이다. 그렇기 때문에 각 반복마다 j값이 새롭게 초기화될 수 있게끔 해주어야 한다.
<정답 코드>
public class Main{
public static void main(String[] args) {
int i;
i=5;
while(i>0) {
int j=0;
while(j++<i) {
System.out.print("*");
}
i--;
System.out.println();
}
}
}
중첩된 while문의 조건식을 보면, j++ < i의 식이 있다.
j++ < i에서, ++(후위 연산자)가 먼저일까? <(대소 비교 연산자)가 우선일까? 언뜻 보면 < 의 연산자가 우선순위가 더 높다라고 생각될 수 있다. 그렇지만 연산자 우선순위는 후위 연산자가 더 높다. 즉 연산을 더 우선적으로 시행한다.
그렇다면 왜 출력 결과가 알맞게 나오는 것일까? 후위 연산자의 기능은 속한 문장을 먼저 진행한 후, 값을 1 증가(선연산, 후 증가). 다시 말해 j를 1 증가하고 증가 전의 값을 반환한다고 보면 될 것 같다.
중첩된 while문의 조건식을 j < i로 하고, j++;을 while문안에 따로 작성해 주어도 된다.
do while문을 활용해 별 찍기
<오답>
public class Main{
public static void main(String[] args) {
int i;
i = 5;
do {
int j = 0;
do {
System.out.print("*");
}while(j++<i);
i--;
System.out.println();
}while(i>0);
}
}
System.out.print("*"); 출력문의 위치가 잘못되어, 내가 생각한 별의 개수보다 한 개씩 더 출력이 되는 것을 볼 수 있다.
<정답>
public class Main{
public static void main(String[] args) {
int i;
i = 5;
do {
int j = 0;
while(j++<i)
System.out.print("*");
System.out.println();
i--;
}while(i>0);
}
}
do while문의 중첩을 올바르게 사용하였고, 출력문의 위치도 올바른 위치에 있기 때문에 우리가 원하는 출력 결과가 나오게 되었다.