- 823.00 KB
- 2022-08-11 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
C语言程序设计\n本课程内容:第一章C语言概述第二章简单程序设计之一第三章一维数组第四章算法第五章基本数据类型与输入/输出第六章运算符和表达式第七章简单程序设计之二第八章二维数组和字符数组第九章函数第十章指针第十一章编译预处理第十二章指针的高级应用第十三章结构体、共同体和枚举类型第十四章文件第十五章位运算\n本课程考核办法期末考试:70%平时成绩:30%课堂作业实验(课后作业)\n第一章C语言概述\n第一章C语言概述C语言历史C语言特点简单C程序C语言上机环境\n1.1C语言历史\n1.1C语言历史1970年,贝尔实验室的Ritchie和Thompson用B语言合作完成Unix第一个版本1972年,Ritchie完成了C语言,并和Thompson合力将Unix80%的部分用C语言改写1978年,Kernighan和Ritchie出版了名著《TheCProgrammingLanguage》,就是有名的K&RC,中译本叫做《C程序设计语言》\n1.2C语言特点\n1.2C语言特点函数式的语言C语言由函数组成函数是对程序的分解函数可以互相调用简洁、高效语法限制不严格\n1.3简单C程序\n1.3简单C程序例1.1第一个C程序,helloworld#includevoidmain(){printf("helloworld\n");}\n1.3简单C程序第一个C程序,helloworld#includevoidmain(){printf("helloworld\n");}头文件包含语句一个函数定义\n1.3简单C程序第一个C程序,helloworld#includestdio=standardinputoutputh=head\n1.3简单C程序主函数定义voidmain(){printf("helloworld\n");}\n1.3简单C程序第一个C程序,helloworldvoid返回值类型main(){printf("helloworld\n");}函数名函数体参数表\n1.3简单C程序函数定义语法:返回值类型函数名(参数表){函数体(语句以分号结束)}\n1.3简单C程序printf函数功能:标准输出函数,按参数输出到屏幕上参数:可以有多个参数,第一个为字符串printf("helloworld\n");函数调用语法:函数名(参数);\n1.3简单C程序printf函数功能:标准输出函数,按参数输出到屏幕上参数:可以有多个参数,第一个为字符串C语言中:双引号括起来表示字符串\n表示回车换行符printf("helloworld\n");\n1.3简单C程序程序模式(无自定义函数):includevoidmain(){语句}#includevoidmain(){printf("helloworld\n");}\n1.3简单C程序例1.2.1加法程序#includevoidmain(){inta,b,s;/*变量定义*/a=123;/*变量赋值*/b=456;s=a+b;printf("s=%d\n",s);}变量定义变量赋值注释语句printf的升级用法\n1.3简单C程序变量定义语法:变量类型变量名,变量名……;inta;inta,b,c;变量赋值:a=123;c=a+b;注释语句:/*注释内容*/\n1.3简单C程序printf函数格式控制字符串printf(“s=%d\n”,s);格式说明:百分号+格式字符输出:除格式说明外,其余按原样输出格式说明被替换为后面的变量\n1.3简单C程序例1.2.2加法程序(函数调用)intsum(inta,intb){ints;s=a+b;returns;}voidmain(){inta,b,s;/*变量定义*/a=123;/*变量赋值*/b=456;s=sum(a,b);/*原来是s=a+b;*/printf("s=%d\n",s);}\n1.3简单C程序函数定义语法:返回值函数名(参数表){函数体(语句以分号结束)}参数表:参数类型参数名,……参数类型,参数名intsum(inta,intb)返回值用法:s=sum(a,b);\n1.3简单C程序注意:函数的参数函数内部定义的变量只在该函数内部有效\n1.3简单C程序例1.2.3加法程序(数据输入)intsum(a,b){ints;s=a+b;returns;}voidmain(){inta,b,s;/*变量定义*/scanf(“%a,%b”,&a,&b);s=sum(a,b);/*原来是s=a+b;*/printf("s=%d\n",s);}a=123;/*变量赋值*/b=456;\n1.3简单C程序scanf函数scanf(“%d,%d”,&a,&b);格式控制字符串含义同printf输入数据时,要严格按照格式scanf(“a=%d,b=%d”,&a,&b);变量前必须加&(取地址操作符)Scanf(“%d%d”,&a,&b);无分隔字符,用空格或回车分隔\n1.3简单C程序程序模式(有自定义函数):includeintf(……){语句}voidmain(){语句f(……);语句}\n1.4C语言上机环境C语言上机步骤(VisualC++6.0):启动VC创建应用添加C文件编译(F7)改正错误运行程序(Ctrl+F5)\n总结C语言历史C语言特点:函数简单C程序掌握两种程序模式(无自定义函数、有自定义函数)函数基本概念变量定义、赋值语句printf,scanf基本用法\n课堂作业编写程序,完成如下功能(两种方式):输入两个数,输出其平方和\n第二章简单程序设计之一\n第二章简单程序设计之一常量与变量顺序结构程序设计选择结构程序设计循环结构程序设计C语句概述\n2.1常量与变量inta;a=2;变量常量常量:值不能改变的量变量:值可以改变\n2.1常量与变量变量命名规则:只能由字母、数字和下划线组成,且必须以字母或下划线开头。为什么\n2.1常量与变量变量的赋值有三种方法:在定义变量的同时为变量赋初值,格式为:<数据类型><变量名>=<常量表达式>;例如,inta=10;利用赋值语句为变量赋初值,格式为:<变量名>=<表达式>;例如,a=10+3;利用格式化输入函数为变量赋初值,格式为:scanf(“格式控制字符串”,变量地址表列);例如,scanf("%d",&a);定义后的变量其值是随机的、不确定的,只有通过赋值操作,其值才是确定的,才能被使用。\n2.2顺序结构程序设计语句从上到下,逐条执行,一直到最后一条语句退出程序。例:加法平方和交换两变量的值\n2.3选择结构程序设计例求较大值#includevoidmain(){inta,b,max;scanf(“%d,%d”,&a,&b);max=a;if(b>a)max=b;printf(“max=%d\n",max);}\n2.3选择结构程序设计三种格式:1、if(a>b)m=a;2、if(a>b)m=a;elsem=b;3、if(...)....elseif(...)...elseif(...)...else...\n#include"stdio.h"voidmain(){intscore,grade;printf("请输入成绩:");scanf("%d",&score);/*输入成绩*/if(score>89)/*90~100分,积点5*/grade=5;elseif(score>79)/*80~89分,积点4*/grade=4;elseif(score>69)/*70~79分,积点3*/grade=3;elseif(score>59)/*60~69分,积点2*/grade=2;else/*59~0分,积点0*/grade=0;printf("成绩%d的对应积点是%d\n",score,grade);}程序运行情况如下:请输入成绩:76↙成绩76的对应积点是3【例2.5】计算学习成绩积点\n2.5简单循环结构程序设计问题计算1+2+…+100的值,即inti,sum;i=1;sum=0;sum=sum+i;i=i+1;sum=sum+i;i=i+1;:sum=sum+i;i=i+1;如何避免出现这种情况?重复100次同样的语句,程序显得很笨拙。\n2.5简单循环结构程序设计问题打印20行helloworld输入10个数,求其和/积输入10个数,求其最大值计算1+2+…+100的值计算n!\nfor语句格式for(赋值;循环条件;循环控制){语句;}关键:对循环变量的控制\n循环中可能出现的变量循环变量(巧妙利用循环变量)1+3+5+7+……+99累积变量(累加,累乘)递推变量\n设计循环的要点循环体循环条件(循环变量的控制)初值(很重要,在循环开始之前赋值)\n数列问题(求和)有计算公式1加到n,a(i)=i,平方和,a(i)=i*i;练习:2+5+10+17+26+37……有递推公式1+2+4+8+16+……1+3+7+15+31+63+……练习:2+22+222+2222+22222+222222……1!+2!+3!+……n!斐波拉契数列1+1+2+3+5+8+13+21a(i)=a(i-1)+a(i-2)+a(i-3)练习:a(i)=2*a(i-1)+a(i-2)*a(i-2)思考:1*2+2*3+3*5+5*8+8*13\n程序模式(数列)voidmain(){......for(i=1;i<=n;i++){a=数列通项公式(用i表示);s=s+a;}......}\n程序模式(数列)voidmain(){......a=第一项;for(i=1;i<=n;i++){s=s+a;a=递推公式(用a表示)}......}\n循环条件循环变量控制其他变量控制输入控制输入一系列数字,以-1结束,求其和;\n基本算法累加/乘(数列问题)计数/记位置变量交换\n计数问题100~1000中有多少个数是17的倍数有多少个三位数可以被7整除但是不能被3整除输入一系列正数,以-1结束,记录输入数字的个数输入10个数,记录其中偶数的个数。输入10个数,记录最后一个偶数的位置。输入10个数,记录最大值的位置。输入10个数,记录第一个偶数的位置。\n交换变量输入三个数a、b、c,通过变量交换使a,b,c从小到大排序\n程序模式(计数)intnum=0;for(...............){if(条件)num++;}\n程序模式(计位置)for(...............){if(条件)pos=当前位置;}\n2.5简单循环结构程序设计#includeintmain(){inti,sum;i=1;sum=0;while(i<=100){sum=sum+i;i++;}printf("Sum=%d\n",sum);return(0);}运行结果为:sum=5050\n2.5简单循环结构程序设计while语句while(循环条件){语句;}执行过程:判断循环条件,执行循环体判断循环条件,执行循环体。。。。。。当条件不满足时,退出循环\n2.5简单循环结构程序设计do-while语句do{语句;}while(循环条件)执行过程:执行循环体,判断循环条件执行循环体,判断循环条件。。。。。。当条件不满足时,退出循环\n2.5简单循环结构程序设计#includeintmain(){inti,sum;i=1;sum=0;do{sum=sum+i;i++;}while(i<=100);printf("Sum=%d\n",sum);return(0);}\nwhile和do-while循环比较#includemain(){intsum=0,i,n;scanf("%d",&n);i=5;while(i<=n){sum=sum+i;i++;}printf("%d\n",sum);}#includeintmain(){intsum=0,i,n;scanf("%d",&n);i=5;do{sum=sum+i;i++;}while(i<=n);printf("%d\n",sum);}试分析:当分别输入5和4时,两个程序段分别输出什么?\n2.5for语句#includeintmain(){inti,sum;i=1;sum=0;for(i=1;i<=100;i++){sum=sum+i;}printf("Sum=%d\n",sum);return(0);}#includeintmain(){inti,sum;i=1;sum=0;while(i<=100);{sum=sum+i;i++;}printf("Sum=%d\n",sum);return(0);}\nfor语句中表达式的省略for(表达式1;表达式2;表达式3){语句;}省略表达式1省略表达式2省略表达式3三个都省略\n几种循环的比较while和for完全等价用法循环次数确定时用for例循环次数不定时用while例\n例:输入10个数,求其和\n2.6C语句概述控制语句ifwhileswitch赋值语句a=3;a=b+c;m=max(a,b);函数调用(单独的函数调用)printf(“helloworld”);max(a,b);复合语句空语句;\n数列问题(求和)输入10个数,求其和产生10个随机数,求其和输入10个数,求其最大值输入10个数,求其最大值和最小值产生10个随机数,求其最大值和最小值\n数列问题的其他问法数列求积数列的第n项是多少数列的第几项超过x数列前多少项的和超过x\n课堂练习:3:编程求分段函数的值:x(x<1)y=2x-1(1≤x<10)3x-11(x≥10)4.输入n,输出n!(whilefor两种方式)5.输入n,求1~n的平方和设3个变量a、b、c,值分别为1、2、3,通过变量交换使其值变为3、2、1输入三个数,输出其中的最大值\n第三章一维数组\n第三章一维数组一维数组的定义一维数组元素的引用一维数组元素的内存存储一维数组的初始化例题\n1.1一维数组的定义inta[10];数组命名规则与变量相同元素个数必须为常量数组元素可以为任意类型\n1.2一维数组的引用inta[10];a[0]=1;a[5]=9;a[9]=12;i=3;a[i]=5;a[1+2]=8;n=a[1]+a[2];引用语法:变量名[下标]下标从0开始下标可以用变量或表达式例:赋值和输出引用越界怎么办\n1.3一维数组的初始化(1)在定义数组时对数组元素赋初值。例如:inta[6]={1,3,5,7,9,11};(2)可以只给一部分元素赋初值。例如:inta[6]={1,3,5};a[0],a[1],a[2]的值分别是1,3,5,其他元素值是0。(3)对全部数组元素赋初值时,可以不指定数组长度。intb[3]={4,6,8};可以写成intb[]={4,6,8};不初始化,会怎样\n例题循环赋值和输出输出偶数位置的元素交换奇偶位置元素练习:反序最大值求最大值的下标最大值(交换方式)移位练习:插入新元素数组元素求和斐波拉契数列搜索(查找)元素\n第四章算法\n第四章算法算法的概念算法的特性怎样表示一个算法基本算法\n4.1算法的概念解决某个问题或处理某个事件的方法和步骤,称为算法。计算机算法:指使用计算机去解决问题的方法和步骤。计算机算法可分为两大类:数值算法:求解数值;非数值算法:事务管理领域\n简单算法举例【例4.1】输入三个数,然后输出其中最大的数算法分析:这是一个数值运算问题。首先定义三个变量a、b、c,将三个数依次赋值给a、b、c,另外,再定义一个max变量存放最大数。算法描述如下:(1)输入a、b、c。(2)max←a。(3)若b>max,则max←b。(4)若cmax,则max←c。(5)输出max,max即为最大数。\n4.2算法的特性有穷性:一个算法应包含有限的操作步骤而不能是无限的。确定性:算法中每一个步骤应当是确定的,而不能应当是含糊的、模棱两可的。有效性:算法中每一个步骤应当能有效地执行,并得到确定的结果。有零个或多个输入。有一个或多个输出。\n4.3怎样表示一个算法从理论上说,算法可以用任何形式的语言和符号来描述,如自然语言、程序设计语言、流程图、N-S图、PAD图和伪代码等。\n4.3怎样表示一个算法从理论上说,算法可以用任何形式的语言和符号来描述,如自然语言、程序设计语言、流程图、N-S图、PAD图和伪代码等。\n打印x的绝对值用伪代码表示的算法如下:IFxispositiveTHENprintxELSEprint–x\n也可以用汉字伪代码,例如,若x为正打印x否则打印–x也可以中英文混用,例如,IFx为正printxELSEprint–x\n基本算法公约数和公倍数素数问题平方根一元非线性方程求根牛顿迭代法二分法定积分矩形法梯形法\n第五章基本数据类型与输入输出\n第五章基本数据类型与输入输出整型数据字符型数据浮点型数据\n1整型数据整型常量整型变量\n1.1整型常量整型常量即整常数,在C语言中可用三种形式表示:十进制。例如10、36。八进制(以数字0开头)。例如012。十六进制(以0x开头)。例如0x36。\n1.2整型变量有符号数:intshortLong无符号数unsignedintunsignedshortunsignedlong\n整型数据的溢出inti;i=32767;i=i+1;\n2字符型数据3.3.1字符常量‘a’‘A’‘+’‘’转义字符:\n\t\b\t\f\\\’\”\ddd\xhh3.3.2字符变量chara;\n字符数据的二进制表示字符数据的二进制表示ASCII码‘a’=97‘A’=65\n字符数据的二进制表示注意:C语言中字符型数据就是一个字节的整数完全可以当整数使用,只是表示范围小例chara,b,c;a=12;b=34;c=a+b;\n字符运算的意义大小写转换charc;c='a';c=c-32;\n字符串常量“helloworld”\n字符串的内存存储每个字符用ASCII码表示,最后以’\0’结束例:”aaa”的内存存储例:”a”和‘a’的区别\n字符串变量注意:C语言中无对应字符串变量,对字符串的处理要用数组\n3浮点型数据浮点型常量浮点型变量浮点型数据在内存中的存储方式\n3.1浮点型常量十进制小数1.2123.0指数形式123e3=123E3=123000123.45e1=12.345e2\n3.2浮点型变量floata;doubleb;longdoublec;\n浮点数据的舍入误差由于可以表示指数,浮点数据能够表示很大的数但是,表示精度受有效数字限制例:\n4数据的输入输出字符数据的输入输出格式化输入输出函数\n4.1字符数据的输入输出putcharputchar(‘a’);getcharcharc;c=getchar();\n4.2格式化输入输出printf%d%u%o%x%c%s%f%mdscanf%md\n第5章基本数据类型与输入输出C语言程序设计—进阶篇\n内容概述1.C语言的数据类型及分类。2.C语言的数据输入/输出。\n教学目标掌握数据类型的概念,了解C语言能够处理的数据类型。掌握各种类型常量的特点及表示形式。掌握变量的概念,了解float、char型变量的特点,掌握这二种类型变量的定义、赋值和使用方法。掌握数据的输入输出的基本方法。\n在C语言中,任何数据呈现给用户的形式只有两种:常量和变量。而无论数据是常量还是变量,都必须属于各种不同的数据类型。在一个具体的C语言系统里,每个数据类型都有固定的表示方式,这个表示方式实际上就确定了可能表示的数据范围和它在内存中的存放形式。C语言为数据提供了丰富的类型,这些数据类型主要分为:基本数据类型、构造数据类型、指针类型和空类型四大类。5.1C语言的数据类型\nC基本数据类型基本数据类型最主要的特点是,其值不可以再分解为其它类型。基本类型整型字符型浮点型单精度双精度枚举短整型长整型\n整型常量即整数,按不同的进制区分,整数有三种表示方法:八进制数:以0开始的数,如:06、0106、0677等。十六进制数:以0X或0x开始的数,如:0X0D、0XFF、0x4e、0x123等。十进制数:以非0开始的数,如:220、-560、+369等。5.2.1整型常量5.2.整型数据\n1、整型变量的分类整型变量分为四种:基本型、短整型、长整型、无符号型基本型:用“int”定义,在不同的编译系统中它的长度可能不同,如在TurboC下int变量占2个字节,而在VC++下6.0环境下int变量占4个字节。5.2.2整型变量\n短整型:用“shortint”或“short”定义,占2个字节。长整型:用“long”或“longint”定义,占4个字节。无符号型:用“unsigned”定义不存放符号,数据不带符号数。无符号整型:“unsignedint”无符号短整型:“unsignedshortint”无符号长整型:“unsignedlongint”注意:如无指定,则为有符号数。\n整型变量取值范围类型说明符 数的范围 分配字节数int-2147483648~2147483647■■■■shortint-32768~32767 ■■signedint-32768~32767 ■■unsignedint0~4294967295 ■■■■longint-2147483648~2147483647 ■■■■unsignedlong 0~4294967295 ■■■■int根据特定的系统对应shortint或longintunsignedint根据特定的系统对应unsignedshortint或unsignedlongint超过变量所能表示的范围,产生计算错误:溢出.\n2、整型变量的定义一般形式:类型说明符变量名标识符例如:inta,b,c;longx,y;unsignedp,q;\n在定义变量时,应注意以下几点:允许在一个类型说明符后,说明多个相同类型的变量。各变量名之间用逗号间隔,类型说明符与变量名之间至少用一个空格间隔。最后一个变量名之后必须以“;”结尾。变量定义必须放在变量使用之前。\n十进制数形式由数码0~9和小数点组成。例如:0.0、25.0、5.789、0.13、5.0、300.、-267.8230等均为合法的实数。注意,必须有小数点。5.3.1实型常量实型常量也称为实数或浮点数。在C语言中,实数只采用十进制,它有两种形式:十进制数形式和指数形式。5.3实型数据\n指数形式由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为:aEn(a为十进制数,n为十进制整数)其值为a*10n。如:2.1E5(等于2.1*105)3.7E-2(等于3.7*10-2)0.5E7(等于0.5*107)-2.8E-2(等于-2.8*10-2)\n以下则不是合法的实数:345(无小数点)E7(阶码标志E之前无数字)-5(无阶码标志)53.-E3(负号位置不对)2.7E(无阶码)标准C允许浮点数使用后缀。后缀为“f”或“F”即表示该数为浮点数。如356.f和356.是等价的。\n注意:实型常量不分单、双精度,都按双精度double型处理。因此:(1)十进制小数形式:必须有小数点。(2)指数形式:字母e前必须有数字,字母e后必须为整数,规范化的指数形式输出。\n#includemain(){printf("%f\n",356.);printf("%f\n",356);printf("%f\n",356.f);}结果为:356.0000000.000000356.000000课堂练习1:分析下面程序的运行结果。\n5.3.2实型变量1实型数据在内存中的存放形式实型数据一般占4个字节(32位)内存空间,按指数形式存储。如实数3.14159在内存中的存放形式如下:+.3141591数符小数部分指数小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高。指数部分占的位数愈多,则能表示的数值范围愈大。\n实型变量分为:单精度(float型)、双精度(double型)。实型变量定义的格式和书写规则与整型相同。例如:floatx,y;doublea,b,c;2.实型变量的分类\n3实型数据的舍入误差由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的。不同的编译器下处理的精度不同。课堂练习2:分析下面程序的运行结果。#includemain(){floata,b;a=123456.789e5;b=a+20;printf("%f\n",a);printf("%f\n",b);}运行结果(VC++):12345678848.00000012345678848.000000可见一个大数与一小数间运算会产生什么结果?\n5.4.1字符常量5.4字符型数据1、字符常量字符常量是用单引号括起来的一个字符。例如:'a'、'A'、'3'、'='、'+'、'?'注意英文字母区分大小写。C字符常量特点:字符常量只能用单引号括起来。字符常量只能是单个字符,不能是字符串。字符可以是字符集中任意字符。如‘5’不同于5。\n2、转义字符转义字符是一种特殊的字符常量。转义字符以反斜线“\”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。转义字符主要用来表示那些用一般字符不便于表示的控制代码。常用的转义字符及其含义如下表:\n转义字符转义字符的意义ASCII代码\n换行10\t横向跳到下一制表位置9\b退格8\r回车13\f走纸换页12\\反斜线符"\"92\'单引号符39\"双引号符34\a鸣铃7\ddd1~3位八进制数所代表的字符\xhh1~2位十六进制数所代表的字符\n广义地讲,C语言字符集中的任何一个字符均可用转义字符来表示。表中的\ddd和\xhh正是为此而提出的。ddd和hh分别为八进制和十六进制的ASCII代码。如\101表示字母“A”(见附录I),\102表示字母“B”,\134表示反斜线,\X0A表示换行等。常见字符的值:20H-空格30H-‘0’-----39H-‘9'41H-'A'61H-'a'内码(ASCII码)在32~126范围内为可显示字符。\n#include"stdio.h"voidmain(){charc1='\101',c2='\x42';printf("a\tbc\bABC\n");printf("xyz\t%c%c\n",c1,c2);}运行结果:abABCxyzAB【例5.1】分析以下程序的执行结果。\n字符串常量是由一对双引号括起来的字符序列。例如,“CHINA”、“CLanguage”、“$abc!”等都是合法的字符串常量。字符串常量和字符常量之间的区别:字符常量由单引号括起来,字符串常量由双引号括起来。字符常量只能是单个字符,字符串常量则可以含一个或多个字符。可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C语言中没有相应的字符串变量,但是可以用一个字符数组来存放一个字符串常量。3、字符串常量\n字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加1。增加的一个字节中存放字符‘\0’(ASCII码为0)。例如:字符串"Cprogram"在内存中所占的字节为:Cprogram\0‘a’和“a”的区别是:“A”存储方式为A\0但‘A’存储方式为:A\n举例"TEST""""a"'T''E''S''T'\08469838400\0'a'\0009700\n在C语言中,可以用一个标识符来表示一个常量,称为符号常量。符号常量在使用之前必须先定义。其一般形式为:#define标识符常量例如:#definePI3.1415926符号常量一经定义,以后在程序中所有出现该标识符的地方均以该常量值代替。符号常量的标识符习惯上用大写字母表示,变量标识符用小写字母表示,以示区别。4、符号常量\n运行结果:s=19.634954#include"stdio.h"#definePI3.1415926voidmain(){floats,r;r=2.5;s=PI*r*r;printf("s=%f\n",s);}【例5.2】符号常量的使用。\n5.4.2字符变量字符变量用来存储字符常量,即单个字符。说明形式:char字符变量名;字符变量在内存中占一个字节,其定义的格式和书写规则都与整型变量相同。例如:chara,b;\n#include"stdio.h"voidmain(){chara,b;a=120;b=121;printf("%c,%c\n",a,b);printf("%d,%d\n",a,b);}运行结果:x,y120,121【例5.3】整型数据与字符数据的相互输出。\n#include"stdio.h"voidmain(){chara,b;a='a';b='b';a=a-32;b=b-32;printf("%c,%c\n%d,%d\n",a,b,a,b);}运行结果:A,B65,66【例5.4】大小写字母转换。\n5.5.1数据输入输出的概念及在C语言中的实现5.5数据的输入输出C语言不提供输入/输出语句,数据的输入/输出是通过函数调用语句来实现的。在C标准函数库中提供了一些输入/输出函数,它是以标准的输入/输出设备(键盘、显示器等)为输入/输出对象的。常用的输出函数有printf()函数和putchar()函数。输入函数有scanf()和getchar()。\n使用标准输入输出库函数时要用到“stdio.h”文件,因此源文件开头应有以下预编译命令:#include或#include"stdio.h"二者的区别:使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找;使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己文件所在的目录来选择某一种命令形式。\n功能:按用户指定的格式,把指定的数据显示到显示器屏幕上。一般形式:printf(“格式控制字符串”,输出表列);其中格式控制字符串用于指定输出格式;输出表列中给出了各个输出项;要求格式字符串和各输出项在数量和类型上应该一一对应。5.5.2printf函数(格式输出函数)\n【例5.5】格式输出#include"stdio.h"voidmain(){inta=88,b=89;printf("%d□%d\n",a,b);printf("%d,%d\n",a,b);printf("%c,%c\n",a,b);printf("a=%d,b=%d\n",a,b);}运行结果:88□8988,89X,Ya=88,b=89\n类型:类型字符用以表示输出数据的类型;标志:-、+分别表示输出数据左、右对齐;输出最小宽度:用十进制整数来表示输出的最少位数。精度:精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。长度:长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出。在C中格式字符串的一般形式为:[标志][输出最小宽度][.精度][长度]类型\n格式字符意义d以十进制形式输出带符号整数(正数不输出符号)o以八进制形式输出无符号整数(不输出前缀0)x,X以十六进制形式输出无符号整数(不输出前缀Ox)u以十进制形式输出无符号整数f以小数形式输出单、双精度实数e,E以指数形式输出单、双精度实数g,G以%f或%e中较短的输出宽度输出单、双精度实数c输出单个字符s输出字符串\n【例5.6】运行并分析程序的执行结果。#include"stdio.h"voidmain(){inta=15;floatb=138.3576278;doublec=35648256.3645687;chard='p';printf("a=%d,%5d,%o,%x\n",a,a,a,a);printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);printf("c=%lf,%f,%8.4lf\n",c,c,c);printf("d=%c,%8c\n",d,d);}a=15,15,17,fb=138.357620,138.357620,138.3576,1.38358e+02c=35648256.364569,35648256.364569,35648256.3646d=p,p\n说明:(1)C语言的格式化输入/输出比较繁琐,在以GUI为主流的应用程序的输入输出中较少使用(scanf()函数则用不到),但它的另一种形式sprintf()函数中的格式化数据处理则经常会用到。(2)如何获得有关sprintf()函数的用法知识?请使用微软开发者网络—MicrosoftDeveloperNetwork(MSDN)。它是一个有关计算机软件设计知识的海洋,是微软平台的软件开发和应用人员的最好的获取知识的工具。(3)读者从现在开始,应该逐步学会如何获取书本上没有的知识,从MSDN、Internet……。请查阅字符串输出函数puts()的用法。\n功能:按用户指定的格式从键盘上把数据输入到指定的变量之中。一般形式scanf(“格式控制字符串”,地址表列);其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串。地址表列中给出各变量的地址。例如:scanf(“%d,%d”,&a,&b);5.5.3scanf函数(格式输入函数)\n变量的地址和变量值的关系如下:在赋值表达式中给变量赋值,如:a=567则a为变量名,567是变量的值,&a是变量a的地址。\n【例5.7】运行并分析程序的执行结果。#include"stdio.h"voidmain(){inta,b,c;printf("inputa,b,c:");scanf("%d%d%d",&a,&b,&c);printf("a=%d,b=%d,c=%d\n",a,b,c);}运行结果:inputa,b,c:789↙a=7,b=8,c=9\n【例5.8】输入格式字符串#includevoidmain(){chara,b;printf("inputcharactera,b\n");scanf("%c%c",&a,&b);printf("%c%c\n",a,b);}由于scanf函数“%c%c”中没有空格,输入MN,结果输出只有M。而输入改为MN时则可输出MN两字符。试一试:“%c%c”中加上空格会怎样?(分别输入MN或M,N)\nscanf()格式控制串"%c□%c"之间有空格时,输入的数据之间可以有空格间隔。如果格式控制串中有非格式字符,则输入时也要输入该非格式字符。注意:\n1、putchar函数(字符输出函数)功能:在显示器上输出单个字符。一般形式为:putchar(字符变量);例如:putchar('A');(输出大写字母A)putchar(x);(输出字符变量x的值)putchar(‘\101’);(也是输出字符A)putchar('\n');(换行)5.5.4字符数据的输入输出\n【例5.9】运行并分析程序的执行结果。#includevoidmain(){chara,b,c;a='B';b='o';c='k';/*以下书写方式不提倡*/putchar(a);putchar(b);putchar(b);putchar(c);putchar('\t');putchar(a);putchar(b);putchar('\n');putchar(b);putchar(c);}运行结果:BookBook\n2.getchar函数(键盘输入函数)功能:从键盘上输入一个字符。其一般形式为:getchar();通常把输入的字符赋予一个字符变量,构成赋值语句,如:charc;c=getchar();\n使用getchar函数还应注意几个问题:getchar函数只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符。使用本函数前必须包含文件“stdio.h”。\n课堂练习1.#includemain(){intx,z;floaty;printf(“Input1020304050\n”);scanf(“%2d%5f%3d”,&x,&y&z);printf(“x=%dy=%fz=%d\n”,x,y,z);}程序运行后输入1020304050,输出结果是:x=10y=20304.000000z=50\n2.#includemain(){chara;a=getchar();putchar(a);putchar(‘\n’);}输入字符,程序的输出结果是:\n3.#includemain(){charch=‘A’;printf(“ch(1)=%d,ch(2)%c\n”,ch,ch+1);}程序输出的结果是:ch(1)=65ch(2)=B\n4.#includemain(){doublea;intb;b=a=10/4;printf(“%d,%f\n”,b,a);}程序输出结果是:如果需要准确的结果应该怎么改写程序?2,2.000000\n第六章运算符和表达式\n第六章运算符和表达式算术运算符和表达式关系运算符和表达式逻辑运算符和表达式赋值运算符和表达式逗号运算符和表达式\n第六章运算符和表达式C语言中所有表达式都有一个值\n1算术运算符和算术表达式基本算术运算符运算符的优先级和结合性数值混合运算强制类型转换自增自减运算符\n1.1基本算术运算符+-*/%7%3=15/3=?5/3=1\n1.2运算符的优先级和结合性先乘除后加减\n自增自减运算符i++;++i;=i=i+1;i--;--I;=i=i-1;区别:inta,b;a=3;b=a++;\n算术表达式的值就是运算结果\n2关系运算符和表达式if(a>b)m=a;elsem=b;\n关系运算符6种<<=>>===!=注意:==\n关系表达式a>b关系表达式的值只有两个:真,假C语言中用1表示真,0表示假所以关系表达式的值:0或1例:printf(“%d”,2>1);\n关系表达式对于非关系表达式,C语言也能够判断出真假0为假非0为真if(3)If(a+b)\n关系表达式a=3;b=2;c=1;(a>b)==c;\n3逻辑运算符和表达式逻辑运算符(3个)&&||!(a>b)&&(c>d)逻辑表达式逻辑表达式的值只有0,1a=3;!a=?a=3;b=0;a&&b=?\n逻辑表达式的求解表达式1&&表达式2&&表达式3表达式1||表达式2||表达式3a=2;(a>3)&&(a=5)\n4赋值运算符基本赋值运算符复合的赋值运算符赋值表达式\n基本赋值运算符=会进行自动类型转换注意:设计完美的程序,一般不会出现:不同类型数据互相赋值的情况\n复合的赋值运算符+=-=*=/=%=a+=3;a=a+3;有点别扭,为什么\n赋值表达式从右边计算:a=b=c=5;a+=a-=a*a;赋值表达式的值,就是左边变量的值注意:值只能赋给变量a=2*3=3*4\n5逗号表达式inta,b;a=3,b=4;表达式1,表达式2,……表达式n逗号表达式的值式最右边的表达式没什么用,只是把两个表达式连在一起常用于for语句中\n第七章简单C程序设计之二\n第七章简单C程序设计之二多分支选择结构程序设计嵌套循环结构设计break语句和continue语句程序举例\n1switch语句intscore;scanf("%d",s);switch(s){case"A":printf("85-90\n");break;case"B":printf("70-85\n");break;case"C":printf("60-70\n");break;case"D":printf("<60\n");break;default:printf("error\n");break;}\nswitch语句switch语句的一般形式switch(表达式){case常量表达式1:语句组;break;case常量表达式2:语句组;break;......case常量表达式n:语句组;break;[default:语句组;[break;]}注意:break语句不是必须的\n2循环嵌套for(i=0;i<5;i++){for(j=0;j<5;j++){putchar(‘*’);}putchar(‘\n’);}\n循环嵌套例直角三角形倒直角三角形练习:等腰三角形九九乘法表\n3break和continue语句break语句退出当前循环例continue语句结束本轮循环跳过本次循环其它语句,直接执行下轮循环例\n4程序举例素数问题(筛选法)练习:完数排序选择冒泡插入多重循环遍历百元百鸡练习:搬砖问题\n第八章二维数组和字符数组\n8.1二维数组二维数组的定义二维数组元素的引用二维数组的初始化例题\n二维数组的定义inta[3][4];可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例把a看作是一个一维数组它有三个元素:a[0]、a[1]、a[2],每个元素又是一个包含3个元素的一维数组。a[0]……a[0][0] a[0][1] a[0][2]a[1]……a[1][0] a[1][1] a[1][2]a[2]……a[2][0] a[2][1] a[2][2]a\n二维数组的引用inta[3][4];a[1][2]=a[2][3];a[i][j]=i*j;二维数组对应一个矩阵二维数组的遍历例\n7.2.4二维数组的初始化可以用下面方法对二维数组初始化:(1)分行给二维数组赋初值。inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};(2)只用一个花括号,按数组排列顺序对各元素赋初值。inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};作用与(1)相同。\n7.2.4二维数组的初始化(3)可以只对部分元素赋值。例intb[2][3]={{1,2},{3}};b的数组元素为:例intb[2][3]={{1,2},{}};b的数组元素为:例intb[2][3]={{0,1},{0,0,3}};b的数组元素为:2030020000010003\n7.2.4二维数组的初始化(4)若对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度必须指定。系统会根据总个数,确定数组行数。例如:intb[2][3]={1,2,3,4,5,6};等价于intb[][3]={1,2,3,4,5,6};定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。例:inta[][4]={{1,2,3},{},{6,7,8,9}};这样写法,能通知编译系统,数组有三行。\n7.2.5例题例若有说明语句:inta[2][4];则对a数组元素的正确引用是:(A)a[0][3](B)a[0][4](C)a[2][2](D)a[2][2+1]\n7.2.5例题例若有说明语句:inty[][4]={0,0};,则以下叙述不正确的是:(A)数组y的每个元素都可得到初值0(B)二维数组y的行数为1(C)该说明等价于inty[][4]={0};(D)只有元素y[0][0]和y[0][1]可得到初值0,其余元素均得不到初值0\n7.2.5例题例若有说明语句inta[][3]={1,2,3,4,5,6,7,8,}则数组a的行数是:(A)3(B)2(C)无确定值(D)1\n7.2.5例题矩阵转置矩阵乘法\n多维数组inta[3][4][5];a[0][2][3]=5;\n8.2字符数组字符数组的定义和引用字符数组的初始化字符数组的输入和输出常用字符串函数\n字符数组与字符串C语言的基本数据类型中,无字符串C语言使用字符数组处理字符串\n字符数组的定义和引用charc[10];charc1[10][10];for(i=0;i<10;i++)printf(“%c”,c[i]);\n字符数组的初始化charc[10]={‘h’,’e’,’l’,’l’,’o’};\n字符数组的初始化charc[10]={‘h’,’e’,’l’,’l’,’o’};字符串初始化:charc[10]={“hello”};或charc[10]=“hello”;\n字符数组的初始化比较:charc[]={‘h’,’e’,’l’,’l’,’o’};charc[]=“hello”;\n字符数组的输入输出charc[]=“hello”;printf(“%s”,c);\n字符数组的输入输出charc[]={‘h’,’e’,’l’,’l’,’o’}charc[]={‘h’,’\0’,’e’,’l’,’l’,’o’,’\0’}输出结果?\n字符数组的输入输出charc[10];scanf(“%s”,c);不用加&,为什么?输入超长怎么办?\n字符数组的输入输出charstr1[10],str2[10];scanf(“%s%s”,c);输入多个字符串,用空格分开\n字符数组的输入输出charstr1[10],str2[10];scanf(“%s%s”,c);输入多个字符串,用空格分开\n常用字符串函数putsgetsstrcpystrncpystrcatstrcmpstrlen\n常用字符串函数1.puts(字符数组)将一个字符串输出到终端。输出的字符串中可以包含转义字符。如:charstr[]=“China\nBeijing”;puts(str);输出为:ChinaBeijing输出完字符串后换行。\n常用字符串函数2.gets(字符数组)从终端输入一个字符串到字符数组,并得到一个函数值。该函数值是字符数组的起始地址。函数调用如:gets(str);\n常用字符串函数3.strcat(字符数组1,字符数组2)连接两个字符数组中的字符串,字符串2接到字符串1的后面,结果放在字符数组1中。函数调用后,得到一个函数值:字符数组1的地址。说明:(1)字符数组1的长度要能容纳新字符串。(2)连接后取消字符串1后的‘\0’,只在新串的最后保留一个‘\0’。\n常用字符串函数4.strcpy(字符数组1,字符串2)将字符串2拷贝到字符数组1中去。说明:(1)字符数组1的长度不应小于字符串2的长度。(2)“字符数组1”必须写成数组名形式,“字符串2”可以是字符数组名或字符串常量。(3)‘\0’也一起拷贝到字符数组1中。(4)不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。而只能用strcpy函数处理。\n常用字符串函数5.strcmp(字符串1,字符串2)作用是按ASCII码值比较两个字符串,自左至右逐个字符相比,直到出现不同字符或遇到‘\0’为止。(1)若字符串1=字符串2,函数值为0。(2)若字符串1>字符串2,函数值为正整数。(3)若字符串1<字符串2,函数值为负整数。注意:两个字符串比较,不能用下面形式:if(str1==str2)printf(“yes”);而只能用下面形式:if(strcmp(str1,str2)==0)printf(“yes”);\n常用字符串函数6.strlen(字符数组)测字符串长度函数,函数值是字符串实际长度,不包括‘\0’在内。如:charstr[10]=“china”;printf(“%d”,strlen(str));输出结果是5,不是6,不是10。也可测字符串常量长度:strlen(“china”)\n常用字符串函数7.strlwr(字符串)将字符串中大写字母转换成小写字母。8.strupr(字符串)将字符串中小写字母转换成大写字母。\n常用字符串函数例判断字符串str1是否大于字符串str2,应当使用:(A)if(str1>str2)(B)if(strcmp(str1,str2))(C)if(strcmp(str2,str1)>0)(D)if(strcmp(str1,str2)>0)\n常用字符串函数例若有语句:chars1[10],s2[10]={“books”},则能将字符串books赋给数组s1的正确语句是:(A)s1={“books”};(B)strcpy(s1,s2);(C)s1=s2;(D)strcpy(s2,s1);\n第九章函数\n第九章函数函数的定义和调用函数声明参数传递和返回值数组参数变量的作用域嵌套调用和递归调用\n第九章函数函数是对程序的分解。一个c程序可由一个主函数和若干个函数组成。由主函数调用其他函数,其他函数也可互相调用。同一个函数可以被一个或多个函数调用任意多次。\n第九章函数从用户角度看,函数分为两种:(1)系统函数,也叫库函数。由系统提供。(2)用户自定义函数,用来解决用户的专门需要。\n9.1函数定义和调用intmax(inta,intb){intm;if(a>b)m=a;elsem=b;returnm;}voidmain(){inta=2,b=3,c;c=max(a,b);}\n9.1函数定义和调用printstar(){printf(“******************\n”);}print_message(){printf(“Howdoyoudo!\n”);}voidmain(){printstar();print_message();printstar();}\n函数定义函数定义语法:返回值类型函数名(参数表){函数体(语句以分号结束)}返回值可省,默认返回int型参数表可为空函数体也可为空函数定义要独立,不可嵌套\n函数调用语句printstar();表达式c=2*max(a,b);函数参数m=max(c,max(a,b));\n函数定义和调用编写函数时无需考虑何时调用调用函数时无需考虑如何实现\n9.2函数声明为什么要声明?编译器需要识别标识符和进行语法检查。什么时候需要声明?当调用下面的函数或另外文件的函数时。\n函数声明函数声明语法intmax(inta,intb);或intmax(int,int)为什么要包含头文件?\n9.3参数传递和返回值定义函数时,函数名后面括弧中的变量名称为“形式参数”(简称形参)。调用函数时,函数名后面括弧中的表达式称为“实际参数”(简称实参)。形参和实参是不同变量例值传递单向传递形参和实参类型要匹配intmax(inta,intb){if(a>b)returna;elsereturnb;}voidmain(){intx=2,y=3,z;z=max(x,y);}\n9.3参数传递和返回值intswap(inta,intb){intt;t=a;a=b;b=t;}voidmain(){intx=2,y=3;swap(x,y);}\n函数返回值如果函数有返回值,必须用return语句返回returna或return(a)执行到return语句,函数立即结束intmax(inta,intb){if(a>b)returna;elsereturnb;}\n9.4数组参数数组元素做函数实参与变量做实参一样,是单向传递,即“值传送”方式inta[10],m;m=max(a[0],a[1]);\n数组名作为实参形参也要定义为数组型同样是值传递为什么能够交换成功形参数组个数可以省intswap(inta[10]){intt;t=a[0];a[0]=a[1];a[1]=t;}voidmain(){inta[10];swap(a);}\n多维数组名作为实参有3×4的矩阵,求其中的最大元素。max_value(inta[][4]){inti,j,k,max;max=a[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(a[i][j]>max)max=a[i][j];return(max);}main(){inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf(“Maxvalueis%d\n”,max_value(a));}形参中只能省略行数为什么\n9.5局部变量和全局变量局部变量:函数形参和函数内部定义的变量只在函数体内有效只在函数调用时临时分配存储空间,函数结束后空间即释放全局变量:所有函数外定义的变量所有函数都可引用程序运行时即分配存储空间,程序结束后才释放\n9.5局部变量和全局变量intp=1,q=5;/*全局变量*/floatf1(a)/*定义函数f1*/inta;{intb,c;:}charc1,c2;/*全局变量*/charf2(intx,inty)/*定义函数f2*/{inti,j;}main()/*主函数*/{intm,n;:}全局变量c1、c2的作用范围全局变量p、q的作用范围\n9.5局部变量和全局变量floatMax=0,Min=0;/*定义两个全局变量*/floataverage(floata[],intn){inti;floataver,sum=a[0];Max=Min=a[0];for(i=1;iMax)Max=a[i];elseif(a[i]b?a:b;return(c);}main(){inta=8;/*a为局部变量*/printf(“%d”,max(a,b));}运行结果为8\n9.5局部变量和全局变量Static关键字使局部变量内存分配方式改为:静态分配Staticinta;Staticinta=1;例:记录函数被调用次数\n9.5嵌套调用和递归调用printstar(){printf(“******************\n”);}print_message(){printf(“Howdoyoudo!\n”);}voidmain(){printstar();print_message();printstar();}\n递归调用自己调用自己年龄问题阶乘汉诺塔\n递归调用递归函数:递推公式结束条件参数和返回值\n递归调用程序输出结果:Intf(intn){printf(“%d”,n%10);if(n>10)f(n/10);}f(123);\n第十章指针\n第十章指针指针的基本概念指针与数组指针与字符串指针与函数二级指针\n10.1指针的基本概念变量的属性值a地址&a例指针专门存放地址的变量\n10.1指针的基本概念指针的定义和引用(*运算符)Int*p;Inta;p=&a;a=123;*p=456;变量的访问方式:直接访问:变量名间接访问:通过指针(地址)2100a1000p123...2100......为什么叫”指针”&p=?&*p=?*&a=?指针为什么要有类型(void型指针)\n10.1指针的基本概念指针也是变量\n10.1指针的基本概念现在我们可以做点什么?两个指针指向同一个变量Swap函数Scanf函数\n10.1指针的基本概念指针可以随意赋值吗?野指针空指针\n10.1指针的基本概念指针的加减运算指针的比较\n10.1指针的基本概念指针定义细节Int*p1,*p2;Int*p1,a;\n指针的运算指针的加减指针的比较\n10.2指针与数组指针与数组几乎没有区别?Inta[10]Int*p;\n指针与一维数组指针与数组几乎没有区别?Inta[10]Int*p=a;a[1]==p[1]*(p+1)==*(a+1)指针指向数组元素数组遍历(指针运算和比较)\n指针与一维数组指针与一维数组的区别数组名是常量指针定义数组的时候分配存储空间指针不分配,“必须”指向其他有效空间。malloc函数\n指针与二维数组指向二维数组的元素指向一维数组的指针指针数组命令行参数\n指向二维数组的元素inta[3][4];int*p;p=a;二维数组元素值和地址的获得二维数组行地址的获得二维数组的遍历\n指向二维数组的元素inta[3][4];int*p;p=a;二维数组的运算a=*a???p+i==&p[i]*(p+i)==p[i]aa[1]a+3a[1]+3pp[1]p+3p[1]+3\n指向二维数组的元素已知:inta[3][7];下列表示中____不是数组的元素。A:*(a+1)[5]B:*(*a+3)C:*(*(a+1))D:*(&a[0][0]+2)\n指向数组的指针指向一维数组(一行)的指针inta[3][4];int(*p)[4];p=a;读c语言标识符的方法:先右后左,遇)返回左小括号(表示函数左中括号[表示数组数组指针的运算p==*p???元素值和地址的获得\n指针数组数组元素为指针类型int*a[10];char*s[10];主要用来处理字符串和二维数组的关系main函数的参数\nmain函数的参数命令行参数voidmain(intargc,char*argv[]){}\n10.3指针与字符串字符数组的初始化chars[10]=“hello”;s=“world”;×char*p=“hello”;p=“world”常量字符串的含义字符数组初始化的含义\n10.3指针与字符串例:程序输出结果char*p=“student”if(p==“students”)printf(“yes”);elseprintf(“no”);\n10.4指针与函数指针作为函数参数指针作为返回值指向函数的指针函数指针作为参数\n指针作为函数参数在函数形参中数组与指针再次等价voidswap(inta[]){……}voidswap(int*a){……}\n指针作为返回值返回值的危险:不能返回指向局部变量的指针例:星期malloc函数\n指向函数的指针程序和数据都放在内存中函数指针的定义:int(*p)(int,int);读c语言标识符的方法:先右后左,遇)返回左小括号(表示函数左中括号[表示数组\n指向函数的指针函数指针赋值和调用int(*p)(int,int);p=max;/*函数名的含义*/m=(*p)(a,b);m=p(a,b);\n函数指针作为函数参数intf1(inti){……;}intf2(int(*f)(int)){……f(1);……}例:定积分\n10.4二级指针指向指针的指针int**p;P271例10.27\n指针定义小结inti;定义整型变量i。int*p;p为指向整型数据的指针变量。inta[n];定义整型数组a,它有n个元素。int*p[n];定义指针数组int(*p)[n];定义指向数组指针int*p();p为返回一个整型指针的函数int(*p)();函数指针int**p;二级指针\n作业P27910.19\n第十一章预处理命令\n第十一章预处理命令预处理命令的概念和特点#define命令#include命令\n11.1预处理命令的概念和特点程序编译前处理的命令不是c语句,不能运行以#号开始\n11.2#define命令不带参数(符号常量)#definePI3.14#define执行过程字符串替换宏名\n9.2#define命令不检查语法不加分号定义在函数外部#undef命令定义中可引用其他宏字符串中不置换加了会怎样\n11.2#define命令(带参数)#defines(a,b)a*b……m=s(3,5)注意:不能加空格#defines(a,b)a*b\n11.2#define命令(带参数)与函数区别只进行字符串替换,不求值s(2+3,3+4);s(a+b,c+d);不检查类型s(1.2,2.5);怎么解决\n11.3#include命令#include或#include“文件名”可嵌套包含#include“file2.c”file2.cfile1.cABBA包含\n#include结合#definepi.h文件#definePI3.14#defineS(r)PI*r*r;Main.c#include………………\n第十三章结构体和共用体\n第十三章结构体和共用体概述结构体的定义和引用结构的初始化结构体数组结构体和指针链表共用体枚举类型\n13.1概述C语言的基本数据类型并不能满足需要结构体是一种自定义数据类型,将基本数据类型组合在一起构成新的数据类型例:学生成绩管理系统不用结构体怎么做\n13.2结构体定义和引用定义结构体数据类型structstudent{intid;charname[20];intscore};定义结构体变量structstudentst;st的大小?\n结构体的引用structstudentst;st.id=1;strcpy(st.name,“abc”);st.score=95;结构体的成员变量和普通变量一样结构体赋值:structstudentst1,st2;st1=st2\n几点说明最后的分号不能省注意结构体类型和结构体变量的区别结构体内部的变量名可以和外部其他变量重名结构体的成员也可以是结构体例:P283身份证结构\n几点说明可以在定义结构体时同时定义变量structstudent{intid;charname[20];intscore}s1,s2;可以只定义变量structstudent{intid;charname[20];intscore}s1,s2;\n结构体变量的初始化structstudentst={1,“abc”,95};\n结构体数组structstudentst[50];st[1].id=1;st[1].score=95;st[2].id=2;st[2].score=86;\n结构体数组的初始化structstudentst[]={{1,“abc”,95},{2,“def”,86},{3,“ghi”,93},......{50,“xyz”,89}};\n13.4结构体和指针指针作为结构体的成员变量structstudent{intid;char*name;intscore};注意:赋值的危险\n13.4结构体和指针指向结构体的指针变量Structstudent*ps;运算引用:->运算符(*ps).idps->id\n指向结构体的指针变量Structstudent*ps,st;ps=&st;(*ps).id=1;(*ps).score=95;*ps.id=1;×ps->id=1;ps->score=95;\n13.4结构体和指针特例:结构体中包含指向本结构体类型的指针structlist{chardata;structlist*next;};\n13.5链表链表概述简单链表链表输出动态建立链表链表元素的删除链表元素的插入\n13.5.1链表概述链表是一种数据结构,他可以动态分配内存。malloc函数?链表的每个结点:数据下一个结点的指针1250head1250A2000B1366CNULL20001366NULL头指针结点表尾\n13.5.2简单链表structlist{chardata;structlist*next;};例:\n13.5.3链表的输出(遍历)structlist*p;p=head;while(p!=NULL){printf(“%c“,p->data);p=p->next;}\n13.5.4动态链表的建立所需函数malloc函数void*malloc(unsignedintsize);p=(int*)malloc(10*sizeof(int));calloc函数void*calloc(unsignedn,unsignedsize);p=(int*)calloc(10,sizeof(int));free函数voidfree(void*p);free(p);\n13.5.4动态链表的建立建立过程:初始化头指针生成新结点给结点赋值将新节点插入链表的末尾\n13.5.5链表元素的删除删除中间节点删除第一个节点空表和找不到结点的情况\n13.5.6链表元素的插入插入位置中间(末尾)头部\n13.6共用体几个不同类型变量共享同一段内存中,是一种节省内存的方法uniondata{inti;charc;floatf;};uniondataa,b;a.i=1;a.c=‘x’;\n13.6共用体任一时刻,共用体变量“只能”被看作其成员中的一个例共用体成员的地址相同不能把共用体变量作为函数参数和返回值\n13.6共用体例题:#includemain(){union{intk;chari[2];}a;a.i[0]=0x39;a.i[1]=0x38;printf("%x\n",a.k);}输出结果是A)3839B)3938C)380039D)390038\n13.7枚举类型用标识符代替整数如果一个变量只有几种可能的值,可以定义为枚举类型。声明枚举类型:enumweekday{sun,mon,tue,wed,thu,fri,sat};0123456定义枚举类型变量enumweekdayw;w=mon;w=wed;\n13.7枚举类型枚举元素按整数常量处理。可以改变枚举元素的值,在定义时指定,如:enumweekday{sun=1,mon,tue,wed,thu,fri,sat};enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat}workday;定义sun=7,mon=1,以后顺序加1,sat为6。\n13.7枚举类型例:设有定义语句:enumt1{a1,a2=7,a3,a4=15};则枚举常量a1和a3的值分别为_____。\n13.7枚举类型一个整数“不能”直接赋给一个枚举变量。如:workday=2;是错的。它们属于不同的类型。强制类型转换后才能赋值。如:workday=(enumweekday)2;它相当于将顺序号为2的枚举元素赋给workday,相当于:workday=tue;甚至可以是表达式。如:workday=(enumweekday)(5-3);\n用typedef定义类型可以用typedef声明新的类型名来代替已有的类型名。如:typedefintINTEGER;typedeffloatREAL;这样,以下两行等价:inti,j;floata,b;INTEGERi,j;REALa,b;。如果整型变量i、j用来计数,可以:typedefintCOUNT;COUNTi,j;\n可以声明结构体类型:typedefstruct{intmonth;intday;intyear;}DATE;DATE是新类型名,它代表上面定义的一个结构体类型。可以用DATE定义变量:DATEbirthday;DATE*p;还可以进一步:1、typedefintNUM[100];(定义NUM为整型数组类型)NUMn;(定义n为整型数组变量)2、typedefchar*STRING;(定义STRING为字符指针类型)STRINGp,s[10];(p为字符指针变量,s为指针数组)3、typedefint(*POINTER)();(定义POINTER为指向函数的指针类型,该函数返回整型值)POINTERp1,p2;(p1,p2为POINTER类型的指针变量)归纳起来,声明一个新类型名的方法是:1、先按定义变量的方法写出定义体(如:inti;)。2、将变量名换成新类型名(如:将i换成COUNT)。3、在最前面加typedef(如:typedefintCOUNT)。4、然后可以用新类型名去定义变量。