今天我们从do while的知识讲起
一
while 和 do..while
do-while 循环并不常用,所有情况,可以用内部的break来解决
但是肯定do while有他自己存在的道理,但是还是break好用,不止while,for也可以用break
好,现在我们开始说for循环
二
for(初始化循环变量; 循环保持条件; 循环变量变化){
循环体
}
这就是for循环在c++的做法
相当于:
for语句{
循环变量 i ...
{
循环体内,可以有自己的局部变量
}
}
但是在for中做的变量属性默认肯定是局部变量,但是在for循环退出后都会没有掉
下面是示例
打印九九乘法表 可以用双层嵌套
for(int j=1; j<=9; j++){
for(int i=1; i<=j; i++){
int k = i * j;
cout << j << "x" << i << "=" << k << " ";
}
cout << endl;
}
100以内的素数 素数:就是不能再等分的数,比如:2,5,19…. 最小的素数是2 设计思路:
for(n 从 2 到 100){
先标记:n 是素数
for(从 2 开始到 n-1 试着除 n){
如果能除尽 {
标记:n 不是素数
跳出循环;
}
}
if(标记为素数) 输出 n;
}
一些是python利用好循环题的示例 题目链接:https://gesp.ccf.org.cn/101/attach/1586016620118048.pdf
n=int(input())
for i in range(1,n+1):
if i==(n+1)//2:
print("|","-"*(n-2),"|",sep='')
else:
print("|","a"*(n-2),"|",sep='')
请你对比一下和Gesp示例解法的区别 题目链接:https://ok.hn.cn/p/GESP2312C2B
所以无论是c++还是python只要利用好了for嵌套都可做出大事
好了,该讲函数了
三
函数用好了可以节省一些不必要的for循环
这是函数的格式:
返回值类型 函数名(输入参数列表 。。。){
函数体
return 返回值
}
这就是定义函数的方式或者说是格式
这是示例:
int myadd(int a, int b){
int t = a * 10 + b;
return t;
}
调用它的方法:int x = myadd(5, 8);
函数定义时的参数,称为:形式参数,简称:形参 调用函数时,传给它的参数,称为:实际参数,简称:实参
请记住下面的这几句话
一般的情况下,形参的改变不影响实参。
形参是局部变量,在栈中分配
形参的寿命小于实参
函数的用处
函数是重要的==抽象==手段
人类解决复杂问题的法宝:大问题分解为小问题 这就是著名的自顶向下的设计
避免重复做某件事,去掉冗余 (don’t repeat yourself) 重复是恶趣之始 拷贝是万恶之源
消除 if..else 的嵌套,增加可读性 【三数取中】的例子,再次函数版本的实现: 三个数居中 = 两两最大值的最小值
消除 循环嵌套,增加可读性 【九九乘法表】的例子,再次函数版实现
// 输出乘法表的某一项
// row: 行号,i: 列号
void t99_item(int row, int i)
{
cout << i << "x" << row << "=" << row * i;
}
// 输出乘法表的一行
// row: 行号
void t99_row(int row)
{
for(int i=1; i<=row; i++){
t99_item(row,i);
cout << " ";
}
}
int main()
{
for(int i=1; i<=9; i++){
t99_row(i);
cout << endl;
}
return 0;
}
返回值
返回值可以没有, 类型写 void 有返回值的时候,调用方也可以当作没有来用。 有返回值的时候,忘记了返回会怎样?
五
我们来说指针
指针就是存放其它变量地址的小盒子 所说的地址,是虚拟内存的地址,本质上就是整数,默认以十六进制表示
指针的定义
类型 * 指针名 初始化: 指针 = &某变量
通过指针,访问被指向的变量
可以读取 myxx = p; 也可以写入 p = … 要十分谨慎 通过指针写入是危险的,这是c++强大的原因,也是bug发源地
当然也是内存溢出发源地 关于细节请查阅:https://zhuanlan.zhihu.com/p/268796378
可以在参数中使用指针
形参是指针类型时,可以改变实参的值 我们可以利用这个特性,间接地实现多个返回值。
下面是示例
void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
交换连个变量
int mid(int a, int b, int c)
{
// 我们心中的目标是: a <= b <= c
if(a > b) 交换a,b
if(b > c) 交换b,c
...
}
改写三数居中的例子,使用冒泡排序法 冒泡排序: 如果相邻的连个元素逆序,则交换它们 多次重复这个动作,伪代码如上