分值和循环语句,if,for,while,do while。。。。。goto语句

分支语句

  1. if语句
  2. switch语句

循环语句

  1. while语句
  2. for语句
  3. do while语句

goto语句

1.if语句

语法结构: if(表达式)
    语句;
    
     if(表达式)
    语句1;
     else
    语句2;
    
     //多分支     if(表达式1)
    语句1; else if(表达式2)
    语句2; else
    语句3;

举例:

//分支语句,选择语句
int main() {
    
    
	int age = 20;
		if (age >= 18)
			printf("成年\n");

//if   else
	if (age >= 18)
		printf("成年\n");
	else
		printf("未成年\n");


//多分支
	if (age < 18)
		printf("未成年\n");
	else if (age >= 18 && age < 30)
		printf("青年\n");
	else if (age >= 30 && age < 55)
		printf("中年\n");
	else
		printf("老年\n");
	return 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语句进行匹配;当a不满足条件直接return 0了;

适当的使用{}可以使代码的逻辑更加清楚。
代码风格很重要

#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; }

在这里插入图片描述

当加上{}时候,很容易看出代码输出的什么,因此代码风格很重要。

if书写形式对比

//代码1
if (condition) {
    
    
    return x; }
return y;
//代码2
if(condition) {
    
    
    return x; }
else
{
    
    
    return y; }
//代码3
int num = 1;
if(num == 5) {
    
    
    printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num) {
    
    
    printf("hehe\n");
}

代码2和代码4更好,逻辑更加清晰,不容易出错。

判断奇数

  1. 判断一个数是否为奇数
int main() {
    
    
	int a = 0;
	scanf("%d", &a);
	if (a % 2 != 0) {
    
    
		printf("a是奇数\n");
	}
	else {
    
    
		printf("a不是奇数\n");
	}
	return 0;
}
  1. 输出1-100之间的奇数
 int main() {
    
    
	int i = 1;
	//方法1
	while (i <= 100) {
    
    
		if (i % 2 == 1)
			printf("%d ", i);
		i++;
	}

//方法2
	while (i <= 100) {
    
    
		printf("%d ", i);
		i += 2;
	}
	return 0;
}

2.switch语句

switch(整型表达式) {
语句项; }

语句项:

//是一些case语句:
//如下:
case 整形常量表达式:
语句;

输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日

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;

	default:
		printf("error");
		break;
	}
}

在这里插入图片描述

当输入1-7以外的其他数字则执行default语句,输出error
在这里插入图片描述

switch语句中的break

在switch语句中,我们没法直接实现分支,搭配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"); 

	default:
		printf("error");
		
	}

}

当我们不加break时候,它不会实现真分支,比如我们输入3,它直接会进入case3打印,然后case3后面的case也都会打印;加上break后,它只会执行对应的case,执行完后break,就跳出
加上

练习

  1. 当输入1-5任意一个数输出weekday,输入6-7任意一个数输出weekenday,输入其他数提示“输入错误,请输入1-7之间的整数”
 int main() {
    
    
	int day = 0;
	scanf("%d", &day);
	switch (day)//表达式必须是整形表达式
	{
    
    
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:
		printf("weekenday\n"); break;
	default:
		printf("输入错误,请输入1-7之间的整数\n");
		break;
	}

}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  1. 结果是什么???
 #include <stdio.h>
int main()
{
    
    
    int n = 1;
    int m = 2;
    switch (n)
   {
    
    
    case 1:
            m++;
    case 2:
            n++;
    case 3:
             switch (n)
           {
    
    //switch允许嵌套使用
             case 1:
                    n++;
             case 2:
                    m++;
                    n++;
                    break;
           }
    case 4:
            m++;
             break;
    default:
             break;
   }
    printf("m = %d, n = %d\n", m, n);//打印m=5,n=3
    return 0; }

3.while循环

语法结构

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

while循环打印1-10的数字

#include <stdio.h>
int main()
{
    
    
 int i = 1;
 while(i<=10)
 {
    
    
 printf("%d ", i);
 i = i+1;
 }
 return 0; }

while中的break和continue

下面代码输出什么,break应用

int main() {
    
    //只打印 1,2,3,4,不打印5
	int i = 1;
	while (i <= 10)
	{
    
    
		if (5 == i)
			break;//while中的break是终止循环的

		printf("%d ", i);
		i++;
	}
	return 0;
}

在这里插入图片描述

下面代码输出什么,continue应用

int main() {
    
    
	int i = 1;
	while (i <= 10)
	{
    
    
		if (5 == i)
			continue;//跳过本次循环continue后面的代码,直接去while循环判断部分

		printf("%d ", i);
		i++;
	}
	return 0;
}

在这里插入图片描述

总结

  1. while中的break用于永久终止循环的,程序直接执行完成退出
  2. while中的continue,跳过本次循环continue后面的代码,直接去while循环判断部分,程序在执行,还没结束

4.for循环

语法

for(表达式1;表达式2;表达式3)
循环语句;

表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。

使用for循环 在屏幕上打印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循环和while循环。

int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
    
    
 printf("hehe\n");
 i = i+1;//调整部分
}
//实现相同的功能,使用while
for(i=1; i<=10; i++) {
    
    
 printf("hehe\n");
}

可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。
for循环使用的频率也最高。

break和continue在for循环中

break:

int main() {
    
    
	int i = 0;
	for (i = 1; i <= 10; i++) {
    
    
		if (5 == i)
			break;
			//continue;

		printf("%d ", i);
	}
	return 0;
 }

在这里插入图片描述

continue:

int main() {
    
    
	int i = 0;
	for (i = 1; i <= 10; i++) {
    
    
		if (5 == i)
			//break;
			continue;

		printf("%d ", i);
	}
	return 0;
 }

在这里插入图片描述
总结: for循环中break直接直接退出程序执行,continue是跳过次次循环continue后面的语句,进行下一次循环

一些for循环的变种

#include <stdio.h>
int main()
{
    
    
 //变种1
 for(;;)
 {
    
    
 printf("hehe\n");
 }

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

变种一是死循环,注意:

  1. for初始化、判断、调整都可以省略
  2. 判断省略意味着判断条件恒为真
  3. 建议不要轻易省略

一道笔试题:

//请问循环要循环多少次?
#include <stdio.h>
int main()
{
    
    
 int i = 0;
 int k = 0;
 for(i =0,k=0; k=0; i++,k++)
        k++;
 return 0; }

在这里插入图片描述
循环一次都没执行。

5do…while()循环

循环至少执行一次

语法

do
循环语句;
while(表达式);

do while循环中的break和continue

break:

int main() {
    
    
	int i = 1;

	do {
    
    
		printf("%d ", i);
		if (5 == i)
			break;
			//continue;
		i++;
	} while (i<=10);
	return 0;
	}

在这里插入图片描述
continue:

int main() {
    
    
	int i = 1;

	do {
    
    
		printf("%d ", i);
		if (5 == i)
			//break;
			continue;
		i++;
	} while (i<=10);
	return 0;
	}

在这里插入图片描述
死循环

6 练习

  1. 计算 n的阶乘。
int main() {
    
    
	int i = 1;
	int a = 1;
	scanf("%d", &i);
	do {
    
    
		a = a * i;
		i--;
	} while (i > 0);
	printf("%d\n", a);
	return 0;
}

在这里插入图片描述
2. 计算 1!+2!+3!+……+10!

//方法一:
int main() {
    
    
	int n = 1;
	int i = 1;
	int j = 1;
	int sum = 0;
	scanf("%d", &n);
	for (i = 1;i<= n ; i++ ) {
    
    
		int ret = 1;
		for (j = 1; j <= i; j++) {
    
    
			ret = ret * j;
		}
		sum = sum + ret;
	}
	printf("%d\n", sum);
	return 0;
}
//方法二
int main() {
    
    
	int n = 1;
	int ret = 1;
	int sum = 0;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
    
    
		ret = ret * i;
		sum = sum + ret;
	}
	printf("%d\n", sum);
	return 0;
}

在这里插入图片描述
3. 在一个有序数组中查找具体的某个数字n。

在有序数组中找数字7.

