《 程序设计基础( C ) 》

56
程程程程程程程程程程程程C C 程程程 程程 程程程 程程

description

《 程序设计基础( C ) 》. 第六章 函数. 本章内容. 模块化程序设计 函数说明、函数实现与函数调用 参数传递 形参、实参与返回值 传值、传址与传数组 递归函数 变量作用域与存贮类别 库函数. 一、模块化程序设计. 模块化设计思想 一个复杂问题可分解为若干个子问题 每个子问题也可以再分解为更简单的小问题 程序设计转化为层次式结构化的模块设计 自底向上 与 自顶向下 设计方法 模块特点 模块间存在调用接口(输入输出) 各模块可分别编写、测试,再进行总组装 模块可以有一定的可重用性 模块实现细节的独立性(封装). 二、函数设计. - PowerPoint PPT Presentation

Transcript of 《 程序设计基础( C ) 》

Page 1: 《 程序设计基础( C ) 》

《程序设计基础《程序设计基础(( CC )》)》第六章 函数第六章 函数

Page 2: 《 程序设计基础( C ) 》

本章内容本章内容 模块化程序设计模块化程序设计 函数说明、函数实现与函数调用函数说明、函数实现与函数调用 参数传递参数传递

形参、实参与返回值形参、实参与返回值 传值、传址与传数组传值、传址与传数组

递归函数递归函数 变量作用域与存贮类别变量作用域与存贮类别 库函数库函数

Page 3: 《 程序设计基础( C ) 》

一、模块化程序设计一、模块化程序设计 模块化设计思想模块化设计思想

一个复杂问题可分解为若干个子问题一个复杂问题可分解为若干个子问题 每个子问题也可以再分解为更简单的小问题每个子问题也可以再分解为更简单的小问题 程序设计转化为层次式结构化的模块设计程序设计转化为层次式结构化的模块设计 自底向上 与 自顶向下 设计方法自底向上 与 自顶向下 设计方法

模块特点模块特点 模块间存在调用接口(输入输出)模块间存在调用接口(输入输出) 各模块可分别编写、测试,再进行总组装各模块可分别编写、测试,再进行总组装 模块可以有一定的可重用性模块可以有一定的可重用性 模块实现细节的独立性(封装)模块实现细节的独立性(封装)

Page 4: 《 程序设计基础( C ) 》

二、函数设计二、函数设计 函数举例:素数判断函数举例:素数判断 函数举例:数组相关函数举例:数组相关 函数概念函数概念

函数声明/函数说明函数声明/函数说明 函数调用函数调用 函数实现/函数定义函数实现/函数定义

Page 5: 《 程序设计基础( C ) 》

函数设计例函数设计例 11 :素数:素数 输入输入 nn ,判断,判断 nn 是否为素数是否为素数 输入输入 nn ,输出,输出 nn 以内的所有素数以内的所有素数 输入输入 mm 和和 nn ,输出,输出 mm 与与 nn 之间所有素之间所有素数,按每行数,按每行 77 个素数的形式输出,如果个素数的形式输出,如果没有素数,则输出没有素数,则输出 NoneNone 验证哥德巴赫猜想:将验证哥德巴赫猜想:将 44 到到 100100 的所有的所有偶数分解为两个素数之和偶数分解为两个素数之和

Page 6: 《 程序设计基础( C ) 》

判断素数的函数判断素数的函数 专判素数的模块专判素数的模块 函数名称:函数名称: isprimeisprime 函数声明/函数说明:函数声明/函数说明:

int isprime( int n );int isprime( int n ); 自变量类型:整型 自变量类型:整型 术语参数术语参数 结果类型: 整型结果类型: 整型 术语返回术语返回

功能说明:若功能说明:若 nn 为素数,则返回为素数,则返回 11 ,若,若nn 不是素数,则返回不是素数,则返回 00

Page 7: 《 程序设计基础( C ) 》

i 2置 为

i n-1?≤

Y

N

i n?整除

Y

[b: ]变量说明n为要判断的整数

, ,i syes 1 0为判断标志 表示是素数 表示非素数i为循环控制量

[c: ]对应的文字描述 ● 输入整数n i syes 1● 置 为 ( ) 标志预设 ● 变量i从2到n-1 , 循环以下 i每次递增1

■ 如果i整除n则 i syes 0◆ 置 为 ( ) 标志与预设相反

