C语言复习资料第7章Word文档下载推荐.docx
- 文档编号:22059249
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:15
- 大小:248.61KB
C语言复习资料第7章Word文档下载推荐.docx
《C语言复习资料第7章Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C语言复习资料第7章Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
****************
#include<
stdio.h>
intmain()
{voidprintstar();
/*对printstar函数声明*/
voidprint_message();
/*对print_message函数声明*/
printstar();
/*调用printstar函数*/
print_message();
/*调用print_message函数*/这里没有返回值
printstar();
/*调用printstar函数*/仅仅是执行了函数而已
return0;
}
voidprintstar()/*定义printstar函数*/
{printf("
****************\n"
);
}
voidprint_message()/*定义print_message函数*/
\n"
二、※函数的调用和声明
(1)函数调用的一般形式为:
函数名(实参表列)
如果是调用无参函数,则“实参表列”可以没有,但括号不能省略(即括号内什么都没有,就一个括号)(参照上面的例题1)
如果实参表列包含多个实参,则各参数间用逗号隔开(如d=max(a,b,c);
)
(若不理解可以对照例题进行理解)
(2)函数的调用方式:
1.函数调用语句
把函数调用单独作为一个语句
如printf_star();
这时不要求函数返回值,只要求函数完成一定的操作(比如排序,printf之类的)
2.函数表达式
函数调用出现在另一个表达式中
如c=max(a,b);
这时要求函数带回一个确定的值以参加表达式的运算
(通常伴有>
、<
、=、==、!
=之类的符号或者是直接进行四则运算,函数之前通常还有一个变量,这可以作为判断依据,如例2)
例2:
判断素数的函数
(1)编写一个判断素数的函数,命名为primeNumber,对参数n进行判断,返回一个表示“是/否”的值。
(2)在主函数中输入一个正整数,调用上述函数进行判断,并输出结果。
(3)在第2题程序正确运行后,对main函数进行修改:
使用primeNumber函数,显示[1000,2000]区间内的素数。
(2)
#include<
{intprimeNumber(intx),x;
charc;
printf("
请输入一个数="
scanf("
%d"
&
x);
if(x==1)printf("
你输入的数不是素数\n"
else
{c=primeNumber(x);
if(c==0)printf("
elseprintf("
%d是素数\n"
x);
return0;
intprimeNumber(intx)
{
inti,c;
for(i=2;
i<
=x-1;
i++)if(x%i==0)break;
if(i<
x)c=0;
elsec=1;
return(c);
(3)
intprimeNumber(intx),x,c;
1000到2000内的素数\n"
for(x=1000;
x<
=2000;
x++)
{c=primeNumber(x);
if(c==1)printf("
%d\t"
i++)
if(x%i==0)break;
3.函数参数(这个较难理解,可以参照例题进行理解)
函数调用作为另一函数调用时的实参
如m=max(a,max(b,c));
//求a,b,c三数中最大者
其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参
(有点类似于高中解方程时的整体代换)
(3)函数调用时的数据传递
1.形式参数和实际参数
在调用有参函数时,主函数和被调用函数之间有数据传递关系(“值传递”)
形参和实参:
定义函数时函数名后面的变量名称为“形式参数”(简称“形参”)
主调函数中调用一个函数时,函数名后面参数称为“实际参数”(简称“实参”)
而实参可以是常量、变量或表达式(如上a则可以改成a+5,或者改成一个常量5)
2.实参和形参间的数据传递
在调用函数过程中,系统会把实参的值传递给被调用函数的形参
即是说,形参从实参得到一个值,并在函数调用期间在被调用的函数里参加运算
如图所示:
如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值
(4)函数的返回值
函数的返回值是通过函数中的return语句获得的。
※但在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致
例如下图(书上P179例7.3)
(5)函数的声明
这个就属于格式问题了,就是必须在使用被调用函数前,对函数进行声明(让主函数知道有这么一个函数存在)。
例题中都有注释。
这就靠看例题进行理解吧。
三、函数的嵌套调用
(1)定义:
调用一个函数的过程中,又可以调用另一个函数
例3(详细的解释在书上P183例题7.5):
#include<
{intmax4(inta,intb,intc,intd);
inta,b,c,d,max;
printf(“4intergernumbers:
"
%d%d%d%d"
a,&
b,&
c,&
d);
max=max4(a,b,c,d);
max=%d\n"
max);
}
intmax4(inta,intb,intc,intd)
{intmax2(inta,intb);
//函数声明
intm;
m=max2(a,b);
//a,b中最大者
m=max2(m,c);
//a,b,c中最大者
m=max2(m,d);
//a,b,c,d中最大者
return(m);
intmax2(inta,intb)//比较两数大小
{
if(a>
=b)
returna;
else
returnb;
(以上例题在max4的函数中声明并调用了※另外一个函数max2来进行计算)
(请注意递归和嵌套的区别,嵌套是调用别的函数进行计算,而递归是本身函数的调用)
四、函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用该函数本身。
注意与函数嵌套的区别,具体见上。
(经验之谈:
通常在使用递归的时候,函数里面都伴有if的结构来结束递归,并且通常是赋值的语句。
(2)例题集:
(递归比较难理解,希望大家能多看下面的经典例题并加以理解)
例4:
(第11-12周实验第3题)
编写求两个正整数最大公约数的函数gcd和求两个正整数最小公倍数的函数lcm。
{intgcd(inta,intb);
intlcm(inta,intb);
intc,d,e,f;
输入两个数(用回车隔开)\n"
%d%d"
if(c==0||d==0)printf("
你输入的数有误,请重新输入\n"
{e=gcd(c,d);
f=lcm(c,d);
%d和%d的最大公约数为%d\n"
c,d,e);
%d和%d的最小公倍数为%d\n"
c,d,f);
}return0;
(以下有两种算法,大家加以对比参照以了解递归的用法及好处)
普通算法(效率较低):
intgcd(inta,intb)
intn,i,t;
if(a>
b)n=b;
elsen=a;
for(i=1;
=n;
i++)
{
if(a%i==0&
&
b%i==0)
t=i;
return(t);
intlcm(inta,intb)
b)n=a;
elsen=b;
for(i=a*b;
i>
i--)
{
if(i%a==0&
i%b==0)
递归算法(辗转求余法):
intgcd(inta,intb)
if(a<
b)returngcd(b,a);
elseif(b==0)returna;
elsereturngcd(b,a%b);
returna*b/gcd(a,b);
例5:
(第11-12周实验第4题)递归算法求阶乘
在函数中用
递归算法表示
(1)使用如下的阶乘定义,用递归算法编写一个求阶乘的函数fac。
阶乘的递推定义公式:
(2)编写主函数,调用fac求任意3个正整数阶乘的和x!
+y!
+z!
。
doublefac(doublea)
intmain(){doublet=1;
{doublefac(doublea);
if(a==0)t=1;
doubleb,c,d,e;
printf("
请输入3个数字(用回车隔开)\n"
t=a*fac(a-1);
//递归算法
%lf%lf%lf"
returnt;
if(b<
0||c<
0||d<
0)printf("
你输入的数据有误,请重新输入\n"
else
{e=fac(b)+fac(c)+fac(d);
%.0f!
+%.0f!
=%.0f\n"
b,c,d,e);
}return0;
(3)编写主函数,调用fac求1!
+2!
+...+10!
。
{doublefac(doublea);
doubleb=0;
inti;
11;
b=b+fac(i);
1!
+2!
+3!
+4!
+5!
+6!
+7!
+8!
+9!
+10!
b);
doublefac(doublea)
doublet=0;
returnt;
(4)编写主函数,调用fac求组合数
,n≥m。
doublem,n,e;
请输入m="
%lf"
m);
请输入n="
n);
if(n<
m)printf("
else{e=fac(n)/(fac(m)*fac(n-m));
组合数C=%.0f\n"
e);
doublet=1;
if(a==0)t=1;
else
t=a*fac(a-1);
returnt;
(注意:
如果对递归算法有不懂的或者不是太熟悉的可以去找天哥,他这方面很擅长的说)
五、数组作为函数参数
(1)数组元素作函数实参
在用数组元素作函数实参时,把实参的值传给形参,是“值传递”方式。
数值传递的方向是从实参传到形参,单向传递。
具体应用请看例6。
例6:
(书P193例7.9)输入10个数,要求输出其中值最大的元素和该数是第几个数。
{intmax(intx,inty);
//函数声明
inta[10],m,n,i;
10integernumbers:
for(i=0;
10;
a[i]);
for(i=1,m=a[0],n=0;
{if(max(m,a[i])>
m)//若max函数返回的值大于m
{m=max(m,a[i]);
//返回值取代原值
n=i;
//记下此时的序号,放到n中
largestnumberis%d\n"
m);
%dthnumber.\n"
n+1);
intmax(intx,inty)
{return(x>
y);
//返回x和y中的大者
(2)数组名作函数参数
跟数组元素作实参时不同的是,数组名作函数实参时,向形参(数组名或者指针变量)传递的是数组首元素的地址。
(可以联系之后的指针进行思考)
直接看例题来理解吧
例7(第11-12周实验第5题):
定义一个函数,在一个数组中查找一个指定的值,找到时返回其下标,找不到则返回-1。
再定义一个主函数,对一个数组的元素赋值,然后输入一个数值,调用上述函数进行查找,并输出结果。
intzhao(intsz[],intt);
intsz[10]={1,32,34,45,65,100,234,484,620,659},c,d;
请输入你要查找的数字\n"
c);
d=zhao(sz,c);
//做实参时用数组名
if(d==-1)printf("
你所找的数字不存在,请重新输入\n"
你查找的数字的下标为%d\n"
d);
intzhao(intsz[],intt)
intk=-1,i;
if(sz[i]==t)k=i;
return(k);
关于字符数组作函数实参的例题
例8(第11-12周实验第6题)编写一个函数统计一个字符串中大写字母、小写字母、数字、空格、其他字符的个数。
主函数输入字符串,调用上述函数进行统计,并输出结果。
voidfind(charstr[],intn[]);
chartext[]={"
AABBaabb1234#$%^"
};
//初始化,也可以自行输入
intn[4]={0};
find(text,n);
字母个数=%d\n数字个数=%d\n空格个数=%d\n其他字符个数=%d\n"
n[0],n[1],n[2],n[3]);
voidfind(charstr[],intn[])//不返回具体值的无参函数
strlen(str);
i++)//使用了strlen函数来测字符串的长度
if(str[i]>
='
A'
str[i]<
Z'
)n[0]++;
elseif(str[i]>
a'
z'
elseif(str[i]>
0'
9'
)n[1]++;
elseif(str[i]==32)n[2]++;
elsen[3]++;
(3)多维数组名作函数参数
跟一维数组名作函数参数类似,但在对形参数组定义时,可以省略第一维的大小说明。
例9(书P198例7.13)有一个3×
4的矩阵,求所有元素中的最大值。
(函数整理完了,有点多,这是因为函数很重要,而大部分都是对之前所学知识进行应用,所以大家也要复习好之前的知识,然后希望大家期末都不挂科Σ(っ°
Д°
;
)っ)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 复习资料