测绘程序设计基础(VC++net)第三章 C++控制语句.ppt
文本预览下载声明
3.4.3判断平面上两线段是否相交 对于向量(x1,y1)-(x2,y2),判断点(x3,y3)在向量的左边、右边、还是线上。计算 (x2,y2)-(x3,y3)与(x1,y1)-(x3,y3)的叉积,即: d=x1(y3-y2)+x2(y1-y3)+x3(y2-y1) 则:d0 左侧、d=0 线上、 d0 右侧 (x1,y1) (x2,y2) (x3,y3) 若 P × Q 0 , 则P在Q的顺时针方向。 若 P × Q 0 , 则P在Q的逆时针方向。 若 P × Q = 0 , 则P与Q共线,但可能同向也可能反向。 判断两线段是否相交经典方法:跨立试验法,即如果一条线段跨过另一条线段,则线段的两个端点分别在另一条线段的两侧。但是,还需要检测边界情况,即两条线段中可能某条线段的某个端点正好落在另一条线段上。 计算一线段的两个端点在另一线段的方向d1,d2,d3,d4 相交 d1*d20且 d3*d40 检测端点是否在线段上 * * 该例实际用IF语句更简洁明了 * * * * * * * * * 为了程序简洁,角度换算应用写成函数形式。带函数这一章讲完后,应该重写这些代码 * * * * * * * * 源程序如下: { int i=1,sum=0;//循环初始条件 while(i=4) { sum+=i; i++; //修改循环条件 } ok while 语句 注意: 在有循环语句的程序中,通常循环开始前对循环条件进行初始化;而在循环体语句中要包含修改循环条件的语句,否则循环将不能终止而陷入死循环。 C++表达方式灵活,上例中的循环语句还可以写成: while (i=n) sum+=i++; 或者 while (sum+=i++, i=n) ;//循环体为空语句 修改程序后在VC++平台上运行,看是否正确 为了程序的可读性,一般不提倡这种过于灵活的方式 3.2.2 do-while 语句 do-while语句称为直到循环, 格式为: do 循环体语句 while( 表达式 ) 否 是 表达式的 值为真? 执行循环体语句 求表达式的值 图3.2 do-while语句的执行流程图 do-while 语句 do/while语句和while语句的区别: 多数情况下可以互相替代。 区别是do/while语句至少执行一次循环体后再判断循环条件是否满足; while语句先判断条件是否满足,然后才执行循环体。 【例3.3】 用迭代法求a的平方根近似值。求平方根的迭代公式为: 要求前后两个迭代根之差小于10- 5。 do-while 语句 迭代法求解:a是已知正数,x 0是迭代初值,给x 0一个值,假定 x 0 = a/2;则用迭代公式依次计算: x1=(x0+a/x0)/2;x2=(x1+a/x1)/2;…… xk+1=(xk+a/xk)/2; 当|xk+1 –xk|ε(ε是一个较小的正数)时,迭代终止,取xk+1的值为a的平方根近似值。 1、输入a(a0)及较小正数delta(也可用常变量); 2、x 0 = a/2; 用迭代公式算 x1=(x0+a/x0)/2; 3、while(|x1 –x0|=delta) { x 0 = x 1 ;//把最近的值给x 0 ; x1=(x0+a/x0)/2; } //求xk+1时只需要知道xk的值,所以只需2个变量; 4、取x1的值为a的平方根近似值,输出。 2、3步骤很适合用do/while语句实现: x 1 = a/2; do{ x0=x1; x1=(x0+a/x0)/2; } while(|x1 –x0|=delta); 和迭代法对应的程序算法是递推算法: #includemath.h { float x0,x1,a; if(a0) MessageBox(_T(“不能开平方!”)); else { //有实数解的情况 x1=a/2; //x1用于保存结果 do{ x0=x1; x1=(x0+a/x0)/2; } while (fabs(x1-x0)=1e-5); } } 在VC++平台上运行,输入2,3,4,5试一试是否正确 3.2.3 for语句 for循环语句的格式为: for ( 表达式1; 表达式2; 表达式3 ) 循环体语句 图3.3 for语句的执行流程图 否 是 求表达式1的值 求表达式2的值 表达式2值为真? 执行循
显示全部