北京交通大学c语言复习题讲解

上传人:第*** 文档编号:71696936 上传时间:2019-01-21 格式:PPT 页数:48 大小:992.50KB
返回 下载 相关 举报
北京交通大学c语言复习题讲解_第1页
第1页 / 共48页
北京交通大学c语言复习题讲解_第2页
第2页 / 共48页
北京交通大学c语言复习题讲解_第3页
第3页 / 共48页
北京交通大学c语言复习题讲解_第4页
第4页 / 共48页
北京交通大学c语言复习题讲解_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《北京交通大学c语言复习题讲解》由会员分享,可在线阅读,更多相关《北京交通大学c语言复习题讲解(48页珍藏版)》请在金锄头文库上搜索。

1、1,开卷有益!,高级语言程序设计,主讲教师:丁丁 计算机与信息技术学院 ,3,复习之:运算符和表达式,算术运算符和表达式 关系运算符和表达式 逻辑运算符和表达式 条件运算符和表达式 赋值运算符和表达式 逗号运算符和表达式,4,5,复习之:选择语句,if语句 if-else语句 if-else if语句 switch开关语句,6,复习之:循环语句,循环的常用机制:自增、自减运算符 三种循环结构语句 while语句 do-while语句 for语句 break和continue语句 循环的嵌套,循环三要素?,7,课堂练习1,判断一个3位以内的数是几位数,并分别正序和逆序输出该数。,8,课堂练习二,

2、1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 2 1 1 2 1 1,写程序输出下例图案,9,课堂练习三,用while, do-while及for语句实现求n!的程序,其中n的阶乘用函数实现。 注意:考虑程序的完备性。,10,课堂练习四,写程序输入200以内的所有素数。考虑用函数实现。,11,第四章 基本程序设计技术,12,学习程序设计需要注意规律性的东西。 三种流程模式是重要总结。,本节主要内容: 循环程序设计进阶,顺序模式最简单 选择模式:要确定判断条件及不同情况下的动作 难点是实现重复执行的循环。,2019/1/21,高级语言程序设计,13,主要内容:基本程

3、序设计技术,4.1 循环程序设计 4.2 循环中的问题 4.3 循环与递归 4.4 基本输入输出 4.5 程序设计实例 4.6 程序测试和排错,14,什么样的问题用循环解决?有重复动作,一批类似数据做同样加工处理 累积一批可按规律算出的数据(累加等) 反复从一个结果算出下一结果(递推),若重复次数很多,就应该考虑用循环 如果重复次数无法确定,就必须用循环描述,15,例:求13到315所有数的平方根之和。,可以一个个地加,但更方便的方法是写循环。 需要一个变量保存部分和,逐步把各平方根加上去; 需要一个变量保存变动轨迹,从初值开始每次修改。,for(sum = 0.0, n = 13; n =

4、315; +n) sum += sqrt(n);,for(sum = 0.0, n = 315; n = 13; -n) sum += sqrt(n);,典型for循环。假定已有总和变量sum和循环变量n:,向上循环,向下循环,循环变量,累积变量,基本的循环方式有两种:向上循环和向下循环,16,while语句重写上例,double sum; int n; Sum = 0.0; n = 13; while (n = 315) sum += sqrt(n); +n; ,17,注意:一般不用浮点数控制循环,尤其是增量为小数或包含小数时。,例:求从0到100每隔0.2的数的平方根之和: double

5、sum, x; for (sum=0.0, x=0.2; x=100.0; x+=0.2) sum += sqrt(x); 由于浮点计算误差,不能保证循环500次。,应写:,int n; double sum; for (sum = 0.0, n = 1; n = 500; +n) sum += sqrt(0.2*n);,循环次数可控,18,例1:打印出 1 到 200 间的完全平方数。,方法一:逐个检查,遇平方数打印。循环框架: for (n = 1; n = 200; n+) if (n是完全平方数) 打印 n;,n 是完全平方数判断: m可以从1开始,递增,直至m*m大于n: for (

6、m = 1; m * m = n; m+) if (m * m = n) 打印 n;,19,共循环了多少次?,完整程序1:一层for循环(利用自定义函数) #include int sq(int n) int m,f=0; for (m = 1; m * m = n; m+) if (m * m = n) f=1; return f; int main() int m, n; for(n=1; n = 200; n+) if(sq(n) printf(“%d “, n); printf(“n“); return 0; ,函数定义,函数调用,20,完整程序2:两重for循环(只有主函数) #in

7、clude int main() int m, n; for(n=1; n = 200; n+) for (m = 1; m * m = n; m+) if (m * m = n) printf(“%d “, n); printf(“n“); return 0; ,内层循环结束的两种情况: 1,找到m使m*m=n(n是完全平方数) 2,试探了所有可能,但都不成功(n不是),共循环了多少次?,21,具有累计循环次数功能的完整程序: #include int main () int m, n, count = 0; for (n = 1; n = 200; n+) for (m = 1; m *

