第五章 函数学习要求和实验
- 学习要求:
理解函数定义的意义。
掌握函数定义格式。
了解函数调用方式:值调用和引用调用。
掌握函数嵌套调用方法。
掌握数组作为函数的参数的使用。
理解全局变量、局部变量,动态变量、静态变量的概念,掌握不同变量的作用域与生命周期。
进一步积累程序调试经验。- 实验作业
1.调试分析课本每一个例题,有可能的话更改成2-3个方法的新程序;
2.编程实现课本每一个编程习题。
3. 编程实现输入两个4X5矩阵和5X3矩阵,定义函数并在主函数中调用计算它们的积。
4.编程计算S[n]=1!+21+3!+...n!。要求定义两个函数,一个计算n!,一个计算s[n],在后一个函数中调用前一个函数。然后在主程序中输入数n的值,然后调用定义函数输出结果。
5.编写一个函数,输入一个十六进制数,输出相应的十进制数。
课本习题
1说明程序的运行过程和运算结果
#include<iostream>
#include<cmath>
using namespace std;
double squ (double x);
int main()
{
double x;
cout<<"x:"<<endl;
cin>>x;
cout<<"the square root of "
<<x<<" is "
<<squ(x)
<<endl;
return 0;
}
double squ(double x)
{
double s1,s2;
s1=0.5*(1.0+x);
do
{
s2=s1;
s1=(s2+x/s2)*0.5;
}
while (fabs(s2-s1)>1.0E-6);
return s1;
}
/***************************
**说明****************
*************************/
//执行main函数中的输出语句 “cout<<"x:"<<endl;”
//执行输入语句“cin>>x;”,等待用户输入x的值
//执行输出语句,期间调用squ函数
//squ函数用迭代法求形参的平方根,之后返回给main中的输出语句
//执行main函数中的“return 0;”,返回操作系统一个整数值0.程序执行完毕。
输出结果:
习题二
不用库函数,自己编写求整数次幂的的函数 longintPower(int base,int exponent).求base的exponent次幂
#include<iostream>
using namespace std;
long intPower(int base,int exponent);
int main()
{
long n;
int base,exponent;
cout<<"请输出基数及其幂:";
cin>>base>>exponent;
n=intPower(base,exponent);
cout<<base<<"的"<<exponent<<"次幂是"<<n<<endl;
}
long intPower(int base,int exponent)
{
long result=1;
int i;
if(exponent!=0)
for(i=1;i<=exponent;i++)
result*=base;
return result;
}
输出结果
习题三,编写判断一个正整数是不是素数的函数。
#include<iostream>
using namespace std;
int prime(int n);
int main()
{
int a;
cout<<"请输入一个大于1的正整数:";
cin>>a;
if(a<=1)
{
cout<<"你肯定没看清要求,“是输入大于1的正整数”啊亲!!"
<<endl;
return 0;
}
if(prime(a))
cout<<a<<"是素数"<<endl;
else
cout<<a<<"不是素数"<<endl;
return 0;
}
int prime(int n)
{
int flag=1,i; //若标志flag为1,则z为素数;flag为0,n不为素数
for(i=2;i<n/2&&flag==1;i++)
if(n%i==0)
flag=0;
return flag;
}
输出结果
(老师,这个怎么弄成一个可以循环输入变量的程序,每次总是输出结果后得再重新弄)
习题四
#include<iostream>
#include<iomanip>
using namespace std;
int reverse(int);
int main()
{
int a,result;
cout<<"请输入一个十进制的正整数:";
cin>>a;
result=reverse(a);
cout<<a<<"的逆序数为"<<result<<endl;
return 0;
}
int reveser(int n)
{
int i,m=n;
for(i=1;;) //首先求出最高位的权
{
m/=10;
if(m==0) break;
i*=10;
}
if(i==1) return n; //若i为1,则逆序数同原数
int temp=i;
int j,a[10]; //数组a低分各元素用于存放数据(整数最多为10位)
for(j=0;temp!=0;j++) //求出整数的各位数值 a[0]为最高位
{
a[j]=n/temp;
n=n-a[j]*temp; // 除去前一位后剩余位数的数值
temp/=10;
}
for(j=j-1;j>=0;j--) //求出整数的逆序数
{
n+=a[j]*i; //从最低位数值乘以最高位权开始实现逆转
i/=10;
}
return n;
}
输出结果:
习题五 编写一个函数,按所给的百分制的成绩分数,返回与该分数对应的等级代号字符
#include<iostream>
using namespace std;
char grade(int);
int main()
{
int score;
cout<<"分数段对应等级:"
<<"<60:E等级"
<<"<70:D等级"
<<"<80:C等级"
<<"<90:B等级"
<<"<100:A等级"<<endl;
cout<<"请输入百分制成绩(0~100):";
cin>>score;
char ch=grade(score);
cout<<score<<"对应的等级为 "<<ch<<endl;
return 0;
}
char grade(int n)
{
char ch;
if(n>=90&&n<=100) ch='A';
else if(n>80) ch='B';
else if(n>70) ch='C';
else if(n>60) ch='D';
else ch='E';
return ch;
}
输出结果:
习题六:写一个函数,内放10个学生的成绩,求平均成绩
#include<iostream>
using namespace std;
float average();
int main()
{
float aver=average();
cout<<"这十位学生的平均成绩为:"<<aver<<endl;
return 0;
}
float average()
{
float a[10],sum=0,average;
cout<<"请输入十个学生的成绩:"<<endl;
for(int i=0;i<10;i++)
{
cin>>a[i];
sum+=a[i];
}
average=sum/10;
return average;
}
输出结果
习题七 不会做
习题八 编写三个函数以三种不同的方式输出乘法口诀表:
1) 将九行九列乘法表全部输出;
2) 输出乘法表中主对角线以上的元素;
3)输出乘法表中主对角线一下的元素;
#include <iostream>
using namespace std;
void w1();
void w2();
void w3();
int main()
{
cout <<"九九乘法表1"<<endl;
w1();
cout <<endl<<endl;
cout <<"九九乘法表2"<<endl;
w2();
cout <<endl<<endl;
cout <<"九九乘法表3"<<endl;
w3();
cout <<endl;
return 0;
}
void w1()
{
int i1,i2,j;
for(i2=1;i2<=9;i2++)
{
for(i1=1;i1<=9;i1++)
{
j=(i1*i2);
cout <<i1<<"*"<<i2<<"="<<j<<" ";
if (j<10)
cout<<" ";
}
cout << endl;
}
}
void w2()
{
int i1,i2,j;
for(i2=1;i2<=9;i2++)
{
for(i1=1;i1<=i2;i1++)
{
j=(i1*i2);
cout <<i1<<"*"<<i2<<"="<<j<<" ";
if (j<10)
cout<<" ";
}
cout << endl;
}
}
void w3()
{
int i1,i2,j;
for(i2=1;i2<=9;i2++)
{
for(i1=1;;i1++)
{
if(i1<i2)
cout<<" ";
else
{
j=i1*i2;
cout <<i1<<"*"<<i2<<"="<<j<<" ";
if (j<10)
cout <<" ";
}
if(i1==9)
break;
}
cout <<endl;
}
}
输出结果
习题九:
编程求出三个整型数中的最大值,最小值,平均值,要求三个整形数在main函数中的输入,
最大值,最小值,平均值有函数求出。要求分别用一下三种方式实现主调函数与被调函数用函数之间的数据传递:
1)值调用
2)引用调用
3)全局变量
1)值调用
#include <iostream>
using namespace std;
int max(int,int,int);
int min(int,int,int);
float average(int,int,int);
int main()
{
int a,b,c;
cout<<"请输入三个整数:"<<endl;
cin>>a>>b>>c;
cout<<a<<","<<b<<","<<c<<"这三个数最大值为:"<<max(a,b,c)<<endl
<<a<<","<<b<<","<<c<<"这三个数最小值为:"<<min(a,b,c)<<endl
<<a<<","<<b<<","<<c<<"这三个数平均值为:"<<average(a,b,c)<<endl;
return 0;
}
int max(int a,int b,int c)
{
int maxValue=a;
if(b>a&&b>c)
maxValue=b;
else if(c>a&&c>b)
maxValue=c;
return maxValue;
}
int min(int a,int b,int c)
{
int minValue=a;
if(b<a&&b<c)
minValue=b;
else if(c<a&&c<b)
minValue=c;
return minValue;
}
float average(int a,int b,int c)
{
return (a+b+c)/3.0;
}
2)引用调用
#include <iostream>
using namespace std;
int max(int&,int&,int&);
int min(int&,int&,int&);
float average(int&,int&,int&);
int main()
{
int a,b,c;
cout<<"请输入三个整数:"<<endl;
cin>>a>>b>>c;
cout<<a<<","<<b<<","<<c<<"这三个数最大值为:"<<max(a,b,c)<<endl
<<a<<","<<b<<","<<c<<"这三个数最小值为:"<<min(a,b,c)<<endl
<<a<<","<<b<<","<<c<<"这三个数平均值为:"<<average(a,b,c)<<endl;
return 0;
}
int max(int&a,int&b,int&c)
{
int maxValue=a;
if(b>a&&b>c)
maxValue=b;
else if(c>a&&c>b)
maxValue=c;
return maxValue;
}
int min(int&a,int&b,int&c)
{
int minValue=a;
if(b<a&&b<c)
minValue=b;
else if(c<a&&c<b)
minValue=c;
return minValue;
}
float average(int&a,int&b,int&c)
{
return (a+b+c)/3.0;
}
3)全局变量:
#include <iostream>
using namespace std;
int a,b,c;
int max();
int min();
float average();
int main()
{
cout<<"请输入三个整数:"<<endl;
cin>>a>>b>>c;
cout<<a<<","<<b<<","<<c<<"这三个数最大值为:"<<max()<<endl
<<a<<","<<b<<","<<c<<"这三个数最小值为:"<<min()<<endl
<<a<<","<<b<<","<<c<<"这三个数平均值为:"<<average()<<endl;
return 0;
}
int max()
{
int maxValue=a;
if(b>a&&b>c)
maxValue=b;
else if(c>a&&c>b)
maxValue=c;
return maxValue;
}
int min()
{
int minValue=a;
if(b<a&&b<c)
minValue=b;
else if(c<a&&c<b)
minValue=c;
return minValue;
}
float average()
{
return (a+b+c)/3.0;
}
输出结果:
习题十
下面的程序定义了全局变量,静态局部变量和局部变量,指出程序的运行结果。
#include <iostream>
using namespace std;
void func();
int n=1;
int main()
{
static int a;
int b=-10;
cout<<"a:"<<a<<"\tb:"<<b<<"\tn:"<<n<<endl;
b+=4;
func;
cout<<"a:"<<a<<"\tb:"<<b<<"\tn:"<<n<<endl;
n+=10;
func();
return;
}
void func()
{
static int a=2;
int b=5;
a+=2;
n+=12;
b+=5;
cout<<"a:"<<a<<"\tb:"<<b<<"\tn:"<<n<<endl;
}
结果: