C语言基础学习 - 分支和循环语句

分支和循环语句

  1. 分支语句
  • if
  • switch
  1. 循环语句
  • 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. 判断一个数是否为奇数
  2. 输出 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 注意事项

  1. break 不能少, 如果进入到某个分支, 这个分支没有 break, 程序会顺序执行后面的语句
  2. 最好加上default
  3. switch 中判定的变量必须是整数
  4. case 语句中只能写一个整数常量, 不能写变量, 更不能写表达式

循环语句

while

语法结构

while(表达式)
	循环语句;

表达式: 是判断循环是否继续执行的依据
例如: 在屏幕上依次打印出 1- 10

	int num = 0; // 必须初始化
	while (num < 10) {
		printf("%d", num);
		num++;
	}

注意:

  1. 循环变量一定要初始化;
  2. 循环条件是用来控制循环结束的重要依据;
  3. 循环体中要及时更新循环变量.

上面的代码如果不能及时更新 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. 表达式 1 ==> int i = 1
  2. 表达式 2 ==> i <= 10
  3. 循环体
  4. 表达式 3
  5. 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);

练习

  1. 计算 n的阶乘。
  2. 计算 1!+2!+3!+……+10!
  3. 在一个有序数组中查找具体的某个数字n。(讲解二分查找)
  4. 编写代码实现,模拟用户登录情景,并且只能登录三次。只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。
  5. 编写代码,演示多个字符从两端移动,向中间汇聚。
#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值