⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 float.c

📁 我们组成原理课上的一个作业
💻 C
📖 第 1 页 / 共 2 页
字号:
/*计算机组成原理大作业*/
/*软件仿真浮点运算*/
/*051110115 李佩佩*/
/*051110113 陆璐*/
/*051110228 曹晶*/

/*包含头文件*/
#include <stdio.h>
#include <string.h>

/* 宏定义 */
#define L 9
#define W 5
#define J 4
#define S 1

/* 函数声明 */
/* 输入输出函数 */
void input(  char * );
void output( char *, char *, char, char, char *, char, char * );
/* 加减乘除运算的实现*/
void add( char *, char *, char ); /* 加法 */
void sub( char *, char * );       /* 减法 */
void mul( char *, char * );       /* 乘法 */
void div( char *, char * );       /* 除法 */
 /* 将符号与数值分开 */
void divide( char *, char *, char * );
/* 转换类型 */
int change( char * );
char Add( char *, char *, char * );
char D( char *, char *, char * );
/* 规格化 */
char standard( char, char *, char * );
int N = 0;

/*主函数*/
main()
{
    char number1[ L + 1 ] = "0";
    char number2[ L + 1 ] = "0";
    char choice;
    printf(" -------------------------------\n");
    printf("|    软件仿真浮点运算系统       |\n");
    printf(" -------------------------------\n");
    printf("|   软件学院051110115 李佩佩    |\n");
    printf("|           051110113 陆璐      |\n");
    printf("|           051110228 曹晶      |\n");
    printf(" -------------------------------\n\n");

    printf( "请输入第一个操作数(原码表示):\n\n\n" );
    input( number1 );

    printf ( "\n请输入第二个操作数(原码表示):\n\n\n" );
    input( number2 );

    printf("\n -------------------------------------\n");
    printf("         软件仿真浮点运算系统           \n");
    printf(" -------------------------------------\n");
    printf("              软件学院                \n");
    printf(" -------------------------------------\n");
    printf("|         输入选项编号:               |\n");
    printf("|    1  ---------------------  加     |\n");
    printf("|    2  ---------------------  减     |\n");
    printf("|    3  ---------------------  乘     |\n");
    printf("|    4  ---------------------  除     |\n");
    printf("|    5  ---------------------  Esc    |\n");
    printf("|_____________________________________|\n");
    printf("?\n");

    choice = getche();


    if( choice < '1' || choice > '5')
    {
       printf("\n输入有误,请重新输入:");
       choice = getche();
    }


    switch ( choice )
    {

        case '1':
            add( number1, number2, '+' );
            break;

        case '2':
            sub( number1, number2 );
            break;

        case '3':
            mul( number1, number2 );
            break;

        case '4':
            div( number1, number2 );
            break;

        case '5':
            break;

    }

    getch();
}



/*输入函数*/
void input( char * number)
{
    int i;
    int count = 0;
    int flag = 0;
    do
    {
        if ( flag == 1 )
            printf("\n输入有误,请重新输入: \n");
        count = 0;
        printf("*,");
        for( i = 1; i <= J - 1; i++ )
            printf("*");
        printf(";*,");
        for( i = 1; i <= W - 1; i++ )
            printf("*");
        printf("\n");
        number[count] = getche();
        while( count < ( L - 1 ) && ( number[count] == '0' || number[count] == '1' ) )
        {
            if ( count == 0 )
                printf(",");
            if ( count == ( J - 1 ) )
                printf(";");
            if ( count == J )
                printf(".");
            count++;
            number[count] = getche();
        }
        flag = 1;
    }while ( count != ( L - 1 ) );
    number[ L ] = '\0';
}

/*输出函数*/
void output( char *number1, char *number2, char operation,
                   char rJsign, char *rJnum,
                   char rWsign, char *rWnum )
{
    int i = 0;
    printf("\n\n运算结果为(用原码表示):\n");
    for ( i = 0; i < L; i++ )
    {
        if ( i == 1 )
            printf(",");
        if ( i == J )
            printf(";");
        if ( i == J + 1 )
            printf(".");
    
        printf( "%c", number1[i] );
    }
    printf( " %c ", operation );
    for ( i = 0; i < L; i++ )
    {
        if ( i == 1 )
            printf(",");
        if ( i == J )
            printf(";");
        if ( i == J + 1 )
            printf(".");
    
        printf( "%c", number2[i] );
    }
    printf(" = ");
    printf("%c,%s;%c.%s", rJsign, rJnum, rWsign, rWnum );
    printf("\n按任意键继续...");
}

