PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2008/11/15 20:47:47
Name deadbody
Subject c언어 질문입니다.
while문과 for문을 사용하여 간단한 야구게임을 작성해보자.
 문제 :
1) 0-9까지의 범위의 랜덤한 수를 3개 구한다.
2) 사용자로부터 0-9까지의 3개의 수를 입력받는다.
3) 1)에서 생성된 수와 순서, 2)에서 입력받은 수와 순서가 일치하면
게임은 종료된다.
4) 만약 자리와 숫자가 같은 경우 스트라이크, 숫자는 같지만 자리가
다르다면 볼이 된다.
ex) 1 2 3 -- 랜덤생성수
2 3 9 -- 0 스트라이크 2 볼
1 3 2 -- 1 스트라이크 2 볼
1 2 7 -- 2 스트라이크 0 볼
랜덤한 수를 생성하고, 사용자로부터 세 개의 숫자를 입력받고, 게임에 성
공할 때까지 while loop를 돈다. for loop는 세 개의 수를 입력 받을 때 사용
하면 된다.


이게 문제이구요,

제가 짠 소스는

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(void)
{
        int num1, num2, num3;
        int hit;
        int a;
        int b;
        int c;
        int i;
        int strike;
        int ball;

        srand((unsigned)time(NULL));
        num1=rand()%10;

        srand((unsigned)time(NULL));
        num2=rand()%10;

        srand((unsigned)time(NULL));
        num3=rand()%10;

        for(i=1 ; strike==3 ; i++)
        {
                printf("숫자를 입력하세요 : ");
                scanf("%d",&hit);
                a=hit/100;
                b=hit%100/10;
                c=hit%10;

                        strike=0;
                        ball=0;

                        if(a==num1)
                                strike++;
                        else
                                ball++;
                        if(b==num2)
                                strike++;
                        else
                                ball++;
                        if(c==num3)
                                strike++;
                        else
                                ball++;
                        if(strike==3)
                                printf("strike out!! %d번째만에 맞췄네요\n",i+1);
                        else
                                printf("%dstrike %dball !!\n",strike,ball);
        }
        return 0;
}

일단 저 소스로 실행하면 바로 프레쓰 애니키...가 뜨네요 ㅜㅜ. 문제 의도에 맞게 짠 소스는 아니지만 제가 보기엔 별 문제가 없어보이는데..
또 while문과 for문을 모두 다 사용해야 하는데 두개를 어떻게 같이 사용해야 할지 모르겠습니다.
또 문제에 배열은 쓰면 안돼요.

c언어의 마에스트로님들 도와주세요.ㅜㅡ

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
08/11/15 20:57
수정 아이콘
for(i=1 ; strike==3 ; i++) 에서 strike==3을 만족하지 않으므로 바로 프로그램이 끝나버리죠.
08/11/15 21:06
수정 아이콘
노힛님 말씀대로 strike != 3으로 고쳐야 되고

사실 while(strike!=3) 으로 계속 실행하게 하시면 됩니다.

근데 문제서 이해가 안되는게 있는데

배열을 쓰지 말라고 했으니 숫자를 받을땐 한꺼번에 3자리의 자연수로 받던지 아니면 각 변수마다 따로 둬야 되는데

그런상황에서 for를 이용해 숫자를 받으라는건 좀 이해가 안되는 부분이긴 합니다.

굳이 억지로 for를 써서 짜내게 하면 이렇게도 할 순 있습니다.

hit = 0;
for(i = 1; i<=3; i++)

scanf("%d",&number);
hit = hit+number*10^(3-i);

이렇게 하면 for를 이용해서 3자리의 자연수를 받게 할 수 있습니다만 저렇게 할 거면 그냥 한번에 받던지 아니면 편하게 쓰기 위해 배열을 사용하고 말텐데...비효율적인 풀이 방식을 요구하는것 같습니다.
꿀호떡a
08/11/15 21:11
수정 아이콘
3자리의 자연수가 아니라 3개의 자연수입니다 -_-/
이 문제의 풀이를 위해서 세 개의 자연수를 '동시에' 요구하는 것이 아니기 때문에 for문과 변수 넷만 가지고 해결 가능합니다. 세 개는 Random Number이고, 하나는 입력받는 숫자죠.
08/11/15 21:14
수정 아이콘
꿀호떡a님// 야구게임의 입장에서 생각해보면 정답의 숫자와 일치를 시켜도 위치와 크기까지 같이 일치시켜야 하니까

3개의 자연수긴해도 배열로 받는게 아닌이상은 그것도 for를 이용해 받으라면 3자리의 자연수로 밖에 받을 방법이 없어 보입니다.
deadbody
08/11/15 21:16
수정 아이콘
답변 달아주신분들 감사합니다. ㅜㅜ 답변 참고하여서 소스 수정하였습니다.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(void)

int num1, num2, num3;
int hit;
int a;
int b;
int c;
int i;
int strike;
int ball;

