资源预览内容
第1页 / 共48页
第2页 / 共48页
第3页 / 共48页
第4页 / 共48页
第5页 / 共48页
第6页 / 共48页
第7页 / 共48页
第8页 / 共48页
第9页 / 共48页
第10页 / 共48页
亲,该文档总共48页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
计算机程序设计计算机程序设计计算机教学实验中心计算机教学实验中心西安交大西安交大第5-6章 指针与函数F动态存储分配动态存储分配n指针作为函数参数指针作为函数参数n指针作为函数返回值指针作为函数返回值n指向函数的指针指向函数的指针n递归函数递归函数n函数重载函数重载n带参数的带参数的main()函数函数西安交大西安交大F程序中使用的变量、数组和函数必须先声明程序中使用的变量、数组和函数必须先声明后使用,编译系统根据声明语句开辟内存空后使用,编译系统根据声明语句开辟内存空间,因此数据占用的存储空间是固定的。这间,因此数据占用的存储空间是固定的。这种内存储器分配方法被称为种内存储器分配方法被称为静态存储分配静态存储分配F动态存储分配动态存储分配( (dynamic allocation)dynamic allocation)是在程是在程序运行过程中随机获得内存存储空间的方法序运行过程中随机获得内存存储空间的方法FC+C+用运算符用运算符newnew和和deletedelete实现动态存储分配实现动态存储分配动态存储分配西安交大西安交大F运算符运算符newnew用来申请所需的内存用来申请所需的内存 = = new new ( ); ; 例如:例如:int *pw;int *pw; pw = new int; pw = new int; *pw = 100; *pw = 100; 合并成一条语句:合并成一条语句:int *pw = new int (100); int *pw = new int (100); /动态、堆区动态、堆区 等价于:等价于:int i = 100;int i = 100; / /静态分配,在函数区域静态分配,在函数区域F也可为数组申请内存:也可为数组申请内存: = = new new ; 例如例如 double *pk;double *pk; pk = new double50; pk = new double50; 合并成一条语句:合并成一条语句:double *pk = new double50;double *pk = new double50; 等价于:等价于:double a50;double a50;new的使用西安交大西安交大F运算符运算符deletedelete用于释放先前申请到的存储块用于释放先前申请到的存储块delete delete ; 例如:例如: int *pi = new int;int *pi = new int; delete pw; delete pw;F若要释放数组的空间,必须放一个空的方括若要释放数组的空间,必须放一个空的方括号号在操作符在操作符deletedelete和指向该类对象数组的和指向该类对象数组的指针之间指针之间 例如:例如:int *p = new int size;int *p = new int size; delete p; delete p; delete的使用西安交大西安交大利用动态数组来求斐波那挈数列的前利用动态数组来求斐波那挈数列的前n n项项西安交大西安交大一元多项式求解一元多项式求解假设有如下一元多项式:假设有如下一元多项式: a an nX Xn n+a+an-1n-1X Xn-1n-1+.+a+.+a1 1X X1 1+a+a0 0编写程序求该多项式的值和多项式导数的值编写程序求该多项式的值和多项式导数的值这两个结果值的计算都必须采用函数求得,具体函数这两个结果值的计算都必须采用函数求得,具体函数原型如下:原型如下: double dxs(double a,double x,int n)double dxs(double a,double x,int n) double dxsds(double a,double x,int n) double dxsds(double a,double x,int n)形式参数形式参数aa用来存放多项式用来存放多项式n+1n+1个系数,个系数,x x为多项式的变量,为多项式的变量,n n为次方数。为次方数。(提示:先输入某个多项式系数,然后输出该多项式及其导(提示:先输入某个多项式系数,然后输出该多项式及其导数多项式,再输入某个数多项式,再输入某个x x的值,再输出多项式和导数的计的值,再输出多项式和导数的计算结果值)算结果值)西安交大西安交大#include /没有动态存储分配的求解没有动态存储分配的求解using namespace std;void print(double a,int n)if (a00) couta0;if (a00) cout(a0);for (int i=1;i0) cout+aixi; if (ai0) cout+(ai)xi;coutendl;void fun1(double a,int k,int n)for(int j=1;j=k;j+)for (int i=1;i0;i-)sum=(sum+ai)*x;sum=sum+a0;return sum;int main()double a100,a1100;double x;int n,k;coutn;cout请依次输入请依次输入n次多项式的系数(次多项式的系数(”n+1“个):个):endl;for (int i=0;iai;a1i=ai; cout输入的多项式为:输入的多项式为:;print(a,n);coutk;if (k=n)cout多项式的多项式的k阶导数的表达式为:阶导数的表达式为:endl;elsefun1(a1,k,n); cout多项式的多项式的k阶导数的表达式为:阶导数的表达式为:; print(a1,n-k);cout请输入请输入x:x;cout多项式的值为:多项式的值为:fun(a,x,n)=n)cout多项式的多项式的k阶导数的值为:阶导数的值为:endl;else cout多项式的多项式的k阶导数的值为:阶导数的值为:fun(a1,x,n-k)endl;return 0;/如何用动态存储分配方法求解?如何用动态存储分配方法求解?西安交大西安交大授课提纲n动态存储分配动态存储分配F指针作为函数参数指针作为函数参数n指针作为函数返回值指针作为函数返回值n指向函数的指针指向函数的指针n递归函数递归函数n函数重载函数重载n带参数的带参数的main()函数函数西安交大西安交大指针作为函数的参数F函数的参数不仅可以是基本数据类型的变量、函数的参数不仅可以是基本数据类型的变量、数组名或常量表达式,而且可以是指针数组名或常量表达式,而且可以是指针F如果实参是单写的数组名,则是指针常量如果实参是单写的数组名,则是指针常量F通过使实参与形参指针指向共同的内存空间通过使实参与形参指针指向共同的内存空间F或者说被调函数可以修改主调函数中的变量或者说被调函数可以修改主调函数中的变量西安交大西安交大如何编写部分字符串比较函数?如何编写部分字符串比较函数?字符串比较函数西安交大西安交大部分字符串比较函数西安交大西安交大F选择排序与冒泡排序方法较为相似选择排序与冒泡排序方法较为相似F循环循环N-1趟趟F每趟挑选最小元素放到数组每趟挑选最小元素放到数组“最最”左边左边F举例如下:举例如下:F初始状态:初始状态:2 7 2 2 3 1F第一趟:第一趟: 1 7 2 2 3 2F第二趟:第二趟: 1 2 7 2 3 2F第三趟:第三趟: 1 2 2 7 3 2F第四趟:第四趟: 1 2 2 2 3 7F第五趟:第五趟: 1 2 2 2 3 7F注意挑选最小元素时,先记录最小元素下标,注意挑选最小元素时,先记录最小元素下标,然后将最小元素与然后将最小元素与“最最”左边元素交换左边元素交换选择排序方法西安交大西安交大选择排序实现西安交大西安交大应用指针将三整数排序西安交大西安交大授课提纲n动态存储分配动态存储分配n指针作为函数参数指针作为函数参数F指针作为函数返回值指针作为函数返回值n指向函数的指针指向函数的指针n递归函数递归函数n函数重载函数重载n带参数的带参数的main()函数函数西安交大西安交大返回指针的函数F函数返回值类型不仅可以是函数返回值类型不仅可以是intint、doubledouble之类的简单之类的简单类型,也可以将一个地址类型,也可以将一个地址 ( (如变量、数组和函数的如变量、数组和函数的地址,指针变量的值等地址,指针变量的值等) )作为函数的返回值作为函数的返回值F在说明返回值为地址的函数时,要使用指针类型说在说明返回值为地址的函数时,要使用指针类型说明符,例如:明符,例如:Fchar *strchr(char *string, int c); char *strchr(char *string, int c); F返回返回c c字符的指针位置字符的指针位置Fchar *strstr(char *string1, char *string2); char *strstr(char *string1, char *string2); F返回串返回串2 2的指针位置的指针位置西安交大西安交大在字符串中查找字符函数在字符串中查找字符函数西安交大西安交大将月份数值转换英文名称西安交大西安交大授课提纲n动态存储分配动态存储分配n指针作为函数参数指针作为函数参数n指针作为函数返回值指针作为函数返回值F指向函数的指针指向函数的指针n递归函数递归函数n函数重载函数重载n带参数的带参数的main()函数函数西安交大西安交大指向函数的指针F任何函数在内存中存放都有首地址(第一字节地址)任何函数在内存中存放都有首地址(第一字节地址)F首地址是函数的入口地址。主函数在调用子函数时,就首地址是函数的入口地址。主函数在调用子函数时,就是让程序转移到函数的入口地址开始执行是让程序转移到函数的入口地址开始执行F指向函数的指针:就是指针的值为该函数的入口地址指向函数的指针:就是指针的值为该函数的入口地址F指向函数的指针变量的说明格式为指向函数的指针变量的说明格式为: :F (* (*)()(););Fint(*p)();int(*p)();/ p/ p为指向返回值为整型的函数的指针为指向返回值为整型的函数的指针Ffloat(*q)(float,int);float(*q)(float,int);/ q/ q为指向返回值为浮点型函数的指针为指向返回值为浮点型函数的指针F注意指针变量名前后的圆扩号不能少注意指针变量名前后的圆扩号不能少Fint *p();/int *p();/与函数原型混淆,二义性与函数原型混淆,二义性Ffloat *q (float,int); /float *q (float,int); /与函数原型混淆,二义性与函数原型混淆,二义性西安交大西安交大通用数值积分函数西安交大西安交大授课提纲n动态存储分配动态存储分配n指针作为函数参数指针作为函数参数n指针作为函数返回值指针作为函数返回值n指向函数的指针指向函数的指针F递归函数递归函数n函数重载函数重载n带参数的带参数的main()函数函数西安交大西安交大什么是递归函数F如果某个函数的函数体内有调用其自身如果某个函数的函数体内有调用其自身的语句,则该函数称为的语句,则该函数称为递归函数递归函数 int abc(float a,float b,float c) float x,y,z; int s; s=abc(x,y,z); 西安交大西安交大递归函数运行现象F递归函数运行有两种现象:递归函数运行有两种现象:F一种是永无休止地调用自身,形成一种是永无休止地调用自身,形成永久运行的现象,如同永久运行的现象,如同“死循环死循环”F另一种是加以控制,使函数经过有另一种是加以控制,使函数经过有限次数的调用,程序便停止运行限次数的调用,程序便停止运行西安交大西安交大永无休止运行的递归函数永无休止运行的递归函数西安交大西安交大有限次数地运行递归函数西安交大西安交大采用递归函数求n!F算法分析算法分析:由阶乘的概念可以写出其递归定义由阶乘的概念可以写出其递归定义F 0! = 10! = 1F n! = n*(n-1)! n! = n*(n-1)!F程程 序:序:int fac(int n)int fac(int n) if(n0)if(nn; factorial=f(n); coutfactorialn; factorial=f(n); coutfactorialendl; return 1; #设输入设输入n=332 f(3) /n=3 if (3=0) factorial=1; elsefactorial=3*f(3-1); return factorial;f(2) /n=2 if (2=0) factorial=1; elsefactorial=2*f(2-1); return factorial; 1 2 6西安交大西安交大过程追踪/#includeusing namespace std;int f(int n);int main()coutf(5)endl;return 0;int f(int n)int factorial=0;static int k=1;cout第第(k+)次调次调用用n=nendl;if(n=0)factorial= 1;else int tmp;tmp=f(n-1);factorial=n*tmp;coutn*tmp ;coutn!=factorial1n1时,就需要借助另外一个针来移动。将时,就需要借助另外一个针来移动。将n n片金片金片由片由A A移到移到C C上可以分解为以下几个步骤:上可以分解为以下几个步骤: (1)(1)将将A A上的上的n n 1 1片金片借助片金片借助C C针移到针移到B B针上针上; ; (2) (2)把把A A针上剩下的一片金片由针上剩下的一片金片由A A针移到针移到C C针上针上; ; (3) (3)最后将剩下的最后将剩下的n n 1 1个金片借助个金片借助A A针由针由B B针移到针移到C C针上针上n步骤步骤(1)(1)和和(3)(3)与整个任务类似,但涉及的金片只有与整个任务类似,但涉及的金片只有n n 1 1个了。这是一个典型递归算法个了。这是一个典型递归算法西安交大西安交大实现程序西安交大西安交大授课提纲n动态存储分配动态存储分配n指针作为函数参数指针作为函数参数n指针作为函数返回值指针作为函数返回值n指向函数的指针指向函数的指针n递归函数递归函数F函数重载函数重载n带参数的带参数的main()函数函数西安交大西安交大函数重载n函数重载函数重载: : 一组参数和返回值不同的一组参数和返回值不同的函数共用一个函数名。函数共用一个函数名。n重载函数之间必须在参数的类型或个重载函数之间必须在参数的类型或个数方面有所不同。只有返回值类型不数方面有所不同。只有返回值类型不同的几个函数不能重载。同的几个函数不能重载。西安交大西安交大求绝对值函数重载西安交大西安交大重载寻找最大元素西安交大西安交大授课提纲n动态存储分配动态存储分配n指针作为函数参数指针作为函数参数n指针作为函数返回值指针作为函数返回值n指向函数的指针指向函数的指针n递归函数递归函数n函数重载函数重载F带参数的带参数的main()函数函数西安交大西安交大带参数的main()F函数原型为:函数原型为:int main(int argc, char *argv)int main(int argc, char *argv) F第一个整型参数指明在以命令行方式执行本第一个整型参数指明在以命令行方式执行本程序时所带的参数个数(包括程序名本身,程序时所带的参数个数(包括程序名本身,故故argcargc的值至少为的值至少为1 1)F第二个参数为一个字符型指针数组(其中第第二个参数为一个字符型指针数组(其中第1 1个下标变量个下标变量argv0argv0指向本程序名,接下来的指向本程序名,接下来的下标变量下标变量argv1argv1,argv2.argv2.等分别指向命等分别指向命令行传递给程序的各个参数),用来存放命令行传递给程序的各个参数),用来存放命令行中命令字及各个参数的字符串令行中命令字及各个参数的字符串西安交大西安交大带参数的main函数的使用西安交大西安交大习 题实验作业实验作业1、(必做题)、(必做题) 使用递归算法编写如下程序:对于任意给定的实数使用递归算法编写如下程序:对于任意给定的实数 X 和整数和整数k( k0) ,计算,计算 Xk 。 2、(必做题)、(必做题) 使用递归算法编写求斐波那契数列的第使用递归算法编写求斐波那契数列的第 n 项的函数,并编出项的函数,并编出主函数进行验证。主函数进行验证。 3、 (必做题)第(必做题)第7章第章第18题题(增加重载字符型增加重载字符型)。 4、(必做题)编写一个函数,用于去掉字符串前面的空格,其原型为、(必做题)编写一个函数,用于去掉字符串前面的空格,其原型为 : char *myltrim(char *string); 其中参数其中参数 string 为字符串,返回值为指向为字符串,返回值为指向 string 的指针。的指针。 5、(必做题)、(必做题) 用牛顿迭代法求任意一元方程:用牛顿迭代法求任意一元方程: anXn+an-1Xn-1+.+a1X1+a0 0 的根。的根。 提示:迭代公式:提示:迭代公式:Xn+1 = Xn + f(Xn) / f(Xn) 结束迭代过程的条件为(结束迭代过程的条件为(|f(Xn+1)| )与()与(|Xn+1 - Xn| )同时成立,其)同时成立,其中中 为预先给定的精度要求。为预先给定的精度要求。 6、(必做题)将数字、小数点、正负号组成的字符串转换成相应的实数,例、(必做题)将数字、小数点、正负号组成的字符串转换成相应的实数,例如:如:-3.14159变成变成-3.14159。函数原型如下:。函数原型如下: double myatof(char *num);要求编写主函数加以测试。;要求编写主函数加以测试。7、(选做题)在字符串、(选做题)在字符串T中查找子串中查找子串S,若找到,返回子串的个数,若找不,若找到,返回子串的个数,若找不到返回到返回0。要求编写主函数加以测试。要求编写主函数加以测试。8、(选做题)、(选做题) 编写一个程序,当输入一个整型数字以后,可以转换成相应编写一个程序,当输入一个整型数字以后,可以转换成相应的大写英文单词输出。如:的大写英文单词输出。如: 123 转换成转换成 one hundred twenty three。西安交大西安交大
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号