| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 596 人关注过本帖
标题:关于输出问题(懂离散的进来看一下哦)
只看楼主 加入收藏
工藤♀新一
Rank: 1
等 级:新手上路
帖 子:140
专家分:0
注 册:2006-5-4
收藏
 问题点数:0 回复次数:6 
关于输出问题(懂离散的进来看一下哦)

程序是这样的:
#include "stdio.h"
#include "Malloc.h"
void rR(int **w1,int n1);
void sR(int **w2,int n2);
void tR(int **w3,int n3);
void printjuzhen(int **w,int nh,int ml);
main() /*在这输入动态数组的值并保存3份m1,m2,m3*/
{ int i,j,n;
int **m1,**m2,**m3;
printf("Input n:");
scanf("%d",&n);
m1=(int*)malloc(n*n*2);
m2=(int*)malloc(n*n*2);
m3=(int*)malloc(n*n*2);
printf("Input juzhen:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{ scanf("%d",&m1[i][j]);
m2[i][j]=m1[i][j];
m3[i][j]=m1[i][j];
}
rR(m1,n);
sR(m2,n);
tR(m3,n);

getch();
}

void rR(int **w1,int n1) /*求输入的关系方阵的自反比包(原方阵+同阶数的单位方阵(就是对角线为1其余为0))*/
{
int i,j;
int **Ix;
Ix=(int*)malloc(n1*n1*2);
for(i=0;i<n1;i++)
for(j=0;j<n1;j++)
{ if(i==j) Ix[i][j]=1;
else Ix[i][j]=0;
}
for(i=0;i<n1;i++)
for(j=0;j<n1;j++)
w1[i][j]=w1[i][j]+Ix[i][j];
printf("r(R):\n");
printjuzhen(w1,n1,n1);
}

void sR(int **w2,int n2) /*求对称必包就是原方阵+原方阵的转置方阵*/
{
int i,j;
int **Rc;
Rc=(int*)malloc(n2*n2*2);
for(i=0;i<n2;i++)
for(j=0;j<n2;j++)
Rc[i][j]=w2[j][i];
for(i=0;i<n2;i++)
for(j=0;j<n2;j++)
w2[i][j]=w2[i][j]+Rc[i][j];
printf("s(R):\n");
printjuzhen(w2,n2,n2);
}

void tR(int **w3,int n3) /*求对传递必包具体是用warshall方法*/

{ int i,j,k;
for(j=0;j<n3;j++)
for(i=0;i<n3;i++)
{if(w3[i][j]>=1)
for(k=0;k<n3;k++)
{w3[i][k]=w3[i][k]+w3[j][k];
}
}
printf("t(R):\n");
printjuzhen(w3,n3,n3);
}

void printjuzhen(int **w,int nh,int ml)
{ int i,j;
for(i=0;i<nh;i++)
for(j=0;j<ml;j++)
{ if(w[i][j]>=2) w[i][j]=1; 这句为后来加上的
printf("%d ",w[i][j]);
if(j==(ml-1)) printf("\n");
}

}
PS:方阵的加法为逻辑加既1+1=1,0+0=0,大于1的相加也为1
我的问题是为什么在不加红的那句输出的话为正确答案(但没有把>=1的置为1),
而加了红的后就错了呢?既不是只是把>=1的变成1
如输入4
0 1 0 0
1 0 1 0
0 0 0 1
0 0 0 0
时最后一个方阵为
t(R):
1 2 1 1
2 2 2 1
0 0 0 1
0 0 0 0
但加了红的那句后就成了
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
这是为什么?太奇怪我只是在输出时让 >=2的变为1罢了
大家帮忙看看吧

搜索更多相关主题的帖子: 离散 输出 
2006-05-12 17:11
工藤♀新一
Rank: 1
等 级:新手上路
帖 子:140
专家分:0
注 册:2006-5-4
收藏
得分:0 
等~

很高兴能和大家一起学习程序! QQ:114109098
2006-05-12 17:29
黔山菜鸟
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2006-5-12
收藏
得分:0 
我们上学期学的 但离散好像和数据结构有关
  不得编程嘛   那是什么  你大几了

我为C狂  哈哈~~~~~~
2006-05-12 17:40
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用工藤♀新一在2006-5-12 17:11:00的发言:

void printjuzhen(int **w,int nh,int ml)
{ int i,j;
for(i=0;i<nh;i++)
for(j=0;j<ml;j++)
{ if(w[i][j]>=2) w[i][j]=1; 这句为后来加上的
printf("%d ",w[i][j]);
if(j==(ml-1)) printf("\n");
}

}
PS:方阵的加法为逻辑加既1+1=1,0+0=0,大于1的相加也为1
我的问题是为什么在不加红的那句输出的话为正确答案(但没有把>=1的置为1),/*Are you sure?*/
而加了红的后就错了呢?既不是只是把>=1的变成1
如输入4
0 1 0 0
1 0 1 0
0 0 0 1
0 0 0 0
时最后一个方阵为
t(R):
1 2 1 1
2 2 2 1
0 0 0 1
0 0 0 0
但加了红的那句后就成了
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
这是为什么?太奇怪我只是在输出时让 >=2的变为1罢了
大家帮忙看看吧

我在wtc运行,都是错误的!
你可以把你想要的结果先说一下,我不想深入去看啊!离散这东西,很难琢磨!

对不礼貌的女生收钱......
2006-05-12 17:46
工藤♀新一
Rank: 1
等 级:新手上路
帖 子:140
专家分:0
注 册:2006-5-4
收藏
得分:0 

高手帮忙看一下啊~
结果的话可能会与我的有出入但程序的话我觉得应该是对的啊`好奇怪


很高兴能和大家一起学习程序! QQ:114109098
2006-05-16 20:02
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

//朋友,二维数组不等于二级指针!!!
//得用一维动态数组模拟之。
#include "stdio.h"
#include "stdlib.h"
void rR(short *w1,short n1);
void sR(short *w2,short n2);
void tR(short *w3,short n3);
void printjuzhen(short *w,short nh,short ml);
main()
{ short i,j,n;
short *m1,*m2,*m3;
printf("Input n:");
scanf("%d",&n);
m1=(short*)malloc(n*n*2);
m2=(short*)malloc(n*n*2);
m3=(short*)malloc(n*n*2);
printf("Input juzhen:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{ scanf("%d",&m1[i*n+j]);
m2[i*n+j]=m1[i*n+j];
m3[i*n+j]=m1[i*n+j];
}
rR(m1,n);
sR(m2,n);
tR(m3,n);

}

void rR(short *w1,short n1)
{
short i,j;
short *Ix;
Ix=(short*)malloc(n1*n1*2);
for(i=0;i<n1;i++)
for(j=0;j<n1;j++)
{ if(i==j) Ix[i*n1+j]=1;
else Ix[i*n1+j]=0;
}
for(i=0;i<n1;i++)
for(j=0;j<n1;j++)
w1[i*n1+j]+=Ix[i*n1+j];
printf("r(R):\n");
printjuzhen(w1,n1,n1);
}

void sR(short *w2,short n2)
{
short i,j;
short *Rc;
Rc=(short*)malloc(n2*n2*2);
for(i=0;i<n2;i++)
for(j=0;j<n2;j++)
Rc[i*n2+j]=w2[j*n2+i];
for(i=0;i<n2;i++)
for(j=0;j<n2;j++)
w2[i*n2+j]+=Rc[i*n2+j];
printf("s(R):\n");
printjuzhen(w2,n2,n2);
}

void tR(short *w3,short n3)
{ short i,j,k;
for(j=0;j<n3;j++)
for(i=0;i<n3;i++)
{if(w3[i*n3+j]>=1)
for(k=0;k<n3;k++)
{w3[i*n3+k]+=w3[j*n3+k];
}
}
printf("t(R):\n");
printjuzhen(w3,n3,n3);
}

void printjuzhen(short *w,short nh,short ml)
{ short i,j;
for(i=0;i<nh;i++)
for(j=0;j<ml;j++)
{ if(w[i*ml+j]>=2) w[i*ml+j]=1;
printf("%d ",w[i*ml+j]);
if(j==(ml-1)) printf("\n");
}

}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-16 20:23
工藤♀新一
Rank: 1
等 级:新手上路
帖 子:140
专家分:0
注 册:2006-5-4
收藏
得分:0 
先试了一下确实是可以了,
也看懂了楼上的意思
i*n+j
i应该控制行数
j控制列数
确实是用1维数组模拟了~
没的说,强!
题目解决了,也增加了知识,呵呵

很高兴能和大家一起学习程序! QQ:114109098
2006-05-16 20:35
快速回复:关于输出问题(懂离散的进来看一下哦)
数据加载中...
 
   



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

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