20CN网络安全小组第一代论坛
发表新主题  发表回复

个人资料 | 社区目录 用户登录 | | 论坛搜索 | 常见问题 | 论坛主页
  下一个最老的主题   下一个最新的主题
» 20CN网络安全小组第一代论坛   » 电 脑 技 术   » 编程破解   » 一个无法理解的c源程序

   
作者 标题: 一个无法理解的c源程序
disguise
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
题目:输入一个2*3的整数矩阵和一个3*2的整数矩阵,请使用指针数组实现这两个矩阵的相乘。
#include<stdio.h>
main()
{static int a[2][3],b[3][2],result[2][2];
int *p[3];
p[0]=a[0];p[1]=b[0];p[2]=result[0];
printf("\n the 1st matrix;\n");
for(int i=0;i<2;i++)
{printf("new line:\n");
for(int j=0;j<3;j++)
scanf("%d",p[0]+3*i+j);
}
printf("\n the 2st matrix;\n");
for(int i=0;i<3;i++)
{printf("new line:\n");
for(int j=0;j<2;j++)
scanf("%d",p[1]+2*i+j);
}
/以下的开始相乘/
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
for(int k=0;k<2;k++)
*(p[2]+2*i+k)+=*(p[0]=3*i+j)*(*(p[1]+2*j+k));
for(int i=0;i<2;i++)
{printf("\n");
for(int j=0;j<2;j++)
printf("%d,",*(p[2]+2*i+j));
}
}
完毕。谁能告诉我一个理解这段程序的最简单的方法,能够让我很容易的自己编出来(尤其是相乘的那一段)
IP: 已记录
千年纪风
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  

引用:

完毕。谁能告诉我一个理解这段程序的最简单的方法,能够让我很容易的自己编出来(尤其是相乘的那一段)

你需要把C的语法熟悉,你要是想自己编成程序来,也只有这个方法了,在C下编程还是相对简单的[个人认为]还有,做为程序员,脑子里要有水,也就是你需要记忆一些标准程序,而不是没头没脑的拿笔就写--呵呵.这是一点心德.

------------------
天涯孤旅何时才能停止!
带着最终的信念飘零尘世!
只对着一屡屡的清风痴迷!
这就是我-千年纪风-与风作伴的天涯浪子...

IP: 已记录
disguise
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
先把这个问题给我搞清楚先
IP: 已记录
disguise
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
很重要的,大哥也不会吗
IP: 已记录
disguise
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
求救,很重要,我不知道为什么这么算
IP: 已记录
disguise
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
for(int k=0;k<2;k++)
*(p[2]+2*i+k)+=*(p[0]=3*i+j)*(*(p[1]+2*j+k));
就是这段不懂
IP: 已记录
zyclql
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  

*(p[2]+2*i+k)+=*(p[0]=3*i+j)*(*(p[1]+2*j+k));

单单最后这一行,肯定不会得出正确得数的,

其实你先摆个数学式出来,
然后想法用C去实现,是很容易编的

IP: 已记录
xiean
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
题目:输入一个2*3的整数矩阵和一个3*2的整数矩阵,请使用指针数组实现这两个矩阵的相乘

能不能把题目写清楚一点啊

1 1 1
2 2 2
怎么和
1 1
2 2
3 3
乘啊?看了半天,没看懂

------------------
技术相关的不用找我,我是菜鸟;
空虚的美眉不用找我,我有女友;
无聊的大虾不用找我,我只发呆;
以上皆否的不用找我,我想清静!

IP: 已记录
魔亦神
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
for(int k=0;k<2;k++)
*(p[2]+2*i+k)+=*(p[0]=3*i+j)*(*(p[1]+2*j+k));
就是这段不懂
--------------------------------------------
这段的话,我来解释一下。。程序不能说那个部分重要,每一个部分都有它的作用.
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
for(int k=0;k<2;k++)
这三个没什嘛好说得了,就是让i=2,j=3,k=2
来弄成2*3 3*2的了。
*(p[2]+2*i+k)+=*(p[0]=3*i+j)*(*(p[1]+2*j+k));
(p[2]+2*i+k)+
这个p[2]数值+2*I(I是1-2)+k(也是1-2)
3*i+j负值给p[0]
(p[1]+2*j+k) *(p[0])+ (p[2]+2*i+k) 再次负值给(p[2]+2*i+k)

