实验结论:
1.验证性实验部分
①函数声明和函数定义各自的作用及二者的区别:
如果编译器在调用一函数时,发现在之前未定义便会报错,而函数声明就是告诉编译器“在后面有这个函数”,编译器便会向下继续寻找。当然在调用之前就将函数定义好也是可以的,所以我认为函数定义兼有函数声明的功能。
举一个知乎上看到的比喻:
小明,你去把窗子开一下。(谁是小明?报错了。)
小明是身份证号为XXXXX的同学。//定义
小明,你去把窗子开一下。 //调用
有一个小明 //声明
小明,你去把窗子开一下。 //调用
小明是身份证号为XXXXX的同学。 //定义
链接:https://www.zhihu.com/question/54655761/answer/141337226
来源:知乎
②什么是形参?什么是实参?函数参数和返回值在函数中起到什么作用?

差不多就这样吧……
③函数参数传递过程中,值传递和引用传递区别
值传递仅仅传递的是值,就如我上图所示。引用传递,传递的是内存地址,修改后会改变内存地址对应储存的值。
2.编程实验部分
(1)2-28
#include <iostream> using namespace std; //if……else break contiue版本 int main() { char select = 0; while (true) //构建循环 { cout << "Menu: Add Delete Sort Quit,select one:"; cin >> select; if (select == 'A') { cout << "数据已增加" << endl; continue; } else if (select == 'D') { cout << "数据已删除" << endl; continue; } else if (select == 'S') { cout << "数据已排序" << endl; continue; } else if (select == 'Q') break; else cout << "ERROR" << endl; //输入其他数据返回error } return 0; }
#include <iostream> using namespace std; //switch版本 int main() { char select=0; while(true) //构建循环 { cout<<"Menu: Add Delete Sort Quit,select one:"; cin>>select; switch (select) { case 'A':cout<<"数据已增加"<<endl;continue; case 'D':cout<<"数据已删除"<<endl;continue; case 'S':cout<<"数据已排序"<<endl;continue; case 'Q':break; } break; } return 0; }
(2)2-29
判断质数算法:
从2到要判断的数字的一半,进行取余数的操作,如果结果有为0,则不是质数。
#include <iostream> using namespace std; //for循环 int main() { int num,i,status; for (num = 2; num<=100; num++) { status = 1; //条件判断 for (i = 2; i <= (num/2); i++) //从2到数字的一半进行穷举 { if (num%i == 0) { status = 0; //如果不是素数,条件判断为假,跳出循环 break; } } if (status) //当判断为真时,即为素数时,输出这个数 cout << num << endl; } return 0; }
#include <iostream> using namespace std; //while循环 int main() { int num, i, status; num = 2; while(num<=100) { status = 1; //条件判断 i = 2; while ( i <= (num / 2)) //从2到数字的一半进行穷举 { if (num%i == 0) { status = 0; //如果不是素数,条件判断为假,跳出循环 break; } i++; } if (status) //当判断为真时,即为素数时,输出这个数 cout << num << endl; num++; } return 0; }
#include <iostream> using namespace std; //do……while循环 int main() { int num, i, status; num = 2; do { status = 1; //条件判断 i = 2; do //从2到数字的一半进行穷举 { if (num%i == 0&&num!=2) //因为do……while先执行语句,想出的笨方法 { status = 0; //如果不是素数,条件判断为假,跳出循环 break; } i++; } while (i <= (num / 2)); if (status) //当判断为真时,即为素数时,输出这个数 cout << num << endl; num++; } while (num <= 100); return 0; }
(3)2-32
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; //while循环 int main() { int num, guess; srand((unsigned int)time(NULL)); //调用时间函数传送不同的seed值 num = 1 + rand() % 100; //生成每次不同的随机数 while (1) { cout << "Enter the number you guess:"; cin >> guess; if(num==guess) //对两个数字进行判断 { cout << "Congratulations!!" << endl; break; } if (num < guess) { cout << "Too large……" << endl; continue; } if (num > guess) { cout << "Too small……" << endl; continue; } } return 0; }
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; //do while循环 int main() { int num, guess; srand((unsigned int)time(NULL)); //调用时间函数传送不同的seed值 num = 1 + rand() % 100; //生成每次不同的随机数 do { cout << "Enter the number you guess:"; cin >> guess; if(num==guess) //对两个数字进行判断 { cout << "Congratulations!!" << endl; break; } if (num < guess) { cout << "Too large……" << endl; continue; } if (num > guess) { cout << "Too small……" << endl; continue; } } while (1); return 0; }
(4)2-34
思路:两种
1.参照书本例3-9,利用递归的方法实现不同组合
2.利用for循环,检验每种情况,是否满足颜色不同后输出
#include <iostream> using namespace std; //思路1 int comm(int, int); int main() { int n, k; n=5;k=3 //5种颜色,摸3个 cout << comm(n, k) << endl; return 0; } int comm(int n, int k) { if (k > n) return 0; else if (k == 0 || n == k) //递归结束条件是n=k或k=0 return 1; //此时值为1 else return comm(n - 1, k) + comm(n - 1, k - 1); }
#include <iostream> using namespace std; //思路2 enum color{Red,Yellow,Blue,White,Black}; //定义枚举 int main() { int i, j, k, n = 0; //n代表种数 for (i = Red; i<=Black; i++) for (j = i + 1; j<=Black; j++) for (k = j + 1; k <=Black; k++) { if (i != j && j != k && k != i) //3球颜色不相同 cout << i << " " << j << " " << k<<endl; n++; } cout << n << endl; return 0; }
实验总结与体会:
在本次的实验中,题目2-32中使用了时间函数作为rand()的seed值,省去了手动输入,并提高了猜数游戏的可玩性。在实验2-34中,在使用递归后,在网上又看见了使用for循环进行枚举的方法,并自己尝试了一下。
收获不少,因为在自己写完程序后,程序肯定不是最优的,需要与别人的代码进行比较和参考,了解了别人的思路,才能写出最好的。自己也任然有很多地方需要加强,比如在2-29中的do while语句中采用了比较笨的方法解决do while先执行后判断的特点。