实验二 函数的应用
一、实验目的
1.了解C++开发工具并学习使用
2.理解函数的形参、函数原型、内联函数;学会编制重载函数和递归函数。
二、实验内容
1.编写函数实现递归方式求取整数n的阶乘,要求在主函数中输入整数n,通过调用输出结果,例如输入5,得到5!=120。
2.编写函数求两个整数的最大公约数和最小公倍数。
3.编写函数输出指定行数的星星等腰三角形。例如输入:5,得到以下图形。
4.编写函数实现从键盘输入一个正整数,将其按照二进制进行输出。例如,将135打印成10000111.
5.编写函数实现输出从1 开始的整数矩阵。例如输入4,5,则能够输出4x5的矩阵:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
6.编写函数输出能够整除某数的所有因子,能够实现从键盘输入两个整数,例如,输入6,则输出1,2,3,6。
7.编写函数输出指定范围内的质数。例如输入100,200,则能够实现求出100-200之间的质数。
8.编写函数求平面中两个点坐标(x1,y1)与(x2,y2)的距离。例如输入:0 0 3 4,则得到坐标(0,0)与(3,4)两个点之间的距离为5。
9.编写三个同名的函数:函数返回类型 Area(…),它们之间形成重载,分别用于求圆的面积,矩形的面积,三角形面积。
10.理解下面的程序,并在IDE中运行,查看结果,回答程序后面的问题。
#include <iostream>
using namespace std;
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int i = 5;
int j = 10;
cout<<"Before swap: i="<<i<<",j="<<j<<endl;
swap(i,j); -------------------------------------------------------①
cout<<"After the first swap: i="<<i<<",j="<<j<<endl;
swap(&i,&j); -----------------------------------------------------②
cout<<"After the second swap: i="<<i<<",j="<<j<<endl;
return 0;
}
1.问题一:上述程序3的输出结果是什么?
答:
2.问题二:程序3在①处函数调用后并不能实现两个数的交换,而②处却可以,为什么?
答:
3.问题三:程序3在②处调用的是哪个重载函数?
答:
三、实验步骤及结果
题目1
/*
程序名:题目1.cpp
功能:编写函数实现递归方式求取整数n的阶乘,要求在主函数中输入整数n
日期:2021.9.28
版本:1.0
*/
#include <iostream>
using namespace std;
unsigned fac(unsigned n){
unsigned f;
if(n==0) //注意n可以等于0的特殊情况
f=1;
else
f=fac(n-1)*n;
return f;
}
int main(){
unsigned n;
cout<<"Enter a positive integer:";
cin>>n;
unsigned x=fac(n);
cout<<n<<"!="<<x<<endl;
return 0;
}
运行结果截图:
题目2
/*
程序名:题目2.cpp
功能:函数求两个整数的最大公约数和最小公倍数。
日期:2021.9.28
版本:1.0
*/
#include <iostream>
using namespace std;
int main()
{
int yue(int,int);
int bei(int,int,int);
int gy;
int gb;
int n,m;
cout<<"输入两个整数:";
cin>>n>>m;
gy = yue(n,m);
gb = bei(n,m,gy);
cout<<"两数的最大公约数为:"<<gy<<endl;
cout<<"两数的最小公倍数为:"<<gb<<endl;
}
int yue(int n,int m){
int r;
while(n>0){
r = m%n;
m=n;
n=r;
}
return m;
}
int bei(int n,int m,int gy){ //搞完公约再搞公倍
return (n*m/gy);
}
运行结果截图:
题目3
/*
程序名:题目3.cpp
功能:函数输出指定行数的星星等腰三角形。
日期:2021.9.28
版本:1.0
*/
#include<iostream>
using namespace std;
int f(int x){
x = x * 2;
for(int i = 1;i<=x;i+=2){
int y = (x - i) / 2;
for(int j = 1;j<=y;j++){
cout<<' '; //输出对应数目空格
}
for(int j = 1;j<=i;j++){
cout<<'*'; //输出对应数目*
}
cout<<endl;
}
}
int main(){
int n;
cout<<"请输入你要的行数:";
while(cin>>n){
f(n);
}
return 0;
}
运行结果截图:
题目4
/*
程序名:题目4.cpp
功能:函数实现从键盘输入一个正整数,将其按照二进制进行输出。
日期:2021.9.28
版本:1.0
*/
#include <iostream>
using namespace std;
void fun(int num) {
if (num > 1) {
fun(num/2);
cout << num % 2;
} else {
cout << num;
}
}
int main () {
int x;
cout << "请输入一个十进制的数:" ;
cin >> x;
fun(x);
cout << endl;
return 0;
}
运行结果截图:
题目5
/*
程序名:题目5.cpp
功能:函数实现输出从1 开始的整数矩阵。
日期:2021.9.28
版本:1.0
*/
#include <iostream>
using namespace std;
int fun1(int a, int b){
int n=1;int c=1;int d=1;
while(c<=a){
for(n=1;n<=b;n=n+1){
cout<<d<<"\t";
d=d+1;
}
cout<<endl;
c=c+1;
}
return 0;
}
int main(){
int x,y;
cout<<"输入矩阵数:" ;
cin>>x>>y;
fun1(x,y);
return 0;
}
输出结果截图:
题目6
/*
程序名:题目6.cpp
功能:函数输出能够整除某数的所有因子,能够实现从键盘输入
日期:2021.9.28
版本:1.0
*/
#include <iostream>
using namespace std;
void sum(int a)
{
for (int i=1;i<=a;i++)
{
if (a%i == 0) //整除
{
cout << i << ",";
}
}
}
int main() {
int a;
cout<<"请输入一个数:";
cin >> a;
sum(a);
return 0;
}
输出结果截图:
题目7
/*
程序名:题目7.cpp
功能:函数输出指定范围内的质数
日期:2021.9.28
版本:1.0
*/
#include <iostream>
using namespace std;
void num(int a,int b)
{
for (int i = a; i <= b; i++)
{
for (int j = 2, a = 0; j < i; j++)
{
a = i % j;
if (a == 0)
{
break;
}
else if (j == i - 1)
{
cout << i << endl;
}
}
}
}
int main() {
int a = 0, b = 0;
cout << "请输入范围:" ;
cin >> a;
cin >> b;
num(a, b);
return 0;
}
运行结果截图:
题目8
/*
程序名:题目8.cpp
功能:编写函数求平面中两个点坐标(x1,y1)与(x2,y2)的距离。
日期:2021.9.28
版本:1.0
*/
#include <iostream>
#include <math.h>
using namespace std;
void len(int a, int b, int c, int d)
{
int p = (a > c ? a - c: c - a);
int q = (b > d ? b - d : d - b);
double L = sqrt(p*p + q * q);
cout << "这两个点之间的距离是:" << L << endl;
}
int main() {
int a=0, b=0, c=0, d=0;
cout << "请输入四个数值:" ;
cin >> a;
cin >> b;
cin >> c;
cin >> d;
len(a, b, c, d);
return 0;
}
运行结果截图:
题目9
/*
程序名:题目9.cpp
功能:三个同名的函数:函数返回类型 Area(…),它们之间形成重载,分别用于求圆的面积,矩形的面积,三角形面积。
日期:2021.9.28
版本:1.0
*/
#include<iostream> //该题目写的过程中有问同学
#include<math.h>
using namespace std;
int Area(int a){
float S;
float n=3.1415926;
S=n*a*a*0.5;
cout<<"半径为:"<<a<<"的圆面积为"<<S<<endl;
return 0;
}
int Area(int a,int b){
float S;
S=a*b;
cout<<"长宽为:"<< a << b <<"的矩形的面积为"<<S<<endl;
return 0;
}
int Area(double a,double b,double c){
double S,d;
d=(a+b+c)*0.5;
S=sqrt(d*(d-a)*(d-b)*(d-c));
cout<<"三边为:"<< a << b << c <<"的三角形面积为"<<S<<endl;
return 0;
}
int main(){
float x;
cout<<"输入所求圆的半径:";
cin>>x;
Area(x);
float y, z;
cout<<"输入所求矩形的长和宽:";
cin>>y>>z;
Area(y,z);
int o, p, q;
cout<<"输入所求三角形的三边长:";
cin>>o>>p>>q;
Area(o,p,q);
return 0;
}
运行结果截图:
题目10
#include <iostream>
using namespace std;
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int i = 5;
int j = 10;
cout<<"Before swap: i="<<i<<",j="<<j<<endl;
swap(i,j); -------------------------------------------------------①
cout<<"After the first swap: i="<<i<<",j="<<j<<endl;
swap(&i,&j); -----------------------------------------------------②
cout<<"After the second swap: i="<<i<<",j="<<j<<endl;
return 0;
}
运行结果截图:
1.问题一:上述程序3的输出结果是什么?
答:Before swap: i=5,j=10
After the first swap: i=5,j=10
After the second swap: i=10,j=5
2.问题二:程序3在①处函数调用后并不能实现两个数的交换,而②处却可以,为什么?
答:①处仅把实参的值copy给了形参不对实参造成影响。② 处函数运用指针地址传递,把实参的地址传递给了指针,因此可以影响实参的值。
3.问题三:程序3在②处调用的是哪个重载函数?
答:void swap(int *a, int *b)
四、实验小结
问题与解决办法:
1.有时候莫名无法运行 但是又没报错
解决:找到有一行代码少了;
2.遇到不会的题了 一直想不明白
解决:问同学 看别人的代码
心得体会:
已经是大学了,学习不能死扣一道题很久,网上有很多资源,包括同学老师都可以问,能够解决问题下次记住就很好,提升自己的做题效率。