AVR单片机C语言编程_第1页
AVR单片机C语言编程_第2页
AVR单片机C语言编程_第3页
AVR单片机C语言编程_第4页
AVR单片机C语言编程_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

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

文档简介

1、.22022-2-26v 1 C语言基础语言基础v 2 数据类型、运算符和表达式数据类型、运算符和表达式v 3 程序控制语句程序控制语句v 4 函数及其调用函数及其调用v 5 编译预处理编译预处理v 6 数组及指针数组及指针.32022-2-26 .42022-2-26.52022-2-26 .62022-2-26/*给定半径,求圆的面积*/#define PI 3.14159 /*编译预处理宏替换*/#include /*编译预处理文件包含*/#include /*编译预处理文件包含*/main( ) /*主函数*/ float r,s; /*定义变量r、s类型为单精度实型*/ r =1.0

2、; /*变量r赋初值*/ s=PI * pow(r,2); /*计算圆面积s*/ printf (半径R=%f 时,面积S=%f n,r,s); /*输出结果*/例例 4 求圆面积程序求圆面积程序.72022-2-26v #define PI 3.14159 -不带参数 #define S(a,b) a*b-带参数 v #define 宏定义命令v PI 符号常量(宏名,最好用大写,以区别一般变量)v 3.14159 宏体(可以是一个表达式,如3+4)v 作用:用简单符号代表宏体部份内容(编译时会先自动替换)v 意义:直观/多次使用/便于修改v 注意: #define 可出现在程序的任一位置

3、(作用范围:由此行到程序末尾)v 宏定义不是C语句,不必在行未加分号,否则会连分号一起置换。 .82022-2-26v #include stdio.h“头文件”(标准前导文件)v C语言是一种“装配式”语言,许多常规的工作如输入、输出、数学函数等,往往事先由人做成各种“程序模块”(库函数),存放在各种所谓“头文件”(.h)中。使用时只需进行以下处理 #include “头文件名” 或 #include 在程序的执行部分调用该库函数:函数名(参数)v 文件包含的作用,就是根据需要把相应的某个“头文件”的内容在编译时先整体嵌入所编的程序中。v 用户也可以将自己设计的程序模块等做成“头文件”,供其

4、他程序“包含”。.92022-2-26标识符被#define 命令定义过#ifdef 标识符程序段1#else程序段2#endif标识符未被#define 命令定义过#ifndef 标识符程序段1#else程序段2#endif#if 表达式-表达式真执行程序段1,假执行程序段2程序段1#else程序段2#endif.102022-2-26 v C语言是一种函数式语言,它的一个函数实际上就是一个功能模块C程序的基本组成是函数。v 一个C程序是由一个固定名称为main的主函数和若干个其他函数(可没有)组成。v 一个C程序必须有一个、也只能有一个主函数。v 主函数在程序中的位置可以任意,但程序执行时

5、总是从主函数开始,在主函数内结束。v 主函数可以调用其他各种函数(包括用户自己编写的),但其他函数不能调用主函数。.112022-2-26主函数的一般形式:主函数的一般形式:v 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

6、,r,s); /*输出结果*/.122022-2-26其他函数其他函数v 标准库函数只能调用 。使用方法: 先“包含”,即将该函数所在头文件包含在程序中。 后调用。调用方式:函数名(参数)#include #include main( ) s=PI*pow(r,2); printf(“半径R=%f 时,面积S=%fn”,r,s); 说明:pow(x,y) 求xy (math.h中的标准数学函数) printf(); (stdio.h中的标准输出函数) .132022-2-26其他函数其他函数v 自编(定义)函数: 先定义(规定函数类型、函数名和函数功能) 后调用(使用所定义的函数实现其功能)

