C언어

락발라드 구구단~

by 정체불명 posted May 02, 2009
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄 수정 삭제

 정체불명 강좌 ver.4개의벽.rock발라드 구구단
안녕하세요 저도 c언어에 대해 거의 문외한 이지만 아직
printf함수를 쓰는것도 어려워하시는분들이 많으신거 같아 한번 강좌를 써보려고 합니다
제가 쓰는 강좌의 내용은 모두 틀릴수 있는 내용이고 보증도 하지 않습니다
틀린내용을 일부러 적을수도 있으니 이점 감안하시고 보시기 바랍니다.
자 이정도면 부담없이 쓰거나 해도 괜찮겠죠?
질문이나 조언, 태클, 좋은아이디어 모두 환영입니다
제 이메일 주소로 보내주시기 바랍니다
indistinct4869.gmail.com.png



이번에는 rock발라드 구구단을 만들어 볼 생각인데요
이 프로그램은 midi파일을 실행시키고, 구구단을 출력하는 예제입니다
우선 다음 코드를 컴파일 하고 실행시켜 보시기 바랍니다 컴파일과 실행은 시작의 반 편에서 알려드렸습니다
#include<stdio.h>
#include <windows.h>
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib") //dev c++사용하시는 분은 project>project option>parameters>c:Dev-Cpplib dev cpp가 설치된 폴더의 lib폴더 안의 libwinmm.a를 Linker에 추가해주세요

int main(){
 mciSendString("LetItBe.mid",NULL,0,NULL);
 for(;;){
  for(int i=2;i<=9;i++){
   for(int j=2;j<=9;j++){
    printf("%d * %d = %dn",i,j,i*j);
    Sleep(500);
    }
   }
  }
 }
혹시 재생이 안되시는 분은 트레이 아이콘에서 볼륨을 "더블"클릭하셔서 소리가 안나게 되어있는지 확인해보시기 바랍니다
또 실행파일과 같은 폴더 안에 letitbe.mid라는 파일이 있는지 확인해보시기 바랍니다
그리고 Visual Studio 환경에서 컴파일 실행하시는분들은 Debug폴더가 아닌 Project소스가 있는 폴더안에 letitbe.mid가 있어야 합니다 예를들어서
C:Documents and Settings정체불명My DocumentsVisual Studio 2008Projects프로젝트이름프로젝트이름 이 폴더안에 mid파일을 넣어주시면 되겠습니다실행화면.PNG

락발라드 소스코드.PNG 

우선 그냥 구구단프로그램을 우선 한 단만 나오도록 구현해 봅시다
중첩 루프를 사용하는거 보다 우선 하나의 루프만 사용해보는게 더 편할테니깐요
for,if,while 문은 뒤에 ;를 붙이지 않습니다 대신 ;이 있는 명령과 한 셋트입니다
for(;;)명령;이런식으루요 그렇다면 명령을 여러개 넣고 싶을때에는 어떻게 하느냐구요?
그럴떄에는 중괄호를 사용해주시면 됩니다
for(;;){명령;명령;명령;}이런식으루요 c언어에서는 프리 포멧을 지원하기떄문에 공백을 한칸으로 두던 두칸으로 두던 탭으로 두던 한줄 넘기던지 상관이 없습니다(단 전처리기는 예외로 한줄에 하나씩만 가능,전처리기는 세미콜른도 붙이지 않음 컴파일 이전에 하는거니깐!)
아 for(;;)가 무슨 뜻인지 모르는 분을 위해서 간단한 예제를 하나 작성 해보도록 합시다
for(;;) printf("무한반복되는 글자");
위와 같이 프로그래밍 하면 ""안에 있는 글자가 무한히 반복되면서 cpu점유율이 100퍼센트가 되는데요 for(;;)문의;두번째세미콜른(조건을 확인하는 곳)앞에 아무것도 적어주지 않으시면 무한 루프가 된답니다
무한루프를 빠져나가기 위해서는 break;문을 적어주거나 조건을 만족해야하는데 조건이 없으므로 break;문으로 빠져나갈수 밖에 없습니다

자 이제 3단만 나오는 구구단입니다
#include<stdio.h>//printf()를 사용하기 위해서
#include<conio.h>//getch();라는 함수를 사용하기 위해사
int main(){
 for (int i=2; i<=9;i++)
  printf("3*%d = %dn", i, 3*i);
 getch();//키입력받기 전까지 끄지 않도록 대기
 }
