北京交通大学C语言课件复习题讲解_第1页
北京交通大学C语言课件复习题讲解_第2页
北京交通大学C语言课件复习题讲解_第3页
北京交通大学C语言课件复习题讲解_第4页
北京交通大学C语言课件复习题讲解_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 开卷有益!开卷有益! 高级语言程序设计高级语言程序设计 主讲教师:丁丁主讲教师:丁丁 计算机与信息技术学院计算机与信息技术学院 3 复习之:运算符和表达式复习之:运算符和表达式 n算术运算符和表达式算术运算符和表达式 n关系运算符和表达式关系运算符和表达式 n逻辑运算符和表达式逻辑运算符和表达式 n条件运算符和表达式条件运算符和表达式 n赋值运算符和表达式赋值运算符和表达式 n逗号运算符和表达式逗号运算符和表达式 4 运算符运算符解释解释同级结合方式同级结合方式 算术运算算术运算()括号括号由左向右由左向右 逻辑运算逻辑运算 算术运算算术运算 ! + - - + - (类型类型) size

2、of 逻辑非,增减量逻辑非,增减量 一元正负一元正负 强制类型转换强制类型转换 由右向左由右向左 * / %乘,除,取模乘,除,取模由左向右由左向右 + -二元加减二元加减由左向右由左向右 关系运算关系运算 = 逻辑与逻辑与由左向右由左向右 = !=逻辑或逻辑或由左向右由左向右 逻辑运算逻辑运算 n = 13; -n) sum += sqrt(n); 典型典型for循环。假定已有总和变量循环。假定已有总和变量sum和循环变量和循环变量n: 向上循环向上循环 向下循环向下循环 循环变量循环变量 累积变量累积变量 基本的循环方式有两种:向上循环和向下循环基本的循环方式有两种:向上循环和向下循环 1

3、6 while语句重写上例语句重写上例 double sum; int n; Sum = 0.0; n = 13; while (n = 315) sum += sqrt(n); +n; 17 注意注意:一般不用浮点数控制循环一般不用浮点数控制循环,尤其是增量为小数或,尤其是增量为小数或 包含小数时。包含小数时。 例:求从例:求从0到到100每隔每隔0.2的数的平方根之和:的数的平方根之和: double sum, x; for (sum=0.0, x=0.2; x=100.0; x+=0.2) sum += sqrt(x); 由于浮点计算误差,不能保证循环由于浮点计算误差,不能保证循环500

4、次。次。 应写:应写: 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 (m = 1;

5、 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

6、 完整程序完整程序2:两重:两重for循环(只有主函数)循环(只有主函数) #include 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 具有累计循环次数功能的完整程序:

7、具有累计循环次数功能的完整程序: #include int main () int m, n, count = 0; for (n = 1; n = 200; n+) for (m = 1; m * 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 *

8、 n = 200; +n) printf(%d , n * n); /*注意打印什么注意打印什么*/ 方法一产生所有备选数据(方法一产生所有备选数据(1到到200的整数),检查排的整数),检查排 除不合格的。除不合格的。生成与检查生成与检查是解决问题的常用方法。是解决问题的常用方法。 方法二是针对具体问题的特定方法。方法二是针对具体问题的特定方法。 23 #include int main() int termn, n; for (n = 1,termn = 1;termn = 200; n+) printf(%4d,termn); termn += 2*n+1; return 0; 方法三方

9、法三:还可以考虑利用递推公式求平方数程序:还可以考虑利用递推公式求平方数程序: 12 1 1 1 n nn 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;

10、5.否则否则,输出输出d; 爬爬20m需多少秒算法需多少秒算法: 1. d(距离距离,实数实数); s(时间时间,整数整数); 2. d=0.0,s=1; 3. d=d+1/(实数实数)s;s=s+1; 4. 如果如果d20.0,转转3; 5. 否则否则,输出输出s-1; 根据数学,乌龟能完成环球,可以爬得任意远。根据数学,乌龟能完成环球,可以爬得任意远。 这里想比较这里想比较float和和double的计算误差情况的计算误差情况。 s-1? 25 n秒能爬秒能爬x米的函数米的函数float distfun(long n) float distfun(long n) long i; float

