플라칸
[C++]스도쿠 풀어주는 프로그램 만드는 과정1 본문
#include<iostream> using namespace std; void putQ(int a,int b,int c,int *Q); void match33(int a,int b,int c,int *Q); void printsu(int a,int b,int,int *Q); void runwidth(int a,int b,int c,int*Q); int main() { int Q[81]; while(true) { cout<<"select number"; int a; cin>>a; switch(a){ case 1: int a,b,c; cin>>a>>b>>c; putQ(a,b,c,&Q[0]); printsu(a,b,c,&Q[0]); default: return 0; } //s } return 0; } void putQ(int a,int b,int c,int *Q) { int *W=Q; Q=Q+sizeof(int)*a*9+sizeof(int)*b; *Q=c; Q=W; /*delete Q,W; free Q,W;*/ return; //sdfsdfsdfsdfds } void match33(int a,int b,int c, int *Q) { return; } void printsu(int a,int b,int,int *Q) { cout<<*(Q+sizeof(int)*a*9+sizeof(int)*b); //delete Q; return; } void runwidth(int a,int b,int c,int*Q) {
return; } |
이런 식으로 만들던 것이 있다. 여기서 포인터를 사용하는 부분에서 메모리릭을 막을 방법을 구상해야 한다.
먼저 메뉴를 좀 더 사람들이 알게 바꿔야 하므로 메인함수 부분을 바꿔준다.
cout<<"select number"<<endl<<"1을 누르고 x좌표, y좌표, 원하는 숫자를 입력하시오."<<endl<<"다른 숫자를 누를 시 프로그램을 종료합니다."; |
완벽하다. endl이 가물가물해서 대충 때려맞췄는데 제대로 작동한다.
어느 칸에 어느 숫자가 있는지 볼 수 있어야 한다.
switch case2에서 printsu를 사용할 수 있게 해주자
case 2: int a,b,c; cin>>a>>b>>c; printsu(a,b,c,&Q[0]); |
를 추가해주었지만 a와 b와 c가 이미 선언되어있어서 되지 않는다고 한다.
사실 case 1부분에서 다음 것으로 넘어가지 않도록 해줘야 하는데 그 명령어를 까먹었다.
간단하게 a b c 선언 부분을 앞으로 빼두자.
int main() { int Q[81]; while(true) { cout<<"select number"<<endl<<"1을 누르고 x좌표, y좌표, 원하는 숫자를 입력하시오."<<endl<<"다른 숫자를 누를 시 프로그램을 종료합니다."; int a,b,c,d; cin>>d; switch(d){ case 1: cin>>a>>b>>c; putQ(a,b,c,&Q[0]); printsu(a,b,c,&Q[0]); case 2: cin>>a>>b; printsu(a,b,c,&Q[0]); default: return 0; } //s } return 0; } |
사실 위에 case를 하는 부분에서 함수명이 a로 겹쳤던 것이었다.
왜 그전까지 오류가 나지 않았는지 궁금하다
실행을 해보니 또 오류가 일어난다. 생각해보니 재실행되도록 해야하는데 그러지 않았기 때문이다.
코드를 조금 수정해준다.
케이스 1을 실행한 뒤 2를 바로 실행한것이 원인이었다.
(케이스 2를 바로 실행하면 덤프값이 나타난다)
int main() { int Q[81]; while(true) { cout<<"select number"<<endl<<"1을 누르고 x좌표, y좌표, 원하는 숫자를 입력하시오."<<endl<<"다른 숫자를 누를 시 프로그램을 종료합니다."; int a,b,c,d; cin>>d; while(true) { switch(d){ case 1: cin>>a>>b>>c; putQ(a,b,c,&Q[0]); printsu(a,b,c,&Q[0]); case 2: cin>>a>>b; printsu(a,b,c,&Q[0]); default: return 0; } } //s } return 0; } |
이정도면 됐다.
이제 switch case를 나누어주는 함수를 검색해보자
break;
break;를 추가해보니 케이스 1을 실행한 뒤 바로 프로그램이 꺼진다. 문제를 알아보니 case1을 실행한 뒤 default로 가기 때문이다.
default에서 1과 2가 아닌지 검사를 하거나 default를 case 3으로 만들어줘야한다.
간단하게 후자를 사용해서 프로그램을 수정해주었다.
int main() { int Q[81]; while(true) { cout<<"select number"<<endl<<"1을 누르고 x좌표, y좌표, 원하는 숫자를 입력하시오."<<endl<<"다른 숫자를 누를 시 프로그램을 종료합니다."; int a,b,c,d; cin>>d; while(true) { switch(d){ case 1: cin>>a>>b>>c; putQ(a,b,c,&Q[0]); printsu(a,b,c,&Q[0]); break; case 2: cin>>a>>b; printsu(a,b,c,&Q[0]); break; case 3: return 0; } } //s } return 0; } |
이런 식으로 프로그램을 수정하니 케이스3 이 실행이 안된다. 문제가 무엇일까. 좀 더 알게 된 뒤에 알리겠다.
int main() { int Q[81]; while(true) { cout<<"select number"<<endl<<"1을 누르고 x좌표, y좌표, 원하는 숫자를 입력하시오."<<endl<<"3을 누를 시 프로그램을 종료합니다."; int a,b,c,d; cin>>d; switch(d){ case 1: cout<<"case 1"<<endl; cin>>a>>b>>c; putQ(a,b,c,&Q[0]); printsu(a,b,c,&Q[0]); break; case 2: cout<<"case 2"<<endl; cin>>a>>b; printsu(a,b,c,&Q[0]); break; case 3: cout<<"case 3"<<endl; return 0; default: cout<<"default"; } //s } return 0; } |
while(true)를 두 번 썼던 문제가 있다. 왜 case 3이 실행되는지는 의문이지만 문제는 해결되었다. 잘 작동한다.
다음에는 3x3칸에서의 검사를 하는 코드를 짜야겠다.
'정보보호전문가가 되자!' 카테고리의 다른 글
[C++]스도쿠 풀어주는 프로그램 만드는 과정2 (0) | 2018.10.02 |
---|---|
[C++]포인터의 개념 및 정리 (0) | 2018.10.01 |
여태까지의 메모중 일부 (0) | 2018.09.26 |
2018 09월 26일날의 경과 (0) | 2018.09.26 |
체스프로그램, 스도쿠 프로그램 개발중 (0) | 2018.09.25 |