C++程序设计第5章 函数

合集下载

C语言程序设计教程(第5章 函数)

C语言程序设计教程(第5章 函数)

22
信息科学与工程学院
作用域(可用域)与生存期
C语言中定义的变量都有一个起作用的范 围,称为变量的作用域。 程序运行时,变量被创建和被删除的时间 段,称为变量的生存期。
23
信息科学与工程学院
局部变量和全局变量
在一个函数内部定义的变量是内部变量, 它只在本函数内部范围内有效。也就是说 只有在本函数内才能使用它们。这些变量 称为“局部变量”。 在函数之外定义的变量称为外部变量,也 称为全局变量,在文件内的所有函数都能 使用它。它的有效范围为从定义变量的位 置开始到文件的结束。
4
信息科学与工程学院
5.1 问题的提出
C语言程序是由什么构成的? 函数 什么是函数?
能完成特定功能的功能块; 一般有输入参数 和返回值; 一次定义,可以调用多次。
一个C语言程序为什么需要不同的函数?
一个函数过大难于编写和维护; 一个函数的程序不利于协作; 代码和功能共享的需要。
5
信息科学与工程学院
6. 函数调用举例分析(见下页)
15
信息科学与工程学院
实参到形参是单向值传递 例2 求两个整数中的最大值
int max(int x,int y) /*函数定义*/ { int temp; if (x>y) temp=x; else temp = y; COPY return temp; } void main() { int a,b; scanf("%d,%d",&a,&b); a = max(a,b); /*函数调用*/ printf("\n max= %d \n",a); }
2
信息科学与工程学院
第5章 函数
本章需要掌握的知识点: 函数定义 函数说明 函数调用 形参和实参的关系 变量的存储类别

C语言程序设计第五章