i syes 1● 如果 为 则 ( ) 标志判断 Yes■ 输出 否则 No■ 输出

● 程序结束

[d: ]程序代码/ * 1*/ #i ncl ude <stdi o. h>/ * 2*/ mai n()/ * 3*/ {/ * 4*/ i nt n, i , i syes;/ * 5*// * 6*/ scanf ( "%d", &n ) ;/ * 7*// * 8*/ i syes = 1;/ * 9*/ f or ( i =2; i <=n-1; i ++ )/ *10*/ i f ( n%i == 0 )/ *11*/ i syes = 0;/ *12*// *13*/ i f ( i syes == 1 )/ *14*/ pri ntf ( "Yes\ n" );/ *15*/ el se/ *16*/ pri ntf ( "No\n" );/ *17*/ }

结束

i syes 1?为

Yes输出

NY

No输出

i 1递增

i syes 0置 为

N

开始

n输入

[a: ]使用判断标志的流程图

i syes 1置 为

第一阶段

第二阶段

第三阶段

第第一一章章标标志志法法

Page 8: 《 程序设计基础( C ) 》

函数剥离过程函数剥离过程#include <stdio.h>main(){ int n, i, isyes; scanf( "%d", &n );

if ( isyes == 1 ) printf( "Yes" ); else printf( "No" );}

int isprime(int n)int isprime(int n){{ int i, isyes;int i, isyes;

return isyes;return isyes;}}

isyes = 1; for ( i=2; i<=n-1; i++ ) if ( n%i == 0 ) isyes = 0;

isyes = isprime( n );isyes = isprime( n );

Page 9: 《 程序设计基础( C ) 》

形式参数函数实现

实际参数函数调用

函数概念函数概念#include <stdio.h>#include <stdio.h>int isprime(int n)int isprime(int n){{ int i,isyes;int i,isyes; isyes=1;isyes=1; for (i=2;i<=n-1;i++)for (i=2;i<=n-1;i++) if (n%i==0)if (n%i==0) isyes = 0;isyes = 0; return isyes;return isyes;}}

main(){ int n; scanf( "%d", &n ); if ( isprime(n) ) printf( "Yes" ); else printf( "No" );}

函数返回

局部变量

Page 10: 《 程序设计基础( C ) 》

使用使用 returnreturn 优化函数优化函数int isprime(int n)int isprime(int n){{ int i;int i; for (i=2;i<=n-1;i++)for (i=2;i<=n-1;i++) if (n%i==0)if (n%i==0) return return 00;; return return 11;;}}

函数开始

i =2

i ≦ n-1?

n%i ==0?

0返回 1返回

i ++

YN

N

Y

Page 11: 《 程序设计基础( C ) 》

将将 44 到到 100100 的所有偶的所有偶数分解为两个素数之数分解为两个素数之和和main()main(){{ int n,i;int n,i; for ( n=4; n<=100; n+=2 )for ( n=4; n<=100; n+=2 ) for ( i=2; i<n; i++ )for ( i=2; i<n; i++ ) if ( isprime(i) && isprime(n-i) )if ( isprime(i) && isprime(n-i) ) {{ printf("%2d=%2d+%2d\t",n,i,n-i);printf("%2d=%2d+%2d\t",n,i,n-i); break;break; }}}}

Page 12: 《 程序设计基础( C ) 》

代码的组织顺序代码的组织顺序 先先声明声明再调用再调用 #include <stdio.h>#include <stdio.h> int isprime( int n );int isprime( int n ); main()main() {{ …… …… }} int isprime( int n )int isprime( int n ) {{ …… …… }}

先先实现实现再调用再调用 #include <stdio.h>#include <stdio.h> int isprime( int n )int isprime( int n ) {{ …… …… }} main()main() {{ …… …… }}

Page 13: 《 程序设计基础( C ) 》

函数设计规范函数设计规范 函数调用前必须先出现函数调用前必须先出现函数实现函数实现或或函数声函数声明明 函数实现与函数声明必须函数实现与函数声明必须一致一致

函数名称、参数类型及顺序、返回类型函数名称、参数类型及顺序、返回类型 函数声明中形式参数名可以省略函数声明中形式参数名可以省略

