版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章C语言的基本词法一、字符集1.什么是字符集
在C语言程序中允许出现的所有基本字符的组合称为C语言的字符集。2.字符集分类(1)大小写英文字母(52个)(2)数字符号(10个)(3)键盘符号(33个)(4)转义字符3.转义字符的作用、表示方法(1)作用:通常用来表示键盘上的控制代码或特殊符号。(2)表示方法:由“反斜杠字符(\)”后跟单个字符或若干个字符组成。(3)常用转义字符:
\n,\t,\a,\”,\’,\\,\ddd,\xhh二、保留字1.什么是保留字在C语言的程序中有特殊含义的英语单词称为保留字。2.保留字的作用主要用于构成语句、进行存储类型和数据类型的转换。3.常用保留字可参考教材。三、标识符1.什么是标识符标识符是用户自定义的一种字符序列,通常用来表示程序中需要辨认的对象名称。2.标识符的命名规则(1)标识符是由字符或下划线开头的字母、数字、下划线组成的一串符号;(2)保留字不能作为标识符。正确标识符:sumia2a_2_a2_a_2错误的标识符:2aa?c.ga-2ifwhile第2章基本数据类型和运算2.1C语言的数据类型整型实型字符型无值型指针型数组结构型枚举型共用型基本类型构造类型2.2常量一、什么是常量二、常量类型
整型常量、实型常量、字符常量、字符串常量三、常量特点四、各种类型常量说明1.整型常量(1)
整型常量就是整数,包括正整数、负整数及0;(2)整型常量有三种书写方式十进制整数:0、-111、+15、21八进制整数:00、-0111、+015、021十六进制整数:0x0、-0x111、0x21(3)整型常量在机内存放一般占2个字节,所表示的范围-32768~+32767(4)为了扩大数值范围,C语言提供“长整型常量”,长整型常量在机内存放占4个字节。表示方法是在数的后面加一个L或l字母。(0L、40000L)2.实型常量(1)
实型常量就是带小数点的实数,也称为浮点数;(2)实型常量书写方式有两种:一般形式的实数:12.345、-1.23456、7.0指数形式的实数:-1.2345E3.0、0.12345e4(3)实型常量在机内存放一般占4个字节;3.字符常量(1)
字符常量就是用两个单引号(‘)前后括住的单个字符;例如:’a’、’A’、’1’、’%’(2)转义字符也可以组成字符常量;例如:‘\n’、’\101’、’\x41’(3)字符常量在机内存放一般占1个字节;4.字符串常量(1)
字符串常量就是用两个双引号(“)前后括住的若干个字符;例如:”abc”、”ABC”、”112”(2)转义字符也可以出现在字符串常量中;例如:“123\n4\\”、”\”1\43\n2\x11\””(3)字符串常量在机内存放所占用的字节数等于字符串长度+1;2.3变量一、基本问题1.什么是变量2.变量的命名规则3.变量的特点(1)变量在内存中要占用连续的若干个字节;(2)所占用的字节数由变量的数据类型确定;(3)变量使用必须要先定义。二、变量的数据类型及其定义1.变量定义格式[存储类型符]数据类型符变量名1,变量名2,……;
2.变量数据类型数据类型类型符号占用字节数数据类型类型符号占用字节数整型int2无符号长整型unsignedlong4短整型short2单精度实型float4长整型long4双精度实型double8无符号整型unsignedint2字符型char1无符号短整型unsignedshort23.变量存储类型三、变量的初始化1.变量赋初值的语句格式:[存储类型符]数据类型符变量名1=初值,变量名2=初值;
2.几点说明存储类型存储类型符存储地点自动型auto内存堆栈区寄存器型registerCPU的通用寄存器静态型static内存数据区外部参照型extern3.举例分析例1:main(){inta;staticintb;printf(“%d”,a);‘将输出不确定的值
printf(“%d”,b);‘将输出0}例2:voidf1();main(){f1();f1();}voidf1(){inta=3;staticintb=4;printf(“%d,%d”,a,b);a=a+1;b=b+1;}说明:(1)第1次调用f1(),将输出3,4(2)第2次调用f1(),将输出3,5四、变量的生存期和作用域1.什么是内部变量和外部变量
把在函数(或某个复合语句)内定义的变量称为“内部变量”,把在函数外定义的变量称为“外部变量”。2.什么是变量的生存期
我们把变量从开始分配内存单元到分配的内存单元被收回的期间称为变量的生存期。3.什么是变量的作用域
在变量的生存期中,我们把变量可以使用的程序区域称为变量的作用域。4.作用域的分类全局变量:生存期覆盖了定义点到整个程序结束的变量称为全局变量。局部变量:生存期只覆盖某个函数(或某个复合语句)的变量称为局部变量。5.几点说明6.举例分析
inta1;main(){inta2;{inta3;}}inta4;voidf1(){inta5;staticinta6;}2.4运算符基本问题1.什么是运算符
用来表示各种运算的符号称为运算符。2.运算符特点(1)运算符必须有运算对象,运算对象都有规定的数据类型,同时运算结果也有确定的数据类型。(2)每个运算符都有自己特定的运算规则。(3)当表达式中出现多个运算符时则必须考虑运算符的优先级。(4)同级别的运算符还规定了结合性。一、算术运算符包括基本算术运算符和增1、减1运算符两种1.基本算术运算符(1)有哪些运算符号(2)特点(3)举例说明运算符名称优先级结合性+、-取正、取负2自右向左*、/、%乘、除、取余数3自左向右+、-加、减4自左向右2.增1、减1运算符(1)有哪些运算符号(2)特点①增1、减1的运算对象必须是变量或数组元素;②增1(或减1)运算符作为前缀使用时,是先对运算对象加1(或减1),然后再使用加1(或减1)后的运算对象。③增1(或减1)运算符作为后缀使用时,是先使用不加1(或减1)的运算对象,然后再对运算对象加1(或减1)。运算符名称优先级结合性++增12自右向左--减1二、关系运算符1.关系运算有哪些运算符号2.关系运算符的特点①关系运算符可以用来比较两个数值型数据的大小,也可以比较两个字符型数据的大小。②关系运算符的运算结果是逻辑值,若为“真”用整数1表示,若为“假”用整数0表示。运算符名称优先级结合性>=、>、<=、<大于等于、大于、小于等于、小于6自左向右==、!=等于、不等于7自左向右三、逻辑运算符1.逻辑运算有哪些运算符号2.逻辑运算符的特点①逻辑运算符运算对象是数值型或字符型等;如果是非0表示逻辑真,0表示逻辑假。②运算结果是逻辑值,如运算结果为真用1表示,若为假则用0表示。运算符名称优先级结合性!逻辑非2自右向左&&逻辑与11自左向右||逻辑或12自左向右3.注意几点①用“&&”对两个表达式进行计算时,若第1个表达式的值为“假”,则与第2个表达式的值无关,结果肯定为“假”,所以C语言规定此时第2个表达式不再计算。②用“||”对两个表达式进行计算时,若第1个表达式的值为“真”,则与第2个表达式的值无关,结果肯定为“真”,所以C语言规定此时第2个表达式不再计算。四、赋值运算符
赋值运算符分为三种:基本赋值运算符、算术自反赋值运算符、位自反赋值运算符1.基本赋值运算符(1)运算符号(2)特点①赋值运算符的前面必须是变量,后面是表达式;②赋值运算符是先计算表达式的值,再把值赋给变量。运算符名称优先级结合性=赋值14自右向左2.算术自反赋值运算符(1)运算符号(2)特点
该运算符是将某个变量和表达式进行指定算术运算后的结果赋予该变量。运算符名称优先级结合性+=加赋值14自右向左-=减赋值*=乘赋值/=除赋值%=模赋值五、逗号运算符1.运算符号2.特点(1)该运算符是双目运算,其运算对象是表达式;(2)运算规则是依次计算前、后表达式的值;(3)运算结果是后表达式的值。运算符名称优先级结合性,逗号15自左向右六、条件运算符1.运算符号2.特点(1)该运算符是三目运算符,其三个运算对象是表达式(e1?e2:e3);(2)运算规则是如果e1表达式为“真”,取e2表达式的值,否则取e3表达式的值。运算符名称优先级结合性?:逗号13自右向左七、长度运算符1.运算符号2.特点(1)其运算对象可以是任何数据类型或变量;(2)运算对象必须用圆括号括住。运算符名称优先级结合性sizeof长度2无八、位运算符(一)基本问题1.什么是位运算是一种对运算对象按二进制位进行操作的运算。2.位运算的特点(1)位运算不允许只操作其中的某一位,而是对整个数据按二进制位进行运算;(2)位运算的对象只能是整型数据(包括字符型),运算结果仍是整型数据。(3)位运算符分为位逻辑运算符、位移位运算符、位自反赋值运算符三种。(二)位逻辑运算符1.运算符号2.特点位逻辑运算符是将数据中每个二进制位上的“0”或“1”看成逻辑值,逐位进行逻辑运算。运算符名称优先级结合性~位非2自右向左&位与8自左向右^按位加9自左向右|位或10自左向右(三)位移位运算符1.运算符号2.特点(1)该运算符是将数据看成是二进制数,对其进行向左或向右移动若干位的运算;(2)该运算符是双目运算,第一运算对象是移位对象,第二个运算对象是所移的二进制位数。运算符名称优先级结合性<<左移5自左向右>>右移自左向右(四)位自反赋值运算符1.运算符号2.特点该运算符是将某个变量和表达式进行指定位运算后的结果赋予该变量。运算符名称优先级结合性&=位与赋值14自右向左^=按位加赋值|=位或赋值<<=位左移赋值>>=位右移赋值2.5表达式1.什么是表达式用运算符将运算对象连接形成的式子就是表达式。2.表达式的特点(1)每个表达式都可以按照其中运算符的优先级和运算规则依次对运算对象进行运算,最终获得一个数据,该数据称为表达式的值。(2)表达式值的数据类型就称为表达式的数据类型。3.表达式的分类主要有六种:算术表达式、关系表达式、逻辑表达式、条件表达式、赋值表达式和逗号表达式。4.表达式计算时的数据类型转换(1)为什么计算时数据类型要转换(2)转换方法①表达式计算中数据类型的自动转换原则特点:参加运算的各个数据都转换成数据长度最长的数据类型,然后计算。计算结果值当然就是数据长度最长的数据类型。例如:设i为int,f为float,d为double,e为long则10+a+i*f-d/e的结果是double。②运算结果存入变量时数据类型的自动转换原则特点:先将运算结果的数据类型自动转换成变量的数据类型,然后再赋予该变量。3.2赋值语句1.赋值语句是最常用的表达式语句,由赋值表达式加分号构成。2.赋值语句有三种形式:(1)简单赋值:x=2*y+1;(2)多重赋值:x=y=z=3;(3)复合赋值:x+=y;3.使用赋值语句需注意以下两点:(1)定义变量时若赋初值则不能采用多重赋值形式。例如:intx=y=z=0;
是错误形式。而应改写成:
intx=0,y=0,z=0;而赋值语句x=y=z=0;
是正确形式。(2)赋值表达式可以出现在任何表达式中,而赋值语句则不能。例如:x=(y=2)+(z=3+y);
是正确的。而:x=(y=2;)+(z=3+y;);
是错误的。
3.3数据的输出一、基本说明1.C语言本身没有直接提供用于输出的语句,它是通过输出函数来实现的(例如:putchar函数、printf函数)。2.由于C语言将上述标准输出函数的原型放在头文件stdio.h中,因此在编写程序时,要在源程序的开头用#include“stdio.h”命令将头文件stdio.h包括到用户源程序中。(但是printf函数除外)二、putchar函数1.函数调用格式:putchar(参数);
其中:参数可以是一个字符型变量、整型变量或一个字符型常量(包括控制字符和转义字符)。2.功能:是在显示器上输出一个参数对应的字符。例如:charch1=‘C’;inta=105;
putchar(ch1);/*输出字符C*/
putchar(a);/*输出字符i*/
putchar(‘n’);
/*输出字符n*/
putchar(‘\n’);
/*输出回车换行*/三、printf函数1.函数调用格式:
printf(“格式控制字符串”,表达式1,表达式2,…);2.功能:按照自右向左的顺序,依次计算各表达式的值,然后按照“格式控制字符串”中规定的格式输出到显示器上显示。例如:
inta=3,b=2;printf(“%d,%d”,b=a<b,a=a<b);输出结果:1,0
3.说明:(1)输出项可以是变量、常量和表达式。(2)格式控制字符串中允许包含格式编辑符和原样输出的字符串。例如:“c=%d”
(是一个格式控制字符串)(c=是原样输出的字符串,%d是格式编辑符)(3)格式编辑符用于指定输出格式,其形式为:
%[格式修饰]格式字符(4)格式字符的符号及功能如下表所示:4.举例分析:例3-1
格式字符数据对象输出形式数据输出方法%-mdint,shortunsignedintunsignedshortchar十进制整数无m按实际位数输出有m输出m位超过m位,按实际位数输出不足m位,补空格无(-)右对齐(左补空格)有(-)左对齐(右补空格)%-mo八进制整数%-mx十六进制整数%-mu无符号整数%-mldlongunsignedlong十进制整数%-mlo八进制整数%-mlx十六进制整数%-mlu无符号整数%-m.nffloatdouble十进制小数无m.n按实际位数输出有m.n输出n位小数,总宽度为m%-m.ne十进制指数%-mcchar,int,short单个字符无m输出单个字符,有m输出m位,补空格%-m.ns字符串一串字符无m.n按实际字符串输出全部字符有m.n仅输出前n个字符,补空格3.4数据的输入一、基本说明1.C语言本身没有直接提供用于输入的语句,它是通过输入函数来实现的(例如:getchar函数、scanf函数)。2.由于C语言将上述标准输出函数的原型放在头文件stdio.h中,因此在编写程序时,要在源程序的开头用#include“stdio.h”命令将头文件stdio.h包括到用户源程序中。(但是scanf函数除外)二、getchar函数1.函数调用格式:getchar()2.功能:从键盘输入一个字符。3.说明:该函数只能接收一个字符,而且得到的是字符的ASCII码。该值可以赋给一个字符型变量或一个整型变量。4.举例说明例3-2三、scanf函数1.函数调用格式:
scanf(“格式控制字符串”,输入项1,输入项2,…);2.功能:按指定的格式接收由键盘输入的数据,并存入输入项变量所在的内存单元中。3.说明:(1)格式控制字符串中允许包含格式编辑符和原样输入的字符串。例如:“c=%d”
(是一个格式控制字符串)(c=是原样输入的字符串,%d是格式编辑符)(2)格式编辑符用于指定输入格式,其形式为:
%[格式修饰]格式字符格式字符用于规定相应输入项的输入格式,其字符如下表所示:(3)输入项必须为变量的地址,通常用“&变量名”组成。例如:定义intx;用scanf(“%d”,x);是错误的。用scanf(“%d”,&x);是正确的。
格式字符数据对象输入形式数据输入方法%mdint,shortunsignedintunsignedshortchar十进制整数无m按实际位数输入有m输入m位,不足m位则跟回车键%mo八进制整数%mx十六进制整数%mld
longunsignedlong十进制整数%mlo八进制整数%mlx十六进制整数%mf%mefloat十进制小数十进制指数%mlf%mledouble%mcchar单个字符无m仅取单个字符,有m输入m位,仅取第一个字符%ms字符串一串字符无m取若干个字符直到回车或空格为止,有m仅取前m个字符(4)输入数据时,数据与数据之间应使用分隔符。分隔符有两种形式:一种是在输入格式控制串中给定的,例如scanf(“%d,%d”,&x,&y);其分隔符为逗号(,)。另一种是空格、制表符(Tab)或换行符,它们不是在输入格式控制串中给定的,而是用户在键入数据时随机使用的。例如:scanf(“%d%d”,&x,&y);执行时就可以用以上方法作为输入数据之间的分隔符。(5)键入数据的类型、宽度应该与格式控制中给定的相一致。例3-3第四章选择结构程序设计一、概述:1.什么是选择结构在程序执行中依据条件判断,确定某些操作是做还是不做,或者确定若干操作中选择哪个操作来执行。2.选择结构有两种形式If语句(单分支结构、双分支结构、多分支结构)switch语句4.1if语句一、单分支结构1.形式:
if(表达式)语句;2.语义:若表达式的值为非0,就执行“语句”,否则直接执行if语句的后继语句。表达式语句块非003.说明(1)“表达式”允许是任何表达式,而且两侧的圆括号不可少。(2)如果“语句块”包含多个语句,必须用{}将其括成复合语句。二、双分支结构1.形式:
if(表达式)
语句块1;
else
语句块2;2.其语义是:如果表达式的值为非0,则执行“语句块1”,然后跳出if结构,执行后续语句;若表达式的值为0,则执行“语句块2”,之后跳出if结构,往下执行后续语句。表达式语句块1语句块23.说明“表达式”允许是任何表达式,而且两侧的圆括号不可少。如果“语句块”包含多个语句,必须用{}将其括成复合语句。else必须与if语句配对使用,而且总是和最近的if配对。例如:
if(c>=‘0’&&c<=‘9’)if(c==‘5’)y=0;elsey=1
if(c>=‘0’&&c<=‘9’){if(c==‘5’)y=0;}elsey=1三、多分支结构1.形式:
if(表达式1)
语句块1;
elseif(表达式2)
语句块2;
elseif(表达式3)
语句块3;
else
语句块4;2.说明
多分支if语句的执行步骤是:首先判断表达式1的条件是否成立,若成立就执行语句1,否则判断表达式2的条件是否成立,若成立就执行语句2……依次类推,若所有的条件都不成立,就执行else后面的语句,然后出口。4.2switch语句1.作用:用于实现多分支选择结构问题。2.形式:
switch(表达式){case常量表达式1:语句1;[break;]case常量表达式2:语句2;[break;]
…
case常量表达式n:语句n;[break;][default:语句n+1;]}3.该语句的含义是:(1)先计算switch右边表达式的值,并将其逐个与case行中“常量表达式”的值相比较,若相等,则执行case行给出的语句,若有break语句则跳出switch语句执行后续语句;(2)若没有break语句则继续执行后续case行所给出的语句;(3)如果所有的常量表达式都不匹配,则执行default行指引的语句。4.说明(1)该结构中{}必不可少,其中的语句是switch语句体;(2)case后跟的常量表达式与冒号一起构成语句标号。case和常量表达式之间必须要有空格,常量表达式的值必须唯一。(3)switch后面的表达式可以是整型、字符型,但不能是实型。表达式的值与常量表达式的值应保持类型一致。(4)case后面跟的语句允许是多条语句,可以不加{}。一个语句也可以被多个case共用。
例如:case1:case2:printf(“ok”);第五章循环结构程序设计一、概述:1.什么是循环结构
在程序执行中当满足某个特定的条件时,重复执行某段程序,直至条件不满足为止,这种结构就称为循环结构。2.循环结构有三种类型当型结构(while结构)直到型结构(do-while结构)已知循环次数的结构(for结构)5.1当型循环结构(while结构)1.形式:
while(表达式)语句;2.语义:先计算表达式的值,判断其是否为0,若为非0,表示循环条件满足,就执行循环体,如此重复,直至表达式的值为0,退出循环执行后继语句。循环语句表达式后继语句0非03.说明(1)表达式可以是任意合法的表达式,并以它作为判别循环体执行与否的条件。若表达式的值为非0表示条件成立;若为0表示条件不成立。(2)“语句”是重复执行部分,称之为循环体。(3)循环体中可以只包含一句语句,也可以包含多个语句。若为多条语句,必须用{}括起来,组成一个复合语句,否则while语句只将第一句语句视为循环体。(4)循环体中必须要有改变条件表达式值的语句,否则将成为死循环。(5)该循环结构由于先判断循环条件,当一开始条件就不成立循环体就不会执行,所以该循环结构又可称允许0次循环的结构。举例说明:例5-1#include“stdio.h”main(){charc;while((c=getchar())!=’\n’)switch(c){case‘0’:case‘1’:putchar(c+2);case‘2’:putchar(c+3);break;case‘3’:putchar(c+4);default:putchar(c+1);break;}printf(“\n”);}假设从键盘上输入:420回车则程序运行结果为:55325.2直到型循环结构(do-while结构)1.形式:
do
语句;
while(表达式);2.语义:先执行循环体一次,然后判断表达式是否成立,若为非0,表示循环条件满足,就继续执行循环体,如此重复,直至表达式的值为0,退出循环执行后继语句。表达式后继语句循环语句0非03.说明(1)表达式可以是任意合法的表达式。(2)“语句”是重复执行部分,称之为循环体。(3)循环体中可以只包含一句语句,也可以包含多个语句。若为多条语句,必须用{}括起来,组成一个复合语句,否则只将第一句语句视为循环体。(4)循环体中必须要有改变条件表达式值的语句,否则将成为死循环。(5)该循环结构由于先执行循环语句再判断循环条件是否成立,所以该循环结构又可称不允许0次循环的结构。5.3已知循环次数的循环结构(for结构)1.形式:for(表达式1;表达式2;表达式3)语句;2.语义:(1)先计算“表达式1”的值;(2)再计算“表达式2”的值,并判断其是否为0,若非0,则执行循环体一次,否则跳出循环,执行for语句的后续语句;(3)计算“表达式3”的值,然后转到步骤(2)重复执行。注:for语句的语义也可用下图表示:
求表达式1的值表达式2循环体语句求表达式3的值后续语句非003.说明(1)在整个for循环执行过程中,“表达式1”只计算一次,“表达式2”和“表达式3”可能计算多次;循环体可能多次被执行,也可能一次也不执行。(2)循环体中可以只包含一句语句,也可以包含多个语句。若为多条语句,必须用{}括起来,组成一个复合语句,否则只将第一句语句视为循环体。(3)for循环结构的循环体可以是空语句。(4)for语句中的各表达式都可以省略,但分号间隔符不能少。例如:
for(;表达式2;表达式3)
for(表达式1;;表达式3)
for(表达式1;表达式2;)
for(;
;)若表达式1省略,则表达式1的计算必须在for语句的上面完成。若表达式2省略,则循环体中必须要有控制循环结束的break语句,否则将会死循环。若表达式3省略,则表达式必须在循环体内完成。
5.4循环结构中的转移语句一、break语句1.形式:break;2.功能:是终止当前的循环,转向后继语句执行。例如:for(x=1,y=0;x<=10;x++){y=y+x;
if(y>5)break;printf(“y=%d\n”,y);}
当x=3时,y的值为6,使if(y>5)的表达式的值为1,于是执行break语句,跳出for循环体。二、continue语句1.形式:continue;2.功能:对于while和do-while语句,其功能是结束本次循环转去求循环条件表达式的值,而在for语句中,则是求解表达式3的值。While(表达式){…continue;…}do{…continue;…}While(表达式);for(;;){…continue;…}5.5循环结构的嵌套1.含义:当一个循环语句的循环体中又出现另一个循环语句时,就构成了循环的嵌套。2.形式:while()…while()…do…do…while();while();for(;;)…for(;;)…3.说明(1)不要将循环的嵌套和并列混为一谈。例如:
for(i=1;i<3;i++){for(j=1;j<=2;j++)printf(“%d\t”,i*j);for(k=2;k<4;k++)m=i*k;s=s+m;}其中,j循环和k循环为并列关系,它们都是i的内层循环。(2)由于内循环是外循环的循环体,因此外循环每执行一遍,内循环从初值到终值完整执行一周。例如:
for(i=1;i<=3;i++)for(j=1;j<=2;j++)printf(“%d\t”,i*j);
内层循环体printf(“%d\t”,i*j);共执行了3*2(6)遍。例1:编写程序,打印出所有的“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。如:153=13+53+33,故153是水仙花数。main(){inti,x1,x2,x3;for(i=100,i<=999;i++){x1=i%10;/*取个位数*/x2=(i/10)%10;/*取十位数*/x3=i/100;/*取百位数*/if(x1*x1*x1+x2*x2*x2+x3*x3*x3==i)printf(“%d\t”,i);}}第六章数组6.1数组的概述:1.什么是数组
数组是一组相同类型变量的集合。2.数组的特点(1)数组中的每一个成员称为“数组元素”。每一个“数组元素”都有相同的名称,但用不同的下标来区分。(2)每一个数组元素都可以当做单个变量来使用,但它们的数据类型都必须是相同的。(3)数组的类型可以是整型、实型、字符型、指针型、结构型等(4)数组根据其下标的个数可分为一维数组、二维数组及多维数组。6.2数组的说明一、数组说明形式1.形式:存储类型数据类型数组名[长度1][长度2]……2.说明:(1)数组说明的作用是为数组预留空间。(2)数据类型可以是int、float、double、char等基本类型,也可以是指针型或结构类型。(3)数组名是按照“标识符”的规则构成的。(4)长度定义了数组中所含元素的个数,通常是一个整型常数。(5)方括号[]为下标运算符,其个数决定了数组的维数。例如:
inta[5],b[2][3];charc[20];floatd[4][3];
这里一共定义了四个数组,其中a为一维整型数组,有5个元素;
b为二维整型数组,有2行3列共6个元素;
c为一维字符型数组,有20个元素;
d为二维实型数组,有4行3列共12个元素。二、使用数组的注意事项1.在C语言中,数组元素的下标起始值为0而不是1。例如:inta[5],b[2][3];
那么a数组包含的数组元素为:
a[0],a[1],a[2],a[3],a[4]
b数组的元素为:b[0][0]、b[0][1]、b[0][2]b[1][0]、b[1][1]、b[1][2]2.[]中的长度必须为正整数。它们的乘积确定了整个数组的长度。3.[]中不允许使用变量定义数组长度;但允许包含符号常量和sizeof表达式6.3数组的引用一、下标变量的表示形式1.什么是下标变量:数组中的每一个元素可以当做一个变量来使用,这种变量必须以下标形式表示。2.表示形式:数组名[下标1][下标2]……例如:inta[10];floatb[3][5];a[0]=15;a[9]=100;b[0][0]=3.58;b[0][4]=2.5;3.使用说明(1)引用下标变量时,所给出的下标个数必须与所定义的数组维数相一致,而且每一个下标表达式的值不得超界。例如:inta[10];a[10]=0;是错误的数组下标引用。(2)数组下标引用时可用整型常量、整型表达式和整型变量。6.4数组的赋初值1.给数组赋初值的语法形式数据类型数组名[下标1][下标2]…={常数列表}2.说明:(1){常数列表}为初值表,其中常数与常数之间用逗号分隔。例如:floatx[4]={-1.0,0.0,2.7,5.2E-8};inty[3][2]={{0,1},{2,3},{4,5}}x数组元素的初值为:x[0]=-1.0,x[1]=0.0,x[2]=2.7,x[4]=0.0000000052y数组元素的初值为:y[0][0]=0,y[0][1]=1,y[1][0]=2,y[1][1]=3,y[2][0]=4,y[2][1]=6,(2)对数组赋初值时,若初值表中常数个数少于数组元素的个数,这表示仅对数组中排列靠前的元素赋初值;若初值表中给定的初值多于下标变量的个数,将出现编译错误。例如:intx[5]={10,20,30};是正确的
intx[5]={1,2,3,4,5,6}是错误的(3)C语言允许使用一维数组赋初值的方法对多维数组赋初值。下面两句语句写法等价:
inty[3][2]={{0,1},{2,3},{4,5}}inty[3][2]={0,1,2,3,4,5}(4)一维数组定义时若赋初值则[]内的下标可省略,由初值表中初值的个数来间接决定长度。二维数组定义时若赋初值则第1个[]内的下标可省略,由初值表中初值的个数来间接决定其长度。例如:intx[]={0,1,2,3,4,5};inty[][3]={0,1,2,3,4,5};6.5字符数组与字符串处理一、字符串1.所谓字符串,就是用双引号括起来的字符序列。它是由若干个字符组成的,其最后一个字符是结束标记“\0”。2.在C语言中,没有标准的字符串定义类型,字符串被当作字符数组来处理。3.所谓字符数组就是每一个元素都是一个字符变量的数组。二、字符数组的定义1.定义形式:char数组名[下标1][下标2]…
例如:charc1[100],c2[20][20];
c1被定义为一维字符数组,包含100个字符型的数组元素;c2被定义为二维字符数组,20行20列共有400个字符型的数组元素。2.说明因为字符型变量只能存放一个由单引号括起来的字符,因此字符数组中的每一个元素也只能存放一个字符。三、字符数组赋初值第一种方法:按单个字符的方式赋初值。例如:chars1[3]={‘1’,’2’,’3’};结果s1[0]的值为‘1’,s1[1]的值为‘2’,s1[2]的值为‘3’。但s1数组中存放的不是一个字符串。
staticchars2[3]={‘1’,’2’};结果s2[0]的值为‘1’,s2[1]的值为‘2’,s2[2]的值为空。s2数组中存放的是一个字符串。因为空字符的值为0,等于字符串结束标记‘\0’。
chars3[3]={‘1’,’2’,’\0’}结果s3[0]的值为‘1’,s3[0]的值为‘2’,s3[2]的值为‘\0’。所以s3中存放的是一个字符串。
第二种方法:是直接在初值表中写一个字符串常量。例如:chars1[3]={“12”};结果s1[0]的值为‘1’,s1[1]的值为‘2’,s1[2]的值为‘\0’。所以s1数组中存放的是一个字符串。
chars2[5]={“ABCD”};结果s2[0]的值为‘A’,s2[1]的值为‘B’,s2[2]的值为‘C’,s2[4]的值为‘D’,s2[5]的值为‘\0’。存放的是一个字符串。chars2[]={“ABCD”};结果s2[0]的值为‘A’,s2[1]的值为‘B’,s2[2]的值为‘C’,s2[4]的值为‘D’,s2[5]的值为‘\0’。存放的是一个字符串。chars2[5]={“ABCDE”};该语句在编译时将是错误的,因为数组元素个数小于字符串长度。四、字符串的输入字符串的输入可以用scanf(),也可以用gets()。1.用scanf()输入其形式为:
charc1[80];scanf(“%s”,c1);2.用gets()输入其形式为:
charc1[80];gets(c1);3.说明(1)scanf()和gets()输入相同的地方:它们都是直接用数组名,因为数组名是地址常量。另外输入的字符串最大长度必须是数组个数减1。(2)不同的地方:scanf()可以同时输入多个输入项,而gets()只能输入一个输入项。scanf()用%s格式输入字符串时,遇空格字符、Tab键和回车符将自动结束输入。gets()不识别字符串中的转义字符,它原样传送,而以回车作为输入结束。例如:charc1[40];scanf(“%s”,c1);
如果输入Howareyou
则c1中只存放Howcharc1[40];gets(c1);
如果输入Howareyou
则c1中只存放Howareyou五、字符串的输出字符串的输出可以用printf()
或puts()。1.用printf()输出其形式为:
charc1[]=“abcdefg”;printf(“%s”,c1);2.用puts()输出其形式为:
charc1[]=“abcdefg”;puts(c1);3.说明相同点:都能识别转义字符。例如charc1[]=“ABCDEFGHI”;printf(“%s”,c1);结果为ABCputs(c1);结果为ABC不同点:printf()能输出多个输出项,而puts()则能输出一个输出项。六、常用字符串处理函数1.strlen函数形式:strlen(str);功能:计算并返回字符串的长度(结束标记‘\0’不计入内)说明:str可以是字符串常量、字符数组。例如:strlen(“abcdefgh\\\123”);结果为11。2.strcmp函数形式:strcmp(str1,str2);功能:比较str1和str2两个字符串的大小。若相同则返回0,若str1大于str2则返回大于0,若str1小于str2则返回小于0。例如:strcmp(“ABC”,”ABC”);结果为0strcmp(“abc”,”ABC”);结果为大于0strcmp(“ABC”,”abc”)结果为小于0说明:(1)str1、str2可以是字符串常量、字符数组。(2)不能用if语句比较两个字符串是否相同。3.strcpy函数形式:strcpy(str1,str2);功能:将字符串str2的内容连同结束标记‘\0’一起复制到str1中。说明:(1)str1、str2只能是字符数组。(2)str1必须有足够的长度以容纳str2的内容。例如:charc1[80],c2[40]=“abcdefghijk”;strcpy(c1,c2);4.strcat函数形式:strcat(str1,str2);功能:将字符串str1与字符串str2尾首相接,拼接以后,原str1串尾的结束符‘\0’被自动覆盖,新串的未尾自动加上‘\0’,生成的新串存放于str1中。说明:(1)str1必须是字符数组、str2可以是字符串常量、也可以是字符数组。
(2)str1必须有足够的长度以容纳拼接后的新串内容。例如:charc1[80]=“abcdefgh”,c2[40]=“xyz123”;strcat(c1,c2);结果为abcdefghxyz123编程举例:例1:从键盘上输入一串字符串,并按逆序显示出来。
main(){charc[80];inti;gets(c);for(i=strlen(c)-1;i>=0;i--)printf(“%c”,c[i]);}第7章指针7.1指针和指针变量一、指针1.什么是指针所谓指针,就是指存放数据的内存地址。2.变量与内存地址的关系例如:有一条定义语句
inti=3,j=5;floatf;地址内存单元20012002200320042005200620072008整型变量i整型变量j单精度变量f3.数组与地址的关系例如:有一条定义语句
inta[3];地址内存单元200120022003200420052006整型数组元素a[1]整型数组元素a[0]整型数组元素a[2]二、指针变量1.什么是指针变量
用于存放地址的变量称为指针变量2.指针变量的特点
地址是一种特殊的数据类型,所以存放地址的指针变量和存放字符型、整型、实型数据的变量是不同类型的变量。3.如何获得地址3.如何获得地址(1)变量地址或数组元素地址通过“&”运算符获得。例如:inta,b[10];&a、&b[3](2)数组的首地址直接可用数组名,不必利用“&”运算符获得。例如:intb[10]那么数组名b就是数组首地址7.2指针变量的定义、初始化和引用一、指针变量的定义和初始化1.定义格式
存储类型数据类型*指针变量名[=初值]……2.功能:定义指向“数据类型”变量或数组的若干个指针变量,同时给这些指针变量赋初值。3.说明3.说明(1)指针变量名前面必须有“*”号。(2)定义指针变量时的“数据类型”可以是任何数据类型,但这个数据类型不是指针变量中存放的数据类型,而是它将要指向的变量或数组的数据类型。(3)其中的初值必须是地址。4.举例
inta;int*p=&a;intf1,f[10],*p1=&f1,*p2=f;二、指针变量的引用方式1.给指针变量赋值格式:指针变量=表达式例如:inti,*p_i;p_i=&i;2.直接引用指针变量名(1)作用:凡是用到地址时,可以直接引用指针变量名。(2)举例:
inti,j,*p=&i,*q;
q=p;scanf(“%d,%d”,q,&j);3.通过指针变量来引用它所指向的变量(1)使用格式:*指针变量名(2)例如:
inti=1,j=2,k,*p=&i;k=*p+j;(等价于k=i+j;)printf(“%d”,*p);(等价于printf(“%d”,i);)
注意:printf(“%d”,p);是错误用法。三、取地址运算符与指针运算符说明:(1)“&”运算符的运算对象必须是已定义过的变量或数组名;(2)“*”运算符的运算对象必须是已赋值的指针变量;不能是普通变量。例如:inta,*pa=&a;*&a、*&pa、&*pa是正确用法;
&*a是错误用。运算符名称优先级结合性&取地址2自右向左*取对象7.3指针变量的使用一、指向变量的指针变量的使用1.给指针变量赋值格式:指针变量=地址表达式;说明:指针变量的数据类型和地址对应的数据类型应一致。例如:
inta,*p_a;floatb,*p_b;p_a=&a;p_b=&b;是正确的
p_a=&b;p_b=&a;是错误的2.引用所指向的变量(1)格式:*指针变量(2)说明:使用时要注意该指针变量必须已赋过值即已指向某个变量。二、指向一维数组的指针变量的使用1.指针变量指向数组的方法(1)指向数组首地址用赋初值方法:*指针变量=数组名在程序中赋值:指针变量=数组名(2)指向某数组元素用赋初值方法:*指针变量=&数组名[下标]在程序中赋值:
指针变量=&数组名[下标]2.用指向一维数组的指针变量处理数组元素(1)当指针变量指向数组首地址引用数组元素[i]:*(指针变量+i)(2)当指针变量指向下标为i的数组元素引用数组元素[i]:*指针变量引用数组元素[i-k]:*(指针变量-k)引用数组元素[I+k]:*(指针变量+k)(3)当指针变量指向数组首地址后,对下标为i的数组元素引用的四种方法*(指针变量+i)*(数组名+i),
指针变量[i]
数组名[i]例如:inta[10],*p=a;
若要引用a[5]数组元素:
*(p+5)、*(a+5)、p[5]、a[5]3.指向一维数组的指针变量的运算(1)指针变量和整数的算术运算
指针变量+整数指针变量-整数
++指针变量
--指针变量指针变量++
指针变量--例如:inta[10],*p=a;p+5(表示a[5]的地址,指针仍指向a[0])
p=&a[4],p-2(表示a[2]的地址,指针仍指向a[4]
)
p=&a[3],p++(表示a[3]的地址,指针将指向a[4])
p=&a[3],++p(表示a[4]的地址,指针将指向a[4])
a+5(表示a[5]的地址)
a++(这是不允许的)例如:(2005年试卷试题一(7))main(){inta[4]={0,4,5,13},*p;p=&a[2];printf("++(*p)=%d\n",++(*p));printf("*--p=%d\n",*--p);printf("*p++=%d\n",*p++);printf("%d\n",a[0]);}输出结果:
++(*p)=6*--p=4*p++=40(2)指针变量和指针变量的减法运算
指针变量1-指针变量2注意:要求这两个指针变量必须指向同一个数组,否则不能进行减法运算;运算结果为它们所指向的数组元素下标相差的整数。例如:inta[10],*p=&a[5],*q=&a[8];q-p(值为3)
p-q(值为-3)(3)指针变量的关系运算
指针变量1关系运算符指针变量2注意:要求这两个指针变量必须指向同一个数组,否则不能进行关系运算;运算结果为逻辑真(1),或逻辑假(0)。例如:inta[10],*p=&a[5],*q=&a[8];q>p(值为1)
q<p(值为0)
p>=a(值为1)
p>=&a[8](值为0)
三、指向字符串的指针变量的使用1.将指针变量指向字符串常量的方法第一种方法:给指针变量赋初值的方法格式:*指针变量=字符串常量例如:char*p=“abcd”第二种方法:先定义指针变量,再赋值。格式:指针变量=字符串常量例如:char*pp=“abcd”2.指向字符串常量的指针变量的使用(1)处理整个字符串输出字符串printf(“%s”,指针变量);输入新的字符串代替原字符串
scanf(“%s”,指针变量);(2)处理字符串中的单个字符第i个字符的表示方法*(指针变量+i)3.指向存放字符串的字符数组的指针变量的使用同数组处理。四、指向二维数组的指针变量的使用1.指针变量指向二维数组的某个元素(1)让指针变量指向二维数组的某个元素的方法用赋初值方式的格式:
*指针变量=&数组名[下标1][下标2]用赋值方式的格式:
指针变量=&数组名[下标1][下标2](2)数组元素的引用方法:*指针变量2.指针变量指向二维数组的首地址(1)指针变量指向二维数组首地址的方法用赋初值的方式有两种:
*指针变量=二维数组名
*指针变量=&二维数组名[0][0]用赋值的方式也有两种:
指针变量=二维数组名指针变量=&二维数组名[0][0](2)数组元素的地址表示方法:
指针变量+i*列数+j
数组元素的引用方法:
*(指针变量+i*列数+j)3.指针变量指向二维数组中某个一维数组(1)让指针变量指向二维数组中某个一维数组的方法第一步:先定义一个指针变量
(*指针变量)[m]第二步:将该指针变量指向二维数组的首地址用赋初值的方法:(*指针变量)[m]=二维数组名用赋值的方法:指针变量=二维数组名第i行对应的一维数组首地址可以用下列表达式表示:*(指针变量+i)(2)二维数组元素的引用方法数组元素地址:*(指针变量+行下标)+列下标数组元素引用:*(*(指针变量+行下标)+列下标)7.4指针数组和多级指针一、基本问题1.什么是指针数组当某个数组被定义为指针类型,就称这样的数组为指针数组。2.什么是多级指针用来存放其它指针变量的地址的指针变量称为二级指针。二、指针数组的定义1.定义格式
存储类型数据类型*指针数组名[长度]={初值1}2.功能:3.说明:三、指针数组元素的引用1.引用所指向的普通变量或数组*指针数组名[下标]2.对其赋值:指针数组名[下标]=地址表达式3.参加运算:(1)赋值运算(2)算术运算(3)关系运算四、多级指针的定义和应用1.定义格式:存储类型数据类型**指针变量={初值1}……
功能、使用说明2.引用方法
*二级指针变量(代表所指向的一级指针变量)**二级指针变量(代表所指向的一级指针变量指向的变量)第8章函数8.1函数的概念一、函数的概念1.什么是函数函数是一个可以反复使用的程序段,从其它的程序段中均可以通过调用语句来执行这段程序,完成既定的工作。2.函数说明(1)建立函数称为“函数定义”,使用函数称为“函数调用”。(2)调用其它函数的函数称为“主调函数”,而被调用的函数称为“被调函数”。二、函数的定义1.定义格式(1)有参函数的定义存储类型数据类型函数名(形式参数表)形式参数说明序列;
{数据定义语句序列;执行语句序列;
}(2)无参函数的定义存储类型数据类型函数名()
{数据定义语句序列;执行语句序列;
}2.定义函数的说明(1)函数有“函数头”和“函数体”两部分组成;(2)存储类型可以是exterm和static两种;(3)数据类型规定了函数返回值的数据类型,若无返回值则数据类型为void;(4)形式参数表是用逗号分隔的若干个形式参数,每个形参可以是一个变量名、数组名、指针变量名和指针数组名;(5)形参说明可以用一条说明语句说明,也可以写在形式参数表中;(6)形参若是数组,只需给出数组名,数组长度不需给出;(7)如果函数有返回值,则在函数体中应有一条返回语句“return(表达式);”,无返回值,则返回语句应为“return;”,也可以省略。三、函数的调用1.调用格式(1)没有返回值的函数调用格式:
函数名(实际参数表);(2)有返回值的函数调用格式:函数名(实际参数表)2.函数调用时对被调函数的说明(1)调用系统函数时,要求在程序的开始用包含命令“#include<头文件名.h>”(2)如果被调函数是非整型或字符型函数,而且书写顺序在主调函数后面,则在主调函数中需对被调函数进行说明。例8-1intmax(x1,x2,x3)intx1,x2,x3;{
……}main(){intx,y,z,w,m;scanf("%d,%d,%d,%d",&x,&y,&z,&w);m=max(x-y,y-z,z-w);printf("max=%d\n",m);}例8-2main(){voidf();inta[10],i;for(i=0;i<10;i++)scanf("%d",&a[i]);
f(a);for(i=0;i<10;i++)printf("%d",a[i]);}voidf(b)intb[];{……}8.2函数调用中的数据传递方法一、基本问题1.函数调用中的数据传递方法(1)值传递方式(2)地址传递方式二、值传递方式1.特点(1)值传递方式所传递的是参数值;(2)调用函数时,将实值的值计算出来赋予对应的形参(3)在函数体中对形参的加工与实参完全脱离关系;(4)当函数体执行完毕返回时,形参的值将不回带到对应的实参中;(5)用值传递方式时,形参一般都是变量,实参可以是变量,也可以是表达式。2.举例说明(例8-1)三、地址传递方式1.特点(1)地址传递方式所传递的是地址,调用函数时,将实值的地址赋予对应的形参作为其地址;(2)因为形参和实参共用同一个地址,所以在函数体中对形参的加工实际是对实参的加工;(3)当函数体执行完毕返回时,形参的值将回带到对应的实参中;(4)用地址传递方式时,实参可以是变量地址、指针变量或数组名,所以形参一般是指针变量或数组名。2.举例说明(例8-2)例8-3(2005年试卷试题二(2))#include<stdio.h>voidfunc(int*x,inty){statick=3;y=*x+y;*x=y%k;k++;printf("*x=%d,y=%d\n",*x,y);}voidmain(){intx=12,y=5;func(&x,y);printf("x1=%d,y1=%d\n",x,y);func(&y,x);printf("x2=%d,y2=%d\n",x,y);}结果:*x=2,y=17x1=2,y1=5*x=3,y=7x2=2,y2=38.3函数的嵌套调用和递归调用一、函数的嵌套调用1.什么是函数的嵌套调用函数甲调用了函数乙,而函数乙又调用了函数丙。2.嵌套调用方法函数甲函数乙函数丙调用函数乙返回调用函数乙结束返回二、函数的递归调用1.什么是函数的递归调用即函数在自身定义的内部又调用自己。2.递归的特点(1)递归必须有递归结束条件;(2)递归过程首先是一级一级递推(即当前调用未结束又引出下一层调用),而满足递归结束条件时结束递推,再一级一级的回归(即一级一级再返回上一级的调用继续完成上一级的未完成的操作)。3.举例说明例8-4(2004年试卷试题一(7))voidconv(intm){if(m>=2)conv(m/2);printf("%d",m%2);}voidmain(){conv(13);}结果是:11018.4指针型函数及调用一、指针型函数的定义1.什么是指针型函数是指该函数的返回值是指针型的,也就是说,这类函数的返回值是地址数据。2.指针型函数的特点指针型函数的返回值必须是地址值,调用该类函数时,接受返回值的必须是指针变量等能存入地
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度短视频内容创作与分成合作合同2篇
- 2024年新型城镇化道路施工合同履约担保服务条款3篇
- 2024年度商业地产项目社区商业运营管理合同3篇
- 2024年版钻探作业劳务分包协议样式版
- 2024年版设备维护服务经典协议版B版
- 2024年度事业单位附属公园租赁服务协议3篇
- 2024年公共场所消防设备采购合同2篇
- 2024年度全球影视制作与发行合作协议3篇
- 2024年寄卖服务独家代理合同3篇
- 2024年全新装修二手房买卖中介合同2篇
- 《物流系统规划与设计》课程教学大纲
- 护理质控分析整改措施(共5篇)
- 金属矿山安全教育课件
- 托盘演示教学课件
- 中华农耕文化及现实意义
- DB32T 4353-2022 房屋建筑和市政基础设施工程档案资料管理规程
- DBJ61-T 112-2021 高延性混凝土应用技术规程-(高清版)
- 2023年高考数学求定义域专题练习(附答案)
- 农产品品牌与营销课件
- 苏科版一年级心理健康教育第17节《生命更美好》教案(定稿)
- 车辆二级维护检测单参考模板范本
评论
0/150
提交评论