C语言内容提要_第1页
C语言内容提要_第2页
C语言内容提要_第3页
C语言内容提要_第4页
C语言内容提要_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言复习

概念及要点联系方式:fyang@main()函数的基本结构//必包含I/O函数的头文件#include<stdio.h>//数学函数<math.h>//字符串函数<string.h>voidmain(){按需定义变量;按需输入数据;按需处理数据;按需输出数据;}例:从键盘输入三个整数,输出最大值#include<stdio.h>voidmain(){

inta,b,c,max;

scanf("%d,%d,%d",&a,&b,&c);max=a;if(b>max)max=b;if(c>max)max=c;printf("max=%d\n",max);}autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunsignedunionvoidvolatilewhileC语言关键字

(系统定义,不能重定义)很少

C89共32个

boolimaginaryrestrictcomplexinlineC99增加了5个关键字C语言运算符丰富有34种运算符把括号、赋值、强制类型转换等都作为运算符处理表达式类型多样化算术运算符:+-*/%++--关系运算符:<<===>>=!=逻辑运算符:!&&||位运算符:<<>>~|^&赋值运算符:=及其扩展条件运算符:?:逗号运算符:,指针运算符:*&求字节数:sizeof强制类型转换:(类型)分量运算符:.->下标运算符:[]其它:()-C语言提供的数据结构是以数据类型的形式出现的

整型

字符型char实型(浮点型)

枚举类型enum单精度型float

双精度型double数组类型[]结构体类型struct

共用体类型union基本类型构造类型指针类型*空类型void数据类型无符号整型unsigned基本整型int长整型long短整型shortC99增加longlong等类型基本数据类型int整数,VC6默认占4个字节(与long同

),

TC2默认占2个字节(与short同

)。float单精度浮点数,占4个字节double双精度浮点数,占8个字节char字符,占1个字节用来表示256个ASCII字符,或者0~255的整数字符常量转义字符——特殊的字符常量一些特殊字符(无法从键盘输入或者另有它用)用转义字符表示charc1,c2;c1='a';可以

c2="a";错误

合法的字符常量

?变量类型定义字节数范围整型inta,b;4或2见long和short短整型shortx,y;2-32768~32767无符号整型unsignedinta;20~65535无符号短整型unsignedshortb;20~65535长整型longl;4-2147483648~2147483647无符号长整型unsignedlongd;40~4294967295单精度实型floatf;43.4e-38~3.4e38(7位)双精度实型doubled;81.7e-308~1.7e308(15位)长双精度实型longdoubleld;163.4e-4932~3.4e4932(19位)字符型charc1,c2;1-128~127无符号字符型unsignedcharc3;10~255算术运算符及其优先次序1.算术运算符(1)基本的算术运算符*:乘法运算符/:除法运算符%:求余运算符+:加法运算符

-:减法运算符(2)自增、自减运算符

/

整数除整数,得整数%

只针对整型数据,结果为余数如:if(a%b==0)//a是否被b整除i++,i--在变量使用之后,使变量的值加(减)1++i,--i在变量使用之前,使变量的值加(减)1关系运算符及其优先次序C语言提供6种关系运算符:①<

(小于)②<=(小于或等于)③>

(大于)④>=(大于或等于)

⑤==(等于)⑥!=(不等于)

优先级相同

(高)优先级相同

(低)

逻辑运算符及其优先次序3种逻辑运算符:!(逻辑非)&&(逻辑与)||(逻辑或)(1)&&(逻辑与)a&&b(如果a和b都为真则结果为真,否则为假)(2)||(逻辑或)a||b(如果a和b中有一个以上为真则结果为真,只有二者都为假时结果为假)(3)!(逻辑非)!a(如果a为真则结果为假,如果a为假则结果为真)运算符的优先次序!高++,--算术运算符*,/,%高于→

+,-关系运算符<

,<=,>,>=高于→

==,!=逻辑运算符&&高于→

||赋值运算符=,+=,-=,…逗号运算符低(1)算术>关系>逻辑

(2)单目(!,++,--)>双目

(3)同一优先级的运算次序由结合方向决定格式:printf("格式控制串",输出表)功能:按指定格式向显示器输出数据返值:正常,返回输出字节数;出错,返回EOF(-1)输出表:要输出的数据(可以没有,多个时以","分隔)格式控制串:包含两种信息格式说明:

%[修饰符]格式字符