srand((unsigned)time(NULL));
num1=rand()%1000/100;
num2=rand()%100/10;
num3=rand()%10;

for(i=1 ; strike!=3 ; i++)
{
printf("숫자를 입력하세요 : ");
scanf("%d",&hit);
a=hit/100;
b=hit%100/10;
c=hit%10;

strike=0;
ball=0;

if(a==num1)
strike++;
else if(a==num2||a==num3)
ball++;
else
ball=ball;

if(b==num2)
strike++;
else if(b==num1||b==num3)
ball++;
else
ball=ball;

if(c==num3)
strike++;
else if(c==num1||c==num2)
ball++;
else
ball=ball;

if(strike==3)
printf("strike out!! %d번째만에 맞췄네요!!\n",i);
else
printf("%dstrike %dball !!\n",strike,ball);

return 0;
}

잘돌아가네요^^
근데 아직도 if대신에 어떻게 while문을 써야될것 같은데... 방법이 생각안나네요.;;
꾸호떡님 // 올리진 못했지만 예시로 결과 출력된 사진이 있는데, 그 사진에 보면 3개의 자연수가 아니라 3자리의 자연수로 나와있어요ㅜㅡ
08/11/15 22:05
수정 아이콘
잘 돌아갈 것 같지 않은데요... 지금 if else 문을 보면, strike가 아니면 모두 ball이네요. 문제에 의하면 숫자는 같고 자리가 달라야 ball입니다.
deadbody
08/11/15 22:34
수정 아이콘
노힛님// 아 그렇군요... 노힛님 말씀 듣고 댓글에 단 소스 수정했습니다. 보시고 잘못된데 있으면 태클걸어주세요.
08/11/16 02:43
수정 아이콘
else if 다음의 else에 ball = ball은 필요 없을것 같은데요.

그리고 if else if else는 정답에 가까워질수 없는 구조입니다.

왜냐면 1스트라익 이후에도 볼은 있을 수 있기 때문에 if else if else의 구조는 제일 첫 조건문이 참이면 밑의 식은 수행되지 않으므로
if()

if( ){
// 스트라이크가 있을시에 볼이 있는지 찾는 구조입니다.
}
else if() // 스트라이크가 없을시에 볼이 있는지 찾습니다.
else printf("일치하는 번호가 없습니다."); 정도로 처리하시는게 좋을듯 싶습니다.

ball = ball은...솔직히 의미를 모르겠습니다. 안쓰셔도 될 부분 같습니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
45120 법률질문요. 경찰관의 신분증 제시 / 싸움이 일어났을 때 [7] 양정현2467 08/11/15 2467
45119 lg모니터22인치를 샀는데요 이거 반품가능하나요? [5] 이민님닉냄수2199 08/11/15 2199
45118 몇일전부터 인터넷이 이상합니다. Lucky-Strike1534 08/11/15 1534
45117 워크레프트 시나리오 질문입니다 [2] VerseMan1654 08/11/15 1654
45116 게임 추천 부탁드립니다.. [4] S.A.F1594 08/11/15 1594
45115 P vs Z 제발 도와주세요 ㅜㅜ [10] HaSSaD1827 08/11/15 1827
45114 c언어 질문입니다. [8] deadbody2149 08/11/15 2149
45112 수시2 질문... Juan1496 08/11/15 1496
45111 머리관리 질문입니다 [1] 8141922 08/11/15 1922
45110 책을 읽고 싶어서 질문 좀 할꼐요^^ [3] wAvElarva1931 08/11/15 1931
45109 컴퓨터 성능에 대해 질문입니다.. [1] Oblivion1564 08/11/15 1564
45108 엑셀 2007 - 추세선 질문입니다 꿀호떡a2928 08/11/15 2928
45107 핸드폰 교환 질문입니다. [5] 어흥 어흥2135 08/11/15 2135
45106 잡티제거 [1] 서현♡1551 08/11/15 1551
45105 y=sinX 그래프에서 y=cosX처럼 출렁출렁하게 만드는 방법.. [1] 콜라박지호2207 08/11/15 2207
45103 고딩수학책 추천좀 [6] Yuki2222 08/11/15 2222
45102 pgr이나 파란블로그에 사진을 올릴때 릴리러쉬1544 08/11/15 1544
45099 와우 서버 추천부탁드립니다. [12] 리휜1983 08/11/15 1983
45097 [급질문] 아시아 접속이 안됩니다. [1] HirosueMooN1553 08/11/15 1553
45095 법에 대해 잘 아시는 분... 초상권 침해에 대해서... [2] shovel1674 08/11/15 1674
45094 만화 짱 보시는분???? [13] 불꽃테란!2117 08/11/15 2117
45092 마른 사람이 살뺄려면,,? [7] 검둥이불발탄1893 08/11/15 1893
45087 내년 수능을 보려고 합니다. [20] I.A.L1852 08/11/15 1852
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로