作者maxcsh (ㄚ翰)
看板b97902HW
标题[心得] 钢弹HW6-The mission
时间Wed Nov 19 00:21:20 2008
呼呼!
在废掉了一整个晚上,从下课後一直到十点,都宅在219被钢弹屠宰、
费尽了九牛二虎之力、晚餐都没吃的弱者我,终於把它解决了!
所以就在此提供一些小小心得啦!
(先声明我不是强者,我也是跟大家一样刚接触C语言的新手,所以如果
有方法比较笨或打错,请多多包涵,以下给各位参考看看)
---------------------------废话分隔线-----------------------------
----------------------------以下正题------------------------------
首先,是第一个步骤,也就是分析字串,一开始的测资有两行,
分别是
[IDENTIFIER_LR NUM]+
以及
[IDENTIFIER_ST IDENTFIER_LR INDEX]+
其中[...]+的意思是指,每个[]为一组,[]可以重复出现;
Ex.
Left 5 Right 5 Left 5 Right 5 Left 4
Start Right 4 Start Left 3 Target Right 4
像这样子的input。
0.前置动作;
我们必需做的,就是
把它们切开,切开的方法有很多,
像sscanf(),strtok(),for loop...等等,课本或投影片里应该找得到,
/*sscanf()已经可以用了,之前用它写然後传上去拿零分
的同学们可以不用像我一样砍掉重练,直接用就行了。
建议是用sscanf()写会比较方便,for loop也OK,
用strtok()的话要小心会当掉。 */
然後把切开的东西存起来,
一组一组来判断,
比方说,
"Left 5",
"Right 5",
"Left 5",
"Right 5",
"Right 4"
"Start Right 4",
"Start Left 3",
"Target Right 3"
这样分组判断。
原则上只要for加上一堆if,else if,else等等就可以解决。
重要的是,只要判断出现
Error的话,就立刻把它印出来,
所以
Error Message可以不只一个!
1.有关(MSG1)的部分:
分析
两行测资,
//是两行喔!
第一行主要就是
判断有没有重复定义的 Left || Right,
(redifined)
/*注意:出现
Left 5 Left 5 Right 3这种状况时,并
不算redifined,
要
Left 5 Left 6 Right 3这样才算。
//Error at line1; Left entry redifined. */
或者是
判断 Left || Right 的输入有没有错,
(unknown identifier)
例如我打
XD 5 HAHA 5,理论上程式看不懂
XD跟
HAHA,
理所当然就要print出Error啦!
//Error at line1 : unknown identifier XD(LR).
//Error at line1 : unknown identifier HAHA(LR).
第二行的部分则是
确认Start || Target有没有重复出现,
(mutiple point)
/*注意:出现
Start Left 5 Start Left 5 Target Right 3这种状况时,
,
算mutiple start point,所以请记得要输出Warning喔!
*/
以及
确认输入的东西有没有错,这部分就跟第一行的差不多罗。
//提示:助教的程式是先判断Start || Target,再判断Left || Right
/*注意:当print这个;
Error at line1: unknown identfier STRING(LR).
或 Error at line2: unknown identfier STRING(LR).
或 Error at line2: unknown identfier STRING(ST).
的时候,
请记得在STRING後面加上(LR) ||
(ST)。
不要像我呆呆的只印STRING出来.
还有STRING是input进去的错误讯息!也别呆呆的就印"STRING"出来
另外请注意输出的顺序! */
(MSG1)处理完毕後,
if 出现Error,你就可以return拿分数(结束程式),
else 请继续处理(MSG2)的部分。
/*提醒:如果只有出现Warning的话,请不要终止程式!,继续(MSG2)!*/
2.有关(MSG2)的部分;
主要是
判断Start point以及Target point存不存在,
还有
判断它们究竟有没有效。
所以如果说有mutiple point的话是算它存在的喔!(这也是为什麽Warning可以继续)
当你在处理完(MSG1)之後,
应该可以确认有没有输入Start point || Target point,
例如说
Start Left 5 Start Left 5
这样就没有Target point,所以请print
No target point!
又比方说
Left 3 Right 3
Target Left 3 这种状况,
就要输出
No start point!
Invalid target point!
//因为左边只有三间,编号为0,1,2,所以Target Left 3是invalid。
//同样也要注意输出顺序喔!
(MSG2)处理完了之後,
if 这两个point其中一个无效或不存在,也无法继续下去,所以一样return拿分数。
else 就是要按照 Left X 跟 Right Y 中的 X 及 Y
来读进最後的测资(theta,d,a,alpha)。
(先Left的部分,再Right的部分喔)
3.有关矩阵的部分:
先读进X行的(theta,d,a,alpha)
//先Left的部分
以及Y行的(theta,d,a,alpha)
//再Right的部分
读完之後,就可以
用助教提供的Source code,也就是
DHMatrix(double T[][4],double theta,double d,double a,double alpha);
这个function,让各位
把每一组(theta,d,a,alpha)转成T[4][4]的矩阵,
也就是说,丢(T[][4],theta,d,a,alpha)给DHMatrix就会跑出一个T[4][4]的矩阵。
因为最终目的是把起始的(x1,y1,z1)以及终止的(x2,y2,z2)找出来,
所以可以先把所有的4*4矩阵都先乘起来後,再用(0,0,0,1)去乘它。
(不要问我最後那个1怎麽来的,我也不知道,有兴趣请找助教谢谢)
例如说:
Left 6 Right 6
Start Right 5 Target Left 1
则
M_Start [4][4]=R5*R4*R3*R2*R1*R0;
M_Target[4][4]=L1*L0;
/*注意:是从最後乘回来喔!矩阵乘法没有交换律的!*/
其中
LX RX 都是4*4的矩阵(从DHMatrix得到),
也就是说
我们必须写个程式把所有的矩阵乘起来。
最後的结果则存在M_Start [4][4]
及M_Target[4][4],
然後
R_Start [4]=point[4]*M_Start[4][4];
R_Target[4]=point[4]*M_Target[4];
其中point[4]={0,0,0,1}
//point为1*4矩阵[0,0,0,1]
//这部分助教的Source code中的main function的最後面有,可以参考看看,
最後我们要取的就是
R_Target[4]-R_Start[4]的前三码,也就是最後的答案。
/*请记得加上0.000000001,不然会出现-0.00喔!*/
助教已经把最新的Test2.exe档放上去了,请大家多多利用它吧!
(因为之前旧的Test.exe有些电脑不能用,像我的就是。
它对写这只钢弹的帮助可是非常大的喔!)
/*
(MSG1)指的是;
Error at line1: Left entry redefined.
Error at line1: Right entry redefined.
Error at line1: unknown identifier STRING(LR).
Warning at line2: multiple start point.
Warning at line2: multiple target point.
Error at line2: unknown identifier STRING(LR).
Error at line2: unknown identifier STRING(ST).
这七行的相关部分。
而(MSG2)指的是:
No start point!
No target point!
Invalid start point!
Invalid target point!
这四行的相关部分。
*/
最後,如果你觉得你的程式怎麽跑明明都正确,却拿不到分,
请检查看看你print出来的MSG部分有没有拼错,还有大小写正不正确喔!
---------------------------以上正题------------------------------
--------------------------废话又来了-----------------------------
呼呼!终於打完了!
难得PO一次文,有什麽不详尽或错的地方,请强者们多多指正!
我还不太会排版,排得不好让大家看得很累,请多多见谅。
是说一开始助教的测资Output部分Key错了,还一次四个,
所以传过的可以再传一次,说不定就多四分了唷!
测资部分据说挺善良的,没什麽太畸型的测资,所以不用像我一样
绞尽脑汁猜测资,多拿点正常测资跟助教的程式比对吧!
谢谢观赏!
-----------------------------------------------------------------
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.242.90
1F:推 jackwhitekim:第一个满分!! 是今天上助教课的同伴XD 11/19 00:26
2F:推 martinku:推原PO是暗黑神手 11/19 00:27
3F:推 humanlin:原po高手 11/19 00:29
4F:→ maxcsh:哪有= =,比较疯狂而已,缠着助教缠到他们发现测资错误XD 11/19 00:30
5F:推 sn6783:原PO,神人也 11/19 00:37
6F:推 dennis2030:推原PO是头香强者! 有这篇帮助太棒了! 11/19 00:40
7F:推 jimmyken793:有强者快拜 11/19 00:51
8F:推 purplebleed:可以说一下哪几个错吗XD~~有怪怪的事情发生了~~ 11/19 01:04
9F:→ maxcsh:本来是1,2,3,10错啊,现在都修正了 11/19 01:05
10F:→ maxcsh:不过有被测资害到的应该只有我吧= =,多卡了一个半小时 11/19 01:13
11F:→ maxcsh:多补充一点东西,各位看看吧! 11/19 17:14
※ 编辑: maxcsh 来自: 140.112.242.90 (11/19 17:33)
12F:推 dennis2030:太专业了 补充过後又变得更强大了!! 11/19 17:33
13F:推 benck: 原PO是隐.强者 11/19 22:26
14F:推 fereshte: 原PO是隐.强者 11/19 22:48
15F:→ maxcsh:其实楼上两位才是真正的强者啊= =(修掉XD) 11/19 23:05
16F:推 chenaren:欸 那我的也要修(通通修掉XD) 11/19 23:40
※ 编辑: maxcsh 来自: 140.112.242.90 (11/19 23:43)
17F:推 purplebleed:有人可以提示一下4&&14的状况吗??(卡题了= =) 11/20 00:20
18F:→ maxcsh:Left 5 Right 5\ Start Left 5 Start Left 4 Target Left 3 11/20 00:33
19F:推 purplebleed:呵呵~~这种情形你早上跟我说过了XD 11/20 00:36
20F:→ maxcsh:哪有,不一样喔,拿去跑助教程式试试,会有warning, 11/20 00:37
21F:→ maxcsh:但还是要丢link code(那一串数字)进去喔! 11/20 00:38
※ 编辑: maxcsh 来自: 140.112.242.90 (11/20 00:40)
22F:推 purplebleed:哭~~~还是不给我过~~测资好阴= =||| <-标准耍无赖XXD 11/20 01:08
23F:推 purplebleed:喔YA~AC了!原来是1e-9~跟使徒三一样= =~~要记得呦 11/20 01:16
24F:→ purplebleed:花了好多时间呦= =~都在找白痴错误?(其实是我太笨了) 11/20 01:17
25F:→ maxcsh:啊我忘记讲了= =,我以为大家被唬过几次之後会自动加上去的 11/20 01:23
26F:→ maxcsh:很抱歉,补上了。 11/20 01:23
※ 编辑: maxcsh 来自: 140.112.242.90 (11/20 01:33)
27F:推 godgunman:欸欸你忘记感谢我啦XD 11/20 02:37
28F:→ maxcsh:感谢楼上在我不能用sscanf的时候教我用for loop切开XD 11/20 02:43
29F:推 purplebleed:呵呵~~楼上两位都是好人耶~~太感谢了XXD 11/20 09:34
30F:推 LoganChien:第 14 除了 1e-9 好像有和 13 一样的陷阱。(供参考) 11/20 18:34
31F:→ LoganChien:还有,我不太喜欢这一题的题目「说明」,太模糊了... 11/20 18:35
32F:→ LoganChien:还要从 test.exe/test2.exe 去猜题意...。 11/20 18:36
33F:推 LoganChien:有一些状况(不违反说明),也可以把 test.exe 玩坏。 11/20 18:40
34F:推 chenaren:我看不懂题目耶 @@ 11/20 19:11
35F:→ ewan7954:4*4矩阵目的==>旋转需要3*3 平移需要3*1 11/20 20:21
36F:→ ewan7954:所以为了使用上方便 将两个合并成4*4 11/20 20:22
37F:→ ewan7954:所以最下面那一行没用到 乘出来才变成 X Y Z 1 11/20 20:24
38F:→ ewan7954:今天助教课问的XD 11/20 20:31
39F:推 martinku:卡13、14呢...我有修正浮点数了说@@ 11/20 21:38
40F:推 LoganChien:楼上,你的 Warning 有问题 11/20 21:48
41F:推 LoganChien: 更正:MSG 11/20 22:04
42F:推 AfrikaBoi:请问测资4跟5还是字串的部分吗? 卡住了 :-( 11/22 01:29
43F:推 purplebleed:是矩阵运算~~~ 11/22 22:02
44F:推 AfrikaBoi:阿 OK 谢谢! 11/23 02:24
※ 编辑: maxcsh 来自: 140.112.242.90 (11/23 16:53)
45F:推 sn6783:感谢强者提醒~~ 我把0.000000001加上去之後马上多一分XD 11/23 16:58
46F:推 qq123789:请问 Left 0 Left 1 Left 1 算重复几次啊 总觉得答案有错 11/23 17:57
47F:推 qq123789:个人认为是一次 助教的 test2 档 是print 两次 11/23 18:00
48F:→ maxcsh:两次,接到Left 0的时候Left就已经被define了,所以是两次 11/23 18:08
49F:推 qq123789:了解 谢谢啦:) 11/23 18:10
50F:→ maxcsh:小提醒,矩阵做乘法前可能有需要改成单位矩阵, 11/23 18:12
51F:→ maxcsh:还有做乘法暂存的矩阵要记得归零喔! 11/23 18:12
52F:推 AfrikaBoi:卡11and13的人!第二行有复数欧! 11/24 14:03
53F:推 lch16:帮楼上更正一下..... 有负数 11/24 22:14
54F:推 rppo888:有复数也太惊悚....XDD 11/24 23:43