/*加运算*/
void add( char *number1, char * number2, char choose )
{
    char jsign1 = number1[0];
    char jnum1[ J ];

    char wsign1 = number1[ J ];
    char wnum1[ W ];

    char jsign2 = number2[ 0 ];
    char jnum2[ J ];

    char wsign2 = number2[ J ];
    char wnum2[ W ];

    char rJsign;
    char rJnum[ J ];

    char rWsign;
    char rWnum[ W ];

    int n1, n2, count = 1;
    char carry;
    int k;
    divide( jnum1, wnum1, number1 );
    divide( jnum2, wnum2, number2 );

    n1 = change( jnum1 );
    n2 = change( jnum2 );
    if ( jsign1 == jsign2 )
    {
        if ( jsign1 == '0' )
        {
            if ( n1 == n2 )
            {
                strcpy( rJnum, jnum1 );
                rJsign = jsign1;
            }
            while ( n1 > n2 )
            {
                count = ( W - 1 );
                while ( count > 0 )
                {
                    wnum2[ count - 1 ] = wnum2[ count - 2 ];
                    count--;
                }
                wnum2[ count ] = '0';
                n2++;
                strcpy( rJnum, jnum1 );
                rJsign = jsign1;
            }
            while ( n1 < n2 )
            {
                count = ( W - 1 );
                while ( count > 0 )
                {
                    wnum1[ count - 1 ] = wnum1[ count - 2 ];
                    count--;
                }
                wnum1[ count ] = '0';
                n1++;
                strcpy( rJnum, jnum2 );
                rJsign = jsign2;
            }
        }
        else
        {
            if ( n1 == n2 )
            {
                strcpy( rJnum, jnum1 );
                rJsign = jsign1;
            }
            while ( n1 > n2 )
            {
                count = ( W - 1 );
                while ( count > 0 )
                {
                    wnum1[ count - 1 ] = wnum1[ count - 2 ];
                    count--;
                }
                wnum1[ count ] = '0';
                n1--;
                strcpy( rJnum, jnum2 );
                rJsign = jsign1;
            }
            while ( n1 < n2 )
            {
                count = ( W - 1 );
                while ( count > 0 )
                {
                    wnum2[ count - 1 ] = wnum2[ count - 2 ];
                    count--;
                }
                wnum2[ count ] = '0';
                n2--;
                strcpy( rJnum, jnum1 );
                rJsign = jsign2;
            }
        }
    }
    else
    {
        if ( jsign1 == '0' && jsign2 == '1' )
        {
            k = change( jnum1 ) + change( jnum2 );
            while( k > 0 )
            {
                count = ( W - 1 );
                while ( count > 1 )
                {
                    wnum2[ count - 1 ] = wnum2[ count - 2 ];
                    count--;
                }
                wnum2[ count ] = '0';
                k--;
                strcpy( rJnum, jnum1 );
                rJsign = jsign1;
            }
        }
        else
        {
            k = change( jnum1 ) + change( jnum2 );
            while( k > 0 )
            {
                count = W;
                while ( count > 1 )
                {
                    wnum1[ count - 1 ] = wnum1[ count - 2 ];
                    count--;
                }
                wnum1[ count ] = '0';
                k--;
                strcpy( rJnum, jnum2 );
                rJsign = jsign2;
            }
        }
    }
    if ( wsign1 == wsign2 )
    {
        carry = Add( wnum1, wnum2, rWnum );
        rWsign = wsign1;
    }
    else
    {
        if ( strcmp( wnum1, wnum2 ) > 0 )
        {
            D( wnum1, wnum2, rWnum );
            rWsign = wsign1;
        }
        else
        {
            D( wnum2, wnum1, rWnum );
            rWsign = wsign2;
        }
    }
    for ( count = 0; count < ( J - 1 ); count++ )
    {
        if ( rJnum[ count ] == '0' )
        {
            count = -1;
            break;
        }
    }

    if ( count != -1 && carry == '1' )
    {
        if ( rJsign == '1' )
        {
            printf("结果下溢,结果当作机器零处理。");
            getch();
            exit(1);
        }       
        else
        {
            printf("运算结果溢出");
            getch();
            exit(1);
        }
    }
    else
    {
        if ( carry == '1' )
        {
            count = ( W - 1 );
            while ( count > 0 )
            {
                rWnum[ count - 1 ] = rWnum[ count - 2 ];
                count--;
            }
            rWnum[ count ] = '1';
            if ( strcmp( rJnum, "0000000" ) == 0 )
            {
                strcpy( rJnum, "0000001" );
                rJsign = '0';
            }
            else
            {
                if ( rJsign == '0' )
                    Add( rJnum, "0000001", rJnum );
                else
                    D( rJnum, "0000001", rJnum  );
            }
        }
    }

    rJsign = standard( rJsign, rJnum, rWnum );

    if ( choose == '+' )
        output( number1, number2, '+', rJsign, rJnum, rWsign, rWnum );
    else
    {
        if ( number2[ J ] == '0' )
            number2[ J ] = '1';
        else
            number2[ J ] = '0';
        output( number1, number2, '-', rJsign, rJnum, rWsign, rWnum );
    }
}

/*减运算*/
void sub( char * number1, char * number2 )
{
    if ( number2[ J] == '0' )
        number2[ J ] = '1';
    else
        number2[ J ] = '0';
    add( number1, number2, '-' );
}

/*乘运算*/
void mul( char *number1, char *number2 )
{
    char jsign1 = number1[0];
    char jnum1[ J ];

    char wsign1 = number1[J];
    char wnum1[ W ];

    char jsign2 = number2[0];
    char jnum2[ J ];

    char wsign2 = number2[J];
    char wnum2[ W ];

    char rJsign;
    char rJnum[ J ];

    char rWsign;
    char rWnum[ W ];

    char carry = '0';

    int a = 0;
    int i = 0;
    int j = W - 2;
    int k = W - 2;

    char A[ W ];

    divide( jnum1, wnum1, number1 );
    divide( jnum2, wnum2, number2 );

    while ( wnum1[ i ] == '0' )
        i++;

    if ( i == ( W - 1 ) )
    {
        printf( "结果为零!" );
        getch();
        exit(1);
    }
    i = 0;
    while ( wnum2[ i ] == '0' )
        i++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -