实验七 函数的应用
- 格式:doc
- 大小:45.50 KB
- 文档页数:7
一、实验目的1. 理解函数的概念及其应用。
2. 掌握函数的基本性质和运算。
3. 应用函数解决实际问题。
4. 提高数学思维能力和解决问题的能力。
二、实验内容本次实验主要围绕以下内容展开:1. 函数的定义及性质2. 常见函数的图像和性质3. 函数的运算4. 函数在实际问题中的应用三、实验步骤1. 函数的定义及性质(1)首先,我们学习了函数的定义:设A、B是两个非空数集,如果按照某种确定的对应关系f,使得对于集合A中的任意一个数x,在集合B中都有唯一确定的数y与之对应,则称这种对应关系f为从集合A到集合B的一个函数,记作f:A→B。
(2)接着,我们探讨了函数的基本性质,如单调性、奇偶性、周期性等。
(3)最后,我们分析了函数的图像,了解函数图像与函数性质之间的关系。
2. 常见函数的图像和性质(1)我们学习了幂函数、指数函数、对数函数、三角函数等常见函数的图像和性质。
(2)通过绘制函数图像,我们观察了函数的增减性、对称性、周期性等特征。
(3)我们掌握了如何根据函数图像分析函数性质的方法。
3. 函数的运算(1)我们学习了函数的加法、减法、乘法、除法、复合等基本运算。
(2)通过练习,我们熟练掌握了函数运算的技巧。
(3)我们了解了函数运算在实际问题中的应用。
4. 函数在实际问题中的应用(1)我们学习了如何利用函数解决实际问题,如优化问题、增长率问题等。
(2)通过实例分析,我们掌握了函数在实际问题中的应用方法。
(3)我们提高了运用数学知识解决实际问题的能力。
四、实验结果与分析1. 函数的定义及性质通过实验,我们掌握了函数的定义和基本性质,如单调性、奇偶性、周期性等。
同时,我们了解了函数图像与函数性质之间的关系。
2. 常见函数的图像和性质通过绘制函数图像,我们直观地观察了函数的增减性、对称性、周期性等特征。
这有助于我们更好地理解函数的性质。
3. 函数的运算通过练习,我们熟练掌握了函数的加法、减法、乘法、除法、复合等基本运算。
C语言实验七函数实验报告一、实验目的1、掌握函数的定义和调用方法。
2、理解函数参数的传递方式。
3、学会使用函数实现程序的模块化设计。
二、实验环境1、操作系统:Windows 102、开发工具:Visual Studio 2019三、实验内容本次实验主要涉及以下几个方面的内容:1、编写简单的函数实现特定功能,如计算两个数的和、差、积、商等。
2、理解函数参数的传递方式,包括值传递和引用传递,并通过实例进行验证。
3、利用函数实现程序的模块化设计,将复杂的问题分解为多个相对简单的函数,提高程序的可读性和可维护性。
四、实验步骤及结果(一)函数的定义和调用1、首先,定义了一个计算两个整数之和的函数`int add(int a, intb)`,函数内部通过返回`a + b`的值来实现求和功能。
```cint add(int a, int b) {return a + b;}```2、在`main`函数中调用该函数,并输出结果。
```cint main(){int num1 = 5, num2 = 3;int sum = add(num1, num2);printf("两数之和为:%d\n", sum);return 0;}```运行结果:两数之和为:8(二)函数参数的传递方式值传递1、定义一个函数`void swap_value(int a, int b)`,尝试在函数内部交换两个参数的值。
```cvoid swap_value(int a, int b) {int temp = a;a = b;b = temp;}```2、在`main`函数中调用该函数,并输出交换前后参数的值。
```cint main(){int num1 = 5, num2 = 3;printf("交换前:num1 =%d, num2 =%d\n", num1, num2);swap_value(num1, num2);printf("交换后:num1 =%d, num2 =%d\n", num1, num2);return 0;}```运行结果:交换前:num1 = 5, num2 = 3交换后:num1 = 5, num2 = 3可以看到,值传递方式下,函数内部对参数的修改不会影响到函数外部的实参。
实验七用Python解常微分方程摘要本实验使用Python编程语言解决常微分方程(Ordinary Differential Equations, ODEs)问题。
常微分方程是描述自然界的变化和动态过程的数学工具,具有广泛的应用价值。
Python拥有强大的数值计算和绘图功能,因此是解决常微分方程问题的理想工具。
本实验将介绍常见的ODE求解方法,并给出相应的Python代码示例。
引言常微分方程描述了函数及其导数之间的关系,可以用来解决一系列实际问题,如物理、工程、经济等各个领域。
通过数值方法求解ODE,可以得到函数的近似解,从而对实际问题进行定性和定量分析。
ODE的数值解法常见的ODE求解方法包括欧拉法、改进欧拉法、龙格-库塔法等。
这些方法基于数值逼近的原理,通过迭代计算逼近函数的解。
以下是这些方法的简要介绍:1. 欧拉法(Euler's method):将函数的导数展开为差商的形式,利用差商逼近导数,从而得到函数的近似解。
2. 改进欧拉法(Improved Euler's method):在欧拉法的基础上引入中间点的逼近,进一步提高近似解的准确性。
3. 龙格-库塔法(Runge-Kutta method):通过计算不同权重的斜率加权平均来逼近函数的导数,并利用逼近的导数进行迭代计算。
使用Python解常微分方程的示例代码以下是使用Python解常微分方程的示例代码,具体说明见代码注释:import numpy as npimport matplotlib.pyplot as plt定义常微分方程的函数形式def ode_func(t, y):return -y + np.sin(t)欧拉法求解常微分方程def euler_method(ode_func, t_start, t_end, y_init, step_size): num_steps = int((t_end - t_start) / step_size) + 1t = np.linspace(t_start, t_end, num_steps)y = np.zeros(num_steps)y[0] = y_initfor i in range(1, num_steps):y[i] = y[i-1] + step_size * ode_func(t[i-1], y[i-1])return t, y解常微分方程并绘制结果t_start, t_end = 0, 10y_init = 0step_size = 0.1t, y = euler_method(ode_func, t_start, t_end, y_init, step_size)plt.plot(t, y)plt.xlabel('t')plt.ylabel('y')plt.title('Solution of ODE using Euler\'s method')plt.grid(True)plt.show()结论本实验介绍了用Python解常微分方程的基本方法和示例代码,涉及了欧拉法。
实验七 参考答案(参考答案)(1) (sy7-1.c )请编写函数fun ,它的功能是:计算并输出n (包括n )以内能被5 或9 整除的所有自然数的倒数之和。
例如,若主函数从键盘给n 输入20后,则输出为s=0.583333。
注意:n 的值要求不大于100。
算法分析:使用for 循环i ,遍历n 包含n 以内的所有整数,逐一判断每个i ,是否满足条件(能被5 或9 整除),如果满足,则把它的倒数累加到累加器里。
注意:i 的倒数要表示成:1.0/i;参考子函数如下:double fun(int n){double sum=0;int i;for(i=5;i<=n;i++)if(i%5==0||i%9==0)sum=sum+1.0/i;return sum;}(2) (sy7-2.c ) 请编写函数fun ,其功能是:根据以下公式计算s ,并计算结果作为函数值返回,n 通过形参传入。
n s ⋯++++⋯++++++=321132112111例如:若n 的值为11时,函数的值为1.83333算法分析:等式右边从第二项(i=2)开始,其分母等于前一项的分母加上i ;一共有n 项;求出每项的分母,然后把每项进行累加。
参考子函数如下:float fun(int n){float sum=1; //sum 中已经累加了第一项的值int i,m=1; //m 表示每项的分母;for(i=2;i<=n;i++){ m=m+i;sum=sum+1.0/m;}return sum;}(3) (sy7-3.c)请编写函数fun,其功能是:将两个两位数的正整数a、b 合并形成一个整数放在c 中。
合并的方式是:将 a 数的十位和个位依次放在c 数的十位和千位上,b 数的十位和个位数依次放在c 数的个位和百位上。
例如,当a=45,b=12,调用该函数后,c=5241。
算法分析:对一个两位数n,它的各位可以通过n%10求的,它的十位数可以通过n/10求的;所以分别用上述方法求的a和b的个位和十位,同时按照要求累加到c里。
实验七 图的建立及其应用一、实验目的:(1)掌握图的存储思想及其存储实现。
(2)掌握图的深度、广度优先遍历算法思想及其程序实现。
(3)掌握图的常见应用算法的思想及其程序实现。
(4)理解有向无环图、最短路径等算法二、实验要求1.将算法中的横线内容填写完整,使程序能正常运行2.在主函数中设计一个简单的菜单,具有如下功能。
(1)建立有向图的邻接表;(2)输出邻接表;3.实现图的深度优先遍历的算法(选做)4.完成实际应用(选做)三、实验原理1、图(GRAPH )是一种复杂的数据结构,结点之间的关系可以是任意的,由此图的应用极为广泛,已经渗透到如物理、化学、电讯工程、计算机科学等领域。
2、图存储结构:邻接矩阵表示法和邻接表表示法,本次实验图主要以邻接表进行存储。
用邻接矩阵表示法表示图如下图所示:0 1 0 1 A = 1 0 1 10 1 0 01 0 0 1一个无向图的邻接矩阵表示无向图对应的邻接表表示如下图所示:序号一个无向图的的邻接表表示四、实验程序说明图类型定义typedef struct Node{int dest; //邻接边的弧头结点序号struct Node *next;}Edge; //邻接边单链表的结点的结构体typedef struct{DataType data; //图顶点Edge *adj; //邻接边的头指针}AdjLHeight; //数组的数据元素类型结构体typedef struct{AdjLHeight a[MaxVertices]; //邻接表数组int numOfVerts; //结点个数int numOfEdges; //边个数}AdjLGraph; //邻接表结构体五、参考程序#include<malloc.h> /* malloc()等*/#include<stdio.h> /* EOF(=^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<process.h> /* exit() */typedef char DataType;#define MaxVertices 10void AdjInitiate(AdjLGraph *G)//初始化图{int i;G->numOfEdges=0;G->numOfVerts=0;for(i=0;i<MaxVertices;i++){G->a[i].adj = NULL ;//设置邻接边单链表头指针初值}}void InsertVertex(AdjLGraph *G,int i,DataType vertex)//在图中的第i个位置插入顶点数据元素vertex{if(i>=0&&i<MaxVertices){G->a[i].data =vertex; //存储顶点数据元素vertexG->numOfVerts++ ; //个数加1 }else printf("结点越界");}void InsertEdge(AdjLGraph *G,int v1,int v2)//在图中加入边<v1,v2>的信息{Edge *p;if(v1<0||v1>=G->numOfVerts||v2<0||v2>=G->numOfVerts){printf("参数v1和v2越界出错!");exit(0);}p=(Edge*)malloc(sizeof(Edge));//申请邻接边单链表结点空间p->dest=v2; //设置邻接边弧头序号p->next = G->a[v1].adj ; //新结点插入邻接表的表头G->a[v1].adj = p ; //头指针指向新的单链表表头G->numOfEdges++; //边个数加1}int GetFirstVex(AdjLGraph G,int v)//取图G中结点v的第一个邻接结点{Edge *p;if(v<0||v>=G.numOfVerts){printf("参数出错!");exit(0);}p=G.a[v].adj;if(p!=NULL)return p->dest;else return -1;}int GetNextVex(AdjLGraph G,int v1,int v2)//取图G中结点v1的邻接结点v2的下一个邻接结点{Edge *p;if(v1<0||v1>=G.numOfVerts||v2<0||v2>=G.numOfVerts){printf("参数v1和v2越界出错!");exit(0);}p=G.a[v1].adj;while(p!=NULL){if(p->dest!=v2){p = p->next ;continue;}else break;}p=p->next;if(p!=NULL) return p->dest;else return -1;}void main(void){int i,k,n,e,v1,v2;char c1;Edge *p;AdjLGraph G;AdjInitiate(&G);printf("输入图的顶点数\n");scanf("%d",&n);getchar();printf("输入图顶点为(请输入字母)\n");for(i=0;i<n;i++){scanf("%c",&c1); //通过键盘,输入图的顶点getchar();InsertVertex(&G,i,c1) ; //插入顶点}printf("输入图的边数\n");scanf("%d",&e);printf("如果边v1->v2,则输入0,1\n");for(k=0;k<e;k++){printf("输入边的顶点为(请输入数字):");scanf("%d,%d",&v1,&v2); //通过键盘,输入图的邻接边的两个顶点InsertEdge(&G,v1,v2) ; //插入边}for(i=0;i<n;i++)//输出邻接表{printf("%c\t",G.a[i].data);p=G.a[i].adj;if(p==NULL) printf("数据为空");else{ while(p!=NULL){printf("%d->",p->dest);p=p->next;}printf("^");}printf("\n");}}序号六、应用题(一)校园导游图实验内容:1、设计学生所在学校的校园平面图,所含景点不少于10个。
实验七用Maple解常微分方程1. 实验目的本实验旨在通过使用数学建模软件Maple来解常微分方程,加深对常微分方程解法的认识和理解。
通过实际操作和观察结果,提高对Maple软件的运用能力。
2. 实验原理常微分方程是描述物理、化学、工程等领域中的连续变化过程的常见数学工具。
解常微分方程可以帮助我们理解系统的演化规律,从而进行预测和控制。
Maple是一款强大的数学软件,其中包含了丰富的求解常微分方程的函数。
通过输入常微分方程的表达式,Maple可以直接给出解析解或数值解。
在本实验中,我们将使用Maple来解常微分方程。
3. 实验步骤3.1 安装Maple软件3.2 打开Maple软件双击桌面上的Maple图标,打开软件。
3.3 输入常微分方程点击菜单栏中的"输入",选择"数学输入",在弹出的对话框中输入常微分方程的表达式。
例如,我们要解的方程是一阶线性常微分方程`dy/dx + y = 0`,则输入表达式为:diff(y(x),x) + y(x) = 03.4 求解方程点击菜单栏中的"执行",选择"执行工作表",Maple将根据输入的方程进行求解。
3.5 查看解析解或数值解Maple会给出方程的解析解或数值解。
根据实验需求,可以选择相应的解进行查看和分析。
3.6 导出结果点击菜单栏中的"文件",选择"导出为",选择导出格式和保存路径,点击"保存",将结果导出为文档或图像文件。
4. 实验结果根据实验中输入的常微分方程,Maple求解得到如下解析解:y(x) = C exp(-x)其中C为任意常数。
5. 实验总结通过本次实验,我们研究了使用Maple软件求解常微分方程的方法。
Maple的强大功能和简便操作使得解常微分方程变得更加容易。
通过实际操作,我们可以深入理解常微分方程的解法和物理意义。
实验七-运算符重载参考答案实验七多态性—函数与运算符重载7.1 实验目的1.理解掌握成员函数方式运算符重载;2.理解掌握友元函数方式运算符重载;3.理解掌握++、--运算符的重载。
7.2 实验内容7.2.1程序阅读1.理解下面的程序,并运行查看结果,回答程序后面的问题。
#include <iostream>using namespace std;class CComplex{public:CComplex(){real = 0;imag = 0;}CComplex(int x,int y){real = x;imag = y;}int real;int imag;CComplex operator + (CComplex obj1)//---------------------------------------------①{CComplex obj2(real - obj1.real, imag - obj1.imag);return obj2;}};int main(){CComplex obj1(100,30);CComplex obj2(20, 30);CComplex obj;obj = obj1+obj2; //------------------------------------------------------------------②cout << obj.real <<endl;cout << obj.imag << endl;return 0;}问题一:①处的运算符重载,为什么该函数的返回值要设计成CComplex类型?答:因为在函数中return obj2,obj2是CComplex 类型,所以函数返回值要与return返回的类型相同,即设计成CComplex类型。
问题二:②处的运算符重载函数调用就相当于“obj=operator+(obj1,obj2);”,但是为什么CComplex类中的运算符重载函数只设计了一个参数?答:因为成员函数经编译后会产生this指针,this指针会指向调用该函数的obj1对象,该obj1对象就是就相当于函数的第一个参数。
实验七虚函数及应用一、实验目的1.理解虚函数与运行时(动态)多态性之间的关系,掌握虚函数的定义及应用;2.理解纯虚函数与抽象类的概念,掌握抽象类的定义及应用;3.理解虚析构函数的概念及作用。
二、实验学时课内实验:2课时课外练习:2课时三本实验涉及的新知识㈠虚函数与动态多态性在C++中,如果将基类与派生类的同名成员函数定义为虚函数,就可以定义一个基类指针,当基类指针指向基类对象时访问基类的成员函数,当基类指针指向派生类对象时访问派生类的成员函数,实现在运行时根据基类指针所指向的对象动态调用成员函数,实现动态多态性。
换句话说,虚函数与派生类相结合,使C++能支持运行时(动态)多态性,实现在基类中定义派生类所拥有的通用“接口”,而在派生类中定义具体的实现方法,即“一个接口,多种方法”。
㈡虚函数的定义1.在基类中定义在定义函数的前面加上“virtual ”。
即:virtual 返回类型函数名(参数表){ …… }2.在派生类中定义函数的返回类型、函数名、参数的个数、参数类型及顺序必须与基类中的原型完全相同。
3.说明:⑴在派生类中定义虚函数时,可用“virtual”也可不用“virtual”(最好都使用)。
⑵虚函数在派生类中重新定义时,其原型必须与基类中相同。
⑶必须用基类指针访问虚函数才能实现运行时(动态)多态性;当用普通成员函数的调用方法(即用圆点运算符)调用虚函数时,为静态调用;⑷虚函数在自身类中必须声明为成员函数(不能为友元函数或静态成员函数),但在另一个类中可以声明为友元函数。
⑸虚函数可以公有继承多次,其虚函数的特性不变。
⑹构造函数不能定义为虚函数,但析构函数可以定义为虚函数。
⑺虚函数与重载函数的关系①普通函数重载是通过参数类型或参数的个数不同实现的;重载一个虚函数时,其函数原型(返回类型、参数个数、类型及顺序)完全相同。
②当重载的虚函数只有返回类型不同时,系统将给出错误信息;如果定义的虚函数只有函数名相同,而参数个数或类型不同时,则为普通函数重载。
实验七函数的应用一、实验目的1. 掌握函数的定义和调用方法。
2.. 掌握函数实参与形参的参数传递关系。
二、实验任务1.阅读、调试、运行程序,比较阅读的结果和运行的结果。
1)#include "stdio.h"void main(){ int func(int a, int b);int k=4,m=1,p;p=func(k,m);printf("%d,",p);p=func(k,m);printf("%d\n",p);}int func(int a, int b){int m=0,i=2;i+=m+1;m=i+a+b;return m;}2)#include "stdio.h"void fun(int x, int y, int z){ z=x*x+y*y; }void main(){ int a=31;fun(5,2,a);printf("%d\n",a);}3)#include "stdio.h"int fun(int a, int b){ if(a>b) return(a);else return(b);}void main(){ int x=3, y=8, z=6, r;r=fun(fun(x,y), 2*z);printf("%d\n", r);}4)#include "stdio.h"void main(){ void fun(int i,int j);int i=2,x=5,j=7;fun(j,6);printf("i=%d,j=%d,x=%d\n",i,j,x); }void fun(int i,int j){ int x=7;printf("i=%d,j=%d,x=%d\n",i,j,x); }5)#include <stdio.h>void main(){int f(int a,int b);int i=2, p;p=f(i, i+1);printf("%d\n", p);}int f(int a,int b){int c;c=a;if(a>b) c=1;else if (a==b) c=0;else c=-1;return (c);}6)#include <stdio.h>int func(int a, int b){int c;c = a + b;return c;}void main(){int x = 6, y = 7, z = 8, r;r = func((x--,y++,x+y),z--);printf("%d\n",r);}2. 完善程序,并调试运行1)验证哥哥德巴赫猜想:任何一个大于6的偶数均可表示为两个素数之和。
例如6=3+3,8=3+5,…,18=7+11。
将6——100之间的每个偶数都表示成两个素数之和。
函数prime(m)用于判断m是否为素数。
素数就是只能被1和自身整除的正整数,1不是素数,2是素数。
[程序]#include "stdio.h"#include "math.h"void main(){ int i, k;int prime(int m);for (i=6;i<=100;i=i+2)for(k=3;k<=50;k++)if( (1) ){printf ("%d = %d+%d\n", i, k, i-k);break;}}int prime(int m){int k, n;if(m==1) return 0;n=(int)sqrt (m);for(k=2;k<=n;k++)(2) ;(3) ;}2)以下程序的功能是调用函数fun计算:m=1-2+3-4+…+9-10,并输出结果。
请填空。
#include <stdio.h>int fun(int n){int m=0,f=1, i;for(i=1;i<=n;i++){m+=i*f;f= (1) ;}return m;}void main() { printf("m=%d\n", (2) );}3)以下程序的功能是求字符串的长度, 程序中有4个空,填空使程序完整。
#include<stdio.h>int length(char str[]){ int i,n; (1) while( (2) ){n++;i++;} (3)}void main(){char s[80];int len;printf("please enter a string:\n");gets(s); (4)printf("The length of the string is:%d\n",len);}4)以下程序的功能是输出由字符w 构造成的形如W 的图形。
如图所示的为5行的图形。
#include <stdio.h> void draw(int n) { int i,j,k,r,m; for(i=1; (1) ;i++) {for(j=1;j<=2;j++) {for(r=1;r<i;r++)printf(" ");printf("w"); for(k=1; (2) ;k++)printf(" ");printf("w");for(m=1;m<i;m++)printf(" ");} (3)}}void main(){int n;printf("input a number:"); (4)draw(n);}w ww w w w w w w w w w w w w w ww ww5)以下程序的功能是求100-999之间的水仙花数(水仙花数是指一个三位数的各个位数字的立方和是这个数本身,如:153=13+53+33)。
#include <stdio.h>int fun(int n){ int i,j,k,m;m=n; (1)for(i=1;i<4;i++) { (2)m=(m-j)/10;k=k+j*j*j; } if(k==n) (3)else return(0);}void main(){ int i;for(i=100;i<1000;i++) if( (4) ==1)printf("%d is ok!\n" ,i);}3. 修正程序,并调试运行1)以下程序的功能是求S=1+211++3211+++……+n +⋯⋯+++3211。
注意:程序中有四处错误,不得增行和删行,也不得更改程序的结构! 程序如下:#include <stdio.h>void main(){int n;float fun();printf("Please input a number:");/************found************/scanf("%d",n) ;printf("%10.6f\n",fun(n));}/************found************/float fun(int n){int i,j,t;float s;s=0;/************found************/for(i=1;i<=n;i++);{t=0;for(j=1;j<=i;j++)t=t+j;/************found************/s=s+1/t; }return s;}2)下列给定程序中,函数fun的功能是:判断m是否为素数,若是返回1,否则返回0。
#include <stdio.h>int fun(int m);void main(){int m,k=0;for(m=1;m<100;m++)if(fun(m)==1){printf("%4d",m); k++;if(k%5==0)printf("\n");}}/************found************/void fun( int m){int i,k=1;if(m<=1) k=0;/************found************/for(i=1;i<m;i++)/************found************/if(m%i=0) k=0;/************found************/return m;}3)下列给定程序中,函数fun的功能是:求1到10的阶乘的和。
#include <stdio.h>void main(){int i;float s=0;float fac(int n);/************found************/for(i=1;i<10;i++)/************found************/s=fac(i);printf("%f\n",s);}float fac(int n){/************found************/int y=1;int i;for(i=1 ;i<=n;i++)y=y*i;/************found************/return;}4.编写程序,并调试运行1) 编写判断一个数是否为素数的函数,然后调用该函数,输出100以内的所有素数。
2)编写计算n!的函数,然后调用该函数计算C m n的值。