c同步练习 下载本文

数的值.此表达式的值的类型必须与函

数的首部所说明的类型一致,若类型不一致,则以函数值的类型为准,由系统自动进行转换。 1.2当程序执行到return语句时,程序的流程就返回到调用该函数的地方,并带回函数值,在同一函数内,可以根据需要在多处出现return 语句.例如: int fun(int x)

{int i,s=0;for(i=1;i<=x;i++)s+=i; return s;} main()

{int s;s=fun(100);printf(\第二节函数的调用和说明 一:函数的两种调用方式:

1.函数的一般调用形式为: 函数名(实在参数表) 实在参数(简称实参)的个数多于一个时,各实在参数之间用逗号隔开,若函数无形参,调用形式为:函数名( )函数后的一对括号不可少. int fun(int x)

{int i,s=0;for(i=1;i<=x;i++)s+=i;return s;} main()

{int s;s=fun(100);printf(\2.函数说明:

1)在C语言中,除了主函数外,对于用户定义的函数要遵循\先定义,后使用\的规则,凡是未在调用前定义的函数,C编译程序都默认函数的返回值为int类型,对于返回值为其他类型的函数,若把函数的定义放在调用之后,应该在调用之前对函数进行说明;

2)函数说明的一般形式如下:

类型名 函数名(参数类型1,参数类型2...) 例如:double add(double ,double)

或 类型名 函数名(参数类型1 参数名1,参数类型2 参数名2...)

例如:double add(double a,double b)

此处的参数名完全是虚设的,他们可以是任意的用户标识符.

3)函数说明可以是一条独立的语句,

如: double add(double ,double );

也可以与普通变量一起出现在同一个定义语句中.

如:double x,y, add(double ,double );

4)在函数名前没有说明函数返回值类型时,隐含int类型.

2.函数说明的位置 2.函数说明的位置

1) 当在所有函数的外部,被调用之前说明函数时,在函数说明的后面所有位置上都可以对该函数进行调用.

2)函数说明也可以放在调用函数的说明部分,如在main函数内部进行说明,则只能在main函数内部才能识别该函数。

第三节调用函数和被调用函数之间的数据的

传递 一:C语言中,调用函数和被调用函数之间的数据的传递可以通过三种方式进行传递: 1.实在参数和形参之间进行数据传递。 2.通过return语句把函数值返回调用函数。 3.通过全局变量

二在C语言中,数据只能从实参单向按值传递,也既是说,当简单变量作为实参时,用户不可能在函数中改变对应实参的值。例如:以下程序例示了函数之间的单向传递,请观察程序的执行结果。

main()

{int x=2,y=3,z=0;

printf(\fun(x,y,z);

printf(\ fun(int x,int y,int z)

{printf(\z=x+y;x=x*x;y=y*y;

printf(\

第四节程序举例(略)

1. 在C语言中,函数返回值的类型最终取决于(A) A)函数定义时在函数首部所说明的函数类型 B)return语句中表达式值的类型 C)调用函数时主函数所传递的实参类型

第 17 页 共 38 页

D)函数定义时形参的类型 2. 有以下函数 int fun(char *s) {char *t=s; while(*t++); return(t-s); } 该函数的功能是(B)

A)比较两个字符的大小 B)计算s所指字符串占用内存字节的个数

C)计算s所指字符串的长度 D)将s所指字符串复制到字符串t中

3. 若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是

A)函数的实参和其对应的形参共占同一存储单元

B)形参只是形式上的存在,不占用具体存储单元 C)同名的实参和形参占同一存储单元

D)函数的形参和实参分别占用不同的存储单元 4. 以下程序中函数f的功能是在数组x的n个数(假定n个数互不相同)中找出最大最小数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换.请填空. #include