C语言程序设计第五章
通过编写程序,实现对数组的访问、修改 、排序等操作。例如,实现一个程序,将 一个数组中的所有元素进行排序,或者找 到数组中的最大值和最小值。
05 案例分析
案例一:条件语句在程序中的应用
总结词
条件语句是C语言中用于根据不同条件执行不同操作的语句,通过if、else if和else关键 字实现。
详细描述
编程练习二:循环语句应用
总结词
理解并掌握while和for循环的使用
详细描述
通过编写程序,实现重复执行某段代 码直到满足特定条件,或者根据需要 重复执行某段代码指定次数。例如, 计算1到100的累加和,或者打印出0 到99的所有偶数。
编程练习三:数组操作应用
总结词
理解并掌握数组的基本操作
VS
详细描述
详细描述
数组在程序中用于存储和处理同一种类型的 数据元素,例如存储一组学生的成绩、计算 一组数据的平均值等。数组操作包括数组的 声明、初始化、访问和修改等。通过循环语 句可以方便地遍历数组元素并进行处理。数 组操作在程序中具有广泛的应用,是C语言
中重要的数据结构和算法之一。
06 总结与展望
本章总结
详细描述
C语言中的数组是一种存储相同类型元素的线性数据结构。可以通过索引访问数 组元素,进行赋值、交换、排序等操作。同时,C语言还提供了字符串操作函数, 如strcpy、strcat、strlen等。
语法点三:数组操作
01
示例代码
02
```c
int array[10]; // 声明一个包含10个整数的数组
详细描述
循环语句在程序中用于重复执行一段代码, 例如打印1到10的数字、计算一定数量的累 加和等。循环语句可以嵌套使用,以实现更 复杂的循环结构和算法。循环语句通常与条 件语句结合使用,以控制循环的执行条件和 次数。

C语言程序设计 (何钦铭 颜晖 著) 高等教育出版社第五章 课后答案

C语言程序设计 (何钦铭 颜晖 著) 高等教育出版社第五章 课后答案
void main()
{
double e,x,cos;
printf("Enter two numbers e and x :"); /*输入两个数e,x */
scanf("%lf%lf",&e,&x);
cos=funcos(e,x); /*调用函数funcos */
printf("The result of cos(%lf) is %lf.\n",x,cos);
printf("sign(%lf)=%d\n",x,y); /*输出x的符号*/
}
int sign(double x) /*定义函数sign */
{
int y;
if(x>0)y=1;
else if(x==0)y=0;
else y=-1;
return y;
}
练习5-2
#include <stdio.h>
#include <stdio.h>
int even(int n); /*声明函数even */
void main()
{
int num,sum=0;
printf("Enter the first number :"); /*输入第一个数*/
scanf("%d",&num);
while(num>0)
{
{
int i,j;
for(i=1;i<=n;i++) /*共n行金字塔*/
{
for(j=1;j<=n-i;j++)printf(" "); /*输出每行左边的空格*/

C语言程序设计 第05章 函数

C语言程序设计 第05章 函数
❖ 函数体:一对花括号里面的内容(包括声明部分和语句 部分)又被称为函数体,当函数体为空的时候,该函数 也被叫做空函数,就是说它什么也不做。
8
计算机与信息工程学院
Page 8
C语言程序设计 第 5 章 函数
例1 计算两个整数的平均数的函数。 /* 函数功能:就算平均数 函数入口参数:整型x,存储第一个运算数
7
计算机与信息工程学院
Page 7
C语言程序设计 第 5 章 函数
❖参数:一般用于一个函数把数据传递给另一个函数(调用 者和被调用者之间),实现函数之间的通信。定义函数的 时候,函数的参数是形式参数,是对一件具体事件可能需 要数据的假设。
❖ 返回值: 即函数带回来的值。而返回值的类型是在定义函数 的时指定的,即用“返回值类型”指定函数的类型。 ❖ 1、如果类型标识符为void则表示不需要带回函数值; ❖ 2、如果没有类型标识,则为默认返回值类型,视编译 器的不同而不同。
单向传递,只由实参传给形参,而不能由形参传回 来给实参。 f) 在内存中,实参单元与形参单元是不同的单元。
13
计算机与信息工程学院
Page 13
C语言程序设计 第 5 章 函数
例2 调用函数时的数据(参数)传递。
#include <stdio.h> void main() {
int max(int x, int y); int a, b, c; scanf("%d, %d",&a, &b); c=max(a, b); printf("max is %d", c); }
计算机与信息工程学院
Page 4
C语言程序设计 第 5 章 函数
5.2.1 函数的分类

第5章 函数与带参数宏 《C语言程序设计及应用教程》课件-PPT课件

第5章 函数与带参数宏  《C语言程序设计及应用教程》课件-PPT课件

5.2 函数的嵌套与递归调用
函数的嵌套调用
不允许嵌套定义,函数间平行的、独立。 C中的函数:
允许嵌套调用。
main( ) 调用函数a 结束
a函数
调用函数b
b函数
【例5-7】 输入两个整数,求平方和
#include <stdio.h>
int fun1(int x,int y)
int fun1(int x,int y);
斐波那契数列");
for(i=0;i<N;i++)
{
printf("%d\t",iF[i]);
if((i+1)%10==0)
printf("\n");
}
printf("\n");
}
int Sum(int iF[],int n); void main() { int i,Fibonacci[N],m,n; //生成斐波那契数列 CreateFibonacci(Fibonacci); //输出斐波那契数列 PrintFibonacci(Fibonacci); //求数列前n项的和 printf(" 请输入要求和的项数 n(n<%d): ",N); scanf("%d",&n); m=Sum(Fibonacci,n); printf("\n 斐波那契数列前 %d项的和:%4d\n",n,m);}
第5章 函数与带参数宏 ?C语言 程序设计及应用教程?课件
5.1 函数的声明、定义与调用
5.1.1 函数的声明与定义 5.1.2 函数调用 5.1.3 函数参数传递 5.1.4 主函数中的参数

第5章 函数

第5章 函数

oop技术:封装性、继承性、多态性。
多态性 :一个名字,多个人口”,或称“同一接口, 多种方法 。
例5.6 重载绝对值函数
int abs(int x)
{ { { return x>0?x:-x;} return x>0?x:-x;} return x>0?x:-x;} double abs(double x) 1ong abs(1ong x) void main()
形参带值后,即可进行相应的数据处理
如果有结果值,通过return语句带回到主函数
5.2 函数的调用


函数要先定义,后调用。
调用函数时要考虑到函数本身的参数;

调用标准库函数时,要包含相应的头文件 输入/输出函数 iostream.h 字符串函数 string.h 常用数学函数 math.h 调用自定义函数时,要定义相应的实参,并给 这些实参赋值。
main()
{ int a = 1,b = 2; cout << "Before exchange:a= " << a << ",b= " << b << endl;
swap(a,b);
cout << "After exchange:a= " << a << ",b= " << b << endl; }
例5.8 定义一个求两数最大值的模板函数。
template <class T> T Max(T a, T b) { return a>b?a:b; }
void main()

C程序设计题目集答案之第5章

C程序设计题目集答案之第5章

第5章判断题1-1C语言函数返回类型的默认定义类型是void。

(1分)T F1-2函数形参的存储单元是动态分配的。

(1分)T F1-3如果函数定义出现在函数调用之前,可以不必加函数原型声明。

(1分)T F1-4C 语言程序中可以有多个函数, 但只能有一个主函数。

(1分)T F1-5局部变量如果没有指定初值,则其初值不确定。

(1分)T F1-6C语言中,通过函数调用只能获得一个返回值。

(1分)T F1-7函数的实参和形参都可以是变量、常量和表达式。

(1分)T F1-8按照C语言的规定,在参数传递过程中,既可以将实参的值传递给形参,也可以将形参的值传递给实参,这种参数传递是双向的。

(1分)T F1-9按照C语言的规定,实参和形参的命名不得重复。

(1分)T F1-10一个函数定义中可以完整地包含另一个函数的定义。

(1分)T F1-11函数调用得到的值,可以作为另一次函数调用时的参数。

(1分)1-12c语言每个函数的返回值都是int型的。

(1分)T F1-13C语言在函数调用时,若形参实参都是普通变量,实参和形参可以共用存储单元。

(1分)T F1-14函数的形参都属于全局变量。

(1分)T F1-15实参向形参进行数值传递时,数值传递的方向是单向的,即形参变量值的改变不影响实参变量的值。

(1分)T F1-16全局变量只能定义在程序的最前面,即第一个函数的前面。

(1分)T F1-17全局变量与局部变量的作用范围相同,不允许它们同名。

(1分)T F1-18为了便于计算机存储管理,C语言把保存所有变量的数据区,分成动态存储区和静态存储区,静态局部变量被存放在动态存储区。

(1分)T F1-19自动变量如果没有赋值,其值被自动赋为0。

(1分)T F1-20静态局部变量如果没有赋值,其存储单元中将是随机值。

(1分)T F单选题2-1C语言中函数返回值的类型是由()决定的。

(1分)A.B.调用该函数的主调函数的类型C.调用函数时临时决定D.定义函数时所指定的函数类型2-2在一个被调用函数中,关于return 语句使用的描述,错误的是()。

C语言程序设计-第5章--函数

C语言程序设计-第5章--函数

实参可以是常量、变量或表达式,但要求 它们必须要有确定的值,在调用时将实参 的值赋给形参。另外,实参和形参的类型 应相同或兼容。
— 31 —
5.2 函数的参数传递和返回值
➢ 5.2.2 函数的返回值
一般情况下,主调函数调用完被调函数后,都希望能够得到一 个确定的值,这就是函数的返回值。在C语言中,函数返回值 是通过return语句来实现的。return语句的一般形式有3种:
/*函数声明*/
/*调用逆序函数,将a的逆序值赋给b*/ /*调用逆序函数,将b的逆序值赋给c */
— 23 —
5.2 函数的参数传递和返回值
➢ 5.2.1 函数的形参与实参
{
int y=0,sign=1;
/*定义sign表示x的符号,定义变量y代表逆序数据*/
if(x<0)
/*当x小于0时取符号及取反*/
— 18 —
5.1 函数的定义和调用
➢ 5.1.2 函数的调用
另外,按函数在语句中的作用来分,可以有以下3种函数调用方式:
函数表达式
函数语句
函数作为实参
函数作为表达式中的一项出 现,以函数返回值参与表达 式的运算。
函数调用的一般形式加上分 号即构成函数语句。
函数作为另一个函数调用的 实际参数出现,即把该函数 的返回值作为实参进行传送。
#include<stdio.h> int main() {
int x=0,y; y=trans(x); printf("y=%d\n",y); printf("x=%d\n",x); return 0; } trans(int a) { a++; printf("a=%d\n", a); return a; }

C程序设计第五章课后习题答案

C程序设计第五章课后习题答案

循环结构程序设计P115 5.1 用while计算1至100的合.#include<stdio.h>int main(){int i=1,sum=0;while(i<=100) //对于需要运算的值,要么在运算前可以赋值,要么一开始要指定.{sum=sum+i;i++;}printf("The sum is %d .\n",sum);return 0;}P117 5.2 用do-while来做1至100的合.#include<stdio.h>int main(){int i=1,sum=0;do// do-while可以做的事,用while都可以做到.{ //do-while先做一次执行,再判断条件,而while却是先做一个条件,再执行.sum=sum+i;i++;}while(i<=100);printf("The sum is %d .\n",sum);return 0;}P118 5.3 比较do-while与while的差别.#include<stdio.h>{int i,sum=0;printf("Please input a number :");scanf("%d",&i); //输入10以内,正常,11的话,则sum仍然是0.while(i<=10){sum=sum+i;i++;}printf("The sum of 1-10 is %d .\n",sum);return 0;}#include<stdio.h>int main(){int i,sum=0;printf("Please input a number :");scanf("%d",&i); //输入10以内,结果一样.输入11的话,先做操作,所以sum=11.do{sum=sum+i;i++;}while(i<=10); //此重点在于理解二者的差别.printf("The sum of 1-10 is %d .\n",sum);return 0;}P126 5.4 break的例子.#include<stdio.h>int main(){int i,b=0,a,c;for(i=0;i<=1000;i++){printf("Please input amount :"); //循环体内套有输出语句以及跳出语句.scanf("%d",&a);b=b+a;if(b>=100)break; //break是用于跳出循环,对if无效,对while for switch 这一类.}}c=b/i;printf("conut is %d , aver is %d ",i+1,c); //注意%号后的形式,否则可能输出错误.return 0;}P127 5.5 continue的例子.#include<stdio.h>int main(){int i;for(i=1;i<20;i++){if(i%3!=0){continue; //跳过本次I,执行下一个i.}printf("%d ",i);}printf("\n");return 0;}P128 5.6 形成一个4*5的矩阵.#include<stdio.h>int main(){int i,j,a=0; //没有给初值,会出现警告: 使用了未初始化的局部变量“a”.for(i=1;i<=4;i++){for(j=1;j<=5;j++,a++) // a用来控制换行.{if(a%5==0){printf("\n");}printf("%d\t",i*j);}}printf("\n");return 0;}P131 5.7 用一个交错的式子求哌的近似值.#include<stdio.h>#include<math.h>int main() //四分之哌等于(1)-(1/3)+(1/5)-(1/7)+(1/9)-(1/11).{float s=1,n=1,m,sum=0,t;for(m=1;;m=m+2) //不确定哪项才会小于等于十的负六次方,所以不指定,无限下去.{ //不指定第二项,执行语句中应该有控制跳出的句子,否则死循环.t=(s)*(n/m); //这是第一项,s是符号,if(fabs(t)<=1e-6) //应该写在这里,题目要求这一项不累加进去.{break;}sum=sum+t; //因为累加项在这里,所以,一旦跳出就不会累加进来了.s=s*(-1); //变号一次.}printf("四分之一哌的值是%f.\n",sum);printf("一个完整哌的值是%f.\n",sum*4);return 0;}//下面这段小代码用来验证关于数值型数据类型的关系.去掉注释,可运行.//如果出现类似值为全1或是全零的话,一般可以考虑数据类型赋值或是定义错了的问题.//#include <stdio.h> //这是关于int float double三者关复杂关系的,乱啊,如果看不懂,可以通过实验自己明白来.////int main() //在C语言中,1.0认为是实数,即是double型,所以,如果你把它用float输出的话,会有警告:警告 1 warning C4305: “=”: 从“double”到“float”截断.//{// float m,a,b,c; //一旦定义了是这种类型的话,输出或是赋值的时候只能扩展不能截断,意思就是能变成double型,不能变成int型啦.而且后面的赋值会跟着它变成相应的类型.比如下面的m=1,其实得到的是m=1.0.// int d,e,f;// m=1;// a=1.0/3;// b=1/3;// c=m/3;// d=1.0;// e=1/4;// f=1.0/4;// printf("%lf(float用double的%lf来输出是可以的.)\n%f\n%f\n%f\n",m,a,b,c); //不管上面定义什么,这边写的输出类型是什么,就按相应的类型输出,有可能会出错,所以建议按定义的类型来输出.当然扩展的是不会错的,截断的是会错的,比如float可以用%lf来输出,而不能用%d来输出.// printf("%d\n%d\n%d\n",d,e,f); //但是,不相应的int型不可以用%f来输出的.因为int float就不同种类,一个是整数,一个是小数,float double同样是有小数点的!!!!// return 0;//}#include<stdio.h>int main() //这个就是著名的Fibonacci(费波那契数列问题){int f1=1,f2=1,f3,i;printf("%12d\n%12d\n",f1,f2);for(i=1;i<=38;i++) //注意,这是个基础问题,(i=1;i<=5;i++)这里其实进行了次运算,因为有f1,f2,要求有个,所以要有个.要么写<=38,要么写<39,边界问题一定要注意,不可以太随意!!!!{f3=f1+f2;printf("%12d\n",f3); //这个问题同样适用于"一对兔子一个月生一对"的问题.,f1=f2; //f1=f1+f2;此时它们各是,所以,现在的f1是.f2=f3; //f2=f2+f1;此时的f1已经是最先二者之和了.可以不用到f3.}return 0;}#include<stdio.h>#include<math.h>int main(){double num;int i;printf("Please input a number :");scanf("%lf",&num); //因为sqrt要求是浮点型,那就给它浮点型,需要时再强制转换.for(i=2;i<=sqrt(num);i++) //这边是<=号没错.{if((int)num%i==0) //如果在这期间有任何一个可以为零的话,则不是素数.{break; //当然跳出.}} //执行到这里的时候,i=5,已经变成了!!if(i<=sqrt(num)){printf("Not %d",(int)num);}else//如上所述,i=5,超出了求根的值,所以是素数.{printf("Yes %d",(int)num);}return 0;}P137 5.10 求100至200间的素数.#include<stdio.h>//不解释,HOHO>>>>...#include<math.h>int main(){double j;int i,k=0;for(j=100;j<=200;j++){for(i=2;i<=sqrt(j);i++){if((int)j%i==0){break;}}k=k+1; //这里是布局的开头.学习一下,有助逻辑.if(i<=sqrt(j)){printf("Not %d ",(int)j);if(k%5==0) //5个换一次行.{printf("\n");}}else{printf("Yes %d ",(int)j);if(k%5==0){printf("\n");}}}return 0;}P139 5.11 密码转换.#include<stdio.h>int main(){char c;c=getchar();while(c!='\n') //这也可以用数组来实现.{if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){if((c>='w'&&c<='z')||(c>='W'&&c<='Z')){c=c-22;}else{c=c+4;}printf("%c",c);c=getchar(); //套在循环里,依次得到字母,而while中判断回车为结束.}}printf("\n"); //这是布局问题.return 0;}P140 0.3 最大公约数和最小公倍数.#include<stdio.h>//最大公约数用累除法,除到无余数时的被除数是最大公约数.main (){int m, n, c, d;int gcd(); //这是最大公约数的缩写,此处调用函数,可以不写里面的实参.int lcm(); //这是最小公倍数的缩写,此处调用函数,可以不写里面的实参.printf("Please input two number :\n");scanf("%d %d",&m,&n);c=gcd(m,n); //c获取最大公约数d=lcm(m,n); //d获取最小公倍数printf("The GCD of %d and %d is : %d !\n", m, n, c);printf("The LCM of %d and %d is : %d !\n", m, n, d);return 0;}int gcd(int x, int y) //最大公约数Greatest Common Divisor{int temp;while(x%y!=0){temp=y; //y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去.y=x%y; //x,y的余数作为下一轮中的Y,由x%y来取得.x=temp; //刚才temp中存储了y的值,现在拿出来作为下一轮中的X使用.}return y; //这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理. }int lcm(int x, int y) //最小公倍数Lowest Common Multiple{int i, temp;if(x<y) //此段代码结果是保证二者大的数在X上,小的数在Y上.即小于号降序.{ //以下为经典三行码,实现两个数的互换.temp=x;x=y;y=temp;}for(i=1; i<=y; i++) //设定一个区间,从1至大的数之间的循环.{if(!((x*i)%y)) //此式子如有余数,加上"!"号,会是假,则不返回,进行下一轮.{ //如此往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数.return x*i;}}}P140 0.4 判断一串输入的字符.#include<stdio.h>int main(){char ch;int a=0,b=0,c=0,d=0,e=0;printf("Please input the string\n");while((ch=getchar())!='\n') //直到回车.{if(ch<='z'&&ch>='a'){a++;}else if(ch==' '){c++;}else if(ch<58&&ch>47){d++;}else if(ch<='Z'&&ch>='A'){b++;}else{e++;}}printf("大写%d 小写%d 空格%d 数字%d 其它%d\n",a,b,c,d,e);}#include<stdio.h>//不理解时可以百度或是谷歌更多的信息.int main() //想办法既快速做完,又要消化理解!!!{int temp,i,a,n,sum=0; //主逻辑,友好性暂时放松.scanf("%d %d",&a,&n); //a是数字,n是要乘的个数.temp=a; //先把第一阶的值存起来.for(i=0;i<n;i++){sum=sum+a;printf("%d + ",a); //事关布局.a=a*10+temp; //重点是每次乘,然后加上上一个数.}printf("= %d .",sum);return 0;}P140 0.6 1!+2!+3!+4!.....的值. #include<stdio.h>int main() //1!+2!+3!+4!.....{int i,j,k,sum=0,m=1;scanf("%d",&k); //比如设定为,值为.for(i=1;i<=k;i++) //第一层循环,指定到.{for(j=1;j<=i;j++) //第二层循环,指定至当前数.{m=m*j;} //到此是阶乘的结构.sum=sum+m;m=1;}printf("%d",sum); //完全不理解时,搜索并参考.return 0; //尝试自己做,第一次做出来就是自己的东西了. }#include<stdio.h>int main(){int a,b;double c,asum=0,bsum=0,csum=0;for(a=1;a<=100;a++) //三个块分别注释验证结果.{asum=asum+a;}for(b=1;b<=50;b++) //在VS运行中,注意*.cpp为C++语言.{bsum=bsum+b*b; //为了避免语言差别,请注意文件名为*.c.}for(c=1;c<=10;c++) //c作浮点运算,所以定义在double类型中.{csum=csum+1/c;}printf("%lf",asum+bsum+csum);return 0;}PP#include<stdio.h>#include<math.h>int main(){int j,k,s[6],x=100,y,sum=0;for(j=153;j<=154;j++){for(k=2;k>=0;k--){s[k]=j%(int)pow(10,k+1)/(int)pow(10,k);y=pow(s[k],3);sum+=y;printf("%d-%d--%d\t",k,s[k],j);}printf("%d\n",sum);}return 0;}P140 0.8 水仙花数.//#include <stdio.h> //一步步的发现问题.////int main() //在%和/号之间,以前pow.以后再做.//{// int i,j,k,a,b,c,sum=0; //这里逻辑对,算出来却错了.// for(i=2;i<=4;i++) //计算机在想什么,看来它的大脑难以模拟.// {// for(j=pow(10,i);j<=pow(10,i+1)-1;j++) //我不完全明白它遵守的逻辑. // {// for(k=0;k<=i;k++)// {// sum+=pow((j%pow(10,i+1)/pow(10,i)),3);// }// if(sum==j)// {// printf("%d 是水仙花数!\n",j);// }// sum=0;// }// }// return 0;//} //为什么还是无法实现?!#include<stdio.h>#include<math.h>int main(){int a,b,c,i,sum=0; //这里只计算三位数的.for(i=100;i<1000;i++){a=i/100;b=i%100/10;c=i%10;sum+=a*a*a+b*b*b+c*c*c;if(sum==i){printf("%d 是水仙花数.\n",i);}sum=0;}return 0;}P141 0.9 完数.#include<stdio.h>int main(){int i,j,r;for(i=1;i<=1000;i++) //零是个临界值,不能包括它.{r=0; //每次清零重来.类似水仙中的sum.for(j=1;j<i;j++){if(i%j==0) //除得尽即是因子.{r=r+j; //然后累加进去.}}if(r==i) //若相等.{printf("%d 是完数.\n",i);}}return 0;}P141 0.10 2/1+3/2+5/3+8/5+13/8…#include<stdio.h>int main() //10.007051{double i,a=2,b=1,c,s=0; //a是分子,b是分母.for(i=0;i<6;i++) //二十可以用户指定.{s+=a/b; //中间储值变量.c=a+b;b=a;a=c;}printf("%lf\n",s);return 0;}#include<stdio.h>int main() //从一百开始,减一半再自加两次,下降一次,反弹一次.{double sum=100,high=100,up,donw,i;for(i=1;i<10;i++) //不管指定到哪个数,都不会超过三百.{up=high/2;donw=up;high=donw; //自咬尾巴问题.sum+=donw*2;}printf("%lf %lf\n",donw,sum);return 0;}P141 0.12 猴子吃桃子.#include<stdio.h>int main() //从一百开始,减一半再自加两次,下降一次,反弹一次.{int i,sum=1;for(i=1;i<=10;i++) //临界要清楚,结果要与手算的前几个实例相匹配.{printf("倒数第%d天还剩有%d个桃子.\n",i,sum);sum=(sum+1)*2;}//printf("%d\n",sum);return 0;}#include<stdio.h>#include<conio.h>main() //只关注左半部分.右半部分无视空格.{int i,j,k,m=6; //m可指定,指定中心点位置.可任意奇偶.for(i=1;i<=m;i++) //上半部分.其实也是正三角.{for(j=1;j<=m-i;j++) //一到中心点前i个位置填充空格.printf(" ");for(k=1;k<2*i;k++) //空格后向前填充星号的个数.是奇数.一,三,五... printf("*");printf("\n");}for(i=m-1;i>0;i--) //下半部分.其实也是倒三角.{ //减一是因为行数问题.这是中心行以下的.for(j=m-1;j>=i;j--)printf(" ");for(k=1;k<2*i;k++)printf("*");printf("\n");}getch(); //用户反应后结束.但,没必要.}。

c语言程序设计5(函数)

c语言程序设计5(函数)

参数的传递
1. 函数调用时,被调函数中的形参被分配 临时的存储单元,实参的值赋给形参变量 2. 实参可以是常量、变量或表达式 3. 实参的个数、类型和顺序必须与形参一致 4. 形参与实参各占一个独立的存储空间,调 用结束后,形参单元被释放
形参值的改变不会影响实参-----值传递
例:P134 main( ) { int v1=10, v2=20; printf(“v1=%d v2=%d\n”,v1,v2); printf(“_ do swap _\n”); swap(v1,v2); printf(“v1=%d v2=%d\n”,v1,v2); } void swap(int x, int y) { int temp; v1=10 v2=20 temp=x; _ do swap _ x=y; y=temp; v1=10 v2=20 }
自定义函数的应用实例
P136 例3:输出“九 九表”。 它是一个
9行9列的二维表格,
加上一个行标题和一
个列标题,显示出来
应该是10行10列。
#include <stdio.h> void drawLine(int n,char ch); /* 连续显示n个ch字符 */ main() { int i,j; printf("\n 9.9 table\n"); /* 显示表名 */ drawLine(30, '='); /* 显示每列的标题 */ printf("\n 1 2 3 4 5 6 7 8 9"); drawLine(30, '='); for (i=1; i<=9; i++) { /* 显示每行的内容 */ printf("\n%3d", i); for (j=1; j<=9; j++) printf("%3d", i*j); if (i<9) drawLine(30, '-'); else drawLine(30, '='); } void drawLine(int n, char ch) /*连续显示n个ch字符*/ } { int i; putchar('\n'); /*换行*/ for (i=1; i<=n; i++) putchar(ch); /*连续显示n个字符ch*/ }

C语言课件 第5章

C语言课件 第5章
如果x<y, max=y, min=x ③ 输出最大值max、 最小值min
第5章 选择结构程序设计
/*程序 5 - 3, 求两个数的最大值、 最小值*/ main( ) { float x, y; float max, min; printf(″请输入两个数x, y: ″); scanf(″%f, %f″, &x, &y); if (x>y) {max=x; min=y; } else {max=y; min=x; } printf(″max=%6.2f, min=%6.2f\n″, max, min); } 输入数据: 1.2, 2.54 运行结果: max= 2.54, min= 1.20
第5章 选择结构程序设计
5.1.3 多分支if语句
多分支if语句不是一条具体的语句,它通过if语句的嵌套实
现。其一般形式为: if (条件表达式1)
if (条件表达式2) 语句1
else 语句2 else if (条件表达式3) 语句3 else 语句4
第5章 选择结构程序设计
T T
条件表达式1 条件表达式2
}
第5章 选择结构程序设计
例 5 — 7 将例 5 — 5 用switch语句实现。
switch ((int)(cj/10)) { 10: 9: ch=′A′; break; /*注意选择表达式的构造*/
8: ch=′B′; break;
7: ch=′C′; break; 6: ch=′D′; break;
第5章 选择结构程序设计
例 5 –3 输入两个数, 求两个数的最大值、最小值。 数据分析:
输入量: 两个数x、 y, float

C语言程序设计(李圣良)章 (5)

C语言程序设计(李圣良)章 (5)
printf("处理之前的原始成绩如下:\n"); for(i=0;i<10;i++)
printf("%3d",score[i]); printf("\n"); pass(score,10);
第5单元 函 数
printf("处理之后的成绩如下:\n"); for(i=0;i<10;i++)
printf("%3d",score[i]); printf("\n"); } void pass(int array[],int n) { int i; for(i=0;i<n;i++)
function(); }
第5单元 函 数 图5-2 例5-4程序运行结果
第5单元 函 数
5.2.2 函数的声明 在C语言中,除了main函数外,用户所定义的函数遵循
“先定义、后使用”的规则。当把函数的定义放在调用之后, 应该在调用之前对函数进行声明,即在所调用的函数之后定义, 则在调用函数之前需要对被调函数进行声明。
第5单元 函 数
(2) 调用的函数仅仅是完成某些操作而不返回函数值,这 时函数的调用可以作为一条独立的语句。
【例5-4】 读程序,理解无返回值的函数调用。
#include <stdio.h> void function() {
printf(“Hello,World!\n”); } main() {
{
int z;
/* 求得的最大公约数用z存放 */
实现函数功能的语句
return (z);
/* return语句带回返回值 */
}

《C语言程序设计》第5章数组、字符串、指针

《C语言程序设计》第5章数组、字符串、指针

相当于声明了5个整型变量
说明: ① 数组的所有元素的数据类型都是相同的。 ② 数组取名规则应符合标识符的规定,数组 名不能与同一函数中其它变量名相同: int a; float a[10]; 是错误的。
③ C语言中规定数组的下标从0开始,方括号 中常量表达式表示数组元素的个数。
④ 不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式。例如: int n=5,a[n]; 是错误的。
二维数组在内存的存放顺序是“先行后列”
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0]

a[2][3]
5.3.2 二维数组元素的引用
二维数组的元素的引用形式为: 数组名[下标][下标] 使用二维数组的情况举例: 学生多门功课的成绩,如: a[100][3]可以用来记录100个学生3门功 课的成绩。 矩阵,如: a[3][3]可以用来记录3×3的矩阵。一个 数组元素正好存放一个矩阵的元素。
5.2.2 一维数组的初始化
1、数组声明时初始化 在编译阶段进行的。这样将减少运行时间, 提高效率。 数组初始化的一般形式为: 类型符 数组名[常量表达式]={值,值…值}; 例如: int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于a[0]=0; a[1]=1;... a[9]=9;

a[9]
#include <stdio.h> 声明有10个元素 void main() 的一维数组a {int n,i; float s=0, ave, a[10]; a[0] a[1] … a[9] for(i=0;i<10;i++) a[i] { scanf("%f",&a[i]); a[i] s=s+a[i]; } ave=s/10; for(i=0;i<10;i++) a[i] a[i] if (a[i]>ave) printf("%f ",a[i]); }

C语言程序设计教程 第五章 课后习题参考答案

C语言程序设计教程 第五章 课后习题参考答案

C语言程序设计教程第五章课后习题参考答案一、选择题1. B2. A3. C4. B5. D二、填空题1. while2. binary3. 164. 35. continue6. global三、判断题1. 错误2. 正确3. 错误4. 错误5. 正确四、编程题1.```c#include<stdio.h>int main() {int num;printf("请输入一个整数:"); scanf("%d", &num);if (num % 2 == 0) {printf("%d是偶数\n", num); } else {printf("%d是奇数\n", num); }return 0;}```2.```c#include<stdio.h>int main() {int num1, num2;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);printf("%d与%d的和为%d\n", num1, num2, num1 + num2); return 0;}```3.```c#include<stdio.h>int isPrime(int num) {int i;if (num <= 1)return 0;for (i = 2; i <= num / 2; i++) {if (num % i == 0) {return 0;}}return 1;}int main() {int num;printf("请输入一个整数:");scanf("%d", &num);if (isPrime(num)) {printf("%d是素数\n", num); } else {printf("%d不是素数\n", num); }return 0;}```4.```c#include<stdio.h>int factorial(int num) {int i, result = 1;for (i = 1; i <= num; i++) {result *= i;}return result;}int main() {int num;printf("请输入一个整数:");scanf("%d", &num);printf("%d的阶乘为%d\n", num, factorial(num)); return 0;}```五、简答题1. C语言逻辑与运算符(&&)短路特性是什么?答:C语言逻辑与运算符(&&)具有短路特性,即在进行逻辑与运算时,如果前一个表达式的值为假(0),则后面的表达式将不会被计算,整个逻辑与表达式的值直接为假(0)。

四川大学《c语言程序设计》课件-第5章 函数

四川大学《c语言程序设计》课件-第5章 函数

用void定义参数 ,表示没有参数
void 函数名(void)
{ 声明语句序列 可执行语句序列 return ;
}
return语句后无需 任何表达式
【例】 计算整数n的阶乘n!
/* 函数功能: 用迭代法计算n!
返回值函数类入型口参数:函整数型名变量说n明表示阶乘的形阶参数表,函
函数返回值: 函返数回的n!功的能值
函数定义(Function definition)
返回值 类型
函数名标识符, 说明运算规则
参数表相当于 运算的操作数
类型 函数名(类型 参数1, 类型 参数2, ……)
{ 声明语句序列
可执行语句序列 return 表达式;
}
函数出口
返回运算的结果
函数定义(Function definition)
因变量
函数名
自变量
程序设计中的函数
程序设计中的函数不局限于计算 –计算类,如打印阶乘表的程序…… –判断推理类,如排序、查找……
问题的提出
读多少行的程序能让你不头疼? 假如系统提供的函数printf()由10行代码替换,那么你编过的程 序会成什么样子?
–实际上一个printf()有上千行代码 main()中能放多少行代码? 如果所有代码都在main()中,怎么团队合作? 如果代码都在一个文件中,怎么团队合作?
C程序的存储类别 – auto型(自动变量) – static型(静态变量) – extern型(外部变量) – register型(寄存器变量)
变量的存储类型( Storage Class)
变量的生存期(Lifetime )
The lifetime of a variable is the period of time during which memory is allocated to the variable

C语言程序设计(第3版)何钦铭-颜-晖-第5章--函数

C语言程序设计(第3版)何钦铭-颜-晖-第5章--函数

第5章函数【练习5-1】使用函数求1到n之和:输入一个正整数n,输出1〜n之和。

要求自定义和调用函数sum(n)求1〜n之和。

若要计算m〜n(m<n)之和,又该如何定义函数?试编写相应程序。

解答:#include<stdio.h>intsum(intn);intmain(void){intn;intsum;printf("Entern:")scanf("%d",&n);printf("sum=%d\n",sum(n));return0;}intsum(intn){intresult,i;result=0;for(i=1;i<=n;i++)result=result+i;returnresult;}若要计算m〜n(m<n)之和,则需要在main()中定义2个变量m和n:scanf("%d%d",&m,&n);printf("sum=%d\n",sum(m,n));同时在函数定义时需设置2个形参:intsum(intm,intn){intresult,i;result=0;for(i=m;i<=n;i++)result=result+i;returnresult;}【练习5-2】使用函数找最大值:输入2个数,输出其中较大的数。

要求定义和调用函数max(a,b)找出并返回a、b中较大的数。

试编写相应程序。

解答:#include<stdio.h>doublemax(doublea,doubleb);intmain(void)inta,b;printf(“Inputaandb:”);scanf("%lf%lf",&a,&b);printf("max=%lf\n",max(a,b));return0;}doublemax(doublea,doubleb){if(a>b)returna;elsereturnb;}【练习5-3】数字金字塔:输入一个正整数n,输出n行数字金字塔。

C语言程序设计第5章“使用指针参数交换两个变量值”案例

C语言程序设计第5章“使用指针参数交换两个变量值”案例

使用指针参数交换两个变量值”案例C主讲教师崔玲玲 5.1 “【案例说明】用函数实现两个变量值的交换使其在主调函数和被调函数中的值一致。

要求用指针变量作为函数参数。

程序运行结果如图 5.1所示。

图 5.1 使用指针参数交换两个变量值【案例目的】 1 熟悉如何定义指针变量掌握将指针变量作为函数参数的方法。

2 掌握通过指针参数由被调函数向主调函数传递多个值的方法。

【技术要点】由于变量的值始终存放在内存单元中因此要交换两个变量的值只需交换这两个变量对应的存储单元的值即可这就需要知道两个变量的地址。

也就是说需要保证主调函数与被调函数中所要交换的两个数的内存单元是同一内存单元即传递的参数是内存单元的地址而不是内存单元中的值。

【相关知识及注意事项】1. 指针和地址2. 指针变量的定义及初始化3. 指针变量的赋值4. 指针变量的引用 5. 指针作为函数参数 5.2 “有序数列的插入”案例【案例说明】用指针法编程插入一个数到有序数列中。

程序运行结果如图 5.7所示。

图 5.7 有序数列的插入【案例目的】 1 熟悉如何定义指针变量掌握将指针变量指向一维数组元素的方法。

2 掌握如何在一个有序的数列中查找合适的位置。

3 掌握如何将一个数插入到一个有序数列中。

【技术要点】 1 有序数组中插入一个数的关键是找到该数据插入的位置然后将插入位置及其后的所有元素均后移一位在空出的位置放入待插入的数据。

例如在13、27、38、49、65、76、97这列有序数据中插入53这个数成为新的有序数列13、27、38、49、53、65、76、97。

2 定义数组时必须多开辟一个存储单元用于存放待插入的数据。

【相关知识及注意事项】1. 指针变量的运算 2. 指针与一维数组 5.3 “两个字符串首尾连接”案例【案例说明】编写程序将两个字符串首尾连接起来。

要求用字符指针变量处理。

程序运行结果如图 5.9所示。

图 5.9 两个字符串首尾连接【案例目的】 1 学会定义基类型为字符型的指针变量并将指针变量指向串首的操作。

C语言课件-第5章 函数 湘潭大学上课课件

C语言课件-第5章  函数 湘潭大学上课课件

为什么要用函数
解决的方法:用模块化程序设计的思路
采用‚组装‛的办法简化程序设计的过程 事先编好一批实现各种不同功能的函数 把它们保存在函数库中,需要时直接用
为什么要用函数
解决的方法:用模块化程序设计的思路
函数就是功能 每一个函数用来实现一个特定的功能 函数的名字应反映其代表的功能
b
g h
c
i
为什么要用函数
可以使用库函数
可以使用自己编写的函数 在程序设计中要善于利用函数,可以减少
重复编写程序段的工作量,同时可以方便 地实现模块化的程序设计
C语言中的函数
0个或多个数据被传递
参数
函数体
至多一个数据或结构被返回
C语言中的函数
math.h中提供的函数(库函数)
double sqrt(double x)
//函数定义 int firstDigit (int num) { return (num % 10); }
digit = firstDigit (number); printf("\nLeast significant digit is: %d\n", digit); return 0; } // main
带参数的void函数:void getnum(int a) 有返回值但不带参数的函数:int caculate() 有返回值且带参数的函数:int max(int a,int b)
函数使用(调用)
greeting();
getnum(10); Result=caculate();
a
200 100

x
200 100
void TryToChange(int x) { x = x * 2; }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2)作用: 返回表达式的值,结束函数执行,并将控制转移到调用函 数的地方继续执行。
完整版ppt
7
5.函数的原型说明
在C++程序中,当函数定义在前、函数调用在后时, 程序能被正确编译执行。而当函数调用在前、函数定义 在后时,则应在主调函数中增加对被调函数的原型说明。
(1)函数原型说明的格式:
<类型> <函数名>(<形参表>); 或:<类型> <函数名>(<形参类型说明表>);
完整版ppt
15
一维数组作为函数参数
(3)实参与形参的传送方式:传地址
当数组作为函数参数,在调用函数时,系统并 没有为形参数组重新分配内存空间,而是将实参
第5章 函数
目的与要求 5.1 函数的定义和调用 5.2 函数的嵌套调用和递归调用 5.3 数组作函数参数(习题课) 5.4 变量的存储类型 5.5 内联函数 5.6 具有默认参数值的函数 5.7 函数的重载 本章小结
完整版ppt
1
目的与要求
通过本章学习,应理解函数的概 念,熟练掌握函数的定义和调用方法, 理解函数调用时实参和形参间数据的 传递方法。理解函数递归的概念,初 步掌握递归的使用方法,理解变量的 作用域和存储类型的概念,了解内联 函数与函数重载的概念。
(2)函数原型说明的作用:
告诉编译程序,函数返回值的类型、参数个数和各参 数类型。
【例5.3.2】用自定义函数求三个整数的最大值。 例程
完整版ppt
8
5.1.4 实参与形参的数据传送
在C++中,实参和形参间数据传送的方式有三种: 值传送、传地址和引用传送。先介绍值传送方式。
值传送过程: (1)调用函数时,先为形参分配存储单元,后将实 参值传递给形参; (2)函数执行过程中均为形参参与运算; (3)函数调用后,形参所对应的存储单元被释放, 实参保持原来的值不变。 【例5.4】 定义变量交换函数swap(),将两个整型变量
1.函数的定义格式
函数定义的一般格式为: 〔类型〕<函数名>(<形参表>) {<函数体> }
(1)类型 (2)函数名 (3)形参表:<类型> <形参名1>,<类型> <形参名2>… (4)函数体{}:由一系列语句组成。
空函数的定义格式为: 〔类型〕<函数名>(void){ }
完整版ppt
4
2.函数的形参
(3)递归约束条件: n≥0
例程
完整版ppt
12
递归
3.递归两个阶段
(1)递归阶段:将原问题不断分解为新的子问题,逐渐 从未知向已知推进,最终达到已知的条件,即递归结束条 件,此时递归阶段结束。
(2)回推阶段:从已知的条件出发,按照递归的逆方向, 逐一求值回推,最后达到递归的开始处,结束回推阶段, 从而完成整个递归调用过程。 【例5.7】 用递归法求裴波那契数列的前20个数,要求每行
f2函数
调用f函数 函数的直接递归调用
调用f2函数
调用f1函数
函数的间接递回调用
完整版ppt
11递归Βιβλιοθήκη 例【例5.6】 用递归法求n!。
分析:用递归方法求n!的公式为:
1
n=0
n!=
1
n=1
n*(n-1)! n>1
在利用递归求值时,必须注意三点:
(1)递归公式: n*(n-1)!
(2)递归结束条件: n=0或1
例程
cm
n
完整版ppt
10
5.2.2 函数的递归调用
函数递归调用定义:在函数体中出现直接或间接地调用 该函数本身的调用关系称为函数的递归调用。
1.直接递归:在函数f的定义过程中出现调用函数f。 2.间接递归: 在函数f1的定义过程中调用函数f2,而在
函数f2的定义过程中又调用了f1函数。
f函数
f1函数
完整版ppt
2
5.1 函数的定义和调用
5.1.1 函数的概念
函数概念:具备特定功能的独立程序段。
函数包括标准函数和自定义函数。
【例5.1】 在主函数中调用标准函数sin(x)与自
定义函数f(x)。
例程
通常将调用f(x)的函数(main())称为主调
函数,而将f(x)称为被调函数。
完整版ppt
3
5.1.2 函数的定义
完整版ppt
6
函数调用方式
(2)函数表达式
函数调用出现在一个表达式中,此时要求函数有确定的返回 值以便参与表达式的运算。
(3)函数参数
函数调用作为一个函数的实参。
【例5.3.1】用自定义函数求三个整数的最大值。 例程
4.函数返回语句return
(1)格式: return <表达式>; 或:return (<表达式>);
输出4个数。 例程
完整版ppt
13
5.3 数组作函数参数(习题课)
5.3.1 数组元素作函数实参
传送方式:值传送。
【例5.8】定义显示变量值函数print(),用 数组元素作函数实参,输出数组元素值。
例程
【例5.9】定义判素数的函数prime(),用
数组元素作函数实参,判断数组各元素
值是否为素数。若不是素则清0。最后输
出数组中的素数。
例程
完整版ppt
14
5.3.2 数组名作函数参数
1.一维数组作为函数参数
(1)函数定义格式 <类型><函数名>(<类型><数组名>[长度],…) { 函数体}
说明:对于一维数组而言,函数定义中的数组长度可省略。
(2)函数调用格式 函数名(数组名,…)
注意:实参数组名后不能加“[]”。
交换数据后输出。 例程
完整版ppt
9
5.2 函数的嵌套调用和递归调用
5.2.1 函数的嵌套调用
(1)函数不允许嵌套定义:即不允许在函数内再定义函数。 (2)函数可以嵌套调用:即在被调用函数体内又调用另一
个函数。
main函数
a函数
b函数
调用a函数
调用b函数
结束
返回
返回
函数的嵌套调用
【例5.5】 编写C++程序,求组合数 的值。
1.函数调用格式
函数调用的一般格式为: <函数名>(<实参表>)
其中,实参表的一般格式为: <实参1>,<实参2>, …
2.函数的实参
(1)实参为能求值的表达式 (2)实参和形参的类型应兼容
3.函数的三种调用方式
(1)函数调用语句。函数调用语句的一般格式为:
<函数名>(实参表); 此时不要求函数有返回值,只要求函数完成一定的操作。
(1)函数可以没有形参,则形成无参函数。在定义无参函
数时,形参表应该写成void。
无参函数的定义格式为:
〔类型〕<函数名>(void) {<语句序列> }
【例5.2】 无参函数的实例。 (2)C++对形参的个数没有限制。
例程
(3)必须依次说明每一个参数的数据类型。
完整版ppt
5
5.1.3 函数的调用
相关文档
最新文档