c语言程序设计21第二十一讲(总复习).ppt

上传人:cl****1 文档编号:570210227 上传时间:2024-08-02 格式:PPT 页数:80 大小:505.50KB
返回 下载 相关 举报
c语言程序设计21第二十一讲(总复习).ppt_第1页
第1页 / 共80页
c语言程序设计21第二十一讲(总复习).ppt_第2页
第2页 / 共80页
c语言程序设计21第二十一讲(总复习).ppt_第3页
第3页 / 共80页
c语言程序设计21第二十一讲(总复习).ppt_第4页
第4页 / 共80页
c语言程序设计21第二十一讲(总复习).ppt_第5页
第5页 / 共80页
点击查看更多>>
资源描述

《c语言程序设计21第二十一讲(总复习).ppt》由会员分享,可在线阅读,更多相关《c语言程序设计21第二十一讲(总复习).ppt(80页珍藏版)》请在金锄头文库上搜索。

1、你到你到C仅一步之遥!仅一步之遥!高级语言程序设计高级语言程序设计主讲教师:贾彩燕主讲教师:贾彩燕计算机与信息技术学院计算机与信息技术学院计算机科学与技术系计算机科学与技术系考试考试n时间:时间:q1月月6日日q14:3016:30n地点:地点:qSY210答疑答疑n时间:时间:q1月月5日日q14:0018:00n地点:地点:q九教北九教北509或或507考试题型及分数分布考试题型及分数分布n选择题(选择题(15题题/每题每题2分,共分,共30分)分)n读程序写结果(读程序写结果(5道题,共道题,共20分)分)n程序填空(程序填空(4道题,道题,10个空个空/每空每空2分,共分,共20分)分

2、)n编程题(编程题(3道题,共道题,共30分)分)n总成绩平时成绩(总成绩平时成绩(30%)考试成绩()考试成绩(70%)两点提示两点提示n读程序细心一些读程序细心一些n编程题不要空着,能写多少写多少编程题不要空着,能写多少写多少课程内容课程内容第一章第一章 程序设计和程序设计和C C语言语言第二章第二章 数据对象与计算数据对象与计算第三章第三章 变量、函数和控制结构变量、函数和控制结构第四章第四章 基本程序设计技术基本程序设计技术第五章第五章 C C程序结构(函数)程序结构(函数)第六章第六章 数组数组第七章第七章 指针指针第八章第八章 文件和输入输出文件和输入输出第九章第九章 结构和其它数

3、据机制结构和其它数据机制第十章第十章 程序开发技术程序开发技术第十一章第十一章 标准库标准库重点(数据控制)重点(数据控制)n数据数据qC数据类型及存储性质数据类型及存储性质n控制结构控制结构q顺序、选择、循环结构顺序、选择、循环结构n函数函数q定义、声明及调用定义、声明及调用n数组数组q一维数组、字符数组指针一维数组、字符数组指针q数组与指针的关系数组与指针的关系n结构结构q结构的定义及使用结构的定义及使用q链表的定义及操做链表的定义及操做n文件文件q文件的打开、关闭文件的打开、关闭q文件的读写文件的读写n从问题到程序的编程思想从问题到程序的编程思想q程序的函数分解程序的函数分解q模块化程序

4、设计模块化程序设计难点难点n递归递归n指针指针q数组与指针的关系数组与指针的关系q命令行参数命令行参数q动态内存分配动态内存分配n链表链表要点要点1:算法及其表示方法:算法及其表示方法n程序数据结构算法程序数据结构算法q程序程序n程序规定了计算机执行的动作和动作的顺序。程序规定了计算机执行的动作和动作的顺序。q算法:算法:n解决问题的方法和步骤解决问题的方法和步骤q算法的几个特性算法的几个特性n有穷性有穷性n确定性无二义确定性无二义n可执行性可执行性n有有0个或多个输入个或多个输入n有有0个或多个输出个或多个输出要点要点2:运算符及表达式:运算符及表达式n运算符、表达式及其优先级关系运算符、表

5、达式及其优先级关系q一元运算符一元运算符(优先级最高)(优先级最高)q自增、自减运算符自增、自减运算符(循环每年必考)(循环每年必考)q算术运算符算术运算符(/和和%)q关系运算符关系运算符(考点)(考点)q逻辑运算符逻辑运算符(考点)(考点)q位运算符位运算符q条件运算符条件运算符q赋值运算符赋值运算符q逗号运算符逗号运算符例例1:inta=1,b=10;dob-=a;a+;while(b-0);执行完之后执行完之后b的值是?的值是?8b=(a=2*5,a*4),a+15;b=?40intx=10,y=3,z;则语句则语句printf(“%4dn”,z=(x%y,x/y);输出什么?输出什么

6、?_3例例2:判断:判断char型变量型变量ch是否为大写字母的正确表达是否为大写字母的正确表达式是式是nA、A=ch=A)&(ch=A)&(ch=Z)nD、(A=ch)nC例例3:按位与运算:按位与运算:int a=7,b=12,c=a&b;变量变量c的值的值是是nA、19nB、4nC、5nD、9nB例例4:假设:假设a, b为为int型变量,执行语句型变量,执行语句a=10; b = (a 10) ? -a : a+; 之后,之后,a, b的值为的值为nA.11,10nB.9,11nC.10,11nD.9,9nA要点要点3:C语言的基本数据类型语言的基本数据类型n标识符、关键字、常量、变量

7、标识符、关键字、常量、变量nC语言的基本数据类型语言的基本数据类型qint,float,double,charn变量的存贮类型及其作用域变量的存贮类型及其作用域qautoqregister/不常用不常用qstatic(循环考点)(循环考点)qextern例例5:下面程序的输出结果是:下面程序的输出结果是intmain()inta=2,i;for(i=0;i3;i+)printf(%dn,f(a);A、7B、7C、7D、789107911137Aintf(inta)intb=0;staticintc=3;b+;c+;return(a+b+c);例例6:已知:已知c为字符型,则执行为字符型,则执行

8、c2=A+6-3后,后,c2中的值为中的值为nA、BB、68C、不确定的值、不确定的值 D、Cn注意:字符型数据可以看作整型数据注意:字符型数据可以看作整型数据nB要点要点4:条件:条件if语句语句n条件条件if语句的三种形式语句的三种形式nIfelse语句和语句和switch开关语句的差别开关语句的差别nswitch开关语句的形式开关语句的形式swith(常量表达式常量表达式)case表达式表达式1:语句语句;break;case表达式表达式2:语句语句;break;default:语句;语句;例例7:以下程序的输出结果是:以下程序的输出结果是:。intmain()inta=0,i;for(

9、i=0;i4;i+)switch(i)case0:case3:a+=2;break;case1:case2:a+=3;default:a+=5;printf(%dn,a);20要点要点5:循环语句:循环语句n循环语句的三种常见形式循环语句的三种常见形式n循环结构的三要素循环不变关系循环结构的三要素循环不变关系n如何从循环中跳出如何从循环中跳出qbreakqcontinuen常见问题及算法常见问题及算法q累加、累乘累加、累乘q函数的极数展开逼近(累加、累乘)函数的极数展开逼近(累加、累乘)q方程求根(递推逼近)方程求根(递推逼近)q求最大约数和最小公倍数(递归和递推)求最大约数和最小公倍数(递归

10、和递推)qFibonacci数列(递归和递推)数列(递归和递推)q求求100以内的素数、求水仙花数等等以内的素数、求水仙花数等等例例8:有下面程序段:有下面程序段:inti,j,r;for(i=20,j=7;r=i%j;i=j,j=r)continue;printf(“%3d”,j);运行结果是运行结果是:_1例例9:完成下列程序段:任意输入一个数:完成下列程序段:任意输入一个数m,判断是否是素数,判断是否是素数_intmain()intm,i,k;_;k=sqrt(m+1);for_if(m%i=0)break;if_printf(“%disaprimenumbern”,m);elsepri

11、ntf(“%disnotaprimenumbern”,m);#include#includeintmain()intm,i,k;scanf(%d,&m);k=sqrt(m);for(i=2;i=k;i+)if(m%i=0)break;if(i=k+1)printf(%disaprimenumbern,m);elseprintf(%disnotaprimenumbern,m);例例10:以下函数针对长度为:以下函数针对长度为Len的整型数组的整型数组narr采用冒泡排序法进行非采用冒泡排序法进行非递减排序,请补全程序。递减排序,请补全程序。intBubbleSort(intnarr,intLen

12、)inti,j;intTemp;if(Len=0)return-1;for(i=0;iLen;i+)for(j=0;jLen-i;j+)if(_)/判断大小关系判断大小关系Temp=narrj;/交换元素交换元素_;_;return0;intBubbleSort(intnarr,intLen)inti,j;intTemp;if(Len=0)return-1;for(i=0;iLen;i+)for(j=0;jnarrj+1)/判断大小关系判断大小关系Temp=narrj;/交换元素交换元素narrj=narrj+1;narrj+1=Temp;return0;要点要点6:函数:函数n函数的定义、声

13、明及调用函数的定义、声明及调用intmax(inta,intb)/函数头函数接口函数头函数接口intmaxvalue;/函数体函数体maxvalue=(ab)?a:b;returnmaxvalue;/函数返回值,函数可无返回值函数返回值,函数可无返回值n函数声明的原则和意义函数声明的原则和意义n函数接口及设计函数接口及设计q函数定义和使用者内外部的观点函数定义和使用者内外部的观点n函数的参数传递函数的参数传递q单向传递单向传递q双向传递双向传递几种常见错误几种常见错误1. 函数嵌套定义函数嵌套定义 int main() int max(int x, int y) return xy?x:y;

14、解决方案:将函数的定义放置在其他函数之解决方案:将函数的定义放置在其他函数之外,不允许嵌套定义。外,不允许嵌套定义。int max(int x, int y) return xy?x:y;int main() int a=10,b=8; max(a,b);几种常见错误几种常见错误2. 某函数的定义在调用该函数的函数之后某函数的定义在调用该函数的函数之后int main() inta=10,b=8; max(a, b);int max(int x, int y) return xy?x:y; 解决方案:将函数的定义放置在解决方案:将函数的定义放置在调用该函数的函数调用该函数的函数之前或者声明该函

15、数的存在之前或者声明该函数的存在int max(int x, int y) return xy?x:y;int main() inta=10,b=8; max(a,b);int max(int x, int y);int main()inta=10,b=8; max(a,b);int max(int x, int y) return xy?x:y;几种常见错误几种常见错误3. 调用函数时将数据类型也写上调用函数时将数据类型也写上int max(int x, int y) return xy?x:y;int main() inta=10,b=8; max(int a, int b); 解决方案:

16、只有在定义和声明的时候需要写上数据类型,无解决方案:只有在定义和声明的时候需要写上数据类型,无论是参数或者是返回值,而在调用时则只需要写函数名以及论是参数或者是返回值,而在调用时则只需要写函数名以及变量。变量。int max(int x, int y) return xy?x:y;int main() inta=10,b=8; max(a,b);几种常见错误几种常见错误4. 将数组作为参数时将数组作为参数时int find(int a) return ai;int main() int a10; printf(“%dn”,find(a); 解决方案:数组作为参数时只需将数组名作为实际参数,解决

17、方案:数组作为参数时只需将数组名作为实际参数,a10a10是其中一个元素,是其中一个元素,aa只在几种情况下有意义。只在几种情况下有意义。1 1)定)定义数组时不标明数组大小,通过初始化的元素个数确定数组义数组时不标明数组大小,通过初始化的元素个数确定数组大小,大小,2 2)定义或声明函数时。)定义或声明函数时。int find(int a) return ai;int main() int a10; printf(“%dn”,find(a);函数参数的意义函数参数的意义n函数最重要的有四部分:函数名字、函数返回函数最重要的有四部分:函数名字、函数返回值类型、函数参数、函数体。值类型、函数参数

18、、函数体。n对于调用某一个函数的函数(称为主调函数)对于调用某一个函数的函数(称为主调函数)而言,前三部分是需要关注的。而言,前三部分是需要关注的。n简单来说,主调函数简单来说,主调函数A将参数传递给某函数将参数传递给某函数B,B通过计算得到返回值,将返回值传递给主通过计算得到返回值,将返回值传递给主调函数调函数A。int max(int x, int y) return xy?x:y;int main() int a=10,b=8; int c=max(a,b); printf(“%dn”, max(a,b);void swap(int *p, int *q) int t = *p; *p

19、= *q; *q = t;int main() int a=10,b=8; swap(a,b); printf(“%4d%4dn”,a,b);只需通过返回值返回结果只需通过返回值返回结果需要通过参数返回结果需要通过参数返回结果C语言的参数机制称为值参数(简称值参)语言的参数机制称为值参数(简称值参)f内对内对a和和b的操作与的操作与m和和n没有任何关系没有任何关系例例11:以下是递归求最大公约数的函数,请补充:以下是递归求最大公约数的函数,请补充intgcd(intm,intn)if(m=n)_elseif(mn)_;else_;intgcd(intm,intn)if(m=n)returnm;

20、elseif(mn)returngcd(n,m);elsereturngcd(m-n,n);要点要点7:基本输入输出语句:基本输入输出语句ngetchar()nputchar()nscanf()nprintf()ngets()nputs()n数的批量输入输出:基本输入输出循环结构数的批量输入输出:基本输入输出循环结构例例12:intm;scanf(“%d”,&m);int*p;scanf(“%d”,p);doubled;scanf(“%lf”,&d);floatf;scanf(“%f”,&f);doubled=1.0;printf(“%f”,d);chara10,*str=a;scanf(“%

21、s”,str);scanf(“%s”,a);printf(“%s”,str);printf(“%s”,a);na是是int型变量,型变量,c是字符变量。是字符变量。scanf(“%c%c”,&a,&c);c=c-a;printf(“%4d”,c);输入输入70之后结果是之后结果是()_-7例例13:输入一批数据输入一批数据n采用循环采用循环q固定次数固定次数for(i=0;in;i+)scanf();q采用采用scanf的返回值的返回值inta10,i=0;while(scanf(“%d”,&ai+)=1);q其他类型的数字类似。其他类型的数字类似。q但是如果输入字符串时,无法通过但是如果输入

22、字符串时,无法通过scanf返回值是返回值是否等于否等于1来确定,因为数字也可作为字符串的内容。来确定,因为数字也可作为字符串的内容。判断判断scanf是否返回是否返回EOF作为输入结束的条件。作为输入结束的条件。要点八:数组要点八:数组n数组名是数组在内存中的首地址数组名是数组在内存中的首地址n数组下标从数组下标从0开始开始n一维数组上的重要操作一维数组上的重要操作q排序排序q查找查找q插入插入q删除删除q位置交换位置交换q统计(求最大值,平均值等)统计(求最大值,平均值等)n常见问题及算法常见问题及算法q筛法求素数等筛法求素数等q多项式求值多项式求值n二维数组的定义及存储方式二维数组的定义

23、及存储方式q行主序行主序q二维数组可以视为特殊的一维数组二维数组可以视为特殊的一维数组q初始化方法初始化方法n二维数组的使用二维数组的使用q矩阵相加、相乘、转置矩阵相加、相乘、转置q求最大元素、求鞍点等求最大元素、求鞍点等n字符数组和字符串的关系字符数组和字符串的关系q字符串结束标志字符串结束标志q字符数组初始化字符数组初始化q字符串求长字符串求长q字符串拷备字符串拷备q字符串拼接字符串拼接q处理字符串的常用函数处理字符串的常用函数nstrcpy()nstrcmp()nstrcat()nstrlen()nstrstr()q注意:不允许给字符数组直接注意:不允许给字符数组直接赋值赋值nchars

24、tr10;nstr=“bjtu”;要点九:指针要点九:指针n变量和地址变量和地址n取地址运算符和取内容运取地址运算符和取内容运算符算符n指针做函数参数(传地址)指针做函数参数(传地址)q形参、实参都是变量形参、实参都是变量n内容交换内容交换q形参、实参都是地址形参、实参都是地址n地址交换地址交换n数组做函数参数的本质数组做函数参数的本质n指针和数组的关系指针和数组的关系q一级指针和一维数组一级指针和一维数组np=arr/int*p,arr10;n下标法下标法n指针地址法指针地址法n指针法指针法q字符指针和字符数组字符指针和字符数组np=str/char*p,str10;np=“bjtu”; q

25、指针和二维数组指针和二维数组np=&a00/int*p,a33;指针要点指针要点ninta,*p=&a;q指针变量指针变量p指向整型变量指向整型变量a,指针变量,指针变量p也是一个变量,在内也是一个变量,在内存中存放着,这个变量的值是一个整型,即存中存放着,这个变量的值是一个整型,即a的地址。的地址。n指针指针p代表代表p这个变量的值,而这个变量的值,而*p代表代表p所指向的变量所指向的变量的值。的值。inta,*p;qp=&a;令令p的值改为的值改为a的地址,即让的地址,即让p指向指向a。q*p=10;令令p指向的变量的值改为指向的变量的值改为10,即让,即让a=10。nintb10,*p=

26、b;q指针变量指针变量p指向数组指向数组b,数组名,数组名b和指针和指针p基本等价基本等价,除了无,除了无法更改数组名法更改数组名b的值。可以采用的值。可以采用b5、p5、*(p+2)、*(b+2)等方式访问数组中元素的值。等方式访问数组中元素的值。inta10;b=a;是错误的是错误的。指针要点指针要点ninta1020;qa是一个二维数组,实质上也可把是一个二维数组,实质上也可把a当作一个一维数组,只不当作一个一维数组,只不过过a数组中的每一个元素是一个一维数组。数组中的每一个元素是一个一维数组。q因此,因此,a+1指的是指的是a数组中的第二个元素,即数组中的第二个元素,即a的第二行的地的

27、第二行的地址。址。q而而*(a+1)指的是第二行第一个元素的地址,因此指的是第二行第一个元素的地址,因此*(a+1)+2是是第二行第三个元素的地址,第二行第三个元素的地址,*(*(a+1)+2)是第二行第三个元是第二行第三个元素的值。素的值。nintc(int*x,int*y)q定义了一个函数定义了一个函数c,形式参数为,形式参数为x和和y,均为整型指针类型,均为整型指针类型,在调用函数在调用函数c时,可以用数组名作为实际参数,也可以用指时,可以用数组名作为实际参数,也可以用指针作为实际参数。针作为实际参数。指针要点指针要点nint*p;qp是一个整型指针。是一个整型指针。qscanf(“%d

28、”,p);q运行错误,因为运行错误,因为p这个指针,不知道指向哪儿。这个指针,不知道指向哪儿。q两种方法:两种方法:1、inta;p=&a;scanf(“%d”,p);q2、动态分配:、动态分配:p=(int*)malloc(sizeof(int);scanf(“%d”,p);n即:使用指针时一定要注意指针指向哪个变量即:使用指针时一定要注意指针指向哪个变量或者哪块内存。如果没有令该指针指向一块内或者哪块内存。如果没有令该指针指向一块内存,则无法访问该指针所指向的变量的值,即存,则无法访问该指针所指向的变量的值,即*p。数组与指针的实质数组与指针的实质n看见指针看见指针p或者数组或者数组a就要

29、知道是就要知道是一个地址,与普通变一个地址,与普通变量量不同。不同。n字符数组与字符指针:字符数组与字符指针:chara20;char*p=“Programming”;qa不能改变自身的值。不能改变自身的值。qp指向一个字符串常量,无法通过指向一个字符串常量,无法通过*p修改修改p指向的字符串常量指向的字符串常量的值。的值。q即:允许即:允许a0=Q;或者或者*a=Q;不允许不允许charb20;a=b;q即:允许即:允许p=a;不允许不允许*p=Q;或者或者p0=Q;n为何普通变量作为函数参数时不能改变主调函数中形为何普通变量作为函数参数时不能改变主调函数中形式参数的值?而指针或者数组就可以

30、呢?式参数的值?而指针或者数组就可以呢?例例14:下面程序的运行结果是(:下面程序的运行结果是()。)。voidswap(int*a,int*b)int*t;t=a;a=b;b=t;intmain()intx=3,y=5,*p=&x,*q=&y;swap(p,q);printf(%d,%dn,*p,*q);A.3,5B.5,3C.3,3D.5,5A例例15:以下程序的输出结果是:以下程序的输出结果是#include#includeintprintlength(inta)printf(%dn,sizeof(a);return0;intprintlength2(char*a)printf(%dn,

31、strlen(a);return0;intmain()inta10;char*b=helloworld;printlength(a);printlength2(b);411n下列程序段的输出结果为(下列程序段的输出结果为()。)。ninta=6,7,8,9,10,*ptr=a;n*(ptr+2)+=2;nprintf(%d,%dn,*ptr,*(ptr+2);nA.8,10B.6,8nC.7,9D.6,10nD例例16:例例17:设以下程序生成可执行文件:设以下程序生成可执行文件test.exe,当键入,当键入test C Programming Exam后的输出结果是?后的输出结果是?#in

32、clude int main (int argc, char *argv) int i; printf(%d, argc); for (i = 0; i next=head?n输出结果:输出结果:head-numheadhead涉及到的几种链表操作涉及到的几种链表操作n构造链表构造链表n删除链表节点删除链表节点n插入链表节点插入链表节点n遍历链表节点遍历链表节点构造链表构造链表nn=7n一个循环,总共循环一个循环,总共循环7次,每次构造一个节点,次,每次构造一个节点,并将新构造的节点插入到链表的最后并将新构造的节点插入到链表的最后while(i=0;inext=p;q=p;6 6nextnex

33、t 5 5nextnext qp构造链表构造链表n用函数实现,参数为用函数实现,参数为人数人数n,返回值为,返回值为structperson*struct person *constructlink(int n) struct person *p=NULL, *q=NULL, *head; for(i=0; inum=i+1; if(NULL!=q) q-next=p; else head=p; q=p; q-next=head; return head;删除链表节点删除链表节点n删除删除p节点,让节点,让q的的next指向指向rq-next=r;free(p);6 6nextnext 5 5

34、nextnext qp7 7nextnext r5 5nextnext q7 7nextnext rq-next=p-next;free(p);删除链表节点删除链表节点n用函数实现,参数为用函数实现,参数为structperson*p:需要删:需要删除的节点;除的节点;structperson*q:p的前一个节点;的前一个节点;返回值返回值voidvoid deletenode(struct person *p, struct person *q)q-next=p-next;free(p);return;遍历链表节点遍历链表节点n用函数实现,参数为用函数实现,参数为structperson*p

35、;返回值;返回值voidvoid printlink(struct person *head)struct person *p=head;doprintf(%4d, p-num);p=p-next;while(p!=head);return;int main()struct person *head, *s;int n, m, k, count=0, i;printf(input the number n,m,k:);scanf(%d %d %d,&n, &m, &k);head = constructlink(n);printlink(head);for (i=0;inext;docount

36、+;if(count=k-1)s=head-next;deletenode(s, head);count=0;head=head-next;while(head-next!=head);printf( the king is: %4d ,head-num);free(head);要点十三:编译预处理要点十三:编译预处理n编译预处理的目的、意义编译预处理的目的、意义n常用的编译预处理常用的编译预处理q#defineq#includeq#ifdef#else#endifn类型定义及其使用类型定义及其使用qtypedefn有如下程序段,运行之后的输出结果是有如下程序段,运行之后的输出结果是n#definesquare(x)x*xnintx=2,y=3;nprintf(“%d”,square(x+y);nA.25B.11nC.10D.15nB例例19:例例20:以下对结构体类型变量的定义中以下对结构体类型变量的定义中,不正确的不正确的是是A.typedefstructaaintn;floatm;AA;AAtd1;B.structintn;floatm;aa;structaatd1;C.#defineAAstructaaAAint n;floatm;td1;D.structint n;floatm;td1;BQ & A!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

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