| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 409 人关注过本帖
标题:我老遇到代码没检验出有错但一运行就会说有个问题导致程序停止工作。
只看楼主 加入收藏
我不想说
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-5-6
结帖率:0
收藏
已结贴  问题点数:20 回复次数:5 
我老遇到代码没检验出有错但一运行就会说有个问题导致程序停止工作。
这是我写的矩阵乘法的带码:
int juzhen(){
   int **a=NULL;
   printf("请输入第一个矩阵的行数和列数\n");
    int n,m;
    scanf("%d%d",&n,&m);
    a=(int**)malloc(sizeof(int*)*n);
    for(int i=0;i<n;i++)
    a[i]=(int*)malloc(sizeof(int*)*m);
    printf("请以行输入第一个矩阵的元素\n");
    for(int i1=0;i1<n;i1++)
        for(int j=0;j<m;j++)
            scanf("%d",&a[i1][j]);
    int **b=NULL;
    int n1,m1;
   printf("请输入第二个矩阵的行数和列数\n");
    scanf("%d",&n1);
    scanf("%d",&m1);
    b=(int**)malloc(sizeof(int*)*n1);
    for(int k=0;k<n1;k++)
        b[k]=(int*)malloc(sizeof(int*)*m1);
    printf("请以行输入第二个矩阵的元素\n");
    for(int k1=0;k1<n1;k1++)
        for(int j1=0;j1<m1;j1++)
            scanf("%d",&b[k1][j1]);
        int **c=NULL;
        c=(int**)malloc(sizeof(int*)*n);
        for(int i2=0;i2<n;i2++);
        c[i2]=(int*)malloc(sizeof(int*)*m1);
        for(int i3=0;i3<n;i3++){
            for(int k2=0;k2<m1;k2++){
                int sum=a[i3][0]*b[0][k2];
                for(int j2=1;j2<n1;j2++)
                sum +=a[i3][j2]*b[j2][k2];
                 c[i3][k2]=sum;//这行开始停止工作
            }
        }
        for(int i4=0;i4<n;i4++){
           printf("A");
            for(int j4=0;j4<m1;j4++)
                printf("%d",c[i4][j4]);
            printf("\n");
        }
        for(i=0;i<n;i++)
        free(a[i]);
        free(a);
        for(k=0;k<n1;k++)
        free(b[k]);
        free(b);
        for(i2=0;i2<n;i2++)
        free(c[i2]);
        free(c);
        return 1;
    }
搜索更多相关主题的帖子: 元素 
2014-05-06 23:32
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:10 
至少: a[i]=(int*)malloc(sizeof(int*)*m);
应该换成:a[i]=(int*)malloc(sizeof(int)*m);
这样定义出来的“动态二维数组”,不能保证行与行之间是连续的,即,不是一行一行首尾相接存放的。只能用两个下标来确定它的元素,不能利用一个整型指针遍历整个这样的“动态二维数组”。

[ 本帖最后由 kwxx 于 2014-5-7 08:31 编辑 ]
2014-05-07 07:52
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
int juzhen(){
   int **a=NULL,i,j,k;

   printf("请输入第一个矩阵的行数和列数\n");
    int n,m;
    scanf("%d%d",&n,&m);

    a=(int**)malloc(sizeof(int*)*n);    //为二级指针申请了一个包含n个元素的整型指针数组
    for(i=0;i<n;i++)
        a[i]=(int*)malloc(sizeof(int)*m);//为整型指针数组的每个指针元素申请了包含m个元素的整型数组

    printf("请以行输入第一个矩阵的元素\n");
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            scanf("%d",&a[i][j]);


    int **b=NULL;
    int n1,m1;
   printf("请输入第二个矩阵的行数和列数\n");
    scanf("%d",&n1);
    scanf("%d",&m1);

    b=(int**)malloc(sizeof(int*)*n1);
    for(i=0;i<n1;i++)
        b[i]=(int*)malloc(sizeof(int)*m1);

    printf("请以行输入第二个矩阵的元素\n");
    for(i=0;i<n1;i++)
        for(j=0;j<m1;j++)
            scanf("%d",&b[i][j]);

    int **c=NULL;
    c=(int**)malloc(sizeof(int*)*n);
    for(i=0;i<n;i++)            //你的程序这里多了一个分号!!!
        c[i]=(int*)malloc(sizeof(int)*m1);

    for(i=0;i<n;i++){
        for(j=0;j<m1;j++){
           c[i][j]=0;
           for(k=0;k<n1;k++)
                c[i][j] +=a[i][k]*b[k][j];
            }
        }

        printf("A:\n");
        for(i=0;i<n;i++){
            for(j=0;j<m1;j++)
                printf("%5d",c[i][j]);
            printf("\n");
        }

        for(i=0;i<n;i++)
            free(a[i]);
        free(a);
        for( k=0;k<n1;k++)
            free(b[k]);
        free(b);
        for( i=0;i<n;i++)
            free(c[i]);
        free(c);

        return 1;
    }
