丨零丶 发表于 2014-3-11 21:39:57

我想做c语言的模拟CPU乘法算法的小程序算法错误

但我却不知道错在哪里了,初学者希望大神能帮忙做下
#include "stdio.h"
void AddBool(char a,char b,char n);
void Displacement(char x[],int t);
char m=0,n=0;
void main()
{
        char Product={"00000000"},Parproduct={"00000000"};
        char *p1,*p2;
        p1=Product+4;
        p2=Parproduct+4;
        scanf("%c",p1);
        scanf("%c",p2);
        n=0;
        Displacement(Parproduct,9);
        for(int i=0 ;i<=7;i++)
        {
                AddBool(Product,Parproduct,n);
                Displacement(Parproduct,8);
                Product=m;
                if(i=7){Product=n;}
               
        }
        for(int j=7;j>=0;j--)
        {
                printf("%c",Product);
        }
}
void AddBool(char a,char b,char n)//一位加法算法
{
        if(a&&b){n=1;}
        if(n&&b){n=1;}
        if(a&&b){n=1;}
        m=a^b^n;
}
void Displacement(char x[],int t)
{
        for(int i=6;i>=0;i--)
        {
                x=x;
        }
}

Nisy 发表于 2014-3-13 03:32:08

丨零丶 发表于 2014-3-13 00:27
我的思路是这样的定义一个ALU函数模仿cpu 的ALU结构从键盘输入一个被乘数Multiplicandc和一个乘数Mult ...
            1010
   *      1101
————————— ——
             1010
         00 00
      1 010
   1 01 0
————————————
1 0 0 0 00   10
太马虎了 。。。

题外话,CPU真不是这样计算乘法的,不过只是一个描述逻辑的题,可以练一下代码。


#include "stdafx.h"
#include <string.h>
#include <windows.h>
#define MAX 100

char szNum1[] = "1011111101";   // 765
char szNum2[] = "10111";      // 23
char szCount = {'0'};      // 100010010111011// 17595

VOID AddString(char* szCount )
{
    int i = 0;
    do
    {
      if ( *(szCount + i) & 0xCF )
      {
            *(szCount + i ) = 0x30;
      }
      else
      {
            *(szCount + i ) = 0x31;
            break;
      }
      i++;
    }
    while( i < MAX - 20 );
}

VOID ShowString()
{
    int nlen = strlen(szCount) - 1;
    BOOL bFind = FALSE;
    for ( int i = 0; i <= nlen ; i++ )
    {
      if ( bFind == FALSE && *(szCount + nlen - i ) == '0' )
      {
            continue;
      }
      bFind = TRUE;
      printf("%c",*(szCount + nlen - i ));
    }
}

int _tmain(int argc, _TCHAR* argv[])
{

    memset(szCount,'0',MAX);
    int nLen1 = strlen(szNum1) - 1;
    int nLen2 = strlen(szNum2) - 1;

    for ( int i = 0 ; i <= nLen2 ; i++ )
    {
      for ( int j = 0; j <= nLen1 ; j++ )
      {
            char t = (szNum2[ nLen2 - i ] & 0xCF) & (szNum1[ nLen1 - j] & 0xCF);
            if ( (szCount & 0xCF) && t )
            {
                szCount = '0';
                AddString( szCount + j + i + 1 );
            }
            else
            {
                if ( !(szCount & 0xCF) )
                {
                  szCount = ( t | 0x30 );
                }
            }
      }
    }
    ShowString();

    return 0;
}


我录过一套C视频 免费的 有兴趣的话你可以看下








Nisy 发表于 2014-3-11 21:53:18

Displacement   参数t从未使用。Add bool函数中n永远是零

丨零丶 发表于 2014-3-12 19:35:28

Nisy 发表于 2014-3-11 21:53
Displacement   参数t从未使用。Add bool函数中n永远是零

在算法中我将n作为全局变量每次使用n之前进行初始化也就是n置0;在运算过程中n会改变,我是将n作为进位传递的参数的,而那个函数中的t我是作为数组变量的长度传递进去的t可以不做使用的

Nisy 发表于 2014-3-12 21:35:13

丨零丶 发表于 2014-3-12 19:35
在算法中我将n作为全局变量每次使用n之前进行初始化也就是n置0;在运算过程中n会改变,我是将n作为进位 ...

CPU乘法算法// CPU是如何做乘法的 或者你的算法是打算如何实现的 你简单描述下 我再帮你看代码 没看懂你代码的意思

丨零丶 发表于 2014-3-13 00:27:25

