C语言程序的调试(实验)概要课件

上传人:文**** 文档编号:240603999 上传时间:2024-04-24 格式:PPTX 页数:55 大小:759.99KB
返回 下载 相关 举报
C语言程序的调试(实验)概要课件_第1页
第1页 / 共55页
C语言程序的调试(实验)概要课件_第2页
第2页 / 共55页
C语言程序的调试(实验)概要课件_第3页
第3页 / 共55页
点击查看更多>>
资源描述
使用使用VC+6.0调试程序调试程序调试程序v调试运行v单步跟踪v单步跳进跟踪v观察自动变量v观察其他变量v停止调试v1:打开jiecheng项目(双击jiecheng.dsw文件)v2:build该项目,确定程序可以运行v3:调试运行阶乘程序v4:设置断点v5:再次调试运行程序v6:使用单步执行程序到结束1:打开jiecheng项目2:Build该项目,确定程序可以运行3:调试运行阶乘程序Go4:设置断点v将鼠标停留在程序的第8行,在第8行的任意地方单击鼠标左键(第8行即“i=i*4;”)v在工具栏上选择 按钮,为第8行设置断点,以便让程序在此处暂停运行5:再次调试运行阶乘程序v注意观察,现在调试运行程序会如何?Go5:再次调试运行阶乘程序(续)程序暂停之处调试(Debug)工具:控制程序前进步伐查看程序当前状态6:使用单步执行到程序结束v设置断点以后,调试运行程序时,程序开始执行,并且运行到断点处暂停下来,此时我们有机会观察程序的运行情况,并且诊断程序目前的状态是否如我们所预期的那样。v不过我们先不着急观察程序的状态,而是来看看如何控制程序的运行,以便在我们需要的时候让程序暂停下来,并且以我们需要的方式走走停停!6:使用单步执行到程序结束v程序停下来了,如何让程序从暂停的地方继续向前执行?v方法是使用单步执行手段(Step Over)让程序向前走一步停止调试停止调试并重新启动调试单步执行当前位置熟悉调试工具栏和菜单(只在调试运行时出现)对比调试运行时出现的调试菜单“Debug”和调试工具栏,根据图标查找对应项观察自动变量自动变量观察变量的值及其随程序运行时的变化情况v设置断点,调试运行程序,此时程序暂停在断点处等待v选择Debug菜单,找到最后一项“Quick Watch”并点击输入想要观察的变量变量名变量的值点击Add Watch点击Add watch,看到如下画面调试观察每一步骤变量i的值v点击单步执行按钮或者菜单,程序则向前单独运行一个步骤v每向前执行一步,就会暂停下来,这样我们就有充足的时间观察所关心的变量名称v观察变量i的值的情况注意在调试过程中v断点不能设置在空白行上面v添加断点和删除断点的方法一样v一个程序中可以设置多个断点v按下F5键可以让程序从当前位置向前执行,直到遇见下一个断点或者程序结束相关C语言基础知识指针:结构体:指针新建新建Visual C+程序程序四、利用已有的程序编写新程序四、利用已有的程序编写新程序无无论论是是控控制制台台程程序序,或或者者是是Windows窗窗口口程程序序,Visual C+都都会会要要求求有有对对应应的的项项目目文文件件。而而且且在在大大多多数数情情况况下下,C程程序序的的基基本本框框架架都都是是一一致致的的,例例如如:都都有有主主函函数数等等等等。所所以以在在编编写写一一个个新新的的程程序序时时,可可以以利利用用以以前前编编写写过过的程序,其操作方法有两种。的程序,其操作方法有两种。(1)程序复用操作)程序复用操作将将已已有有的的程程序序复复用用到到新新程程序序上上的的方方法法很很简简单单,就就是是将将程程序序内内容容通通过过“复复制制粘贴粘贴”实现。实现。(2)项目复用操作)项目复用操作打打开开已已有有的的项项目目文文件件,将将原原来来的的文文件件删删除除,利利用用项项目目管管理理增增加加新新程程序序文文件件或资源元素等。或资源元素等。新建新建Visual C+程序程序五、项目管理五、项目管理无无论论项项目目是是否否建建立立,只只要要开开始始程程序序的的编编译译、链链接接、运运行行或或调调试试过过程程,Visual C+就会按项目管理方式进行控制。就会按项目管理方式进行控制。例例如如:当当使使用用文文件件新新建建方方式式建建立立一一个个源源程程序序文文件件后后,只只要要开开始始编编译译则则Visual C+会自动提示创建项目。会自动提示创建项目。新建新建Visual C+程序程序地址和指针的概念地址和指针的概念一、指针概述:一、指针概述:1 1、“&”“&”:地址运算符:地址运算符2.“*”2.“*”:指针运算符,取其指向的:指针运算符,取其指向的内容内容:exp:exp:&a:&a:变量变量a a的地址:的地址:*p:*p:变量变量p p的内容;的内容;注:注:“&”“&”不能施加在常数,常量和表达式上;不能施加在常数,常量和表达式上;二、指针变量:二、指针变量:存放某种变量地址的变量称为指针存放某种变量地址的变量称为指针变量。变量。1035.ab20102012p2010q2012因此,在因此,在C语言中,将地语言中,将地址形象化地称为址形象化地称为指针指针定义一个指针变量定义一个指针变量指针变量的定义一般形式为:指针变量的定义一般形式为:基类型基类型*指针变量名指针变量名;例如:例如:int i,j,*pi,*pj;int i,j,*pi,*pj;float x,y,*p1,*p2;float x,y,*p1,*p2;指针变量的赋值:使得指针变量指向变量指针变量的赋值:使得指针变量指向变量指针变量名指针变量名&变量名变量名;如:如:pi=&i;pj=&j;p1=&y;p2=&x;pi=&i;pj=&j;p1=&y;p2=&x;注意:指针变量只能存放指针(地址),且只能是相同类型变量的地址。注意:指针变量只能存放指针(地址),且只能是相同类型变量的地址。例例如如,指指针针变变量量pipi、pjpj,只只能能接接收收intint型型、p1,p1,p2p2只只能能接接收收floatfloat型型的的地地址址,否则出错否则出错。结构体指针变量的引用在程序中,可以用:在程序中,可以用:*指针变量名代替其所指变量。指针变量名代替其所指变量。如若如若:int i,*p;p=&i;则则 i=5;与与*p=5;的作用相同,即可用的作用相同,即可用*p代替代替i,这里这里*号称为指号称为指针运算符(或称为间接访问运算符)针运算符(或称为间接访问运算符)指针变量作为函数参数实参:变量地址或已赋值的指针变量,形参:指针变量实参:变量地址或已赋值的指针变量,形参:指针变量功能:地址传送方式,会将改变后的值带回。功能:地址传送方式,会将改变后的值带回。例例10.3通过函数调用实现例通过函数调用实现例10.2的功能。的功能。s *p1,int *p2)int temp;temp=*p1;*p1=*p2;*p2=temp;main()int a,b,*pointer1,*pointer2;scanf(%d%d,&a,&b);pointer1=&a;pointer2=&b;if(ab)s);printf(n%d,%d,a,b);数组与指针1.1.概念概念数组的指针数组的指针数组在内存中的起始地址,用数组在内存中的起始地址,用数组名表示数组名表示2.2.指向数组的指针变量指向数组的指针变量-赋于数组名的指针变赋于数组名的指针变量量例如,例如,int a 10,*p=a(int a 10,*p=a(或或*p=&a0);*p=&a0);或者:或者:int a 10,*p;int a 10,*p;p pa;a;3.3.通过指针引用数组元素通过指针引用数组元素如果有如果有“int a 10,*p=a;”“int a 10,*p=a;”,则:,则:(1 1)p+i=a+i=&aip+i=a+i=&ai。(2 2)*(p+i)=*(a+i)=ai*(p+i)=*(a+i)=ai。(3 3)pipi*(p+i)*(p+i)aiai。注注意意:p+1p+1指指向向数数组组的的下下一一个个元元素素,而而不不是是简简单单地地 使使 指指 针针 变变 量量 p p的的 值值+1+1。其其 实实 际际 变变 化化 为为p+1*size(sizep+1*size(size为一个元素占用的字节数)。为一个元素占用的字节数)。例例如如,假假设设指指针针变变量量p p的的当当前前值值为为30003000,则则p+1p+1为为3000+1*2=30023000+1*2=3002,而不是,而不是30013001用数组名作为函数参数用数组名作为函数参数形参:数组或指针变量形参:数组或指针变量实参:数组名或指向数组的指针变量实参:数组名或指向数组的指针变量传递方式:地址传送方式传递方式:地址传送方式作用:若函数中对数组作了修改,则调用作用:若函数中对数组作了修改,则调用函数中的数组也会作同样的修改函数中的数组也会作同样的修改指向函数的指针指向函数的指针1.1.函数指针的概念函数指针的概念一个函数在编译时,被分配了一个入口地址,一个函数在编译时,被分配了一个入口地址,这个地址就称为该函数的指针。这个地址就称为该函数的指针。可以用一个指针变量指向一个函数,然后通过可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数。该指针变量调用此函数。2.2.指向函数的指针变量指向函数的指针变量 (1 1)定义格式)定义格式 函数类型函数类型 (*(*指针变量指针变量)()();注意:注意:“*“*指针变量指针变量”外的括号不能缺,否则外的括号不能缺,否则成了返回指针值的函数。成了返回指针值的函数。例如,例如,int (*fp)();/*fpint (*fp)();/*fp为指向为指向intint函函数的指针变量数的指针变量*/*/(2 2)赋值)赋值 函数名代表该函数的入口地址。因此,可函数名代表该函数的入口地址。因此,可用函数名给指向函数的指针变量赋值。用函数名给指向函数的指针变量赋值。指向函数的指针变量指向函数的指针变量&函数名函数名;注意:函数名后不能带括号和参数;函注意:函数名后不能带括号和参数;函数名前的数名前的“&”“&”符号是可选的。符号是可选的。(3)调用格式调用格式 (*函数指针变量函数指针变量)(实参表实参表)3.指向函数的指针变量作函数参数指向函数的指针变量作函数参数 指向函数的指针变量的常用用途之一,就是将函数指针作指向函数的指针变量的常用用途之一,就是将函数指针作参数,传递到其它函数。参数,传递到其它函数。注意:对指向函数的指针变量,诸如注意:对指向函数的指针变量,诸如p+i、p+/p-等运算是等运算是没有意义的。没有意义的。例例10.24 设有一个函数设有一个函数process,在调用它时,每次实现不同的功,在调用它时,每次实现不同的功能。输入能。输入a和和b两个数,第一次调用时找出两个数,第一次调用时找出a与与b中的大者,第中的大者,第 二次找出小者,第三次求和。二次找出小者,第三次求和。#includevoid main()int max(int,int);int min(int,int);int add(int,int);int process(int,int,int (*fun)();int a,b;printf(enter a and b:);scanf(%d%d,&a,&b);printf(nmax=);process(a,b,max);printf(nmin=);process(a,b,min);printf(nsum=);process(a,b,add);max(int x,int y)return xy?x:y;min(int x,int y)return xy?y:x;add(int x,int y)return x+y;process(int x,int y,int (*fun)(int,int)/*fun是一个指向函数是一个指向函数的指针,该函数是一个有两个整型参数的返回整型值的函数的指针,该函数是一个有两个整型参数的返回整型值的函数*/int result;result=(*fun)(x,y);printf(%dn,result);返回指针值的函数返回指针值的函数一个函数可以返回一个一个函数可以返回一个intint型、型、floatfloat型、型、charchar型的数据,也可以返回一个指针类型的数型的数据,也可以返回一个指针类型的数据。据。返回指针值的函数(简称指针函数)的定返回指针值的函数(简称指针函数)的定义格式如下:义格式如下:函数类型函数类型 *函数名函数名(形参表列形参表列)例如:例如:int *a(int x,int y);int *a(int x,int y);该函数的函数名为该函数的函数名为a a,返回的是一个整型的指针。,返回的是一个整型的指针。指针数组指针数组指针数组的概念指针数组的概念 数组的每个元素都是一个指针数据。指针数数组的每个元素都是一个指针数据。指针数组比较适合用于指向多个字符串,使字符串处理组比较适合用于指向多个字符串,使字符串处理更加方便、灵活。更加方便、灵活。数据类型数据类型 *数组名数组名 元素个数元素个数 例如:例如:int *p4;char *string10;int *p4;char *string10;p指向数组a易混淆的问题v*p+,*p(+),*(+p),(*p)v设P指向a数组中的第i个元素:*(p-)=ai-;*(-p)=a-i;*(+p)=a+i.结结 构构 体体例:例:描述一个学生的姓名、学号、性别、年龄。描述一个学生的姓名、学号、性别、年龄。每个学生都有这样的属性,它们构成一个描述学生具体情每个学生都有这样的属性,它们构成一个描述学生具体情况的一个整体。而每个属性又是一个基本的类型,本例中况的一个整体。而每个属性又是一个基本的类型,本例中可分别用字符数组、长整型、字符型、和整型来描述。可分别用字符数组、长整型、字符型、和整型来描述。一、结构体类型的定义一、结构体类型的定义结构体概念的引入结构体概念的引入数据的描述:数据的描述:基本类型基本类型:整型、实型、字符型。:整型、实型、字符型。数组数组:属于同一种类型的元素的集合。:属于同一种类型的元素的集合。有时,需要用不同的数据类型来描述一个事物的各方面属性,故有时,需要用不同的数据类型来描述一个事物的各方面属性,故此,此,C语言引入了语言引入了结构体结构体的概念。的概念。struct struct 结构体类型名结构体类型名 类型标识符类型标识符 成员名成员名1 1;类型标识符类型标识符 成员名成员名2 2;类型标识符类型标识符 成员名成员名n n;;结构体类型的定义结构体类型的定义如:如:struct student struct student char name10;char name10;long id;long id;char gender;char gender;int age;int age;注意:注意:struct student struct student 应作为一个类型整体,应作为一个类型整体,name10 name10、idid、gendergender、ageage都是其成员。都是其成员。struct struct及花括号后的及花括号后的“;”不能省。不能省。定义结构体类型,定义结构体类型,描述下列数据描述下列数据 struct studentstruct student int no int no;/*/*学号学号*/*/char name char name1010;/*/*姓名姓名*/*/char sex char sex;/*/*性别性别*/*/int age int age;/*/*年龄年龄*/*/float score10 float score10;/*/*成绩成绩*/*/;结构体类型的举例结构体类型的举例(1)(1)学生情况学生情况:包含学生的学号、包含学生的学号、姓名、姓名、性别、性别、年龄、年龄、1010门课程成绩:门课程成绩:结构体类型可以嵌套定义结构体类型可以嵌套定义 即一个结构体类型中的某些成员又是其他结构体类型即一个结构体类型中的某些成员又是其他结构体类型注意注意例如,对已定义的结构体类型例如,对已定义的结构体类型struct student struct student,可以定义结构体,可以定义结构体变量:变量:struct student zhang,stu1 struct student zhang,stu1;二、结构体变量二、结构体变量结构体变量的定义结构体变量的定义1.1.先定义结构体类型,先定义结构体类型,再定义结构体变量再定义结构体变量格式:格式:struct struct 结构体名结构体名 结构体变量名表;结构体变量名表;三种方法:三种方法:2.2.在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量例如:例如:struct studentstruct student char char name10;name10;char sex;char sex;int age;int age;float score;float score;stu1,stu2;stu1,stu2;格式:格式:struct struct 结构体类型名结构体类型名 类型标识符类型标识符 成员名成员名1 1;类型标识符类型标识符 成员名成员名2 2;类型标识符类型标识符 成员名成员名n n;变量名表变量名表;3.3.用匿名形式直接定义结构体类型变量(不出现结构体名)用匿名形式直接定义结构体类型变量(不出现结构体名)例如:例如:structstruct char name10;char name10;char sex;char sex;int age;int age;float score;float score;stu1,stu2;stu1,stu2;格式:格式:structstruct 类型标示符类型标示符 成员名成员名1 1;类型标示符类型标示符 成员名成员名2 2;类型标示符类型标示符 成员名成员名n n;变量名表变量名表;(1 1)类型与变量是不同的概念,不要混同。对结构体变量来说,在定)类型与变量是不同的概念,不要混同。对结构体变量来说,在定义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配存储空间的,只对变量分配存储空间。对类型是不分配存储空间的,只对变量分配存储空间。(2 2)对结构体中的成员,可以单独使用,它的作用相当于普通变量。)对结构体中的成员,可以单独使用,它的作用相当于普通变量。(3 3)成员也可以是一个结构体变量。)成员也可以是一个结构体变量。(4 4)成员名可与程序中的变量同名,两者不代表同一对象。)成员名可与程序中的变量同名,两者不代表同一对象。结构体的说明结构体的说明例。定义结构体变量例。定义结构体变量stu1:stu1:struct student stu1;struct student stu1;stu1.age=20;stu1.age=20;scanf(%f,&stu1.score);scanf(%f,&stu1.score);stu1.age stu1.age 表示引用结构体变量表示引用结构体变量stu1stu1中的中的ageage成员,因该成员的成员,因该成员的类型为类型为intint型,所以可以对它执行任何型,所以可以对它执行任何intint型变量可以执行的运型变量可以执行的运算。算。结构体变量的使用结构体变量的使用结构体变量一般不整体引用,而是引用其成员变量。结构体变量一般不整体引用,而是引用其成员变量。成员变量引用格式成员变量引用格式结构体变量名结构体变量名.成员名成员名其中的圆点运算符称为成员运算符,它的运算级别是最高的。其中的圆点运算符称为成员运算符,它的运算级别是最高的。(1)(1)结构体类型变量的各成员(分量)必须单独引用结构体类型变量的各成员(分量)必须单独引用,成员运算符成员运算符“”“”具有最高优先级。具有最高优先级。(2)(2)不允许对结构体变量进行整体的输入输出不允许对结构体变量进行整体的输入输出 如:如:scanf(“%s%c%d%f”,&stu1);scanf(“%s%c%d%f”,&stu1);(3)(3)如果结构体变量类型相同,可以互相赋值。如果结构体变量类型相同,可以互相赋值。stu1=stu2;stu1=stu2;(4)(4)严格区分类型与变量的概念。严格区分类型与变量的概念。(5)(5)如如果果结结构构体体成成员员本本身身又又是是结结构构体体类类型型的的,则则可可继继续续使使用用成成员员运运算算符符取取结结构构体体成成员员的的结结构构体体成成员员,逐逐级级向向下下,引引用用最最低低一一级级的的成成员员。程程序只能对最低一级的成员进行运算。例如,对序只能对最低一级的成员进行运算。例如,对stu1stu1某些成员的访问:某些成员的访问:stu1.birthday.day=23 stu1.birthday.day=23;stu1.birthday.month=8 stu1.birthday.month=8;stu1.birthday.year=1985 stu1.birthday.year=1985;说明说明结构体变量的初始化结构体变量的初始化结构体变量可以在定义时初始化。结构体变量可以在定义时初始化。格式格式struct struct 结构体名结构体名 成员表;成员表;结构体变量结构体变量=初始化数据表初始化数据表;例例 struct student struct student char name10;char name10;char sex;char sex;int age;int age;float score;float score;stu1,stu2=“Wangwu”,m,20,88.5;stu1,stu2=“Wangwu”,m,20,88.5;一个结构体变量的指针就是该变量所占据的内存段的一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以定义一个指针变量,用来指向一个结构体变量,起始地址。可以定义一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址此时该指针变量的值是结构体变量的起始地址 。四、结构体类型指针四、结构体类型指针例如:例如:struct student *pstu,stu;struct student *pstu,stu;pstu=&stu;pstu=&stu;定义了一个指针变量定义了一个指针变量pstu,pstu,并使指针指向结构体变量并使指针指向结构体变量stu stu 。*pstu*pstu 表示指针表示指针pstupstu所指示的结构体变量(对象)所指示的结构体变量(对象)stustu,因而,其成,因而,其成员表示为(员表示为(*pstu).name ,(*pstu).age*pstu).name ,(*pstu).age。指向结构体变量的指针指向结构体变量的指针定义格式定义格式struct struct 类型名类型名 *指针变量名;指针变量名;为方便起见,为方便起见,C C语言定义了结构体的指针变量引用结构体成员的特语言定义了结构体的指针变量引用结构体成员的特殊形式:殊形式:指针变量名指针变量名-成员名成员名“-”“-”为指向运算符为指向运算符上面示例(上面示例(*pstu).name,(*pstu).age*pstu).name,(*pstu).age。可以等价表示为:。可以等价表示为:pstu-name,pstu-age pstu-name,pstu-agep经常不断地学习,你就什么都知道。你知道得越多,你就越有力量pStudyConstantly,AndYouWillKnowEverything.TheMoreYouKnow,TheMorePowerfulYouWillBe写在最后谢谢大家荣幸这一路,与你同行ItS An Honor To Walk With You All The Way演讲人:XXXXXX 时 间:XX年XX月XX日
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


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

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


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