目录
1.分支语句
1. 1 分支语句 - if 语句
1.2 分支语句 - Switch 语句
2. 循环语句
2.1 while 循环
2.1.1 while 循环中的break 和continue
2.2 fo 循环
编辑
2.2.1 for 循环中的 break 和 continue
2.2.2 for 循环的一些变种
2.3 do while 循环语句
2.3.1 do while 循环中的 break 和continue
3. 计算 n 的阶乘
3.1 使用 for 循环计算
3.2 使用 while 循环计算
4. 计算 1!+2!+3!+……+10!
4.1 使用 for 循环计算
4.2 使用 while 循环计算
5. 在一个有序数组中查找具体的某个数字n。(二分查找法)
6 . goto 语句(附加)
1.分支语句
条件判断语句也叫分支语句:if语句、switch语句;
1. 1 分支语句 - if 语句
c语言中0表示假,非0为真
语法结构:
if(表达式)//如果表达式为真,执行下面语句
语句;
if(表达式)//如果表达式为真,执行下面语句
语句1;
else //否则执行下面语句
语句2;
//多分支
if(表达式1)//如果表达式为真,执行下面语句
语句1;
else if(表达式2)//如果表达式为真,执行下面语句
语句2;
else //否则执行下面语句
语句3;
一个三种用法,我们用代码来介绍。
第一种:
int main()
{
int score = 0; //定义一个成绩变量
scanf("%d", &score); //输入成绩变量
if (score >= 60) //如果大于等于60
printf("成绩及格"); //打印成绩及格
return 0;
}
当我们执行代码时,输入70,屏幕会打印 “成绩及格”
当输入50时,什么都不打印,直接结束程序
第二种:
int main()
{
int age = 0;//创建一个年龄变量
scanf("%d",&age); //输入年龄
if (age < 18) //如果年龄小于18
printf("未成年n");//打印未成年
else //否则
printf("成年");//打印成年
return 0;
}
当输入16时,屏幕打印 “未成年”
当输入20时,打印 “成年”
第三种:
int main()
{
int iq = 0;//定义一个变量 智商
scanf("%d", &iq);//输入智商值
if (iq < 100) //如果小于100
printf("一般");//打印一般
else if (iq < 150 && iq < 200)// 如果小于150并且小于200
printf("聪明"); //打印聪明
else // 否则
printf("天才"); //打印天才
return 0;
}
当执行各个语句时输出以下:
int main()
{
if ()
{
执行多个语句时应用大括号
}
else
{
}
return 0;
}
接下来我们来看一段代码你觉得会打印什么
int main()
{
int a = 1;
int b = 2;
if (a == 0)
if (b == 2)
printf("666n");
else
printf("777n");
return 0;
}
结果是什么都不打印,c语言中if 和 else 是就近匹配的,当上面的 if 语句不成立时下面的语句也不会执行
当我们加上大括号后
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("666n");
}
else
printf("777n");
return 0;
}
打印777
1.2 分支语句 - Switch 语句
语法结构:
switch (整型表达式)
{
语句项;
}
//语句项
case 整形常量表达式:
语句;
case后必须是整型常量表达式。
当我们使用变量时会发生报错。
使用方法·
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
printf("星期一n");
break;
case 2:
printf("星期二n");
break;
case 3:
printf("星期三n");
break;
case 4:
printf("星期四n");
break;
case 5:
printf("星期五n");
break;
case 6:
printf("星期六n");
break;
case 7:
printf("星期天n");
break;
}
return 0;
}
每条case语句后一定要加上break,不然语句不结束就会继续执行下方语句
例如去掉break
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
printf("星期一n");
case 2:
printf("星期二n");
case 3:
printf("星期三n");
case 4:
printf("星期四n");
case 5:
printf("星期五n");
case 6:
printf("星期六n");
case 7:
printf("星期天n");
}
return 0;
}
当我输入1时,打印完星期一后并不会结束语句,继续向下执行。
如果我们需要输入1 - 5 时打印工作日,6 -7时打印休息日
这俩个代码是一样的,相比之下右边更加简略。
Switch 也是支持嵌套的
int main()
{
int m = 1;
int n = 2;
switch (n)
{
case 1:m++;
case 2:n++;
case 3:
switch (n)
{
case 1:n++;
case 2:m++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d,n = %d", m, n);
return 0;
}
default 和 if 语句中else 的意思是一样的
可以试着猜一下 m 和 n 是多少
2. 循环语句
循环语句有:
● while
● for
● do while
2.1 while 循环
语法结构:
while(语法结构) 循环语句
写一个打印1 - 10的代码
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
运行结果为
2.1.1 while 循环中的break 和continue
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)//当i = 5时,执行下方break,终止while循环
break;
printf("%d ", i);
i++;
}
return 0;
}
运行结果
在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
int main()
{
int i = 0;
while (i < 10)
{
i++;
if (i == 5)//当 i = 5时,执行continue,终止本次循环,执行下次循环
continue;
printf("%d ", i);
}
return 0;
}
运行结果:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
2.2 fo 循环
在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。 但是还是有些差异。
语法结构:
for (表达式1; 表达式2; 表达式3) 循环语句;
表达式1 表达式1为初始化部分,用于初始化循环变量的。
表达式2 表达式2为条件判断部分,用于判断循环时候终止。
表达式3 表达式3为调整部分,用于循环条件的调整。
写一个打印1 - 10的代码
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
printf("%d ", i);
return 0;
}
运行结果为
2.2.1 for 循环中的 break 和 continue
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
运行结果为
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
运行结果为
2.2.2 for 循环的一些变种
初始化,判断,调整三个部分可以省略
省略掉判断部分就意味着判断恒为真。
int main()
{
for (;;)
{
printf("hehen");
}
return 0;
}
代码进入死循环
这段代码可以打印100个呵呵。
int main()
{
int i = 0;
int j = 0;
for (i = 0; i< 10; i++)
{
for (j = 0; j < 10; j++)
{
printf("hehen");
}
}
return 0;
}
当我们省略掉初始化部分时
int main()
{
int i = 0;
int j = 0;
for (; i< 10; i++)
{
for (; j < 10; j++)
{
printf("hehen");
}
}
return 0;
}
运行结果只有10 个呵呵
原因很简单
for 循环还可以使用多余一个变量控制循环
int main()
{
int i = 0;
int y = 0;
for (i = 0, y = 0; i < 2 && y < 5; i++, y++)
printf("hehen");
return 0;
}
2.3 do while 循环语句
语法结构
do 循环语句; while(表达式);
do while 的循环语句在表达式之前,也就是说至少执行一次循环语句。
写一个打印1 - 10的代码
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
}
while (i <= 10);
return 0;
}
2.3.1 do while 循环中的 break 和continue
int main()
{
int i = 1;
do
{
if (i == 5)
break;
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
运行结果:
int main()
{
int i = 0;
do
{
if (i == 5)
{
i++;
continue;
}
printf("%d ", i);
i++;
} while (i < 10);
return 0;
}
运行结果:
目前我对分支与循环的了解就到这里了,接下来让我们来看几个小题目。
3. 计算 n 的阶乘
阶乘是指从1到n的连续自然数相乘的积。
例如,5的阶乘 = 1 * 2 *3 *4 *5 。
负数是没有阶乘的哦!!!
3.1 使用 for 循环计算
int main()
{
int n = 0;
int i = 0;
int ret = 1;
scanf("%d", &n);
for (i = 1;i <= n; i++)
{
ret = ret * i;
}
printf("%d",ret);
return 0;
}
3.2 使用 while 循环计算
int main()
{
int n = 0;
int i = 1;
int ret = 1;
scanf("%d", &n);
while (i <= n)
{
ret = ret * i;
i++;
}
printf("%d", ret);
return 0;
}
4. 计算 1!+2!+3!+……+10!
int main()
{
int n = 0;
int i = 1;
int ret = 1;
scanf("%d", &n);
while (i <= n)
{
ret = ret * i;
i++;
}
printf("%d", ret);
return 0;
}
4. 计算 1!+2!+3!+……+10!
1!表示1的阶乘,我们将计算出1的阶乘加到10的阶乘总和
4.1 使用 for 循环计算
int main()
{
int i = 0;
int ret = 1;
int sum = 0;
for (i = 1; i <= 10; i++)
{
ret = ret * i;
sum = sum + ret;
}
printf("%d", sum);
return 0;
}
4.2 使用 while 循环计算
int main()
{
int i = 1;
int ret = 1;
int sum = 0;
while (i <= 10)
{
ret = ret * i;
sum = sum + ret;
i++;
}
printf("%d", sum);
return 0;
}
5. 在一个有序数组中查找具体的某个数字n。(二分查找法)
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);//40 除以 4 = 10
// sizefo(arr) = 总大小,当前数组10个数字 = 40个字节(一个整型32个比特位,四个字节)
//sizeof(arr[0]) = 数组第一个数的大小 = 4个字节
//总大小除以单个数字的大小就可以求出数组一共有几个数。
int left = 0;//左边第一个数字在数组的下标中为arr[0]
int right = sz - 1;//最右边的数字下标为数组中数字总个数减1
//当前我们已知 sz 为10,即最右边的数字10的下表为arr[9]
int k = 7;//假如我们要查找的那个数为7
while (left <= right)//代表 left 和 right 中间还有数字
{
int mid = (left + right) / 2;//求出中间值
if (arr[mid] < k)//如果mid小于我们要查找的数,那这个数肯定是在mid的右边
{
left = mid + 1;//此时我们就把 mid + 1赋值给left
}
else if (arr[mid] > k)//当mid大于我们要查找的数,那这个数肯定输在mid的左边
{
right = mid - 1;//此时我们把mid - 1赋值给right
}
else//此时情况为left = right,此时left和right中间没有数字了,就代表着找到了。
{
printf("找到了,是arr[%d]", mid);
break;
}
}
if (left > right)//如果left 大于 right,那一定是找不到
printf("找不到");
return 0;
}
int main()
{
int i = 1;
int ret = 1;
int sum = 0;
while (i <= 10)
{
ret = ret * i;
sum = sum + ret;
i++;
}
printf("%d", sum);
return 0;
}
5. 在一个有序数组中查找具体的某个数字n。(二分查找法)
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);//40 除以 4 = 10
// sizefo(arr) = 总大小,当前数组10个数字 = 40个字节(一个整型32个比特位,四个字节)
//sizeof(arr[0]) = 数组第一个数的大小 = 4个字节
//总大小除以单个数字的大小就可以求出数组一共有几个数。
int left = 0;//左边第一个数字在数组的下标中为arr[0]
int right = sz - 1;//最右边的数字下标为数组中数字总个数减1
//当前我们已知 sz 为10,即最右边的数字10的下表为arr[9]
int k = 7;//假如我们要查找的那个数为7
while (left <= right)//代表 left 和 right 中间还有数字
{
int mid = (left + right) / 2;//求出中间值
if (arr[mid] < k)//如果mid小于我们要查找的数,那这个数肯定是在mid的右边
{
left = mid + 1;//此时我们就把 mid + 1赋值给left
}
else if (arr[mid] > k)//当mid大于我们要查找的数,那这个数肯定输在mid的左边
{
right = mid - 1;//此时我们把mid - 1赋值给right
}
else//此时情况为left = right,此时left和right中间没有数字了,就代表着找到了。
{
printf("找到了,是arr[%d]", mid);
break;
}
}
if (left > right)//如果left 大于 right,那一定是找不到
printf("找不到");
return 0;
}
当 left + right 过大时超出了我们的整型,结果肯定会出错。此时我们可以换一种写法
int mid = (left + right) / 2; int mid = left+(right - left) / 2
6 . goto 语句(附加)
goto非常好理解,和字面意思一样。接下来看代码就明白
当我们执行到goto时,直接跳到goto指向的地方执行代码。