int main()
{
    juzhen();
    return 0;
}
2014-05-07 09:21
我不想说
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-5-6
收藏
得分:0 
回复 3 楼 kwxx
嗯我搞好了原本我还以为是数组越界,找了半天都没有发现越界。原来是多了个分号。
2014-05-07 16:08
我不想说
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-5-6
收藏
得分:0 
回复 3 楼 kwxx
我又遇到这样的问题了我看了好久都没发现有语法问题,代码是关于0-1背包问题的麻烦你帮我看看,

#include<stdio.h>
#include<malloc.h>
#include<string.h>
double knapsack(double w[],double v[],double c,double **p,int head[],int n){
    head[n+1]=0;
    p[0][0]=0;
    p[0][1]=0;
    int left=0;
    int right=0;
    int next=1;
    head[n]=1;
    for(int i=n;i>=1;i--){
        int k=left;
        for(int j=left;j<=right;j++){
            if(p[j][0]+w[i]>c)
                break;
            double y=p[j][0]+w[i];
            double m=p[j][1]+v[i];
            while (k<=right && p[k][0]<y){
                p[next][0]=p[k][0];
                p[next++][1]=p[k++][1];
            }
            if(k<=right && p[k][0]==y){
                if(m<p[k][1]){
                    m=p[k][1];
                }
                k++;
            }
            if(m >p[next-1][1]){
               p[next][0]=y;
               p[next++][1]=m;
        }
        
            while(k<=right && p[k][1]<=p[next-1][1])
                k++;
        }
        while(k<=right){
            p[next][0]=p[k][0];
            p[next++][1]=p[k++][1];
        }
        left=right+1;
        right=next-1;
        head[i-1]=next;
    }
    return p[next-1][1];
}
void traceback(double w[],double v[],double **p,int head[],int x[],int n){
    double j=p[head[0]-1][0];
    double m=p[head[0]-1][1];
    for(int i=1;i<=n;i++){
        x[i]=0;
        for(int k=head[i+1];k<=head[i]-1;k++){
            if(p[k][0]+w[i]==j && p[k][1]+v[i]==m){
                x[i]=1;
                j=p[k][0];
                m=p[k][1];
                break;
            }
        }
        printf("最优值为%lf\n",m);
        printf("得到一组最优解:");
        for(int ii=1;ii<=n;ii++)
            printf("%d ",x[ii]);
        printf("\n");
    }
}
void main(){
    int c,n;
    printf("请输入物品的数量");
    scanf("%d",&n);
printf("请输入背包的负重");
    scanf("%d",&c);
   double *w=(double*)malloc(sizeof(double)*(n+1));//为数组w分配空间
   printf("请输入物品的重量");
   for(int i=1;i<=n;i++)
       scanf("%lf",&w[i]);
   double *v=(double*)malloc(sizeof(double)*(n+1));
   printf("请输入每件物品对应的价值");
   for(int j=1;j<=n;j++)
       scanf("%lf",&v[j]);
   int *head=(int*)malloc(sizeof(int)*(n+1));
   int *x=(int*)malloc(sizeof(int)*(n+1));
   double **p=(double**)malloc(sizeof(double*)*(n+1));
   for(int a=0;a<=n;a++){
        p[a]=(double*)malloc(sizeof(double)*2);
   }
   knapsack(w,v,c,p,head,n);
   traceback(w,v,p,head,x,n);
}
2014-05-07 16:44
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:10 
如果允许使用C99语法,则
double *v=(double*)malloc(sizeof(double)*(n+1));
可改为
double v[n+1];
这也就是新标准带来的好处。

你并没有解释这个“背包问题”是怎么回事,代码也无注释,让人费解。
2014-05-08 20:19
快速回复:我老遇到代码没检验出有错但一运行就会说有个问题导致程序停止工作。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023576 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved