第五章实验(前)

电脑硬盘坏了,所有调好的程序又得慢慢写,重新做了,请老师原谅一下我这两周迟交的作业,呜呜

作业1

课本的例题

例题5.1

定义一个无参数函数并输出 

其中用到了void 用来规划命名不返回值的自定义函数

/*************************************************
**   例题5.1       定义一个无参数函数  ** 
**   自动化1121    李庆典              **
*************************************************/

#include<iostream>          //预编译处理命令
using namespace std;        //标准名字 空间

void wudingyicanshu()
{
	cout<<"这是一个无参数函数"<<endl;   
}

int main()
{
	wudingyicanshu();
	return 0;
}
运行结果如下


例题5.2  

定义一个有参数的数,用来输出最小值

这里用到了有参数定义函数的标准方式  : double min(double x,double y)  

 在需要返回值时,不同void我们需要先定义返回的值的类型,然后还需使用标注的形参形式

/*************************************************
**   例题5.2       定义一个有参数函数           **
**   自动化1121    李庆典                       **
*************************************************/

#include<iostream>          //预编译处理命令
using namespace std;        //标准名字 空间

double min(double x,double y)
{
	return x<y?x:y;
}

int main()                //主函数
{
	int a,b;
	cout<<"请输入两个需要比较的数"<<endl;
	cin>>a>>b;
	cout<<min(a,b)<<endl;
	return 0;
}
运行结果如下



例题5.3

是讲定义函数原型 ,相比需要拥有返回值的有参数函数定义而言,函数原型可以不包含参数的名字,而有参数函数的定义需要参数的名字和类型,

函数原型的作用很大,最主要是用来调用后面出现的自定义函数,一旦自定义函数出现在前面的话也可以直接省去自定义函数的,可以说是对自定义函数的一个声明,以防止后面程序出错 这是我的理解,也不知道对不对,并且注意到,这是一个语句,需要再加一个;

这里直接改5.2的程序   虽然看似在这里比较没用,不过,一旦程序长了,这个将很好用

/*************************************************
**   例题5.3       定义一个函数原型             **
**   自动化1121    李庆典                       **
*************************************************/

#include<iostream>          //预编译处理命令
using namespace std;        //标准名字 空间

double min (double,double);   //函数原型

int main()                //主函数
{
	int a,b;
	cout<<"请输入两个需要比较的数"<<endl;
	cin>>a>>b;
	cout<<min(a,b)<<endl;
	return 0;
}

double min(double x,double y)   //自定义函数
{
	return x<y?x:y;
}



例题5.4 调用函数的举例,比较简单,就不发了


例题5.5 验证实参求值的顺序,

实际程序表明,实参求值时的顺序是从右向左调用的,我还特意改动了一下程序,输出了k值以及--a后的值

/*************************************************
**   例题5.5       验证实参求值的顺序           **
**   自动化1121    李庆典                       **
*************************************************/

#include<iostream>          //预编译处理命令
using namespace std;        //标准名字 空间

int ncomp(int i,int j)      //自定义函数,用于验证实参求值顺序
{
	if(i>j) return 1;
	if(i==j) return 0;
	return -1;
}

int main()                //主函数
{
	int k=2;
	int n=ncomp(k,++k);   //验证实参的调用是先从右边开始的
	cout<<n<<endl;
	cout<<k<<endl;

	int a=2;
	int l=ncomp(a,--a);
	cout<<l<<endl;
	cout<<a<<endl;
	return 0;
}

运行结果如下


例题5.7

说明被调用函数之中的形参变化时,并不会影响主函数中的实参的变化

/*************************************************
**   例题5.7       验证实参不受形参影响         **
**   自动化1121    李庆典                       **
*************************************************/

#include<iostream>          //预编译处理命令
using namespace std;        //标准名字 空间

int sqr(int x)             //自定义平方函数
{
	x=x*x;                 
	return x;
}

int main()                //主函数
{
	int t=10;
	int s=sqr(t);
	cout<<"t="<<t<<endl                 //t值为实参,不变
		<<"sqr("<<t<<")="<<s<<endl;     //对于sqr函数中,调用之后,t为100,但不会影响到主函数的t值

	return 0;
}



例题5.8 5.9

用函数互换的方法实现两个数据的互换,此例题中举例说明了形参的值改变并不会影响到实参的值,如以下程序中,输出的值为一摸一样的

/*************************************************
**   例题5.8  用值调用的方法实现数据互换        **
**   自动化1121    李庆典                       **
*************************************************/

#include<iostream>          //预编译处理命令
using namespace std;        //标准名字 空间

void swap(int u,int v);     //swap函数原型


int main()                //主函数
{
	int a=3;
	int b=4;
	cout<<"a ="<<a<<"\t b ="<<b<<endl;   //输出原值
	swap(a,b);
	cout<<"a ="<<a<<"\t b ="<<b<<endl;    //输出互换后的值

	return 0;
}

void swap(int u,int v)  //自定义函数互换函数
{
	int t;              //中间变量
	t=u;
	u=v;
	v=t;
}
运行结果如下