如:如: int isprime( int );int isprime( int ); 函数之间的局部变量允许重名函数之间的局部变量允许重名 无返回值或无参数,类型记为无返回值或无参数,类型记为 voidvoid 函数内部对形参的函数内部对形参的修改修改不影响调用函数不影响调用函数

Page 14: 《 程序设计基础( C ) 》

传递数值示例传递数值示例 int func( int n )int func( int n ) {{ n = n + 1; n = n + 1; /* /* 修改了修改了 nn 的值 的值 */*/ return n;return n; }} main()main() {{ int a=1, b;int a=1, b; b = func( a ); b = func( a ); /* a/* a 的值不受影响 的值不受影响 */*/ printf( “a=%d,b=%d\n”, a, b );printf( “a=%d,b=%d\n”, a, b ); }}

Page 15: 《 程序设计基础( C ) 》

函数设计例函数设计例 22 :数组相关:数组相关 数组相关操作数组相关操作

计算累加和计算累加和 计算最大值、最小值、平均值计算最大值、最小值、平均值 排序排序 查找查找 输入、输出输入、输出

传递数组:对数组参数的修改影响传递数组:对数组参数的修改影响调用函数调用函数

Page 16: 《 程序设计基础( C ) 》

数组累加和数组累加和 数组累加:数组累加: long sum( int a[ ], int n );long sum( int a[ ], int n ); 主函数示例主函数示例

main()main() {{ int x[6],i; long s;int x[6],i; long s; for ( i=0; i<6; i++ )for ( i=0; i<6; i++ ) scanf( “%d”, &x[i] );scanf( “%d”, &x[i] ); s = sum( x, 6 );s = sum( x, 6 ); printf( “%ld\n”, s );printf( “%ld\n”, s ); }}

Page 17: 《 程序设计基础( C ) 》

数组累加和数组累加和long sum(int a[ ],int n)long sum(int a[ ],int n){{ long rst = 0;long rst = 0; int i;int i; for ( i = 0; i < n; i++ )for ( i = 0; i < n; i++ ) rst += a[i];rst += a[i]; return rst;return rst;}}

Page 18: 《 程序设计基础( C ) 》

数组相关函数数组相关函数 float average( int a[ ], int n );float average( int a[ ], int n ); int max( int a[ ], int n );int max( int a[ ], int n ); int min( int a[ ], int n );int min( int a[ ], int n ); void sort( int a[ ], int n );void sort( int a[ ], int n ); int find( int a[ ], int n, int x );int find( int a[ ], int n, int x ); void sca( int a[ ], int n );void sca( int a[ ], int n ); void prt( int a[ ], int n );void prt( int a[ ], int n );

Page 19: 《 程序设计基础( C ) 》

输入数组输入数组void sca(int a[ ], int n)void sca(int a[ ], int n){{ int i; int i; for ( i=0;i<n;i++ )for ( i=0;i<n;i++ ) scanf(“%d”,&a[i]);scanf(“%d”,&a[i]);}}返回类型为返回类型为 voidvoid ,省略,省略 returnreturn 语句语句

Page 20: 《 程序设计基础( C ) 》

输出数组输出数组void prt(int a[ ], int n)void prt(int a[ ], int n){{ int i;int i; for ( i=0;i<n;i++ )for ( i=0;i<n;i++ ) printf(“%d ”, a[i]);printf(“%d ”, a[i]); printf( “\n” );printf( “\n” );}}

Page 21: 《 程序设计基础( C ) 》

数组排序数组排序void sort( int a[ ], int n )void sort( int a[ ], int n ){{ int i, j, t;int i, j, t; for ( i = 0; i < n-1; i++ )for ( i = 0; i < n-1; i++ ) for ( j = 0; j < n-1-i; j++ )for ( j = 0; j < n-1-i; j++ ) if ( a[j]>a[j+1] )if ( a[j]>a[j+1] ) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; }{ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }}}对对 aa 数组的修改在函数结束后仍起作用数组的修改在函数结束后仍起作用

Page 22: 《 程序设计基础( C ) 》

排序程序排序程序 #include <stdio.h>#include <stdio.h> void sca( int a[ ], int n )void sca( int a[ ], int n ) { …… }{ …… } void prt( int a[ ], int n );void prt( int a[ ], int n ); { …… }{ …… } void sort( int a[ ], int n )void sort( int a[ ], int n ) { …… }{ …… } main()main() {{ int a[10];int a[10]; sca( a, 10 ); sort( a, 10 ); prt( a, 10 );sca( a, 10 ); sort( a, 10 ); prt( a, 10 ); }}

