电脑硬盘坏了,所有调好的程序又得慢慢写,重新做了,请老师原谅一下我这两周迟交的作业,呜呜
作业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;
}
书里的例题就到此结束吧