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.符号常量\n(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)存放字符变量,只能放一个字符。\n数值型数据间的混合运算计算时,不同类型数据之间要转换为同一类型(长度短的转化为长度长的)字符数据整数shortintfloat所有的类型double型运算符a.强制型转换运算符(类型名)表达式转换时,只改变其值,不改变原来的类型如:floatx=32767.0i=(int)x%3输出时:x=32767.0i=1b.自增自减运算符++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的范围);\n(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;\ninta[10]={0*10}不能这样给数组整体赋初值。a.程序举例处理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”);}运行结果:11235813213455891442333776109871597258441816765\nb.二维数组类型说明符数组名[常量表达式][常量表达式]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)程序举例将二维数组行列互换,存到另一个二维数组中去。#includeMain(){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++)\n{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)程序举例输出一个字符串\n#includemain(){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()\n注意:以下写法是正确的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和%mxU格式字符%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以指数形式输出时,指数要大写—输出的数字或字符在域内向左靠\n(附加格式说明字符)注意几点:1.除X,E,G外,其他的格式字符必须用小写字母2.格式控制中可以输出转义字符:字符形式含义Ascii代码\n换行,将当前位置移动到下一行开头10\t水平制表(跳到下一个tab位置)9\b退格,将当前位置移到本行开头8\r回车,将当前位置移到本行开头,(回车不换行)13\f换页,将当前位置下移到下页开头12\\代表一个反斜杠字符“\”92\’代表一个单引号字符39\’’代表一个双引号字符34\ddd1到3位八进制数代表的字符\xhh1到2位十六进制数所代表的字符3.一个格式说明以%开头,如果想输出字符“%”,则应该在格式控制字符串中用连续两个%。Scanf函数1.一般格式:scanf(格式控制,地址表列)2.格式控制同printf函数,地址列表是由若干地址组成的表列,可以是变量的地址,或字符串首地址。记得&。3.&地址运算符,输入数据时,分隔符应该与格式控制里的相对应输入。即用逗号分隔的,输入的时候也要用逗号分隔,没有规定的用空格和回车或者是Tab键。4.格式说明:与printf格式说明类似。A.如果在%后有一个“*”附加说明符,表示跳过它指定的列数。B.输入数据时,不能规定精度,如“%7.2f”是错的。使用scanf函数应该注意的事项:A.格式控制后面应当是变量地址,而不是变量名\nA.如果在格式控制字符串中除了格式说明以外还有其他字符,则在输入数据时,在对应位置应输入与这些字符相同的字符。如果格式控制里有空格分隔,输入的时候只能比格式控制里的空格数多。B.在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入。C.在输入数据时,遇到以下情况认为该数据结束:①遇到空格,或者按回车,tab键;②按指定的宽度结束,如“%3d”,只取3列;③遇到非法输入Puts函数1.一般形式:puts(字符数组)2.作用是将一个字符串(以‘\0’结束的字符序列)输出,可以包含转义字符。Gets函数1.作用是将一个字符串输入到一个数组,并且得到一个函数值。该函数值是字符属猪的起始地址。2.一般形式gets(字符数组)eg:gets(str);注意:用puts和gets只能一次处理一个字符串各类运算符1.C语言运算符简介:算术,关系,逻辑,位运算,赋值,条件,逗号,指针运算符,sizeof,强制类型转换,分量运算符,下标运算符。常见的运算符归纳:1.算术运算符(+,-,*,/,%)A.说明:两个整数相除结果为整数,有负数参与,多半遵循“向零取整”的方法,取整数后向零靠拢。B.在表达式求值的时候,先按运算符的优先级别高低次序执行,优先级别相同的,按规定的“结合方向”处理,详细见书本附录。C.如果一个运算符两侧数据类型不同,先自动经行转换转换规律:高DoublefloatLongUnsigned低Intchar,short\n1.强制类型转换A.一般形式:(类型名)(表达式)B.表达式应该用括号括起来,注意区别(int)(x+y)和(int)x+y,第一个是转换x+y,第二个只转换了xC.在强制类型转换时,得到一个中间数据,原来变量的类型未发生变化2.自增自减运算符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+36.赋值表达式格式:变量赋值运算符表达式eg:a=5;a=b=c=5;运算规则:先求运算符右侧的表达式的值,然后赋值给运算符左侧的变量7.逗号运算符合逗号表达式A.用一个逗号将两个表达式连接起来,是一个逗号表达式,又称为顺序求值运算符,一般形式是:表达式1,表达式2B.求解过程:先求表达式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.逻辑运算符\nA.3种逻辑运算符:&&逻辑与||逻辑或!逻辑非&&和||是双目运算符,要求有两个运算量,!是一目运算符,只要求有一个运算量。B.注意:已知&&或者||两边左边已经确定了值,那么右边不做运算。在&&中,两真才为真,一假便为假。||中两假才为假,有一真便为真。C.优先次序:先!,后&&,后||与其他运算符的优先次序:(由高到低排列)!(非)算术运算符关系运算符&&和||赋值运算符D.逻辑表达式的值应该是一个逻辑量,运算结果不是0,就是1.表达式从左至右求解。(一)c语句一控制语句1.If()…else…3种形式:①if()语句②if()语句一else语句二③if()…elseif()………else…if语句的嵌套:if()if()语句1else语句2\nelseif()语句3else语句4else总是与他上面的最近的未配对的if配对。If语句后面的表达式一般为逻辑表达式或关系表达式。题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。1. 程序分析:学会分解出每一位数,如下解释:(这里是一种简单的算法) 2.程序源代码:#includemain(){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.程序源代码:#includevoidmain(){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的值*/\nif(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.程序源代码:#includemain(){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.程序源代码:#includemain(){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;/*前两个月加起来赋值给第三个月*/\n}}3.while()…例:求Sn=a+aa+aaa+…+aa…a之值,n,a由键盘输入。#includevoidmain(){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的值。#includevoidmain(){intsum=0,i;i=1;do{sum=sum+i;i++;}while(i<=100);printf(“sum=%d\n”,sum);}5.continue…题目:把100—200之间的不能被三整除的数输出。#includevoidmain()\n{intn;for(n=100;n<=200;n++){if(n%3==0)continue;printf(“%d\n”,n);}}6.break…题目:计算r=1到r=10时的圆面积,直到面积大于100为止。#includevoidmain(){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.程序源代码:#includemain(){intday,month,year,sum,leap;printf("\npleaseinputyear,month,day\n");\nscanf("%d,%d,%d",&year,&month,&day);switch(month)/*先计算某月以前月份的总天数*/{case1:sum=0;break;case2:sum=31;break;case3:sum=59;break;case4:sum=90;break;case5:sum=120;break;case6:sum=151;break;case7:sum=181;break;case8:sum=212;break;case9:sum=243;break;case10:sum=273;break;case11:sum=304;break;case12:sum=334;break;default:printf("dataerror");break;}sum=sum+day;/*再加上某天的天数*/if(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/leap=1;elseleap=0;if(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/sum++;printf("Itisthe%dthday.",sum);}8.goto…题目:求1+2+3+…+100的值。#includevoidmain(){inti,sum=0;i=1;loop:if(i<=100){sum=sum+i;i++;gotoloop;}printf("%d\n",sum);}\n9.return…题目:有一个3×4的二维数组,求所有元素中的最大值。#includevoidmain(){intmax_value(intarray[][4]);inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf("maxvalueis%d\n",max_value(a));}intmax_value(intarray[][4]){inti,j,max;max=array[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(array[i][j]>max)max=array[i][j];return(max);}二、函数调用语句(函数调用加一个分号构成)题目:练习函数调用#include void hello_world(void){printf("Hello, world!\n");}void three_hellos(void){int counter;for (counter = 1; counter <= 3; counter++)hello_world();/*调用此函数*/}void main(void){three_hellos();/*调用此函数*/}\n题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。#includemain(){intnumber[10];input(number);max_min(number);output(number);}input(number)intnumber[10];{inti;for(i=0;i<9;i++)scanf("%d,",&number[i]);scanf("%d",&number[9]);}max_min(array)intarray[10];{int*max,*min,k,l;int*p,*arr_end;arr_end=array+10;max=min=array;for(p=array+1;p*max)max=p;elseif(*p<*min)min=p;k=*max;l=*min;*p=array[0];array[0]=l;l=*p;*p=array[9];array[9]=k;k=*p;return;}output(array)intarray[10];{int*p;for(p=array;pmain(){inti,j,k,n;printf("'waterflower'numberis:");for(n=100;n<1000;n++){i=n/100;/*分解出百位*/j=n/10%10;/*分解出十位*/k=n%10;/*分解出个位*/if(i*100+j*10+k==i*i*i+j*j*j+k*k*k){printf("%-5d",n);}}\nprintf("\n");}题目:输入两个正整数m和n,求其最大公约数和最小公倍数。1.程序分析:利用辗除法。2.程序源代码:#includemain(){inta,b,num1,num2,temp;printf("pleaseinputtwonumbers:\n");scanf("%d,%d",&num1,&num2);if(num1
查看更多