viod f(int x[],int n) { int p0,p1,i,j,t,m;

i=j=x[0]; p0=p1=0; for(m=0;m

{ if(x[m]>i) {i=x[m]; p0=m;} else if(x[m]

t=x[p0]; x[p0]=x[n-1]; x[n-1]=t; t=x[p1];x[p1]= ________; ________=t; } main()

{ int a[10],u;

for(u=0;u<10;u++) scanf(\f(a,10);

for(u=0;u<10;u++) printf(\printf(\}

5. 以下程序统计从终端输入的字符中大写字母的个

数,num[0]中统计字母A的个数,num[1]中统计字母B的个数,其它依次类推.用#号结束输入,请填空. #include #include main()

{ int num[26]={0},i; char c; while((________)!='#')

if(isupper(c)) num[c-?A?]+= ________; for(i=0;i<26;i++)

printf(\ }

6. 以下程序的输出结果是 _____________ int fun(int*x,int n) {if(n==0) return x[0];

else return x[0]+fun(x+1,n-1); } main()

{int a[]={1,2,3,4,5,6,7}; printf(“%d\\n”,fun(a,3));}

第二部分:上机题

1.编写函数fun( int k) ,来判断自变量k 是否为素数,若是素数函数返回整数1,否则返回0

2. 编写函数void fun (int m`,int k),该函数的功能是将大于整数m而且紧靠m的k个素数输出。

3.编写程序,输出整数m中的所有因子(除1和本身)。

4.编写函数fun( ch ),把ch中的小写字母转换为相用的大写字母的下一个字母。小写字母z转换为大写字母A。

5.编写函数,根据整型形参m的值,计算下面的公式的值。

S=1-3/(2*2)+5/(3*3)-7/(4*4)+…+(-1)n+1(2*n-1)/(n*n)

第八章指针

第 18 页 共 38 页

知识体系

第八章 指针

看下面的图形和例题说明: #include #include void main( ) void main( ) { int a; { int a,*p; a=2008; a=2008; p=&a;

printf(“%d\\n”,a); printf(“%d\\n”,*p); } }

一:计算机的内存是以字节为单位的一片连续的存储空间,每个字节都有一个编号,这个编号就称为内存地址。

二:若在程序中定义了一个变量,C编译系统就会根据定义的变量的类型,为其分配一定字节的内存空间,这个变量的内存地址就确定了,每个变量的地址是指给变量所占存储单元的第一个字节的地址。

三:程序逻辑中我们对变量进行存取操作,实际上也就是对某个地址的存储单元进行操作,这种直接按变量的地址存取变量值的方式称为“直接存取”方式。

四:在C语言中,还可以定义一种特殊的变量,这种变量是用来存放内存地址的,通过变量p间接得到变量a的地址,然后在存取变量a的值的方式称为“间接存取”方式,通常称变量p指向了变量a,变量a是变量p所指向的对象。

五:用来存放指针地址的变量称为“指针变量”。 六:“变量p指向变量a”的含义就是指针变量p中存放了变量a的地址。

七:在某些场合,指针是使运算得以进行的唯一途径。

第二节:指针的定义赋值。

一:指针变量的定义和指针变量的基本类型 1. 定义指针变量的一般形式:

类型名 *指针变量名1,*指针变量名

2,…...

说明:A类型名是指基本类型 B *是说明符

C指针变量名是用户标识符

例如:A int *p,*q; /*定义两个指针变量*/

这里说明,p,q是指向整型( int 型)的指

针,p,q中只能存放整型变量的地址。 B 看下面的定义: int **p,*s,k=20; s=&k; p=&s;

p为一个指向指针的指针变量.

*p代表存储单元s,*s代表存储单元k,因此**p也代表存储单元k. 二给指针变量赋值

1. 通过求地址运算(& )获得地址值,

1) 单目运算符&用来求出运算对象地址,

得用求地址运算可以把一个变量的

地址赋给指针变量。例如:p=&k;

2) 把变量k的地址赋予q,这时可以说:q指向了变量k

3) A求地址运算符、&只能用于变量和数

组元素。不可以用于表达式和常量或

被说明为register的变量。

B&必须放在运算对象左边,且运算对象类型必须和指针变量的类型相

同。

4) 在调用scanf函数时,若q=&k,则

scanf(“%d”,&k)和scanf(“%d”,q)是等价的,

2. 通过指针变量获得地址值。

1) 可以通过赋值运算,把一个指针变

量中的地址赋给另一个指针变量,

从而使这两个指针变量指向同一地址,例如:p=q;

2) 当进行赋值运算时,赋值号两边的指针变量的类型必须相同。 3) 通过标准函数获得地址值。

可以通过调用库函数malloc和

calloc在内存中开辟动态存储单元;

第 19 页 共 38 页

2008 2001 并把所开辟的动态存储单元的地址赋给指针变量(不做要求)

4.给指针变量赋“空”值

1)除了给指针变量赋地址值外,还可以给指针变量赋NULL值。如:p=NULL,等价于p=?\\0?;或p=0;

2)在使用NULL时,应该在程序的前面出现预定义:

#include “stdio.h” NULL的值为0,当执行以上赋值语句后,称p为空指针。

第三节对指针变量的操作

1. 通过指针来引用一个存储单元

间接访问运算符(间址运算符) “*”单目运算符。

1) int *p,i=10,j; p=&i;*p=i;

则:j=*p; j=i; j=*(&i); j=*&i; 表示:求&i中的内容赋予j;

j=*p+1;表示取变量p所指的存储单元i中的内容加1后赋予变量j; 2)int *p,k=0; p=&k;

则*p=100; k=100;把整数100放入k中,

3)*p=*p+1;k=k+1;

取p所指向的存储单元中的值,加1后在放入p所指向的存储单元中,即使得变量k中的值增1而为101

以上语句可以写成:*p+=1;或++*p;或(*p)++(括号不能少)

4看课本后的习题指针移动和指针的比较:8.5、8.6、8.7 5)看下程序: main()

{ int a,b,min;

int *pa,*pb,*pmin; pa=&a;pb=&b;pmin=&min; scanf(“%d%d”,pa,pb);

printf(“a=%d b=%d\\n”,a,b); *pmin=*pa;

if(*pa>*pb)*pmin=*pb; printf(“min=%d\\n”,min);

}

当指针指向变量时,完全可以通过指针来对所存单元进行存取,

第四节指针在函数中应用及举例 一:函数之间地址的传递。

1.形参为指针变量时,实参和形参之间的

数据传递 1) 若函数的形参为指针类型,则

调用该函数时,对应的实参是

基类型相同的地址值或者是已经指向某个存储单元的指针变量。

2)

例如:myadd( int *a,int *b)

{ int sum; sum=*a+*b;

return sum; } main()

{int x,y,z;

scanf(“%d%d”,&x,&y); z=myadd(&x,&y);

printf(“%d+%d=%d”,x,y,z

);

}

在myadd函数中,语句sum=*a+*b;含义是:分别取指针变量a和b所指存储单元中的内容,相加后存入sum中,myadd含数返回的是主含数中x变量和y变量中值的和。

2.通过传送地址值,在被调用含数中直接

改变调用含数中变量的值。

1)

把数据从被调用含数返回到调用含数的唯一途径是通过return语句返回数值,这就限

2)

定了只能返回一个数据。 例如:调用swap含数,交换主含数中变量x和y中的数据。

第 20 页 共 38 页