,用于指定输出格式普通字符或转义序列:原样输出格式字符printf格式输出函数d,ix,Xoucse,Efg%%十六进制无符号整数不带符号十进制整数十进制整数指数形式浮点小数单一字符字符串八进制无符号整数小数形式浮点小数e和f中较短一种百分号本身inta=567;printf("%d",a);inta=255;printf("%x",a);inta=65;printf("%o",a);inta=567;printf("%u",a);chara=65;printf("%c",a);printf("%s","ABC");floata=567.789;printf("%e",a);floata=567.789;printf("%f",a);floata=567.789;printf("%g",a);printf("%%");567ff101567AABC5.677890e+02567.789000567.789%说明 格式字符要用小写格式字符与输出项个数应相同,按先后顺序一一对应输出转换:格式字符与输出项类型不一致,自动按指定格式输出%[修饰符]格式字符附加格式说明符(%[修饰符]格式字符).n对实数,指定小数点后位数(四舍五入)修饰符功能m输出数据域宽,数据长度<m,左补空格;否则按实际输出输出数据在域内左对齐(缺省右对齐)-指定在有符号数的正数前显示正号(+)+输出数值时域内左侧的空位自动填00在八进制和十六进制数前显示前导0,0x#在d,o,x,u前,指定输出精度为long型在e,f,g前,指定输出精度为double型l,L对字符串,指定实际输出位数用于d,o,x,u前,指定输入为short型整数h格式:scanf("格式控制串",地址表)功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束返值:正常,返回输入数据个数地址表:变量的地址,常用取地址运算符&&格式字符:d,i,o,x,u,c,s,f,e(意义同前表)例scanf("%d",&a);

输入:10

则a=10例scanf("%x",&a);

输入:11

则a=17scanf格式输入函数例floatf;charcs[80];scanf("%f%s",&f,cs);

输入10.15hellozhang!

则10.15f“hello”csl修饰符功能hm*用于d,o,x前,指定输入为short型整数用于d,o,x前,指定输入为long型整数用于e,f前,指定输入为double型实数指定输入数据宽度,遇空格或不可转换字符则结束抑制符,指定输入项读入后不赋给变量例scanf("%4d%2d%2d",&yy,&mm,&dd);

输入19991015

则1999yy,10mm,15ddscanf修饰符功能%[修饰符]格式字符例doubled;scanf("%lf",&d);——字符输入输出函数字符输出函数:putchar(ch)

输出一个字符ch字符输入函数:

ch=getchar()无参数函数值为从输入设备接收的字符——字符串输入输出函数字符串输出函数:

puts(str)

str字符数组或指针字符串输入函数:gets(str)str字符数组或指针类比(文件操作)字符输出函数--fputc(ch,fp)

字符输入函数--fgetc(fp)

字符串输出函数--fputs(str,fp)

字符串输入函数--fgets(fp)

C语句概述语句是算法实现的程序表示,是算法实现的最小单位。语句说明了一种行为,它是用计算语言编写的控制计算机完成确定操作的句子。空语句(;)复合语句({一条或多条语句})流程控制语句结构化语句条件语句(if语句,switch语句)while语句do-while语句

for语句非结构化语句break语句continue语句

return语句非限定转向语句(goto)C语言数据操作语句循环语句简单语句函数调用语句(函数名(实参表);)表达式语句(表达式;)1)

表达式语句4)复合语句2)

函数调用语句5)空语句3)

控制语句if(e)~else~条件语句for(e1;e2;e3)~循环语句while(e)~循环语句do~while(e);循环语句continue结束本次循环语句break中止switch或循环语句switch(e){}多分支选择语句goto转向语句return从函数返回语句(e)表示条件,~表示内嵌的语句构成程序的三种基本结构顺序结构选择结构循环结构已经证明,任何程序均可只用这三种结构综合描述只用这三种结构编制的程序,叫结构化程序程序必须符合结构化规则典型算法:如累加、累乘、统计、递推、迭代、穷举等最常用的3种if语句形式:if(表达式)语句1;(单选,没有else子句)if(表达式)语句1;else语句2;(2选1)

ifelse嵌套if语句(多选1)

if(表达式1)

语句1

elseif(表达式2)语句2

。。。

elseif(表达式n-1)语句nelse语句nIf语句if(a>b)t=a;a=b;b=t;if/else只管一个语句,欲管控多个语句,须标为“{复合语句}”if(a>b){t=a;a=b;b=t;}①if语句(单分支,分段独立分割)#include<stdio.h>#include<math.h>voidmain(){

