C언어 질문있습니다ㅜㅜㅜ 도와주시면 정말 감사하겠습니다ㅠㅠ


sum이 전역변수로 되어있는데 점수를 입력 후 다시 수정하여 결과를 출력하면 합계에서 문제가 생깁니다ㅜㅜ 예를 들어 5 5 5 5 10에서 5 5 5 10 10으로 바꾸면 점수 합계가 30에서 70으로 바뀌는 거 처럼요…


유클리드 호제법으로 최대 공약수를 구하는 코드인데 정말 더이상 손도 못 대겠어요…ㅜ 어디가 틀린건지도 모르겠습니다…!!!


menu가 4일 때 프로그램 자체를 종료시켜야 하는데 첫 화면서 4누르면 되지만 게임 실행 후 4를 누르면 무시하고 넘어가네요 제가 뭘 잘못한 걸까요??


요 함수가 while문으로 무한루프 탔는데 첫 번째 else if문에서 continue한테 바라는 점이 printf(세숫자입력)으로 돌아가서 해줬으면 하는데 goto문도 못 쓰는 상황이라 도저히 생각이 나질 않습니다ㅜㅜ

image
R1_T, R1_D, R2_W를
int R1_T = tri / time1 * 100;
int R1_D = dou / time1 * 100;
int R2_W = wow / time2 * 100;
이렇게 선언했는데 콘솔창으로 하면 0%만 나오는 이유를 당최 모르겠습니다…

총 5가지 질문입니다…ㅠ 하나만이라도 좋으니 제발제발제발제발제발 도와주세요…ㅜㅜㅜ

값이 30에서 70이 되는 이유는 제 생각에 전역변수인 sum 초기화를 하지 않아서

input_score 함수 호출(sum: 0) ->
printf_score 함수 호출(sum: 30) ->
fix_score 함수 호출(sum: 35) ->
printf_score 함수 호출(sum: 70)

이런 과정을 거쳐서 만들어진 게 아닐까요?
앞으로 질문시엔 main문도 함께 부탁드리겠습니다…

일단 2가지 문제점이 있습니다.
첫번째, 구현하신 유클리드 호제법 함수의 do~while 문에서 b가 0이 되면 리턴값 없이 함수가 종료됩니다.
엥? if(a % b == 0)에서 처리를 해줘도요?
네. do~while문에서 조건을 확인하고 b가 0이라는걸 확인하면 while문은 바로 끝나버립니다.

두번째로, 구현하신 유클리드 호제법 함수에서

if ( a % b == 0)

여기서 a보다 b가 더 크면 0이 나와서 바로 a를 리턴하지 않을까요…?
물론 함수를 사용할 때 항상 a가 b보다 크도록 매개변수를 사용했다면 상관 없겠지만, 그런 함수는 절대 좋은 함수가 아닙니다.

위에서 보이는 함수만으로는 문제가 없습니다.
문제는 inputcoin()이나 choosegame(), checkresult() 함수를 지나오면서 생기는 거 같네요.
그리고 재입력을 printMenu() 함수에서 printMenu() 함수로 받다니…
while문을 사용해서 입력값을 받고 입력값에 따라 함수를 실행하고 끝낼 일이 생기면 break, 잘못된 값이 들어오면 continue를 사용하는 설계는 어떨까요?

질문의 요지를 잘 모르겠습니다.

c에서 정수 나눗셈의 값은 나머지를 뺀 정수값으로 나옵니다.
5 나누기 6은 0이예요.
time1, time2 값이 tri, dou, wow보다 큰 값이 아닐까 생각해 봅니다.
tri, dou, wow값에 100을 곱하고 time1, time2로 나누면 해결 되겠네요.

우선 정말 감사합니다!! 늦은 시간에 올려서 못 받을 줄 알았는데 너무 잘 알려주셔서 해결했습니다!!ㅜ

처음 질문 올린거라 부족한 부분이 많았네요 다음 번에는 main까지 첨부하겠습니다!

  1. sum을 전역변수로 해서 괜찮을 줄 알았는데 아니었군요…!
  2. return 0; 로 마무리 해봤는데 여전히 틀리게 나옵니다ㅜㅜ 혹시 전체 코드를 붙이면 도와주실 수 있나요?
  3. break로 하니까 바로 됩니다…! return보다 break가 더 강력한 거 였군요!!
  4. 지금 보니까 질문도 이상하게 해놨네요… 죄송합니다ㅜ
  5. 그렇네요… 이 부분을 고려하지 않았네요…ㅎ

4번은

while(1)
{
    if()
       printf("세주사위의 합을 맞춰보세요");
   else if()
   {
         printf("범위 밖");
         continun;
    }
}

이런식으로 되어있는데 저 continue문으로 if문의 printf를 출력하고 싶었는데 while(1)부터 시작해서 어떻게 해야 원하는 대로 할 수 있는지를 질문하고 싶었습니다!!
( 코드가 좀 길어서 이런 식으로 했는데 아예 전체 코드를 가져올까요?)

안녕하세요.

전체 소스코드와 문제를 올려주시고,
본인 소스의 문제점을 말씀해주세요.

소스코드가 너무길면 github에 올리시고 링크를 거세요.

https://github.com/YoulMA/middle-protject.git

이렇게 하면 되나요?

2번 문제는 유클리드 호제법으로 최대공약수, 최소공배수 구하는 거고
4번 문제는 슬롯머신과 랜덤 다이스 게임을 만드는 것입니다. 간단한 규칙은

이 사진으로 정리할 수 있을 것 같습니다!

제 소스의 문제점은 링크 속 코드에 적어두었습니다!!

#include <stdio.h>

int getG(int a, int b){
	int tmp;
	if(a<b){ //b가 a보다 크면 swap
		tmp=b;
		b=a;
		a=tmp;
	}
	while(b){ // 나머지가 0이 되면 종료 
		tmp=a%b;
		a=b;
		b=tmp;
	}
	return a;
}

int main(void){
	printf("%d\n", getG(8, 10));				// 2
	printf("%d\n", getG(5, 5));					// 5
	printf("%d\n", getG(7, 3));					// 1
	printf("%d\n", getG(34, 1));				// 1
	printf("%d\n", getG(91, 49));				// 7
	printf("%d\n", getG(100000000, 10000));	// 10000
	return 0;
}

유클리드 호제법 구현은 구글에 검색하시면 정말정말정말정말 많이 있습니다. 제 코드 외에 다른 코드도 찾아서 다른 사람들은 어떻게 구현했는지 살펴보시는 건 어떨까요?

올리신 코드는 다 읽어서 뭘 구현하고 싶으신지는 알겠는데, 님 코드에서 무슨 문제가 있고 뭘 지적해야 하는지는 여전히 모르겠어요. 100줄 짜리 코드든 200줄 짜리 코드든 제발 올려주세요… 그리고 github는 public repository에 아무것도 안 보여요.

그리고 여태까지 답변드린 목록을 보면 문제를 파악하고 코드 내에서 답을 드리는 게 아니라 코드와 글을 읽고 어디서 문제가 생겼을지 유추하는 방식의 답변이 많습니다. 이게 다 전체 코드를 몰라서 벌어진 참사라… 부탁드립니다.
그리고 고수님들은 질문에 ㅠㅠ나 ㅜㅜ가 많으면 싫어하신다니 참고하시면 좋을 것 같네요

아… 너무 어렵네요ㅎ github 사용이 좀 더 익숙해지면 나중에 다시 질문 올리겠습니다…!
괜히 저 때문에 시간 버리신 거 같아서 죄송해요
코멘트 받은 걸로 어느정도 해결되었습니다!! 감사합니다
다음부터는 조언해주신거 숙지하고 질문 드리겠습니다!
진짜 감사합니다!

유클리드 호제법 재밌읍니다.

#include <stdio.h>

int main() {
    int _, __;
    scanf("%d %d", &_, &__);
    for (_ > __ && (_ ^= __ ^= _ ^= __); _; _ ^= __ ^= _ ^= __ %= _);
    printf("%d", __);
    return _ ^ _;
}

변수 하나로도 되구여 ㅇㅅㅇ

#include <stdio.h>

int main() {
    static unsigned long long _ = 0;
    return ((!_) || !(_ = (_ << 32) | (_ >> 32) % (_ & 0xFFFFFFFF))) && scanf("%u %u", &_, (unsigned*)&_ + 1) && ((_ & 0xFFFFFFFF) > _ >> 32) && !(_ = _ << 32 | _ >> 32) || ((_ & 0xFFFFFFFF || !printf("%u", _ >> 32))) && main();
}
3 Likes