구구단 만들기

구구단을 만들어 보면서 for 반복문과 if 조건문, 그리고 인쇄시 오른쪽 정렬, 가운데 정렬 등 정렬, 공백 추가 등을 알아보겠습니다. 간단한 것인데도 Rust가 다른 언어와 다르다는 것을 다시 한번 더 느꼈습니다.

1. 구구단 만들기(실패)

fn main() {
    let mut i:i32;
    let mut j:i32;
    for i in 2..=9 {
        for j in 1..=9 {
            println!("{} * {} = {}",i,j,i*j) ;
        }
    }
}

위와 같이

let mut i:i32;
let mut j:i32;

라고 하니 warning: unused variable: i와 j 경고가 발생합니다.

그러나, 결과는 아래와 같이 잘 표시됩니다.

다시 말해 for 반복문에서 변수 i와 j를 사용하면 별도로 변수 선언이 필요하지 않다는 것을 알 수 있습니다.

그리고, for 반복문에서는 변수 앞에 mut를 붙이지 않아도 된다는 것을 알 수 있습니다.

오히려 mut를 붙여서 for mut i in 2..=9 {라고 하면

warning: variable does not need to be mutable라는 경고가 발생합니다.

2. 구구단 만들기(부분 성공)

let 문 2개를 지우고 실행하니

fn main() {
    for i in 2..=9 {
        for j in 1..=9 {
            println!("{} * {} = {}",i,j,i*j) ;
        }
    }
}

아래와 같이 출력결과가 잘 표시됩니다. 그러나, 2 * 1 = 2에서 결과값 2가 오른쪽 정렬이 되면 좋겠습니다.

3. 구구단 만들기(성공)

이럴 때 사용할 수 있는 것이 표시될 너비를 지정하는 것으로

{:2}라고 지정하면 됩니다.

따라서 코드는 아래와 같습니다.

fn main() {
    for i in 2..=9 {
        for j in 1..=9 {
            println!("{} * {} = {:2}",i,j,i*j) ;
        }
    }
}

출력 결과가 아래와 같이 깔끔합니다.

4. 구구단 한 줄에 3개씩 표시하기

i를 3칸씩 떨어져서 실행하고,

결과 표시를 i, i+1, i+2를 이용해 표시하는데, 중간에 공백 10칸을 넣은 후 i+1과 i+2를 오른쪽 정렬로 넣기 위해 {:>10}이라고 하면 됩니다.

오른쪽 정렬은 >, 왼쪽 정렬은 <, 가운데 정렬은 ^를 사용합니다.

완성된 코드는 아래와 같습니다.

fn main() {
    for i in (2..=9).step_by(3) {
        for j in 1..=9 {
            println!("{} * {} = {:2}{:>10} * {} = {:2}{:>10} * {} = {:2}",
                      i,j,i*j, i+1,j,(i+1)*j, i+2,j,(i+2)*j);
        }
    }
}

출력된 결과는 아래와 같습니다.

5. 구구단이 한 단이 끝난 다음 공백 2줄 추가하기

공백 2줄을 추가하기 위해

print!(“\n\n”) ;

또는

println!();
println!();

을 사용합니다.

전체 코드는 아래와 같습니다.

fn main() {
    for i in (2..=9).step_by(3) {
        for j in 1..=9 {
            println!("{} * {} = {:2}{:>10} * {} = {:2}{:>10} * {} = {:2}",
                      i,j,i*j, i+1,j,(i+1)*j, i+2,j,(i+2)*j);
        }
        print!("\n\n");
    }
}

6. 구구단 명 표시하기(실패)

구구단명을 표시하려면 구구단명을 가운데 정렬(^사용)로 표시하고, 단 이름과 단 이름사이에 공백을 10개 추가해야 한다고 생각했는데, 8로 해야 제대로 보입니다. 따라서 {:>8}로 하고 값이 없으므로 “”,를 추가했습니다.

완성된 코드는 아래와 같고

fn main() {
    for i in (2..=9).step_by(3) {
        println!("{:^10}{:8}{:^10}{:8}{:^10}",
                    i.to_string()+"단","",
                    (i+1).to_string()+"단","",
                    (i+2).to_string()+"단");
                    
        for j in 1..=9 {
            println!("{} * {} = {:2}{:>10} * {} = {:2}{:>10} * {} = {:2}",
                      i,j,i*j, i+1,j,(i+1)*j, i+2,j,(i+2)*j);
        }
        println!();
        println!();
    }
}

결과는 아래와 같습니다. 9단까지 표시돼야 하는데, 3개씩 표시하다 보니 10단까지 표시됐습니다.

7. 구구단 명 표시하기(성공)

10단이면, 다시 말해 (i+2)가 9보다 크면 인쇄하지 않고, 9이하일 때만 인쇄해야 하므로 아래와 같이 if 문을 사용해야 합니다.

fn main() {
    for i in (2..=9).step_by(3) {
        if (i+2) <= 9 {
            println!("{:^10}{:8}{:^10}{:8}{:^10}",
                        i.to_string()+"단","",
                        (i+1).to_string()+"단","",
                        (i+2).to_string()+"단");

            for j in 1..=9 {
                println!("{} * {} = {:2}{:>10} * {} = {:2}{:>10} * {} = {:2}",
                          i,j,i*j, i+1,j,(i+1)*j, i+2,j,(i+2)*j);
            }
                        
        } else {
            println!("{:^10}{:8}{:^10}",
                        i.to_string()+"단","",
                        (i+1).to_string()+"단");

            for j in 1..=9 {
                println!("{} * {} = {:2}{:>10} * {} = {:2}",
                          i,j,i*j, i+1,j,(i+1)*j);
            }
                        
        }
                        
        println!();
        println!();
    }
}

9단까지만 잘 표시됐습니다.