c语言二维数组输出的一个小程序,打印不对呢,求大侠指导啊~~先谢过啦

dw251221 2012-02-12 06:56:28
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define pi 3.1415926

void cholesky (double **a,int n,double **l){
int i,j,c,d,k;
double s,g;
for (c=0;c<n;c++) {
for (d=0;d<n;d++){
if (c==d){s=0.;
for(k=0;k<c;k++){s+=l[c][k]*l[c][k];}
l[c][d]=sqrt(a[c][c]-s);}
if (c>d){s=0.;
for(k=0;k<d;k++){s+=l[c][k]*l[d][k];}
g=a[c][d]-s;
l[c][d]=g/l[d][d];}
if (c<d)l[c][d]=0. ;};}
;}

double mult_mat_vec(double **l,double *u,int n){
double *v;
int i,j;
for (i=0;i<n;i++){for (j=0;j<n;j++)v[i]+=l[i][j]*u[j];}
;}

double gussien(){
double u,v,s,z;
u=rand()/(RAND_MAX+1.0);
v=rand()/(RAND_MAX+1.0);
s=-2*log(u);
z=sqrt(s)*cos(2*pi*v);
return z;
}

int main (void){
double **a,**l,*u,*v;
int n,i,j,c,d,e,h,min;
srand(time(NULL));
printf ("donner la taille de matrice,SVP:\n");
scanf("%d",&n);
u=malloc(n*sizeof(double));
for (e=0;e<n;e++)u[e]=gussien();
for (e=0;e<n;e++)printf("%lf ",u[e]);
printf ("\n\n");
a=malloc(n*sizeof(double*));
for (i=0;i<n;i++){a[i]=malloc(n*sizeof(double));}
for (i=0;i<n;i++){for (j=0;j<n;j++){min=i+1;if (j<i)min=j+1;a[i][j]=2.*((double)min/(double)(i+j+2.));}}
for (i=0;i<n;i++){for (j=0;j<n;j++){printf ("%lf ",a[i][j]);if((j+1)==n){printf("\n");}}}
printf ("\n\n");
l=malloc(n*sizeof(double*));
for (c=0;c<n;c++){l[c]=malloc(n*sizeof(double));}
cholesky (a,n,l);
for (c=0;c<n;c++){for (d=0;d<n;d++){printf ("%lf ",l[c][d]);if((d+1)==n){printf("\n");};};}
v=malloc(n*sizeof(double));
mult_mat_vec(l,u,n);
for (h=0;h<n;h++)printf ("%lf ",v[h]);
return 0;
}
这是个算矩阵乘法生成以a为相关矩阵的正态分布的程序;
开始都对,就在最后一步的程序上出了一个问题:
double mult_mat_vec(double **l,double *u,int n){
double *v;
int i,j;
for (i=0;i<n;i++){for (j=0;j<n;j++)v[i]+=l[i][j]*u[j];}
;}
对应的输出程序是这个样子的
v=malloc(n*sizeof(double));
mult_mat_vec(l,u,n);
for (h=0;h<n;h++)printf ("%lf ",v[h]);

开始的时候都能输出就在这里输出不出来了,程序还不纠错,直接就结束任务了,呜呜,急死我了,求帮忙指导啊,谢谢啦,刚开始学,代码实在比较恶心,多包涵哈
...全文
183 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
taoyh2002 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dw251221 的回复:]
这个问题我想过也改过的,但是不行啊~~如果改成指针不会结束程序,但是最后一行打印出来的内容非常奇怪的说,很多很多歌零啥的
[/Quote]
这儿应该改成指针,如果打印有问题可能就是算法本身的问题了

赵4老师 2012-02-13
  • 打赏
  • 举报
回复
仅供参考
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
p=(int **)malloc(4*sizeof(int *));
if (NULL==p) return;
for (i=0;i<4;i++) {
p[i]=(int *)malloc(5*sizeof(int));
if (NULL==p[i]) return;
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
p[i][j]=i*5+j;
}
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
printf(" %2d",p[i][j]);
}
printf("\n");
}
for (i=0;i<4;i++) {
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
yht8708 2012-02-13
  • 打赏
  • 举报
回复
晕了
dw251221 2012-02-13
  • 打赏
  • 举报
回复
这个问题我想过也改过的,但是不行啊~~如果改成指针不会结束程序,但是最后一行打印出来的内容非常奇怪的说,很多很多歌零啥的
taoyh2002 2012-02-12
  • 打赏
  • 举报
回复
double mult_mat_vec(double **l,double *u,int n){
double *v;
int i,j;
for (i=0;i<n;i++){for (j=0;j<n;j++)v[i]+=l[i][j]*u[j];}
;}
这里 v都没分配内存就用,所以崩了。

你的main里的v分配了,但是没有传递到double mult_mat_vec函数里,改成下面这样
double mult_mat_vec(double **l,double *u,int n, double *v){
int i,j;
for (i=0;i<n;i++){for (j=0;j<n;j++)v[i]+=l[i][j]*u[j];}
;}
矫情狗_____ 2012-02-12
  • 打赏
  • 举报
回复
妈呀,都挤在一堆,眼睛好花...

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