Page 23: 《 程序设计基础( C ) 》

参数传递上的灵活性参数传递上的灵活性 数组传递上的偏移数组传递上的偏移

prt( a, 10 ); prt( a, 10 ); 输出输出 a[0]a[0] 至至 a[9]a[9] prt( a, 5 ); prt( a, 5 ); 输出输出 a[0]a[0] 至至 a[4]a[4] prt( a+1, 5 ); prt( a+1, 5 ); 输出输出 a[1]a[1] 至至 a[5]a[5] prt( a+4, 3 ); prt( a+4, 3 ); 输出输出 a[4]a[4] 至至 a[6]a[6]

输入输入 1010 个整数,对中间个整数,对中间 88 个排序个排序 sca( a,10 )sca( a,10 ) sort( a+1, 8 );sort( a+1, 8 ); prt( a, 10 );prt( a, 10 );

Page 24: 《 程序设计基础( C ) 》

三、参数传递三、参数传递 函数调用与返回的具体过程函数调用与返回的具体过程 传递数值传递数值

Page 25: 《 程序设计基础( C ) 》

调用过程(形参、实参与返回)调用过程(形参、实参与返回)int max(int a,int b)int max(int a,int b){{ int c;int c; if ( a>b )if ( a>b ) c = a;c = a; elseelse c = b;c = b; return c;return c;}}

main()main(){{ int x,y,z;int x,y,z; scanf(“%d%d”,&x,&y);scanf(“%d%d”,&x,&y); z=max(x,y);z=max(x,y); printf(“%d\n”,z);printf(“%d\n”,z); z=max(3,5);z=max(3,5); printf(“%d\n”,z);printf(“%d\n”,z);}}

Page 26: 《 程序设计基础( C ) 》

调用过程说明调用过程说明 mainmain 函数有变量函数有变量 x,y,zx,y,z 调用调用 maxmax 函数时,实参函数时,实参为为 x,yx,y ,形参为,形参为 a,ba,b

实参实参 x,yx,y被复制到被复制到 maxmax函数的形参变量函数的形参变量 a,ba,b maxmax 函数用形参函数用形参 a,ba,b 进进行计算,结果放在行计算,结果放在 cc 中中 return creturn c时,变量时,变量 cc 的值的值被复制到指定寄存器,并被复制到指定寄存器,并返回返回 mainmain 函数函数 mainmain 函数从指定寄存器函数从指定寄存器取数送到取数送到 zz 变量变量

abc

xyz

复制参数值

结果返回

函数max

函数mai n

形参

实参

Page 27: 《 程序设计基础( C ) 》

四、递归函数四、递归函数 递归函数正向设计递归函数正向设计

阶乘、排序阶乘、排序 递归函数运行跟踪递归函数运行跟踪

阶乘阶乘 递归函数运行求解递归函数运行求解

阶乘、数列阶乘、数列

Page 28: 《 程序设计基础( C ) 》

[[ 例例 6.15] 6.15] 递归阶乘举例递归阶乘举例 求阶乘 求阶乘 n!n! 1 n1 n11 n!n! = = n * (n-1)! n>1n * (n-1)! n>1 long jcheng(int n);long jcheng(int n);

递归函数实现方法递归函数实现方法long jchenlong jchengg(int n)(int n){{ long rst;long rst; if ( n <= 1 )if ( n <= 1 ) rst = 1;rst = 1; elseelse rst = n*jchenrst = n*jchengg(n-1);(n-1); return rst;return rst;}}

Page 29: 《 程序设计基础( C ) 》

递归函数运行跟踪递归函数运行跟踪 以阶乘为例以阶乘为例 计算机运行计算机运行 jchenjchengg(3)(3) 的过程的过程 板书分析板书分析

Page 30: 《 程序设计基础( C ) 》

递归函数求解递归函数求解 简单函数:没有使用静态与全局变量,简单函数:没有使用静态与全局变量,函数功能也与文件函数功能也与文件 //系统无关。系统无关。 原则:多次调用函数时如果所有参数一原则:多次调用函数时如果所有参数一样,则运行结果一定一样,与调用位置样,则运行结果一定一样,与调用位置无关。无关。 简单递归函数:只有一个参数(多数为简单递归函数:只有一个参数(多数为

