




文档简介
C语言入门网上资料整理,第一章计算机语言与C语言概述,1.1计算机语言概念计算机语言定义计算机能够识别和接受的语言。要使计算机按自己的意图工作,必须使用计算机所能接受、理解和执行的指令指挥计算机工作。,计算机语言的种类机器语言低级语言汇编语言(面向计算机)BASIC入门语言F77科学计算高级语言Foxpro数据库管理(面向问题)C多用途,计算机语言,机器语言最早问世,用二进制代码构成指令。如:100000(+)110000(-)用机器语言编程的缺点:繁琐、不直观、不易调试。如计算y=2x2+3x-1需要七八条指令。移植性差。依赖于计算机。,汇编语言用符号构成指令,如:MOV、ADD用汇编语言编程:相对直观,但仍繁琐,仍是面向计算机的语言。汇编语言是计算机间接接受的语言,高级语言与低级语言相比,有根本性的区别:是面向问题的语言。高级语言的一条指令(语句):y=2*x*x+3*x-1;对应于:y=2x2+3x-1y=sin(x);对应于:y=sinx用高级语言编程:直观、易懂、移植性好(不依赖于具体计算机),上机运行高级语言程序需经过编译:编译执行要上机完成一个计算问题,主要的任务就是用高级语言编写出相应的源程序。即至少要学会一种计算机语言。,高级语言源程序,机器指令目的程序,结果,编译程序,1.2C语言的特点集高级语言和低级语言的优点于一身:能实现低级语言的大部分功能(如直接访问内存物理地址、进行位操作等)。图形功能强。运算符和数据结构丰富。语法限制不太严格,程序设计自由度大。生成目标代码质量高,程序执行效率高。,1.3简单的C程序介绍例1:main()主函数说明程序框架printf(“abcdef”);函数体语句程序的功能是输出字符串:abcdef,例2:求两数之和。main()inta,b,c;aa=100;b=50;bc=a+b;cprintf(“nc=%d”,c);程序运行结果:c=150,例3:求两数中的最大值。函数类型函数名形参main()intmax(intx,inty)inta,b,c;intz;scanf(“%d,%d”,axbycz(两个函数组成),3,5,3,5,5,5,总结上例可知:(1)C程序由函数构成。(2)函数由两部分组成:函数说明部分:函数名、函数类型、形参名、形参类型。函数体:实现函数的具体操作;由语句构成。(3)程序总是从main函数开始执行。(4)书写格式自由。(5)语句必须有分号。:,第三章数据类型、运算符与表达式3.1C的数据类型基本类型(整型、实型、字符型、枚举型)构造类型(略)指针类型(略)空类型各类型包含常量与变量,3.2常量与变量常量与符号常量常量在程序运行过程中其值保持不变的量。符号常量用来代表一个常量的标识符。#definePI3.1415926,例:#definePI3.1415926main()floatr=2,c;c=2*PI*r;printf(“%f”,c);,变量其值可以改变的量。变量的三要素:变量名每个变量有一个名字,作为识别该变量的标识符。变量的值每个变量有一个值,变量的值是随时可以改变的。,变量的存储单元每个变量占据一个内存单元,用于存放变量的值。变量名a变量值存储单元,3,变量的命名规则:由字母、数字和下划线组成以字母或下划线开头a、x1、y_2、_b1、_1c合法1x、a+2、不合法变量必须先定义后使用。程序中何时使用常量?何时使用变量?,3.3整型数据整型常量即整常数,c的整常数有三种形式:十进制整数与数学中的整数一致,如:100,123,15等。八进制整数以0开头的整数,如:010,07,020等。十六进制整数以0 x开头的整数,如:0 x10,0 xff,0 x2a等。,整型变量用于存放整数的变量。分4种类型:基本型:inta16位,可表示的数值范围:-3276832767短整型:shortintb16位,可表示的数值范围:-3276832767长整型:longintc32位,数值范围:-21474836482147483647,无符号型:加上unsigned只存放正数。如:unsignedintx变量x为无符号整数,16位全表示数码,数值范围:065535在程序设计中,如果要使用整型变量,必须首先选择以上类型符来定义变量,然后才能使用;,例:main()定义inta,b,c;a=100;b=50;使用c=a+b;printf(“%d”,c);一般根据什么原则选择变量的类型?,3.4实型数据实型常量可使用两种形式表示:小数形式:如1.23,3.141592615.48指数形式:如1e-201.23e5,实型变量用于存放实数的变量分单精度和双精度两种:floata,b定义a和b为单精度型变量32位,7位有效数字,10-381038doublex,y定义x和y为双精度型变量64位,15位有效数字,10-30810308,例:main()floatr,c;doubler,c;r=5;c=2*3.1415926*r;printf(“%f”,c);,3.5字符型数据字符常量用单引号括起来的一个字符。a,x,*,1等除此外,以开头的字符如n,t等称为转义字符,祥见书表3.3,字符型变量用于存放字符的变量。charc1,c2定义c1和c2为字符型变量c1=a;c2=b;字符赋值字符型变量存放一个字符,占据一个字节,字符型数据的存储形式存放ASCII码不是而是如字符a在内存中存放97,b存放98。与整数的存储形式一致,它们之间可以通用一个字符数据既可以作字符用,也可以作整数用(取其ASCII代码)。如:32+a相当于32+97若intx;charc;则x=a;c=97;x=97;c=a;都允许,a,97,字符串常量用双引号括起来的字符序列。如:”abcde”,”china”a”也属字符串。注意”a”与a的区别。对于:charc;c=”a”;用法错误,字符串中每个字符各占一个字节,并且在字符串结尾加上一个结束标记0如:”china”在内存中占6个字节。china0C语言中专门的字符串变量,可用字符数组存放(以后介绍)。,3.6变量赋初值在定义变量的同时给相应的变量赋初值。如:inta=3;afloatb=5.2;charc=a;intx=y=z=6;效果:在给变量分配内存单元的同时在相应的单元中存放初值。,3,3.7各数值型数据间的混合运算整型、实型、字符型数据间可以进行混合运算,如:10-a*1.5运算时,参加运算的两个数据如果类型不同,则首先将其类型转换成一致再运算,转换规则是:将优先级低的类型转换到优先级高的类型,数据类型的优先级:高doublefloatlongunsignde低intchar,3.8算术运算符与算术表达式基本的算术运算符+-*/%算术表达式用算术运算符将运算对象连接起来的式子用于表达数学公式的式子如:2*x+y-1/a表达式经过运算最终得到一个值:算术表达式的值,运算符的优先级与结合性优先级:在对表达式求值时,如果存在多个运算符,则运算的先后次序按运算符的优先级别从高到底进行。运算符的优先级关系为:高:*/%低:+-如:a-2*x先算*2*(a+2)有括号的情况?,结合性:如果在一个运算对象两边的运算符的优先级相同,则按规定的“结合方向”处理。如:a-b+cb与-结合是从左到右,称“左结合性”。b与+结合是从右到左,称“右结合性”。每个运算符都有相应的优先级和结合性。基本算术运算符都是左结合性。,强制类型转换可以用强制类型转换运算符将一个表达式的值转换成所需类型:如:(int)(x+y)(float)(7%3),应用举例:inta=200,b=300,c;c=a*b/100;?可知,有自动转换和强制转换,当自动转换达不到目的时,可用强制转换。,c=(long)a*b/100;,c=(long)(a*b)/100;,自增、自减运算符自增运算符:+使变量值加1自减运算符:-使变量值减1两种用法:+i,-i先加(减)后用i+,i-先用后加(减)两种用法对i效果一样,但表达式的值不同。例:假设i的原值为5:j=+i;j=?j=i+;j=?,注意:+和-只能用于变量。如:3+和(a+1)+不合法+和-为右结合性。(-i)+-i+-(i+)若i的原值是5,则该表达式的值是多少?,例:分析执行下列语句后的结果:a=5;abcdb=a+;c=-a-b+;d=(a+)-(+b)+c-;,5,5,6,5,0,6,7,-2,6,-1,两种特殊情况:k=(i+)+(i+)+(i+)i+j是i+(+j)还是(i+)+j?i+虽然与i=i+1等效,但使用自增自减运算符的代码优化程度好,因而经常使用;但用时需特别小心。,3.9赋值运算符和赋值表达式赋值运算符“=”称赋值运算符,其作用是将一个数据赋给一个变量。如:a=5不要理解为“等号”。执行赋值运算的结果,是将右边的数据存入左边变量所对应的内存单元中。,赋值规则如果赋值运算符两侧的类型不一致,则在赋值时要进行类型转换,转换规则为:实型整变量舍去小数部分。inta=5.5;a中为5。整型实变量数值不变,以浮点形式存储。字符型整变量放在整形变量低8位。保持原值不变原则。inta=A;,复合赋值运算符在赋值运算符前加上其它运算符,可以构成复合赋值运算符。a+=3a=a+3b-=x+5b=b-(x+5)x*=c-6x=x*(c-6)y/=a*4y=y/(a*4)k%=b-2k=k%(b-2)属于高效率运算符。,赋值表达式主要实现赋值运算的表达式。一般形式:=如:a=5y=2*x+3a=a+1不是衡等作用:将右边表达式的值赋给左边的变量。赋值表达式的值取左边变量的值。,赋值表达式右边的可以是任何表达式,如:a=(b=5)赋值表达式中包含赋值表达式赋值运算符的优先级低于所有算术运算符,且是右结合性。a=(b=5)与a=b=5等效。,例:计算以下表达式的值:a=b=c=5a=5+(c=6)a=(b=4)+(c=6)a=(b=4.5)+(c=6.5)(a、b、c为整型变量)a+=a-=a*a(设a的原值为3),赋值表达式是C语言中的一个重要成分,在赋值表达式后加一分号就成为常用的赋值语句。如y=2*x+1;赋值表达式作为表达式的一种,可以出现在任何表达式中,如:x+2-(b/3-(a=k-5)+b,3.10逗号表达式逗号也是一种运算符,用它对两个表达式实现连接运算。3+5,6+8称逗号表达式。逗号表达式的一般形式:表达式1,表达式2取表达式2的值作为整个逗号表达式的值。如:a=3*5,a*4逗号表达式的值为:60,一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式,如:(a=3*5,a*4),a+5因此,逗号表达式的一般形式可以扩展为:表达式1,表达式2,表达式3,,表达式n取表达式n的值作为整个逗号表达式的值。逗号运算符的优先级最低,且是左结合性。逗号运算符只起到连接作用,没有实际操作。,第四章最简单的C程序设计,C程序最基本的成分是语句目前我们已掌握的语句:变量说明语句:inta,b,c;表达式语句:x+y;特别地:a=5;赋值语句,可以编写简单程序如:main()intx,y;x=5;y=2*x*x+3*x-1;该程序语法上完整,但还缺少输出。,数据的输出用输出函数实现,其中的两种输出函数:1.putchar函数(字符输出函数)用于输出一个字符。如:putchar(a);putchar(100);charc=b;putchar(c);,例:输出单词Boy的完整程序:#include“stdio.h”注意该语句的作用main()chara,b,c;a=B;b=o;c=y;putchar(a);putchar(b);putchar(c);,2.printf函数(格式输出函数)任意类型、任意格式、任意个数。例如:inta=100,b=56;printf(“a=%d,b=%d”,a,b);普通字符格式说明格式控制输出表列输出结果:a=100,b=56“%”后的字符称格式字符,不同格式字符对应不同的数据类型。,d格式符:按整数格式输出几种用法:%d不指定宽度,按实际宽度输出%md按指定宽度输出,m为宽度%ld用于输出长整型数,例:inta=125,b=453;longc=65535;printf(“a=%d,b=%5d,c=%ld”,a,b,c);输出结果:a=125,b=453,c=65535,%ld也可以按指定宽度输出:printf(“c=%8ld”,c);输出结果:c=65535注意:格式字符的类型要与对应的输出对象的类型一致。,c格式符:用于输出字符charc=A;printf(“c=%c,%c”,c,B);输出结果:c=A,B输出对象既可以是字符变量、字符常量,还可以是整型表达式。,如:inta=100;charb=A;printf(“n%d,%c”,a,a);printf(“n%c,%d”,b,b);输出结果:100,dA,65,s格式符:用于输出字符串%s不指定宽度%-ms指定宽度,左靠齐%ms指定宽度,右靠齐%m.ns指定宽度m,只取左端n个字符,右靠齐%-m.ns指定宽度m,只取左端n个字符,左靠齐,例:printf(“1:%s”,”abcd”);printf(“2:%8s”,”abcd”);printf(“3:%-8s”,”abcd”);printf(“4:%8.3s”,”abcd”);printf(“5:%-8.3s”,”abcd”);1:abcd2:abcd3:abcd4:abc5:abc,f格式符:按小数形式输出实数%f由系统指定宽度(6位小数)%m.nf指定宽度m,小数位数n,右靠齐%-m.nf指定宽度m,小数位数n,左靠齐注意:宽度包括符号和小数点。,例:floata=3.141592654,b=14.326795,c=-125.2468;printf(“na=%f,b=%8.3f,c=%-10.2f”,a,b,c);输出结果:a=3.141592,b=14.326,c=-125.24,完整前面的程序:,main()intx,y;x=5;y=2*x*x+3*x-1;printf(“ny=%d”,y);,数据的输入getchar函数(字符输入)#include“stdio.h”main()charc;c=getchar();等待键盘输入putchar(c);,scanf函数(格式输入),与printf函数相反。用于输入若干任意类型的数据。scanf(“%d%d%d”,格式控制地址列表,scanf(“%d%d%d”,执行此函数时,等待从键盘输入三个整数给a,b,c若从键盘输入358则系统即从键盘缓冲区取出这三个数分别赋给a,b,c注意与printf的区别,注意格式的匹配,如:scanf(“%3d%2d%4d”,在键盘输入时,用分隔符把每个数据隔开,标准的分隔符是空格。如:12315023若想用逗号作分隔符,则:scanf(“%d,%d,%d”,不要随便使用普通字符,如使用:scanf(“a=%d,b=%dc=%d”,scanf(“%f,%f,%f”,使用数学函数,使用三角函数,#include“math.h”main()floatx,y;scanf(“%f”,第五章选择结构程序设计,对于如下的函数计算,算法上属于一个选择结构。y=用于实现选择结构的主要是if语句。,1/x当x0时,10000当x=0时,if语句的最常见形式为:if(关系表达式)语句1;else语句2;如:if(x!=0)y=1/x;elsey=10000;其中x!=0就是一个关系表达式!=就是一个关系运算符,51关系运算符和关系表达式1、关系运算符用于进行比较运算的运算符。共有六种:=!=优先级与结合性:前4种大于后两种。低于算术运算符而高于赋值运算符。左结合性。,2、关系表达式一般形式:表达式关系运算符表达式如:aba+bb+c经过关系运算后最终有一个值-关系表达式的值。关系表达式的值只有0(假)或1(真),例:设a=2,b=4,c=1计算以下关系表达式的值:aba+bb+cab可以是字符表达式(x=2)(y=5)可以是赋值表达式(a(bc)甚至可以是关系表达式azyxz(x=y-2)x+1,52逻辑运算符和逻辑表达式有时,只用一个简单的关系表达式无法完整地表达一个条件,如:y=其中的条件需要用逻辑表达式来表达:x!=0elsey=10000;,if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;else语句n;if(score=100)printf(“A”);elseif(score=90)printf(“B”);elseif(score=80)printf(“C”);elseif(score=70)printf(“D”);elseif(score=60)printf(“E”);elseprintf(“F”);,对于:,1/x当x0时,10000当x=0时,一般用:if(x!=0)y=1/x;elsey=10000;,也可用:y=10000;if(x!=0)y=1/x;,y=,?y=1/x;if(x=0)y=10000,例:(习题5.5):,x(x1),2x-1(1x=90)printf(“A”);elseprintf(“B”);elseif(score=60)printf(“C”);elseprintf(“D”);注意else与if的匹配,3、条件运算符如果两个分支的内容都是给同一个变量赋值,则可用简单的条件运算符处理:if(ab)max=a;elsemax=b;可用:max=ab?a:b;赋值运算符右边为一条件表达式。条件表达式的一般形式:表达式1?表达式2:表达式3,条件表达式的执行过程:ab?a:b优先级:低于关系运算符,高于赋值运算符。结合性:右结合性。,表达式1,条件表达式取表达式3的值,条件表达式取表达式2的值,非0,0,例:求a,b,c中的最大值:max=ab?(ac?a:c):(bc?b:c);,54switch语句(多分支)适用于根据一个表达式的值就可确定走哪个分支的情况。switch(表达式)常量表达式1:语句1常量表达式2:语句2常量表达式n:语句ndefault:语句n+1,例:成绩分档:switch(score/10)case10:printf(“A”);case9:printf(“B”);case8:printf(“C”);case7:printf(“E”);case6:printf(“F”);default:printf(“G”);注:应使用break.,switch(score/10)case10:printf(“A”);break;case9:printf(“B”);break;case8:printf(“C”);break;case7:printf(“E”);break;case6:printf(“F”);break;default:printf(“G”);,第六章循环控制61概述所谓循环控制,就是如何实现循环结构的控制问题。有4种方法:用goto语句和if构成循环。用while语句。用do-while语句。用for语句。,62用goto语句和if语句构成循环例:对于计算s=1+2+3+4+5+6+7+8+9+10,0s,1i,s+is,i+1i,i10,输出s,y,n,s=0;i=1;lable:s+=i;i+;if(i=10)gotolable;printf(“%d”,s);,语句标号,无条件转向语句,goto语句可以构造循环,但不主张用,因为它容易破坏结构化程序设计。,goto语句可以构造循环,但不主张用,因为它容易破坏结构化程序设计。,63while语句while语句是专门用于实现循环控制的语句之一。其一般形式为:while(表达式)语句含义:当表达式的值为非0时,执行循环体,否则执行后续语句。,语句关键,表达循环条件的表达式,循环体,语句关键字,执行过程:while(表达式)语句,表达式,循环体,0,非0,i10?,s=0i=1,s=s+ii=i+1,例:用while语句实现前面算法:main()inti=1,s=0;while(i=10)s=s+i;i+;printf(“n%d”,s);,注意与if语句的区别。循环体中要有使循环条件趋于成立的条件,y,n,while(i=10)s=s+i;i+;可简写为:while(i=10)s+=i+;,非0(真),0(假),表达式,循环体,64do-while语句do-while语句主要用于实现直到型循环。其一般形式为:do循环体while(表达式);执行过程:,真,s=0i=1,i10?,s=s+ii=i+1,假,例:用do-while语句实现前面算法:main()inti=1,s=0;dos+=i+;while(i=10);printf(“n%d”,s);注意与while语句的区别。,假,表达式2,求解表达式1,循环体,求解表达式3,真,65for语句for语句是一种使用最为灵活,并且是用得最多的循环控制语句,其一般形式为:for(表达式1;表达式2;表达式3)循环体大体含义:对于()的情况执行循环体内容。,例:用for语句实现前面的算法:s=0;for(i=1;i=10;i+)s+=i;标准形式,表达式1,表达式2,表达式3,循环体,可以理解:循环变量i从初值1开始到终值10,步长为1,重复执行循环体。,for语句的常见变化:s=0;i=1;for(;i=10;i+)s+=i;s=0;for(i=1;i=10;)s+=i+;s=0;i=1;for(;i10)break;s=10;i=10;for(;-i;)s+=i;,省略表达式2,表达式2是任意表达式,s=0;for(i=1,j=10;ij;i+,j-)s+=i+j;12345678910在程序设计中不要过分追求它的多变性,i,j,用逗号表达式,例:求n!n!=1*2*3(n-1)*n参照累加求和main()inti,n=5,s=1;for(i=1;i=n;i+)s*=i;printf(“ns=%d”,s);注意s的初值。注意当n较大时的情况。求和与连乘都是最常用的算法,要熟练掌握。,例:求自然数1-100中能被3整除的数之和。main()inti,s=0;printf(“n%d”,s);求能被3整除但不被7整除的数之和?,for(i=1;i=100;i+)s+=i;,for(i=1;i=100;i+)if(i%3=0)s+=i;,for(i=3;i=100;i+=3)s+=i;,for(i=3;i=100;i+=3)if(i%7)s+=i;,例:求任意100个数中的最大值。main()inti,a,max;max=?for(i=1;imax)max=a;printf(“nmax=%d”,max);循环体中没有引用循环变量。i的作用?求任意个数中的最大值?,for(i=1;i+),if(a=-9999)break;,max=-32768;,外重循环,内重循环,执行200次,要掌握多重循环执行的全过程,66循环的嵌套循环体内又包含另一个完整的循环结构(多重循环)。for(i=1;i=10;i+)for(j=1;j=20;j+)s+=i+j;,以上多重循环结构可以简写为:for(i=1;i=10;i+)for(j=1;j=20;j+)s+=i+j;,例:找出行号乘以列号等于100的座位。main()inti,j;for(i=1;i=30;i+)for(j=1;j=20;j+)if(i*j=100)printf(“n%d,%d”,i,j);,注意循环的关系,例:百钱买百鸡问题。给定100块钱,要求正好买100只鸡,已知公鸡5元/只,母鸡3元/只,小鸡1元/3只,问公鸡、母鸡和小鸡应各买多少只?若考虑用方程组:x+y+z=1005x+3y+z/3=100是一多解问题。,用测试法求解的程序:main()intx,y,z;for(x=1;x=100;x+)for(y=1;y=100;y+)for(z=1;z=100;z+)if(x+y+z=100,程序可进一步简化为:main()intx,y,z;for(x=1;x=20;x+)for(y=1;y=33;y+)z=100-x-y;if(5*x+3*y+z/3.0=100)printf(“n%d,%d,%d”,x,y,z);,用测试法求解问题的典型例子,测试法求解的程序设计有两个要点:通过循环列出所有可能的解。对所有列出的可能的解进行条件测试。,第七章数组71数据结构与数组的概念影响程序设计的因素除算法外还有数据结构。数据结构概念编写一个程序除了重视算法的设计外,还需重视数据类型的选择,即选择合适的数据类型来存放要处理的数据。在程序设计中,数据类型就称为数据结构,选择合适的数据类型实际上就是进行数据结构的设计。,在程序设计中有格言:数据结构+算法=程序说明数据结构与算法同等重要,算法依赖于数据结构,对于同一个问题的求解,可以采用不同的数据结构和不同的算法,对不同的数据结构有不同的算法,其复杂程度也会不同,选择合适的数据结构,可以降低算法的复杂程度。因此,在程序设计中应重视数据结构的设计。,例:求任意100个数中的最大值。main()inti,a,max;max=-32768for(i=1;imax)max=a;printf(“nmax=%d”,max);,用一个简单变量作为数据结构,合理,算法简单,对于三个数的排序:main()inta,b,c,t;scanf(“%d,%d,%d”,对于很多个数的排序用变量会很复杂而用数组会使算法很简单。,仍可用变量作为数据结构,数组的概念inta10a0a1a2a3a4a5a6a7a8a9一组具有同样类型的数据的集合统一用一个名字代表-数组名(代表一组数),数组元素,下标,数组名,数组中的各成员称数组元素,由数组名加下标唯一地确定。将一组数用一个名字代表,便于管理。只有一个下标的数组称为一维数组;可有二维数组、三维数组、七维数组。,72一维数组的定义和引用定义一般形式:类型符数组名常量表达式;inta10;floatb10;类型符数组名长度作用:分配一组连续的内存单元,说明:数组必须先定义后使用。数组名的命名规则与变量相同。常量表达式表示元素的个数(长度),下标从0开始。常量表达式不能包含变量,即不允许作动态定义。,引用逐个引用其元素,不能进行整体引用。引用的一般形式:数组名下标如:a0=50;a1=100;a2=a0+a1;与a2=a0+a1有根本性的区别:下标可变。,例:从键盘输入10个数。用变量:(不方便)scanf(“%d%d%d%d%d%d%d%d%d%d”,用循环控制输入个数和下标的变化。注意下标的变化范围。,初始化在定义数组的同时给数组赋初值。inta10=0,1,2,3,4,5,6,7,8,9;inta10=0,1,2,3,4;inta=0,1,2,3,4;,应用举例(1)对100个学生的分数统计最高分、最低分和平均分。两种方法:用变量作为存放初始数据的数据结构用数组作为存放初始数据的数据结构,main()inti,a,max,min;floataver=0;max=0;min=100;for(i=0;imax)max=a;if(amin)min=a;aver+=a;aver/=100;printf(“n%d,%d,%f”,max,min,aver);,用变量,main()inti,a100,max,min;floataver=0;for(i=0;imax)max=ai;if(aiamax)max=i;if(aiamin)min=i;,(2)统计高于平均分的人数。,main()inti,a,n;floataver=0;for(i=0;i100;i+)scanf(“%d”,n=0;for(i=0;iaver)n+;printf(“n%d”,n);,用变量,数据结构不合理,main()inti,a100,n;floataver=0;for(i=0;iaver)n+;printf(“n%d”,n);,用数组,1(3)对100个学生的分数统计出每分一档人数。0?1?2?3?4?99?100?,main()inti,a;for(i=1;i=100;i+)scanf(“%d”,输出,inti,a,n101;for(i=0;i101;i+)ni=0;,na+;,完整程序:main()inti,a,n101;for(i=0;i=0;i-)printf(“n%3d:%3d”,i,ni);,体会数组作为存放结果的数据结构时的优越性。,按10分一档统计?main()inti,a,n101;for(i=0;i101;i+)ni=0;for(i=1;i=100;i+)scanf(“%d”,inti,a,n11;for(i=0;i11;i+)ni=0;,na/10+;,73二维数组的定义和引用定义一般形式:类型符数组名常量表达式常量表达式;inta34;floatb510;行列,二维数组的逻辑结构就如同一张表格:a00a01a02a03a10a11a12a13a20a21a22a23存放形式:按行存放。,a0,a1,a2,二维数组可以看作是一个特殊的一维数组,它的元素又是一个一维数组。C语言这样的处理方法在很多情况下显得很方便。与一维数组相比,二维数组的定义多一个长度,其元素多一个下标。在应用中,如果要处理的数据如同一数列,则可定义一维数组来存放;而如果要处理的数据如同一张表格,则应定义二维数组来存放。,引用引用形式:数组名下标下标如:a03=a12+a23;其元素有两个下标。例:从键盘输入12个数到二维数组中。inta34,i,j;for(i=0;i3;i+)for(j=0;j4;j+)scanf(“%d”,需要用两重循环来控制两个下标的变化。,如果键盘输入的数据是:123456789101112,则在数组中如何存放?两个循环换位呢?两个下标换位呢?inta34,i,j;for(i=0;i3;i+)for(j=0;j4;j+)scanf(“%d”,for(j=0;j4;j+)for(i=0;i3;i+)scanf(“%d”,for(i=0;i3;i+)for(j=0;j4;j+)scanf(“%d”,例:输入一个表格的数据到二维数组中,并找最大值所在的位置main()inta34,i,j,i1,j1;for(i=0;iai1j1)i1=i;j1=j;printf(“n%d,%d”,i1,j1);,初始化对二维数组赋初值的几种方法:inta34=1,2,3,4,5,6,7,8,9,10,11,12;inta34=1,2,3,4,5,6,7,8,9,10,11,12;inta34=1,5,9;inta34=1,0,6,0,0,11;inta4=1,2,3,4,5,6,7,8,9,10,11,12;inta4=0,0,3,9,10;,74字符数组用于存放字符的数组称字符数组。字符数组的每一个元素存放一个字符。字符数组的独特之处:(1)字符数组可以看作字符串变量。(2)对字符数组可以进行某些整体操作。(3)有专用的字符串处理函数。,1、将字符数组作为字符串变量charc10;给c分配10个字节的内存单元。把c看作数组时,按数组元素的形式访问:c0=a;c1=b;c2=c;c3=d;abcdcharc10=a,b,c,d;也属于字符赋初值的形式。,如果把字符序列看作一个整体(字符串),则c就可看作是存放这个字符串的串变量;但必须在字符序列后加上“字符串结束标志”后,才能成为完整的字符串。如:c4=0;或c4=0;abcd0也可以按字符串形式初始化:charc10=”abcd”;charc=”abcd”;分配5个字节,2、对字符数组的整体操作对字符数组的有些操作可以整体进行,如输入输出。for(i=0;i10;i+)printf(“%c”,ci);对数组元素操作printf(“%s”,c);整体操作注意以上两种操作有区别。可将前者改为:for(i=0;ci!=0;i+)printf(“%c”,ci);,对于输入:for(i=0;i10;i+)scanf(“%c”,不允许,对于二维字符数组,可以看作是一维的字符串数组。例:从键盘输入10个人的名字到计算机:main()inti;charname1020;10个元素的一维字符串数组for(i=0;iy)z=x;scanf(“%d%d”,xyzabc,3,5,说明:(1)程序由两个函数组成,它们逻辑上相互独立(功能、变量)。(2)程序的执行总是从主函数开始,主函数总是被执行一次,其他函数只有在被调用时才获得控制。(3)函数调用有两个作用:转移控制权和传递参数。(4)return的作用也有两个:交回控制权和返回结果。(5)实参可以是常量、变量或表达式,但类型要一致。,定义一个函数除考虑算法外就是:如何设计函数的参数,通过何种途径交回结果。例:求自然数1100中的素数之和。?prime(?)main()inti;inti,s=0;for(i=2;im;i+)for(i=1;i=100;i+)if(m%i=0)?if(prime(i)s+=i;?printf(“n%d”,s);,intm),int,return0;,elsereturn1;,return1;,例:求5!+7!+4!的值。?fac(?)inti,s=1;for(i=1;i=n;i+)s*=i;return(s);main()printf(“n%d”,fac(5)+fac(7)+fac(4);,intn,int,main()floats,fac();对被调函数声明s=fac(5)+fac(7)+fac(4);printf(“n%f”,s);floatfac(intn)inti;floats=1;for(i=1;i=n;i+)s*=i;return(s);不需声明的情况:intchar主调函数在后,若被调用的函数是库函数,则应用#include命令将所调用函数的有关信息包含进来,如:例:#include“math.h”main()floatx,y;scanf(%f”,86局部变量和全局变量1、局部变量在函数内定义的变量称局部变量。局部变量只在该函数内使用。floatf1(intx)intf2()main()inti,j;inta,b,c;intm,n;inti,j;,说明:(1)任何函数(包括主函数)内定义的变量都是局部变量。(2)不同函数内定义的变量即使同名也互不干扰。(3)复合语句中定义的变量只在该复合语句中有效。,2、全局变量在函数以外定义的变量,也称外部变量。全局变量可以为为本文件中其它函数所共用。它的作用范围是从定义变量的位置开始到本源文件结束。,intp=1,q=5;floatf1(inta)intb,c;charc1,c2;charf2(intx,inty)inti,j;main()intm,n;,全局变量c1,c2的作用范围,全局变量p,q的作用范围,全局变量主要用于作为不同函数间数据传递的桥梁。例:编写一个函数,求n个数中的最大值、最小值和平均值。并编写主函数完成:输入100个数,调用该函数进行统计,输出结果。,intmax,min;floataver(inta,intn)inti;floats=0;for(i=0;imax)max=ai;if(aimin)min=ai;s+=ai;return(s/n);main()intx100,i;floatav;for(i=0;i100;i+)scanf(“%d”,用全局变量传递结果,分析不用全局变量的情况:floataver(inta,intn)inti;floats=0;intmax,min;for(i=0;imax)max=ai;if(aimin)min=ai;s+=ai;return(s/n);main()intx100,i;floatav;intmax,min;for(i=0;i100;i+)scanf(“%d”,intmax,min;floataver(inta,intn)inti;floats=0;for(i=0;imax)max=ai;if(aimin)min=ai;s+=ai;return(s/n);main()intx100,i;floatav;intmax,min;for(i=0;i100;i+)scanf(“%d”,分析全局变量与局部变量同名的情况,max,min,max,min,阅读程序,给出运行结果:inta=4,b=5,c=6;intf(inta,intb)a/=2;c+=b-a;return(a+b+c);main()inta=2,d;d=f(a+2,a+b);printf(“n%d,%d,%d,%d”,a,b,c,d);,4,5,2,6,a,b,c,a,b,a,d,4,7,2,11,20,87变量存储类别1、动态存储方式和静态存储方式静态存储方式:在程序运行期间分配固定存储单元的方式。动态存储方式:在程序运行期间根据需要动态分配存储单元的方式。,变量,变量,局部变量,动态存储方式变量,全局变量,静态存储方式变量,空间角度,生存期角度,存放在静态存储区的变量:静态存储方式。存放在动态存储区的变量:动态存储方式。,程序区,静态存储区,动态存储区,程序开始运行时分配空间,运行结束时释放主要存放全局变量和静态局部变量,根据需要动态分配,动态释放的区域主要存放动态局部变量和现场保护等,用户区,2、局部变量的存储方式每个局部变量在定义时可以指定其存储方式,即对每个局部变量的定义除定义其数据类型外,还应定义其存储方式。定义存储方式用auto(自动的)static(静态的)。如:intf1()intf2()autointa=1;staticintb=1;缺省时为auto,动态局部变量在函数调用时分配、赋初值,调用结束时释放。静态局部变量在第一次调用时分配、赋初值,调用结束时不释放,其单元及其值仍保留,下次调用时不重新分配,不重新赋初值。在实际应用中,如果希望在函数调用结束后仍保留某个局部变量的值给下次调用时使用,则可定义该变量为静态的。,例:编写一个函数计算:,y=,2x-1第一次计算,3x+1第二次计算,4x+2其他,floatf(floatx)main()floaty;staticintn=1;printf(“%f”,f(2.0);if(n=1)y=2*x-1;printf(“%f”,f(1.0);elseif(n=2)y=3*x+1;printf(“%f”,f(3.0);elsey=4*x+2;n+;return(y);,3、全局变量的存储方式全局变量都是静态存储方式,不允许用auto来定义全局变量。可以用static来定义全局变量。如:staticintx;静态全局变量(内部的)inty;非静态全局变量(外部的),对于非静态全局变量,其它文件中的函数只要用extern加以外部说明,就可以访问。而对于静态全局变量,只局限在本文件中的所有函数访问,其它文件中的函数即使用extern加以外部说明,也不能访问。,inty;main()y=0;intf1()y=2;,externinty;intf3()y=10;intf4()y=100;,staticinty;,第九章编译预处理C语言提供了一些以#开头的指令,如:#define#include等。这些指令是在编译以前就事先进行处理的,因而称为“编译预处理”指令。可以用编译预处理指令实现以下三种功能:1)宏定义2)文件包含3)条件编译,91宏定义1、不带参的宏定义用一个指定的标识符(宏名)代表一个字符串。一般形式:#define标识符字符串如:#definePI3.1415926有了这一宏定义后,程序中凡是用到3.1415926的地方都可以以宏名PI出现。,例:定义一个宏名来代表一个参数。#definePI3.1415926main()floatr=2,c,s;c=2*PI*r;s=PI*r*r;系统在对程序进行编译以前,首先将所有的编译预处理指令进行预处理,对本例来说,就是将程序中所有的宏名PI还原成3.1415926,宏展开。,例:定义一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肺癌中医诊疗试题及答案
- 销售班培训课件
- 2017年医疗培训课件
- 2025年线上线下融合零售策略创新报告
- 化工材质培训课件内容
- 涉农企业税收基础知识培训课件
- 电厂机务检修培训课件
- 消防队夏季防火知识培训课件
- 铂金彩妆培训课件
- GS967-Standard-生命科学试剂-MCE
- 连锁药店质量管理制度
- 农产品销售公司岗位职责及团队架构
- 解读化妆品监督管理条例
- 能源管理体系及节能知识培训课件
- 美团骑手2025年度骑手权益保障与法律法规遵守合同4篇
- 化工设备基础知识培训课件
- 商铺店面装修合同
- 《纵隔病变的ct诊断》课件
- 2024年中国创新方法大赛考试题库(含答案)
- 《毒虫咬伤》课件
- 教学设备安装及售后服务方案
评论
0/150
提交评论