intx;doubley;scanf(“%d”,&x);if(x<0)

y=fabs(x);if(x>=0&&x<10)

y=2*x-1;if(x>=10)y=sqrt(3*x-10);printf(“y=%lf\n”,y);}例:写一段程序,实现以下函数,输入整数x,输出y的值:②ifelse语句(双分支,二选一)请写成锯齿的形式,每嵌套一层缩进一层else总是与它上面最近的未配对的if配对if(x<0)

y=fabs(x);else

{

if(x<10)y=2*x-1;

elsey=sqrt(3*x-10);

}if(x<0)

y=fabs(x);else

if(x<10)y=2*x-1;

elsey=sqrt(3*x-10);if(x<0)

y=fabs(x);else

if(x<10)y=2*x-1;elsey=sqrt(3*x-10);ifelse演变为ifelseif③If~elseif语句(多选一,逐段排除)doublef(intx){doubley;if(x<0)

y=fabs(x);elseif(x<10)y=2*x-1;

elsey=sqrt(3*x-10);returny;}#include<stdio.h>voidmain(){

intx;doubley;scanf(“%d”,&x);

y=f(x);printf(“y=%lf\n”,y);}例:有一个函数,输入整数x,输出y的值:switch语句一般形式switch(整型表达式){case整型常量1

:语句1case整型常量2

:语句2

┇default:语句n+1}//成绩百分制转为5级记分制voidmain(){floatscore;intg;doscanf(“%f”,&score);while(score>100||score<0);switch((int)score/10){case10:case9:g=1;break;case8:g=2;break;case7:g=3;break;case6:g=4;break;default:g=5;}printf(“g=%d\n”,g);}注意:整型表达式与某一整型常量匹配后,将按顺序执行(不再关心其它case),直到break跳出整个switch语句;//等价的ifelseif实现if(score>=90)g=1;

elseif(score>=80)g=2;elseif(score>=70)g=3;elseif(score>=60)g=4;elseg=5;//百分制成绩转为5级记分制//写成通用函数:

intscore100to5(floatscore){intg;if(score>100||score<0)return-1;//or6,errorswitch((int)score/10){case10:case9:g=1;break;case8:g=2;break;case7:g=3;break;case6:g=4;break;default:g=5;}returng;}//百分制成绩转为5级记分制#include<stdio.h>intscore100to5(floatscore);voidmain(){floatx;intgrage;scanf(“%f”,&x);

grade=f(x);printf(“g=%c\n”,grade);}代码重用(详见:函数)对于常用的代码片段,可自定义为通用函数

循环结构3种类型的循环语句while(循环条件)

语句1;do语句1;while(循环条件);for(expr1;循环条件;expr3)语句1;辅助控制语句breakcontinue//sum=1+2+3+…10#include<stdio.h>main(){inti,sum;

sum=0;i=1;while(i<=10){sum=sum+i;

i++;}printf("%d",sum);}循环初值循环终值循环变量增值根据输入、输出数据的性质,确定变量名及类型循环体例子:sum=1+2+3+4+5+6+7+8+9+10编程的核心问题:找规律,如何实现任意的第i项

循环条件注意:统计变量赋初值一般形式:执行流程:expr2循环体假(0)真(非0)forexpr1expr3for语句说明:expr1,expr2,expr3类型任意,

都可省略,但分号;不可省for语句可以转换成while结构for(expr1

;

expr2

;expr3

)

循环体语句;expr1;

//循环前初始化while(expr2){循环体语句;

expr3;}当expr1和expr3空时,while(expr2)

循环体语句;for(;

expr2

;

)

循环体语句;expr2为空时,

无限循环:for(expr1;;expr3)~;main(){inti,sum=0;i=1;for(;i<=10;){sum=sum+i;

i++;}printf("%d",sum);}常用形式://sum=1+2+3+…10#include<stdio.h>main(){inti,sum=0;

for(i=1;i<=10;i++){sum=sum+i;

}printf("%d",sum);}//sum=1+2+3+…10#include<stdio.h>main(){inti,sum=0;

i=1;while(i<=10){sum=sum+i;i++;}printf("%d",sum);}for(循环变量赋初值;循环条件;循环变量增值)

