福建省计算机二级C语言复习资料Word文件下载.docx
《福建省计算机二级C语言复习资料Word文件下载.docx》由会员分享,可在线阅读,更多相关《福建省计算机二级C语言复习资料Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
10.强制类型转换:
一定是(int)a不是
int(a),注意类型上一定有括号的。
注意(int)(a+b)和(int)a+b的区别。
前是把a+b算完结果转型,后是把a转型再加上b。
11.自加、自减表达式:
假设a=5,++a(先算a自增为6,后表达式6),a++(先表达式=5在自增a=6)。
++在前先自增后赋,++在后先赋值后自增。
12.逗号表达式:
优先级别最低;
表达式的数值逗号最右边的那个表达式的数值。
如(2,3,4)的表达式的数值就是4。
13.位运算的考查:
口诀:
先转二进制再运算
总的处理方法:
(先把十进制变成二进制再变成十进制)。
例1:
chara=6,b;
b=a<
<
2;
这种题目的计算是先要把a的十进制6化成二进制,再做位运算P课本229。
14.%符号两边要求是整数。
不是整数就错了。
15.变量:
变量的命名规则满足标识符的命名规则,区分大小写,关键字(P7)除外,变量的定义一般都要放在函数或程序的开头位置(即先定义后使用)
16.分号:
表示一个语句结束
17.变量的定义:
类型名变量名列表;
(不同的类型要写成两句),定义的时候给值成为变量的初始化,初始化的时候不能连等(如inta=b=c=1;
是错的!
inta,b,c;
a=b=c=1;
是对的)。
18.变量的赋值:
变量名=表达式或变量名复合赋值运算符表达式(复合赋值运算符:
+=,*=,^=,...),如:
xyz+2=c行吗?
不行(赋值表达式左边只能是变量)!
赋值的时候可以连等。
19.输入一个字符:
x=getchar(),putchar(x),有这两个函数及FILE时一定要加上头文件
#include<
stdio.h>
//标准输入输出的头文件包含
20.getch(),表示暂停程序运行,可直接查看结果,否则运行完后不显示结果(需按ALT+F5)。
21.scanf("
格式控制符"
地址列表),地址列表可为数组名、指针变量名及普通变量名(普通变量名前要加加&
)。
inta;
charb[10];
(字符型char:
%c,字符串:
%s;
整形int:
%d长整型long:
%ld;
浮点型float:
%f,双精度double:
%if)scanf("
%d"
&
a);
scanf("
%s"
b);
数组名b=&
b[0]
22.保留小数点n位:
printf("
%m.nf"
32.6789)或者printf("
%.nf"
a)
23.scanf的格式控制符中,除了逗号,一般不加其他字符;
一定要记住,有逗号时输入要加逗号,否则:
数据用空格隔开,字符连着输入;
没有"
的写法,只有"
%mf"
的写法.
24.常量不能++、--;
=与==的区别(赋值和判断)
例:
b=(a=1,a++,a++),结果为2
又例:
b=(a=2)+(a=3),结果为5
a=1;
b=(++a)+(++a)结果为5
25.在C语言中,对于逻辑运算,非零的数(不管实数还是整数)都认为是真的,真的就是1,假的就是0;
26.关系运算的结果是逻辑值(真为1假为0)。
27.运算符:
运算符的优先序(课本最后一页):
括号,单目(++,--,!
,*,),算术(*,/,%,+,-),关系(<
=,>
,==,!
=之类),位运算(&
,|),逻辑(&
&
,||),条件(判断?
真:
假),赋值(+=,*=之类),逗号表达式
例如.以下程序的运行结果是D
structst
{intn;
floatx;
}*p;
voidmain()
{structstarr[3]={{10,5.6},{12,7.1},{14,6.7}};
p=arr;
printf(“%d\n”,++p->
n);
p++;
printf(“%d,%.2f\n”,p->
n,p->
x);
}
A)12B)11C)11D)12
12,7.1010,5.6012,7.1014,6.70
第三、四章选择和循环结构
1.C程序一般采用自顶向下的编写格式,模块化(函数)
2.C程序结构有三种:
顺序,选择(分支),循环
3.分支结构(或选择结构)[if结构和switch结构]
1.
x=y=z=1;
a=15;
if(!
x)
a--;
elseif(y);
if(z)
a=3;
else
a+=4;
printf("
%d\n"
a);
if分支结构(碰到if与else个数不相等时,从最后的一一搭配)
if(a>
b)
if(a>
c)
%d"
b);
c);
2.多分支switch:
(注意有没break;
)
main()
{intc;
while((c=getchar())!
='
{switch(c-'
2'
{case0:
case1:
putchar(c+4);
case2:
break;
case3:
putchar(c+3);
default:
putchar(c+2);
}
\n"
);
当输入:
247<
回车>
,程序的输出结果是()
switch(x)
{casex1:
语句1;
[break;
]
...
casexn:
语句n;
[break;
语句;
若计算出表达式的值与case后的所有常量表达式的值都不同则只执行default及之后的语句组一直执行到最后(若遇break则终止退出switch结构),如没有default语句则直接退出switch结构。
intb=10;
for(i=1;
i<
=10;
i++)for(i=1;
i++)
{if(i%2==0)break;
{if(i%2==0)continue;
printf(“%d”,i);
}printf(“%d”,i);
}
printf(“%d”,b);
printf(“%d”,b)
break;
/*用于结束当层循环,跳到当层循环后面的语句。
*/
上例中i=2时,执行break;
退出for循环,执行printf(“%d”,b);
语句。
continue;
/*用于结束当次循环,跳过本次循环后面的语句,进入下次循环,如执行i++。
右边中,i=2时,执行continue;
退出i=2循环,执行i++,即i=3语句,继续判断for循环。
直到不满足for的判断条件i<
=10,退出循环。
循环总结:
•for循环与while循环类似,属于先判断后执行;
dowhile,属于先执行后判断
•for语句中有三个表达式:
表达式1通常用来给循环变量赋初值;
表达式2通常是循环判断条件;
表达式3用来更新循环变量的值
•for语句中的各个表达式都可以省略,但要注意分号不能省略
•如果省略表达式2和表达式3需要在循环体内设法结束循环,否则会导致死循环
•嵌套循环时,必须将被嵌套的循环语句完整地包含在外层循环的循环体内。
一般外层循环控制趟次数或行个数,内层循环控制每行中*之类的个数。
第五章函数
1.系统函数:
数学类函数(出现sqrt,cos,sin等之类的)必须包含头文件#include<
math.h>
输入输出函数#include<
字符串函数(出现strcmp,strcpy,strcat等)#include<
string.h>
2.自定义函数:
格式
类型名函数名(形式参数列表)
{函数体}
3.不写函数类型名默认为整型
4.如果函数类型名为void表示无返回值函数(不写return)
5.
如果调用函数写在被调函数之前,且被调函数类型名不是整型(或字符型),则在调用函数中或调用函数之前应该先声明,如何声明?
声明:
类型名函数名(形式参数列表);
6.函数的递归:
直接或者间接调用自身。
(如阶乘)
7.全局变量:
在函数外定义的变量。
局部变量:
在函数内定义的变量、形式参数、复合语句中定义的变量。
若全局变量和局部变量同名且都有值,则自动屏蔽掉全局变量,使用局部变量值来计算。
8.函数调用时,实参向形参传递:
(注意实参跟形参不仅个数相等,类型也要完全相等)
(1)按值传递:
形参的变化不会改变实参的变化。
(若有返回值将值带回,否则直接返回主函数位置接着执行后续函数,函数的返回值类型与函数类型一致);
(2)按地址传递,一般是用指针来存放地址:
形参的变化就会有可能改变实参的变化。
(3)数组传递,通常就把数组名及数组元素传过去
9.returny;
或return(y);
不要写成returny1,y2;
10.静态变量:
staticintx;
(1)没给值,默认为0;
(2)始终占用内存,其值会保留下来(即只赋初值一次,)
[静态变量]举例
eg:
以下程序的运行结果是(C)。
fun3(intx)main()
{staticinta=3;
{intk=2,m=1,n;
a+=x;
n=fun3(k);
returna;
n=fun3(m);
}printf("
n);
A、3B、4C、6D、9
11.宏定义:
#define标识符字符串宏一定要先替换后计算
分带参和无参宏定义无参宏定义如#definePx*x//表示碰到P时用x*x替换
带参宏定义如#defineP(x)x*x//表示碰到P(x)时用x*x替换
若有定义:
#defineN3+2,则表达式N*2的值为(B)。
3+2*2
A、5B、7C、10D、0
以下程序运行后输出结果是(B)。
#defineMIN(m,n)m<
n?
m:
n
main()
{inta=3,b=5,c;
c=2*MIN(a,b);
A、3B、5C、6D、10
解释:
c=2*MIN(a,b)=2*a<
b?
a:
b2*3<
5?
3:
5。
第六章数组
1.一维数组的定义格式为:
类型说明符数组名[常量表达式];
例如:
inta[10];
或者#defineN5inta[N];
常量表达式可以是整型常量或字符常量或枚举值或符号常量表达式(注意不能包含变量).
2.C语言规定,下标的最小值是0,最大值则是数组大小减1。
eg:
m[8]中,表示数组m有8个元素,下标从0开始一直到7。
这8个数组元素分别是:
m[0]、m[1]、m[2]、m[3]、m[4]、m[5]、m[6]、m[7],注意没有m[8]。
3.对一维数组的初始化赋值
(1)可以只给部分元素赋初值。
没有赋值的元素:
对于数值型数组,自动赋初值为0;
对字符型数组,自动赋初值为空字符。
(2)只能给元素逐个赋值,不能给数组整体赋值。
intm[5]={2,2,2,2,2};
不能写成:
intm[5]=2;
(3)如果给全部元素赋值,则在数组说明中,可以不给出数组元素的个数,其长度等于初值表中数组元素的个数。
intm[]={1,2,3,4,5};
4.二维数组元素的引用形式:
数组名[行数下标][列数下标];
Eg:
若有定义:
ints[3][4]={{1,2},{0},{3,4,5}};
则s[2][1]的值为(B)。
A.3B.4C.0D.1
(1)省略一维大小:
Eg:
inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
a[1][2]);
D
A.2B.3C.6D.7
5.字符数组的定义格式:
char数组名[常量表达式];
6.在c语言中,没有专门的字符串变量,通常是用一个字符数组来存放一个字符串,由于字符串总是以‘\0’作为串的结束标志,因此当把一个字符串存入一个数组时,也把结束符‘\0’存入数组,并以此作为该字符串结束的标志
7.C语言允许用字符串的方式对数组做初始化赋值。
有两种方式:
chars[]={‘1’,’2’,’3’,’\0’};
=>
chars[]={“123”};
chars[]=“123”;
8.设已定义chars[]="
\"
Name\\Address\023\n"
;
,则字符串所占的字节数是(B)。
A.19B.16C.18D.14
9.字符串的常用串函数
1strlen函数——测试字符串长度
•格式:
strlen(字符数组);
strlen得到的是有效字符的个数(不包括‘\0’)
sizeof得到的是整个数组的长度(包括‘\0’)
2.strcat函数——字符串连接函数
格式:
strcat(字符数组1,字符数组2);
3.strcmp函数——字符串比较函数
strcmp(字符串1,字符串2);
4.strcpy函数——字符串拷贝函数
strcpy(字符数组1,字符数组2);
⑤.有时只需要复制字符数组2中前面若干个字符,这些用strcpy函数也能实现。
如:
strcpy(m1,m2,3)表示将m2前面3个字符复制到m1中,从而取代m1中最前面的3个字符。
10.冒泡、选择等排序(自我选择掌握一种能够单独写出排序过程,备用编程题2)
第七章指针
1.指针变量的本质是用来放地址,而一般的变量是放数值的。
int
*p中
*p和p的差别:
*p可以当做变量来用;
*的作用是取后面地址p指向的数值,p是当作地址来使用。
*p++和(*p)++的之间的差别:
改错题目中很重要
*p++是地址会变化;
(*p)++是数值会要变化。
2.指针变量的定义:
一般形式为:
类型符*指针变量名;
int*p;
3.指针变量的引用。
两种基本的指针运算:
(*p)=p,两符号可以相抵消得
☐&
取变量的地址
☐*:
指针运算符(或称“间接访问”运算符)
4.指针变量作函数参数
[例7.3]用函数实现两个变量的交换
voidswap(int*p1,int*p2)
{int*t;
t=*p1;
*p1=*p2;
*p2=t;
a=9,b=5
{inta=5,b=9;
swap(&
a,&
b);
printf(“a=%d,b=%d\n”,a,b);
}
5.指针函数(函数的返回值为指针)
一般定义为:
类型符*函数名(参数表){……}
[例7.4]把两个数中的最大值设为0
int*max(int*q1,int*q2)
{return*q1>
*q2?
q1:
q2;
x=5,y=0
{intx=5,y=9,*p;
p=max(&
x,&
y);
*p=0;
x=%d,y=%d\n"
x,y);
6.C语言规定:
数组名代表数组的首地址,也就是第一个元素a[0]的地址。
因此:
a&
a[0]。
若:
p=a;
/*或写成p=&
a[0];
*/
则:
p+1&
a[1]*(p+1)a[1]p+i&
a[i]*(p+i)a[i]
【例7.5】指针运算符“*”与增1运算符“++”同时作用于一个指针变量的情况。
{inti,a[]={11,22,33,44,55,66},*p=a;
%3d,"
(*p)++);
11
*p++);
12
*++p);
33
%3d\n"
++*p);
34
for(p=a;
p<
a+6;
p++)
*p);
122234445566
getch();
7.通过指针引用二维数组元素(懂得判断什么时候指地址,什么时候表示值)
*(*(a+i)+j)<
*(a[i]+j)<
a[i][j]<
*(&
a[0][0]+5*i+j)
8.字符指针与字符数组的讨论
⏹占用的内存空间不同
charstr[80];
char*p;
⏹初始化的概念不同
charstr[80]=“abc”;
char*p=“abc”;
⏹数组名是常量,字符指针是变量
str=str+2;
/*Error*/p=str+2;
/*Ok*/
⏹字符数组有一块确定的、连续的内存单元;
而指针只有一个字的内存单元。
所以:
charstr[80],*p;
scanf(“%s”,str);
/*Ok*/scanf(“%s”,p);
/*error*/
⏹指针运算小结
1、指针变量加、减一个整数,指的是移到向上或向下一个单位的地址
例如:
p++、p--、p+i、p-i、p+=i、p-=i等。
2、指针变量赋值
如有:
inta,*p1,*p2,array[10],max(),(*p3)();
p1=&
a;
/*取变量a的地址,使p1指向a*/
p2=array;
/*p2指向array数组的起始地址*/
array[4];
/*p1指向array[4]元素*/
p3=max;
/*p3指向max函数*/
p2=p1;
/*p2的指向与p1的指向相同*/
p1=2000;
x/*error,类型不同*/
a=p2;
x/*error,类型不同*/
9.三名主义:
(考试的重点)
数组名:
表示第一个元素的地址。
数组名不可以自加自减,它是地址常量名。
函数名:
表示该函数的入口地址。
字符串常量名:
表示第一个字符的地址。
10.数组的初始化,一维和二维的,一维可以不写,二维第二个,即列数一定要写
inta[]={1,2}合法。
inta[][4]={2,3,4}合法。
但inta[4][]={2,3,4}非法。
11.两个地址(指针)可以比较大小,后面大前面小;
可以相减表示差几个元素
12.对字符数组或字符串的操作一般用:
while(*s)或while(s[i])或for(p=a;
a+n;
p++)
{…;
s++}{…;
i++}n表示数组长度,有时得用strlen(a)求得
注意:
新生成的字符串填空改错最后一空可能就是让你们补结束符’\0’。
结构体、共用体和枚举
1.记住数组也属于自定义类型
[structstaffa,b;
]//若定义的结构体无结构体名则只能直接定义结构体变量,不能间接定义。
2.通过指针访问结构体变量的成员
①结构变量名.成员名(名字引用);
②结构指针->
成员名(指针引用);
③(*结构指针).成员名(将指针转化为名字引用);
3.『结构变量占用内存情况』每个成员的占用内存的长度之和。
4.联合类型(union)
(1)首地址起共用
(2)共用体变量任何时刻-只有一个成员存在
(3)共用体变量定义分配内存,长度=最长成员所占字节数(即字节数取最大的)
5.枚举类型
enumweekdays{Sun,Mon,Tue,Wed,Thu,Fri,Sat};
(1)枚举型仅适应于取值有限的数据。
(2)取值表中的值称为枚举元素,枚举元素是常量。
在C编译器中,按定义的顺序取值0、1、2、...。
所以枚举元素可以进行比较,比较规则是:
序号大者为大。
例如,上例中的Sun=0、Mon=1、……、Sat=6,所以Mon>
Sun、Sat最大。
(3)枚举元素的值也是可以人为改变的:
定义时由程序指定。
例如,如果enumweekdays{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};
则Sun=7,Mon=1,从Tue=2开始,依次增1。
第九章文件操作与位运算
1.6个位运算符:
位左移<
、位右移>
>
、按位取反~、位与&
、位或|、位异或^。
2.位运算题目计算是先要把十进制化成二进制,再做位运算。
在没有舍去数据的时候,<
左移n位表示乘以2的n次方;
右移一位表示除以2的