此时,运用引用型,将形参声明为引用型时,即可实现参数的引用调用,只需在参数名字前面加上引用运算符& 即可 【并注意&可以靠中或靠左右】

/*************************************************
**   例题5.8  用值调用的方法实现数据互换        **
**   自动化1121    李庆典                       **
*************************************************/

#include<iostream>          //预编译处理命令
using namespace std;        //标准名字 空间

void swap(int &u,int & v);     //swap函数原型


int main()                //主函数
{
	int a=3;
	int b=4;
	cout<<"a ="<<a<<"\t b ="<<b<<endl;   //输出原值
	swap(a,b);
	cout<<"a ="<<a<<"\t b ="<<b<<endl;    //输出互换后的值

	return 0;
}

void swap(int &u,int &v)  //自定义函数互换函数
{
	int t;              //中间变量
	t=u;
	u=v;
	v=t;
}
运算结果如下 此时才算真正的调用成功



例题5.10 

return 语句中,注意若需要返回一个值【有且只能有一个值】,需要返回函数定义中相同类型的值,不然系统会自行转换

若不需要返回值,则一般在函数前面加上 viod,且return 语句后面不带表达式,而且,在此种情况下,该函数的最后一条return语句也可以省略,如例题5.1


例题5.11

输出输入参数的举例示例

/*************************************************
**   例题5.12     不同类型参数的使用示例        **
**   自动化1121    李庆典                       **
*************************************************/
//计算一元二次方程

#include<iostream>          //预编译处理命令
#include <cmath>            //标准c语言函数库
using namespace std;        //标准名字 空间

void jisuan(/*in*/double,/*in*/double,/*in*/double,
	         /*out*/double &,/*out*/double &);     //计算函数原型


int main()                //主函数
{
	double a,b,c;
	double x1,x2;
	cout<<"请输入方程的三个系数a,b,c:"<<endl;
	cin>>a>>b>>c;
	jisuan(a,b,c,x1,x2);
	
	cout<<"x1="<<x1<<'\t'<<"x2="<<x2<<endl;
}

void jisuan(double a,double b, double c,
	double &x1,double &x2)           //一元二次方程求解自定义函数
{
	double t;
	t=b*b-4.0*a*c;
	x1=(-b+sqrt(t))/(2.0*a);
	x1=(-b-sqrt(t))/(2.0*a);
}
运行结果如下





例题5.13

实现函数的嵌套调用

这里就很好的运用到了函数原型的定义了,能够防止程序在运行过程中出现差错

/*************************************************
**   例题5.13      函数的嵌套使用计算           **
**   自动化1121    李庆典                       **
*************************************************/
//计算一元二次方程

#include<iostream>          //预编译处理命令
#include <cmath>            //标准c语言函数库
using namespace std;        //标准名字 空间


long chengfan (int);        //乘方的定义函数
long jiecheng(int);         //阶乘的定义函数

long chengfan(int a)
{
	int b;
	long c;
	b=a*a;
	c=jiecheng(b);
	return c;
}

long jiecheng(int d)
{
	long f=1;
	for(int i=1;i<=d;i++)
		f *=i;
	return f;
}

int main()          //主函数
{
	int i;
	long sum =0;
	for(i=2;i<=3;i++)
		sum +=chengfan(i);
	cout<<"sum = "<<sum<<endl;
	return 0;
}

例题5.14

看似很复杂的程序,其实也只是嵌套函数的运用而已,只是算法比较复杂一点

/*************************************************
**   例题5.14      截弦法求根           **
**   自动化1121    李庆典                       **
*************************************************/


#include<iostream>          //预编译处理命令
#include <cmath>            //标准c语言函数库
using namespace std;        //标准名字 空间

float f(float x);                   //求函数值
float root(float x1,float x2);      //求方程的根
float point(float x1,float x2);     //求与X轴的交点

int main ()
{
	float x1,x2,y1,y2,x;
	do 
	{
		cout<<"请输入根所在的范围:";           //输入x1,x2的值知道f(x1)与f(x2)异号
		cin>>x1>>x2;
		y1=f(x1);
		y2=f(x2);
		cout<<"两端点的值为["<<y1<<","<<y2<<"]"<<endl;
	} while (y1*y2>=0);
	x=root(x1,x2);                   //求(x1,x2)区间的根
	cout<<"在"<<x1<<"与"<<x2<<"之间,方程的解为"<<x<<endl;
	return 0;
}

float f(float x)                     //求函数值
{
	return (x*x*x-4*x*x+6*x-10);
}

float root(float x1,float x2)
{
	float y1,x,y;
	y1=f(x1);
	do 
	{
		x=point(x1,x2);
		y=f(x1);
		if (y*y1>0)
		{
			y1=y;
			x1=x;
		} 
		else
		{
			x2=x;
		}
	} while (fabs(y)>=0.0001);
	return x;
}

float point(float x1,float x2)
{
	float y;
	y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
	return y;

}