int main() {
    
    
	int arr[] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	//查找7
	int sz = sizeof(arr) / sizeof(int);
	int i = 0;
	int flag = 0;//表示未找到
	for (i = 0; i < sz; i++) {
    
    
		if (7 == arr[i]) {
    
    
			flag = 1;
			break;
		}
	}
	if (flag == 1)
		printf("找到了,下标是:%d\n", i);
	else
		printf("未找到\n");

	return 0;
}
//折半查找(二分查找)。数据必须有序
int main() {
    
    
	int arr[] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	//查找7
	int k = 7;
	int sz = sizeof(arr) / sizeof(int);
	int left = 0;
	int right = sz - 1;
	int mid = 0;
	int flag = 0;//未找到标志	


	while (left <= right) {
    
    
		//求中间元素下表
		mid = (left + right) / 2;
		if (arr[mid] < k) {
    
    
			left = mid + 1;
		}
		else if (arr[mid] > k) {
    
    
			right = mid - 1;
		}
		else {
    
    
			flag = 1;
			break;
		}
	}

	if (flag == 1) 
		printf("找到了,下标是:%d\n", mid);
	else 
		printf("未找到\n");
	
		return 0;

}

在这里插入图片描述

  1. 编写代码,演示多个字符从两端移动,向中间汇聚。
#include<string.h>
#include<Windows.h>
int main() {
    
    
	char arr1[] = "welcome to bit!!!!!";
	char arr2[] = "                    ";
	int left = 0;
	int right = strlen(arr2) - 1;

	printf("%s\n", arr2);
	while (left<right) {
    
    
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		Sleep(100);
		system("cls");//清空屏幕
		left++;
		right--;
		printf("%s\n", arr2);
	}

	return 0;
}
  1. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则
    提示登录成,如果三次均输入错误,则退出程序。
#include<string.h>
int main() {
    
    
	int i = 0;
	//假设真实的密码是字符串
	char password[20] = {
    
     0 };
	for (i = 0; i < 3; i++) {
    
    
		printf("请输入密码:>");
		scanf("%s", password);

		if (strcmp(password, "123456") == 0) {
    
    //2个字符串比较不能使用==,应该是strcmp()
			printf("登录成功\n");
			break;
		}
		else {
    
    
			printf("密码错误\n");
		}
	}
	if (i == 3)
		printf("三次密码输入错误,退出登录\n");
	
	return 0;
}
  1. 猜数字游戏实现
#include<stdlib.h>
#include<time.h>
void menu() {
    
    
	printf("******************\n");
	printf("****** 1.play ****\n");
	printf("****** 0.exit ****\n");
	printf("******************\n");
}

//123  十进制
//0x123  十六进制
//0123   八进制
//RAND_MAX

//时间
//时间戳
//c语言如何获得时间戳
//time()函数

//time_t
void game() {
    
    
	int guess = 0;
	//1.生成随机数
	int ret = rand() % 100+1;//0-99  +1 ---1-->100
	//printf("%d\n", ret);//生成的随机数不可见
	//2.猜数字

	while(1)
	{
    
    
		printf("请猜数字:>");
		scanf("%d", &guess);
		if (guess < ret) 
		{
    
    
			printf("猜小了\n");
		} 
		else if (guess > ret) 
		{
    
    
			printf("猜大了\n");
		}
		else 
		{
    
    
			printf("恭喜你猜对了\n");
			break;
		}
	}
	
}
	//1.shenggrg	
int main() {
    
    
	int input = 0;

	//设置随机数的生成起点,函数不应该频繁调用
	srand((unsigned)time(NULL));
	do {
    
    
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input) {
    
    
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");

		}
	} while (input);
	return 0;
}

goto语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。
这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
下面是使用goto语句的一个例子:

//goto 语句

//关机程序
//只要程序运行起来,电脑就倒计时1分钟
//1分钟内只要输入“取消”,就取消关机

//shutdown -s -t 60  60s后关机
//shutdown -a  取消关机


#include<stdlib.h>
#include<string.h>
int main() 
{
    
    
	char input[20] = {
    
     0 };
	//倒计时关机
	system("shutdown -s -t 500");

again:
	printf("500s后关机,输入取消,就取消关机\n");
	scanf("%s", input);

	//判断输入是否是“取消”
	if (strcmp(input, "取消") == 0)//两个字符串比较不能使用等号
	{
    
    
		system("shutdown -a");
	}
	else
	{
    
    
		goto again;
	}
	return 0;

}

while循环:

#include<stdlib.h>
#include<string.h>
int main()
{
    
    
	char input[20] = {
    
     0 };
	//倒计时关机
	system("shutdown -s -t 500");

	while (1)
	{
    
    
		printf("500s后关机,输入取消,就取消关机\n");
		scanf("%s", input);

		//判断输入是否是“取消”
		if (strcmp(input, "取消") == 0)//两个字符串比较不能使用等号
		{
    
    
			system("shutdown -a");
			break;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44721738/article/details/120782798