循环体语句;循环变量赋初值;while(循环条件){

循环体语句;循环变量增值;}求阶乘:选择合适的数据类型:long或double求累加和:s=s+t(k),关键问题找出:

通项t(k)及递推关系,注意:初始值、终止条件和步长统计:统计正数、平均分以上、n个成绩中100~90、89~80、79~70、69~60、<60的人数;输入字符串中字母d的个数设置一个计数变量k:初始化为0,每遇到一次将其加1:k++;典型的编程题累加的项较复杂时,得专门求,例:前后项之间无关1m+3m+5m+7m+.…t(k)=pow(k,m)π/4=1-1/3+1/5-1/7+...直到最后项的绝对值小于10-6前后项之间有关(递推公式)1!+2!+...+n!

t(k)

=t(k-1)*k,t(0)=1x0+x1+x2+x3+.…t(k)

=t(k-1)*x,t(0)=11+1+2+3+5+8+13+21+...t(k)

=t(k-1)+t(k-2)2/1+3/2+5/3+8/5+13/8+21/13+...a+aa+aaa+aaaa+aaaaa+....a是一个数字,例a=2,2+22+222+2222+....t(k)=t(k-1)*10+a,t(1)=a通项t(k)及递推关系流程的转移控制

breakcontinuegotoreturn有返回值的函数体内应含:

return

表达式;#include<math.h>voidmain(){ints;floatn,t,pi;t=1;pi=0;n=1.0;s=1;while(fabs(t)>=1E-6)

{pi=pi+t;

n=n+2;

s=-s;

t=s/n;}pi=pi*4;printf("pi=%10.6f\n",pi);}运行结果:pi=3.141397#include<stdio.h>程序:判别是否素数?#include"math.h"Voidmain(){intm,i,k;scanf("%d",&m);k=sqrt(m);for(i=2;i<=k;i++)

if(m%i==0)break;if(i>k)printf("%d是素数\n",m);else

printf("%d不是素数\n",m);}运行结果:

17↙17isaprimenumber

第六章循环控制整数分解例:读入一个整数,逐位分割各位数字,如输入7358,则输出

8537分离后逆序输出。#include<stdio.h>voidmain(){intn;scanf("%d",&n);while(n>0){printf("%d",n%10);n/=10;}}数组(Array)inta[10];定义一个有10个元素的数组,每个元素的类型均为int使用a[0]、a[1]、a[2]、……、a[9]这样的形式访问每个元素。它们与普通变量没有任何区别系统会在内存分配连续的10个int空间给此数组数组下标可以是整型表达式a是此数组的首地址a数组首地址a[9]a[8]a[7]a[1]a[0]…数组是一组共用同一个名字、具有一定顺序关系和相同数据类型的变量的集合。其中,共用的名字称作?,集合中的变量称为?

。一维数组的定义定义方式:数据类型数组名[常量表达式];

合法标识符表示元素个数下标从0开始[]:数组运算符单目运算符优先级(1)左结合不能用()例

inta[6];a[0]a[1]a[2]a[3]a[4]a[5]a编译时分配连续内存内存字节数=数组维数*

sizeof(元素的数据类型)数组名表示内存首地址,是地址常量

一维数组intn=10;inta[n];(定义时不能用变量)数组的定义与初始化数组定义后的初值仍然是随机数,一般需要我们来初始化inta[5]={12,34,56,78,9};inta[5]={0};inta[]={11,22,33,44,55};数组大小最好用宏来定义,以适应未来可能的变化

#defineSIZE10

inta[SIZE];数组大小,在运行时不可改变数组的使用数组的下标都是从0开始数组的每个元素与普通变量无异可以用任意表达式作为下标,动态决定访问哪个元素for(i=0;i<SIZE;i++)

a[i]=2*i;下标越界是大忌!可能带来严重后果下标i>=SIZE,将访问数组以外的空间。sizeof可以用来获得数组大小:n=sizeof(a)/sizeof(a[0]);只能逐个对数组元素进行操作(字符数组例外)输入方法:inta[10],i;输入第i个数组元素:scanf("%d",&a[i]);输入整个数组元素:for(i=0;i<10;i++)scanf("%d",&a[i]);输出方法:输出第i个数组元素:printf("%d",a[i]);输出整个数组元素:for(i=0;i<10;i++)printf("%d",a[i]);一维数组的输入和输出&a[i]≡

a+i