참 쉽죠? for문을 사용하면서 초기값으로 i를 2로 정해주었습니다 초기값을 적는곳에 더 많은 초기값을 적고 싶으면 쉼표 구분으로 더 많이 적어줄수 있답니다
그리고 i가 9보다 작거나 같을때(같거나 작을떄가 아니란걸 유의)루프를 계속돌구요 루프를 빠져나오기 위해서 한번 돌때마다 i++를 해주는군요 i++는 i자신의값에 1씩 더한다는 뜻입니다

 


다음 소스는 midi파일을 재생하는 소스인데요
#include<conio.h>
#include <windows.h>
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib") //dev c++사용하시는 분은 project>project option>parameters>c:Dev-Cpplib dev cpp가 설치된 폴더의 lib폴더 안의 libwinmm.a를 Linker에 추가해주시구요
int main () {
  mciSendString("LetItBe.mid",NULL,0,NULL);//같은 폴더안에 있는 letitbe라는 mid파일을 실행시킵니다
   getch();//바로 콘솔이 끝나면 소리를 못 들으므로 키입력을 받기전까지 대기하게해주는 함수입니다
}

전처리기만 약간 다를뿐 함수 하나로 간단하게 끝이나죠? google에서 mciSendString을 검색해보시면 더 자세한 사용법을 얻으실수 있습니다

 


자 이제 구구단을 말그대로 2*2부터 9*9까지 만들어 보고 두개를 합쳐봅시다
#include<stdio.h>
#include<conio.h>
int main(){
 for(int i=2;i<=9;i++){
  for(int j=2;j<=9;j++){
  printf("%d * %d = %dn",i,j,i*j);
   }
  }
  getch();
 }

 


구구단이 완성되었구요 이제 두가지를 합쳐봅시다
우선 전처리기를 선언해주구요 구구단용과 midi용 둘다선언합니다 중복되지 않게요
#include<stdio.h>
#include<conio.h>
#include <windows.h>
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib") //dev c++사용하시는 분은 project>project option>parameters>c:Dev-Cpplib dev cpp가 설치된 폴더의 lib폴더 안의 libwinmm.a를 Linker에 추가해주시구요
int main(){//int main()은 하나입니다
 mciSendString("LetItBe.mid",NULL,0,NULL);//같은 폴더 안에 있는 letitbe라는 mid파일을 실행하고
 for(int i=2;i<=9;i++){//구구단을 출력하는군요
  for(int j=2;j<=9;j++){
   printf("%d * %d = %dn",i,j,i*j);
   }
  }
 getch();
 }

 

 

그런데 문제가 있습니다 노래가 나오는데 구구단은 그냥 한번 쫙 출력되고 마는군요
0.5초에 한번씩 출력되게 바꾸려면 printf문 아래쪽에 Sleep(500);이라고 적어줍시다(S자가 대문자라는것에 유의)
그러면 한번 출력되고0.5초 쉬고 다시 출력됨을 반복합니다
그런데 노래가 끝나기 전에 구구단이 이미 끝나버렸죠?
구구단을 무한 반복하도록 바꿔봅시다 전에 배운 for(;;)무한 루프를 이용해서요~
#include<stdio.h>
//#include<conio.h>//무한루프를 돌기에 getch가 필요없어져서 주석으로 지웠으니 이것도 필요가없겠지요? 주석으로 지웠습니다
#include <windows.h>
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib") //dev c++사용하시는 분은 project>project option>parameters>c:Dev-Cpplib dev cpp가 설치된 폴더의 lib폴더 안의 libwinmm.a를 Linker에 추가해주시구요
int main(){//int main()은 하나입니다
 mciSendString("LetItBe.mid",NULL,0,NULL);//같은 폴더 안에 있는 letitbe라는 mid파일을 실행하고
 for(;;){
 for(int i=2;i<=9;i++){//구구단을 출력하는군요
  for(int j=2;j<=9;j++){
   printf("%d * %d = %dn",i,j,i*j);
   Sleep(500);
   }
  }
  }
 //getch();//무한루프이므로 키입력을 받을 필요가 없어져서 주석으로 지웟습니다
 }
자 드디어 끝까지 왔군요 정체불명의 강좌 다음편을 기대해주세요~