📄 function.cpp
字号:
#include<iostream.h>
#include<math.h>
//【例3.1】 求三角形的面积
//分析:给定三个实数a,b,c,首先判断这三个数能不能构成三角形,然后再计算三角形的面积。
//三角形的面积s=sqrt(l*(l-a)*(l-b)*(l-c)),其中l=(a+b+c)/2。
Judge(float a, float b, float c) //判断a,b,c能否构成三角形,若能,返回1,否则返回0
{
if(a+b<=c||a+c<=b||b+c<=a) return 0;
else return 1;
}
float Area(float a, float b, float c)
{
float l;
l=(a+b+c)/2;
return (sqrt(l*(l-a)*(l-b)*(l-c)));
}
void main(void)
{
float x,y,z;
cout<<"输入三条边:";
cin>>x>>y>>z;
if(Judge(x,y,z))
cout<<"三角形的面积为:"<<Area(x,y,z)<<endl;
else
cout<<"这三条边无法构成一个三角形\n";
}
//【例3.2】 输入三个实数,求出其中的最大数。
int Max(int x , int y ) // A
{ return ( x>y ? x : y ) ; }
void Print(int x)
{ cout<<"三个数中最大的数为:"<<x<<endl; }
void main3_2(void )
{
int a, b, c, t;
cout<< "输入三个整数:" ;
cin>>a>>b>>c ;
t=Max(a,b); // B 调用有参函数,函数的返回值参与表达式运算
t=Max(c,t); // C
Print(t); // D 调用无参函数
cout<<Max(4.3, 5.4)<<'\n'; //E
cout<<Max('a', 'b')<<'\n'; //将'a'和'b'分别转换为97和98传递给函数Max()
// cout<<Max(a,b,c); //错误,调用Max(int,int)函数时多了一个参数
}
//【例3.3】利用参数类型的不同实现重载函数。
int Abs(int x)
{ //A
cout<<"调用函数Abs(int)."<<'\n';
return x>=0 ? x : -x;
}
double Abs(double x)
{ //B
cout<<"调用函数Abs(double)."<<'\n';
return x>=0 ? x : -x;
}
void main3_3()
{
cout<<"-20的绝对值是:"<<Abs(-20)<<endl; //C
cout<<"-111.11的绝对值是:"<<Abs(-111.11)<<endl; //D
}
//【例3.4】利用参数个数不相同实现重载函数。
int max(int a,int b);
int max(int a,int b,int c);
int max(int a,int b,int c,int d);
void main3_4()
{
cout<<max(3,5)<<endl;
cout<<max(-7,9,0)<<endl;
cout<<max(23,15,3,6)<<endl;
}
int max(int a,int b)
{ return a>b ? a : b; }
int max(int a,int b,int c)
{
int t=max(a,b);
return max(t,c);
}
int max(int a,int b,int c,int d)
{
int t1=max(a,b);
int t2=max(c,d);
return max(t1,t2);
}
//【例3.5】用内联函数计算立方体的体积
inline float Cube(float a)
{ return a*a*a; }
void main3_5()
{
cout<<"输入立方体的边长:";
float side;
cin>>side;
cout<<"边长为"<<side<<"的立方体的体积为:"
<<Cube(side)<<'\n'; //A
}
//【例3.6】 将例3.1改为如下的形式:
void main3_6(void)
{
float x,y,z;
cout<<"输入三条边:";
cin>>x>>y>>z;
int Judge1(float x1,float x2,float x3); //C 函数的原型说明(格式一)
float Area1(float,float,float ); //D 函数的原型说明(格式二)
if(Judge1(x,y,z)) //A
cout<<"三角形的面积为:"<<Area1(x,y,z)<<endl; //B
else
cout<<"这三条边无法构成一个三角形\n";
}
Judge1(float a, float b, float c)
{
if(a+b<=c||a+c<=b||b+c<=a) return 0;
return 1;
}
float Area1(float a, float b, float c)
{
float l;
l=(a+b+c)/2;
return (sqrt(l*(l-a)*(l-b)*(l-c)));
}
//【例3.7】 值传递应用--两数交换
void Swap(int a, int b)
{
int t;
cout<<"形参a、b的原值为:"<<a<<'\t'<<b<<endl;
t=a; a=b ; b=t; //借助中间变量t对a、b进行交换
cout<<"形参a、b经过交换后的值为:"<<a<<'\t'<<b<<endl;
}
void main3_7(void)
{
int x,y;
cin>>x>>y;
cout<<"实参x、y的原值为:"<<x<<'\t'<<y<<endl;
Swap(x,y); //A
cout<<"实参x、y经过交换后的值为:"<<x<<'\t'<<y<<endl;
}
//【例3.8】求一元二次方程ax2+bx+c=0的根。
float Delta(float a, float b, float c)
{ return b*b-4*a*c; }
void Root(float a, float b, float c)
{
float d,x1,x2,m,n;
d=Delta(a,b,c);
if(fabs(d)<=1e-6)
{
x1=x2=-b/(2*a);
cout<<"方程有两个相等的实根:x1=x2="<<x1<<endl;
}
else if(d>0)
{
x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
cout<<"方程有两个不等的实根:x1="<<x1<<'\t'<<"x2="<<x2<<endl;
}
else
{
m=-b/(2*a);
n=sqrt(-d);
cout<<"方程有一对共轭复根:";
cout<<"x1="<<m<<'+'<<n<<"i\t"<<"x2="<<m<<'-'<<n<<"i\n";
}
}
void main3_8(void)
{
float a,b,c;
cout<<"输入方程系数:";
cin>>a>>b>>c;
Root(a,b,c);
}
//【例3.9】用函数递归调用方法求5!。
//分析:由递推公式n!=n* (n-1)!,所以求n!的问题可以转化为求(n-1)!的问题,
/* (n-1)!=(n-1)* (n-2)!,因此求(n-1)!的问题可以转化为求(n-2)!的问题,依此类推,
直到转化为求1!的问题,根据定义,1!=1,则从1!=1开始将上述过程逆向求解,就可以求出n!。
这种求解问题的方法可用函数递归调用方法实现,*/
int f(int n){
if(n==0||n==1) return 1; //A
else return n*f(n-1); //B
}
void main3_9(void)
{
cout<<f(5)<<'\n' ;
}
//【例3.10】设计两个函数,其参数都为整型,分别将参数逐位正序和反序输出。若参数为1234,
//则逐位正序输出为1234,而逐位反序输出为4321。要求用递归函数实现。
/*分析:要实现逐位正序或反序输出一个整数,则必须获取它的各位数字。对一个整数,比如1234,
则很容易获得它的个位数,即1234%10,而要求十位数,则必须先将个位数去掉,即1234/10,结果为123,
然后再求其个位数即可,其余各位依此类推。因此在求一个整数K的各位数字时存在一种递推关系:
f1=K
tn=fn%10
fn+1=fn/10
其中tn为整数K的第n位数(最右边的数为第一位数),fn为去掉K的右边n-1位数后剩下的数。
而该递推关系的结束条件为fn=0。*/
void Convert(int n)
{
int t;
if(n==0){ cout<<endl; return;}
else
{
t=n%10;
n=n/10;
cout<<t;
Convert(n); //递归调用
}
}
void Original(int n)
{
int t;
if(n==0){return;}
else
{
t=n%10;
n=n/10;
Original(n); //递归调用
cout<<t;
}
}
void main3_10()
{
Convert(1234);
Original(1234);
cout<<endl;
}
//【例3.11】Hanoi(汉诺塔)问题。
void Move(char x, char y) //将x塔中的盘子移动到y塔
{ cout<<x<<"->"<<y<<endl; }
void Hanoi(int n,char one,char two,char three)
{
if(n==1) Move(one,three); //结束条件:当one塔中只剩下一个盘子时
else
{
Hanoi(n-1,one,three,two);
Move(one, three);
Hanoi(n-1,two,one,three);
}
}
void main3_11(void)
{
int m;
cout<<"请输入盘子个数:";
cin>>m;
Hanoi(m, 'A', 'B', 'C');
}
//【例3.12】块嵌套中标识符的使用
void main3_12(void)
{ //块B1
int i=1, j=2; //A 定义i,初始值为1
cout<<i<<'\t'<<j<<'\n'; //B
{ //块B2
int i=10; //C 定义i,初始值为10
j+=i; //D
cout<<i<<'\t'<<j<<'\n'; //E
}
cout<<i<<'\t'<<j<<'\n'; //F
}
//【例3.13】在块作用域内引用文件作用域的同名变量。
int i=100; //i具有文件作用域
void Global()
{
int i=200;
cout<<"函数Global()中的i="<<i<<'\n';
::i+=i; //改变全局变量
cout<<"函数Global()中的::i="<<::i<<'\n'; //输出全局变量
}
void main3_13(void)
{
int i;
i=300;
cout<<"函数main()中的i="<<i<<'\n'; //输出局部变量
Global();
::i+=i; //改变全局变量
cout<<"函数main()中的::i="<<::i<<'\n'; //输出全局变量
}
//【例3.14】使用静态类型的局部变量。
int f(void)
{
static k=10; //A 相当于static int k=10
k+=5;
return k;
}
void main3_14(void)
{
for (int i=0;i<5;i++)
cout<<f( )<<'\t'; //B
cout<<'\n';
}
//【例3.15】利用寄存器类型变量求l~15的阶乘。
void main3_15(void)
{
register float Fact=1; //定义实型寄存器变量Fact
for(register int i=1;i<=15;i++) //定义整型寄存器变量i
{
Fact*=i;
cout<<i<<"!="<<Fact<<'\n';
}
}
//【例3.16】外部类型变量的声明
int Max1(int x,int y)
{return x>y?x:y;}
void main3_16(void)
{
extern int a,b; //A
cout<<Max1(a,b); //B
}
int a=12,b=-4;
//【例3.17】文件间共享全局变量
extern float x; //A
void main3_17( void )
{
x++;
cout<<x<<'\n';
}
//【例3.18】具有缺省参数值的延时函数。
void Delay(int n=1000) //A
{ for(;n>0;n--) ; }
void main3_18(void)
{
cout<<"延时500个单位时间…\n";
Delay(500); //B
cout<<"延时1000个单位时间…\n";
Delay(); //C
}
//【例3.19】设计一程序,输入圆柱体的半径和高度,求出圆柱体的体积。
#define PI 3.1415926
float Volume(float r, float h=10); //A
void main3_19(void)
{
float r, h ;
cout<<"输入第一个圆柱体的半径和高度:";
cin>>r>>h;
cout<<"第一个圆柱体的体积为:"<< Volume (r, h)<<'\n';
cout<<"输入第二个圆柱体的半径:";
cin>>r;
cout<<"第二个圆柱体的体积为:"<< Volume (r)<<'\n';
float Volume(float=5, float=20); //B
cout<<"第三个圆柱体的体积为:"<< Volume ()<<'\n'; //C
}
float Volume (float r,float h) //D
{ return ( PI*r*r*h ); }
//【例3.20】设计一程序,求若干个数的和。
#include<stdlib.h>
#include<stdarg.h>
int Sum(int Num...)
{
va_list ap;
int s=0,Temp;
va_start(ap,Num); //A
for(int i=0;i<Num;i++)
{
Temp=va_arg(ap,int); //B
s+=Temp;
}
va_end(ap); //C
return s;
}
void main3_20(void)
{
cout<<Sum(0)<<endl; //D
cout<<Sum(3,1,2,3)<<endl;
cout<<Sum(4,1,2,3,4)<<endl;
cout<<Sum(5,1,2,3,4,5)<<endl;
}
//【例3.21】文件包含的应用
#include "Function.h" //A
void main3_21(void)
{
cout<<x3<<'\t'<<y<<'\n';
cout<<x1<<'\t'<<x2<<'\n';
}
//【例3.22】不带参数的宏的使用
#define R 3
#define PI 3.1415926
#define L 2*PI*R //A 在宏定义中可以利用已定义的宏名
#define S PI*R*R //B
#define STR1 "周长为:"
#define STR2 "面积为:"
void main3_22(void)
{
cout<<STR1<<L<<'\n'<<STR2<<S<<'\n'; //C
}
//【例3.23】带参数的宏定义的使用
#define PI 3.1415926
#define S(r) PI*r*r
void main3_23(void)
{
float a,Area;
a=3.6;
Area=S(a);
cout<<"Area="<<Area<<'\n';
}
//【例3.24】输入一行字母字符,根据需要设置条件编译,使之全改为大写输出,或全改为小写输出。
#define Letter 1 //A
void main3_24(void)
{
char c; //B
while((c=cin.get())!='\n')
{
#if Letter //C
if(c>='a'&&c<='z')
c=c-32;
#else
if(c>='A'&&c<='Z')
c=c+32;
#endif
cout<<c;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -