[C]소스관련

gensomaster의 이미지

KLDP눈팅을 하다가 질문을 위해 급 가입한 뉴비입니다. (--)(__)

교수님이 내주신 문제를 풀다가 문제에 봉착하게 되어 질문을 하게되었습니다.

아래의 코드와 첨부파일에 있는 문제가 요구하는 코드가 같은일을 하는지 알려주시면 감사하겠습니다.

물론 이글에 관심을 가져 읽으러 오신분들도 감사드립니다.

#include <stdio.h>
 
#define Number_CD 3
 
int main()
{
    int n,k,i,j,A,B,R,Max_gcd,lever;
    int cd[1000];
 
    for (i = 0;i<20;i++)
    {
        cd[i] = 0;
    }
 
    scanf("%d %d",&n,&k);
 
 
    if (n<k)
    {
        A = k;
        B = n;
    }
    else
    {
        B = k;
        A = n;
    }
 
    while(1)
    {
        R = A % B;
        if (R == 0)
        {
            Max_gcd = B;
            break;
        }
        A = B;
        B = R;
    }
 
    i = Max_gcd;
    lever = 1;
 
    for (j = 0;j<Number_CD;j++)
    {
        while(1)
        {
            if (i == 0)
            {
                cd[j] = 0;
                break;
            }
            if ((Max_gcd % i) == 0)
            {
                    cd[j] = i;
                    i--;
                    break;
            }
            i--;
        }
        if (cd[j] == 0)
        {
            printf("\n");
            break;
        }
        else if(j == (Number_CD - 1))
        {
            printf(" %d\n",cd[j]);
            break;
        }
        else if (lever)
        {
            printf("%d",cd[j]);
            lever = 0;
        }
        else
        {
            printf(" %d",cd[j]);
        }
    }
 
    return 0;
}
File attachments: 
첨부파일 크기
Image icon sampl;e.PNG11.01 KB
HDNua의 이미지

코드를 빌드한 다음 실행해서 올바른 값이 나온다면 옳은 코드입니다.

저는 이렇게 생각했습니다.

gensomaster의 이미지

위 소스를 제가 수업 듣는 교수님 서버에 업로드했더니 틀린 소스라고 나오네요 .... 도대체 뭐가 틀렸는지도 감이 안잡혀서 그러는데요. 죄송하지만 그림도 봐주시면 안되나요?

HDNua의 이미지

1. 뭐가 틀렸는지 모르겠다면 먼저 임의의 값으로 테스트를 해보고,
오류가 발생한다면 코드 중간중간에 출력을 넣어서
어디서부터 이상한 값이 나오는지 확인하면 에러를 추적하기 쉬워집니다.
원시 디버깅이라고 하는 방법인데 아주 좋은 방법이지요.

2. 지나치게 복잡한 방법으로 코드를 작성하시는데,
왜 이 코드가 옳은지 질문자 님이 스스로 설명하실 수 있긴 한가요?
이런 과제라면 당연히 이렇게 짰을 겁니다.

#include <stdio.h>
 
int main(void)
{
    int i;
    int n1, n2;
    int small;
    int count;
    const int max_count = 3;
    // 이건 스타일인데, 같은 타입의 변수라도
    // 용도에 따라 선언을 분리하면 읽기 편하다는
    // 생각에 이렇게 합니다.
    // 그리고 변수 이름을 명확하게 하세요.
 
    printf("Enter two number: ");
    scanf("%d%d", &n1, &n2);
 
    small = n1 < n2 ? n1 : n2;
    count = 0;
    for (i=small; i>0; --i)
    {
        if ((n1 % i == 0) && (n2 % i == 0))
        {
            ++count;
            printf("%d%c", i, (count < max_count) ? ' ' : '\n');
            if (count == max_count)
                break;
        }
    }
 
    return 0;
}

작은 코드가 틀렸을 때는 작성한 코드를 수정하는 것보단 새로 만드는 것이 여러모로 편합니다.

3. 코드가 왜 틀렸는지는 설명하지 않았는데, 이유를 들자면 첫째론 코드가 복잡해서 읽기 귀찮고
둘째론 1번에 어떻게 디버깅하는가를 설명했기 때문입니다.

저는 이렇게 생각했습니다.

gensomaster의 이미지

다시 해봐야겠군요...

gensomaster의 이미지

다시 해봐야겠군요...

익명 사용자의 이미지

이런 문제를 어떻게 풀어야 하는지 key idea를 깨닫지 못하면 프로그램이 길어지고 복잡해지고 부정확해질 수 있죠. 그런 key idea를 얼마나 잘 생각해내느냐가 결국은 실력이겠구요. 의미가 있는지 모르겠지만, 작성해 놓은신 코드 잠깐 보니까 "R == 0"이 되지 않으면 Max_gcd가 가비지 값을 갖고 있을텐데 그 값을 i와 lever에 대입하네요.

익명 사용자의 이미지

또 중요한 건 테스트인데요, 코드를 돌려보지 않았지만 스펙에 적혀있는 36과 24의 경우에도 틀린 답이 출력될 것 같은데요. 왜냐하면 이 두 값은 R == 0 이 되지 않으니까요. 프로그램을 작성하신 다음에 여러 값들로 테스트는 해보시고 서버에 올리신 건가요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.