说真的,这不难理解.
scanf("%d",p[0]+3*i+j);

scanf("%d",p[1]+2*i+j);

*(p[2]+2*i+k)+=*(p[0]=3*i+j)*(*(p[1]+2*j+k));

这个作者写得也不是很好..
主要是利用指针问题.你如果真看不懂,那你先看看指针部分的,跟数组部分的.
先把a[2][3],b[3][2]..弄成整数举行,当然实现很容易使用for,然后接着把指针定向..这样修改一下,你大概能明白了

IP: 已记录
NetDemon
初级成员
编号: 2

评价成员
图标 1  发表于    NetDemon的个人资料   发送 Email 给NetDemon   发送新的短讯      编辑/删除帖子   引用原文回复  
一看数学题,俺头就大了,因为读书的时候我老是逃课,呵呵,这样的程序在实际的编程中也几乎没用到,看完了都不知道这样计算出来有什么目的,不过既然斑竹大人叫到俺了,咋样也得济济脑汁再加上请教高人把这个问题给挤出来咯

你好象指针没弄明白,int **p; 和 int *p[]; 是一个道理,然后是给指针做初始化,将数组地址附给指针,然后是循环输入,计算部分的FOR,当FOR没有括号时只循环FOR下面一句,这样做就是三个循环,不就是3X2的句阵计算么。
*(p[2]+2*i+k)+=*(p[0]=3*i+j)*(*(p[1]+2*j+k));
你根本没搞明白这个*是啥意思。在指针里是取指针指向地址内的数值。这里只有一个*是代表乘法 的
*(p[2]+2*i+k) //这个是取地址 ,打个比方当前指针指向地址值是20
*(p[0]=3*i+j) //当前指针指向地址值是 10
*(p[1]+2*j+k) //当前指针指向地址值是 5
那么就是 20=20+10 X 5 //就是这个概念
然后配合上面那个FOR循环,就出了3 X 2的句阵

我明天去找本数学课本出来,看完了,再找个数据结构出来温习温习,完了才过来和你们混混


------------------
微软给了我窗户,因此UNIX给了我房子
微软给我窗户了吗?没有
所以UNIX没有给了我房子
我仍然游荡在Internet上

[被 NetDemon 编辑过(日期 08-05-2001)]

发表: 4 | 注册: 2005-02-27  |  IP: 已记录
千年纪风
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
for(int k=0;k<2;k++)
*(p[2]+2*i+k)+=*(p[0]=3*i+j)*(*(p[1]+2*j+k));
就是这段不懂
--------------------------------------------
不是我说,很明显这4段话你不明白是因为在上面的程序你也不一定非常明白!这4段明显是循环语句!
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
for(int k=0;k<2;k++)
上面第一句for(int i=0;i<2;i++),在循环节上面是有初始化值的,上面取值i++,如满足条件i+1
此时要主意i先加还是后加,否则下面就不可能得到结果 *(p[2]+2*i+k)+=*(p[0]=3*i+j)*(*(p[1]+2*j+k)); NetDemon说的很明白!

------------------
天涯孤旅何时才能停止!
带着最终的信念飘零尘世!
只对着一屡屡的清风痴迷!
这就是我-千年纪风-与风作伴的天涯浪子...

IP: 已记录
disguise
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
这个程序昨天折磨了我一天,昨天下午终于想通了,很简单。
谢谢你们的指点,可是都没说在点子上,请原谅我这么直接。
我的问题不是随随便便就提出的,象一些语法问题和概念我一定是都搞的非常明白。昨天我想问的是编程的算法,为什么这么算,瞧,你们都没说吧,说的都是些语法,这个我都会呀。现在我自己想明白了。
不管怎么说,还要谢谢你们。
IP: 已记录
xiean
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
disguise,这个代码的算法并不算很好啊,效率有点低,你看看我帖的那个帖子啦,虽然不算最好的,但我想对你多少有点帮助的
IP: 已记录

 
发表新主题  发表回复 关闭主题 突出主题 移动主题 删除主题 下一个最老的主题   下一个最新的主题
 - 适于打印的主题视图
转到:
联系我们 | 20CN网络安全小组

Powered by Infopop Corporation
UBB.classic™ 6.5.0
NetDemon修改版 1.5.0, 20CN网络安全小组 版权所有。