a[i]≡*(a+i)二维数组a:由3个行元素a[i]组成每个行元素a[i],由4个列元素组成,a[i]相当于一个一维数组a[0]a[1]a[2]行元素名a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[0][0]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[1][2]a[0]a[1]a[2]二维数组行元素列元素二维数组的输入和输出数组的输入和输出只能逐个对数组元素进行操作(字符数组例外)inta[2][3],i,j;输入方法:输入第i行第j列元素:scanf("%d",&a[i][j]);输入整个数组元素:for(i=0;i<2;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);

输出方法:输出第i行第j列元素:printf("%d",a[i][j]);输出整个数组元素:for(i=0;i<2;i++)for(j=0;j<3;j++)printf(“%d”,a[i][j]);&a[i][j]≡

a[i]+j≡

*(a+i)+j

a[i][j]≡

*(*(a+i)+j)#defineN10voidmain(){inta[N][N],i,j;for(i=0;i<N;i++){a[i][0]=a[i][i]=1;if(i>0)printf(“%5d”,a[i][0]);//每行第一个1for(j=1;j<i;j++){a[i][j]=a[i-1][j-1]+a[i-1][j];printf("%5d",a[i][j]);}printf(“%5d\n”,a[i][i]);//对角线上的1}}要打印出以下的杨辉三角形(若打印出10行),要求:1①正确的定义一个数组11

121②给出第0列元素的表达式1331③给出对角线元素的表达式,

14641④给出第i行第j列元素的表达式15101051⑤打印“直角三角形”………

例有三个学生四门课成绩,二维表格的统计与打印(按行统计和按列统计求均值)928568755488984561798140张三李四王二数学C语言英语物理#include<stdio.h>main(){//变量定义及初始化inta[3][4]={92,85,68,75,54,88,98,45,61,79,81,40},x,k,sum;charxm[3][9]={"张三","李四","王二"};charkc[4][6]={"数学","英语","C语言","物理"};floatxa[3]/*各行均值*/,ka[4]={0};//各列均值,初始化为全0//数据处理for(x=0;x<3;x++){xa[x]=0;//学生x成绩,累加前赋初值为0for(k=sum=0;k<4;k++){xa[x]+=a[x][k];

//学生x各门课程k成绩累加

ka[k]+=a[x][k];//课程k累加}

xa[x]/=4.0f;//学生x成绩求均值}//打印,如何实现”二维表”(何时计算各门课程的平均分)?}如何找出最高分及其对应的姓名和课程?如何按平均成绩排序,保持姓名的对应关系?

字符数组初始化的两种形式:用字符型数据对数组进行初始化charstr[]={'C','h','i','n','a','\0'};用字符串常量直接对数组初始化charstr[6]={"China"};charstr[]="China";//或去掉{}字符逐个方式字符串赋值方式字符串采用‘

\0’标志字符串和数组字符串存放在字符数组中字符串

处理函数#include

<string.h>

charcs[100];gets(cs);puts(cs);charcs[100];scanf(“%s”,cs);printf(“%s”,cs);注意:输入输出字符串时,实参为数组名例题:输入一个以回车结束的字符串(少于80个字符),然后逆序输出。voidmain(){chars[80];

inti=0;

while((s[i]=getchar())!=‘\n’)

i++;

s[i]=’\0’;

//----------------等价于gets(s);for(i=strlen(s);

i>0;i--

)

putchar(s[i]);}IamaBoy\0//等价于while(s[i]=getchar(),s[i]!=‘\n’)

注:函数参数:str,str1,str2是字符数组名或字符型指针charstr[]="BBI";puts(str);charstr[]="\nbbi"puts(str);gets(str);

键入:Iamstdcharc1[20]="Iamstud";charc2[]="aboy"printf("%s",

strcat(c1,c2));

strcpy(str1,"BBI");charstr2[]="bbi";strcpy(str2,str1)strcmp("CCTV",“ZTV");printf("%d\n",strlen("bbi"));puts(str或字串)在屏幕上显示一个字符串(以

‘\0’结束);附加换行gets(str)从键盘输入一个串给字符数组,返回是该数组在内存的

首地址;字符串里可含空格

strcat(str1,str2)将串2接在串1后,其结果放在字符数组中strcpy(str1,字串)将字符串拷贝到字符数组里

