Winerat 2015-12-22 14:01 采纳率: 0%
浏览 2734

关于C++转换成C的问题,和C语言基础问题 就大神帮帮小弟

首先能不能帮我查一下错误:

#include<math.h>
#include<malloc.h>
#include<iomanip.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define  N  10              


float MatDet(float *p, int n);
float Creat_M(float *p, int m, int n, int k);  
void print(float *p, int n);
bool Gauss(float A[][N], float B[][N], int n); 

int main()
{
    float *q;
    float *p;            
    int c;
    int d;                
    int i,j;
    float e;               
    float a[N][N], b[N][N];
    int n;
    int z;
ii: 
    printf("请选择求逆矩阵方法:\n");
    printf("按 1 定义法求逆矩阵\n");
    printf("按 2 高斯消去法求逆矩阵\n");
    printf("按 3 退出\n");
    scanf("%d",&z);
    if(z==1)
    {
        system("cls");
        printf("请输入方阵的维数: ");
        scanf("%d",&c);
        d=2*c*c;
        q=(float *)calloc(d, sizeof(float));        //分配内存单元
        p=q;
        if(NULL!=p)
        {
            for(i=0;i<c;i++)
            {
                printf("请输入第%d行:",i+1);
                for(j=0;j<c;j++)
                {
                    scanf("%f",p++);
                }
            }           
        }
        else
        {
            printf("内存分配错误\n");
        }
        printf("原矩阵为:\n");
        print(q, c);                //打印该矩阵
        e=MatDet(q, c);    //求整个矩阵的行列式
        p=q+c*c;
        if(e!=0)
        {
            printf("矩阵行列式值为%f\n",e);
            for(i=0;i<c;i++)    //求逆矩阵
            {
                for(j=0;j<c;j++)
                {
                    *(p+j*c+i)=Creat_M(q,i,j,c)/e;
                }
            }
            printf("逆矩阵为:\n");
            print(p,c);                //打印该矩阵
        } 
        else
        {
            printf("行列式值为0,矩阵不可逆!\n");
        }
        free(q);        //释放内存空间
        if(getch()==13)
        system("cls");
        goto ii;
    }
    if(z==2)
    {
        system("cls");
        printf("请输入方阵的阶数: ");
        scanf("%d",&n);
        printf("请输入n阶方阵:");
        //输入一个n阶方阵
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        if (Gauss(a, b, n))
        {
            printf("该方阵的逆矩阵为:\n");
            for (i=0;i<n;i++)
            {
                setw(4);
                for (j=0;j<n;j++)
                {
                    printf("%d",b[i][j]);
                    setw(10);
                }
                printf("\n"); 
            }
        }
        if(getch()==13)
        system("cls");
        goto ii;
        return 0;
    }
}

float MatDet(float *p, int n)
{
    int r;
    int c;
    int m;
    int l=0;
    float a=0;
    float b=1;
    if(n!=1)
    {
        l=(n==2)?1:n;          
        for(m=0; m<l;m++)
        {
            b=1;          
            for(r=0,c=m;r<n;r++,c++)
            {
                b=b*(*(p+r*n+c%n));
            }
            a+=b;
        }
        for(m=0;m<l;m++)
        {
            b=1;         
            for(r=0,c=n-1-m+n;r<n;r++,c--)
            {
                b=b*(*(p+r*n+c%n));
            }
            a-=b;
        }
    }
    else 
        a=*p;
    return a;
}


float Creat_M(float *p, int m, int n, int k)
{
    int l;
    int i;
    int j;
    float r=0;
    int sign = 1;
    float *p_creat, *p_mid;
    l=(k-1)*(k-1);        
    p_creat=(float*)calloc(l, sizeof(float)); 
    p_mid=p_creat;
    for(i=0; i<k;i++)
    {
        for (j=0; j<k;j++)
        {
            if(i!=m&&j!=n)
            {
                *p_mid++=*(p+i*k+j);
            }
        }
    }
    sign=(m+n)%2==0?1:-1;   
    r=(float)sign*MatDet(p_creat,k-1);
    free(p_creat);
    return r;
}


void print(float *p, int n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        cout << setw(4);
        for(j=0;j<n;j++)
        {
            cout << setiosflags(ios::right) << *p++ << setw(10);
        }
        cout << endl;
    }
}


{
    int i,j,k;
    float max,temp;
    float t[N][N];             
    for(i=0;i<n;i++)        
    {
        for(j=0;j<n;j++)
        {
            t[i][j]=A[i][j];
        }
    }
    for(i=0;i<n;i++)        
    {
        for(j=0;j<n;j++)
        {
            B[i][j]=(i==j)?(float)1:0;
        }
    }
    for(i=0;i<n;i++)
    {
        max=t[i][i];
        k=i;
        for(j=i+1;j<n;j++)
        {
            if(fabs(t[j][i])>fabs(max))
            {
                max=t[j][i];
                k=j;
            }
        }
        if(k!=i)
        {
            for(j=0;j<n;j++)
            {
                temp=t[i][j];
                t[i][j]=t[k][j];
                t[k][j]=temp;
                //B伴随交换
                temp=B[i][j];
                B[i][j]=B[k][j];
                B[k][j]=temp; 
            }
        }
        if(t[i][i]==0)
        {
            printf("无逆矩阵");
            return false;
        }
        temp=t[i][i];
        for(j=0;j<n;j++)
        {
            t[i][j]=t[i][j]/temp;        
            B[i][j]=B[i][j]/temp;      
        }
        for(j=0;j<n;j++)        
        {
            if(j!=i)               
            {
                temp=t[j][i];
                for (k=0;k<n;k++)      
                {
                    t[j][k]=t[j][k]-t[i][k]*temp;
                    B[j][k]=B[j][k]-B[i][k]*temp;
                }
            }
        }
    }
    return true;
}

其中方法二用高斯法求逆矩阵为什么是错的;
求大神帮忙吧C++的语言换成C的,万分感谢。
我怎么吧这里面的C++的语言转化成C的语言,为什么我把cout<<endl改成printf(“\n”)就不可以

  • 写回答

2条回答 默认 最新

  • ysuwood 2015-12-22 23:42
    关注

    改好了,主要是方法二的输入输出格式不对,改为: %f
    把c++的setw、cout替换了。

            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                    scanf("%f",&a[i][j]);//修改为%f
                }
            }
            if (Gauss(a, b, n))
            {
                printf("该方阵的逆矩阵为:\n");
                for (i=0;i<n;i++)
                {
                    for (j=0;j<n;j++)
                    {
                        printf("%10f",b[i][j]);//修改为%f
                    }
                    printf("\n"); 
                }
            }
    
     void print(float *p, int n)
    {
        int i,j;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                printf("%10f", *p++);;
            }
            printf("\n");
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 怀疑手机被监控,请问怎么解决和防止
  • ¥15 Qt下使用tcp获取数据的详细操作
  • ¥15 idea右下角设置编码是灰色的
  • ¥15 全志H618ROM新增分区
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示
  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键