nn),没有使用静态与全局变量。),没有使用静态与全局变量。

Page 31: 《 程序设计基础( C ) 》

阶乘求解举例阶乘求解举例1.1. 当当 n=1n=1时,可得时,可得 jchenjchen

g(1)g(1)返回返回 11。。2.2. 当当 n=2n=2时,计算时,计算 rst = 2 rst = 2

* jcheng(1)* jcheng(1) ,由第,由第 11步步可知,可知, rst=2rst=2,故,故 jchejcheng(2)ng(2) 返回返回 22。。

3.3. 当当 n=3n=3时,同理有时,同理有 rst rst =3*jcheng(2)=3*2=6=3*jcheng(2)=3*2=6 ,,故故 jcheng(3)jcheng(3) 返回返回 66。。

递归函数实现方法递归函数实现方法long jchenlong jchengg(int n)(int n){{ long rst;long rst; if ( n <= 1 )if ( n <= 1 ) rst = 1;rst = 1; elseelse rst = n*jchenrst = n*jchengg(n-1);(n-1); return rst;return rst;}}

Page 32: 《 程序设计基础( C ) 》

数列求解举例数列求解举例1.1. prtlist(0)prtlist(0) 输出“输出“ 0 ”0 ” 。。2.2. prtlist(1)prtlist(1) 先输出“先输出“ 1 ”1 ” ,再,再调用调用 prtlist(0)prtlist(0) ,由上一步,,由上一步,输出“输出“ 0 ”0 ” ,重复一次,输,重复一次,输出“出“ 1 ”1 ” 和“和“ 0 ”0 ” ,故,故 prtlistprtlist

(1)(1) 输出“输出“ 1 0 1 0 ”1 0 1 0 ” 。。3.3. prtlist(2)prtlist(2) 先输出“先输出“ 2 ”2 ” ,再,再调用调用 prtlist(1)prtlist(1) ,输出“,输出“ 1 0 1 0

1 0 ”1 0 ” ,重复一次,故,重复一次,故 prtlistprtlist(2)(2) 输出“输出“ 2 1 0 1 0 2 1 0 1 2 1 0 1 0 2 1 0 1 0 ”0 ”

void prtlist( int n )void prtlist( int n ){ if ( n == 0 ){ if ( n == 0 ) printf( “0 ” );printf( “0 ” ); elseelse { printf( “%d ”, n );{ printf( “%d ”, n ); prtlist( n-1 );prtlist( n-1 ); printf( “%d ”, n );printf( “%d ”, n ); prtlist( n-1 );prtlist( n-1 ); }}}}

Page 33: 《 程序设计基础( C ) 》

五、变量作用域与存贮类别五、变量作用域与存贮类别 变量作用域变量作用域 内存分配形式内存分配形式 存贮类别存贮类别 动态局部变量动态局部变量 静态局部变量静态局部变量 全局变量全局变量

Page 34: 《 程序设计基础( C ) 》

变量作用域变量作用域 局部变量局部变量

形式参数以及在函数内部定义的变量形式参数以及在函数内部定义的变量 只有该函数才能访问只有该函数才能访问

全局变量全局变量 在函数外部定义的变量在函数外部定义的变量 所有函数都能访问所有函数都能访问

Page 35: 《 程序设计基础( C ) 》

全局变量举例全局变量举例int a[10];int a[10];void scaX(void)void scaX(void){ int i; { int i; for ( i=0;i<10;i++ ) scanf(“%d”,&a[i]); }for ( i=0;i<10;i++ ) scanf(“%d”,&a[i]); }void prtX(void)void prtX(void){ int i;{ int i; for ( i=0;i<10;i++ ) printf(“%d ”, a[i]); }for ( i=0;i<10;i++ ) printf(“%d ”, a[i]); }

Page 36: 《 程序设计基础( C ) 》

续续void sortX(void)void sortX(void){ int i, j, t;{ int i, j, t; for ( i = 0; i < 9; i++ )for ( i = 0; i < 9; i++ ) for ( j = 0; j < 9-i; j++ )for ( j = 0; j < 9-i; j++ ) if ( a[j] < a[j+1] )if ( a[j] < a[j+1] ) { t=a[j];a[j]=a[j+1];a[j+1]=t;} }{ t=a[j];a[j]=a[j+1];a[j+1]=t;} }main()main(){ scaX(); sortX(); prtX(); }{ scaX(); sortX(); prtX(); }