11、 x = 0.0; for (i = 1; i = n; +i) x += 1/(float)i; return x; 例例2,艰难旅程(浮点误差)。乌龟要去环球。第,艰难旅程(浮点误差)。乌龟要去环球。第1秒爬秒爬1米,米, 第第2秒爬秒爬1/2米,第米,第3秒爬秒爬1/3米,第米,第4秒爬秒爬1/4米,米,。问一小时。问一小时 能爬出多远?爬能爬出多远?爬20米需多少秒?米需多少秒? 26 例例2,艰难旅程(浮点误差)。乌龟要去环球。第,艰难旅程(浮点误差)。乌龟要去环球。第1秒爬秒爬1米,第米,第 2秒爬秒爬1/2米,第米,第3秒爬秒爬1/3米,第米,第4秒爬秒爬1/4米,米,。问一小时

12、能爬。问一小时能爬 出多远?爬出多远?爬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.); 修改为如下语句修改为如下语句: for (x = 10.0; x = 20.0;

13、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 != sum0; +i) sum0 = sum; su

14、m += 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年半,

15、乌龟爬了近年半,乌龟爬了近22米。米。 在大约在大约2亿亿5千万秒(约千万秒(约8年)爬过了年)爬过了20米。米。 特殊情况中浮点误差积累可能更迅速。两个重要情况:特殊情况中浮点误差积累可能更迅速。两个重要情况: 1)将一批小的数加到很大的数上,会导致丢掉小的数)将一批小的数加到很大的数上,会导致丢掉小的数 的重要部分,甚至小数整个被丢掉的重要部分,甚至小数整个被丢掉; 2)两个值接近的数相减,可能导致精度大大下降)两个值接近的数相减,可能导致精度大大下降 30 #include/*Test Program*/ int main() int i; float sumf=0.0; double

16、sumd=0.0; for (i=1;i= 1E-6) x1 = x2; x2 = (2.0*x1 + x / (x1*x1) / 3.0; return x2; n程序的一个缺点是同一表达式写了两次。程序的一个缺点是同一表达式写了两次。 调用语句调用语句: 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; /

17、*处理特殊情况处理特殊情况*/ do x1 = x2; x2 = (2.0*x1 + x / (x1*x1) / 3.0; while (fabs(x2 - x1) / x1) = 1E-6); return x2; 34 循环中的递推变量:循环中的递推变量: 对变量对变量x1、x2、x3,循环体可能有序列:,循环体可能有序列: x1 = x2; x2 = x3; x3 = . x1 . x2 .; 例如上面例如上面cbrt里的变量里的变量x1和和x2。 35 例例4:定义函数,利用公式:定义函数,利用公式 求求 近似值。设为近似值。设为double dsin(double x)。 sin()

18、 ()! x x n n n n 1 21 21 0 sinx sum = 0.0; 对对n为为0计算计算t; while (需要继续需要继续) sum = sum + t; 计算下一个计算下一个t; 循环结束条件:循环结束条件: 例如用项绝对值小例如用项绝对值小 于于 。 10 6 方法:循环累加,方法:循环累加,n 趋向无穷的过程中趋向无穷的过程中项值趋于项值趋于0,而,而 累加值趋向函数值累加值趋向函数值。保存累加和的变量。保存累加和的变量sum ,循环中,循环中 求出的项值用求出的项值用 t 保存。保存。 36 问题:问题:t 的值如何计算?的值如何计算? p第一个第一个 t就是就是

19、x; p分析可以发现项值的递推公式:分析可以发现项值的递推公式: ttxnn nn 1 2 221/ () double dsin(double x) double s=0.0, t=x; int n=0; /*n=0,t=x*/ while (t=1E-6|t=-1E-6) s+=t; n=n+1; t=-t*x*x/(2*n)/(2*n+1); return s; Sin(x)=x-x3/3!+x5/5!-x7/7!+. 2021-6-22高级高级语言程序设计语言程序设计37 主要内容:主要内容:基本程序设计技术基本程序设计技术 n4.1 循环程序设计循环程序设计 n4.2 循环中的问题循

20、环中的问题 n4.3 循环与递归循环与递归 n4.4 基本输入输出基本输入输出 n4.5 程序设计实例程序设计实例 n4.6 程序测试和排错程序测试和排错 1 从循环中退出从循环中退出 2021-6-22高级高级语言程序设计语言程序设计38 有时需要从正在执行的循环中退出。有时需要从正在执行的循环中退出。 例例 :写函数判断一个整数是否为素数(谓词)。写函数判断一个整数是否为素数(谓词)。 类型特征可用类型特征可用 int isprime(int),返回,返回0/1值值 n是素数的条件是素数的条件:n不能被不能被2到到(int)sqrt(n)之间之间 的任意一个整数整除的任意一个整数整除.(只

21、要有一个能整除就不是只要有一个能整除就不是) 2021-6-22高级高级语言程序设计语言程序设计39 int isprime (int n) /* n是否素数是否素数 */ int m = 2; for ( ; m * m = n; m+) if (n % m = 0) return 0; return 1; /* 没有因子,是素数没有因子,是素数 */ m=(int)sqrt(n) 函数不完善,函数不完善, 对对1给出给出“是素数是素数” ,负数也会给出不合理结果。,负数也会给出不合理结果。 应该在循环前处理特殊情况:应该在循环前处理特殊情况: if (n = 1) return 0; *写

22、程序时应考虑全面。写程序时应考虑全面。 40 对对6200的各偶数验证哥德巴赫猜想,利用的各偶数验证哥德巴赫猜想,利用isprime: for(n = 6; n = 200; n = n+2) for(m = 3; m = n/2; m = m+2) if(isprime(m) 问题问题:有多种分解时将产生多对输出。如对:有多种分解时将产生多对输出。如对10: 10=3+7 10=5+5 哥德巴赫猜想哥德巴赫猜想? 大于等于大于等于6的偶数可以分解为两个素数之和。的偶数可以分解为两个素数之和。 41 要求要求:希望每个偶数只输出一对,然后去判断下一数:希望每个偶数只输出一对,然后去判断下一数

23、for(n = 6; n = 200; n = n+2) for(found=0, m=3; m=n/2 m = m+2) if(isprime(m) found = 1; C语言引进了专门的控制语句语言引进了专门的控制语句 方法方法1:引入整型变量引入整型变量found,值,值0表示未发现素数对。表示未发现素数对。 发现时将发现时将found赋赋1。内循环开始时。内循环开始时found置置0。 修改后循环是:修改后循环是: 42 方法方法2: 利用利用break语句强制退出内循环。语句强制退出内循环。 修改后程序:修改后程序: for (n = 6; n = 200; n = n+2) fo

24、r (m = 3; m = 1E-6) x1 = x2; x2 = (2.0*x1 + x / (x1*x1) / 3.0; return x2; 例例 利用利用break重写前面求立方根的函数:重写前面求立方根的函数: 44 double cbrt (double x) double x1, x2 = x; if (x = 0.0) return 0.0; while (1) x1 = x2; x2 = (2.0*x1 + x / (x1*x1) / 3.0; if (fabs(x2-x1)/x1) 1E-6) break; return x2; *也可以在也可以在 break 处直接写处直接写 return x2。 X2只写一次只写一次 do-while 例例 利用利用break重写前面求立方根的函数:重写前面求立方根的函数: 45 循环中常出现几类变量,注意这些

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论