c语言学习资料整理总结.docx
《c语言学习资料整理总结.docx》由会员分享,可在线阅读,更多相关《c语言学习资料整理总结.docx(23页珍藏版)》请在冰豆网上搜索。
c语言学习资料整理总结
C语言知识整理
(一)数据类型知识点整理
常量
a.整型常量
分为int\shortint\longint\unsignedint\unsignedshort\unsignedlong\
注意:
(1)-32768—32768int\longint
(2)-2147483648—2147483648longint
(3)后加字母u表示unsignedint型,加l或L表示longint型。
b.浮点常量
(1)c语言编译系统将浮点型常量作为双精度处理;
(2)一个浮点型常量可以赋值给float、double或longdouble变量;
C.字符串常量
(1)字符常量用’‘括起来,如:
’a‘字符串常量用“”括起来;
(2)不能把一个字符串常量赋值给一个字符变量;
(3)以‘\0’作为字符串结束的标志(\0系统会自动加上)。
d.符号常量
(1)利用标识符代表常量,用#define定义如:
#defineN30;
(2)符号常量不能再被赋值;
(3)标识符只能由字母下划线数字组成,并且第一个字符必须为字母或下划线。
变量
a.整形变量
(1)变量定义时,放在函数的开头部分;
(2)数据溢出,程序不会自动报错,而是又从最小值开始计数。
b.浮点型变量
(1)表现形式:
十进制小数,0.12312.3;指数形式,123e3或123E3(123*10^3);
注意:
字母e或E之前必须有数字,且e后面的指数必须是整数(如:
e3、2e2.3都是不合理的);
(2)舍入误差:
浮点型变量存储单位有限,有效数字也是有限的,以外的数字将会被舍去。
C.字符型数据(char)
存放字符变量,只能放一个字符。
数值型数据间的混合运算
计算时,不同类型数据之间要转换为同一类型(长度短的转化为长度长的)
字符数据整数shortintfloat所有的类型double型
运算符
a.强制型转换运算符(类型名)表达式
转换时,只改变其值,不改变原来的类型
如:
floatx=32767.0
i=(int)x%3
输出时:
x=32767.0i=1
b.自增自减运算符
++i;--i(使用i之前,先使i的值加减1)
i++;i--(使用i之后,再使i的值加减1)
如:
i=1;++i中++i=2,i=2;i++=1,i=2
只能用于变量,不能用于常量或表达式,其结合方向是自右向左。
C.类型转换
(1)浮点型整型舍弃浮点数后的小数部分i=3.5—i=3;
(2)整型单双精度数值不变,以浮点形式储存f=12—f=12.00000;
(3)doublefloat截取前面7位有效数字(数值不得超过float的范围);
(4)字符型整型变量将字符数据放在整型变量储存单元的低8位中;
(5)整型数据char将其低8位原封不动的送到char中;
(6)intlongint的16位送到long的低16位中,如果int为+,高16位补0;如果为-,则补1。
反之将低16位原封不动的送到int中;
(7)unsignedintlongint高位补0;
(8)非unsignedunsigned(长度相同)原样赋值。
d.逗号运算符(表达式1,表达式2)值为后者的值
如:
(1+5,1+2值为3)
并不是任何时候出现逗号都是作为逗号运算符。
数组
a.一维数组类型说明符数组名[常量表达式]inta[10]
引用数组时要先定义后使用。
(1)初始化(无初始化时,则元素为随机数)
定义时赋初值;inta[3]={0,1,2};
部分元素赋值:
inta[10]={0,1,2,3,4}后面5个元素自动为0;
inta[10]={0*10}不能这样给数组整体赋初值。
c.程序举例
处理fibonacci数列问题
#include
main()
{
inti;
intf[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++)
{
if(i%5==0)printf(“\n”);
printf(“%12d”,f[i]);
}
Printf(“\n”);
}
运行结果:
11235
813213455
89144233377610
9871597258441816765
b.二维数组类型说明符数组名[常量表达式][常量表达式]
floata[3][10]二维数组的排序按行存放。
(1)区分定义数组a[3][4]与引用元素a[3][4]的区别;
(2)初始化
inta[2][3]={1,2,3,4,5,6};
部分赋值inta[3][4]={{1},{5},{9}};inta[3][4]={{1},{0,6},{0,0,11}};
分行赋值inta[2][3]={{1,2,3},{4,5,6}};
对全部赋值定义数组时,对第一维的长度时可以不指定,但是第二维不能省。
inta[][4]={{1,2},{2,4,3},{2}},只对部分元素赋初值而省略第一维长度,但应分行赋初值。
(3)程序举例
将二维数组行列互换,存到另一个二维数组中去。
#include
Main()
{
inta[2][3]={{1,2,3},{4,5,6}};
intb[3][2],i,j;
printf(“arraya:
\n”);
for(i=0;i<=1;i++)
{
for(j=0;j<=2;j++)
{
Printf(“%5d”,a[i][j]);
b[j][i]=a[i][j];
}
Printf(“\n”);
}
Printf(“arrayb:
\n”);
For(i=0;i<=2;i++)
{
For(j=0;j<=1;j++)
Printf(“%5d”,b[i][j]);
Printf(“\n”);
}
}
C.字符数组charc[10](一个元素存放一个字符)
也可以定义一个整型数组,用其存放字符数。
(1)初始化
逐个赋值:
charc[10]={‘i’,’’,’a’,’m’,’’,’h’,’a’,’p’,’p’,’y’}
字符个数不得超过数组长度(定义时可以省略数组数组长度)。
(2)程序举例
输出一个字符串
#include
main()
{
Charc[10]={‘I’,’’,’a’,’m’,’’,’h’,’a’,’p’,’p’,’y’};
inti;
for(i=0;i<10;i++)
printf(“%c”,c[i]);
printf(“\n”);
}
运行结果:
Iamaboy.
(3)字符串以‘\0‘为结束标志;
保证数组的长度始终大于字符串实际长度,‘\0‘只是识别标志,并非有效字符。
(二)输入输出函数
1.输入输出函数有:
putchar(输出字符)getchar(输入字符)printf(格式输出)scanf(格式输入)gets(输入字符串)puts(输出字符串)
2.在使用系统库函数时,要用预编译命令#include/#include”stdio.h”
Putchar函数
1.作用是向终端输出一个字符
2.一般形式putchar(c),其中c可以为字符型变量或整型变量(c\ch\’a’\’a’+65\65)
Getchar函数
1.作用是从终端输入一个字符
2.getchar无函数参数,一般形式getchar()
注意:
以下写法是正确的
putchar(getchar());相当于printf(“%c”,getchar());
格式输出输入函数:
Printf函数
1.输出若干个任意类型的数据(putchar只能输出字符,而且是一个字符/printf可以输出多个数据,且为任意型)
2.一般格式printf(格式控制,输出列表)
或者printf(参数1,参数2,参数3,……,参数n)
格式控制:
用双撇号括起来的字符串,也称“转换控制字符串”包括
A.格式说明:
%加格式字符组成
B.普通字符:
即需要原样输出的字符
输出列表:
需要输出的数据,可以是表达式。
格式字符:
d,i格式字符
%d十进制实际长度输出
%md指定m宽度输出,数据长小于m左端补空格,大于按实际输出
%ld输出长整型数据
%mld指定长度输出
注意:
int型%d和%ld都可以
O格式字符
%o八进制整数形式输出,输出不带符号,符号位也作为八进制数的一部分输出,即不会输出带负号的八进制数(-1用八进制输出为177777),对长整型,可用%lo格式,也可以%mo,同上
X格式字符
%x十六进制形式输出,同样无负数,同样可以用%lx和%mx
U格式字符
%u输出无符号型数据,以十进制形式输出,注意无符号型输出和其他输出输出数据的对比,详细见书(p77页)
C格式字符
%c用来输入一个字符,注意,一个整数在0—255范围内,也可以用%c输出,转换为相应字符,反之,一个字符也可以用整型输出
S格式字符
%s输入一个字符串
%ms字符串本身长度大于就全部输出,小于左端补空格%-ms在右端补空格
%m.ns只取字符串左端n个字符,左补空格
%-m.ns右补空格,若n>m,m自动取n的值
F格式字符
%f用来输出实数(double/float),以小数形式输出。
一般给出六位小数。
%m.nf输出n位小数,数值长度小于m,左端补空格,%-m.nf右端补空格。
E格式字符
%e以指数形式输出实数,用e是指数以e表示(如1.2e+02)
%E,指数用E表示
G格式字符
选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0,用G以指数形式输出时,指数要大写
—(附加格式说明字符)
输出的数字或字符在域内向左靠
注意几点:
1.除X,E,G外,其他的格式字符必须用小写字母
2.格式控制中可以输出转义字符:
字符形式
含义
Ascii代码
\n
换行,将当前位置移动到下一行开头
10
\t
水平制表(跳到下一个tab位置)
9
\b
退格,将当前位置移到本行开头
8
\r
回车,将当前位置移到本行开头,(回车不换行)
13
\f
换页,将当前位置下移到下页开头
12
\\
代表一个反斜杠字符“\”
92
\’
代表一个单引号字符
39
\’’
代表一个双引号字符
34
\ddd
1到3位八进制数代表的字符
\xhh
1到2位十六进制数所代表的字符
3.一个格式说明以%开头,如果想输出字符“%”,则应该在格式控制字符串中用连续两个%。
Scanf函数
1.一般格式:
scanf(格式控制,地址表列)
2.格式控制同printf函数,地址列表是由若干地址组成的表列,可以是变量的地址,或字符串首地址。
记得&。
3.&地址运算符,输入数据时,分隔符应该与格式控制里的相对应输入。
即用逗号分隔的,输入的时候也要用逗号分隔,没有规定的用空格和回车或者是Tab键。
4.格式说明:
与printf格式说明类似。
A.如果在%后有一个“*”附加说明符,表示跳过它指定的列数。
B.输入数据时,不能规定精度,如“%7.2f”是错的。
使用scanf函数应该注意的事项:
A.格式控制后面应当是变量地址,而不是变量名
B.如果在格式控制字符串中除了格式说明以外还有其他字符,则在输入数据时,在对应位置应输入与这些字符相同的字符。
如果格式控制里有空格分隔,输入的时候只能比格式控制里的空格数多。
C.在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入。
D.在输入数据时,遇到以下情况认为该数据结束:
1遇到空格,或者按回车,tab键;
2按指定的宽度结束,如“%3d”,只取3列;
3遇到非法输入
Puts函数
1.一般形式:
puts(字符数组)
2.作用是将一个字符串(以‘\0’结束的字符序列)输出,可以包含转义字符。
Gets函数
1.作用是将一个字符串输入到一个数组,并且得到一个函数值。
该函数值是字符属猪的起始地址。
2.一般形式gets(字符数组)eg:
gets(str);
注意:
用puts和gets只能一次处理一个字符串
各类运算符
1.C语言运算符简介:
算术,关系,逻辑,位运算,赋值,条件,逗号,指针运算符,sizeof,强制类型转换,分量运算符,下标运算符。
常见的运算符归纳:
1.算术运算符(+,-,*,/,%)
A.说明:
两个整数相除结果为整数,有负数参与,多半遵循“向零取整”的方法,取整数后向零靠拢。
B.在表达式求值的时候,先按运算符的优先级别高低次序执行,优先级别相同的,按规定的“结合方向”处理,详细见书本附录。
C.如果一个运算符两侧数据类型不同,先自动经行转换
转换规律:
高Doublefloat
Long
Unsigned
低Intchar,short
2.强制类型转换
A.一般形式:
(类型名)(表达式)
B.表达式应该用括号括起来,注意区别(int)(x+y)和(int)x+y,第一个是转换x+y,第二个只转换了x
C.在强制类型转换时,得到一个中间数据,原来变量的类型未发生变化
3.自增自减运算符
A.++i,--i;(在使用之前先使i的值增加或者减少1)i++,i--;(先计算i的值,再使i的值增加或者减少1);
B.只能用于变量,不能用于常量和表达式。
C.++,--的结合方向是自右至左
D.常用于循环语句中,使循环变量自动增加1,也用于指针变量,使之指向下一个地址。
4.赋值运算符
A.赋值符号“=“称为赋值运算符,它的作用是将一个数据给一个变量。
也可以将一个表达式的值赋值给一个变量
B.如果赋值运算符两侧的类型不一致,但都是数值或者字符型的时候,转换规则:
见书(60-61页)
5.复合的赋值运算符(10种)
+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=
Eg:
a+=3相当于a=a+3
6.赋值表达式
格式:
变量赋值运算符表达式eg:
a=5;a=b=c=5;
运算规则:
先求运算符右侧的表达式的值,然后赋值给运算符左侧的变量
7.逗号运算符合逗号表达式
A.用一个逗号将两个表达式连接起来,是一个逗号表达式,又称为顺序求值运算符,一般形式是:
表达式1,表达式2
B.求解过程:
先求表达式1的值,再求解表达式2。
整个逗号表达式的值是表达式2的值。
C.表达式1,表达式2,表达式3……表达式n;它的值为表达式n的值
D.逗号表达式最常用于循环语句for语句中。
8.关系运算符及其优先次序
A.6种关系运算符:
<(小于)<=(小于或等于)>(大于)>=(大于或等于)(优先级相同高)
==(等于)!
=(不等于)(优先级相同低)
B.关系运算符的优先级低于算术运算符,高于赋值运算符
9.关系表达式
A.定义:
用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符表达式)连接起来的句子,称关系表达式。
B.关系表达式的值是一个逻辑值,即“真”或“假”。
在逻辑运算中,1代表真,0代表假。
Eg:
d=a>b,则d的值为1.
10.逻辑运算符
A.3种逻辑运算符:
&&逻辑与||逻辑或!
逻辑非
&&和||是双目运算符,要求有两个运算量,!
是一目运算符,只要求有一个运算量。
B.注意:
已知&&或者||两边左边已经确定了值,那么右边不做运算。
在&&中,两真才为真,一假便为假。
||中两假才为假,有一真便为真。
C.优先次序:
先!
,后&&,后||
与其他运算符的优先次序:
(由高到低排列)
!
(非)
算术运算符
关系运算符
&&和||
赋值运算符
D.逻辑表达式的值应该是一个逻辑量,运算结果不是0,就是1.表达式从左至右求解。
(三)c语句
一控制语句
1.If()…else…
3种形式:
①if()语句
②if()语句一else语句二
③if()…
elseif()…
……
else…
if语句的嵌套:
if()
if()语句1
else语句2
else
if()语句3
else语句4
else总是与他上面的最近的未配对的if配对。
If语句后面的表达式一般为逻辑表达式或关系表达式。
题目:
给一个不多于5位的正整数,要求:
一、求它是几位数,二、逆序打印出各位数字。
1. 程序分析:
学会分解出每一位数,如下解释:
(这里是一种简单的算法)
2.程序源代码:
#include
main()
{
longa,b,c,d,e,x;
scanf("%ld",&x);
a=x/10000;/*分解出万位*/
b=x%10000/1000;/*分解出千位*/
c=x%1000/100;/*分解出百位*/
d=x%100/10;/*分解出十位*/
e=x%10;/*分解出个位*/
if(a!
=0)printf("thereare5,%ld%ld%ld%ld%ld\n",e,d,c,b,a);
elseif(b!
=0)printf("thereare4,%ld%ld%ld%ld\n",e,d,c,b);
elseif(c!
=0)printf("thereare3,%ld%ld%ld\n",e,d,c);
elseif(d!
=0)printf("thereare2,%ld%ld\n",e,d);
elseif(e!
=0)printf("thereare1,%ld\n",e);
}
题目:
输入三个整数x,y,z,请把这三个数由小到大输出。
1.程序分析:
我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。
2.程序源代码:
#include
voidmain()
{
int x,y,z,t;
scanf("%d%d%d",&x,&y,&z);
if (x>y)
{t=x;x=y;y=t;} /*交换x,y的值*/
if(x>z)
{t=z;z=x;x=t;}/*交换x,z的值*/
if(y>z)
{t=y;y=z;z=t;}/*交换z,y的值*/
printf("small to big:
%d %d %d\n",x,y,z);
}
2.for()…
一般形式:
for(表达式1;表达式2;表达式3)语句
题目:
有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?
都是多少?
1.程序分析:
可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:
#include
main()
{
inti,j,k;
printf("\n");
for(i=1;i<5;i++)/*以下为三重循环*/
for(j=1;j<5;j++)
for(k=1;k<5;k++)
{
if(i!
=k&&i!
=j&&j!
=k)/*确保i、j、k三位互不相同*/
printf("%d,%d,%d\n",i,j,k);
}
}
题目:
古典问题:
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析:
兔子的规律为数列1,1,2,3,5,8,13,21....
2.程序源代码:
#include
main()
{
longf1,f2;
inti;
f1=f2=1;
for(i=1;i<=20;i++)
{
printf("%12ld%12ld",f1,f2);
if(i%2==0)printf("\n");/*控制输出,每行四个*/
f1=f1+f2;/*前两个月加起来赋值给第三个月*/
f2=f1+f2;/*前两个月加起来赋值给第三个月*/
}
}
3.while()…
例:
求Sn=a+aa+aaa+…+aa…a之值,n,a由键盘输入。
#include
voidmain()
{
inta,n,i=1,sn=0,tn=0;
printf("a,n=:
");
scanf("%d,%d",&a,&n);
while(i<=n)
{
tn=tn+a;
sn=sn+tn;
a=a*10;
++i;
}
printf("a+aa+aaa+…+aa…a=%d\n",sn);
}
4.do…while()
题目:
求1+2+3+…+100的值。
#include
voidmain()
{
intsum=0,i;
i=1;
do
{
sum=sum+i;
i++;
}
while(i<=100);
printf(“sum=%d\n”,sum);
}
5.continue…
题目:
把100—200之间的不能被三整除的数输出。
#include
voidmain()
{
intn;
for(n=100;n<=200;n++)
{
if(n%3==0)
continue;
printf(“%d\n”,n);
}
}
6.break…
题目:
计算r=1到r=10时的圆面积,直到面积大于100为止。
#include
voidmain()
{
intr;
floatpi=3.14159f,area;
for(r=1;r<=10;r++)
{
area=pi*r*r;
if(area>100)break;
printf("r=%d,area=%f\n",r,area);
}
}
7.switch…括号内的表达式,其值可以是整型、字符型、枚举型数据。
Case只是起语句标号作用,并不是在该处进行条件判断。
题目:
输入某年某月某日,判断这一天是这一年的第几天?
1.程序分析:
以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊
情况,闰年且输入月份大于3时需考虑多加一天。
2.程序源代码:
#include
main()
{
intday,month,year,sum,leap;
printf("\npleaseinputyear,month,day\n");
scanf