8、m = n; m+) count+; if (m * m = n) printf(“%d “, n); printf(“%dn“, count); return 0; ,共循环了1799次,22,方法二:需要打印的一定是从1开始连续几个整数的平方,可从1开始打印到平方大于200为止。 for (n = 1; n * n = 200; +n) printf(“%d “, n * n); /*注意打印什么*/,方法一产生所有备选数据(1到200的整数),检查排除不合格的。生成与检查是解决问题的常用方法。 方法二是针对具体问题的特定方法。,23,#include int main() int ter

9、mn, n; for (n = 1,termn = 1;termn = 200; n+) printf(“%4d“,termn); termn += 2*n+1; return 0; ,方法三:还可以考虑利用递推公式求平方数程序:,24,例2,艰难旅程(浮点误差)。乌龟要去环球。第1秒爬1米,第2秒爬1/2米,第3秒爬1/3米,第4秒爬1/4米,。问一小时能爬出多远?爬20米需多少秒?,一小时能爬多远算法: 1.d(距离,实数); s(时间,整数); 2. d=0.0;s=1; 3. d=d+1/(实数)s; s=s+1; 4.如果s=3600,转3; 5.否则,输出d;,爬20m需多少秒算法

10、: d(距离,实数); s(时间,整数); d=0.0,s=1; d=d+1/(实数)s;s=s+1; 如果d20.0,转3; 否则,输出s-1;,根据数学,乌龟能完成环球,可以爬得任意远。 这里想比较float和double的计算误差情况。,s-1?,25,n秒能爬x米的函数float distfun(long n) float distfun(long n) long i; float x = 0.0; for (i = 1; i = n; +i) x += 1/(float)i; return x; ,例2,艰难旅程(浮点误差)。乌龟要去环球。第1秒爬1米,第2秒爬1/2米,第3秒爬1/

11、3米,第4秒爬1/4米,。问一小时能爬出多远?爬20米需多少秒?,26,例2,艰难旅程(浮点误差)。乌龟要去环球。第1秒爬1米,第2秒爬1/2米,第3秒爬1/3米,第4秒爬1/4米,。问一小时能爬出多远?爬20米需多少秒?,20米需要多少时间。写出下面函数: long scndsfun(float d) /*d为爬行距离*/ long i; float x = 0.0; for (i = 1; x d; +i) x += 1/(float)i; return i - 1; ,d=20,27,写下面语句,执行时总也不输出: printf(“%lds, %fmn“,scndsfun(20.),20

12、.);,修改为如下语句: for (x = 10.0; x = 20.0; x += 1.0) printf(“%lds, %fmn“,scndsfun(x),x);,原因?,程序输出: 12367s, 10.000000m 33617s, 11.000000m 91328s, 12.000000m 248695s, 13.000000m 662167s, 14.000000m 1673859s, 15.000000m 而后又没反应了。,28,void test_float () long i; float sum = 0.0, sum0 = -1.0; for (i = 1; sum !=

13、sum0; +i) sum0 = sum; sum += 1 / (float)i; printf (“float: %ld terms at %fn“, i-1, sum); ,对乌龟活动的模拟受到数据表示精度和范围的限制。,考虑如下的测试函数:,程序很快就输出了一行: float: 2097152 terms at 15.403683,Float精度限制,差值无法测试到,29,用double改写程序,20亿秒时和还增长,输出: 2000000000s, 21.993629m 经过大约63年半,乌龟爬了近22米。 在大约2亿5千万秒(约8年)爬过了20米。,特殊情况中浮点误差积累可能更迅速。

14、两个重要情况: 1)将一批小的数加到很大的数上,会导致丢掉小的数的重要部分,甚至小数整个被丢掉; 2)两个值接近的数相减,可能导致精度大大下降,30,#include/*Test Program*/ int main() int i; float sumf=0.0; double sumd=0.0; for (i=1;i=2000000;+i) sumf+=1/(float)i;sumd+=1/(double)i; printf(“float:%dsterms at %14.10fn“,i-1,sumf); printf(“double:%ds terms at %14.10fn“,i-1,s

15、umd); return 1; ,float: 2000000 terms at 15.3110322952 double: 2000000 terms at 15.0858736543,float和long double类型应用在特殊场合,31,例3:求x立方根的迭代公式: 写函数求立方根,要求: 函数取名cbrt,特征:double cbrt(double x),无法确定循环次数,方便用while循环。 按题目给出循环条件,思想:求新迭代值要用到x。判断终止需要先后两个近似值,必须用两个变量,这可看作是两个合作的迭代变量。,32,函数定义: double cbrt(double x) do

16、uble x1, x2; if (x = 0.0) return 0.0; /*特殊情况*/ x1 = x; x2 = (2.0*x1 + x / (x1*x1) / 3.0; while (fabs(x2 - x1) / x1) = 1E-6) x1 = x2; x2 = (2.0*x1 + x / (x1*x1) / 3.0; return x2; ,程序的一个缺点是同一表达式写了两次。,调用语句: y=cbrt(200);或 x=200;y=cbrt(x);,33,do-while没有for和while语句用得多。,用do-while结构重写求立方根函数: double cbrt(double x) double x1, x2 = x; if (x = 0.0) return 0.0; /*处理特殊情况*/ do x1 = x2; x2 = (2.0*

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号