C语言初阶——2分支语句和循环语句

1.分支语句(选择结构)

1.1 if 语句

三种语法结构:

  • 第一种:
    if(表达式)
    语句;

  • 第二种:
    if(表达式)
    语句1;
    else
    语句2;

  • 第三种://多分支
    if(表达式1)
    语句1;
    else if(表达式2)
    语句2;
    else
    语句3;

注意:if、else如果没有{} ,那么就只有紧跟着的一句代码才是有效的

if (cond1) {
	if (cond2)
	{
		if (cond3) {
			return x;
		}
		return x;
	}
	return x
}
//上面的多层 if 嵌套,代码可读性差,可以换成下面这种:
if (!cond1) {
	return y;
}
if (!cond2) {
	return y;
}
if (!cond3) {
	return y;
}
return x;
}

1.2 Switch 语句

switch主要用于多个分支的情况~
switch的注意事项:

  1. 使用break结束switch语句,如果忘了,就容易导致多个分支相互影响了
  2. switch这里的变量只能是整数(char, short, int, long, long long)
  3. 可以使用default表示默认的分支选项.如果switch中变量的值和case7匹配,就执行default
  4. 可以在case中,把多个case合并,用来表达简单的或这样的逻辑,无法进一步表达更复杂的逻辑的(逻辑与)例如,判断一个整数是大于10并且小于20 (switch case实现不了)
  5. switch可以嵌套的
    但是这么写太丑了,不建议这么写~

实现:让用户输入一个1-7的整数,表示今天的星期几
代码:

int main() {

	//让用户输入一个1-7的整数,表示今天的星期几
	//根据用户输入来决定打印具体的星期数
	printf("请输入正整数1-7:");
	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;
		default:
			printf("您的输入有误\n");
			break;



	}


	return 0;
}

2.循环语句

2.1 while 语句

  • while 语法结构
    while(表达式)
    循环语句;

实现功能:打印1-10
代码:

#include<stdio.h>


int main()
{
	//打印1-10
	int i = 1;
	while ( i <= 10 ) {
		printf("%d\n", i);
		i++;
	}

	return 0;
}
  • while语句中的break和continue
    break:直接退出循环

continue:退出当前,继续下一次循环,开始判断循环条件是否成立,

2.2 for 循环

for和while本质上是等价的,任何你用while实现的循环都能用for实现。

2.2.1 语法

for(表达式1;表达式2;表达式3)
循环语句;
表达式1 为初始化部分,用于初始化循环变量的。 表达式2 表达式2为条件判断部分,用于判断什么循环时候终止。 表达式3为调整部分,用于循环条件的调整。

for的执行过程:

  1. 执行表达式1,创建变量i,并且进行i=1的初始化
  2. 执行表达式2,判定循环条件是否成立(是不是为真/非0)
    a) 如果条件成立,就执行循环体代码
    b)如果条件不成立,就直接结束循环
  3. 当循环体结束之后,执行表达式3,更新 i 的值
  4. 再次执行表达式2,后面就依次循环执行。

2.2.2 使用for循环

  • 在屏幕上打印1-10的数字。
	for (int i = 1; i <= 10; i++) {
		printf("%d\n", i);
	}

  • 吃五个包子
	//吃5个包子
	for (int i = 1; i <= 5; i++) {
		if (i == 3) {
			printf("吃到一个虫子!\n");
			continue;
		}
		printf("吃第 %d 个包子\n", i);
	}

在这里插入图片描述

  • 笔试题1:请问循环要循环多少次?
#include<stdio.h>
int main()
{
	int i = 0;
	int k = 0;
	for (i = 0, k = 0; k = 0; i++, k++) {
		
		printf("%d\n", k);
		k++;
	}
	//关键在于判断条件 k=0 这里的=是赋值,k=0表示为假,条件不成立,所以一次都不会循环
		
	return 0;

0次!

  • 笔试题2:请问最终k的值是多少?
#include<stdio.h>
int main()
{
	int i = 0;
	int k = 0;
	for (i = 0, k = 0; k == 0; i++, k++) {//(3)循环体执行完之后,开始
		
		printf("%d\n", k);//(1)这里k =0
		k++; //(2)k++
	}
	printf("%d\n", k);
	return0;
}

在这里插入图片描述

2.2.3 for循环使用建议

  1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
  2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
  3. 一些for循环的变种
    (1) 变种1,下面就是一个死循环,什么都没写的意思是它无条件满足

	for (;;)
	{
		printf("hehe\n");
	}

(2)变种2,初始值不一定只有一个,下面的代码也是正确的

	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
	{
		printf("hehe\n");
	}
	return 0;
}

2.3 do while 语句

  • do语句的语法:
    do
    循环语句;
    while(表达式);
  • 执行流程
    循环至少执行一次,使用的场景有限,所以不是经常使用。
  • 打印1-10
//用do while 实现 打印1-10
	int num = 1;
	do
	{
		printf("%d\n", num);
		num++;
	}

	while (num <= 10);