例题5.15

利用递归函数来求n!  注意递归函数的调用过程中,一定要设置个终止条件跳出循环,逐层返回。

/*************************************************
**   例题5.15      递归法求           **
**   自动化1121    李庆典                       **
*************************************************/


#include<iostream>          //预编译处理命令
#include <cmath>            //标准c语言函数库
using namespace std;        //标准名字 空间

float fa(int n);            //阶乘函数原型

int main()                  //主函数
{
	int a;
	float f;
	cout<<"请输入要求的阶乘的n值:";
	cin>>a;
	f = fa(a);               //调用自定义的阶乘函数
	cout<<a<<"! = "<<f<<endl;

	return 0;
}

float fa( int n)               //阶乘函数
{
	float fact; 
	if (n==0)                  //跳出该函数的条件
	fact =1;
	else
	fact =n*fa(n-1);            //阶乘

	return fact;
}
运行结果如下




例题5.16

求递归函数,我用的VS2010版本编写C++,编程过程中把8赋给N时出现了错误,原因是N需要定义一个类型,于是改成const int N =8,程序就ok了

/*************************************************
**   例题5.15      递归法求fibonacci数列          **
**   自动化1121    李庆典                       **
*************************************************/


#include<iostream>          //预编译处理命令
#include <cmath>            //标准c语言函数库
using namespace std;        //标准名字 空间

const int N = 8;           //将8赋给常量N
long fibo(int n);

int main()                  //主函数
{
	long f = fibo(N);
	cout<<"fibonacci数列的第八项为:"<<f<<endl;
	return 0;
}
long fibo(int n)            //递归函数类型的自定义函数
{
	if(n==1) return 1;
	else if (n==2) return 1;
	else
		return fibo(n-1)+fibo(n-2);
}


例题5.19

有些例题比较简单,所以就省略掉了,接下来是全局变量的定义,主要用到了extern 来引用全局变量 全局变量很有用,可以在程序的不同函数中调用进行处理

/*************************************************
**   例题5.19      外部变量的使用          **
**   自动化1121    李庆典                       **
*************************************************/


#include<iostream>          //预编译处理命令
#include <cmath>            //标准c语言函数库
using namespace std;        //标准名字 空间

int max(int x,int y)         //求最大值
{
	int z;
	z= x>y?x:y;
	return z;
}

int main()
{
	extern int a,b;                 //外部变量的说明,用extern来引用
	cout<<max(a,b)<<endl;

	return 0;
}

int a=13,b=-8;                      //全局变量定义

例题5.20 同样一个对全局变量的应用举例

/*************************************************
**   例题5.19      外部变量的使用          **
**   自动化1121    李庆典                       **
*************************************************/


#include<iostream>          //预编译处理命令
#include <cmath>            //标准c语言函数库
using namespace std;        //标准名字 空间

void sort(int);
void echoa();
int a[5]={6,3,9,8,2};      //定义全局变量数组a

int main()                 //主函数
{
	cout<<"该一维数组为:";
	echoa();
	sort(5);
	cout<<"排序后数组为:";
	echoa();

	return 0;
}

void echoa()              //输出a[i]
{
	for (int i=0;i<5;i++)
	{
		cout<<a[i]<<'\t';
	}
	cout<<endl;
}

void sort(int n)
{
	int i,j,min,t;
	for (i=0;i<n-1;i++)
	{
		min=i;
		for (j=i+1;j<n;j++)
		if(a[j]<a[min])
			min=j;
		t=a[i];a[i]=a[min];a[min]=t;

	}
}


例题5.23

对于静态局部变量的举例

/*************************************************
**   例题5.23      打印连续整数阶乘          **
**   自动化1121    李庆典                       **
*************************************************/


#include<iostream>          //预编译处理命令
#include <cmath>            //标准c语言函数库
using namespace std;        //标准名字 空间

int fun(int);

int main()                   //主函数
{
	int i,k;
	cout<<"请输入一个非负整数:";
	cin>>k;
	for (i=1;i<=k;i++)
	{
		cout<<i<<"! = "<<fun(i)<<endl;
	}
	return 0;
}

int fun(int n)
{
	static int f=1;
	f=f*n;               //f为静态局部变量
	return f;
}

然后是用寄存器变量来打印 ,主要是下面的fun(int n)改变了,用register 来定义

/*************************************************
**   例题5.23      打印连续整数阶乘          **
**   自动化1121    李庆典                       **
*************************************************/


#include<iostream>          //预编译处理命令
#include <cmath>            //标准c语言函数库
using namespace std;        //标准名字 空间

int fun(int);

int main()                   //主函数
{
	int i,k;
	cout<<"请输入一个非负整数:";
	cin>>k;
	for (i=1;i<=k;i++)
	{
		cout<<i<<"! = "<<fun(i)<<endl;
	}
	return 0;
}

int fun(int n)
{
	register int i,f=1;
	for (i=1;i<=n;i++)
	f=f*i;
	return f;

}

书里的例题就到此结束吧 






评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值