作者
|
标题: 一个无法理解的c源程序
|
disguise
未注册
|
| |
题目:输入一个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: 已记录
|
|
|
千年纪风
未注册
|
| |
引用:
完毕。谁能告诉我一个理解这段程序的最简单的方法,能够让我很容易的自己编出来(尤其是相乘的那一段)
你需要把C的语法熟悉,你要是想自己编成程序来,也只有这个方法了,在C下编程还是相对简单的[个人认为]还有,做为程序员,脑子里要有水,也就是你需要记忆一些标准程序,而不是没头没脑的拿笔就写--呵呵.这是一点心德. ------------------ 天涯孤旅何时才能停止! 带着最终的信念飘零尘世! 只对着一屡屡的清风痴迷! 这就是我-千年纪风-与风作伴的天涯浪子...
| |
IP: 已记录
|
|
|
|
|
disguise
未注册
|
| |
求救,很重要,我不知道为什么这么算
| |
IP: 已记录
|
|
|
disguise
未注册
|
| |
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
未注册
|
| |
*(p[2]+2*i+k)+=*(p[0]=3*i+j)*(*(p[1]+2*j+k));单单最后这一行,肯定不会得出正确得数的, 其实你先摆个数学式出来, 然后想法用C去实现,是很容易编的
| |
IP: 已记录
|
|
|
xiean
未注册
|
| |
题目:输入一个2*3的整数矩阵和一个3*2的整数矩阵,请使用指针数组实现这两个矩阵的相乘 能不能把题目写清楚一点啊 1 1 1 2 2 2 怎么和 1 1 2 2 3 3 乘啊?看了半天,没看懂 ------------------ 技术相关的不用找我,我是菜鸟; 空虚的美眉不用找我,我有女友; 无聊的大虾不用找我,我只发呆; 以上皆否的不用找我,我想清静!
| |
IP: 已记录
|
|
|
魔亦神
未注册
|
| |
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
评价成员
|
| |
一看数学题,俺头就大了,因为读书的时候我老是逃课,呵呵,这样的程序在实际的编程中也几乎没用到,看完了都不知道这样计算出来有什么目的,不过既然斑竹大人叫到俺了,咋样也得济济脑汁再加上请教高人把这个问题给挤出来咯 你好象指针没弄明白,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: 已记录
|
|
|
千年纪风
未注册
|
| |
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
未注册
|
| |
这个程序昨天折磨了我一天,昨天下午终于想通了,很简单。 谢谢你们的指点,可是都没说在点子上,请原谅我这么直接。 我的问题不是随随便便就提出的,象一些语法问题和概念我一定是都搞的非常明白。昨天我想问的是编程的算法,为什么这么算,瞧,你们都没说吧,说的都是些语法,这个我都会呀。现在我自己想明白了。 不管怎么说,还要谢谢你们。
| |
IP: 已记录
|
|
|
xiean
未注册
|
| |
disguise,这个代码的算法并不算很好啊,效率有点低,你看看我帖的那个帖子啦,虽然不算最好的,但我想对你多少有点帮助的
| |
IP: 已记录
|
|
|