오늘은 어제에 이여서 C언어 두번째 실습편입니다. c언어를 배우면 제일 먼저 실습 주제로 구구단을 코딩하게 됩니다. 학교에서나 학원에 가시면 무조건 이 코딩을 실습하게 되는데 국민 실습 코딩 주제로 생각하시면 됩니다. 구글 검색을 하시면 진짜 많이 게시물을 보실 거에요. 너무 유명한 주제의 코딩이라서 굳이 저까지 post로 작성을 할 필요가 있을지 하는 생각에 넘어 가려다가 그래도 어떻게 코딩하는지 그 과정과 어떻게 응용하는지 그 과정을 소개하면 좋을 것 같아서 오늘 주제는 구구단으로 결정했네요.
그러면 구구단이 어떻게 만들어지고 어떻게 응용하여 코딩 할 수 있는지 알아 볼까요.
구구단은 어떻게 생겼나요. 우선 그 형태를 알아 볼까요.
2x1=2
2x2=4
2x3=6
2x4=8
2x5=10
2x6=12
2x7=14
2x8=16
2x9=18
이렇게 2단을 한번 써봤네요. 이 형태를 코딩을 해볼까요.
위 2단의 코딩을 보시면 어떤 규칙이 있는지 자세히 살펴보세요. 2가 9개 1~9까지의 숫자가 규칙적으로 나열된다 그리고 2에 대해 1~9까지의 숫자를 실제 곱한 결과가 나와 있습니다. 여기서, 규칙적인 숫자 1~9까지라 이 부분을 보신 분들은 for문의 원리를 기억 하신분들은 바로 이걸 for문을 이용하면 되겠군 하는 생각이 떠올라야 합니다.
for(i=1;i<=9;i++){
}
이게 머리속에서 떠올라야 합니다. 2단을 출력해 볼까요.
int i;
int inputVal=2;
for(i=1;i<=9;i++){
printf("%d x %d = %d\n,inputVal,i,inputVal*i);
}
[결과]
이렇게 출력 됩니다. 그런데 구구단은 2단만 있는게 아니죠 1~9단까지 총 9개 단이 있습니다. 이 부분도 생각해보세요. 떠올라야 합니다. 1~9단이라 그러면 또 for문이지 하고요.
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
printf("%d x %d = %d \n",i,j,i*j);
}
}
이렇게 2중 for문으로 i은 단을 나타내고 j은 1~9까지 곱을 하는 숫자를 나타냅니다.
[결과]
각 단별로 쭉 아래로 구구단이 출력 됩니다. 위 이미지는 원래 1단부터 출력 되는데 마지막 단부분만 잘려있네요.
이처럼 뭔가 구구단을 출력하는데 보기가 좀 그렇죠. 구구단은 만들었는데 보기에 좀 불편합니다.
이제 구구단을 응용해 볼까요.
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
printf("%d x %d = %d \n",i,j,i*j);
}
}
위 코딩에서 조금만 수정 하면 됩니다.
[소스]
#include
int main(int argc, char *argv[]) {
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
printf(" | %dx%d=%2d", j, i, i*j);
}
printf(" |\n");
}
return 0;
}
위 소스를 보시면 j가 단이 되고 i가 1~9까지의 곱을 나타냅니다. 가로로 1~9단을 출력하기 때문에 처음에 구구단 코딩은 세로로 출력이라면 이건 가로로 출력이 되도록 바꾼 것이죠.
2x1=2 3x1=3 4x1=4 5x1=5 6x1=6 7x1=7 8x1=8 9x1=9
이런식으로 가가로 출력하고 for문 j가 끝나면 새로운 라인으로 이동 '\n' 명령어로 다은 곱을 출력하면 됩니다.
추가로
%2d => 출력 영역 2를 잡고 숫자를 오른쪽정렬로 해서 출력되게 함
%-2d => 출력 영역 2를 잡고 숫자를 왼쪽정렬로 해서 출력되게 함
글자를 출력하는 공간을 잡는 것인데 1이라는 숫자를 %3d에 출력하면 1앞에 2개의 공백 띄우고 1이라는 숫자가 출력 됩니다. 말보다는 결과를 보시면 이해가 빠르겠지요.
[결과]
깔끔하게 전체 구구단이 출력 되었죠.
여러분들은 여기서 끝나면 안됩니다. 한번 더 응용을 해봅시다.
현재 지금까지 배운 C언어 기초문법을 응용하는 편이기 때문에 배운 내용 중 몇가지를 더 추가해서 응용을 해봐야겠지요.
우선 출력하고 싶은 구구단을 사용자가 직접 입력을 받고 싶다면 scanf()함수를 이용하면 됩니다.
scanf("%d",&inputVal);
이렇게 외부에서 입력을 받도록 만들었습니다.
그다음 입력 받은 구구단를 출력 해야 겠죠. 처음 2단을 출력한 코딩을 그대로 적용 하면 됩니다.
for(i=1;i<=9;i++){
printf("%2dx%d=%-2d \n",inputVal,i,inputVal*i);
}
원하는 단을 입력받는데 계속 받도록 하고 싶다면 어떻게 해야 할까요. while()문이 떠오르셔야 합니다. 언제까지인지 모르지만 계속 반복을 한다면 가변적 반복이니깐 while문입니다. 여기서 더 깊게 생각한다면 구구단 프로그램이니깐 어찌되었든 무조건 한번은 외부에서 입력을 받아야 겠죠. 그러면 do-while()문이 떠올라야 합니다.
그리고 마지막에는 무한 구구단 입력을 받으면 안되겠죠. 뭔가 빠져나오는 조건을 만들어야 겠죠. 구구단을 탈출하는 조건식을 만들어야 합니다. 여기에서는 그냥 0단이 입력되면 구구단을 종료하는 걸로 했습니다. 원래는 따로 문자로 종료 y or n로 하셔도 되지만 그냥 두번 scanf()입력 받도록 하기 귀찮아서 0단으로 빠져나오게 표현했네요.
[소스]
#include
#include
int main(int argc, char *argv[]) {
int i,j;
int inputVal=2;
do{
printf("원하는 구구단을입력하시오?(종료=0)");
scanf("%d",&inputVal);
if(inputVal!=0){
system("cls");
printf("[%d 구구단]\n",inputVal);
for(i=1;i<=9;i++){
printf("%2dx%d=%-2d \n",inputVal,i,inputVal*i);
}
}
}while(inputVal!=0);
return 0;
}
구구단 코딩 부분은 굳이 설명은 안드려도 되겠죠. 여기서 새로운 한개가 코딩되었는데 뭘까요.
#include
system("cls");
이 코딩은 시스템 명령으로 cls은 화면을 지우는 명령입니다. 즉, 구구단을 입력 받고 출력하고 계속 반복하다보면 콘솔창에 출력부분이 세로로 계속 출력되면 지져분하고 보기도 안좋습니다. 그래서 새로 구구단이 입력 될 때마다 이전 구구단은 지우도록 하는 명령을 새롭게 추가했습니다. 이건 사실 초보 코딩부분이 아니라 어느정도 익숙하신 분들이 쓰는 표현이라 이정도까지는 초보분들은 아실 필요없이 이런게 있다는 정도만 이해해 주세요.
아무튼 결과를 보죠.
[결과]
2단 입력 후 다시 0단 입력으로 do-while문을 빠져나온 결과네요. 아무튼 깔끔하게 입력 받은 구구단이 출력 되었네요.
오늘은 구구단을 코딩하는 과정을 보여 드렸습니다. 이처럼 구구단은 2중 for문을 이용하여 출력 할 수 있는데 처음에서는 세로로 출력 했다가 다시 가로로 출력하고 다시 구구단을 입력 받아 해당 구구단을 출력하는 응용 코딩을 하였습니다.
이처럼 구구단 하나의 주제를 가지고 다양한 방식의 코딩을 할 수 있습니다. 이 표현 뿐 아니라 다른 표현도 가능합니다. 얼마나 상상하고 응용하느냐에 따라 코딩은 다양해 집니다. 이런 표현은 지금까지 post한 내용을 기반으로 충분히 여러분들도 하실 수 있습니가.
이렇게 해서 전반부분 내용을 최대한 구구단 코딩에 담아 냈습니다. 코딩이란 어떤 하나를 주제로 하나의 코딩으로 끝나면 실력이 늘지 않습니다. 위에서 했던 것처럼 처음 세로로 구구단을 출력했을 때 발생되는 문제점을 해결하기 위해 가로로 출력해보고 또 여기서 끝나지 않고 전체를 출력하는 것보다 외부에서 입력 받아서 특정한 원하는 구구단을 출력해보고 이런식으로 계속 자기 자신에게 질문을 던지고 그 질문에 대해 코딩을 해보면서 상상력과 응용력을 키우셔야 코딩이 재미있r게 할 수 있고 실력도 늘어납니다.