7、定义函数: 函数类型 函数名(形式参数) (函数体) 调用函数:函数名(参数).142022-2-26关于语句:关于语句:数据类型定义语句数据类型定义语句v语句形式 变量类型关键字变量类型关键字 变量名; float r,s; 定义r、s为单精度实型变量 int r,s; 定义r、s为整型变量【注意】在C语言程序中,所有变量都要先定义后使用,否则就会出现编译错误提示,如: Error: Undefined symbol a in function main Lets try变量类型关键字 字符型(描述文字性的数据) char 数值型: 整型(在机内是准确表示的整型(在机内是准确表示的) int

8、 实型(在机内一般是近似表示的实型(在机内一般是近似表示的) float (有效数字6位) double(有效数字16位)变量名 C语言(变量名、符号常量名、函数名等)命名: 组成:字母、数字、下划线 开头:字母、下划线 长度:32字符【注意】大小写为不同字符(变量名一般小写,符号常量 名一般大写),还要注意不得与关键字同名。.152022-2-26关于语句:关于语句: 赋值语句赋值语句v 作用:使变量获得具体的运算值。v 语句形式 变量名=表达式(常量、变量、函数、算式及其混合); r =1.0; /*变量r赋初值*/ s=PI*pow(r,2); /*计算圆面积s*/v 变量赋初值亦可在数

9、据类型定义时进行: float r =1.0, s; 把变量声明语句与赋值结合在一起的语句,术语上称为 “初始化语句”。.162022-2-26关于语句:关于语句: 输出语句输出语句v 作用:将运算结果送到显示器屏幕显示出来v 语句形式 printf ( ) ; printf (半径半径R=%f 时,面积时,面积S=%fn,r,s); printf (“Hello,everyone!”);v 【注意】C语言本身没有输入、输出语句,其功能要借用有关函数来实现。 %f 格式字符串 n 控制字符(转义字符) n表示回车换行 引号中的其他部分照原样输出.172022-2-26关于格式字符串关于格式字符

10、串v 表示该处将用printf语句引号外对应表达式的值替换后输出 例:若 r =1,s=3.14 printf (“半径半径R=%f 时,面积时,面积S=%fn”,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

11、 y =3; printf (a=%d,b=%f,c=%s,x+2,y*3, 123defg);输出结果:输出结果: a=7,b=9.000000,c=123defg.182022-2-26C C语言程序的基本结构语言程序的基本结构v 一个C程序是由一个固定名称为main的主函数和若干个其他函数(可缺省)组成。v 其基本结构一般形式如右图所示。编译预处理部分(可选)main( ) 说明部分 /*变量定义等*/执行部分 /*输入/输出/计算*/ 其他函数(可选,位置任意).192022-2-26.202022-2-26.212022-2-26 可知对不同数据类型占用的存储空间可知对不同数据类型占

12、用的存储空间: : charshort=intlong =float = = = != 关系表达式: 含有关系运算符的表达式 特别注意 aXb 之类算式的正确写法 : a=x & x=b(错误写法:a=X5) printf(“m5”); else printf(“m=%d”,m-); printf(“m=%d”,m-); 运算结果运算结果: m=6,m=5 【例二】main( ) int m=5; if (+m5) printf(“m5”); else printf(“m=%d”,m-); printf(“m=%d”,m-); 运算结果运算结果: m5 .272022-2-26逻辑运算

13、逻辑运算 &(与运算符) 运算符两边均为真时,结果为真 | (或运算符) 运算符两边均为假时,结果为假 !(非运算符) 将运算符右边真假倒置 逻辑运算符的任一端如果为非0数,则视为“真”,为0则视为假。 【例】 printf(“%d”, !3+5) 结果为5 printf(“%d”, !0+5) 结果为6注意:! 优先于关系运算符,与+、-同级。【例一】 main( ) int a=1,b=2,m=2,n=2; (m=ab)&+n; printf(%dn,n); 运行结果:n=2 【例二】 main( ) int a=1,b=2,m=2,n=2; (m=ba)&+n;

14、printf(%dn,n); 运行结果:n=3 原因:在&和|的左边如果能判断出结果,则右边不再作运算。 结论:在逻辑表达式的求解中,并不是所有的逻辑运算符都会被执行。只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。.282022-2-26条件运算条件运算 ? : (三元运算符,即需连接三个运算量)一般形式: e1?e2:e3 (e1为条件表达式,e2,e3为任意类型表达式)功能: 如果e10(为真),运算结果为e2的值。 如果e1=0(为假),则取e3的值。【例】分别令x=3,x=0,x= -5,求运行结果。main( ) int x,y; printf(“Inp

15、ut x=”); scanf(“%d”,&x); y=x0?1:x0)y= 0 (x=0) -1 (x0).292022-2-26位操作运算符位操作运算符 &(与AND) |(或OR) (异或XOR) (非NOT) (右移) .302022-2-26.312022-2-26ifif语句语句1、简单if语句if(表达式表达式)程序段程序段 下面程序的功能是:如果输入的数据大于等于60,则输出You are passed!:scanf(“%d”,&x);if(x=60) printf(“You are passed!n”); .322022-2-262、if-else语句i

16、f(表达式) 程序段 else 程序段如果输入的数据大于等于60,则输出 Y o u a r e passed!否则输出You failed!scanf(“%d”,&x);if(x=60) printf(“You are passed!n”); else printf(“You failed!n”); ifif语句语句.332022-2-26#include main() int x,y=100,z=0; x=180; if(xy) /交换x和y z=x; x=y; y=z; rintf(x=%d,y=%dn,x,y);#include main() int x,y=100,z=0;

17、x=180; if(x0&x10&x=20) printf(“ 10.20n); else printf(errorn); ifif语句语句.352022-2-26switchswitch语句语句switch(变量或表达式P) case 常量表达式C1:程序段S1 break; case 常量表达式C2:程序段S2 break; . case 常量表达式Cn:程序段Sn break; default: 程序段Sn+1 break; .362022-2-26#include main() char ch; printf(input the mark(A,B,C,D,E or F)

18、; scanf(%c,&ch); switch(ch) case A:printf(100n); break; case B:printf(90n); break; case C:printf(80n); break; case D:printf(70n); break; case E:printf(60n); break; case F:printf(50n); break; default:printf(input error!n); switchswitch语句语句运行结果:input the mark(A,B,C,D,E or F) D 70.372022-2-26 break

19、子句可以省略,但是否省略break子句,要根据算法的逻辑而定。因为没有了break语句,switch语句会被执行到语句结束。switchswitch语句语句char ch=N;switch(ch) case Y:printf(Yesn); break; case N:printf(Non); break; case A:printf(Alln); break;char ch=N;switch(ch) case Y:printf(Yesn); break; case N:printf(Non); case A:printf(Alln); break;输出:输出:NoNo输出:输出:NoNo Al

20、l All.382022-2-26whilewhile语句语句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=%ldn,100,sum);whilewhile语句的例子:计算语句的例子:计算1+2+3+1+2+3+100+100的值的值 通常情况下,程序中会利用通常情况下,程序中会利用一个一个变量变量来来控制控制whilewhile语句的表语句的表达式达式P P的值,这个变量被称为的值,这个变量被称为

21、循循环控制变量环控制变量。在执行。在执行whilewhile语句语句之前,循环控制变量之前,循环控制变量必须初始化必须初始化,否则执行的结果将是不可预知的。,否则执行的结果将是不可预知的。上面的程序重新编写,其运行结果将是不可预知的,因为上面的程序重新编写,其运行结果将是不可预知的,因为a 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=%ldn,100,sum);.392022-2

