今天我们从do while的知识讲起

while 和 do..while

do-while 循环并不常用,所有情况,可以用内部的break来解决

但是肯定do while有他自己存在的道理,但是还是break好用,不止while,for也可以用break

2024/1/28 - 图1

好,现在我们开始说for循环

  1. for(初始化循环变量; 循环保持条件; 循环变量变化){
  2. 循环体
  3. }

这就是for循环在c++的做法

2024/1/28 - 图2 相当于:

  1. for语句{
  2. 循环变量 i ...
  3. {
  4. 循环体内,可以有自己的局部变量
  5. }
  6. }

但是在for中做的变量属性默认肯定是局部变量,但是在for循环退出后都会没有掉

下面是示例

打印九九乘法表 可以用双层嵌套

  1. for(int j=1; j<=9; j++){
  2. for(int i=1; i<=j; i++){
  3. int k = i * j;
  4. cout << j << "x" << i << "=" << k << " ";
  5. }
  6. cout << endl;
  7. }

100以内的素数 素数:就是不能再等分的数,比如:2,5,19…. 最小的素数是2 设计思路:

  1. for(n 2 100){
  2. 先标记:n 是素数
  3. for(从 2 开始到 n-1 试着除 n){
  4. 如果能除尽 {
  5. 标记:n 不是素数
  6. 跳出循环;
  7. }
  8. }
  9. if(标记为素数) 输出 n;
  10. }

一些是python利用好循环题的示例 题目链接:https://gesp.ccf.org.cn/101/attach/1586016620118048.pdf

  1. n=int(input())
  2. for i in range(1,n+1):
  3. if i==(n+1)//2:
  4. print("|","-"*(n-2),"|",sep='')
  5. else:
  6. print("|","a"*(n-2),"|",sep='')

请你对比一下和Gesp示例解法的区别 题目链接:https://ok.hn.cn/p/GESP2312C2B

所以无论是c++还是python只要利用好了for嵌套都可做出大事

好了,该讲函数了

函数用好了可以节省一些不必要的for循环

这是函数的格式:

  1. 返回值类型 函数名(输入参数列表 。。。){
  2. 函数体
  3. return 返回值
  4. }

这就是定义函数的方式或者说是格式

这是示例:

  1. int myadd(int a, int b){
  2. int t = a * 10 + b;
  3. return t;
  4. }

调用它的方法:int x = myadd(5, 8);

函数定义时的参数,称为:形式参数,简称:形参 调用函数时,传给它的参数,称为:实际参数,简称:实参

请记住下面的这几句话

一般的情况下,形参的改变不影响实参。

形参是局部变量,在栈中分配

形参的寿命小于实参

函数的用处

函数是重要的==抽象==手段

人类解决复杂问题的法宝:大问题分解为小问题 这就是著名的自顶向下的设计

避免重复做某件事,去掉冗余 (don’t repeat yourself) 重复是恶趣之始 拷贝是万恶之源

消除 if..else 的嵌套,增加可读性 【三数取中】的例子,再次函数版本的实现: 三个数居中 = 两两最大值的最小值

消除 循环嵌套,增加可读性 【九九乘法表】的例子,再次函数版实现

  1. // 输出乘法表的某一项
  2. // row: 行号,i: 列号
  3. void t99_item(int row, int i)
  4. {
  5. cout << i << "x" << row << "=" << row * i;
  6. }
  7. // 输出乘法表的一行
  8. // row: 行号
  9. void t99_row(int row)
  10. {
  11. for(int i=1; i<=row; i++){
  12. t99_item(row,i);
  13. cout << " ";
  14. }
  15. }
  16. int main()
  17. {
  18. for(int i=1; i<=9; i++){
  19. t99_row(i);
  20. cout << endl;
  21. }
  22. return 0;
  23. }

返回值

返回值可以没有, 类型写 void 有返回值的时候,调用方也可以当作没有来用。 有返回值的时候,忘记了返回会怎样?

我们来说指针

指针就是存放其它变量地址的小盒子 所说的地址,是虚拟内存的地址,本质上就是整数,默认以十六进制表示

2024/1/28 - 图3

指针的定义

类型 * 指针名 初始化: 指针 = &某变量

通过指针,访问被指向的变量

可以读取 myxx = p; 也可以写入 p = … 要十分谨慎 通过指针写入是危险的,这是c++强大的原因,也是bug发源地

当然也是内存溢出发源地 关于细节请查阅:https://zhuanlan.zhihu.com/p/268796378

可以在参数中使用指针

形参是指针类型时,可以改变实参的值 我们可以利用这个特性,间接地实现多个返回值。

下面是示例

  1. void swap(int* a, int* b)
  2. {
  3. int t = *a;
  4. *a = *b;
  5. *b = t;
  6. }

交换连个变量

  1. int mid(int a, int b, int c)
  2. {
  3. // 我们心中的目标是: a <= b <= c
  4. if(a > b) 交换a,b
  5. if(b > c) 交换b,c
  6. ...
  7. }

改写三数居中的例子,使用冒泡排序法 冒泡排序: 如果相邻的连个元素逆序,则交换它们 多次重复这个动作,伪代码如上