数学建模社区-数学中国

标题: 极限测试之Matlab与Forcal的错误(异常)处理 [打印本页]

作者: forcal    时间: 2011-8-2 18:11
标题: 极限测试之Matlab与Forcal的错误(异常)处理
这里谈不上是极限测试了,只是还借用这个名称。: ]+ b+ w2 G4 ~* k$ V5 g
% u) m; v# [! Q* S9 }
我们将通过错误处理检测经过多少次运行某个程序才能运行成功,即:通常程序运行时会出现运行错误,我们要测试一下程序运行多少次才能成功一次。5 s' ?7 N1 p; ^
7 o  u" D- X7 k' V# T
在这个例子中,函数what(n,k)是这样设计的:n为大于1的整数,k为大于1的系数。生成一个长度为n的0~1之间均匀分布的随机数数组a,设m=n*k, mm=n*(k-1)/2,尝试取数组a的每一个元素a[a(i)*m-mm],其中a(i)*m-mm是元素的下标。这样,若元素下标有效,则取值成功,否则将产生一个运行错误。
4 i4 e/ u) N7 X9 M: `0 r6 j9 v; `  T9 g& P, n
例如:n=10, k=1.1,则m=11, mm=0.5,设生成的随机数如下:
  B, D# }1 h% Y- J+ v1 U+ Y; [0.2, 0.05, 0.97, 0.8, 0.5, 0.7, 0.6, 0.4, 0.3, 0.6
8 Q3 v& d0 ]1 ?4 n1 x1 n* K第1个数0.2的计算下标为:a(i)*m-mm=0.2*11-0.5=1.7,下标取整后为1,则这个下标是有效的;; B7 q6 h; a! k* Q" e4 L
第2个数0.05的计算下标为:a(i)*m-mm=0.05*11-0.5=0.05,下标取整后为0,则这个下标是有效的;
. f3 W5 m0 o% q$ b/ Q( S' p. p第3个数0.97的计算下标为:a(i)*m-mm=0.97*11-0.5=10.17,下标取整后为10,则这个下标是无效的;
- h" O% U8 W& V( [3 A1 h以此类推。
" s! p2 b! V5 [7 A1 [% f. a: P" v: _/ u! I5 t1 H
主函数main中有一个循环,不断执行what[100,1.1],然后检测运行错误,若出现运行错误且出错函数名为math:get,说明是函数what()中的元素下标出错,则清除运行错误,继续循环,直至函数what()运行成功,或者出现非math:get给出的运行错误(例如,用户终止程序运行产生的运行错误),变量i统计运行了多少次才成功了一次。' l/ W5 U" s, l
+ c" r. z( H, g# }; N
Forcal程序:
  1. !using["math","string"];
    , J4 s/ P2 c, @% G4 o1 P
  2. what(n,k:a,i,m,mm)=
      k( x" o- m: x" ?. z( c
  3.   oo{a = rand(n,1).reshape()}, m=n*k, mm=n*(k-1)/2,0 r# y% O) j) P) n' N  D- E
  4.   i=0, while{i<n, a[a(i)*m-mm], i++};9 r, z; n/ q$ V2 ^  V! R5 k( [1 Z2 A
  5. ) j/ q5 m9 V$ m, Q
  6. main(:i,ErrType,FunName,FunNameLen)=" A# V8 r  r- a  y5 w$ F! f" c0 ^
  7.   FunName="\[80]", FunNameLen=80,
    4 _: I* f/ r: |  l) L& ^& G
  8.   i=0,
    8 b6 _5 u0 i% ^  Q* [' v8 T
  9.   while{1,
    # _" V# j4 z2 e& U& F! u9 Y
  10.     i++,
    # G6 h. ^" ]  S
  11.     what[100,1.1],          //这个函数运行时可能返回运行错误4 K- X  _. L  q  m0 X
  12.     geterr(&ErrType,FunName,FunNameLen,0,0,0),  //获取Forcal运行错误
    1 a9 H. |7 d* I5 y! A# v5 Q
  13.     if{!ErrType, break()},  //what正常运行,退出
    : ^5 P) s: y9 F0 D$ M, i' s9 p5 k
  14.     oo{if{wcscmp[ws(FunName),ws("math::oget")], break()}},  //不是函数math::oget给出的运行错误,退出9 E# T4 K6 u# s
  15.     clearerr()              //清除Forcal运行错误
    $ ^7 z4 h5 f; X9 |  m
  16.   },
    + Q0 p( E8 L5 Z/ s) n
  17.   i;
复制代码
多次运行,一些可能的结果如下:
9 b9 W* Y/ H9 n* p3 u1518.- c& E( u, F0 f' [& S
448.
: f$ Y6 p  w) ]& Z: I1518.
( K/ K5 i. @3 q; [( q448.: j' m0 G( Q& O$ k8 h( p
4795., Y; a; A5 L( g1 L: Z4 f- `
448.0 q( u+ {) @; n. V/ Y, i' m4 S5 R
1518.9 H  L3 D2 q1 s% D, I; H, A) z
448.
: f* l7 P% a8 ]; J5 B1518.* U7 m  c$ w& u0 P
3725.
" B% E! z+ F- H4 ~% f% j  {1518.
8 M# C% U1 A4 ]# u" N- j448.
8 a0 m  u$ u4 X! k* T
2 _0 n% _0 s! q0 w. y对matlab的异常处理不熟悉,哪位朋友有兴趣给出此例的matlab版本?谢谢!
作者: 刘石秀    时间: 2012-1-10 22:31
新手帮忙顶一下
作者: alair005    时间: 2012-2-7 12:36
看看,肯定能学到不少东西~!~!~@!~!~!~!~380801145722368




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5