资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C,语言补习,60,分攻略,基本概念,汇编语言,编写的程序必须经,汇编,为目标程序。,高级语言,编写的程序必须经,编译,为目标程序。,C,语言程序总是从,main(),函数,开始执行,到,main(),函数结束。因此,,C,语言程序至少有一个,main(),函数。,一、,C,语言的数据表示,1.1,常量,和,变量,1.2,表达式,1.3,数据类型,简单类型、结构类型、指针类型,1.4,输入、输出,1.1,常量和变量,1.,常量,常量是在程序执行中,值不发生改变的数据。其值预先决定,之后不变。有不同的数据类型。,(,1,)常数,(,有的称,直接常量,、,页面常量,),例如的:,整数:,+5,、,-3,、,017,(八进制)、,0 x1f(16,进制,),实数,(,浮点数,),:,3.14,、,-1.2E-3,、,1E10,单个字符:,A,,,占一个字节,转义字符,非法,77,(八进制,ASCII,码,63,,?),78,非法,x3f,(十六进制,ASCII,码,63,,?),x3g,非法,字符串:“,A”,后面有,0,,,占两个字节,E3,2E3.0,不合法,不是整型量,占一个字节,字符串“,*077x7fn”,的长度是:,下列是整型常量的是:,0.0 0L 0 x7f 057 058 2/2.0,下列是实型常量的是:,-1E-3 E10 1E2 3.14 1.2E2.3,“x7F”,和,x7F,的字节数分别为:,5,2 1,(,2,),符号常量,给常量起,标识符,名字。,C,语言的符号常量(用宏定义),:,#define,PI,3.14159265,注意:,1.,一般用大写字母。,2,,,#define,M,3,不是,C,语句,后面没有“;”。,3.,可以做,M+1,不能做,M+.,(,3,),地址常量,当数组在定义时,其变量名为其,首地址,,是地址常量。,int a10;,可以做,a+1,不能做,a+.,1.1,常量和变量,2,变量,用各种操作来改变值数据,。,从,“名”,和,“值”,两个角度认识变量,(,1,)变量名,每个变量,要在使用前定义变量的名字,遵循,标识符命名,规则。,只能用字母、数字和下划线组成。,不能以数字开头。,不能用保留字,(int,printf,main.),。,合法,a12 a_3 _abc,非法,12a a#int,变量定义就是,申请数据的存储空间,,登记数据的各种,存储特性,。,例如,:,int,m,;2,个字节,long n;4,个字节,char ch;1,个字节,float x;4,个字节,double y,;,8,个字节,可以用,sizeof,获得字长,sizeof(char)=1,sizeof(int)=2,sizeof(double)=8,(,2,)变量的值,变量值就是由变量名所指定空间上的,存储数据内容。,即,变量的当前值。,数据内容用语言的操作语句来改变。,赋值语句;键盘输入语句;,char,chx,;,int,m;/*,变量的定义 *,/,chx,=A;m=12*3;,/*,赋值语句 *,/,scanf(“%d”,&m,);,/*,键盘输入语句 *,/,变量初始化:,定义变量时同时确定变量初值。,例如:,char,chy,=a;,int,weight=2,;,1.2,C,语言的,表达式,1,、算术表达式,2,、关系表达式,3,、逻辑表达式,4,、赋值表达式,5,、逗号表达式,6,、条件表达式,7,、其他表达式,C,语言的,表达式,:,使用规定的,运算符,,,将常量、变量、函数(调用)连结的一个有意义的式子。,1,、算术表达式,用算术运算符来表示对数据的算术运算求值过程。,算术运算符,:+-*/,%,2/3,结果是,0,,,2%3,结果是,2,5/2,结果是,5%2,结果是,2,、关系表达式,关系运算符:,=(,优先级较高,),!=(,优先级较低,),关系表达式的结果:,1,(非,0,真),,0,(假),分析:,10=a=15 a=9,是假,10=a=15,10=a,假,0,0=15,真,所以要写成,10=a&a=15,3,、逻辑表达式,用逻辑表达式来表示对数据的逻辑关系判断,运算结果是逻辑值“真”,1,或者“假”,0,。,C,逻辑运算符包括:,!,&|,参加逻辑运算的数据必须是逻辑量,可以是逻辑类型的变量、常量,关系表达式或逻辑表达式。,C,语言中,没有专门的逻辑量,,1,是真值,,0,是假值。也认为,非零,的值为真值。,如:,int,a=3,b=4,c=-5;,(1)!(ac)&(c+b)a)&(c+a)b),|(x,400=0),4,、赋值表达式,=,,,+=,,,-=,,*,=,,,/=,,,+,(单目),,-,(单目),级别仅高于逗号表达式,右结合,int a=3,c=2,b,a=b=c;,n*=m+2,相当于,n=n*(m+2),k=i+;,先,k=i,再,i=i+1,k=+i;,先,i=i+1,再,k=i,c,赋值给,b,,,b=2,b,赋值给,a,,,a=2,i+,+i,k=i+,作赋值运算,使用就是赋值,.,先做,k=i,再做,i=i+1,i+,先使用,后加,1,+i,先加,1,后使用要充分理解中”使用”的实际意义,k=i+,作比较判断运算,使用就是比较判断先做,k=i,是真还是假,再做,i=i+1,printf(“%d”,i+),作输出结果,使用就是输出结果,.,先输出,i,再做,i=i+1,a=5-(i+),作减法,使用就是减,.,先做,5-i,并赋给,a,再做,i=i+1,5,、条件表达式,e1?e2:e3,若,e1,为真,表达式的值为,e2,否则为,e3.,a=3,b=2,;,(-,-a=b+),?,-a,:,b,+,5?10:3,表达式的值为,10,0?10:3,表达式的值为,3,-5?10:3,表达式的值为,10,b=3;,a=b5?10:3;,a=?,赋值运算符优先仅高于逗号运算符,a=,(,b5?10:3,),;,3,k=(-a=b+),?,-a,:,b,+;,k=,?,1,1,非,0,真,6,、逗号表达式,表达式的值等于最后一个表达式的值,运算等级最低!,a=5,b=2,c=3,a=7+b+c,b+,a=(7+b+c,b+),a=12,a=2,7,、强制类型转换表达式(单目),int m;,sqrt(float)m);,a=5,,,a+5,,,a+=a,a=10,理解记忆运算符表,(,高,),(,低,),!,+,,,-,,等,算数运算符,关系运算符,逻辑运算符,&|,条件运算符,赋值运算符,逗号运算符,右结合,单目运算符,赋值运算符,b=2,a=5-(-b),(),优先级最高,-b,右结合,-,优先级其次,=,优先级最低,-b,,,b=b-1,b,为,1,再做,5-b,即,5-1,等于,4,最后将,4,赋给,a,1.3,数据类型,简单类型,构造类型,指针类型,整型,实型,字符型,数组,结构体,共用体,数值型,枚举型,空类型,int 2,个字节,long 4,个字节,float 4,个字节,double 8,个字节,char 1,个字节,成员类型字节数,个数,struct,各成员字节数,之和,union,各成员字节数,之最大者,存放地址,与所指数据类型无关,,2,个字节,不要求,不要求,1.3,数据类型,(,1,)整型,类型名 字节数,输入、输出格式,int,2,%d,short,2,%d,long,4,%ld,(2),实型,1.,简单类型,类型名 字节数,输入、输出格式,有效数字位,float 4,%f,7,doubule,8,%lf,16,long,doubule,16,%lf,19,(3),字符型,(,输入、输出格式“,%c”,),ASCII,码,一个字符占,1,字节;,char,型数据与,int,型数据之间的关系,char,型对应其,ASCII,码,只不过是占一个字节。大写字母与小写字母之差为,32.,char,型变量既能以,%c,字符格式输出,也能以,%d,整型格式输出。能象,int,量一样进行算术运算。,注意转义字符,的使用。,*101(A,8,进制,)x41(A,,,16,进制,)n,char ch=k;,printf(“%d,%c”,ch-32,ch-32);,107,K,(,4,)字符串,(,输入、输出格式,“,%s,”,),所谓“,字符串,”是,指若干有效字符的序列,。语言字符串可以包括字母、数字、专用字符、转义字符等。,字符串常量:,使用双引号,China BASIC ,a+b,=c Li-Li,“39.4”“%,dn,”“,解放军“,“,*077x7fn”,字符型的一维数组(相当于字符串变量),char st8,str10;,strcpy(st,12345);,strcpy(str,st);,不能,st=“12345”;str=st;,这是赋值,.,可以,char st=“12345”;,这是初始化,.,2.,结构类型,“结构”一般可以称为,数据元素,,在不同的结构类型中,数据元素会有特定的名称。,结构类型的数据由更加基本的成分组成。,这些成分称为“数据项”,结构的,子成员,。,1.3,数据类型,(1),数组,a0,a1,a2,a3,a4,a5,a6,a7,10 20 30 40,50,60 70 80,一个数组(,array,)是由,相同类型,的若干数组元素构成的有限序列。,C,语言的数定义,:,int,b8,a8,;,char,c10,;,2.,结构类型,元素下标从,0,开始,例 日期类型的定义,(,2,),结构体,C,语言中实现:,struct,Date,int,month;,/*,月*,/,int,day;,/*,日*,/,int,year;,/*,年*,/,;,struct,Date,myd,=12,16,1978;,系统分配给它的内存是各成员所需内存量的总和。本例是,6.,(,1,)指针:,变量名,的在内存中的存储地址。,(,2,)指针变量,int,i=12,*p;,P=,把存放变量,i,的地址的变量,p,称作指针变量。,指针变量的存放内容是数据的地址。,3.,指针类型,(,放弃,),(,3,)指针引用变量,指针变量可以指向各种不同的数据类型,因此指针变量也要有不同的指针类型。如,:,int,m,*p;float x,*q;int a,*r,m=12;p=,x=3.14,;q=&,x;,r=a;,注意:是否用,&,1.4,输入、输出,输出:,printf,(“.”,.),%d,%6d,%ld,%c,%s,%f,%10.2f,%lf,%20.8lf,char a=“abfgcde”,max,max_i;,main(),.,printf(“max=%cnmax_i%d=”,max,max_i);,max=,原样输出,换行,g,3,原样输出,max_i=,注意输出格式,1.4,输入、输出,输入:,scanf,(“.”,.),%d,%ld,对应,int long,%c,%s,对应,char char str,%f,%lf,对应,flaot double,常见错误,int a,b;char d,e20;,scanf,(,%,d,%,f,n,”,&a,&b,);,scanf,(,%,d,%f”,a,b,);,scanf,(,%7,.2,f,scanf(,%s,&,e);,scanf(,%,f,n,要多输入一个值,缺,&,不能规定精度,数组名是首地址,不要,&,类型不匹配,(1),表达式语句,(2),流程控制语句,(3),复合语句,C,语言语句,指令语句,非指令语句,数据定义语句,float,x;,int,m;,编译预处理,宏定义,#,define PI 3.14159,文件包含处理,#include ,二、,C,语言的程序结构与相关语句,带参宏定义,以文本按原样展开,#define MUL(x)x*x,5/MUL(5+3)=5/5+3*5+3=19,#define MUL(x)(x)*(x),5/MUL(5+3)=5/(5+3)*(5+3)=5,#define MUL(x)(x)*(x),5/MUL(5+3)=5/(5+3)*(5+3)=5/64,1.,表达式语句的组成:,由一个表达式后接一个分号组成的,。,一组语句括在,一对花括号,之中,,称,复合语句,。,c=,getchar,();,putchar(c,);,注意,,一个复合语句的后花括号之后,不应再写分号,。,在语法上是一个整体,相当于一个语句。,凡是能够使用简单语句的地方,都可以使用复合语句,。一个复合语句中又可以包含另一个或多个复合语句。,从键盘输入一个字符,并赋给,c,以字符形式输出字符变量的值,c,完成一定的控制功能。,9,种控制语句:,判断语句,条件判断语句,if()else,多分支选择语句,switch()case,循环语句,循环次数控制语句,for(),先判断后执行循环控制语句,while(),先执行后判断循环控制语句,dowhile(),转移控制语句,直接转移语句,goto,终止语句,break(,用在循环结构、,swicth,),跳转语句,continue(,仅用在循环结构,),返回语句,return,流程控制语句,二、,C,语言的程序结构与相关语句,程序的三种基本结构:,顺序结构,选择结构,if()else,switch()case,循环结构,for().;,while();,do ;while(),选择结构,单分支结构,if(a=b)printf(“yes”);,双分支结构,if(a=b)printf(“yes”);,else printf(“no”);,多分支结构,switch_case,不能写成,a=b,多分支选择语句,switch,(表达式),case,常量表达式,1,:语句序列,1;break;,case,常量表达式,2,:语句序列,2;break;,case,常量表达式,n,:语句序列,n;break;,default,:语句序列,n+1;,根据“表达式”的值从上至下去寻找与表达式的值相匹配的“,case,常量表达式”,执行一个分支后,再执行下一个分支,直到,break,结束,,然后执行,switch,结构后面的程序。,找不到匹配的入口标号时,执行“语句序列,n+1”,,然后结束。顺序向下执行程序。,main(),int a=1,b=1;,switch(a),case 1:,switch(b),case 0:printf(“$”);break;,case 1:printf(“#”);break;,case 2:printf(“*”);,case 2:printf(“”);,case 3:printf(“”);break;,case 4:printf(“,a=1,case 1:swtch(1),b=1,printf#,break,跳出,switch(b),结构,进入,switch(a),结构,case 2:printf,case 2:printf,break,跳出,switch(a),结构,#,for,while,do-while,三种结构,循环变量初始化,,继续循环,条件,改变循环变量是不可缺少的三个环节。,for,常用于循环次数,已知,的问题中。括号中的两个“,;,”不可省。,while,与,do-while,常用于循环次数,未知,的问题中。,注意,在,for,和,while,语句之后一般没有分号,有分号表示循环体就是分号之前的内容(空循环体),while,(i 100),;,i+;,for,(i=0;i 100;i+),;,printf(%d,i);,if,swtich,while,for,后面的语句只能是一句,因此,多句时别忘了,。,在,while(e),和,for(;e ;),中的,e,是,循环继续,的条件,不能写其它条件!如果缺省,就是,死循环,!,在,if(e),while(e),和,for(;e ;),中,e,的值是,逻辑值(,0,或非,0,),e,一般是关系表达式,逻辑表达式或变量。,if(x=1),if(x=1),main(),int i=1;,doi-;while(i+);,printf(“%d”,i-);,A)-1 B)0 C)1 D),陷入死循环,i=1,i-,i=0,while(i),终止循环,i+,i=1,输出,i=1,i-,i=0,break,coutinue,break,只能用于,switch,和循环语句中,作用提前终止本层次,switch,和循环。,coutinue,是跳过循环体内尚未执行的语句,接着,执行下次循环,。,常用的循环算法,求素数、水仙花数、最小公倍数、最大公约数、分解多位数的数字,累加,累乘,分解质因数等。,各种有规律的图案。,while(m),k=m%10;/*,求最低位的数字*,/,m=m/10;/*,除去最低位的数字*,/,分解多位数的数字,判断素数,main(),int i,x,flag=0;,scanf(“%d”,for,(i=2;i0;-x),y*=x;,return(y);,main(),long y;,for(,y=1;x0;-x),y*=x;,printf(“%ld”,y);,main(),int m,n;,long cmn,facto();,scanf(%d%d,cmn=facto(m)/(facto(n)*facto(m-n);,printf(%ldn,cmn);,求,C(m,n)=m!/(n!*(m-n)!),数组的定义,类型标识符 数组名,常量表达式,错误的定义是:,或,int,n;,int,n=10;,scanf(%d,&n,);,int,an,;,int,an,;,定义,int a5,时,a0,a1.=?,随机数,!,只有,int a5=3,后,后面几项自动赋,0,三 数组,数组的初始化,合法,:,int a,=1,2,3,4,5;,int i 3=1,2,3,4,5,6;,int a5=1,2,3;,char a4=“boy”,char a3=b,o,y,不合法,:,int a,5,=,2,4,5;,int i2=1,2,3,4,5,6;,int a5=;,char a4=boy,用数组元素,下标法,访问数组元素。,#include,void main(),int,a5=1,3,5,7,9,i,*p;,for(i,=0;i5;i+)printf(%d,ai,);,printf(n,);,从,0,开始,或,i=4,写程序框架,(,用函数,),函数说明语句,;,mian(),定义变量,;,输入数组,;,调函数处理数组,;,输出结果,;,函数首部,定义函数内部变量,;,处理数组,;,返回,(,非,void,用,);,用函数实现数组操作,数值数组,void inv(int x,int n,);,main(),int i,j,a10;,for(i=0;i10;i+),scanf(“%d”,ai);,inv(a,10);,for(i=0;iM;i+),printf(“%d”,ai);,字符数组,void inv(char x),main(),int i,j,;,char,a50;,gets(a);,inv(a);,puts(a);,多一个参数,表示元素个数,可以整体输入,输出,必须单个输入,输出,数组的操作往往用循环结构,.,数值数组,int a10;,for(i=0;i10;i+),字符数组,char a50;,for(i=0;ai!=0;i+),数值数组倒序,for(i=0,j=M;ij;i+,i-),交换,ai,aj,字符数组倒序,for(i=0,j=strlen(a),;ij;i+,i-),交换,ai,aj,数值数组,void inv(int x,int m),int i,j,k;,j=m;,for(i=0;ij;i+,i-),k=xi;,xi=xj;,xj=k;,字符数组,void inv(int x,),int i,j,k;,j=strlen(x);,for(i=0;ij;i+,i-),k=xi;,xi=xj;,xj=k;,main(),int i,j,s=0,a33;,for(i=0;i3;i+),for(j=0;j3;j+),scanf(%d,for(i=0;i3;i+),for(j=0;j3;j+),if(,i=j,|,i+j=2,),s+=aij;,printf(s=%dn,s);,主对角线,i=j,副对角线,i+j=2,累加,(,积),#define M 10,main(),int i,aM,s=0,;,for(i=0;iM;i+),scanf(“%d”,for(i=0;iM;i+),s+=ai;,printf(“s=%d”,s);,#define M 10,main(),int i,aM,s=1,;,for(i=0;iM;i+),scanf(“%d”,for(i=0;iM;i+),s*=ai;,printf(“s=%d”,s);,求最大(小)值,#define M 30,main(),int i,k,k_i,aM;,for(i=0;iM;i+),scanf(“%d”,k=a0;k_i=0;,for(i=1;iM;i+),if(kai),最大值,字符数组,char str50;int i;,for(i=0;,stri!=0,i+),构造新的字符数组(删除,插入,复制,连接,倒序)。,1.,用和不用,字符串函数,实现上述功能。,2.,用,指针,实现。,3.,必须注意最后一项一定是:,stri=0,;或 *,p=0;,二维字符数组,二维数组在内存中的排列顺序是“按行,优先,存放”,二维数组,amn,可以视为由,n,个一维数组,am,组成的。,二维字符数组中,m,由其中最长的字符串决定。,char stu5,6,=“Tom,“Anne,“Mary,“Peter,;,其中,stu0=“Tom“,stu1=“Anne,字符串函数,要用,#include,字符串拷贝函数,strcpy,字符串连接函数,strcat,字符串比较函数,strcmp,测字符串长度函数,strlen,函数,strlen,的值为,0,之前的全部字符个数,.,它与数组长度不是一个概念,.,char s6=H,o,w,0,o,k,strlen(s)=3,字符串函数的应用,字符串赋值,字符串比较,s1=s2,strcpy(s1,s2),s1=s2,strcmp(s1,s2)=0,s1s2,strcmp(s1,s2)0,s1s2,strcmp(s1,s2)0,*,p5,与,(*p)5,char*p5,是一个有,5,个元素的数组,数组元素的数据类型是指向,int,型的指针型,char(*p)5,是指向一个有,5,个元素的一维数组。,China0,Zhuhai0,Shanghai0,Guangzhou0,Haikou0,1000,1007,100E,1018,1023,*,p5,1000,p0,p1,p2,p3,p4,(*p)5,1000,a b c d 0,1000,考试,单选填空,25,读程序写结果,25,改错,20,程序填空,20,写程序,10,
展开阅读全文