22、-26whilewhile语句语句有关有关whilewhile语句的几点说明语句的几点说明 1、要在while语句的某处(表达式P或循环体内)改变循环控制变量的值,否则极易构成死循环。下面的while语句便是死循环:x=2;while(x100)break; sum+=a; a+; .412022-2-26whilewhile语句语句有关有关whilewhile语句的几点说明语句的几点说明3、如果在执行循环体过程中,遇到了continue语句,则循环体中continue语句后面的其他语句将被跳过,而直接进入下一轮循环。a=1;while(a=10) printf(%d,a); a+; if(a

23、%5=1) continue; printf(*); 运行结果:12*3*4*5*67*8*9*10.422022-2-26do-whiledo-while语句语句do-while语句的形式:do 程序段Sdo-whiledo-while语句的例子:计算语句的例子:计算1+2+3+1+2+3+100+100的值的值 int a; long sum; sum=0; a=1; do sum+=a; a+; while(a=100); printf(1+2+.+%d=%ldn,100,sum); do-while语句与while语句大体相同,但要特别注意,while( )后面的分号不要漏掉。此外,w

24、hile语句的循环体可能永远不被执行,但do-while语句的循环体至少被执行一次。.432022-2-26forfor语句语句for语句的形式: 必须是分号 必须是分号 for(表达式1 ; ; 表达式2 ; ; 表达式3) 程序段S .442022-2-26forfor语句语句 int a; long sum; sum=0; for(a=1;an2) nmax=n1; else nmax=n2; if(n3nmax) nmax=n3; printf(“max=%dn”,nmax); 输入三个整数,求三个整数中的最大值输入三个整数,求三个整数中的最大值不使用函数不使用函数(除除main外外)

25、int max(int,int,int);main() int n1,n2,n3,nmax; scanf(“%d%d%d”,&n1,&n2,&n3); nmax=max(n1,n2,n3); printf(“max=%dn “,nmax); int max(int x,int y,int z) int m; if(xy) m=x; else m=y; if(zm)m=z; return m;输入三个整数,求三个整数中的最大值输入三个整数,求三个整数中的最大值使用函数使用函数子函数定义.512022-2-26v 形式参数与实际参数形式参数与实际参数 1、形式参数形式参数(

26、形参):函数定义时设定的参数。(形参):函数定义时设定的参数。 前例中,函数头前例中,函数头int max(int x,int y,int z)中中x,y,z就是形参就是形参 它们的类型都是整型。它们的类型都是整型。 2、实际参数实际参数(实参):调用函数时所使用的实际的参数。(实参):调用函数时所使用的实际的参数。 前例中,主函数中调用前例中,主函数中调用max函数的语句是:函数的语句是:nmax=max(n1,n2,n3); 其中其中n1,n2,n3就是实参,它们的类型都是整型。就是实参,它们的类型都是整型。关于形参和实参的说明:关于形参和实参的说明:v a、形参只有当调用时才临时分配存储

27、单元。、形参只有当调用时才临时分配存储单元。v b、实参一定要有确定的值,可以是表达式。、实参一定要有确定的值,可以是表达式。v c、实参和形参的类型应相同或赋值相容。、实参和形参的类型应相同或赋值相容。.522022-2-26形式参数与实际参数形式参数与实际参数 .532022-2-26函数的返回值函数的返回值v C语言可以从函数(被调用函数)返回值给调用函数(这与数语言可以从函数(被调用函数)返回值给调用函数(这与数学函数相当类似)。在函数内是通过学函数相当类似)。在函数内是通过return语句返回值的。函语句返回值的。函数可以使用一个或者多个数可以使用一个或者多个return语句返回值也

28、可以不返回值语句返回值也可以不返回值(此时函数类型是(此时函数类型是void)。)。v return语句的格式:语句的格式: return 表达式表达式;或;或 return (表达式)(表达式);v 说明:说明: 函数的类型就是返回值的类型,函数的类型就是返回值的类型,return语句中表达式的类语句中表达式的类型应该与函数类型一致。如果不一致,以型应该与函数类型一致。如果不一致,以函数类型函数类型为准(赋值为准(赋值转化)。转化)。.542022-2-26 局部变量局部变量 概念:概念:是指在一定范围内有效的变量。是指在一定范围内有效的变量。C语言中,语言中,在以下各位置定义的变量均属于局

29、部变量。在以下各位置定义的变量均属于局部变量。 在函数体内定义的变量:在函数体内定义的变量:在本函数范围内有效,作在本函数范围内有效,作用域局限于函数体内。用域局限于函数体内。 在复合语句内定义的变量:在复合语句内定义的变量:在本复合语句范围内有在本复合语句范围内有效,作用域局限于复合语句内。效,作用域局限于复合语句内。 有参函数的形式参数也是局部变量:有参函数的形式参数也是局部变量:只在其所在的只在其所在的函数范围内有效。函数范围内有效。 .552022-2-26 全局变量全局变量 全局变量:全局变量:在函数之外定义的变量。(所有函数在函数之外定义的变量。(所有函数前,各个函数之间,所有函数

30、后)前,各个函数之间,所有函数后) 全局变量作用域:全局变量作用域:从定义全局变量的位置起到本从定义全局变量的位置起到本源程序结束为止。源程序结束为止。 在引用全局变量时如果使用在引用全局变量时如果使用“externextern”声明全局变声明全局变量,可以扩大全局变量的作用域。例如,扩大到量,可以扩大全局变量的作用域。例如,扩大到整个源文件(模块),对于多源文件(模块)可整个源文件(模块),对于多源文件(模块)可以扩大到其它源文件(模块)。以扩大到其它源文件(模块)。 全局变量和局部变量同名的全局变量和局部变量同名的“屏蔽屏蔽”。.562022-2-26全局变量和局部变量的应用全局变量和局部

31、变量的应用局部变量局部变量输出结果输出结果。count is 100.572022-2-26v 变量(局部/全局)两大属性: 数据类型 存储类别1、数据类型(复习) 通过变量说明(定义)来规定其数据类型: 格式 数据类型关键字 变量名 如 char a; int b,c ; float x,y; 为什么使用变量前要先对其数据类型进行“说明”好比看电影前先买票订座 预留存储空间(如char型为1个字节,int型为2个字节) 确定存储方式(如char型存放ASCII值,int型存放补码值).582022-2-26v 变量(局部/全局)两大属性: 数据类型 存储类别2、存储类别 规定了变量在计算机内

32、部的存放位置决定变量的“寿命”(何时“生”,何时“灭”) 一个完整的变量说明格式如下: 存储类别 数据类型 变量名 如 static int x , y ;C程序的存储类别有: register型(寄存器型) auto型(自动变量型) static型(静态变量型) extern型(外部变量型).592022-2-26C C程序的变量存储位置程序的变量存储位置变量的生存期 静态存储区中的变量:与程序“共存亡” 动态存储区中的变量:与函数“共存亡” 寄存器中的变量:同静态存储区.602022-2-26C C程序的变量存储类别程序的变量存储类别 register型(寄存器型)型(寄存器型) 变量值存

33、放在运算器的寄存器中存取速度快,一般只允许存23个变量,且限于char型和int型,通常用于循环变量。 auto型(自动变量型)型(自动变量型) 变量值存放在主存储器的动态存储区(堆栈方式);优点同一内存区可被不同变量反复使用。 以上两种变量均属于“动态存储型”,即调用函数时才为这些变量分配单元,函数调用结束其值自动消失。.612022-2-26C C程序的变量存储类别程序的变量存储类别 static型(静态变量型)型(静态变量型)变量值存放在主存储器的静态存储区程序执行开始至结束,始终占用该存储空间 extern型(外部变量型)型(外部变量型)同上,其值可供其他源文件使用以上两种均属于“静态

