当前位置首页 > 计算机 > 编程与开发语言
搜柄,搜必应! 快速导航 | 使用教程

AVR单片机C语言编程--课件

文档格式:PPT| 99 页|大小 1.05MB|2024-12-13 发布|举报 | 版权申诉
第1页
第2页
第3页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 99
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,ppt课件,*,单击此处编辑母版标题样式,*,,,,,,,,,,,,,,,,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,ppt课件,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,机电系统控制电路设计,*,,,,,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,机电系统控制电路设计,*,机电系统控制电路设计,张志安,南京理工大学,1,ppt课件,机电系统控制电路设计张志安南京理工大学1ppt课件,1 C,语言基础,2,数据类型、运算符和表达式,3,程序控制语句,4,函数及其调用,5,编译预处理,6,数组及指针,AVR,单片机,C,语言编程基础,2,ppt课件,1 C语言基础AVR单片机C语言编程基础2ppt课件,1 C,语言基础,例子,1,,3,ppt课件,1 C语言基础例子 1 3ppt课件,例子,2,1 C,语言基础,4,ppt课件,例子 2 1 C语言基础4ppt课件,1 C,语言基础,例子,3,,5,ppt课件,1 C语言基础例子 3 5ppt课件,1 C,语言基础,/*,给定半径,求圆的面积*,/,#define PI 3.14159 /*,编译预处理,——,宏替换*,/,#include /*,编译预处理,——,文件包含*,/,#include /*,编译预处理,——,文件包含*,/,main( ) /*,主函数*,/,{,float r,s; /*,定义变量,r,、,s,类型为单精度实型*,/,,r =1.0; /*,变量,r,赋初值*,/,s=PI * pow(r,2); /*,计算圆面积,s*/,printf (",半径,R=%f,时,面积,S=%f \n",r,s); /*,输出结果*,/,},例,4,求圆面积程序,,area.c,6,ppt课件,1 C语言基础/*给定半径,求圆的面积*/例 4 求圆面积,关于编译预处理(宏定义),1 C,语言基础,#define PI 3.14159 ---,不带参数,#define S(a,b) a*b---,带参数,,#define —,宏定义命令,,PI —,符号常量(宏名,最好用大写,以区别一般变量),,3.14159 —,宏体(可以是一个表达式,如,3+4,),作用:用简单符号代表宏体部份内容(编译时会先自动替换),意义:直观,/,多次使用,/,便于修改,注意:,#define,可出现在程序的任一位置,(作用范围:由此行到程序末尾),宏定义不是,C,语句,不必在行未加分号,否则会连分号一起置换。

    7,ppt课件,关于编译预处理(宏定义)1 C语言基础#define PI,1 C,语言基础,#include ,stdio.h——“,头文件”(标准前导文件),C,语言是一种“装配式”语言,许多常规的工作如输入、输出、数学函数等,往往事先由人做成各种“程序模块”,(,库函数,),,存放在各种所谓“头文件”(,.h,)中使用时只需进行以下处理,—,#include “,头文件名” 或,#include <,头文件名,>,在程序的执行部分调用该库函数:函数名(参数),文件包含的作用,就是根据需要把相应的某个“头文件”的内容在编译时先整体嵌入所编的程序中用户也可以将自己设计的程序模块等做成“头文件”,供其他程序“包含”关于编译预处理(文件包含),8,ppt课件,1 C语言基础#include 关于编译,1 C,语言基础,标识符被,#define,命令定义过,#ifdef,标识符,,程序段,1,#else,,程序段,2,#endif,,关于编译预处理(条件编译),标识符未被,#define,命令定义过,#ifndef,标识符,,程序段,1,#else,,程序段,2,#endif,,#if,表达式,----,表达式真执行程序段,1,,假执行程序段,2,,程序段,1,#else,,程序段,2,#endif,,9,ppt课件,1 C语言基础标识符被#define 命令定义过关于编译预处,1 C,语言基础,,关于主函数,,,main( ) {……},C,语言是一种函数式语言,它的一个函数实际上就是一个功能模块,——C,程序的基本组成是函数。

    一个,C,程序是由一个固定名称为,main,的主函数和若干个其他函数(可没有)组成一个,C,程序必须有一个、也只能有一个主函数主函数在程序中的位置可以任意,但程序执行时总是从主函数开始,在主函数内结束主函数可以调用其他各种函数(包括用户自己编写的),但其他函数不能调用主函数10,ppt课件,1 C语言基础 关于主函数 mai,主函数的一般形式:,main( ) {,,说明部分程序段(定义数据类型),执行部分程序段(给出操作指令),},说明部分(简单程序可能没有此部分),:,,float r,s;,/*,定义变量,r,、,s,类型为单精度实型*,/,int a,b;,/*,定义变量,a,、,b,类型为整型*,/,执行部份:输入、赋值、计算、控制、输出等,:,,r=1.0;,/*,变量,r,赋初值*,/,s=PI,*,pow(r,2);,/*,计算圆面积,s*/,printf(",半径,R=%f,时,面积,S=%f \n",r,s);,/*,输出结果*,/,1 C,语言基础,11,ppt课件,主函数的一般形式:main( ) {说明部分(简单程序可能没,其他函数,标准库函数,——,只能调用 。

    使用方法:,⒈先“包含”,即将该函数所在头文件包含在程序中⒉后调用调用方式:函数名(参数),例:,#include ,#include ,main( ),,{,,……,,s=PI,*,pow(r,2);,,……,,,printf(“,半径,R=%f,时,面积,S=%f\n”,r,s);,},说明:,pow(x,y),求,x,y,,(,math.h,中的标准数学函数),,printf(……); (stdio.h,中的标准输出函数,),,,1 C,语言基础,12,ppt课件,其他函数标准库函数——只能调用 使用方法: 例: #in,其他函数,自编(定义)函数:,⒈ 先定义(规定函数类型、函数名和函数功能),⒉ 后调用(使用所定义的函数实现其功能),,定义函数:,函数类型 函数名(形式参数),,{,(函数体),},,调用函数:,函数名(参数),求三个数的平均值,float average ( float x, float y, float z) /*,定义函数,average( )*/,{,float aver;,aver=(x+y+z)/3;,return(aver);,},main( ) /*,主函数*,/,{ float a,b,c,ave;,a=3.5;b =4.6;c =7.9;,ave=average(a,b,c); /*,调用自定义函数,average( )*/ printf(,",average=%f,",,ave);,},1 C,语言基础,13,ppt课件,其他函数自编(定义)函数: 求三个数的平均值1 C语言基础1,关于语句:,,①数据类型定义语句,语句形式,,变量类型关键字,,变量名;,,float,,r,s;,,定义,r,、,s,为单精度实型变量,,,int,,r,s;,,定义,r,、,s,为整型变量,【,注意,】,在,C,语言程序中,,,所有变量都要先定义后使用,否则就会出现编译错误提示,如:,Error:,,Undefined symbol ‘ a’ in function main,,Let’s try,…,变量类型关键字,字符型(描述文字性的数据),char,,数值型,:,,■,整型(在机内是准确表示的,),,,int,,■,实型(在机内一般是近似表示的,),,float,(,有效数字,6,位),,double,(,有效数字,16,位,),变量名,,C,语言,标识符,(变量名、符号常量名、函数名等)命名:,■组成:字母、数字、下划线,■开头:字母、下划线,■长度:≤,32,字符,【,注意,】,大小写为不同字符(变量名一般小写,符号常,量 名一般大写),还要注意不得与,关键字,同名。

    1 C,语言基础,14,ppt课件,关于语句: ①数据类型定义语句语句形式 变量类型,关于语句:,②赋值语句,作用:使变量获得具体的运算值语句形式,,变量名,=,表达式,(常量、变量、函数、算式及其混合);,,r,=,1.0,;,,/*,变量,r,赋初值*,/,,s,=,PI*pow(r,2),;,,/*,计算圆面积,s*/,变量赋初值亦可在数据类型定义时进行:,,float r =1.0, s;,,把变量声明语句与赋值结合在一起的语句,术语上称为 “初始化语句”1 C,语言基础,15,ppt课件,关于语句: ②赋值语句作用:使变量获得具体的运算值1 C,关于语句:,,③输出语句,作用:将运算结果送到显示器屏幕显示出来,语句形式,printf,(,……,),;,,printf,(,",半径,R=%f,时,面积,S=%f\n",r,s,);,,printf,(,“Hello,everyone!”,);,【,注意,】C,语言本身没有输入、输出语句,其功能要借用有关函数来实现f —,格式字符串,,\n —,控制字符(转义字符),\n,表示回车换行,,引号中的其他部分照原样输出,1 C,语言基础,16,ppt课件,关于语句: ③输出语句作用:将运算结果送到显示器屏幕显示出,关于格式字符串,表示该处将用,printf,语句引号外对应表达式的值替换后输出,例:若,r =1,s=3.14,,printf,(“,半径,R=%f,时,面积,S=%f\n”,r,s);,,输出结果:,半径,R=1,时,面积,S=3.140000,常用格式字符串:,字符型:,%c,,单字符,,%s,,字符串,数值型:,%d,,整数(十进制),,%f,,实数(小数形式,默认为,6,位小数),例一,,int x = 5;,f loat y =3;,printf ("a=%d,b=%f,c=%s",x,y, "abcdefg");,输出结果:,,a=5,b=3.000000,c=abcdefg,例二,,int x = 5;,f loat y =3;,printf ("a=%d,b=%f,c=%s",x+2,y*3, "123defg");,输出结果:,,a=7,b=9.000000,c=123defg,1 C,语言基础,17,ppt课件,关于格式字符串表示该处将用printf语句引号外对应表达式的,C,语言程序的基本结构,一个,C,程序是由一个固定名称为,main,的主函数和若干个其他函数(可缺省)组成。

    其,基本结构,一般形式如右图所示编译预处理部分,(,可选,),main( ),{,说明部分,/*,变量定义等*,/,执行部分,/*,输入,/,输出,/,计算*,/,,},,其他函数,(,可选,位置任意,),1 C,语言基础,返回,18,ppt课件,C语言程序的基本结构 一个C程序是由一个固定名称为main的,2,数据类型、运算符和表达式,19,ppt课件,2 数据类型、运算符和表达式19ppt课件,2,数据类型、运算符和表达式,20,ppt课件,2 数据类型、运算符和表达式20ppt课件,2,数据类型、运算符和表达式,,可知对不同数据类型占用的存储空间,:,,char = <= == !=,关系表达式: 含有关系运算符的表达式,特别注意,,a≤X≤b,之类算式的正确写法 :,,a<=x && x<=b,(错误写法:,a<=X<=b,),【,例一,】,main( ),{,int m=5;,if (m++>5),printf(“m>5”);,else,{,printf(“m=%d,”,,m--);,printf(“m=%d”,m--);,},},运算结果,:,,m=6,m=5,【,例二,】,main( ),{,int m=5;,if (++m>5),printf(“m>5”);,else,{,printf(“m=%d,”,,m--);,printf(“m=%d”,m--);,},},运算结果,:,,m,>,5,26,ppt课件,2 数据类型、运算符和表达式运算符③关系运算(比较运算),2,数据类型、运算符和表达式,运算符,④逻辑运算,,&&,(与运算符) 运算符两边均为真时,结果为真,,||,(或运算符) 运算符两边均为假时,结果为假,!(非运算符) 将运算符右边真假倒置,逻辑运算符的任一端如果为非,0,数,则视为“真”,为,0,则视为假。

    例,】 printf(“%d”, !3+5),结果为,5,printf(“%d”, !0+5),结果为,6,注意:,!,优先于关系运算符,与,++,、,--,同级例一,】,,main( ),{,int a=1,b=2,m=2,n=2;,(m=a>b),printf("%d\n",n);,},运行结果:,n=2,【,例二,】,main( ),{,int a=1,b=2,m=2,n=2;,(m=b>a),printf("%d\n",n);,},运行结果:,n=3,原因:,在,&&,和,||,的左边如果能判断出结果,则右边不再作运算结论:,在逻辑表达式的求解中,并不是所有的逻辑运算符都会被执行只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符27,ppt课件,2 数据类型、运算符和表达式运算符④逻辑运算 【例一】运行结,2,数据类型、运算符和表达式,运算符,⑤条件运算,,,…,?,… : …,,(三元运算符,即需连接三个运算量),一般形式:,,,e1,?,e2:e3,,(,e1,为条件表达式,,e2,e3,为任意类型表达式),功能:,如果,e1≠0,(为真),运算结果为,e2,的值。

    如果,e1=0,(为假),则取,e3,的值例,】,分别令,x=3,x=0,x= -5,,求运行结果main( ),{ int x,y;,printf(“Input x=”);,scanf(“%d”,,y=x>0?1:x<0?-1:0;,/*,结合方向:由右向左*,/,printf(“x=%d,y=%d\n”,x,y);,},结果:,x=3,y=1,x=0,y=0,x=-5,y=-1,,1,(x>0),,y= 0,(x=0),,-1,(x<0),,28,ppt课件,2 数据类型、运算符和表达式运算符⑤条件运算 【例】分别令,2,数据类型、运算符和表达式,运算符,⑥位操作运算符,,,&,(,与,AND),|,(或,OR,),^,(异或,XOR,),,~,(非,NOT,),,,<<,(左移),>>,(右移),29,ppt课件,2 数据类型、运算符和表达式运算符⑥位操作运算符 29pp,2,数据类型、运算符和表达式,运算符的优先级,返回,30,ppt课件,2 数据类型、运算符和表达式运算符的优先级返回30ppt课件,3,程序控制语句,条件控制语句,if,语句,1,、简单,if,语句,if,(,表达式,),{,程序段,},下面程序的功能是:,如果输入的数据大于等于,60,,则输出,You are passed!,:,scanf(“%d”,,if,(,x>=60,),{,,printf(“You are passed!\n”);,},31,ppt课件,3 程序控制语句条件控制语句if语句1、简单if语句 31p,3,程序控制语句,条件控制语句,2,、,if-else,语句,if(,表达式,),{,,程序段,,},else,{,,程序段,},如果输入的数据大于等于,60,,则输出,You are passed!,否则输出,You failed!,scanf(,“,%d,”,,,if(x>=60),{,,printf(,“,You are passed!\n,”,);,},else,{,printf(,“,You failed!\n,”,);,},if,语句,32,ppt课件,3 程序控制语句条件控制语句2、if-else语句如果输入的,3,程序控制语句,条件控制语句,#include ,main(),{,int x,y=100,z=0;,x=180;,if(x0&&x<=10),{,printf(“[0..10]\n");,},else,if(x>10&&x<=20),{,printf(“,[,,10..20]\n");,},else,{,printf("error\n");,},if,语句,34,ppt课件,3 程序控制语句条件控制语句第3种if语句if(x>0&&x,3,程序控制语句,条件控制语句,switch,语句,switch(,变量或表达式,P,),{,case,常量表达式,C1,:程序段,S1,,break;,case,常量表达式,C2,:程序段,S2,,break;,…….,case,常量表达式,Cn,:程序段,Sn,,break;,default,: 程序段,Sn+1,,break;,},35,ppt课件,3 程序控制语句条件控制语句switch语句switch(变,#include ,main(),{,char ch;,printf("input the mark(A,B,C,D,E or F)");,scanf("%c",,switch(,ch,),{,case ',A,':printf("100\n"); break;,case ',B,':printf("90\n"); break;,case ',C,':printf("80\n"); break;,case ',D,':printf("70\n"); break;,case ',E,':printf("60\n"); break;,case ',F,':printf("50\n"); break;,default:printf("input error!\n");,},},3,程序控制语句,条件控制语句,switch,语句,运行结果,:,input the mark(A,B,C,D,E or F),D,70,36,ppt课件,#include 3 程序控制语句条件控,,break,子句可以省略,但是否省略,break,子句,要根据算法的逻辑而定。

    因为没有了,break,语句,,switch,语句会被执行到语句结束3,程序控制语句,条件控制语句,switch,语句,char ch=‘N’;,switch(ch),{,case 'Y':printf("Yes\n");,break;,case 'N':printf("No\n");,,,break;,case 'A':printf("All\n");,break;,},char ch=‘N’;,switch(ch),{,case 'Y':printf("Yes\n");,break;,case 'N':printf("No\n");,,case 'A':printf("All\n");,break;,},输出:,No,输出:,No,All,37,ppt课件,break子句可以省略,但是否省略break子句,3,程序控制语句,循环控制语句,while,语句,while,语句的形式:,while,(,表达式,P,),{,程序段,S,},,int a;,long sum;//sum should be long type,sum=0;,a=1;,while(a<=100),{,sum+=a;,a++;,},printf("1+2+...+%d=%ld\n",100,sum);,while,语句的例子:计算,1+2+3+,…,+100,的值,,通常情况下,程序中会利用,一个,变量,来,控制,while,语句的表,达式,P,的值,这个变量被称为,循,环控制变量,。

    在执行,while,语句,之前,循环控制变量,必须初始化,,否则执行的结果将是不可预知的上面的程序重新编写,其运行结果将是不可预知的,因为,a,未初始化:,,int a;,long sum;//sum should be long type,sum=0;,,//a should be initialized here,,,while(a<=100),{,sum+=a;,a++;,},printf("1+2+...+%d=%ld\n",100,sum);,38,ppt课件,3 程序控制语句循环控制语句while语句while语句的形,3,程序控制语句,循环控制语句,while,语句,有关,while,语句的几点说明,1,、要在,while,语句的某处(表达式,P,或循环体内)改变循环控制变量的值,否则极易构成,死循环,下面的,while,语句便是死循环:,x=2;,while(x<10),{//,死循环,因为,x,的值没有变化,永远小于,10,sum+=x;,},printf(“%ld”,sum);,39,ppt课件,3 程序控制语句循环控制语句while语句有关while语句,3,程序控制语句,循环控制语句,while,语句,有关,while,语句的几点说明,2,、如果在执行循环体过程中,遇到了,break,子句,则跳出,while,循环。

    比如,上面求,1+2+…+100,的程序可以这样设计:,a=1;,sum=0;,while(1),{,if(a>100)break;,sum+=a;,a++;,},40,ppt课件,3 程序控制语句循环控制语句while语句有关while语句,3,程序控制语句,循环控制语句,while,语句,有关,while,语句的几点说明,3,、如果在执行循环体过程中,遇到了,continue,语句,则循环体中,continue,语句后面的其他语句将被跳过,而直接进入下一轮循环a=1;,while(a<=10),{,printf("%d",a);,a++;,if(a%5==1),continue;,printf("*");,},运行结果:,12,*3*4*5*,67,*8*9*10,41,ppt课件,3 程序控制语句循环控制语句while语句有关while语句,3,程序控制语句,循环控制语句,do-while,语句,do-while,语句的形式:,do,{,,程序段,S,},while(,表达式,P);,do-while,语句的例子:计算,1+2+3+,…,+100,的值,,int a;,long sum;,sum=0;,a=1;,,do,{,,,sum+=a;,a++;,,},while(a<=100);,,printf("1+2+...+%d=%ld\n",100,sum);,,,do-while,语句与,while,语句大体相同,但要特别注意,,while( ),后面的分号不要漏掉。

    此外,,while,语句的循环体可能永远不被执行,但,do-while,语句的循环体至少被执行一次42,ppt课件,3 程序控制语句循环控制语句do-while语句do-whi,3,程序控制语句,循环控制语句,for,语句,for,语句的形式:,必须是分号 必须是分号,↓ ↓,for,(,表达式,1,,;,,表达式,2,,;,,表达式,3,),{,,程序段,S,},,43,ppt课件,3 程序控制语句循环控制语句for语句for语句的形式: 4,3,程序控制语句,循环控制语句,for,语句,,int a;,long sum;,sum=0;,,for,(,a=1,;,a<=100,;,a++,),{,,sum+=a;,},printf("1+2+...+%d=%ld\n",100,sum);,for,语句的例子:用,for,语句实现,1+2+…+100,求和,44,ppt课件,3 程序控制语句循环控制语句for语句 int a; for,3,程序控制语句,三种循环控制语句的比较,在使用,while,和,do-while,语句时,循环控制变量的变化必须放在循环体内而,for,语句却可以利用表达式,3,来改变循环控制变量的值。

    在使用,while,和,do-while,语句时,必须在,while,或,do-while,语句前初始化循环控制变量但,for,语句却可以利用表达式,1,来初始化循环控制变量do-while,语句的循环体至少被执行一次,但,while,语句和,for,语句的循环体可能一次也执行不到while,语句和,do-while,语句中不能省略循环条件(即表达式,P,),但,for,语句却可以省略循环条件(即表达式,2,)break,语句和,continue,语句在这,3,种循环语句中的作用是相同的凡是用,while,语句能实现的循环,必然能用,for,语句实现,反过来也一样45,ppt课件,3 程序控制语句三种循环控制语句的比较在使用while和do,3,程序控制语句,三种循环控制语句的选用及循环嵌套,返回,46,ppt课件,3 程序控制语句三种循环控制语句的选用及循环嵌套返回46pp,4,函数及其调用,C,语言的函数是,子程序,的总称,,包括函数和过程有返回值,、,无返回值,,,有参函数,,,无参函数,)C,语言函数可以分为,库函数,、用户,自定义函数,库函数由系统提供,程序员只需要使用(,调用,),用户自定义函数需要程序员,自己编制,。

    C,语言的程序由,函数,组成,函数是,C,语言程序的,基本单位47,ppt课件,4 函数及其调用C语言的函数是子程序的总称,包括函数和过程4,函数及其调用,C,语言程序的,结构如图,所示在每个程序中,,主函数,main,是必须的,它是所有程序的,执行起点,,,main,函数,只调用,其它函数,不能为其它函数调用其它函数,没有,主从关系,可以,相互调用,所有函数都可以调用,库函数,程序的总体功能通过,函数的调用,来实现f11( ),{…},f11( ),{…},f31( ),{…},f1( ),{…,f11( );,…},f2( ),{…,f11( );,f22( );,…},main( ),{…,f1( );,…,f2( );,…},48,ppt课件,4 函数及其调用C语言程序的结构如图所示在每个程序中,主函,4,函数及其调用,函数应当,先定义,,,后调用,,函数定义的一般形式,函数返回值的数据类型,,函数名,(,类型名 变量名,1,,,,类型名 变量名,2,,,……,),,{,声明部分,//,定义本函数所使用的变量和进行有关声明(,如函数声明,),处理语句,//,程序段,由若干条语句组成(可以在其中,调用其它函数,),,},【,注意,】,无形参表的即无参函数。

    无函数体的为“空函数”如果函数返回值的数据类型为,int,,可以省略之如果不返回值,定义为,void,类型49,ppt课件,4 函数及其调用函数应当先定义,后调用 49ppt课件,4,函数及其调用,函数定义举例:,main(),{ int n1,n2,n3,nmax;,scanf(“%d%d%d”,,if(n1>n2),nmax=n1;,else nmax=n2;,if(n3>nmax),nmax=n3;,printf(“max=%d\n”,,,nmax);,},,输入三个整数,求三个整数中的最大值,不使用函数,(,除,main,外,),int max(int,int,int);,main(),{ int n1,n2,n3,nmax;,scanf(“%d%d%d”,,nmax=max(n1,n2,n3);,printf(“max=%d\n “,nmax);,},int max(int x,int y,int z),{ int m;,if(x>y),m=x;,else,m=y;,if(z>m)m=z;,return m;,},输入三个整数,求三个整数中的最大值,使用函数,子函数定义,50,ppt课件,4 函数及其调用函数定义举例:输入三个整数,求三个整数中的最,形式参数与实际参数,,1,、,形式参数,(形参):函数定义时设定的参数。

    前例中,函数头,int max(int x,int y,int z),中,x,y,z,就是形参,它们的类型都是整型2,、,实际参数,(实参):调用函数时所使用的实际的参数前例中,主函数中调用,max,函数的语句是:,nmax=max(n1,n2,n3);,其中,n1,n2,n3,就是实参,它们的类型都是整型关于形参和实参的说明:,a,、形参只有当调用时才临时分配存储单元b,、实参一定要有确定的值,可以是表达式c,、实参和形参的类型应相同或赋值相容4,函数及其调用,51,ppt课件,形式参数与实际参数 4 函数及其调用51ppt课件,4,函数及其调用,形式参数与实际参数,,52,ppt课件,4 函数及其调用形式参数与实际参数 52ppt课件,4,函数及其调用,函数的返回值,C,语言可以从函数(被调用函数)返回值给调用函数(这与数学函数相当类似)在函数内是通过,return,语句返回值的函数可以使用一个或者多个,return,语句返回值也可以不返回值(此时函数类型是,void,)return,语句的格式:,,return,[,表达式,],;或,return,,(表达式),;,说明:,函数的类型就是返回值的类型,,return,语句中表达式的类型应该与函数类型一致。

    如果不一致,以,函数类型,为准(赋值转化)53,ppt课件,4 函数及其调用函数的返回值C语言可以从函数(被调用函数)返,4,函数及其调用,局部变量,,概念:,是指在一定范围内有效的变量C,语言中,在以下各位置定义的变量均属于局部变量在函数体内定义的变量:,在本函数范围内有效,作用域局限于函数体内在复合语句内定义的变量:,在本复合语句范围内有效,作用域局限于复合语句内有参函数的形式参数也是局部变量:,只在其所在的函数范围内有效54,ppt课件,4 函数及其调用 局部变量54ppt课件,4,函数及其调用,全局变量,,全局变量:,在函数之外定义的变量所有函数前,各个函数之间,所有函数后),,全局变量作用域:,从定义全局变量的位置起到本源程序结束为止在引用全局变量时如果使用,“,extern,”,声明全局变量,可以扩大全局变量的作用域例如,扩大到整个源文件(模块),对于多源文件(模块)可以扩大到其它源文件(模块)全局变量和局部变量同名的,“,屏蔽,”,55,ppt课件,4 函数及其调用 全局变量55ppt课件,4,函数及其调用,全局变量和局部变量的应用,局部变量,输出结果,count is 100,56,ppt课件,4 函数及其调用全局变量和局部变量的应用局部变量输出结果56,4,函数及其调用,变量,(局部,/,全局)两大属性:,·,数据类型,,·,存储类别,1,、,数据类型(复习),通过变量说明(定义)来规定其数据类型:,,格式,数据类型关键字 变量名,如,char a;,int b,c ;,float x,y;,,为什么使用变量前要先对其数据类型进行“说明”,——,好比看电影前先买票订座,,◆,预留存储空间(如,char,型为,1,个字节,,int,型为,2,个字节,…,),,◆,确定存储方式(如,char,型存放,ASCII,值,,int,型存放补码值,…,),57,ppt课件,4 函数及其调用变量(局部/全局)两大属性: ·数据类型,变量,(局部,/,全局)两大属性:,·,数据类型,,·,存储类别,4,函数及其调用,2,、存储类别,规定了变量在计算机内部的存放位置→决定变量的“寿命”(何时“生”,何时“灭”),一个完整的变量说明格式如下:,,存储类别 数据类型 变量名,如,static int x , y ;,C,程序的存储类别有:,,■,register,型,(寄存器型),■,auto,型,(自动变量型),■,static,型,(静态变量型),■,extern,型,(外部变量型),58,ppt课件,变量(局部/全局)两大属性: ·数据类型 ·存储类别4,C,程序的变量存储位置,4,函数及其调用,变量的生存期,,静态存储区中的变量:,与程序,“,共存亡,”,动态存储区中的变量:,与函数,“,共存亡,”,寄存器中的变量:,同静态存储区,59,ppt课件,C程序的变量存储位置4 函数及其调用变量的生存期59ppt课,4,函数及其调用,C,程序的变量存储类别,■,register,型(寄存器型),变量值存放在运算器的,寄存器,中,——,存取速度快,一般只允许存,2,~,3,个变量,且限于,char,型和,int,型,通常用于循环变量。

    ■,auto,型(自动变量型),变量值存放在主存储器的,动态存储区,(堆栈方式);,优点,——,同一内存区可被不同变量反复使用以上两种变量均属于“,动态存储型,”,即调用函数时才为这些变量分配单元,函数调用结束其值自动消失60,ppt课件,4 函数及其调用C程序的变量存储类别■ register型(,4,函数及其调用,C,程序的变量存储类别,■,static,型(静态变量型),变量值存放在主存储器的,静态存储区,程序执行开始至结束,始终占用该存储空间,■,extern,型(外部变量型),同上,其值可供其他源文件使用,以上两种均属于“,静态存储,”性质,即从变量定义处开始,在整个程序执行期间其值都存在,(≠都可用,!!,),61,ppt课件,4 函数及其调用C程序的变量存储类别■ static型(静态,4,函数及其调用,,auto,(默认) 所在函数调用结束时,其值自动消失,局部变量,,,register,,如不赋初值,取不确定值为初值,,static,,所有函数调用结束,其值仍保留,如不赋初值,取初值为,0,(数值型)或空字符,’,\0’,(字符型),,,extern,(默认)允许本源文件中其他函数及其他,全局变量,源文件使用,,static,,只限本源文件中使用,,62,ppt课件,4 函数及其调用,4,函数及其调用,求程序运行结果,main(),{,int a=2,i;,,clrscr( );//,清楚屏幕,内部函数,for (i=0;i<3;i++),printf("%4d",f(a));,},f(int a),{,int b=0;,static int c=3;,b++;c++;,return a+b+c;,},变量跟踪,,main,( ),f,函数,,a i,b,,c,f(a),2 0 0→1 4 7,1 0→1 5 8,2 0→1 6 9,,【,结果,】 7 8 9,如果去掉,static,呢?,【,结果,】 7 7 7,63,ppt课件,4 函数及其调用求程序运行结果main()变量跟踪如果去掉s,4,函数及其调用,求程序运行结果,main(),{,int k=4,m=1,p;,clrscr();,p=func(k,m);,printf("%d,",p);,p=func(k,m);,printf("%d",p);,},func(int a,int b),{ static int m=0,i=2;,i+=m+1;,m=i+a+b;,return m;,},变量跟踪,,main,( ),func,函数,,k m,,a b m i,4 1 4 1 0→8 2→3,4 1 4 1 8→17 3→12,,【,结果,】 8, 17,如果去掉,static,呢?,【,结果,】 8, 8,64,ppt课件,4 函数及其调用求程序运行结果main()变量跟踪如果去掉s,4,函数及其调用,求程序运行结果,#include ,main(),{,int a=3, b=2, c=1; //,注意应用范围,{,int b=5, c=12;//,注意应用范围,c-=b*2;,printf("a=%d,b=%d,c=%d\n", a, b, c);,a+=c;,},printf("a=%d,b=%d,c=%d\n", a, b, c);,},【,结果,】,a=3,b=5,c=2,a=5,b=2,c=1,65,ppt课件,4 函数及其调用求程序运行结果#include b?a:b;,return c;,},,main(),{,int a=8;,printf("%d\n",max(a,b));,},求程序运行结果,【,结果,】 8,如果主函数中没有,int a=8,,,结果?,,【,结果,】 5,如果让主函数中,int a=4,或,a=-1,,结果?,【,结果,】,均为,,5,66,ppt课件,4 函数及其调用int a=3,b=5;求程序运行结果【结果,4,函数及其调用,求程序运行结果,void num(),{ extern int x,y;,int a=15,b=10;,x=a-b;,y=a+b;,},int x,y;,main(),{ int a=7,b=5;,x=a+b;,y=a-b;,num();,printf("%d,%d\n",x,y);,},【,结果,】 5,,,25,如果第二行不加上,extern,呢?,【,结果,】 12,,,2,67,ppt课件,4 函数及其调用求程序运行结果void num()【结果】,4,函数及其调用,求程序运行结果,int a=0;,,fun(int i),{,a+=2,*,i;,return a;,},,main(),{,int a=10;,clrscr( );,printf("%d,%d\n",fun(a),a);,},【,结果,】 20,,,10,返回,68,ppt课件,4 函数及其调用求程序运行结果int a=0;【结果】 20,5,编译预处理,预处理,在编译之前对源程序进行“预处理”,预处理命令不是,C,语句,末尾没有分号,预处理命令不在可执行文件中执行,预处理命令都以,#,开始,包括,宏定义,、,文件包含,、,条件编译,等,举例,#define MAX 1000,#include ,69,ppt课件,5 编译预处理预处理69ppt课件,宏,(Macro),定义,5,编译预处理,无参数的宏定义,,带参数的宏定义,70,ppt课件,宏(Macro)定义5 编译预处理无参数的宏定义70ppt课,5,编译预处理,无参数的宏定义,一般形式,#define,,标识符,,字符串,说明,把源程序中相应标识符予以替换,仅是简单的字符串替换,没有任何语法正确性检查,有效范围从定义处开始,到文件结束,或者由,#undef,命令终止作用域,行末没有分号,如有分号将会被一起替换,#define R 3.0,#define PI 3.1415926,#define L 2*PI*R,#define begin {,#define end },#define forever for(;;),int main(),begin /* { */,printf("L=%f", L);,#undef PI /*,取消对,PI,的宏定义,*,/,forever; /* for(;;);,无限循环,*,/,end /* } */,71,ppt课件,5 编译预处理无参数的宏定义一般形式#define R 3,5,编译预处理,带参数的宏定义,一般形式,#define,,宏名,(,参数表,),,字符串,说明,宏定义仅是把参数作为字符串做简单替换,而不做任何运算求值和语法检查,宏名与参数表的括号之间不应有空格,应注意参数替换后可能出现的语法错误和意料之外的运算,应在宏定义内容及其中参数两边加上括号,#define S1(a,b) a*b,#define S2(a,b) ((a)*(b)),#define max(a,b) ((a)>(b)?(a),:(b)),int main(),{,int x=3, y=4, i=5, j=6, s, z;,s=S1(x+y, x-y);,/* s=x+y*x-y; s==11 */,s=S2(x+y, x-y);,/* s=((x+y)*(x-y)); s==-7 */,z=max(i++, j++);,,/* z=((i++)>(j++)?(i++),:(j++));,*/,,/* z==7, i==6, j==8 */,},,,72,ppt课件,5 编译预处理带参数的宏定义一般形式#define S1(a,5,编译预处理,文件包含,一般形式,#include "filename",#include ,说明,把另一个源文件的全部内容包含进来,预编译后,它们已成为一个文件,头文件的扩展名一般用,.h,,但并非规定,调用库函数一般使用,,,也可以使用,"",调用用户编写的头文件应使用,"",73,ppt课件,5 编译预处理文件包含一般形式73ppt课件,条件编译,5,编译预处理,条件编译,对某些部分的源程序指定编译的条件,可以减少被编译的语句,减少目标程序的长度,减少运行时间,有利于移植程序,增加程序的灵活性,命令形式,#ifdef...#else...#endif,#ifndef...#else...#endif,#if...#else...#endif,74,ppt课件,条件编译5 编译预处理条件编译74ppt课件,① 如果标识符被定义过*,,如果标识符未被定义过,,#ifdef,标识符,#ifndef,标识符,程序段,1,程序段,1,/*,编译此程序段*,/,#else #else,,/*#else,部分可省略*,/,,程序段,2,程序段,2,/*,反之,编译此程序段*,/,#endif #endif,,*,此处指标识符用,#define,等命令定义过,。

    条件编译,5,编译预处理,②,#i。

    点击阅读更多内容
    卖家[上传人]:7aehk
    资质:实名认证
    相关文档
    正为您匹配相似的精品文档