《全国计算机等级考试二级C语言教程64总复习.ppt》由会员分享,可在线阅读,更多相关《全国计算机等级考试二级C语言教程64总复习.ppt(71页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言总复习(64学时)以考试难度为限一、一、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码6
2、3,?)x3g非法字符串:“A”后面有0,占两个字节E3,2E3.0不合法不是整型量占一个字节(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)变量名 每个变量,要在使用前定义变
3、量的名字,遵循标识符命名规则。只能用字母、数字和下划线组成。不能以数字开头。不能用保留字(int,printf,main.)。变量定义就是申请数据的存储空间,登记数据的各种存储特性。例如:int m;2个字节 -215215-1(-3276832767)long n;4个字节 -231231-1char ch;1 个字节 0255float x;4个字节 3.4(10-38 1038)double y;8个字节 1.7(10-308 10308)可以用sizeof获得字长sizeof(char)=1sizeof(int)=2sizeof(double)=8(2)变量的值)变量的值 变量值就是由
4、变量名所指定空间上的存储数据内容。即变量的当前值。数据内容用语言的操作语句来改变。赋值语句;键盘输入语句;char chx;int m;/*变量的定义 */chx=A;m=12*3;/*赋值语句 */scanf(“%d”,&m);/*键盘输入语句 */在程序运行时,将数据存入制定内存空间。变量初始化:变量初始化:定义变量时同时确定变量初值。例如:char chy=a;int weight=2;1.2 C语言的语言的表达式表达式1 1、算术表达式、算术表达式2 2、关系表达式、关系表达式3 3、逻辑表达式、逻辑表达式4 4、赋值表达式、赋值表达式5 5、逗号表达式、逗号表达式6 6、条件表达式、
5、条件表达式7 7、其他表达式、其他表达式C语言的语言的表达式表达式:使用规定的运算符运算符,将常量、变量、函数(调用)连结的一个有意义的式子。1、算术表达式、算术表达式用算术运算符来表示对数据的算术运算求值过程。算术运算符:+-*/%2/3结果是0,2%3结果是2注意不同类型运算问题:doublelongunsignedint floatchar short高低2 2、关系表达式、关系表达式关系运算符:=0,sin(x)=0.5,(a+b)=(c*d)注意语法合理与数学逻辑错误问题:分析:10=a=15 a=9 是假 10=a=1510=a 假 00=15 真所以要写成10=a&a=153、逻
6、辑表达式用逻辑表达式来表示对数据的逻辑关系判断,运算结果是逻辑值“真”1或者“假”0。C逻辑运算符包括:!&|参加逻辑运算的数据必须是逻辑量,可以是逻辑类型的变量、常量,关系表达式或逻辑表达式。C语言中,没有专门的逻辑量,语言中,没有专门的逻辑量,1是真值,是真值,0是是假值。也认为假值。也认为非零非零的值为真值。的值为真值。如:int a=3,b=4,c=-5;(1)!(ab)&!c|1)(2)if(a)printf(“n yes”);a,c均按非0(即真)处理逻辑运算规律 在&(与)表达式中,若&的左端为假,则不再计算另一端,该表达式值肯定为 0(假)。在|(或)表达式中,若|的左端为真,
7、则不再计算另一端,表达式的值必定为 1(真)。nint a=5,b=1nk=a0nk?b?假,后面不算了k=0,b=1判断闰年的条件是:能被4整除但不能被100整除,或能被400整除。(x4=0&x100!=0)水仙花数是指一个三位正整数,其各位数字的立方和等于该数本身(k*100+m*10+n=k*k*k+m*m*m+n*n*n)三角形的基本条件(a+b)c)&(c+b)a)&(c+a)b)4、赋值表达式=,+=,-=,*=,/=,+(单目),-(单目)级别仅高于逗号表达式,右结合int a=3,c=2,ba=b=c;n*=m+2 相当于 n=n*(m+2)k=i+;先k=i,再i=i+1k
8、=+i;先i=i+1,再k=ic赋值给b,b=2b赋值给a,a=25、条件表达式 e1?e2:e3若e1为真,表达式的值为e2,否则为e3.(-a=b+)?-a:b+5-1=4 T a=4-a a=3 表达式的值为3a=5,b=44-1=5 F b=6b+b=7表达式的值为6a=4,b=5条件表达式的值的类型为e2,e3二者中类型较高者。如果y=5;y3?-1.0:2 其值为2.06、逗号表达式 表达式的值等于最后一个表达式的值,运算等级最低!a=5,b=2,c=3 a=7+b+c,a+a=(7+b+c,a+)a=12a=57、强制类型转换表达式(单目)int m;sqrt(float)m);
9、并没有改变m的类型和数值理解记忆运算符表 (高高)(低低)!+,-,等算数运算符算数运算符 关系运算符关系运算符 逻辑运算符逻辑运算符&|条件运算符条件运算符 赋值运算符赋值运算符 逗号运算符 右结合单目运算符赋值运算符1.3 数据类型数据类型 数据类型:数据类型:在高级语言的数据表示机制中,数据类型(data tyPe)是个核心概念。简单类型构造类型指针类型整型实型字符型数组结构体共用体数值型枚举型空类型1.3 数据类型数据类型(1 1)整型)整型(输入、输出格式输入、输出格式 “%d%d”)类型名 字节数 数值范围 int 2 -32768 32767 shortshort 2 -3276
10、8 32767 long long 4 -2147483648 2147483647还有无符号整型(输入、输出格式输入、输出格式 “%u%u”)Unsigned int 2 0 65535Unsigned short 2 0 65535 Unsigned long 4 0 42949672951.简单类型简单类型(2)实型实型实型(float)数据的值集是实数集的一个有限子集.-3.4e38,-3.4e-39,3.4E-38,3.4E381.简单类型简单类型类型名类型名 字节数字节数 输入、输出格式输入、输出格式 有效数字位有效数字位float 4%f%f 7doubule 8%lf%lf 1
11、6long doubule 16%lf%lf 19不要以为是长整型E38非法n(3)字符型字符型(输入、输出格式输入、输出格式“%c”)n ASCII码,一个字符占1字节;nchar ca;ca=#;n注意转义字符 的使用。(4)字符串(输入、输出格式输入、输出格式 “%s%s”)所谓“字符串字符串”是指若干有效字符的序列。语言字符串可以包括字母、数字、专用字符、转义字符等。字符串常量:使用双引号使用双引号 China BASIC a+b=c Li-Li 39.4%dn 解放军“字符型的一维数组(相当于字符串变量)char st8,str10;strcpy(st,12345);strcpy(s
12、tr,st);不能st=“12345”;str=st;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.结构类型例 日期类型的定义(2)结构体C语言中实现:struct Date int month;/*月*/int d
13、ay;/*日*/int year;/*年*/;struct Date myd=12,16,1978;系统分配给它的内存是各成员所需内存量的总和。本例是6.(1)指针:)指针:变量名的在内存中的存储地址。(2)指针变量)指针变量int i=12,*p;P=&i;把存放变量i 的地址的变量p 称作指针变量。指针变量的存放内容是数据的地址。3.指针类型(3)指针引用变量)指针引用变量指针变量可以指向各种不同的数据类型,因此指针变量也要有不同的指针类型。如:int m,*p;float x,*q;int a,*rm=12;p=&m;x=3.14;q=&x;r=a;注意:是否用&1.4 输入、输出输入、
14、输出输出:printf(“.”,.)%d,%6d,%ld%c,%s%f,%10.2f,%lf,%20.8lf n=3;printf(“n%d,%d,%d”,n,+n,n+);计算从右到左,输出从左到右。%s是输出以指定首地址到第一个0或空格之间的字符串。char a=“abcd efg”,*p=a;printf(“%s”,*+p);bcd5,5,31.4 输入、输出输入、输出输入:scanf(“.”,.)%d,%ld 对应int long%c,%s 对应char char str%f,%lf 对应flaot double常见错误 int a,b;char d,e20;scanf(%d,%fn”
15、,&a,&b);scanf(%d,%f”,a,b);scanf(%7.2f,&a);scanf(%s,&e);scanf(%c,d);(1)表达式语句表达式语句(2)流程控制语句流程控制语句(3)复合语句复合语句C语语言言语语句句 指令语句指令语句 非指令语句非指令语句数据定义语句数据定义语句 float x;int m;编译预处理编译预处理宏定义#define PI 3.14159文件包含处理#include 二、C语言的程序结构与相关语句表达式语句1.表达式语句的组成:由一个表达式后接一个分号组成的由一个表达式后接一个分号组成的。i=i+1 (是表达式,没有构成语句)i=i+1;(是语句)
16、x+y;(是合法语句,但没有实际意义)表达式语句的分类:赋值语句:i=1;c=getchar();函数调用语句:printf(n Hello,world!);空语句。其形式为:;逗号表达式语句:+a,-b;完成一定的控制功能。9种控制语句:判断语句判断语句 条件判断语句 if()else 多分支选择语句 switch()case循环语句循环语句 循环次数控制语句 for()先判断后执行循环控制语句while()先执行后判断循环控制语句dowhile()转移控制语句转移控制语句 直接转移语句 goto 终止语句 break(用在循环结构、swicth)跳转语句 continue(仅用在循环结构)
17、返回语句 return流程控制语句流程控制语句复合语句复合语句一组语句括在一对花括号一对花括号之中,称复合语句复合语句。c=getchar();putchar(c);注意,一个复合语句的后花括号之后一个复合语句的后花括号之后不应再写分号不应再写分号。在语法上是一个整体,相当于一个语句。凡是能够使用简单语句的地方,都可以使用复合语句凡是能够使用简单语句的地方,都可以使用复合语句。一个复合语句中又可以包含另一个或多个复合语句。二、C语言的程序结构与相关语句程序的三种基本结构:顺序结构顺序结构 选择结构选择结构 if()else switch()case 循环结构循环结构 for().;while(
18、);do ;while()选择结构单分支结构 if(a=b)printf(“yes”);双分支结构 if(a=b)printf(“yes”);else printf(“no”);多分支结构 switch_case 多分支选择语句switch(表达式)(表达式)case 常量表达式常量表达式1:语句序列语句序列1;break;case 常量表达式常量表达式2:语句序列语句序列2;break;case 常量表达式常量表达式n:语句序列语句序列n;break;default:语句序列:语句序列n+1;根据“表达式”的值从上至下去寻找与表达式的值相匹配的“case常量表达式”,执行一个分支后,再执行下
19、一个分支,直到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=1case 1:swtch(1)b=1printf#,break跳出switch(b)结构进入switch(
20、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后面的语句只能是一句,因此,多句时别忘了。在whi
21、le(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=1i-,i=0while(i)终止循环i+,i=1输出i=1i-,i=0break,coutinuebreak只能用于switch和循环语句中,作用提前终止本层次switch和循环。coutinue是跳过循环体内尚未执行的语句,接
22、着执行下次循环。常用的循环算法求素数、水仙花数、最小公倍数、最大公约数、分解多位数的数字,累加,累乘,分解质因数等。各种有规律的图案。while(m)k=m%10;/*求最低位的数字*/m=m/10;/*除去最低位的数字*/分解多位数的数字判断素数main()int i,x,flag=0;scanf(“%d”,&x);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,&m,&n);cmn=facto(m)/(
23、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 a5=,2,4,5;int i2=1,2,3,4,5,6
24、;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);for(i=0;i5;i+)printf(%d,*(a+i);/*地址法*/printf(n);for(p=a;pa+5;p+)printf(%d,*p);/*指针变量*/数组的操作往往用循环结构.数值数组#define M 10int aM;for(i=0;iM;i+)字符数组#define M 10char
25、aM;for(i=0;ai!=0;i+)数值数组倒序#define M 10main()int i,j,aM;for(i=0;iM;i+)scanf(“%d”,ai);for(i=0,j=M;ij;i+,i-)交换ai,aj字符数组倒序main()int i,j;char a50;gets(a);for(i=0,j=strlen(a);ij;i+,i-)交换ai,aj用函数实现倒序数值数组void inv(int x,int n);#define M 10main()int i,j,aM;for(i=0;iM;i+)scanf(“%d”,ai);inv(a,M);for(i=0;iM;i+)p
26、rintf(“%d”,ai);字符数组void inv(char x)main()int i,j;char a50;gets(a);inv(a);puts(a);多一个参多一个参数,表示数,表示元素个数元素个数可以整可以整体输入,体输入,输出输出必须单必须单个输入,个输入,输出输出数值数组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
27、,s=0,a33;for(i=0;i3;i+)for(j=0;j3;j+)scanf(%d,&aij);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 10main()int i,aM,s=0;for(i=0;iM;i+)scanf(“%d”,&ai);for(i=0;iM;i+)s+=ai;printf(“s=%d”,s);#define M 10main()int i,aM,s=1;for(i=0;iM;i+)scanf(“%d”,&ai);for(
28、i=0;iM;i+)s*=ai;printf(“s=%d”,s);求最大(小)值#define M 30main()int i,k,k_i,aM;for(i=0;iM;i+)scanf(“%d”,&ai);k=a0;k_i=0;for(i=1;iM;i+)if(kai)k=ai;k_i=i;printf(“max=%d,maxi=%d”,k,k_i);最小值 if(kai)最大值字符数组char str50;int i;for(i=0;stri!=0,i+)构造新的字符数组(删除,插入,复制,连接,倒序)。1.用和不用字符串函数实现上述功能。2.用指针实现。3.必须注意最后一项一定是:stri
29、=0;或 *p=0;二维字符数组二维数组在内存中的排列顺序是“按行优先存放”二维数组amn可以视为由n个一维数组am组成的。二维字符数组中m由其中最长的字符串决定。char stu56=“Tom,“Anne,“Mary,“Peter;其中stu0=“Tom“stu1=“Anne字符串函数要用#include 字符串拷贝函数strcpy字符串连接函数strcat字符串比较函数strcmp测字符串长度函数strlen函数函数strlen的值为的值为0之前的全部字符个数之前的全部字符个数.它与数组长度不是一个概念它与数组长度不是一个概念.char s6=H,o,w,0,o,kstrlen(s)=3字
30、符串函数的应用字符串赋值字符串比较s1=s2strcpy(s1,s2)s1=s2strcmp(s1,s2)=0s1s2strcmp(s1,s2)0s1s2strcmp(s1,s2)0一 函数定义的形式:存储类型存储类型 数据类型数据类型 函数名函数名(形式参数表形式参数表)变量数据定义语句序列;变量数据定义语句序列;可执行语句序列;可执行语句序列;int fun(int x,int y)int z;z=x+y;return z;函函数数首首部部 函函数数体体四四 函数函数非非void型型int fun(int x,int y);main()int a,b;scanf(“%d,%d”,&a,&b
31、);printf(“%d”,fun(a,b);int fun(int x,int y)int z;z=x+y;return z;作为框架记住作为框架记住void型型void fun(int x,int y);main()int a,b;scanf(“%d,%d”,&a,&b);fun(a,b);printf(“%d,%d”,a,b);void fun(int x,int y)int z;z=x;x=y;y=z;printf(“%d,%d”,x,y);填main()char fun(int x,int y)int z;z=x+y;return z;main()int a,b;函数实参函数实参ch
32、ar c;函数返回值函数返回值scanf(“%d,%d”,a,b);实参赋值实参赋值c=fun(a,b);调用函数调用函数printf(“%c”,c);输出结果输出结果注意变量数据类型的对应注意变量数据类型的对应int%d long%ldfloat%f double%lfchar%c或或%s递归调用的概念递归调用的概念 在语言中,一个函数直接或间接地调用在语言中,一个函数直接或间接地调用自身,便构成了函数的递归调用。自身,便构成了函数的递归调用。前者为直接递归调用前者为直接递归调用,后者称间接递归调用。后者称间接递归调用。计算n!的函数rfact()long fac(int n)long p;
33、if(n=0|n=1)p=1;else p=n*fac(n-1);/*自己调自己*/return p;void main()printf(“%ld”,fac(5);记住递归调用的框架记住递归调用的框架数组名作函数实参void fun(int a,int n);main()int arr10,i;for(i=0;i10;i+)scanf(“%d”,&arri);fun(arr,10);for(i=0;i10;i+)printf(“%d”,arri);main()int i,a=2;for(i=1;i=5;i+)f(i);printf(“%dn”,a);f(j)int j;static int a
34、=100;auto k=1;+k;printf(“%d+%d+%d=%dn”,a,k,j,a+k+j);a+=10;函数调用函数调用函数定义函数定义函数内定义函数内定义,值不保留。值不保留。运行结果:运行结果:100+2+1=103110+2+2=114120+2+3=125130+2+4=136140+2+5=1472两个函数变两个函数变量同名量同名,互互不影响。不影响。静态变量静态变量 五五 指针指针(1)指针指针:某变量的某变量的地址地址值称为该变量的指针称为该变量的指针。(2)指针变量:指针变量:指针变量是存放普通变量地址的变量。指针变量指向这个普通变量。1112ab地址1010101
35、210101012pq地址100220042006指针变量指针变量 整型变量整型变量指针变量的定义 数据类型数据类型 *指针变量名指针变量名1;double*pd,d1,d2;/*pd为指向double型变量的指针*/char *pc,c1,c2;/*pc为指向char型变量的指针*/float *pf,f1,f2;/*pf为指向float型变量的指针*/定义指针变量必须在变量名前加指针说明符“*”。指针变量名本身不含“*”号。定义指针变量后,系统为这个指针变量也分配一个存储单元,这个存贮单元一般都占有固定的字节(如16位计算机是2个字节)。该存贮单元用于存放普通变量的地址。指针变量的初始化c
36、har *str=“abcdef”;char str=“abcdef”,*pf=str;float f1=3.14,*pf=&f1;pf f1 f1地址100010003.14str 10001000a b c d e f 0pfstr 10001000a b c d e f 0指针变量的引用float a,b,*P;a=1.23;P=&a;b=*P;printf(“n%.2f,%.2f,b,*P);结果为:1.23,1.23p b b a a地址1010地址10141.231.2310101.231.23*p*p5与(*p)5char*p5是一个有5个元素的数组,数组元素的数据类型是指向in
37、t型的指针型char(*p)5是指向一个有5个元素的一维数组。China0Zhuhai0Shanghai0Guangzhou0Haikou010001007100E10181023*p51000p0p1p2p3p4(*p)51000a b c d 01000结构体struct date是一个类型,可以用它定义变量struct date birthday;birthday是一个结构体类型的变量 struct date int year;/*年*/int month;/*月*/int day;/*日*/;2字节字节2字节字节2字节字节birthday(struct date)6个字节个字节year
38、monthday 结构变量的各个成员分量在内存中占用连续存结构变量的各个成员分量在内存中占用连续存储区域,所占内存大小为结构中每个成员的占用内储区域,所占内存大小为结构中每个成员的占用内存的长度之和。存的长度之和。结构变量结构变量today占用内存的情况如图所示。占用内存的情况如图所示。结构变量占用内存情况结构体变量的初始化按照成员的顺序和类型对成员初始化struct date birthday=1984,10,20;结构体变量的引用一般形式:结构体变量名.成员名成员运算符.具有最高的优先级,自左向右结合printf(“%4d.%02d.%02d”,birthday.year,birthday.month,birthday.day)指向结构体的指针指向结构体的指针定义、使用与其他基本类型指针类似可以使用指向运算符(-)引用指针所指向的结构体的成员指向运算符-结构体指针-成员名具有最高的优先级,自左向右结合若struct student stu,*p=stu;则stu.num、(*p).num、p-num等效考试单选填空 25(125)读程序写结果 25(55)改错 20(210)程序填空 20(210)写程序 10