34、存储”性质,即从变量定义处开始,在整个程序执行期间其值都存在(都可用!).622022-2-26 auto(默认) 所在函数调用结束时,其值自动消失局部变量 register 如不赋初值,取不确定值为初值 static 所有函数调用结束,其值仍保留 如不赋初值,取初值为0(数值型)或空字符0(字符型) extern(默认)允许本源文件中其他函数及其他全局变量 源文件使用 static 只限本源文件中使用 .632022-2-26求程序运行结果求程序运行结果main() int a=2,i; clrscr( );/清楚屏幕,内部函数 for (i=0;i3;i+) printf(%4d,f(a)

35、;f(int a) int b=0; static int c=3; b+;c+; return a+b+c; 变量跟踪变量跟踪 mainmain( )( ) f f函数函数 a i a i b b f(a) f(a) 2 0 01 4 7 2 0 01 4 7 1 01 5 8 1 01 5 8 2 01 6 9 2 01 6 9 【结果结果】 7 8 9 7 8 9 如果去掉如果去掉staticstatic呢?呢?【结果结果】 7 7 7.642022-2-26求程序运行结果求程序运行结果main() int k=4,m=1,p; clrscr(); p=func(k,m); printf

36、(%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 08 23 4 1 4 1 817 312 【结果】 8, 17 如果去掉如果去掉staticstatic呢?呢?【结果】 8, 8.652022-2-26求程序运行结果求程序运行结果#include main() int a=3, b=2, c=1; /注意应用范围 int b=5, c=12;/注意应用范围

37、c-=b*2; printf(a=%d,b=%d,c=%dn, a, b, c); a+=c; printf(a=%d,b=%d,c=%dn, a, b, c);【结果】 a=3,b=5,c=2 a=5,b=2,c=1 .662022-2-26int a=3,b=5;max(int a,int b) int c; c=ab?a:b; return c; main() int a=8; printf(%dn,max(a,b); 求程序运行结果求程序运行结果【结果】 8如果主函数中没有int a=8,结果? 【结果】 5如果让主函数中int a=4或a=-1,结果? 【结果】 均为 5.67202

38、2-2-26求程序运行结果求程序运行结果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,%dn,x,y);【结果】 5,25如果第二行不加上如果第二行不加上externextern呢?呢? 【结果】 12,2 .682022-2-26求程序运行结果求程序运行结果int a=0;fun(int i) a+=2*i; return a; main() int a=10; clrscr( ); printf(%d,%dn,

39、fun(a),a); 【结果】 20,10 .692022-2-26v 预处理 在编译之前对源程序进行“预处理” 预处理命令不是C语句,末尾没有分号 预处理命令不在可执行文件中执行 预处理命令都以#开始 包括宏定义、文件包含、条件编译等v 举例 #define MAX 1000 #include .702022-2-26v无参数的宏定义v带参数的宏定义.712022-2-26无参数的宏定义无参数的宏定义v 一般形式 #define 标识符 字符串v 说明 把源程序中相应标识符予以替换 仅是简单的字符串替换,没有任何语法正确性检查 有效范围从定义处开始,到文件结束,或者由#undef命令终止作用

40、域 行末没有分号,如有分号将会被一起替换#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 /* */.722022-2-26带参数的宏定义带参数的宏定义v 一般形式 #define 宏名(参数表) 字符串v 说明 宏定义仅是把参数作为字符串做简单替换,而不做任何运算

41、求值和语法检查 宏名与参数表的括号之间不应有空格 应注意参数替换后可能出现的语法错误和意料之外的运算 应在宏定义内容及其中参数两边加上括号#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+

42、); */ /* z=7, i=6, j=8 */.732022-2-26v 一般形式 #include #include v 说明 把另一个源文件的全部内容包含进来 预编译后,它们已成为一个文件 头文件的扩展名一般用.h,但并非规定 调用库函数一般使用,也可以使用 调用用户编写的头文件应使用.742022-2-26v 条件编译 对某些部分的源程序指定编译的条件 可以减少被编译的语句,减少目标程序的长度,减少运行时间 有利于移植程序,增加程序的灵活性v 命令形式 #ifdef.#else.#endif #ifndef.#else.#endif #if.#else.#endif.752022-2

43、-26 如果标识符被定义过* 如果标识符未被定义过 #ifdef 标识符 #ifndef 标识符 程序段1 程序段1 /*编译此程序段*/ #else #else/*#else部分可省略*/ 程序段2 程序段2 /*反之,编译此程序段*/ #endif #endif *此处指标识符用#define等命令定义过。 #if 表达式 /*如果表达式为真*/ 程序段1 /*编译程序段1*/ #else 程序段2 /否则*编译程序段2*/ #endif.762022-2-26#define DEBUG 0main() int a=10,b=20,c; clrscr(); c=a/b; #ifdef DE

44、BUG printf(a=%d,b=%dn,a,b); #endif printf(c=%dn,c);结果:a=10,b=20c=0如果没有#define行呢? 只输出c=0 2022-2-26.77 C 语言可以根据用户需要,用基本数据类型定义语言可以根据用户需要,用基本数据类型定义特殊性质的数据类型,称为特殊性质的数据类型,称为。构造类型有:。构造类型有:数组、结构体、共同体。数组、结构体、共同体。 数组数组:相同数据类型变量的有序集合。有序表现:相同数据类型变量的有序集合。有序表现在数组元数在内存中连续存放。在数组元数在内存中连续存放。 数组用一个名字作为标识。为区分各元素,每个数组用一

45、个名字作为标识。为区分各元素,每个元素有一个用整型表示的序号,称之为下标。下标可元素有一个用整型表示的序号,称之为下标。下标可以有多个,下标的个数称为数组的维数。以有多个,下标的个数称为数组的维数。2022-2-26.781.1.一维数组的定义一维数组的定义type array1常量表达式常量表达式, , arrayn常量表达式常量表达式;类型说明符,说明数组的类型。类型说明符,说明数组的类型。数组名,用标识符命名。数组名,用标识符命名。数组的元素的个数,数组的下标数组的元素的个数,数组的下标从从0变化到常量达式的值减一。变化到常量达式的值减一。 例:例:int a5;int a5; floa

46、t b20,c15; float b20,c15;a0a1a2a3a4分配内存分配内存2022-2-26.79一维数组定义的几点说明:一维数组定义的几点说明:v 数组名命名规则和变量名相同,遵循标识符定名规则。数组名命名规则和变量名相同,遵循标识符定名规则。v 数组名后是用数组名后是用方括弧方括弧括起来的常量表达式,不能用圆括括起来的常量表达式,不能用圆括 弧弧. . 如:如: int a (10); ERROR!int a (10); ERROR!v 常量表达式表示元素的个数,即数组长度。常量表达式表示元素的个数,即数组长度。 如如: : a10a10有有1010个元素分别为:个元素分别为:

47、 a0,a1,a2,a3,a4,a5,a6,a7,a8,a9;a0,a1,a2,a3,a4,a5,a6,a7,a8,a9;注意不能使用数组元素注意不能使用数组元素a10a10。v 常量表达式中可以包括常量和符号常量,常量表达式中可以包括常量和符号常量,不能包含变量不能包含变量。也就是说,也就是说,C C语言不允许对数组的大小作动态定义。例如,语言不允许对数组的大小作动态定义。例如,下面这样定义数组是不行的:下面这样定义数组是不行的: int nint n; scanf(%d scanf(%d,&n)&n); int an; int an; ERROR!ERROR!2022-2-

48、26.802.2.一维数组的引用一维数组的引用原原 则:则:只能引用数组元素,而不能引用整个数组只能引用数组元素,而不能引用整个数组。引用方式:引用方式:数组名数组名 下标下标 下标可以是整型常量或整型表达式。下标可以是整型常量或整型表达式。每个数组元素,可以出现在简单变量能够出现的任何地方。每个数组元素,可以出现在简单变量能够出现的任何地方。例:例: main () main () int i,a10; int i,a10; for (i for (i0 0;ii9 9;i+)i+) ai aii;i; for(i for(i9 9;i i0 0;i-)i-) printf printf(%

49、d,ai);%d,ai); 2022-2-26.813.3.一维数组的初始化一维数组的初始化对数组元素的初始化可以用以下方法实现:对数组元素的初始化可以用以下方法实现:v在定义数组时对数组元素赋以初值。例如在定义数组时对数组元素赋以初值。例如 int a10=0 int a10=0,1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,99;v只给一部分元素赋值。例如只给一部分元素赋值。例如 int a10 int a1000,1 1,2 2,3 3,44; 这表示这表示只给前面只给前面5 5个元素赋初值个元素赋初值, ,后后5 5个元素值为个元素值为0 0。v使一个数组中全部元素值