strcmp(str1,str2)两串相同,返回值是0;串1>串2,返回值是正整数串1<串2,返回值是负整数strlen(str)返回不包括'\0'字符串的长度函数格式功能举例字符串处理函数<string.h>数组的应用了解了在什么情况下使用数组这种数据类型向函数传递一维数组和二维数组的方法用数组名作为函数参数和用简单变量作为函数参数的不同之处程序设计常用算法:求最大值,排序,查找,统计斐比数列的设计几种方法逆序存放数据回文问题函数C中库函数按功能分类:使用系统提供的标准函数(称库函数),需要#include命令

函数

头文件

输入、输出函数stdio.h

数学函数math.h

字符和字符串函数string.h

动态分配函数malloc.h………………..

对于常用的代码片段,可自定义为通用函数

目的:代码重用一般格式见名知意返回值的类型缺省int型无返回值void函数体:完成某功能函数类型函数名(形参类型说明表){

说明部分 语句部分}现代风格:函数的定义例有参函数的定义

intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}与外部交换数据#include<stdio.h>intmax(intx,inty);//函数声明voidmain(){inta,b,c;scanf("%d,%d",&a,&b);

c=max(a,b);//函数调用printf("Max=%d\n",c);}各形参都带类型说明各实参与形参一一对应自定义函数的编程思路//输入两个整数,返回较大者

intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}

例:函数功能:输入两个整数,返回最大值①确定函数名:根据函数功能,取名max②确定参数的个数及类型:应当有两个参数,以便从主函数接收两个整数,参数的类型应当是整型③确定函数的类型:根据返回值的类型,应为int{④根据需要定义内部变量;⑤根据功能处理数据⑥求出返回值,并返回}main函数的写法

(调用自定义函数时)#include<stdio.h>voidmain(){必要的函数声明(可外移);根据需要定义变量;必要的数据输入;

函数调用;

必要的结果输出;}#include<stdio.h>voidmain(){intmax(intx,inty);inta,b,c;scanf("%d,%d",&a,&b);

c=max(a,b);

printf("Max=%d\n",c);}intmax(intx,inty){return(x>y)?x:y;}自定义函数的编程思路//计算xn,x为实数,n为整数

doublecal_power(doublex,intn){inti;doublepow=1.0;for(i=1;i<=n;i++)pow=pow*x;returnpow;}

函数功能:计算xn,x为实数,n为整数①确定函数名:根据函数功能,取名cal_power②确定参数的个数及类型:应当有两个参数,以便从主函数接收x和n的值,参数类型:doublex,intn③确定函数的类型:根据返回值的类型,应为double{④根据需要定义内部变量;⑤根据功能处理数据⑥求出返回值,并返回}main函数的写法

(调用自定义函数时)#include<stdio.h>必要的函数声明;voidmain(){根据需要定义变量;必要的数据输入;

必要的数据处理(调用函数);

必要的数据输出;}#include<stdio.h>doublecal_power(doublex,intn);voidmain(){doublex,s;intn,i;scanf("%lf,%d",&x,&n);

for(i=1,s=0;i<=n;i++)s=s+1/cal_power(x,i);

