C语言基础学习 - 分支和循环语句
分支和循环语句
- 分支语句
- if
- switch
- 循环语句
- while
- for
- do while
语句
C语言中由一个分号 ;
隔开的就是一条语句。
比如:
;
; : 一个分号也是一条语句, 是一条什么都没干的空语句
分支语句(选择结构)
if语句
if 语句的语法结构
//1.
if(表达式)
语句;
// 2.
if(表达式)
语句;
else
语句2;
// 3. 多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
代码片段:
int coding;
printf("你愿意敲代码么? -- 1 愿意 -- 0 不愿意\n");
printf("根据上面提示输入0或1:");
scanf("%d", &coding);
//printf("%d", coding);
if (coding == 1) {
printf("你愿意敲代码.");
}
else if (coding == 0)
printf("你不愿意敲代码.");
else
printf("输入有误!");
{}: 代码块, 它不是必须有的, 但是如果没有 {}, 只有后面紧跟的一条语句会被认为是代码块的内容, 如果有多条语句, 必须有 {}, 为了代码不出错, 无论代码块几条语句, 都加上 {}.
如果表达式的结果为真,则语句执行。在C语言中如何表示真假?
0 表示 假, 非 0 表示真.
悬空 else
#include <stdio.h>
int main(){
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n" );
else
printf("haha\n" );
return 0;
}
上面的代码片段里的 else 到底是和上面的哪个 if 配对?
else 的匹配: else 是和离它最近的 if 匹配的.
为了使上面的代码更加清晰, 改正之后的代码如下:
#include <stdio.h>
int main(){
int a = 0;
int b = 2;
if(a == 1){
if(b == 2){
printf("hehe\n" );
}
}
else{
printf("haha\n" );
}
return 0;
}
修改之后的代码就很明显的可以看出, else 是与 第一个 if 配对的.
if 的书写形式
void Func_1(){
int x = 0;
int y = 0;
if (x == 0){
if (y == 0){
printf("hehe\n");
}
}
}
void Func_2(){
int x = 0;
int y = 0;
if (x != 0){
return;
}
if (y != 0){
return;
}
printf("hehe\n");
}
上面的两个函数表示的意思是一样的, 第二个更加清晰.
练习
- 判断一个数是否为奇数
- 输出 1 - 100 之间的奇数
switch 语句
switch语句也是一种分支语句。常常用于多分支的情况。
比如:
输入1, 输出星期一
输入2, 输出星期二
输入3, 输出星期三
输入4, 输出星期四
输入5, 输出星期五
输入6, 输出星期六
输入7, 输出星期天
switch 的语法结构
switch(整型表达式){
语句项;
}
语句项如下:
case 整型常量表达式
语句;
在 switch 语句中的 break
在switch语句中,我们没办法直接实现分支,搭配 break 使用才能实现真正的分支
printf("请输入今天星期几:");
int day = 0;
scanf("%d", &day);
switch (day) {
case 1:
printf("星期一!\n");
break;
case 2:
printf("星期二!\n");
break;// 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;
default:
printf("都不是\n");// 不是上面的某一种情况,则执行default
break;
switch 注意事项
- break 不能少, 如果进入到某个分支, 这个分支没有 break, 程序会顺序执行后面的语句
- 最好加上default
- switch 中判定的变量必须是整数
- case 语句中只能写一个整数常量, 不能写变量, 更不能写表达式
循环语句
while
语法结构
while(表达式)
循环语句;
表达式: 是判断循环是否继续执行的依据
例如: 在屏幕上依次打印出 1- 10
int num = 0; // 必须初始化
while (num < 10) {
printf("%d", num);
num++;
}
注意:
- 循环变量一定要初始化;
- 循环条件是用来控制循环结束的重要依据;
- 循环体中要及时更新循环变量.
上面的代码如果不能及时更新 num
, 则会出现死循环.
break 和 continue
break
循环 1 -10 这 10 个整数, 遇到第一个 3 的倍数停止循环
int num = 1;
while (num < 10) {
printf("%d", num);
if (num % 3 == 0)
break;
num++;
}
在循环中只要遇到 break, 就停止后面的所有循环, while 循环中的 break 是永久终止循环的.
continue
循环 1 -10 这 10 个整数, 遇到 3 的倍数就不打印
int num = 1;
while (num < 10) {
if (num % 3 == 0) {
num++;
continue;
}
else {
printf("%d", num);
num++;
}
}
continue 是用于终止本次循环的,也就是本次循环中 continue 后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
如果用户输入的不是大写字母, 就输出, 否则就不输出
char ch = 0;
while ((ch = getchar())!=EOF) {
// 输出大写字母
if (ch >= 'A' && ch <= 'Z') {
continue;
}
putchar(ch);
}
EOF: end of file 一般表示文件读取结束
for
语法结构
for (表达式 1; 表达式 2; 表达式 3)
循环语句;
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
例如: 在屏幕上依次打印出 1- 10
include <stdio.h>
int main() {
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++) {
printf("%d ", i);
}
return 0;
}
就这个例子, 我们看一下 for 循环的执行过程
- 表达式 1 ==> int i = 1
- 表达式 2 ==> i <= 10
- 循环体
- 表达式 3
- 2 - 4 步骤多次依次执行
上面的代码我们在定义循环变量是在 for 循环之外定义的, 我们也可以在 for 循环里面定义 循环变量, 如for ( int i = 1; i <= 10; i++)
, 这两种定义方式有何区别呢? 这是我们就发现他们的作用域有所不同, 在 for 循环之外定义的循环变量, 即使 for 循环结束之后也可以被使用; 但是在 for 循环里面定义的循环变量, 它的作用域就只限于在 for 循环里, 出了 for 循环之后便不能被使用了.注意: 因为我使用的是 VS, 而在 for 循环里定义循环变量在 C语言标准是不合法的.
for 循环里也可使用 break 和 continue;
注意
- 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
- 建议for语句的循环控制变量的取值采用 “前闭后开区间” 写法。" ( ) " : 开区间; " [ ] " : 闭区间.
练习
int i = 0;
int k = 0;
for (i = 0, k = 0; k == 0; i++, k++) {
k++;
}
问 for 循环执行几次: 0 次
do while
语法结构
do{
循环语句;
}while(表达式);
不管条件如何, 都会执行一次循环体, 然后再对条件进行判断
打印 1 - 10
int num = 1;
do {
printf("%d\n", num);
num++;
} while (num <= 10);
练习
- 计算 n的阶乘。
- 计算 1!+2!+3!+……+10!
- 在一个有序数组中查找具体的某个数字n。(讲解二分查找)
- 编写代码实现,模拟用户登录情景,并且只能登录三次。只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。
- 编写代码,演示多个字符从两端移动,向中间汇聚。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
/* 1. 计算 n的阶乘。*/
/* 2. 计算 1!+ 2!+ 3!+ …… + 10! */
/* 3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)*/
/* 4. 编写代码实现,模拟用户登录情景,并且只能登录三次。只允许输入三次密码,
如果密码正确则 提示登录成,如果三次均输入错误,则退出程序 */
/* 5. 编写代码,演示多个字符从两端移动,向中间汇聚。*/
int Sum_Factorial(int n);
int main() {
/* 1. 计算 n的阶乘。*/
/*int n = 0;
scanf("%d", &n);
int result = 1;
for (int i = n; i > 1; i--) {
result *= i;
}
printf("%d", result);*/
/* 2. 计算 1!+ 2!+ 3!+ …… + 10! */
// 因为这里是对阶乘求和, 可以有两种方法
// ①: 对第一题的程序在加一层循环
// ②: 将第一题写成函数, 在使用循环
// ①
// 此时 n 是求和到 的阶乘,
/*int n = 0;
scanf("%d", &n);
int result = 0;
for (int j = 1; j <= n; j++) {
int temp = 1;
for (int i = j; i > 1; i--) {
temp *= i;
}
result += temp;
}
printf("%d", result);*/
// ②: 声明并定义函数 Sum_Factorial()
/*int n = 0, result = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
result += Sum_Factorial(i);
}
printf("%d", result);*/
/* 3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)*/
//int arr[] = { 1, 4, 5, 56, 66, 67, 78, 89, 99 };// 有序数组
//int num = 0;// 待查找数据
//scanf("%d", &num);
// 可以使用 for 循环遍历查找, 也可使用二分法查找
// ① for
/*int i = 0;
for (; i < 9; i++) {
if (num == arr[i]) {
printf("数组下标为 %d !\n", i);
return 0;
}
}
printf("未找到!\n");*/
// ② 二分查找
/*int len = 9;
int low = 0, high = len - 1;
for (int i = 0; i < len; i++) {
int mid = (low + high) / 2;
if (num > arr[mid]) {
low = mid;
}
else if (num < arr[mid]) {
high = mid;
}
else {
printf("数组下标为 %d !\n", mid);
return 0;
}
}
printf("未找到!");*/
/* 4. 编写代码实现,模拟用户登录情景,并且只能登录三次。只允许输入三次密码,
如果密码正确则 提示登录成,如果三次均输入错误,则退出程序 */
//int change = 3;
char secret[6] = "123456";
//char answer[10] = { 0 };
//int i = 0;
//do {
// printf("请输入密码: ");
// scanf("%s", answer);
// // strcmp(): 比较字符串是否相同
// if (strcmp(answer, "123456") == 0) {
// printf("登录成功!");
// break;
// }
// i++;
//} while (i < change);
//if (i == 3) {
// printf("密码错误三次, 禁止登陆!");
//}
/* 5. 编写代码,演示多个字符从两端移动,向中间汇聚。*/
/*char a[] = "welcome";
char b[] = "*******";
char c[] = "*******";
int low = 0, high = strlen(a) - 1;
for (int i = 0; i < (strlen(a) / 2) + 1; i++) {
for (int j = 0, k = high; j <= low; j++, k--) {
c[j] = a[j];
c[k] = a[k];
}
printf("%s\n", c);
low++;
}*/
return 0;
}
int Sum_Factorial(int n) {
int result = 1;
for (int i = n; i > 1; i--) {
result *= i;
}
return result;
}