Page 37: 《 程序设计基础( C ) 》

变量在内存中安排变量在内存中安排 静态区段(数据段)静态区段(数据段)

所有全局变量所有全局变量 程序装入内存时安排变量地址并初始化程序装入内存时安排变量地址并初始化 在程序运行中地址不变在程序运行中地址不变

动态区段(堆栈段)动态区段(堆栈段) 一般局部变量一般局部变量 在函数调用时才给变量安排地址并初始化在函数调用时才给变量安排地址并初始化 各次调用之间安排的地址可能不同各次调用之间安排的地址可能不同

分配区段(堆区) 见第七章分配区段(堆区) 见第七章 mallocmalloc 函数函数

Page 38: 《 程序设计基础( C ) 》

变量存贮类别变量存贮类别 (1)(1) 动态变量(动态变量( autoauto ))

只适用于局部变量只适用于局部变量 在类型前加在类型前加 autoauto 修饰,也可省略不写修饰,也可省略不写 如:如: auto int i; auto int i; 或 或 int i;int i;

变量安排在动态区段变量安排在动态区段 此前所有程序的局部变量都是动态变量此前所有程序的局部变量都是动态变量

Page 39: 《 程序设计基础( C ) 》

变量存贮类别变量存贮类别 (2)(2) 静态变量(静态变量( staticstatic ))

在类型前加在类型前加 staticstatic 修饰修饰 静态局部变量静态局部变量 该变量将安排在静态区段,有固定地址,并该变量将安排在静态区段,有固定地址,并只在程序装入时初始化一次。只在程序装入时初始化一次。 静态全局变量静态全局变量 限制该全局变量只能被同一个源程序内的各限制该全局变量只能被同一个源程序内的各函数所访问。函数所访问。

Page 40: 《 程序设计基础( C ) 》

【例【例 6.246.24】阅读程序(全局】阅读程序(全局变量和静态变量) 变量和静态变量) int d=1;int d=1;void func2(int p)void func2(int p){{ static int d=4;static int d=4; d+=p++;d+=p++; printf(“p=%d d=%d\printf(“p=%d d=%d\

n”, n”, p, d);p, d);}}

main()main(){{ int i, a=5;int i, a=5; for (i=0; i<2; i++)for (i=0; i<2; i++) {{ func2(a);func2(a); d+=a++; d+=a++; printf(“a= %dd=%d\n”, printf(“a= %dd=%d\n”, a, d);a, d); }}}}

Page 41: 《 程序设计基础( C ) 》

静态变量的作用静态变量的作用 使得函数能“使得函数能“记住记住”上一次调用时的运”上一次调用时的运行情况,简单智能。行情况,简单智能。

如计算阶乘时,可从上一次结果继续乘如计算阶乘时,可从上一次结果继续乘 相对“相对“稳定稳定”的常量,不需要每次调用”的常量,不需要每次调用时都进行初始化,加快运行时都进行初始化,加快运行

如各月天数,如各月天数, static int days=[31,28,31…static int days=[31,28,31…

Page 42: 《 程序设计基础( C ) 》

变量存贮类别变量存贮类别 (3)(3) 外部变量(外部变量( externextern ))

只用于全局变量,多个源程序时使用。只用于全局变量,多个源程序时使用。 其中一个源程序不加其中一个源程序不加 externextern 修饰修饰 其它源程序都要加其它源程序都要加 externextern 修饰修饰

寄存器变量(寄存器变量( registerregister )) 只用于局部变量,有“可能”加快程序运行只用于局部变量,有“可能”加快程序运行 可按可按 autoauto理解理解 一般不建议使用一般不建议使用

Page 43: 《 程序设计基础( C ) 》

六、六、 CC常用库函数(附录常用库函数(附录 IIVV ))

输入输出函数输入输出函数 stdio.hstdio.h

数学函数数学函数 math.hmath.h

字符串函数字符串函数 string.hstring.h

常用子程序常用子程序 stdlib.hstdlib.h

控制台函数控制台函数 conio.hconio.h

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

图形函数图形函数 graphics.hgraphics.h

其它如:其它如: dos.hdos.h 、、 bios.hbios.h 、、 time.htime.h

函数帮助(函数帮助( ctrl-F1ctrl-F1 )) 在函数名位置上在函数名位置上 在在 #include#include 文件名上文件名上 在空白处在空白处

Page 44: 《 程序设计基础( C ) 》

maxmax 函数:返回最大值所在下标函数:返回最大值所在下标 int max( int a[ ], int n )int max( int a[ ], int n ) {{ int i,k=0;int i,k=0; for ( i=1; i<n; i++ )for ( i=1; i<n; i++ ) if ( a[k] < a[i] )if ( a[k] < a[i] ) k = i;k = i; return k;return k; }}

Page 45: 《 程序设计基础( C ) 》

sortsort 函数:选择法函数:选择法 ,,从大到从大到小小 void sort( int a[ ], int n )void sort( int a[ ], int n ) {{ int i,k,t;int i,k,t; for ( i=0; i<n-1; i++ )for ( i=0; i<n-1; i++ ) {{ k = max( a+i, n-i ) + i;k = max( a+i, n-i ) + i; if ( k!=i )if ( k!=i ) { t=a[k]; a[k]=a[i]; a[i]=t; }{ t=a[k]; a[k]=a[i]; a[i]=t; } }} }}

Page 46: 《 程序设计基础( C ) 》

findfind 函数:查找并返回下标函数:查找并返回下标 int find( int a[ ], int n, int x )int find( int a[ ], int n, int x ) {{ int i;int i; for ( i=0; i<n; i++ )for ( i=0; i<n; i++ ) if ( a[i] == x )if ( a[i] == x ) return i;return i; return -1;return -1; }}

Page 47: 《 程序设计基础( C ) 》

统计出现次数统计出现次数 int count( int a[ ], int n, int x )int count( int a[ ], int n, int x ) {{ int ct=0, i;int ct=0, i; for ( i=0; i<n; i++ )for ( i=0; i<n; i++ ) if ( a[i] == x )if ( a[i] == x ) ct++;ct++; return ct; return ct; }}

Page 48: 《 程序设计基础( C ) 》

输出只出现一次的数输出只出现一次的数 void prt1( int a[ ], int n )void prt1( int a[ ], int n ) {{ int i;int i; for ( i=0; i<n; i++ )for ( i=0; i<n; i++ ) if ( count(a,n,a[i]) == 1 )if ( count(a,n,a[i]) == 1 ) printf( “%d\t”, a[i] );printf( “%d\t”, a[i] ); printf( “\n” );printf( “\n” ); }}

Page 49: 《 程序设计基础( C ) 》

输出出现输出出现 33 次及以上的数次及以上的数 void prt3( int a[ ], int n )void prt3( int a[ ], int n ) {{ int i;int i; for ( i=0; i<n; i++ )for ( i=0; i<n; i++ ) if ( count(a,i,a[i])==0 && if ( count(a,i,a[i])==0 && /*a[0]/*a[0] 至至 a[i-1],0a[i-1],0 次次 */*/ count(a+i,n-i,a[i])>=3 ) count(a+i,n-i,a[i])>=3 ) /*a[i]/*a[i] 至至 a[n-1],3a[n-1],3 次次 */*/ printf( “%d\t”, a[i] );printf( “%d\t”, a[i] ); printf( “\n” );printf( “\n” ); }}

Page 50: 《 程序设计基础( C ) 》

从从 aa 数组选择出现数组选择出现 33 次的数次的数到数组到数组 bb 中,并返回相应个数中,并返回相应个数 int get3( int a[ ], int n, int b[ ] )int get3( int a[ ], int n, int b[ ] ) {{ int i, k=0;int i, k=0; for ( i=0; i<n; i++ )for ( i=0; i<n; i++ ) if ( count(a,i,a[i])==0 && if ( count(a,i,a[i])==0 && /*a[0]/*a[0] 至至 a[i-1],0a[i-1],0 次次 */*/ count(a+i,n-i,a[i])>=3 ) count(a+i,n-i,a[i])>=3 ) /*a[i]/*a[i] 至至 a[n-1],3a[n-1],3 次次 */*/ b[k++] = a[i];b[k++] = a[i]; return k;return k; }}

Page 51: 《 程序设计基础( C ) 》

从键盘上输入从键盘上输入 nn 和和 nn 个整数,个整数,输出其中出现输出其中出现 33 次及以上的数次及以上的数 #include <stdio.h>#include <stdio.h> ………… main()main() { { /* /* 设设 nn 不超过不超过 100 */100 */ int a[100], b[100], n, k;int a[100], b[100], n, k; scanf( “%d”, &n );scanf( “%d”, &n ); sca( a, n );sca( a, n ); k = get3( a, n, b );k = get3( a, n, b ); prt( b, k );prt( b, k ); }}

Page 52: 《 程序设计基础( C ) 》

学生信息管理学生信息管理 main()main() {{ int num[100], score[100], n=0;int num[100], score[100], n=0; …… …… case ‘A’: case ‘A’: n=add_stu(num,score,n);break;n=add_stu(num,score,n);break; case ‘D’:case ‘D’: n=del_stu(num,score,n);break;n=del_stu(num,score,n);break; …… …… }}

Page 53: 《 程序设计基础( C ) 》

学生信息管理:处理学生信息管理:处理 AA 命命令令 int add_stu( int num[ ], int score[ ] )int add_stu( int num[ ], int score[ ] ) {{ int xn, xs, k;int xn, xs, k; scanf( “%d%d”, &xn, &xs );scanf( “%d%d”, &xn, &xs ); k = find( num, n, xn ); k = find( num, n, xn ); /*/* 查找指定学号查找指定学号 */*/ if ( k >= 0 ) if ( k >= 0 ) /*/*指定学号有,修改功能指定学号有,修改功能 */*/ { score[k] = xs; return n; }{ score[k] = xs; return n; } k = find( num, n, 0 ); k = find( num, n, 0 ); /*/* 查找空学号查找空学号 */*/ if ( k == -1 ) if ( k == -1 ) /*/*空学号无,增加总数空学号无,增加总数 */*/ k = n++;k = n++; num[k]=xn; score[k]=xs; return n;num[k]=xn; score[k]=xs; return n; } } /*/*显示信息略显示信息略 */*/

Page 54: 《 程序设计基础( C ) 》

学生信息管理:处理学生信息管理:处理 DD 命命令令 int del_stu( int num[ ], int n )int del_stu( int num[ ], int n ) {{ int xn, k;int xn, k; scanf( “%d”, &xn );scanf( “%d”, &xn ); k = find( num, n, xn ); k = find( num, n, xn ); /*/* 查找指定学号查找指定学号 */*/ if ( k >= 0 ) if ( k >= 0 ) /*/*指定学号有,删除功能指定学号有,删除功能 */*/ num[k] = 0;num[k] = 0; return n;return n; } } /*/* 显示信息略显示信息略 */*/

Page 55: 《 程序设计基础( C ) 》

学生信息管理:学生信息管理: AA 命令命令 // 姓姓名名 int add_stu2( int num[ ], int add_stu2( int num[ ], char name[ ][80]char name[ ][80], int score[ ] ), int score[ ] ) {{ int xn, xs, k; int xn, xs, k; char xm[80]char xm[80];; scanf( “%dscanf( “%d%s%s%d”, &xn, %d”, &xn, xmxm, &xs );, &xs ); k = find( num, n, xn ); k = find( num, n, xn ); /*/* 查找指定学号查找指定学号 */*/ if ( k >= 0 ) if ( k >= 0 ) /*/*指定学号有,修改功能指定学号有,修改功能 */*/ { score[k]=xs; { score[k]=xs; strcpy(name[k],xm);strcpy(name[k],xm); return n; } return n; } k = find( num, n, 0 ); k = find( num, n, 0 ); /*/* 查找空学号查找空学号 */*/ if ( k == -1 ) if ( k == -1 ) /*/*空学号无,增加总数空学号无,增加总数 */*/ k = n++;k = n++; num[k]=xn; num[k]=xn; strcpy(name[k],xm);strcpy(name[k],xm); score[k]=xs; return n;score[k]=xs; return n; }}

Page 56: 《 程序设计基础( C ) 》

学生信息管理学生信息管理 // 姓名姓名 main()main() {{ int num[100], score[100], n=0;int num[100], score[100], n=0; char name[100][80];char name[100][80]; …… …… case ‘A’: case ‘A’: n=n=add_stu2add_stu2(num,(num,namename,score,n);,score,n); break;break; case ‘D’:case ‘D’: n=del_stu(num,n);break;n=del_stu(num,n);break; …… …… }}