我的思路是这样的定义一个ALU函数模仿cpu 的ALU结构从键盘输入一个被乘数Multiplicandc和一个乘数Multiplierc
之后定义一个函数CTB()来转换这两个输入项,转换成bool类型的Multiplicandb,Multiplierb,因为bool类型的数值是1和0,长得像CPU的0跟1所以用这种类型
接着定义一个FA函数用来做逻辑运算,将Product的前四位跟Multiplicandb按位做逻辑运算进位数据保存在c中,运算前将Product进行移位运算Displacement;
最后将Product转换成字符串输出。模型为
             1010
   *      1101
————————— ——
             1010
          1 010
      00 00
   1 01 0
————————————
   1 10 11   10

#include "stdio.h"

void ALU(bool x[],bool y[],bool p[],bool g[],bool c[]);
void FA(bool a,bool b,bool c[]);
void CTB(char a[],bool b[],int i);
void Displacement(bool a[],int i,bool b[]);
void BTC(bool a[],char b[],int i);
//函数定义

void main()
{
        char Multiplicandc,Multiplierc,Depositc;
        bool Multiplicandb,Multiplierb;
        bool Depositb={00};
        bool Product={00000000};
        bool p,g,c={00000};
        int i,n;
        //变量定义
       
        printf("请输入两个四位二进制数(例如:1111,0001,0101 两数用空格或回车隔开):");
        scanf("%s%s",Multiplicandc,Multiplierc);
        //数据输入

        CTB(Multiplicandc,Multiplicandb,3);
        CTB(Multiplierc,Multiplierb,3);
        CTB(Multiplicandc,Product,3);
        //类型转换
       

        for(n=0;n<=3;n++)
        {
                Displacement(Product,7,c);
                ALU(Multiplicandb,Product,p,g,c);
                for(i=3;i>=0;i--)
                        {
                                FA(p,g,Depositb);
                                Product=        Depositb;
                        }
        }//算法
       
        BTC(Product,Depositc,8);
        printf("计算结果:%s",Depositc);
        return;

}


void ALU(bool x[],bool y[],bool p[],bool g[],bool c[])//4位全加部件ALU
{       
        for(int t=0;t<=3;t++)
                {
                        p=x||y;
                        g=x&&y;
                }
        for(int i=0;i<=3;i++)
        {
                int j=1;
                c=(p&&c)||g;
                j++;
        }
        return;
}

//1位逻辑运算,c[]作为寄存器,其中c储存计算结果,c用作存储上次计算结果的进位,c[]指向主函数的Depositb
void FA(bool a,bool b,bool c[])
{
        if((a||b)&&(a||c)&&(b||c)){c=true;}
        c=a^b^c;
        c=false;
        return;
}
void CTB(char a[],bool b[],int i)//char转bool
{
        for(;i>=0;i--)
        {
                if(a=='0'){b=false;}
                else{b=true;}
        }
        return;
}
void Displacement(bool a[],int i,bool b[])//数组移位,右移一位,左边用j值填充,右边一位抛弃
{
        for(;i>=0;i--)
        {
                if(i=0){a=b;break;}
                a=a;
        }
        b=0;
        return;
}
void BTC(bool a[],char b[],int i)//bool 转char
{
        for(;i>=0;i--)
        {
                if(i=8){b='\0';continue;}
                if(a=false){b='0';}
                else{b='1';}
        }
        return;
}
这是我优化后的代码但是还是输出不了结果一直在运行

丨零丶 发表于 2014-3-13 00:28:27

Nisy 发表于 2014-3-12 21:35
CPU乘法算法// CPU是如何做乘法的 或者你的算法是打算如何实现的 你简单描述下 我再帮你看代码 没看懂 ...

楼上是我优化后的代码和思路 但是依然无法输出结果   求支援

丨零丶 发表于 2014-3-13 00:34:55

Nisy 发表于 2014-3-12 21:35
CPU乘法算法// CPU是如何做乘法的 或者你的算法是打算如何实现的 你简单描述下 我再帮你看代码 没看懂 ...

我是初学者 难免会饭诸多错误请多多指教   帮我找找错误3QVRMC

丨零丶 发表于 2014-3-13 12:59:39

Nisy 发表于 2014-3-13 03:32
1010
   *      1101
————————— ——


话说不是我非要这么写   我知道CPU的乘法计算方式--阵列乘法运算但是作业要求的是这种算法 。。。。。。。。

丨零丶 发表于 2014-3-13 13:02:11

Nisy 发表于 2014-3-13 03:32
1010
   *      1101
————————— ——


另外我是初学者你要理解初学者的苦衷啊
页: [1] 2
查看完整版本: 我想做c语言的模拟CPU乘法算法的小程序算法错误