QuizWit

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ QuizWit ] in KIDS
글 쓴 이(By): guest (guestest) <han222.htc.hanw> 
날 짜 (Date): 1998년 7월 21일 화요일 오후 02시 34분 00초
제 목(Title): [수식계산] 소스 올립니다...


안녕하세요~~!

제가 만든 source code를 봐 주시겠다니 저야 영광이죠~~~!

근데 이거... 이렇게 올려도 되나 모르겠네요

아무튼 삭제하라고 하시면 즉시 지우겠습니다.


우선은 사칙연산하는 부분만 정리하여 올립니다.

- - - - - - - - - - - - - - - - - - - - - - -

#include <stdio.h>
#include <string.h>
#include <malloc.h>

#define MAX 100
typedef unsigned char byte;

byte *buffer(int factor);
void print(byte *p);
void plus(byte *result, int value, int position);
void increase(byte *result, int value, int position);
void copy(byte *source, byte *dest);
int get(byte *p, int location);
int length(byte *p);
void str2buf(byte *str, byte *buf);
int compare(byte *num1, byte *num2);
void delzero(byte *result);
void delsign(byte *p);
void addsign(byte *p);
byte checksign(byte *p);
byte *add(byte *a, byte *b);
byte *subtract(byte *a, byte *b);
byte *multiple(byte *a, byte *b);
void downward(byte *p, int value);
byte *divide(byte *a, byte *b);
byte *calculate(byte *a, byte op, byte *b);

byte *buffer(int factor)
{
    int i;
    byte *p;
    p=malloc(MAX);
    for(i=0;i<MAX;i++)
        *(p+i)=factor;
    return p;
}

void print(byte *p)
{
    byte *start;
    start=p;
    while(*p!=10)
        p++;
    if(*(p-1)==11)
    {
        printf("-");
        p--;
    }
    else if(*(p-1)==12)
    {
        printf("\nDivide By Zero Error!\n");
        return;
    }

    while(p!=start)
        printf("%d",*--p);
}

void plus(byte *result, int value, int position)
{
    do
    {
        if(*(result+position)==10)
            *(result+position)=0;
        value = *(result+position) + value;

        if(value>=10)
        {
            value=value%10;
            *(result+position)=value;

            value=1;
            position++;
        }
        else
        {
            *(result+position)=value;
            value=0;
        }

    } while(value==1);
}

void increase(byte *result, int value, int position)
{
    int i1,i2;

    if(value>=10)
    {
        i1=value%10;
        i2=value/10;
        plus(result, i1,position);
        plus(result, i2,position+1);
    }
    else
        plus(result, value,position);
}

void copy(byte *source, byte *dest)
{
    int i=0;
    while(*(source+i)!=10)
    {
        *(dest+i)=*(source+i);
        i++;
    }
    *(dest+i)=10;
}

int get(byte *p, int location)
{
    if(*(p+location)!=10)
        return *(p+location);
    else
        return 0;
}

int length(byte *p)
{
    int i=0;
    while(*p++!=10)
        i++;
    return i;
}

void str2buf(byte *str, byte *buf)
{
    unsigned int i=0;
    byte *temp;

    temp=str;
    while(*temp != '\0')
        temp++;
    do
    {
        temp--;
        *(buf+i)=*temp-48;
        i++;
    } while(temp != str);

    *(buf+i)=10; // end of buffer...
}

int compare(byte *num1, byte *num2)
{
    byte *tempnum1, *tempnum2;
    if(length(num1) > length(num2))
        return 0;
    else if(length(num1) < length(num2))
        return 1;
    else
    {
        tempnum1=num1;
        tempnum2=num2;
        while(*tempnum1!=10)
            tempnum1++;
        while(*tempnum2!=10)
            tempnum2++;

        do
        {
            tempnum1--;
            tempnum2--;
            if(*tempnum1 > *tempnum2)
                return 0;
            else if(*tempnum1 < *tempnum2)
                return 1;
        } while(tempnum1 != num1);
    }
    return 0;
}

void delzero(byte *p)
{
    byte *temp;
    temp=p;
    while(*temp!=10)
        temp++;
    temp--;
    while(*temp==0 && temp!=p)
        *temp--=10;
}

void delsign(byte *p)
{
    byte *temp;
    temp=p;
    while(*temp!=10)
        temp++;
    if(*(temp-1)==11)
        *(temp-1)=10;
}

void addsign(byte *p)
{
    byte *temp;
    temp=p;
    while(*temp!=10)
        temp++;
    if(*(temp-1)!=11)
    {
        *temp=11;
        *(temp+1)=10;
    }
}

byte checksign(byte *p)
{
    byte sign, *temp;

    temp=p;
    while(*temp!=10)
        temp++;

    if(*(temp-1)==11) // minus value...
        return 1;
    else
        return 0;
}

byte *add(byte *a, byte *b)
{
    int i=0;
    byte *result;

    result=buffer(10);

    if(checksign(a)==0 && checksign(b)==1) // (+a) + (-b)
    {
        delsign(b);
        result=subtract(a,b);
    }
    else if(checksign(a)==1 && checksign(b)==0) // (-a) + (+b)
    {
        delsign(a);
        result=subtract(b,a);
    }
    else if(checksign(a)==1 && checksign(b)==1) // (-a) + (-b)
    {
        delsign(a);
        delsign(b);
        result=add(a,b);
        addsign(result);
    }
    else // (+a) + (+b)
    {
        while(*(a+i)!=10 || *(b+i)!=10)
        {
            increase(result, get(a,i) + get(b,i), i);
            i++;
        }
    }
    return result;
}

byte *subtract(byte *a, byte *b)
{
    int i, sign;
    byte *result, *borrow, *p;
    byte *tempa, *tempb;

    result=buffer(10);
    borrow=buffer(0);
    tempa=buffer(10);
    tempb=buffer(10);
    
    if(checksign(a)==0 && checksign(b)==1) // (+a) - (-b)
    {
        delsign(b);
        result=add(a,b);
    }
    else if(checksign(a)==1 && checksign(b)==0) // (-a) - (+b)
    {
        delsign(a);
        result=add(a,b);
        addsign(result);
    }
    else if(checksign(a)==1 && checksign(b)==1) // (-a) - (-b)
    {
        delsign(a);
        delsign(b);
        result=subtract(b,a);
    }
    else // (+a) - (+b)    
    {
        if(compare(a, b) == 0)
        {
            copy(a, tempa);
            copy(b, tempb);
            sign=0;
        }
        else
        {
            copy(a, tempb);
            copy(b, tempa);
            sign=1;
        }

        i=0;
        while(*(tempa+i)!=10)
        {
            if( (get(tempa,i) - get(tempb,i)) >= 0 )
                increase(result, get(tempa,i) - get(tempb,i), i);
            else
            {
                increase(result, get(tempa,i) - get(tempb,i) + 10, i);
                *(borrow+i+1) = 1;
            }
            i++;
        }

        i=0;
        while(*(result+i) != 10)
        {
            if( (*(result+i) - *(borrow+i)) < 0 )
            {
                *(result+i) = *(result+i) - *(borrow+i) + 10;
                *(borrow+i+1) = 1;
            }
            else
                *(result+i) = *(result+i) - *(borrow+i);
            i++;
        }

        delzero(result);

        if(sign==1) // if minus value...
            addsign(result);
    }
    free(borrow);
    free(tempa);
    free(tempb);
    return result;
}

byte *multiple(byte *a, byte *b)
{
    int i, j, lengtha, lengthb;
    byte *result;

    result=buffer(10);

    if(checksign(a)==0 && checksign(b)==1) // (+a) * (-b)
    {
        delsign(b);
        result=multiple(a,b);
        addsign(result);
    }
    else if(checksign(a)==1 && checksign(b)==0) // (-a) * (+b)
    {
        delsign(a);
        result=multiple(a,b);
        addsign(result);
    }
    else if(checksign(a)==1 && checksign(b)==1) // (-a) * (-b)
    {
        delsign(a);
        delsign(b);
        result=multiple(a,b);
    }
    else // (+a) * (+b)
    {
        lengtha=length(a);
        lengthb=length(b);

        for(i=0;i<lengtha;i++)
            for(j=0;j<lengthb;j++)
                increase(result, get(b,j)*get(a,i),i+j);

        delzero(result);
    }

    return result;
}

void downward(byte *p, int value)
{
    byte *temp;
    temp=p;

    while(*temp!=10)
        temp++;
    *(temp+1)=10;
    while(temp!=p)
    {
        *temp=*(temp-1);
        temp--;
    }
    *temp=value;

    delzero(p);
}

byte *divide(byte *a, byte *b)
{
    int i, point;
    byte *result, *temp, *subtemp, *a_temp, *guess;

    result=buffer(10);
    a_temp=buffer(10);
    guess=buffer(10);

    if(checksign(a)==0 && checksign(b)==1) // (+a) / (-b)
    {
        delsign(b);
        result=divide(a,b);
        addsign(result);
    }
    else if(checksign(a)==1 && checksign(b)==0) // (-a) / (+b)
    {
        delsign(a);
        result=divide(a,b);
        addsign(result);
    }
    else if(checksign(a)==1 && checksign(b)==1) // (-a) / (-b)
    {
        delsign(a);
        delsign(b);
        result=divide(a,b);
    }
    else // (+a) / (+b)
    {
        temp=buffer(10); // void malloc...
        if(compare(a, b))
        {
            *result=0;
            return result;
        }

        if(*b==0 && *(b+1)==10)
        {
            *result=12;
            return result;
        }
        point=length(a);
        do
        {
            point--;
            downward(a_temp, *(a+point));

            *guess=10;
            do
            {
                free(temp);
                *guess=(*guess)-1;
                temp=multiple(guess, b);
            } while(compare(a_temp, temp));

            subtemp=subtract(a_temp, temp);
            copy(subtemp, a_temp);

            plus(result, *guess, point);
            free(temp);
            free(subtemp);

        } while(point);
    }
    free(a_temp);
    free(guess);
    delzero(result);
    return result;
}

byte *calculate(byte *a, byte op, byte *b)
{
    byte *result;

    switch(op)
    {
        case '+':
            result=add(a, b);
            break;

        case '-':
            result=subtract(a, b);
            break;

        case '*':
            result=multiple(a, b);
            break;

        case '/':
            result=divide(a, b);
            break;
    }
    return result;
}

void main()
{
    byte a[]="123456789";
    byte b[]="9";
    byte *a_buffer, *b_buffer, *result;

    a_buffer = buffer(10);
    b_buffer = buffer(10);
    result   = buffer(10);

    str2buf(a, a_buffer);
    str2buf(b, b_buffer);
    result = calculate(a_buffer, '*', b_buffer);

    print(result); printf("\n");
}


[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.