3 练习

  1. 计算 n的阶乘

  2. 计算 1!+2!+3!+……+10!的值

  3. 在一个有序数组中查找具体的某个数字n。 编写int binsearch(int x, int v[], int n); 功能:在v[0]
    <=v[1]<=v[2]<= ….<=v[n-1]的数组中查找x.

  4. 编写代码,演示多个字符从两端移动,向中间汇聚。
    C语言中没有一个类型表示字符串,只能用char来凑合~
    C中为了表示字符串,有这样的约定:使用‘\0’作为字符串的结束标记,

3.1 计算 n的阶乘

3.2 计算 1!+2!+3!+……+10!的值

  1. 普通版本
int main()
{
	//计算n的阶乘
	int sum = 1;
	for (int i = 1; i <= 10; i++) {
		//这个 for 循环进行相加操作,
		//factor 表示当前 i 的阶乘
		int factor = 1;
		for (int j = 1; j <= i; j++) {
			factor *= j;
		}
		sum += factor;
	}
	printf("sum = %d\n", sum);





	return 0;
}
  1. 加入函数版本
//用于求n的阶乘
int factor(int n)
{
	int result = 1;
	for (int i = 1; i <= n; i++) {
		result *= i;
	}
	return result;
}
int main()
{
	//计算n的阶乘
	int sum = 0;
	for (int i = 1; i <= 10; i++) {
		sum += factor(i);
	}
	printf("sum = %d\n", sum);



	return 0;
}

3.3 编写代码,演示多个字符从两端移动,向中间汇聚

思路:每次循环,对STR2进行修改

  • Sleep函数,参数是时间,让程序等待的时间,单位是ms,eg:sleep(500)让程序等待500ms,让程序等一等,过一会在执行。sleep 函数需要包含头文件:Windows.h。sleep函数和printf。strlen有本质的区别:printf和strlen标准库函数(合格的C语言编译器,都会有这些函数,用法都一样,和系统无关)而sleep函数是Sleep Windows API(Application Programming
    Interface)应用程序编程接口~~API是一个比较广义的概念。
  • cls是一个window cmd中的命令,效果就是 clear screen 清屏的作用。 system(“cls”);

版本1:

#include<stdio.h>
#include<string.h>


int main() {
	//多个字符从两端移动,向中间汇聚

	//C语言中没有一个专门的类型表示字符串,只能由char凑合
	char str1[] =  "welcome to C language" ;
	char str2[] =  "#####################";
	int left = 0;
	int right = strlen(str1)-1;
	while (left <= right) {
		str2[left] = str1[left];
		str2[right] = str1[right];
		left++;
		right--;
		printf("%s\n", str2);
	}
	return 0;
}

在这里插入图片描述

版本2:一行一行出来
加上sleep函数

#include<stdio.h>
#include<string.h>
#include<Windows.h>


int main() {
	//多个字符从两端移动,向中间汇聚

	//C语言中没有一个专门的类型表示字符串,只能由char凑合
	char str1[] =  "welcome to C language" ;
	char str2[] =  "#####################";
	int left = 0;
	int right = strlen(str1)-1;
	while (left <= right) {
		str2[left] = str1[left];
		str2[right] = str1[right];
		left++;
		right--;
		printf("%s\n", str2);
		Sleep(500);
	}
	return 0;
}

它会,一行一行的打印:
在这里插入图片描述

版本3:在一行显示最新打印的信息,并清掉之前的打印信息

#include<stdio.h>
#include<string.h>
#include<Windows.h>


int main() {
	//多个字符从两端移动,向中间汇聚

	//C语言中没有一个专门的类型表示字符串,只能由char凑合
	char str1[] =  "welcome to C language" ;
	char str2[] =  "#####################";
	int left = 0;
	int right = strlen(str1)-1;
	while (left <= right) {
		str2[left] = str1[left];
		str2[right] = str1[right];
		left++;
		right--;
		system("cls");//每次打印之前清屏
		printf("%s\n", str2);
		Sleep(500);

	}
	return 0;
}

在这里插入图片描述

3.4 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。

  • scaf 输入的是 整数或者浮点数,需要& ;如果是字符串,不需要&。
  • C中的第一个惊天BUG——‘\0’
  • C中的第二个惊天BUG——数组名能隐式转成指向首元素的指针(数组和指针是两个互不相干的两个概念)
  • C语言中不能使用 == 比较两个字符串内容相等。需要使用strcmp 函数比较两个字符串内容是否相等,相等返回 0 ,不相等返回非零值。eg:strcmp(password,“1234”)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>




int main() {

	
	int i = 0;
	for (; i < 3; i++) {
		printf("请输入密码:");
		char password[1024] = { 0 };
		//scanf 输入的是整数或者浮点数 ,需要&    如果是字符串不需要&
		scanf("%s", password);
		if (strcmp(password,"1234") == 0) {
			printf("密码正确\n");
			break;
		}
		else {
			printf("密码错误\n");
		}
	}
	if (i >= 3) {
		printf("您已经输错3次了!程序直接退出");
	}


	return 0;
}

3.4 猜数字

4. GO TO 语句

  • goto语句表示"无条件跳转",遇到goto就直接跳到对应的位置的代码~ goto非常不建议使用,会对代码的可读性可维护性造成毁灭性的打击 ~汇编语言,里面就是主要在使用goto这类的代码 ~ ~
  • 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

下面是使用goto语句的一个例子:

  • 一个关机程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值