printf(“s=%lf\n",s);}函数调用时的数据传递形式参数:intmax(intx,inty);实际参数:c=max(3,5);形参为带类型说明的变量,而实参可以是常量、变量或表达式:在调用函数过程中,系统会把实参的值传递给被调用函数的形参,c=max(3,b);c=max(a,b);c=max(a+3,b);实参形参单向性形参必须指定类型,实参必须有确定的值实参不带类型说明,但实参需与形参类型一致,个数相同若实参类型与形参不一致,自动转换为形参的类型例比较两个数并输出大者#include<stdio.h>intmax(intx,inty);//函数声明voidmain(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);//函数调用printf("Max=%d\n",c);}intmax(intx,inty)//函数定义{if(y>x)x=y;return(x);}7.5函数参数及其传递方式调用的主要过程:

(1)先将实参a,b的值,

分别传递给形参x,y

(2)然后转去执行max()函数体

(3)函数返回时,返回值z被带回调用函数,赋值给cmax实参max形参单向传值max函数只对局部变量x、y操作对main中的变量a、b没影响#include<stdio.h>voidswap(intx,inty);voidmain(){inta=5,b=10;swap(a,b);printf(“%d,%d”,a,b);}voidswap(intx,inty)

{intt=x;//①

x=y;//②

y=t;//③}swap函数只对局部变量x、y、t操作,对main中的变量a、b没影响函数间参数传递main函数swap函数510变量a变量b形参x形参y105变量tempmain函数变量a5变量b10①t=x;②

x=y;③y=t;5#include<stdio.h>intmain(){intb[10];printf(“输入:");

input1(b,10);

sort(b,10);printf(“输出:");

print1(b,10);return0;}数组名作函数的形参形参的数组名≡指针

input1(inta[],intn)≡input1(int*a,intn)voidprint1(inta[],intn){inti;for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}voidinput1(inta[],intn){inti;

for(i=0;i<10;i++)scanf("%d",a+i);}a=b=&b[0]内存地址数组元组输入数据1000b[0]611004b[1]821008b[2]531012b[3]751016b[4]921020b[5]621024b[6]711028b[7]671032b[8]801036b[9]85实参将&b[0]值传给形参a,形参和实参共享同一数组:a≡b,a+i≡&b[i],a[i]≡b[i]

数组名作函数参数

(选择法排序)

用选择法对数组中10个整数按由小到大排序解题思路:所谓选择法就是先将10个数中最小的数与a[0]对换;第一轮结果a[0]最小再将a[1]到a[9]中最小的数与a[1]对换;第二轮结果a[1]最小……依次类推:每一轮,在未排序的数中找出最小的一个,交换到前端共比较9轮voidsort(inta[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i;//从a[i]到a[n-1]中找最小值a[k]for(j=i+1;j<n;j++)if(a[j]<a[k])k=j; t=a[k];//a[k]交换到a[i]a[k]=a[i];a[i]=t; }}需要n-1轮比较数组名作函数的形参内存地址数组元组输入数据1000a[0]611004a[1]821008a[2]531012a[3]751016a[4]921020a[5]621024a[6]711028a[7]671032a[8]801036a[9]85定义:函数直接或间接的调用自身叫函数的递归调用f()调f调f2调f1f1()f2()说明C编译系统对递归函数的自调用次数没有限制每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出intf(intx){inty,z;……

z=f(y);…….return(2*z);}intf1(intx){inty,z;……

z=f2(y);…….return(2*z);}intf2(intt){inta,c;……

c=f1(a);…….return(3+c);}递归调用#include<stdio.h>intf(intn){intt;if(n==0||n==1)t=1;elset=f(n-1)*n;return(t);}voidmain(){intn=5,y;y=fac(n);printf("%d!=%d",n,y);}例:求n的阶乘如何实现求xn的递归函数?f(n)=1(n=0,1)n*f(n-1)(n>1)递归函数必须有一个结束条件:

当条件成立时,不再递归调用本函数,完成适当操作后返回。f(5)t=5*f(4)f(4)t=4*f(3)f(3)t=3*f(2)f(2)t=2*f(1)f(1)t=1f(1)=1递归调用阶段

返回阶段intf(intn){intt;if(n<=1)t=1;elset=n*f(n-1);return(t);}f(2)=2f(3)=6f(4)=24f(n)=1(n=0,1)n*f(n-1)(n>1)f(5)=120典型例子:参见实验十(7)从f(1)开始反向推演出f(5)递归函数的跟踪局部变量局部变量在函数和复合语句块内定义的变量形参也是局部变量只能在定义它的函数内部使用和识别特点进入语句块时获得内存,仅能由语句块内语句访问,退出语句块时释放内存。每次进入需重新初始化intm=1;intf(inta){if(a>m){intt;

t=m;m=a;a=t;}

returna;}voidmain(){inti=0;while(i<3)printf("%d",m+f(i++));}全局变量全局变量在所有函数之外定义的变量特点在程序中定义它的位置以后都有效在定义点之前或在其他文件中引用,应该进行如下声明:

extern类型名变量名;从程序运行起即占据内存,程序运行过程中可随时访问,程序退出时释放内存使函数之间的数据交换更容易,也更高效但是并不推荐使用,尽量少用因谁都可改写它,难维护externintm;intf(inta){if(a>m){intt;

t=m;m=a;a=t;}

returna;}intm;//自动初值为0voidmain(){inti=0;while(i<3)printf("k=%d,",m+f(i++));}自动变量(auto)"自动"体现在进入语句块时自动申请内存,初值不确定,退出时自动释放是缺省的存储类型标准定义格式

auto类型名变量名;动态局部变量,函数每次进入要重新赋初值(初始化),在函数退出后失效intk=1;voidfun();voidmain(){

intj;for(j=0;j<2;j++)fun();printf("k=%d",k);}voidfun(){

intk=1;printf("k=%d,",k);k++;}静态变量(static)静态变量在变量类型前面用static修饰

staticinti;静态变量处于内存静态区,函数退出不释放。变量的值仅初始化一次(默认值为0),再次进入函数仍然保存上次修改的值。intk=1;voidfun();voidmain(){fun();fun();printf("k=%d",k);}voidfun(){

staticintk=1;printf("k=%d,",k);

k++;}寄存器变量(register)寄存器CPU的内部容量很有限、但速度极快的存储器使用频率比较高的变量声明为register,可以使程序更小、执行速度更快register类型名变量名;

registerinti;现代编译器有能力自动把普通变量优化为寄存器变量,并且可以忽略用户的指定,所以一般无需特别声明变量为register#include<stdio.h>intAverage(intx,inty);//函数声明main(){

inta=12,b=24,ave;ave=Average(a,b);

printf("Averageof%dand%dis%d.\n",a,b,ave);}//计算平均数intAverage(intx,inty){

intresult; result=(x+y)/2;

returnresult;}函数调用在前,函数定义在后float

average(floata[10],intn){inti;

floatsum=a[0];

for(i=1;i<n;i++)

;//求累加和

return(sum/n);}例如:#defineN5longfac(intn){longf=1;f=f*n;return(f);}main(){inti;for(i=1;i<=N;i++)printf("%d!=%ld\n",i,fac(i));}

运行结果:1!=12!=23!=34!=45!=5

运行结果:1!=12!=23!=64!=245!=120staticlongf=1;变量:在C语言中,一个变量对应于一组用于保存数据的内存单元。例如:整型变量占用4个字节的内存空间。变量的地址:变量内存单元的起始地址。指针:就是一个变量的地址.在C语言中,变量在内存中的地址是由编译系统分配的,它是指针常量,例如数组名。指针类型:指针是C语言的一种数据类型(类型说明符*).指针变量:声明为指针类型的,专用于存放变量地址的变量。8、指针(Pointer)的概念指针变量赋值只能赋予同类型变量的地址,不能赋予除0或NULL以外的任何其它数据。空指针:无指向#defineNULL0类型说明符*变量名;

int*p;定义一个指针变量:对指针变量的定义包括三个内容:(1)

指针类型说明:int*(2)

指针变量名:p(3)

指针所指向的变量的数据类型:int。p究竟指向哪一个变量,应由p所赋予的变量地址来决定。利用指针间接访问时,务必明白p指向谁?

指针变量初始化intx;int*p;//(int*)是类型p=&x;//变量x的地址赋给指针变量p//表述为:p指向x*p=5;//x=5;

//通过指针p间接访问所指的变量x

即:*p和

x等价*p≡

x*p就像普通变量一样使用,其值就是x的值。两个有关的运算符:&与*运算符

&

取地址运算符

*

指针运算符(或称“间接访问”运算符,对所指向的变量进行存取操作,“存取地址中的数值")例如:voidswap(int*px,int*py){intt=*px;*px=*py;*py=t;}voidmain(){intx=3,y=5;

swap(&x,&y);printf("x=%d,y=%d",x,y);}等价p可以指向不同的内存单元,从而使*p代表不同的变量例如:inta[10];

//定义a为包含10个整型数据的数组int*p;

//定义p为指向整型变量的指针p=&a[0];//a[0]的地址赋给指针变量p若:p=a或&a[0],即p指向数组a之首。则:*p、p[0]、*a、a[0]相互等价其中:a是指针常量,而p是指针变量(更灵活)。指针变量初始化等价通过数组名a对数组元素的操作,可以用指针变量p等效实现。二、通过指针引用数组元素

C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向它的下一个元素。引入指针变量后,就可以用多种方法来访问数组元素了。例如:inta[10],*p,i;//使用指针常量a:更高效for(i=0;i<10;i++)scanf("%d",a+i);//a+i即&a[i]for(i=0;i<10;i++)printf("%d",*(a+i));//*(a+i)即a[i]//使用指针变量p:更高效,且不要inti;for(p=a;p<a+10;p++)scanf("%d",p);for(p=a;p<a+10;p++)printf("%d",*p);二种等效的表示方式下标表示指针表示a[i]*(a+i)p[i]*(p+i)a[0]*a(i=0)inta[]={0,1,2,3,4,5},*p;p=&a[2];p[1]

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论