二级c语言第八章 函数
C语言程序设计第8章 函数简明教程PPT课件

8.1 函数的概念与定义
程序运行情况如下: Enter a and b:10 20
The max is 20
计算机科学与技术学院—— C语言程序设计
8.1 函数的概念与定义
(2)函数名类似于其它的标识符,其命名规则也与其它 标识符相同。 (3)形式参数列表(formal parameter list)用来描述 函数所需要的参数个数及其类型,它的基本形式为: (类型名1 参数名1, 类型名2 参数名2, …, 类型名n 参 数名n) 如上例中的(int x, int y)。函数的参数是函数与它的主 调函数之间发生数据交换的一个通道,即被调函数通过参 数的方式建立起它与主调函数之间所需的信息交换的一种 途径。如果函数没有形式参数,则在定义时括号内可以为 空,但最好写上void。
计算机科学与技术学院—— C语言程序设计
8.1 函数的概念与定义
函数Max()的返回值由函数体中的return语句获得。 函数也可以没有返回值类型,此时,我们最好把没有返 回值类型的函数定义成void类型,这时,函数体中的 return语句可以不写,也可以只写上return语句: return; 。
C程序的这种组成结构,反映了一种结构化程序设计的思想。 一个程序可以分解为多个模块,每个模块可以实现一定的功能。 如果一个模块过于复杂,就可以进行再分解,直到分解出来的 模块足够简单,可以方便实现为止。这种结构化的程序设计思 想,体现出一种“分而治之”(devided and conquer)的哲 学理念,也是我们日常处理事情的一种典型方法。
程序设计者,只在库函数不能满足需要的时候,才需要自己 来创建所需要的函数(自定义函数)。读者学完本章之后, 就应该能自定义一些自己所需要的函数并能正确使用它们, 当然也要学会正确使用系统提供的大量的标准库函数。有 关库函数的详细情况和使用方法可以参考附录和其它相关 资料。
计算机二级c语言函数

29
函数的递归调用
在调用一个函数的过程中又出现之间或间接调 用该函数本身,称为递归调用 为了防止无终止的调用本身,应该用if语句或 switch等加以控制,到达某一条件时,用 return语句停止调用
30
递归调用实例
#include <stdio.h> sub(int n) { int a; if(n==1) return 1; a= n+sub(n-1); return(a); }
void main() { int z = fun2(1,2); printf(“%d\n”,z); }
嵌套调用
14
#include <stdio.h> fun2(int x,int y) { fun(int x,int y) { int z=x+y; return z;} int z=x+y+fun(x,y); return z; } void main() { int z = fun2(1,2); printf("%d\n",z); }
24
#include <stdio.h> add() { int x=0; x+=1; printf("%d",x); }
main() { add(); add(); add(); }
1 1 1
25
#include <stdio.h> add() { static int x=0; x+=1; printf("%d",x); }
C语言专用版PPT--《函数》

说明:
1. 定义函数时,形参不占内存单元 ; 调用函数时,形参才分配内存单元 ; 调用结束后,形参所占内存单元被释放。 2. 实参可以是常量、变量或表达式,但必须有确 切的值。 3. 定义函数,必须指明形参类型。 4. 实参与形参类型一致。 5. 实参变量对形参变量的数据传递是“值传递 ”, 即 单向 传递。 6. 可在“形参表列”中说明形参类型。 int max( int x , int y ) { 函数体 }
第8章 函数
8.1 概述 程序结构概念 : 1)较大的程序应分为若干个程序模块 ; 2)每个模块实现单一的特定功能; 3)由主函数开始执行,主函数调用子函数; 4)子函数之间可以互相调用。
说明 : 一个源文件可由一个或多个函数组成; 一个源文件是一个编译单位; 一个 C 程序由一个或多个源文件组成。 从 main() 开始,调用其它函数后, 回到 main() 结束 ; 5. 不能嵌套定义,但可互相调用 。 6. 分类 : 1) 标准函数 和 用户自定义函数 ; 2) 无参函数 和 有参函数 。 1. 2. 3. 4.
8.3.2 函数的返回值
说明 : 1. 通过 return 语句获得返回值 ;
2. 定义函数时指定函数返回值的类型;不加类型说明
的,按整型处理。
3. 函数值的类型和 return 语句中表达式的值不一
致时,以函数类型为准。 4. 被调用函数中没有 return 语句时,带回一个不
确定的值。
5. 为了明确表示“不带回值”,可以用“ void ” 定
函数定义
函数定义是指对函数功能的确 立,包括指定函数名、函数值 类型、形参个数及类型、函数 体等。它是一个完整、独立的 程序单位。
例2: float add(x,y) float x,y; { float z; z=x+y; return(z); }
C语言课后习题答案第八章解析

作业八:函数程序设计答案{ double z; z 二x+y; return z; }(重要)3.以下正确的说法是A_°在C 语言中A)B) C) D)4.若调用一个函数,且此函数中没有return 语句,则正确的说法是D_。
没有返回值返回若干个系统默认值 能返回一个用户所希望的函数值 返回一个不确定的值(重要)5. 以下不正确的说法是B_° C 语言规定A) B)C) D)6. C 语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是隹^A) B) C) D)7.以下程序有语法性错误,有关错误原因的正确说法是C_。
main()(一)选择丿 (30分) 1.以下正确的函数定义形式是 A) B)C) D) double double double double fun (int x, int fun (int x;int fun (int x, intfun(int x, y);y) y) y); 2.以下正确的函数形式是D_。
A) B) C) D) double fun (int x, int { z 二x+y; return z; } fun (int x, y){ int z: return z; } fun (x, y){ int x,y; double z;double fun (int x, inty) z 二x+y; return z; } y)实参和与其对应的形参各占用独立的存储单元 实参和与其对应的形参共占用一个存储单元 只有当实参和与其对应的形参同名时才共占用存储单元 形参是虚拟的,不占用存储单元该函数A) B) C) D)实参可以是常量、变量或表达式 形参可以是常量、变量或表达式 实参可以为任意类型形参应与其对应的实参类型一致 地址传递 单向值传递山实参传给形参,再山形参传回给实参 由用户指定传递方式int G=5, k;void Prt.char ();k=Prt_char(G);}A)语句void prt.char ();有错,它是函数调用语句,不能用void 说明B)变量名不能使用大写字母C)函数说明和函数调用语句之间有矛盾D)函数名不能使用下划线8.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是A)float 型B)int 型C)long 型D)double 型9.C语言规定,函数返回值的类型是Lil D_oA)return语句中的表达式类型所决定B)调用该函数时的主调函数类型所决定C)调用该函数时系统临时决定D)在定义该函数时所指定的函数类型所决定10.下面函数调用语句含有实参的个数为」func((expl,exp2), (exp3,exp4,exp5));A) 1 B) 2 C) 4 D) 5 (重要)11.以下程序的功能是计算函数F(x, y, z)二(x+y)/(x-y) + (z+y)/(z-y)的值,请选择填空。
C语言课件教学-第8章-函数

