一、实验目的
- 理解和掌握 C++中函数的定义与使用方法
- 理解 C++中函数调用过程中值传递与引用传递的区别
- 灵活、综合运用 C++中分支结构、循环结构及 continue、break 等应用编程求解问题。
二、实验准备
实验前,请围绕以下内容预习/复习指定内容
- C++中函数的定义与使用方法
阅读、学习教材 3.1 节,学习/复习如下内容:- 函数定义的语法形式;函数形参和实参、返回值的作用;函数调用形式;函数参
数传递方式(值传递和引用传递) - 指定学习示例:第 3 章例 3-1,例 3-4,例 3-11,例 3-12
- 函数定义的语法形式;函数形参和实参、返回值的作用;函数调用形式;函数参
- C++中 if 语句、switch 语句、while 语句、do…while 语句的用法及其嵌套使用
- C++中 continue 语句、break 语句的用法
三、实验内容
- 验证性实验
- 运行教材 P68 例 3-4 源码,据此理解函数声明、函数定义、函数调用的方法,以
及形参、实参、返回值的作用,以及参数的值传递过程。 - 运行教材 P78 例 3-11 源码、P79 例 3-12 源码,观察二者运行结果的区别,结合
3.1.3 节的分析,理解并总结值传递和引用传递的区别
- 运行教材 P68 例 3-4 源码,据此理解函数声明、函数定义、函数调用的方法,以
- 编程实验
用 c++编程实现以下内容:- 习题 2-28(教材 P63)
- 习题 2-29(教材 P63)
- 习题 2-32(教材 P63)
- 习题 2-34(教材 P63)
四、实验结论
- 验证性实验部分
-
函数声明和函数定义各自的作用,二者的区别;
- 函数声明用于声明一个新的函数,可以将声明语句放在main函数之前,方便子函数之间的乱序调用,例如
int max(int a,int b);
- 函数定义是指对函数内容的具现,例如
int max(int a,int b){return a>b?a:b;}
- 两者区别在于函数声明只是告诉编译器有一个函数,并没有告知具体的参数调用,函数过程,返回值,而函数定义将函数声明不具备的元素完整的呈现给编译器。
- 函数声明用于声明一个新的函数,可以将声明语句放在main函数之前,方便子函数之间的乱序调用,例如
-
什么是形参?什么是实参?函数参数和返回值在函数中起到什么作用?
- 形参指出现在函数定义中,只能在函数内使用的参数。
- 实参指出现在主调用函数中,进入被调用函数后不能使用的参数,在被调用函数运算结束后,实参的值不会发生改变
- 函数参数是指调用时该函数必须传递的参数,在函数中利用其实现算法
- 函数返回值在函数中起到返回函数算法结果的作用
-
函数参数传递过程中,值传递和引用传递区别是什么?
- 值传递只传递参数的值,引用传递传递参数的地址
-
- 编程实验部分
2-28
+ else-if
#include<bits/stdc++.h>
using namespace std;
int main(){
while(1){
char tmp;
cout<<"Menu:A(dd) D(elete) S(ort) Q(uit) Select One:"<<endl;
cin>>tmp;
if(tmp=='A'){cout<<"数据已经增加"<<endl;continue;}
else if(tmp=='D'){cout<<"数据已经删除"<<endl;continue;}
else if(tmp=='S'){cout<<"数据已经排序"<<endl;continue;}
else if(tmp=='Q'){break;}
else continue;
}
return 0;
}
+ switch-case
#include<bits/stdc++.h>
using namespace std;
int main(){
while(1){
char tmp;
cout<<"Menu:A(dd) D(elete) S(ort) Q(uit) Select One:"<<endl;
cin>>tmp;
switch(tmp){
case 'A':cout<<"数据已经增加"<<endl;break;
case 'D':cout<<"数据已经删除"<<endl;break;
case 'S':cout<<"数据已经排序"<<endl;break;
case 'Q':return 0;
default:break;
}
}
return 0;
}
+ Screenshot:
.
2-29
+ 筛法求素数,对大于2的素数倍数设为合数,剩下的即是素数
+ Code:
#include<bits/stdc++.h>
using namespace std;
int main(){
bool num[101]={0};
for(int i=2;i<=100;++i){
if(!num[i])for(int j=i*2;j<=100;j+=i)num[j]=1;
}
for(int i=1;i<=100;++i)if(!num[i])cout<<i<<" ";
cout<<endl;
return 0;
}
+ Screenshot:
2-32
+ while:
#include<bits/stdc++.h>
using namespace std;
int main(){
srand((unsigned)time(NULL));
int n=rand()%100;
int guess=101;
while(guess!=n)
{
cin>>guess;
if(guess<n)cout<<"Answer is larger than ur guess number!"<<endl;
else if(guess>n)cout<<"Answer is smaller than ur guess number!"<<endl;
}
cout<<"True Answer!"<<endl;
return 0;
}
+ do-while:
#include<bits/stdc++.h>
using namespace std;
int main(){
srand((unsigned)time(NULL));
int n=rand()%100;
int guess=101;
do{
cin>>guess;
if(guess<n)cout<<"Answer is larger than ur guess number!"<<endl;
else if(guess>n) cout<<"Answer is smaller than ur guess number!"<<endl;
}while (guess!=n);
cout<<"True Answer!"<<endl;
return 0;
}
+ Screenshot:
2-34
+ 使用DFS模拟拿球,use数组存放使用情况,每次种类为:,对每次模拟拿球结果累加,得到结果。
+ Code:
#include<bits/stdc++.h>
#define rap(a,b) for(int a=0;a<b;++a)
#define r() rand()%10
int color[5];
bool use[5]={0};
using namespace std;
int dfs(int j,int t){
int tmp=0;
if (t==3)return color[j];//第三次拿球直接返回个数
rap(i,5)
if(!use[i]){
use[i]=1;
tmp+=dfs(i,t+1);
use[i]=0;
}
return tmp*color[j];//根据公式返回当前拿球状况下的个数
}
int main(){
int sum=0;
srand((unsigned)time(NULL));
rap(i,5)color[i]=r();
rap(i,5){
use[i]=1;
sum+=dfs(i,1);
use[i]=0;
}
cout<<sum<<endl;
return 0;
}
+ Screenshot:
+ 填充1:
验证:
+ 填充2
验证: