c语言程序设计12上半部分习题课动态跟踪调试.ppt

上传人:max****ui 文档编号:2015760 上传时间:2019-11-13 格式:PPT 页数:100 大小:1.91MB
返回 下载 相关 举报
c语言程序设计12上半部分习题课动态跟踪调试.ppt_第1页
第1页 / 共100页
c语言程序设计12上半部分习题课动态跟踪调试.ppt_第2页
第2页 / 共100页
c语言程序设计12上半部分习题课动态跟踪调试.ppt_第3页
第3页 / 共100页
点击查看更多>>
资源描述
“编程能力”不是听会的、也不是看会的、而是动手动脑练会的!,高级语言程序设计 上半部分习题课,主讲教师:贾彩燕 计算机与信息技术学院 计算机科学与技术系 cyjia,课程内容,第一章 程序设计和C语言 第二章 数据对象与计算 第三章 变量、函数和控制结构 第四章 基本程序设计技术 第五章 C程序结构(函数) 第六章 数组 第七章 指针 第八章 文件和输入输出 第九章 结构和其它数据机制 第十章 程序开发技术 第十一章 标准库,重点,控制结构 顺序、选择、循环结构 函数 定义、声明及调用 从问题到程序的编程思想 程序的函数分解 模块化程序设计 基本的程序调试技能 静态调试、动态调试 黑箱测试、白箱测试,难点,循环 递归 基本输入、输出语句,程序数据结构算法,程序 程序规定了计算机执行的动作和动作的顺序。 算法: 解决问题的方法和步骤 算法的几个特性 有穷性 确定性无二义 可执行性 有0个或多个输入 有0个或多个输出,从问题到程序的程序设计思想也体现了算法的重要性,要点1:运算符及表达式?,已经学习哪几种运算符及表达式?优先级关系? 自增、自减运算符 算术运算符 关系运算符 逻辑运算符 位运算符 条件运算符 赋值运算符 逗号运算符,要点2:C语言的基本数据类型,C语言的基本数据类型有哪些? 什么是常量?如何定义? 什么是变量?如何定义? 变量的存贮类型有哪几种? auto, register, static, extern 变量从作用域的角度分哪几种? 全局变量、局部变量,要点3:条件if语句,条件if语句有几种形式? If else和switch开关语句的差别?,要点4:循环语句,循环语句有几种形式? 循环结构的三要素是什么? 如何从循环中跳出?,要点5:函数,如何定义函数? 函数声明的意义及原则? 如何调用函数? 参数传递和函数返回值过程中类型不匹配时的转换原则? 如何理解值参数?,要点6:基本输入输出语句,getchar() putchar() scanf() printf() 数的批量输入输出:基本输入输出循环结构,第二章习题讲解,1.指出下面的字符序列不是合法的标识符:,_abc x+- 3x1 Xf_1_4 Eoof_ A$*24 x_x_2 bg1 _ I am,2.手工计算下列表达式的值,1) 125 + 0125 2)0XAF 0XFA 3)24 * 3 / 5 + 6 4)36 + -(5 23) / 4 5)35 * 012 + 27 / 4 / 7 * (12 - 4),210,-75,20,40,350,3.在下列表达式的计算过程中,在哪些地方将发生类型转换,各是从什么类型转换到什么类型,表达式计算的结果是什么?,1) 3 * (2L + 4.5f) 012 + 44 2) 3* (int)sqrt(34) sin(6) * 5 + 0x2AF 3) cos(2.5f + 4) 6 * 27L + 1526 2.4L,第三章习题讲解,2.设a=1,b=2,c=3,则u的值为: u=a?b:c; u=(a=2)?b+a:c+a; 3.设a=1,b=2,c=0,则下列表达式的值为: a & ! (b | c) & !a) ! (a & b) | c? a | b : a & b & c ! (a+bc) & b=c*a-b,u=2,u=4,1,0,0,4.程序执行时将在哪些地方发生类型转换,程序打印的值是什么?,int f(int n, float m) return (m + n) / 4; int main() float y = 3; printf(“%dn”, f(y, y+1); return 0; ,1,8.定义函数 double tmax(double, double,double),返回三个数中的最大的。,double tmax(double x, double y, double z) double max = x; if (y max) max = y; if (z max) max = z; return max; ,10.四边形的边长为a,b,c,d及一对对角之各angel,求四边形的面积。,double QuaArea(double a, double b, double c, double d, double e) double s = (a+b+c+d)/2.; double area; area = sqrt(s-a)*(s-b)*(s-c)*(s-d)- a*b*c*d*cos(e)*cos(e); return area; ,有问题吗?,补充题1:用if语句写程序判断是否为闰年,int RuiNian( int year ) if ( year % 400 = 0 | year % 4 = 0 ,补充题2.求分段函数,#include int main() double x, y; printf(“please input xn“); scanf(“%lf“, ,有问题吗?,补充题3,给一个不多于3位的正整数,要 求出它是几位数; 分别输出每一位数字 按新逆序输出各位数字,例如原数为321,应输出123,算法思想: 设a是整数变量; 如果a999则输入错误 如果a=0并且a=10并且a=100并且a1000则输出a是百位数 个位数是a%10 十位数是a/10%10 百位数是a/100,#include /程序分析 int main () int x, a, b, c, d; scanf(“%d“, ,#include int GradeIf(int); int GradeSwitch(int); int main() int n; printf(“Input the mark from 0 to 99 n“); while (scanf(“%d“, ,补充题4.从键盘输入学生的考试成绩,利用计算机将学生的成绩划分等级并输。9099为A级,8089为B级,7079为C级,6069为D级,059为E级。,int GradeIf(int n) if(n99 | n=90) printf(“The grade is A!n“); else if(n=80) printf(“The grade is B!n“); else if(n=70) printf(“The grade is C!n“); else if(n=60) printf(“The grade is D!n“); else printf(“The grade is E!n“); return 0; ,int GradeSwitch(int n) if(n99 | n0) n=-1; else n=n/10; switch (n) case -1: printf(“Input error!n“);break; case 9:printf(“The grade is A!n“);break; case 8:printf(“The grade is B!n“);break; case 7:printf(“The grade is C!n“);break; case 6:printf(“The grade is D!n“);break; default:printf(“The grade is E!n“); return 0; ,14.求100以内正整数的立方和,long CubeSum (int n) long sum = 0; int i = 1; while (i = n) sum = sum + i*i*i; i+; return sum; ,15.写一个函数,取3个参数m,n,k输出m,m+k,m+2k,直至最后一个不大于n的数,void PrintNum (int m, int n, int k) while (m = n) printf (“%dn”, m); m = m + k; ,16.自定义函数double power(double x,int n),求出x的n次幂。,double Power (double x, int n) double exp = 1; while (n = 1) exp *= x; n-; return exp; ,22.写一个程序打印1至100之间的被6或7整除的数;修改这个程序使得它之打出被6或7之一整除的数。,int main () int i = 0; while (i = 100) if (i % 6 = 0 ,第四章习题讲解,4.写函数计算1!+2!+k!,long SumFactor(int n) int i = 1; long f = 1, sum = 0; while (i = n) f = f * i; sum = sum + f; i+; return sum; ,9.用公式编程求圆周率的近似值,#include #define PI 3.1415 double Pai(void) int n = 1; double sum = 0.0; while (fabs(PI-sqrt(6*sum) = 1e-4) sum = sum + 1.0 / (n * n); n+; printf(“The number of terms are %d.n“, n); return sqrt(6*sum); ,12.求利用公式反正弦函数的近似值,double asinh (double x) int i, n=10, sign=-1; double term, sum; term=x; sum=x; for(i=1;i=n;i+) term=term*x*x*(2*i-1)/(2*i); sum+=sign*term/(2*i+1)*(2*i-1); sign=-sign; return sum; ,14.辗转相减求最大公约数,int gcd(int m,int n) if (mn) return gcd(n,m); else if (m=n) return m; else return gcd(m-n,n); ,int gcd1(int m, int n) int r,t; if (m n) t=m;m=n;n=t; if (n = 0) return m; for (r = m-n; r != 0; r = m-n) m = n; n = r; if (m n) t=m;m=n;n=t; return n; ,16.求水仙花数,void method1(void) int i,j,k; for (i=1;i=9;i+) for (j=0;j=10;j+) for(k=0;k=10;k+) if(i*100+j*10+k=i*i*i+j*j*j+k*k*k) printf(“%d是水仙花数n“,i*100+j*10+k); ,void method2(void) int i,m,n,l; for (i=100;i=999;i+) m = i/100; n = i/10%10; l = i%10; if(i=m*m*m+n*n*n+l*l*l) printf(“%d是水仙花数n“,i); ,19.写程序读入一系列数,求最大数和次大数。,int tmax(void) int n, m, max1, max2; printf(“Please input some integers.n“); scanf(“%d%d“, ,21.求折线段的面积,double FigureArea(void) double y1, y2, area = 0.0; printf(“Please input a series positive float number.n“); if (scanf(“%lf“, ,补充题1:打印如下图案,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,void Figure(int n) int i, j; for (i = 1; i = 1; j-) printf(“ “); for (j = 1; j = 1; j-) printf(“%d“, j); printf(“n“); for (i = 1; i = 1; j-) printf(“%d“, j); printf(“n“); ,补充题2:用递归的方法求N阶勒让德多项式的值,递归公式为,double pn(int n, double x) double value; if(n=0) value=1; else if(n=1) value=x; else value=(2*n-1)*x*pn(n-1,x)-(n-1)*pn(n-2,x)/n; return value; ,补充题3:学生成绩管理系统,菜单调用学生成绩管理系统 求计科0905班学生高级语言成绩设计课的最高分、最低分、平均分和不及格的人数,void ScoreInfSys() double biggest, smallest, sum, score; int count = 1, fail = 0; scanf(“%lf”, ,void CountCh(void) int ch; int i = 0, j = 0, k = 0, m = 0; while (ch = getchar() != n) if (ch = 65 ,补充题4.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。,第五章习题讲解,作业1.读程序写结果 #include int f1( int ), f2( int ); void main() int i; for(i = 2 ; i 5 ; i+) printf (“f1(%d) = %d t “, i , f1( i ) ); printf(“n“); for(i = 2 ; i 5 ; i+) printf (“f2(%d) = %d t “, i , f2( i ) ); printf(“n“); ,int f1( int x ) int f = 1; f *= x; return f; int f2( int x ) static int f = 1; f *= x; return f; ,结果为: f1(2)=2,f2(2)=2,f2(3)=6,f2(4)=24,f1(3)=3,f1(4)=4,作业2.阅读下列程序写结果,#include int a = 3, b = 5; int max(int a, int b) int c; c = a b ? a : b; return c; void main() int a = 8; printf(“%d”, max(a, b); ,结果:8,10.用牛顿迭代法求方法ax3+bx2+cx+d=0在1附近的一个实根,系数a,b,c,d的值依次为1,2,3,4由主函数输入,求出根后由主函数输出。,牛顿迭代法: 设r是f(x)=0的根,选取x0作为r初始近似值, 过点(x0,f(x0))做曲线y=f(x)的切线L,L的方程为y=f(x0)+f(x0)(x-x0), 求出L与x轴交点的横坐标 x1=x0-f(x0)/f(x0),称x1为r的一次近似值, 过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴的横坐标 x2=x1-f(x1)/f(x1)称x2为r的二次近似值, 重复以上过程,得r的近似值序列Xn,其中Xn+1=Xn-f(Xn)/f(Xn),称为r的n+1次近似值。,/牛顿迭代法求方程的根 #include double f(double a, double b, double c, double d,double x); double fd(double a, double b, double c, double d,double x); double root(double a, double b, double c, double d); void main() double a,b,c,d,x; printf(“输入方和的系数a,b,c,dn“); scanf(“%lf,%lf,%lf,%lf“, ,程序代码,double f(double a, double b, double c, double d,double x) return (a*x*x*x+b*x*x+c*x+d); double fd(double a, double b, double c, double d,double x) return (3*a*x*x+2*b*x+3); double root(double a, double b, double c, double d) double x1=1.2,x0; int n=0; do n+; x0=x1; x1=x0-f(a,b,c,d,x0)/fd(a,b,c,d,x0); while(n=1000 | fabs(x1-x0)1e-6); return x1; ,16.写函数int setbits(int x, int p, int n, int y)求将x的从左数的第p位开始的n位用y的最右边的n位替换,其它位都不变。,p位 p-n位 0位 x 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1,p位 n-1位 0位 y 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1,0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1,(0n),0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1,y&(0n),0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0,(y&(0n)(p-n+1),0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1,(0n),1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1,(0n)(p-n+1),1 0 1 1 0 1 0 0 0 0 0 0 1 1 0 1,x&(0n)(p-n+1),x&(0n)(p-n+1) | (y&(0n)(p-n+1),1 0 1 1 0 1 0 0 0 0 0 0 1 1 0 1,0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0,1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1,#include Int setbits(int, int, int, int); int main() printf(“%xn“, 42); printf(“%xn“, 56); printf(“%xn“, setbits(42, 5, 3, 56); return 0; int setbits(int x, int p, int n, int y) x = x ,高级语言程序设计之 程序调试篇,主讲教师:贾彩燕 计算机与信息技术学院 计算机科学与技术系 cyjia,1. 怎么调程序?,辅助我们调试程序的工具称为IDE的调试器debugger,如何进行入调试?,方法1. 菜单:BuildStart DebugGo 方法2. 直接点击工具条上的Go按钮 方法3. 按热键F5,想让程序停下来,怎么办?,设置断点,断点是 最常用的技巧。 断点是调试器设置的一个代码位置。当程序运行到断点时,程序中断执行,回到调试器。 调试时,只有设置了断点并使程序回到调试器,才能对程序进行在线调试。,设置断点方法,可以通过下述方法设置断点 方法1简单方法 把光标移动到需要设置断点的代码行上,然后按F9快捷键,或者点工具条上的小手图标。 方法2功能更强大的一种方法 弹出Breakpoints对话框 按快捷键CTRL+B或ALT+F9,或者通过菜单Edit/Breakpoints打开。 打开后点击Break at编辑框的右侧的箭头,选择 合适的位置信息。一般情况下,直接选择line xxx就足够了,如果想设置不是当前位置的断点,可以选择Advanced,然后填写函数、行号和可执行文件信息。,本课件中的采用范例及流程说明,跟踪执行从程序开始显示菜单执行第3个功能结束运行的全过程,课堂演示程序,设断点,断点标志,断点标志,主函数里只有两条语句,调用菜单函数后返回。,设置断点对话框,去掉断点,把光标移动到给定断点所在的行,再次按F9就可以取消断点。 同前面所述,打开Breakpoints对话框后,也可以按照界面提示去掉断点。,2. 设了断点以后,如何走程序?,进入调试: 1. 点此按钮 2. 按F5 3. BuildStart DebugGo,黄色右箭头表示当前就要执行的代码行,当前执行中的上下文(语境,函数),自动给出的当前语境下的变量值、返回值观察窗口,Debug工具栏,自定义的观察窗口,可以定义多组,掌握Debug工具条的主要按钮含义,Stop debugging 停止调试,step into 单步跟进,如果当前语句有函数调用,则单步进入函数执行,否则单步执行完一条语句。,step over 单步执行完当前语句,若当前语句有函数调用,除非被调用函数中有断点,否则不会跟进函数。,step out 执行完当前语句所在函数的执行,返回该函数的调用处。,Run to cursor 执行到当前光标处,,注意观察箭头 便于理解记忆,常用进程控制快捷键,点击Step into后,进入函数Menu()执行,当前就要执行的代码行,语境切换成Menu(),3. 如何了解执行状态?,查看数值,VC支持查看变量、表达式和内存的值。所有这些观察都必须是在断点中断的情况下进行。 观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。,watch,VC提供一种被称为Watch的机制来观看变量和表达式的值。 在断点状态下,在变量上单击右键,选择Quick Watch, 就弹出一个对话框,显示这个变量的值。,watch,单击Debug工具条上的Watch按钮,就出现一个Watch视图(Watch1, Watch2 , Watch3,Watch4),在该视图中输入变量或者表达式,就可以观察 变量或者表达式的值。 注意:这个表达式不能有副作用,例如+运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致 软件的逻辑被破坏。,点击Step over后,开始执行当前函数代码,自动给出当前语境下变量的值,当前执行的代码行,当前程序运行结果?,什么也没有,为什么? 因为没有输出任何内容,再次单击Step over,执行完第一个printf语句,printf语句返回值被自动给出,表示输出了38个字符,执行结果?,执行第1条printf语句以后的输出结果,点击run to cursor,将光标移动到此行,printf语句返回值被自动给出,表示输出了38个字符,执行到此行之前,刚才那几个变量怎么不见了?因为有点远(上下文),只显示执行位置附近的,想看怎么办?,可以在此处增加你想看的东西。 基本方法:直接在此处写上(还有别的办法加)你想看的内容的表达式 如:想看SeleFun和SelectTime值,想看SelectTime的地址,怎么办,手工增加SeleFun和SelectTime变量,系统会自动给出它们的值,继续以step over的方式到此语句,注意观察debug工具栏的几个按钮已经变灰,原因是在执行scanf语句,等待你在运行窗口中录入数据,手工在任务条点击显示运行窗口,输入3,当前上下文的一些东西又自动出现了,这个+号表示还可展开查看,各个变量的值发生了变化,继续单击Step over,执行到ExecuteFunction函数,然后单击Step into进入此函数。,单击Step into进入ExecuteFunction函数执行代码。,为什么SeleFun的值发生了变化?,原因:语境发生变化了,ExecuteFunction函数中没有这个变量。,点击此处继续执行,当前执行的代码行,等待用户输入,手工在任务条点击显示运行窗口,输入任意正整数如:53,单击Step into进入prime函数执行代码。,点击step out,退出当前函数prime的执行,返回到原调用处,Call stack调用堆栈,想要知道函数被调用的过程怎么办? 调用堆栈 反映了当前断点处函数是被那些函数按照什么顺序调用的。 单击Call stack按钮,显示Call Stack对话框。其中显示了一个调用系列,最上面的是当前函数,往下依次是调用函数的上级函数。 单击这些函数名可以跳到对应的函数中去。,此按钮,点击step out,退出当前函数prime的执行,返回到原调用处,原调用处,运行结果显示,再次点击step out,退出当前函数ExecuteFunction的执行,返回到原调用处,此时准备执行下一遍循环,注意语境变化,观察SeleFun值的改变,因为语境发生变化,返回到了主调函数Menu()。,观察SelectTime值的变化,因为选择了一次执行,执行该行语句,等待用户输入选项,输入选项为0,准备结束程序运行,执行该语句,跳出for循环,打印选择次数,Menu()执行完毕,执行return语句后结束整个程序的调试运行。,在调试过程中可以随时点击此按钮结束程序运行。,4. Debug工具条上的其它按钮功能,Memory,由于指针指向的数组,Watch只能显示第一个元素的值。为了显示数组的后续内容,或者要显示一片内存的内容,可以使用memory功能。 在 Debug工具条上点memory按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。,Varibles,Debug工具条上的Varibles按钮弹出一个框,显示所有当前执行上下文中可见的变量的值。特别是当前指令涉及的变量,以红色显示。,Reigsters,Debug工具条上的Reigsters按钮弹出一个框,显示当前的所有寄存器的值。,其他调试手段,系统提供一系列特殊的函数或者宏来处理Debug版本相关的信息,如下:,本周五停课,后面补上机课一次 Q A!,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!