50、为使一个数组中全部元素值为0 0 int a10=0,0,0,0,0,0,0,0,0,0 int a10=0,0,0,0,0,0,0,0,0,0; 或或 int a10=0;int a10=0; 不能写成不能写成: :int a10=0int a10=0* *1010; 2022-2-26.823.3.一维数组的初始化一维数组的初始化v在对全部数组元素赋初值时,可以不指定数组长度。在对全部数组元素赋初值时,可以不指定数组长度。 例如:例如: int int a5=a5=1, 21, 2,3 3,4 4,55; 可以写成可以写成: : int int aa1, 21, 2,3 3,4 4,5;5

51、; 如想定义数组长度为如想定义数组长度为1010,就不能省略数组长度的定义,就不能省略数组长度的定义,而必须写成而必须写成: : int a10 int a1011,2 2,3 3,4 , 5;4 , 5; 只初始化前只初始化前5 5个元素,后个元素,后5 5个元素为个元素为0 0。 2022-2-26.83例:输入例:输入1010个整数,分别按个整数,分别按顺序顺序和和逆序逆序输出。输出。#include main()int i;static int a10; printf(input 10 numbers:n); for(i=0;i10;i+) scanf(%d,&ai); pri

52、ntf(n);for(i=0;i=0;i-) printf(%d,ai);程序的运行情况:input 10 numbers:1 2 3 4 5 6 7 8 9 101 2 3 4 5 6 7 8 9 1010 9 8 7 6 5 4 3 2 1 2022-2-26.841.1.二维数组的定义二维数组的定义n定义方式:n 类型 数组名表达式1表达式2;行数列数例:float a34,b510;不能写成float a3,4,b5,10;2022-2-26.85说明:说明:v二维数组可看作特殊的一维数组;二维数组可看作特殊的一维数组;v元素在内存排列顺序为按行存放;元素在内存排列顺序为按行存放;v多

53、维数组定义亦类似于二维数组多维数组定义亦类似于二维数组 如:如:floata234;floata234;1.1.二维数组的定义二维数组的定义a00 a01 a02a10a11a12例: int a23; 它的存储情况:按行存放2022-2-26.86把二维数组看作是把二维数组看作是一种特殊的一维数组一种特殊的一维数组:它的元素又是一个它的元素又是一个一维数组一维数组。例如,可以把。例如,可以把a34a34看作是一个一维数组,它看作是一个一维数组,它有有3 3个个元素,元素,每个元素又是一个包含每个元素又是一个包含4 4个元素的一维数组个元素的一维数组: a0a0 a00 a01 a02 a03

54、a00 a01 a02 a03 a1a1 a10 a11 a12 a13a10 a11 a12 a13 a2a2 a20 a21 a22 a23a20 a21 a22 a23 上面定义的二维数组可以理解为定义了三个一维数组,即上面定义的二维数组可以理解为定义了三个一维数组,即相当于相当于 f1oat a04,a14,a24f1oat a04,a14,a24此处把此处把a0,a1,a2a0,a1,a2看作一维数组名看作一维数组名。c c语言的这种处理语言的这种处理方法在数组初始化和用指针表示时显得很方便,这在以后会方法在数组初始化和用指针表示时显得很方便,这在以后会介绍。介绍。 2022-2-2

55、6.872.2.二维数组的引用二维数组的引用数组名数组名行下标 列下标; 如:a23,数组元素可出现在表达式中,也可被赋值如: a12= a02/2。n 注意:下标值应在已定义的数组大小的范围内。 如:a23错了,其最大下标为1和2。2022-2-26.883.3.二维数组的初始化二维数组的初始化1 1)分行初始化。如:)分行初始化。如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;static int a34=1,2,3,4,5,6,7,8,9,10,11,12;2 2)按数组排列的顺序将所有数据写在一个花括号内。如:)按数组排列的顺序将所有数据写在一个

56、花括号内。如:static inta34=1,2,3,4,5,6,7,8,9,10,11,12;static inta34=1,2,3,4,5,6,7,8,9,10,11,12;3 3)部分元素初始化。如:)部分元素初始化。如:static int a34=1,0,6,0,0,11;static int a34=1,0,6,0,0,11;4 4)如果对全部元素都赋初值,则定义数组时可以不指定)如果对全部元素都赋初值,则定义数组时可以不指定 第一维的长度。如:第一维的长度。如:static int a4=1,2,3,4,5,6,7,8,9,10,11,12;static int a4=1,2,3

57、,4,5,6,7,8,9,10,11,12;2022-2-26.89 C语言没有字符串变量,语言没有字符串变量,可以定义字符数组,每可以定义字符数组,每个元素存放一个字符个元素存放一个字符,从而达到存放字符串的目的。,从而达到存放字符串的目的。字符数组的定义字符数组的定义char 数组名数组名下标下标;char a10,b212;字符数组的初始化字符数组的初始化一维数组赋初值一维数组赋初值: :用单个字符对每一个元数赋值用单个字符对每一个元数赋值。char str15= h, e, l, l, o;把把5个字符分别赋给个字符分别赋给str10str4这这5个元素个元素2022-2-26.90注

58、意:注意:v如果花括弧中提供的初值个数(即字符个数)大于数组长如果花括弧中提供的初值个数(即字符个数)大于数组长度,则作语法错误处理。如:度,则作语法错误处理。如: char str14= char str14= h h, , e e, , l l, , l l, , o o; ; ERROR!ERROR!v如果初值个数小于数组长度,则只将这些字符赋给数组中如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,前面那些元素,其余的元素自动为空字符其余的元素自动为空字符( (即即00) )。 char str110= char str110= h h, , e e, , l l, ,

59、l l, , o o;v如果初值个数与预定的数组长度相同,在定义时可以省略如果初值个数与预定的数组长度相同,在定义时可以省略数组的长度,系统会自动根据初值个数确定数组长度。数组的长度,系统会自动根据初值个数确定数组长度。 char str1= char str1= h h , ,e e , ,l l , ,l l, , o o;等价于:等价于:char str15= char str15= h h, , e e, , l l, , l l, , o o;helloStr1Str1在内存中的存放形式:在内存中的存放形式: 注:一般情况下,说明数组时,注:一般情况下,说明数组时,长度指定应至少比实

60、际长度指定应至少比实际长度大长度大1 1,保证赋初值正确。,保证赋初值正确。2022-2-26.91二维数组赋初值二维数组赋初值二维数组的每一行可以存放一个字符串。二维数组的每一行可以存放一个字符串。 char str36=w,a,n,g, , z,h,a,n,g, l,i,u;wang00zhang0liu000str数组在内存数组在内存中存储形式中存储形式2022-2-26.923. 字符数组的引用字符数组的引用可以引用可以引用字符数组中的一个元素字符数组中的一个元素,得到一个字符。,得到一个字符。例:输出一个钻石图形。例:输出一个钻石图形。 main() main() char diamond5= , , char diamond5= , , * *, , ,* *, , ,* *, , * *, , , , , , ,* *,

温馨提示

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

评论

0/150

提交评论