• main( )
• { int a=3, b=5;
• void swap( int , int );
• swap (a, b); • printf(“a=%d,
b=%d\n”, a, b);
调用 Main()函数:
•} • void swap (int x, int y)
像调用库函数 一样调用
函数定义
8.3 函数参数和函数的值
8.3.1 形式参数与实际参数
在调用函数时,大多情况下,主调与被调函 数间有数据传递关系,这就是有参函数。在定义 函数时,函数名后面括号中的变量名称为“形式 参数”,在主调函数中调用一个函数时,函数名 后面括号中的参数(可以是表达式)称为“实际 参数”。
}
max(x,y) int x, y; { int z;
z=x>y ? x : y; return(z); }
/ x, y为形式参数/
说明: 1)形参变量在被调用前不占用存储单元;在被调用结束 后,
形参所占存储单元亦被释放。因此,形参只有在该函数 内有效。调用结束,返回调用函数后,则不能再使用该 形参变量。
如:main( )
{
…
double new_style ( int, double ); /*函数声明*/
…
}
Double new_style (int a, double x) /*函数定义*/
{
…
}
说明:
1)类型标识符 被调函数名( );这种声明形 式也是合法的,但不提倡。
2)如果被调函数为自定义函数且其定义 在主调函数定义之前,则在主调函数中可 不必说明其类型。因为编译程序已知道其 类型。
全国计算机等级考试二级教程--C语言程序设计课后习题答案

《全国计算机等级考试二级教程--C语言程序设计》课后习题答案第一章1.1 EXE1.2 C OBJ EXE1.3 顺序选择循环第二章一. 选择题2.1 B 2.2 D 2.3 B 2.4 A 2.5 C 2.6 A 2.7 B2.8 B 2.9 D 2.10 C 2.11 B 2.12 B 2.13 A二. 填空题2.14 11 122.15 4.2 4.22.16 { } 定义执行语句2.17 关键字用户标识符2.18 int float double2.19 float a1=1; float a2=1;2.20 存储单元2.213.52.22 (a*b)/c a*b/c a/c*b2.23 把常量10赋给变量s2.24 位1或0三. 上机改错题2.28#include "stdio.h"; 删除行尾的";"main(); / * main function * / 删除")"后的";",注释中的*要紧靠“/”,即应为“/*”和“*/”函数开始处遗失了一个“{”float r,s ; /*/*r is radius*/,/* s is area of circuilar*/*/ 注释符号不可嵌套使用r = 5.0 ;s = 3.14159 * r * r ;printf("%f\n",s) 行尾遗失了“;”函数结束处遗失了一个“}”2.29#include "stdio.h"main /* main function */ main后遗失了“()”{float a,b,c,v; /*a,b,c are sides, v is volume of cube */a=2.0; b=3.0; c=4.0 行尾遗失了“;”v=a*b*c;printf("%f\n", v) 行尾遗失了“;”}第三章一.选择题3.1 C 3.2 C 3.3 D 3.4 C 3.5 D 3.6 B 3.7 C 3.8 D 3.9 A 3.10 B3.11 C 3.12 D 3.13 D 3.14 A 3.15 C 3.16 C 3.17 C 3.18 无答案3.19 C 3.20 B二. 填空题3.21 (1)-2002500(2)i=-200,j=2500(3)i=-200j=25003.22 12 0 03.23 一条语句;3.24 ;3.25 100,25.81,1.89234 100 25.81 1.89234 100 25.81 1.89234 3.26 x=127,x= 127,x= 177,x= 7f,x= 1273.27 x=127,x=127 ,x=$127 ,x=$000127,x=%06d3.28 a=513.789215,a= 513.79,a= 513.78921500,a= 513.78921500三. 编程题和改错题3.29 修改后的程序如下:main(){double a,b,c,s,v;printf("input a,b,c:");scanf("%lf%lf%lf",&a,&b,&c);s =a*b;v=a*b*c;printf("a=%f,b=%f,c=%f\n", a,b,c);printf("s=%f,v=%f\n",s,v);}3.30#includemain(){int a=560,b=60;printf("560 minute is %d hour and %d minute.\n",a/b,a%b);}3.31#includemain(){int a,b;a=1500;b=350;printf("a div b is : %d\n",a/b);printf("a mod b is : %d\n",a%b);}3.32#includemain(){double a,b,c,ave;printf ("input 3 double number : \n");scanf ("%lf%lf%lf",&a,&b,&c);printf ("%.1f\n",(a+b+c)/3);}3.33#includevoid main(){int a,b,c,t;printf("请依次输入整数a,b,c:");scanf("%d%d%d",&a,&b,&c);printf("\n你输入的值是: a=%d,b=%d,c=%d\n",a,b,c);t=b;b=a;a=c;c=t;printf("交换之后的值是:a=%d,b=%d,c=%d\n",a,b,c);}第四章一. 选择题4.1 A 4.2 A 4.3 A 4.4 D 4.5 C 4.6 A 4.7 B 4.8 C 4.9 D 4.10 C二. 填空题4.11 非0 04.12 < > >= <=同级== !=同级4.13 ! && ||4.15 !4.16 a == b || a < c x > 4 || x < -44.17 14.18 x <= 0 1 > 04.19 3 2 24.20 *#三. 编程题4.21 略4.22#include/* 检查日期的合法性*/int checkdate(int year, int month, int day){if(year < 1900 || year > 2005){printf("输入的年份无效!\n");return 0;}else if(month < 0 && month > 12){printf("输入的月份无效!\n");return 0;}else if(day <= 0 && day > 31){printf("输入的日期无效!\n");return 0;}else{switch(month){case 4:case 6:case 9:case 11:if(day > 30){printf("输入的日期无效!\n");return 0;}break;case 2:if((year%4 == 0 && year%100 != 0) || year%400 == 0){if(day > 29){printf("输入的日期无效!\n");return 0;}}else{if(day > 28){printf("输入的出生日期无效!\n");return 0;}}break;}/* end of switch(m0)*/}return 1;}void main(){int y0, m0, d0; /* 生日*/int y1, m1, d1; /* 当前日期*/int years, months, days; /* 实足年龄*/printf("请输入学生的生日:"); scanf("%d%d%d", &y0,&m0,&d0);if(checkdate(y0, m0, d0)){printf("请输入当前日期:");scanf("%d%d%d", &y1,&m1,&d1);/*当前日期合法性检查*/if(!checkdate(y1, m1, d1)){return;}else if(y0 > y1){printf("出生年份比当前年份晚!\n"); return;}else if(y0 == y1){if(m0 > m1){printf("出生年月比当前年月晚!\n"); return;}else if(m0 == m1){if(d0 > d1){printf("出生年月日比当前年月日晚!\n"); return;}}}}/* 计算实足年龄*/years = y1 - y0;months = m1 - m0;days = d1 - d0;/* 修正实足年龄天数*/if(days < 0){months--;switch(m1){case 1:case 5:case 7:case 10:case 12:days += 30;break;case 2:case 4:case 6:case 8:case 9:case 11:days += 31;break;case 3:if((y1%4 == 0 && y1%100 != 0) || y1%400 == 0){days += 29;}else{days += 28;}break;}/* end of switch(m1) */}/* end of if(days < 0) *//* 修正实足年龄月数*/if(months < 0){months += 12;years--;}/* end of if(months < 0) */printf("出生日期: %d年%d月%d日\n", y0, m0, d0);printf("当前日期: %d年%d月%d日\n", y1, m1, d1); printf("实足年龄: %d年%d月%d日\n", years, months, days);return;}4.23#includevoid main()int a;printf ("请输入一个整数:");scanf ("%d",&a);if (a%2==0){printf ("%d 是偶数\n", a);}else{printf ("%d 是奇数\n", a);}}4.24#includevoid main(){int a,b,c,temp,max;printf ("请输入三个整数:");scanf ("%d %d %d",&a,&b,&c);temp=(a>b)? a:b;max=(temp>c)? temp:c;printf ("\n");printf ("你输入的数中最大的是%d.\n",max); }4.25(1)不嵌套的if语句#includevoid main(){int x,y;printf("input x :");scanf("%d",&x);if ( x>-5 && x<0 ){printf("y is %d\n",y=x);}if ( x==0 ){printf("y is %d\n",y=x-1);if ( x>0 && x<10 ){printf("y is %d\n",y=x+1); }if ( x>=10 || x<=-5){printf("error\n");}}(2)嵌套的if语句#includevoid main(){int x,y;printf("input x :");scanf("%d",&x);printf("\n");if(x < 0){if(x > -5){printf("y is %d.\n",y=x); }else{printf("error!\n");}}if(0 == x){printf("y is %d.\n",y=x-1); }if(x > 0){if(x < 10){printf("y is %d.\n",y=x+1); }else{printf("error!\n");}}(3)if_else语句#includevoid main(){int x,y;printf("input x :");scanf("%d",&x);if( x>-5 && x<0 ){printf("y is %d.\n",y=x); }else if( x==0 ){printf("y is %d.\n",y=x-1); }else if( x>0 && x<10 ) {printf("y is %d.\n",y=x+1); }else{printf("error!\n");}}(4)switch语句#includevoid main(){int x,y;printf("input x : ");scanf("%d",&x);switch (x){case -4:case -3:case -2:case -1:printf("y is %d.\n",y=x); break;case 0:printf("y is %d.\n",y=x-1);break;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:printf("y is %d.\n",y=x+1);break;default:printf("error!\n");}}第五章一. 选择题5.1 D 5.2 C 5.3 B 5.4 C 5.5 C 5.6 B 5.7 D 5.8 A 5.9 D 5.10 D二. 填空题5.11 5 4 65.12 死循环5.13 -15.14 115.15 d=1.0 k++ k<=n5.16 x>=0 x三. 编程题5.17#includevoid main(){int i;int sig = 1;int sum = 0;for(i=1; i<=101; i++,i++){sum += sig*i;sig *= -1;}printf("sum=%d\n", sum);}5.18(1)#includevoid main(){int i;double m=1.0;double e = 1.0;for(i=1; i<50; i++){m *= i;e += 1/m;}printf("e=%f\n",e);}(2)#includevoid main(){int i=1;double m=1.0;double e = 1.0;while(1/m >= 0.0004){m *= i;e += 1/m;i++;}printf("e=%f\n",e);}5.19#includevoid main(){int year;int col = 0;for(year=1600; year<=2000; year++){if((year%4 == 0 && year%100 != 0) || year%400 == 0)printf("%d\t", year);col++;if(col%5 == 0){printf("\n");}}}printf("\n");}5.20#include#define N 7void main(){int i;int j;int m;int k = N/2;for(i=0; i {m = i-k;if(m < 0){m *= -1;}for(j=0; j {printf(" ");}for(j=0; j<2*(k-m)+1; j++){printf("*");}printf("\n");}}第六章一. 选择题6.1 B 6.2 D 6.3 A 6.4 A 6.5 B 6.6 D 6.7 D 6.8 B 6.9 A 6.10 A 6.11 C二. 填空题6.12 -16.13 16.14 ctype.h6.15 16.16 10A 20B 30C 40D6.177.29 101.298AB6.18 A7.29B101.2986.19 A B C (每个字符后有三个空格)三. 编程题6.20#include#define N 80void main(){char str[N];int iLoop = 0;gets(str);while(str[iLoop]){printf("%c-%d\t", str[iLoop],str[iLoop]); iLoop++;if(iLoop%3 == 0){printf("\n");}}printf("\n");}6.21#include#define N 80void main(){char str[N];int num = 0;int iLoop = 0;gets(str);while(str[iLoop]){if(str[iLoop] >= '0' && str[iLoop] <= '9') {num = 10*num + (str[iLoop] - '0');iLoop++;}printf("%d\n",num);}6.22#include#include#define N 80void main(){char str[N];int num = -1;do{gets(str);num++;}while(strcmp(str, "EOF"));printf("您输入了%d行字符!\n",num);}6.23#include#define N 80void main(){char str[N];int iLoop = 0;int num = 0;gets(str);while(str[iLoop] && iLoop < N){if(str[iLoop] >= 'a' && str[iLoop] <= 'z'){num++;}iLoop++;}printf("您输入了字符中有%d个小写字母!\n",num); }#includevoid main(){int line;int iLoop1;int iLoop2;printf("请输入图案的行数(不大于26):");scanf("%d", &line);for(iLoop1 = 0; iLoop1 < line; iLoop1++){for(iLoop2 = 0; iLoop2 < line - iLoop1; iLoop2++) {printf(" ");}for(iLoop2 = 0; iLoop2 < 2*iLoop1+1; iLoop2++) {printf("%c",iLoop1 + 'A');}printf("\n");}}第七章一. 选择题7.1 C 7.2 C 7.3 B 7.4 C 7.5 A 7.6 D 7.7 A二. 填空题7.8 127.9 9.0000007.10 47.11 n=1 s7.12 <=y z*x7.13 1 s*i 0 f(k)三. 程序调试和编程题7.14fun(int n){ int k,yes;for(k=2; k<=n/2; k++){if(n%k == 0) { yes = 0; break;}}return yes;}7.15int mymod(int a, int b){return a%b;}7.16double fun(int n){double sum = 0;int iLoop;int sig = -1;for(iLoop=1; iLoop<=n; iLoop++) {sig *= -1;sum += sig*1.0/iLoop;}return sum;}7.17double fun(int n){double t = 1.0;int iLoop;long tmp;for(iLoop=2; iLoop<=n; iLoop++) {tmp = iLoop*iLoop;t -= 1.0/tmp;}return t;}7.18#include#includedouble fun(double x){return x*x + 5*x + 4;}{int x = 2;printf("y1=%f\n", fun(x));printf("y2=%f\n", fun(x+15));printf("y3=%f\n", fun(sin(x)));}第八章一. 选择题8.1 A 8.2 B 8.3 B 8.4 C 8.5 B 8.6 B 8.7 C 8.8 D 8.9 B 8.10 C 8.11 C 8.12 C二. 填空题8.13 1108.14 7 18.15 (1)char *p=&ch; (2) p=&ch; (3)scanf("%c",p); (4)*p='A'; (5)printf("%c",*p);8.16 (1)s=p+3; (2)s=s-2 (3)50 (4)*(s+1) (5)2 (6)10 20 30 40 50三. 编程题8.17void fun(double x, double y, double *sum, double *div){*sum = x + y;*div = x - y;return;}8.18void fun(double x, double y, double z, double *max, double *min){*max = x;*min = x;if(*max < y){*max = y;}if(*max < z){*max = z;}if(*min > y){*min = y;}if(*min > z){}return;}第九章一. 选择题9.1 D 9.2 A 9.3 A 9.4 C 9.5 C 9.6 A 9.7 B 9.8 D 9.9 C 9.10 C 9.11 C 9.12 D 9.13 D 9.14 A 9.15 A 9.16 A 9.17 C 9.18 C二. 填空题9.19 9 09.20 69.21 129.22 39.23 27219.24 -850,2,09.25 k=p k9.26 (c=getchar()) c-'A'三. 编程题9.27#include#define N 81int main(){int counter[10] = {0};int iLoop = 0;char str[N];gets(str);while(str[iLoop]){if(str[iLoop] >= '0' && str[iLoop] <= '9'){counter[str[iLoop] - '0']++;}iLoop++;}for(iLoop=0; iLoop < 10; iLoop++){printf("%d - %d\n", iLoop, counter[iLoop]);}return 0;}void fun(int array[], int arraysize, int start){int iLoop;if(start < arraysize-1){if(start <=0){start = 1;}for(iLoop = start; iLoop < arraysize; iLoop++){array[iLoop-1] = array[iLoop];}}for(iLoop = 0; iLoop < arraysize; iLoop++){printf("No.%d = %d\n", iLoop, array[iLoop]);}}9.29int fun(int arry1[], int arry2[], int arrysize){int iLoop;int counter = 0;for(iLoop = 0; iLoop < arrysize; iLoop++){if(arry1[iLoop] % 2){arry2[counter++] = arry1[iLoop];}}return counter;}9.30void fun(char array[], int arraysize){int iLoop1;int iLoop2;char temp;/* 冒泡排序*/for(iLoop1 = 0; iLoop1 < arraysize - 1; iLoop1++){for(iLoop2 = 0; iLoop2 < arraysize - 1 - iLoop1; iLoop2++)if(array[iLoop2] < array[iLoop2 + 1]){temp = array[iLoop2];array[iLoop2] = array[iLoop2 + 1];array[iLoop2 + 1] = temp;}}}}9.31#includevoid fun(int array[], int arraysize, int inertNumber) {int iLoop;int iLoop2;if(array[0] < array[arraysize-1]){for(iLoop = 0; iLoop< arraysize; iLoop++){if(array[iLoop] > inertNumber){for(iLoop2 = arraysize - 1; iLoop2 >= iLoop; iLoop2--) {array[iLoop2 + 1] = array[iLoop2];}array[iLoop] = inertNumber;break;}}if(iLoop >= arraysize){array[arraysize] = inertNumber;}}else{for(iLoop = 0; iLoop< arraysize; iLoop++){if(array[iLoop] < inertNumber){for(iLoop2 = arraysize - 1; iLoop2 >= iLoop; iLoop2--) {array[iLoop2 + 1] = array[iLoop2]; }array[iLoop] = inertNumber; break;}}if(iLoop >= arraysize){array[arraysize] = inertNumber;}}}int main(){int iLoop;int a[20] = {7,6,5,3,2,1};for(iLoop = 0; iLoop < 6; iLoop++) {printf("%d ", a[iLoop]);}printf("\n");fun(a, 6, 0);for(iLoop = 0; iLoop < 7; iLoop++) {printf("%d ", a[iLoop]);}printf("\n");fun(a, 7, 4);for(iLoop = 0; iLoop < 8; iLoop++) {printf("%d ", a[iLoop]);}printf("\n");fun(a, 8, 8);for(iLoop = 0; iLoop < 9; iLoop++) {printf("%d ", a[iLoop]);}printf("\n");return 0;}9.32int fun(int number, int array[]){int iLoop = 0;int iLoop2;int binLen;int midNumber;int div;int remain;midNumber = number;do{div = midNumber/2;remain = midNumber%2;midNumber = div;array[iLoop++] = remain;}while(midNumber);binLen = iLoop;for(iLoop2 = 0, iLoop = binLen - 1; iLoop2 < iLoop; iLoop2++, iLoop--) {midNumber = array[iLoop2];array[iLoop2] = array[iLoop];array[iLoop] = midNumber;}return binLen;}9.33#include#include#define N 15void fun(int array[], int arraysize){int x;int iLoop;int iLoop2;for(iLoop = 0; iLoop < arraysize; iLoop++){iLoop2 = 0;x = rand()%20;do{if(x == array[iLoop2] && iLoop > 0){x = rand()%20;iLoop2 = 0;}iLoop2++;}while(iLoop2 < iLoop);array[iLoop] = x;}}int main(){int a[N];int iLoop;fun(a, N);for(iLoop = 0; iLoop < N; iLoop++){printf("%d\n", a[iLoop]);}return 0;}第十章一. 选择题10.1 C 10.2 B 10.3 C 10.4 B 10.5 C 10.6 A 10.7 C 10.8 A 10.9 C 10.10 C二. 填空题10.11 GFEDCB10.12 XYZ10.13 SO10.14 1010.15 Itis10.16 strlen(str)-1 j--10.17 310.18 goodgood!三. 编程题10.19char* mygets(char *str){int iLoop = 0;char ch;while((ch=getchar()) != '\n')str[iLoop++] = ch;}str[iLoop] = '\0';return str;}char * myputs(char *str){int iLoop = 0;while(str[iLoop]){putchar(str[iLoop++]);}putchar('\n');return str;}10.20#include#includeint fun(char *str){int len;int iLoop1;int iLoop2;int result = 1;len = strlen(str);for(iLoop1 = 0, iLoop2 = len - 1; iLoop1 < iLoop2; iLoop1++, iLoop2--) {if(str[iLoop1] != str[iLoop2]){result = 0;break;}}return result;}int main(){char a[20] = "ABCDCBA";char b[20] = "ABCDEBA";printf("%d\n", fun(a));printf("%d\n", fun(b));return 0;}10.21char fun(char *str, int pos){int len;int iLoop;char ch;len = strlen(str);if(pos > len){return NULL;}ch = str[pos];for(iLoop = pos; iLoop < len - 1; iLoop++) {str[iLoop] = str[iLoop + 1];}str[len-1] = '\0';return ch;}第十一章一. 选择题11.1 D 11.2 B 11.3 A 11.4 C二. 填空题11.5 IJKLEFGHABCD11.6 711.7 811.8 *(s+j) i+1 i11.9 1711.10 (*fun)() (*fun)(a+i*h)/h mypoly三. 编程题11.11#include#include#define N 81int main(int argc, char **argv)char sig;int dig;int pos;char str[N] = {'\0'};char outStr[N] = {'\0'};if(argc < 2){sig = '-';dig = 10;}else{sig = argv[1][0];dig = argv[1][1] - '0';}printf("请输入一个字符串:"); gets(str);if(sig == '-'){pos = strlen(str) - dig;if(pos <= 0){pos = 0;}strcpy(outStr, str + pos);}else if(sig == '+'){strcpy(outStr, str);pos = strlen(outStr);if(pos > dig){pos = dig;}outStr[pos] = '\0';}printf("处理后的字串为:"); printf("%s\n", outStr);}11.12#include#includevoid movebin(char *bin){int len;int iLoop;len = strlen(bin);for(iLoop = len; iLoop > 0; iLoop--) {bin[iLoop] = bin[iLoop - 1];}return;}void fun(int n, char *bin){int pos;pos = strlen(bin);if(n == 0){return;}if(n == 1){movebin(bin);bin[0] = '1';return;}movebin(bin);bin[0] = (n%2) + '0';n /= 2;fun(n, bin);return;}int main(){int a = 4;char bin[50] = {""};printf("%s\n", bin);return 0;}11.13#includelong fun(int n){if(n == 1){return n;}else{return fun(n-1) + n;}}int main(){int num;int sum;printf("请输入一个自然数:"); scanf("%d", &num);sum = fun(num);printf("结果是:%d\n", sum);return 0;}11.14#includeint fun(int n){if(n == 0 || n == 1){return 1;}else{return fun(n-1) + fun(n-2);}}int main(){int num;int result;printf("请输入一个自然数:");scanf("%d", &num);result = fun(num);printf("斐波拉契级数为:%d\n", result);return 0;}第十二章一. 选择题12.1 B 12.2 B 12.3 A 12.4 C 12.5 D 12.6 B 12.7 A 12.8 A二. 填空题12.9 2,5,1,2,3,-212.10 2468第十三章一. 选择题13.1 A 13.2 C 13.3 B 13.4 C 13.5 D 13.6 D 13.7 D二. 填空题13.8 ar=9 ar=9 ar=1113.9 int* s *b三. 编程题13.10#define MYALPHA(C) ((C>='A' && C<='Z') || (C>='a' && C<='z')) ? 1 : 0 13.11#define SWAP(t,x,y) {t tmp; tmp=x; x=y; y=tmp;}13.12#include#includeint main(){int *p;int tmp;int iLoop;int iLoop2;p = (int *)malloc(sizeof(int)*3);scanf("%d%d%d", p,p+1,p+2);for(iLoop = 0; iLoop < 2; iLoop++){for(iLoop2 = 0; iLoop2 < 2 - iLoop; iLoop2++){if(*(p + iLoop2) > *(p + iLoop2 + 1)){tmp = *(p + iLoop2);*(p + iLoop2) = *(p + iLoop2 + 1);*(p + iLoop2 + 1) = tmp;}}}printf("%d %d %d\n", *p, *(p+1), *(p+2));free(p);p = NULL;return 0;}第十四章一. 选择题14.1 D 14.2 D 14.3 D 14.4 A 14.5 C 14.6 C 14.7 C 14.8 B二. 填空题14.9 struct link *next14.10 p->next m>p->data14.11 (struct list*) struct list struct list* struct list return h三. 编程题14.12#include#define N 3struct stud{char num[5], name[10];int s[4];double ave;};void readrec(struct stud array[], int size){int iLoop;for(iLoop=0; iLoop {scanf("%s%s%d%d%d%d", array[iLoop].num, array[iLoop].name, &array[iLoop].s[0], &array[iLoop].s[1],&array[iLoop].s[2], &array[iLoop].s[3]);array[iLoop].ave = (array[iLoop].s[0] + array[iLoop].s[1] +array[iLoop].s[2] + array[iLoop].s[3])/4.0;}return;}void writerec(struct stud array[], int size){int iLoop;for(iLoop=0; iLoop{printf("%s\t%s\t%d\t%d\t%d\t%d\t%f\n",array[iLoop].num,array[iLoop].name,array[iLoop].s[0],array[iLoop].s[1],array[iLoop].s[2],array[iLoop].s[3],array[iLoop].ave);}return;}int main(){struct stud stu[N];readrec(stu, N);writerec(stu, N);return 0;}14.13#include#include#define N 100struct node{int data;struct node* next;};int seekMaxValue(struct node *pNode){int max;struct node* pMove;pMove = pNode;max = pMove->data;pMove = pMove->next;while(pMove){if(max < pMove->data){max = pMove->data;}pMove = pMove->next;}return max;}struct node* seekMaxValueAddress(struct node *pNode) {int max;struct node* maxAddress;struct node* pMove;pMove = pNode;max = pMove->data;maxAddress = pMove;pMove = pMove->next;while(pMove){if(max < pMove->data){max = pMove->data;maxAddress = pMove;}pMove = pMove->next;}return maxAddress;}int main(){struct node* head;struct node* pNode;int iLoop;head = (struct node*)malloc(sizeof(struct node)); pNode = head;pNode->next = NULL;for(iLoop=0; iLoop {pNode->next = (struct node*)malloc(sizeof(struct node)); pNode = pNode->next;pNode->next = NULL;pNode->data = iLoop;}printf("%d\n", seekMaxValue(head->next));printf("%d\n", seekMaxValueAddress(head->next));return 0;}第十五章一.选择题15.1 D 15.2 A 15.3 B 15.4 A二. 填空题15.5 1111000015.6 a^a15.7 a|0xffff15.8 x|0xff0015.9 a=(012500>>2)15.10 ch|0x20第十六章一. 选择题16.1 B 16.2 C二. 填空题16.3 3 !feof(f1) f2 fclose(f1) fclose(f2)16.4 fopen(fname,"w") ch16.5 "r" !feof(fp) fgetc(fp)16.6 CCCCBBBBAAAA三. 编程题#include#define N 10#define LEN 81int main(){char *str[N] = {"AAAAAAAAA", "BBBBBBBBB", "CCCCCCCCC", "DDDDDDDDD", "EEEEEEEEE", "FFFFFFFFF", "GGGGGGGGG", "HHHHHHHHH","IIIIIIIII","JJJJJJJJJ"};char str2[N][LEN];FILE *fp;int iLoop;fp = fopen("str.txt", "w");if(fp == NULL){printf("创建文件失败!\n"); return 1;}else{for(iLoop = 0; iLoop < N; iLoop++) {fputs(str[iLoop], fp);fputs("\n",fp);}}fclose(fp);fp = fopen("str.txt", "r");if(fp == NULL){printf("打开文件失败!\n"); return 1;}elsefor(iLoop = 0; iLoop < N; iLoop++){fgets(str2[iLoop], LEN - 1, fp);}}fclose(fp);for(iLoop = 0; iLoop < N; iLoop++){printf("%s", str2[iLoop]);}return 0;}16.8#include#define N 10int main(){float num;int iLoop;FILE *fp;fp = fopen("num.bin", "wb+");if(fp == NULL){printf("创建文件失败!\n");return 1;}/* 从键盘读入10个数并写文件*/printf("请输入%d个数:", N); for(iLoop = 0; iLoop < N; iLoop++){scanf("%f", &num);fwrite(&num, sizeof(num), 1, fp);}/* 文件指针回到开始处*/rewind(fp);/* 从文件读出10个数并显示*/for(iLoop = 0; iLoop < N; iLoop++){fread(&num, sizeof(num), 1, fp);printf("%f\n", num);/* 移文件指针到第四个数开始处*/fseek(fp, 3L*sizeof(num), SEEK_SET);/* 读入一个新数据*/printf("请输入一个新数据:"); scanf("%f", &num);fwrite(&num, sizeof(num), 1, fp);/* 文件指针回到开始处*/rewind(fp);/* 从文件读出10个数并显示*/for(iLoop = 0; iLoop < N; iLoop++){fread(&num, sizeof(num), 1, fp);printf("%f\n", num);} /* 关闭文件*/fclose(fp);return 0;}。
C语言课件第08章函数
(3)在定义函数时指定的函数类型一般应该和 return语句中的表达式类型一致。
指定函数值的类 型,即函数带回
{
声明部分 语句部分 }
来的值的类型。 例8.1中的 printstar和 print_message函 数为void类型,
表示不需要带回
函数值。
§8.2.2. 有参函数定义的一般形式
定义有参函数的一般形式为:
类型标识符 函数名(形式参数表列)
{
声明部分 语句部分 } 例如:
§8.1概述
一个较大的程序可分为 若干个程序模块,每一 个模块用来实现一个特 定的功能。在高级语言 中用子程序实现模块的 功能。子程序由函数来 完成。一个C程序可由 一个主函数和若干个其 他函数构成。
函数间的调用关系
由主函数调用其他函数,其他函数也可以互相调用。 同一个函数可以被一个或多个函数调用任意多次。
运行情况如下: 7,8↙ Max is 8
通过函数调用,使两个函数中的数据发生联系
关于形参与实参的说明:
(1) 在定义函数中指定的形参,在未出现函数 调用时,它们并不占内存中的存储单元。只有 在发生函数调用时,函数max中的形参才被 分配内存单元。在调用结束后,形参所占的内 存单元也被释放。
(2) 实参可以是常量、变量或表达式,如: max(3,a+b);
本章要点
函数的概念 函数的定义与调用 函数的递归调用 变量的作用域 函数的作用域
C语言第08章 函数.ppt
prpinrtisntaf(r“(*”));
printf(“\n”) printf(“ welcome!\n”); for(j=1;j<=10;j++)
prpinritnstaf(r“(*”);
printf(“\n”) }
调用过程如下 :
main( ) {
a( );
}
a函数 {
b( );
}
b函数 {
}
2020/4/9
第8章 函数
19
/*案例8_3.c*/ 求三个数中最大数和最小数的差值
#include <stdio.h>
int dif(int x,int y,int z) { int m,n;
int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z); void main()
2020/4/9
第8章 函数
8
例:有返回值的 函数 int max(int x, int y) { int z;
z=x>y?x:y; return(z); } main()
例 无返回值函数 void swap(int x,int y ) { int temp;
temp=x; x=y; y=temp; }
函数声明位置:调用函数的数据说明部分或函数体外
下列情况下,可不作函数声明
若函数返值是char或int型,系统自动按int型处理
被调用函数定义出现在主调函数之前
C语言程序设计 第3版 第8章 函数
s=a+b;
return s;
}
main()
//主函数
{
int s;
s=sum();
printf("s=%d\n",s);
}
运行结果
2 3↙ s=5
C语言程序设计
2.函数的定义
无返回值无参数 无返回值有参数
有返回值无参数 有返回值有参数
一般形式:
类型标识符 函数名(形式参数表列) {
函数体; return 表达式; }
调用方式
函数调用的一般形式:
函数名(实际参数表) 实际参数表中的参数可以是常数、变量或表达式,各实参之间用逗号分隔。
调用方式:
(1)函数表达式:函数作为表达式中的一项出现在表达式中,这种方式要求函数有返回值。 例如:s=sum(x,y);把sum的返回值赋予变量s。
(2)函数语句:函数调用的一般形式加上分号即构成函数语句,这种方式不要求函数有返回值。 例如:sum(x,y);以函数语句的方式调用函数。
void sum(int a,int b) //自定义函数
{
int s;
s=a+b;
ห้องสมุดไป่ตู้
printf("s=%d\n",s);
} main()
//主函数
{
int x=2,y=3;
sum(x,y);
}
运行结果
s=5
C语言程序设计
2.函数的定义
无返回值无参数 无返回值有参数
有返回值无参数 有返回值有参数
一般形式:
类型标识符 函数名( ) {
函数体; return 表达式; }
注意说明:
(1)函数的类型实际上是函数返回值的类型。
C语言-第八章
说明: 1、一个源程序文件由一个或多个函数组成。但是只能够有一个 主函数(main()),可以有多个子函数。 2、C程序的执行总是从main函数开始,调用其他函数后返回 main函数,在main函数中结束整个程序的运行。 3、所有函数都是平行的,即在定义时是相互独立的,一个函数 并不从属于另一个函数,即函数不能够嵌套定义。函数间可以相互 调用,但不能调用main函数。
⑴ 格式
类型说明符 函数名() { 声明部分 语句 }
⑵ 说明: a 类型说明符指该函数执行完毕后返回来的值,如strcmp函数返 回的是一个整型数据,那strcmp函数在系统库中应该是int型。 b 函数名是我们所定义函数的名字,要符合标识符的命名规则。 c 声明部分和语句是该函数完成所须功能的语句,根据用户的 需求而设计。 d 无参函数一般是没有返值的,可以不写类型说明符。但是不 写时系统默认的是int型。所以为了明确指明不返值,应定义为void 型,即void表示空类型。 (exp8_4) e 在定义函数时,在 “函数名()”后是没有分号的。
运行结果: 0
8.2 函数定义的一般形式 一、函数的分类: 1、从用户角度看: 标准函数(库函数):scanf()、putchar()等; 用户自己定义的函数:printstar()等; 2、从函数的形式看: 无参函数:clrscr()、print_message()等; 有参函数:gets(数组名)、strcmp(字符串1,字符串2)等。 gets( ) strcmp( 1 2) 二、函数的定义: 1、无参函数的定义: 无参函数指在函数的括号内()没有任何的参数。
函数在主调之前定义(exp8_13) main() float max(float x,float y) { { float a,b,c; float z; float max(float x,float y); z=x>y? x:y; scanf("%f,%f",&a,&b); return z; c=max(a,b); } printf("the max is %f\n",c); main() } { float max(float x,float y) float a,b,c; { scanf("%f,%f",&a,&b); float z; c=max(a,b); z=x>y? x:y; printf("the max is %f\n",c); return z一、概述 在以前我们所接触的程序中,都是把所有的语句写在main函数 中,所有的事情都是在main函数中完成。但是当程序的功能增多时, 这种方法写出的程序很冗长而降低可读性和编写效率。因此,我们 可以把程序中独立的功能程序段单独做为子函数独立在main函数外 面,在main 函数中调用该子函数可以完成同样的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*调用pt_star 函数*/ /*调用pt_star 函数*/ /*调用pt_star 函数*/
工程训练中心
徐国海
函数定义(一)
函数定义的一般形式如下:
[函数类型说明] 函数名( [ 形式参数列表 ] )
{ 说明语句部分 执行语句部分
函数头 函数体
}
函数名,是不可缺省的部分,用于标识该函数,同时它也代表了该 函数的入口地址。 void 函数名( ) { } 空函数
函数 3.可以在任何程序中使用。
用户自定义函数
1. 定义。 2. 说明。
3.调用。
2013年8月20日3时40分
工程训练中心
徐国海
例1
#include <stdio.h> void main() { printf(“****************\n”); printf(“ Hello!\n); printf(“****************\n”); } 程序运行结果为: **************** Hello! ****************
2013年8月20日3时40分 工程训练中心 徐国海
例2——求两个数中的最大数
void main() { int max(int x,int y); int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); 调用max函数。 printf(“max=%d”,c); } int max(int x,int y) { int z; z=x>y?x∶y; return(z); }
#include <stdio.h> long int jc(____________) { int i; long int t=1; for(i=1; i<=n; i++) t*=i; return(t); } void main( ) { int m,n; float result; scanf(“%d,%d”,&m,&n); result=jc(_____)/jc(_____); printf(“这个表达式的值是%f\n”,result); }
将一个较大的程序分为若干个子模块,每个模块实现 一个独立的功能。这样就结构清晰、功能分工明确 了。——模块化程序设计思想
问题 解决
在C语言中,模块是用函数来实现的。
2013年8月20日3时40分 工程训练中心 徐国海
函数概述(一)
一个C程序可以由一个主函数和若干个子函数构成。 由主函数调用其他函数,其他函数之间也可以互相调用。 同一个函数可以被一个或多个函数调用任意多次。 C程序的执行从main函数开始,调用其它函数后再返回到main函数,在 main函数结束整个程序的执行。 main() a( ) { { a( ); main d( );
A. x
B. c
void main( ) { float a,b; scanf(“%f”,&a); b=sq(a); printf(“ this is number : %f\n”,b); }
2013年8月20日3时40分 工程训练中心 徐国海
数据在函数间的传递练习
如:void main() { int a,b; scanf(“%d,%d”,&a,&b); printf(“no1: %d,%d\n”,a,b); md(a,b); printf(“no2: %d,%d\n”,a,b); } int md(int x,int y) { int z=3; x=x+z; y=y-z; printf(“no3: %d,%d\n”,x,y); }
2013年8月20日3时40分 工程训练中心 徐国海
a 5
b 10
5 x 10
运行结果:
5 y 10
before swap:a=5,b=10 in swap:x=10,y=5 after swap:a=5,b=10
函数定义练习 ——求一个数的平方
#include <stdio.h> float sq(____________) { float c; c=x*x; return (______); } A. x B. int x C. float x
2013年8月20日3时40分
• 定义了一个名字为max的函数,带有两 个整型的参数; •功能是找出两个数中的最大数; •返回最大数的值。
工程训练中心
徐国海
例2 解析
void main() { int max(int x,int y) ; int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“max=%d”,c); } int max(int x,int y) { int z; z=x>y?x∶y; return(z); }
说明语句部分 执行语句部分
函数头 函数体
}
形式参数,简称为形参。要对形参进行类型说明,多个形参之间用 “逗号”间隔。 当函数被调用时,形参接收来自主调函数的数据,以确定各参数的值。
主调函数中,用以给形参传递数据的参数称为实际参数,简称实参。
形参与实参应在数量上相同、类型上相同或赋值兼容。
徐国海
函数的声明(二)
若某一函数被不同函数多次调用,应在各主调函数中都进行声明。
ห้องสมุดไป่ตู้
如下图中所示的c函数,main主函数中进行声明,a函数中也应进行 声明。
main a b c
c
2013年8月20日3时40分
d
d
工程训练中心
徐国海
例5 ——求1+2!+3!+……+n!的值
#include <stdio.h> void main( ) { long int sum(int n) ; int n; long int result; scanf(“%d”,&n); result=sum(n); printf(“1+2!+3!+……+%d!= %ld\n”,n,result); } long int sum(int n) { int i; long int s=0; long int jc(int n) ; for(i=1; i<=n; i++) s=s+jc( i ); return(t); } long int jc(int n) { int i; long int t=1; for(i=1; i<=n; i++) t*=i; return(t); }
第八章 函数
内蒙古科技大学 工程训练中心
学习内容引入
现状 存在 问题
我们的程序都是由一个main()主函数构成。
若是一个小程序的话,把几行命令全部放在main() 主函数中进行编写,还算清晰。但如果要编写一个较 大的程序,仍采用上述方法,全部在main()主函数 中从头到尾编写的话,就会给程序的修改和调试都带 来麻烦。
定义一个名字为pt_word的函数, 完成打印输入字符的操作,没 有返回值。
/*调用pt_star 函数*/ /*调用pt_star 函数*/ /*调用pt_star 函数*/
2013年8月20日3时40分
工程训练中心
徐国海
函数定义(三)
有参函数的定义形式如下:
函数类型说明
{
函数名(形式参数列表)
}
2013年8月20日3时40分 工程训练中心 徐国海
本小节总结
无参函数和有参函数的定义方法
[函数类型说明]
{
函数名( [ 形式参数列表 ] )
说明语句部分 执行语句部分
}
数据在函数间的传递
实参 值 形参
对函数的调用进行了简单说明
2013年8月20日3时40分
工程训练中心
徐国海
函数定义练习2 ——求m!/n!的值
实参
a 6
b 5
x
9 6 x+t
y
2 5 y-t
形参
z=x>y?x∶y;
return (z); }
结果为:
max=___9____
2013年8月20日3时40分
工程训练中心
徐国海
数据传递实例——交换两个变量的值
#include <stdio.h> void swap(int x,int y); void main( ) { int a,b; a=5; b=10; printf(“before swap:a=%d,b=%d\n”,a,b); swap(a,b); printf (“after swap:a=%d,b=%d\n”,a,b); } void swap(int x,int y) { int temp; temp=x; x=y; y=temp; printf(“in swap: x=%d,y=%d\n”,x,y); }
实参
a 6 b 5
x 6 z
y 5
形参
max(a,b)
2013年8月20日3时40分
工程训练中心
徐国海
数据在函数间的传递
如:void main() { int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“max=%d\n”,c); } int max(int x,int y) { int z,t=3; x=x+t; y=y-t;
a
b
c
b( ); c( );
…
… … …
… … …
}
d( ) {
…
d