Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

플라칸

[C++]스도쿠 풀어주는 프로그램 만드는 과정1 본문

정보보호전문가가 되자!

[C++]스도쿠 풀어주는 프로그램 만드는 과정1

플라칸 2018. 9. 28. 20:18

#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칸에서의 검사를 하는 코드를 짜야겠다.

Comments