c总结学习.docx
- 文档编号:4000323
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:20
- 大小:25.63KB
c总结学习.docx
《c总结学习.docx》由会员分享,可在线阅读,更多相关《c总结学习.docx(20页珍藏版)》请在冰点文库上搜索。
c总结学习
一、C示例讲解
1、将100~200之间的素数打印出来
1N-S图2.16P7程序P10(6)(C程序设计题解….)
2求素数N逻辑方法是:
先定义i且i<=sqrN;N/i,只有不能整除时循环,直到i=sqrN时,如仍不能整除见分则N是素数
2、求两个数m和n的最大公约数
①N-S图2.17P8程序P10(7)(C程序设计题解….)
②求公约数的方法(m>n):
m/n付给r,即r<=m/n,然后再付值:
m=nn=r
3r=m/nm=nn=r循环下去
判断润年实例及N-S图
1N-S图分析见P11(C程序设计题解….)例见课本P100
总结:
N-S图是逻辑分析程序的走路,然后才可写出程序,试用VB来分析上三例的设计
C程序实例可见书本(C程序设计题解与上机指导第二版)
二、特殊字符的表现见课本P48
例main()
{
Printf(“_ab_c\t_de\rf\tg\n”);_表示空格屏上结果:
fab-c---gdeh------jik
Printf(“h\ti\b\bj__k”);打印结果:
f-------gdeh------j-k
}
说明:
1、出-ab-c,遇到t后到第九列输出-de,后遇到r返回到第一列输出f,遇到t即在本例九列输出g,具体在课本P49例3.5;2、单引号里表示字符,双引号表示字符串;3、运算的优先级见课本P375;例题见(C程序设计题解与上机指导第二版)P15例3.9及P17
三、小知识点
①于++i与i++
如:
dimi=8,j=10;=++i,n=j++;printf(“%d,%d”,m,n);例见(C程序设计题解P15例3.10
说明:
++i:
i的值先变成9,然后将9付给m即m=9,i=9;j++先将j的值付给n即n=10,然后
j的值再加1,即j=11
2整型变量(单精度占两个字节,16位)输出以%d,定义是int形式;实型(浮点占4个字符,32位)输出%f,定义float表示;字符(占1个字节,8位)输出%c,定义char表示(各见课本P43,P45,字符串以%s输出,以str形式输入
3小数,正负的取整,取模的运算:
如int(-1.7),int(1.7),3.7%2,1.3%2等,在c中多数情况下(c的课本P55)取整取向零靠近;VB中取模取整的表示符是:
/\及其运算方法?
四、C语言的运结构
1、顺序结构示例讲解
Main()
{
Inta,b,c;
Longintu,n;
Floatx,y,z;
Charc1,c2;
A=3,b=4,c=5;
X=1.2,y=2.4,c=3.6;
U=5127,n=12876;
C1=’a’,c2=’b’;
Printf(“\n”);
Printf(“a=%2d,b=%2d,c=%2d\n”,a,b,c);黑体表示输出的列
Printf(“x=%8.6f,y=%8.6f,z=%9.6f\n”,x,y,z);黑体表示输出列及小数位数
Printf(“x+y=%5.2f,y+w=%5.2f,z+x=%5.2f\n”,x+y,y+z,z+x);
Printf(“u=%61d,n=%91d\n”,u,n);
Printf(“c1=%cor%d(ASCII)\n”,c1,c2);
}
字符数据的输出
①%m.ns;输出占m列,但只取字符串中左端n个字符,这n个字符输出在m列的右侧,左补空格;%-m.ns,其中mn含义同上,n个字符输出,在m列范围的左侧,右侧补空格,如果n>m,则m自动取n值,保证n个实际字符正常输出
②%m.nf,指定输出的数据共占m列,其中有n位小数,如果数值长度小于m,则左端补空格
%-m.nf,指定输出的数据共占m列,其中有n位小数,如果数值长度小于m,则右端补空格
格式的输入与输出
Scanf(“格式控制,地址列表”),printf(“格式控制,输出列表”)
说明:
①格式控制由%和格式字符组成,如%d,%f;地址列表由&+字符名组成;scanf(“%d”,&a)
②输出列表是需要输出的一些数据,如%d;输出列表由字符名组成;printf(“%d”,a)
Putcher只能输出字符,而且只能是一个字符,而printf可以输出多个数据,且为任意类型
4输入数据不能规定长精度,如可scanf(“%7.2f”,&a);想使a值为12345.67是不合法的,只有输出才可规定精度如printf(“%7.2f”,a);输入时要与输出时格式相对应:
scanf(“%d:
%d”,&a,&b),在銉盘上输入12:
13
VB里的输入与输出格式要求,各运算符的表示与计算,各种数据的表示,如:
字符,实数等
2、选择结构程序设计
内嵌套①if(…)②if…③switch()
If(…)elseif…case1:
…
Else…elseif…case2:
…
Else…elseif…case3:
…注:
C中没有endif
①②格式的应用实例
例1有3个整数abc由键盘输入,输出其最大的数的方法,画出N-S图(见设计解题P25)
Main()
{
Inta,b,c;
Printf(“请输入三个整数”);
Scanf(“%d,%d,%d”&a,&b,&c);
If(a
If(b Printf(“max=%d\n”,c);只有一个“;”号,表示这所有的是一句,if内嵌套 Else Printf(“max=%d\n”,c);另一句 Elseif(a Printf(“max=%d\n”c);另一句 Else Printf(“max=%d\n”,a);另一句 } 例2、x(x<1) y=2x-1(1<=x<10) 3x-11(x>=10) Main() { Intx,y; Scanf(“%d”,&x); If(x<1) { y=x; printf(“x=%3d,y=x=%d\n”,x,y);“x=”,“y=x=”是输出字符,这是一句 } Elseif(x<11) { Y=2*x-1; Printf(“x=%3d,y=2x-1=%d\n”,x,y); }另一句因为每个条件句有两条语句所以 Else要用{},同条件句一起作为一句语句 { Y=3*x-11; Printf(“x=%3d,y=3*x-11=%d\n”,x,y); }另一句 } #如果if与else的数目不一样,为实现程序设计的企图,可以加花括号来确定配对关系 如if() {if()语句1}这时的else与第一个if配对,如果没有花括号,则与第二个 Else语句2if配对 3switch语句的应用 main() { Intc,s; Floatp,w,d,f; Scanf(“%f,%f,%d”,&p,&w,&s); If(s>=300) C=12; Elseifc=s/250; Switch(c)c是switch的表达式 { Case0: d=0;break;0,1等是switch的常量表达式 Case1: d=2;break; ………….. Case12: d=15;break;switch的表达式要与case后面的常量表达式的数据 }类型及值是一样的 F=p*w*s*(1-d/100.0); Printf(“weight=%15.4f”,f); }#找出VB的选择结构框架及示例 3、循环结构 一、循环的控制goto语句 1、goto语句及goto语句构成的循环 goto语句为无条件转向语句,格式为goto语句标号;语句标号由字母、数字和下划线组成,其第一个字符必须为字母或下划线;如goto123(错),gotolabel_1(对) 2、作用: 与if语句一起构成循环 例: 求1+2+3+-----+100的和 Main() { IntI,sum=0; I=1; Loop: if(i<=100) { Sum=sum+I; I++; Gotoloop; } Printf(“%d’,sum); } 二、循环的控制while语句 结构(表达式)语句 当表达式为非0时,执行while语句中的内嵌套语句,表达式只能为关系表达式、逻辑表 达式,当表达式为常量表达式时,就进入死循环 例: 求1+2+3+-----+100的和 Main()main() {{intsum=0,I; IntI,sum=0;scanf(“%d”,&i); I=1;while(i<=10) While(i<=100){sum=sum+i { Sum=sum+I;i++} I++; }printf(“sum=%d”,sum); Printf(“%d”,sum);} } 三、循环的控制do--while语句 格式do/循环语句/while(表达式) 特点: 先执行一次指定的循环语句,然后判断是否符合要求去执行循环 例: 求1+2+3+-----+100的和 Main()main() {{intsum=0,I;scanf(“%d”,&i); IntI,sum=0;do{sum=sum+I;i++;} I=1;while(i<=10);printf(“sum=%d”,sum); Do {} Sum=sum+I;while与do---while循环的比较: 一般情况下,当处理同一问题时, I++;并循环体部分是一样的,则结果相同,但如while后面的表达式 }一开始为假(0值)时,两种循环的结果是不同的,如上右边两 While(i<=100);例中输入1则两结果都是sum=55;如输入11,则while循环结果 Printf(“%d”,sum);是sum=0,而do---while循环结果是sum=11 } 四、for循环语句 ①表达式形式: for(表达式1;表达式2;表达式3;)它的执行过程: a、先求解表达式1;b、求解表达式2,若其值为真,则执行for语句指定的内嵌套语句,然后执行下面的语句,若为假,则结束循环语句;c、求解表达式3,求解完后再回头(循环)去执行求解表达式2…. 例剖析相当i=1; For(i=1;i<=100;i++)while(i<=100) Sum=sum+I;{sum=sum+I;i++;} 一般情况下,for语句可以改写成while语句;即: 表达式1;while(表达式2){语句;表达式3} ②for循环的表达式1、3可省,具体省略后的形式变化见课本P111-112 五、循环的嵌套 While()dofor(;;;) {……{……{for(;;;) While()do {{……{ ……}执行语句; }while();} }while();} }执行语句;……… 几种循环的比较见课本P114 Break语句和continue语句 Break语句用来从循环体中跳出循环体提前结束循环,接着执行下面的语句,但它不能用于循环语句和switch语句之外的任何其它语句 Continue语句用来结束本次循环,不是终止整个循环体 Continue的应用例子 Main() { Intn; For(n=100;n<=200;n++) { If(n%3==0)当n能被3整除时执行continue语句,结束本次循环(即跳过 Continue;printf函数语句)只有当n不能被3整除时才能执行printf Printf(“%d”,n);函数 } } For内嵌套实例 打印出以下图案 *main() ***{intI,j,k; *****for(i=0;i<=3;i++)i控制输出行(上面的4行) *******{for(j=0;j<=2-I;j++)此for{}号可省,因与前for没有;号,是同一句 *****printf(“”);输出*号前面的空格 ***for(k=0;k<=2*I;k++)输出*号 *printf(“*”);输出完一行*号后换行 printf(“\n”);} for(i=0;i<=2;i++)输出下面的3行*号 {for(j=0;j<=I;j++)此for{}号可省,因与前for没有;号,是同一句 Printf(““);输出*号前面的空格 For(k=0;k<=4-2*I;k++) Printf(“*”);输出*号 Printf(“\n”);输出完一行*号后换行“ } } ##for(.…)for(.…)效果等同情况: 因为第二个for没有并行语句, for(.…){for(.…)因为第三个for都属于第二个for循环的执行 for(.…)for(.…)}语句,如果第二for有平行语句就不同了 例: main()结果为: *如去掉第二个for后 {intI,j,k;***的{};结果为: For(i=0;i<=3;i++)***** {for(j=0;j<=2-I;j++)**************** Printf(“”); For(k=;k<=2*I;k++)可见两种情况结果不同,原因在于第二个 Printf(“*”);for后第二for有平行语句Printf(“”) Printf(“\n”);}第三个for不属于第二个for循环的执行 } 例: main() {intI,j,k;结果: 去掉第二个for的{}结果是: For(i=0;j<=3;i++)* {for(k=0;k<=2*I;k++)*** Printf(“*”);********************* Printf(“\n”);}******* } 例: main() {inta,b;程序运行结果: For(a=1;a<=3;a++)1*1=11*2=21*3=31*4=4 {for(b=1;b<=4;b++)2*1=22*2=42*3=62*4=8 Printf(%d*%d=%d,a,b,a*b);3*1=33*2=63*3=93*4=12 Printf(“\n”);}去掉第二个for运行结果是 }1*1=11*2=21*3=31*4=42*3=62*4=83*1=31*2=63*3=93*4=12 例: main()main() {Inta,b;{Inta,b; For(a=1;a<=3;a++)For(a=1;a<=3;a++) {for(b=1;b<=4;b++)for(b=1;b<=4;b++) Printf(%d*%d=%d,a,b,a*b);}Printf(%d*%d=%d,a,b,a*b); }} 运行结果一样是: 1*1=11*2=21*3=31*4=42*3=62*4=83*1=31*2=63*3=93*4=12 3、一维数组元素 一、小知识点 1数组里的元素下标是从零开始的,常量表达式中可以包含常量和符号常量,不能是变量 2可以只给一部分元素付值,如: int[10]={1,2,3,4,5},而这只是给数组前五个元素付值 3如果想使一个数组中的全部元素付值为0,可以写: int[10]={0,0,0,0,0,0,0,0,0,0}或写成a[10]={0} 4在对全部数组元素付初值时可以不指定数组长度如: a[]={1,2,3,4,5},在定义数组后,如: a[10]={1,2,3,4,5,6,7,8,9},从键盘上获取元素时可用scanf(“%d”,&a[i]),但不能写成scanf(“%d”,&a)或scanf(“%d”,&a[])或scanf(“%d”,a) 4、二维数组元素 ①格式: 类型说明符数组名[常量表达式][常量表达式] 如: float[3][4],float[5][10]定义a为3*4(3行4列),b为5*10(5行10列)的数组 A[0][0],A[0][1],A[0][2],A[0][3] A[3][4]=A[1][0],A[1][1],A[1][2],A[1][3] A[2][0],A[2][1],A[2][2],A[2][3] ②二维数组的付值: I、分行付值: inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}} 等同于int[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}1,0,0,0其值是对 II、可以对部分付值: int[3][4]={{1},{5},{9}}等同于a[3][4]=5,0,0,0各行中的 9,0,0,0第一个元素 Inta[3][4]={{1},{5,6}},对第三行不付值,Inta[3][4]={{1},{},{5,6}}第二行不付值 III、对数组全部付值时可以省略行数的下标如: a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}效果等同于a[][4]={1,2,3,4,5,6,7,8,9,10,11,12} IV、可以只对部分元素付值,而省略第一维的长度(行的下标),但应分行付值,如: Inta[][4]={{0,0,3},{},{0,10},}效果等同第一行0,0,3,0第二行0,0,0,0第四行0,10,0,0 二维数组应应用用举例: 12314 将a=456的行与列互换成b=25 36 程序: main() {inta[2][3]={{1,2,3},{4,5,6}}; Intb[3][2],ij; 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]];}a[i][j]中的i与倒数第二行b[i][j]中的i不一定一样 Printf(“\n”);}式因为i是变量,其值是可变的,故i在程序中是不 Printf(“arrayb: \n”);确定的 For(i=0;i<=2;i++) {for(j=0;j<=1;j++) Printf(“%5d”,b[i][j]); Printf(“\n”);} } N-S图fori<=1前程序的N-S图fori<=2后段程序的N-S图 Forj<=2fori<=1 输出a[i][j]输出b[i][j] 并a[j][i]=a[i][j] 5、字符数组 1字符数组的定义: 基本与前面的整型数组定义相同,不同之处: 如果初值个数小于数组长度,只将这些字符付给数组中的前面那些元素,其余的元素定义为空字符。 2字符数组引用实例 输出一个钻石图形 程序: main() {chardiamond[][5]={{“’’,’’,’*’”},{“’’,’*’,’’,’*’”}{“’*’,’’,’’,’’,’*’”},{“’’,’*’,’’,’*’”,},{“’’,’’,’*’”}} IntI,j;输出结果* For(i=0;i<5;i++)** {for(j=0;j<5;j++)** Printf(“%c”,diamond[i][j]);** Printf(“\n”);}* } ##上程序第二个for是嵌套于第一个for里的;①如果一个字符串第10个字符为’\0’,则此字符串的有效长度为9,也就是说在遇到字符’\0’时,表示字符串结束,由它前面的字符组成字符串;②系统对字符串常量也会自动加一个’\0’作为结束符,所以会比实际多一个字符;③所以有了结束标志’\0’后,字符数组的长度就显得不那么重要了,只要数组长度大于字符串的实际长度就可④所以字符数组表示字符串时,可以如此定义: char[]={“china”};⑤它的输出与数组不同,要: printf(“%c”,a[i]),因为它输出的是字符数组名,不是数组元素,字符串的输出printf(“%s”,a);⑥字符数组的输入: scanf(“%s”a),或scanf(“%c”a)它不用scanf(“%s”%a[i]),原因是scanf函数中的输入项是字符数组名,它应该在先前就已被定义,如: scanf(“%d”,&str)是错误的,因scanf函数中的输入项是字符数组名时不用再加地址标识符&,因为在C语言中数组名代表该数组的起始地址 如: C2000此数组若其名是C,占6个字节,程序中如果只写数组名C, H2001,它就代表起始地址为2000,然后它会按第一个地址逐个输 I2002入或输出。 N2003 A2004 \02005字符串处理函数祥情见课本P135-138 6、函数 一、小知识点 1函数说明: 一个C程序---包含多个源程序;一个源程序----包含多个函数;(也可说一个程序包含多个函数) 2C程序的执行从main函数开始,即主函数,调用其它函数后,流程返回到main函数,在main函数中结束整个程序的运行,注意main函数是系统定义的 3函数间平等,可互相调用,但不能调用主函数(C中main函数) 二、函数种类 1从使用者角度看可分两种: 标准函数即库函数与用户自己定义的函数 2函数的形式看: 无参函数与有参函数 三、无参函数定义的一般形式无参函数 类型标识符函数名()例main()printfstar() {{printfstar();{printf(“********”);} 声明部分printf_message();print_message() 语句printfstar();{printf(“howdoyou\ndo! ”); }}} 说明: 无参函数一般不需要返回值,因此可以不写类型标识符 四、有参函数定义的一般形式例有参函数 类型标识符函数名(形式参数列表)main()max(intx,inty) {{inta,b,c;{intz; 声明部分;scanf(“%d,%d”,&a,&b);z=x>y? x: y; 语句;c=max(a,b);a,b是实参return(z) }printf(“maxis%d”,c);}} #类型特别说明 1上例中没有函数定义,即intmax(intx,inty)前的int,原因在于C语言规定凡不加类型说明的函数,一律自动按整型处理 2定义函数时对函数值说明的类型一般应该和return语句中的表达
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 总结 学习