【C语言】分支结构

C语言是结构化的程序设计语言

  1. 顺序结构
  2. 选择结构 if switch
  3. 循环结构 while for do while

在这里插入图片描述

语句

在这里插入图片描述

控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,

C语言有九种控制语句。

分支语句(选择结构)

if 语句

语法结构:

if(表达式)
	语句;

if(表达式)
	语句1;
else
	语句2;

if(表达式1)
语句1;
else if (表达式2)
语句2;
else
语句3;
#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d",age);
	if(age>=18)
		printf("成年\n");
	else
		printf("快快长大\n");
}
#include<stdio.h>
int main()
{
	int age = 0;
	scanf("%d",age);
	if(age<18)
		printf("青少年\n");
	else if(age>=18 && age<30)
		printf("青年\n");
	else if(age>=30 && age<50)
		printf("中年\n");
	else if(age>=50 && age<80)
		printf("中老年\n");
	else 
		printf("老年\n");
}

if默认下面一句,多句需加大括号。

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匹配

不要走直觉!

代码风格很重要!

不好的代码风格:

//代码1
//return  结束啦,返回了
if (condition) {
    return x;
}
return y;

//代码2
int num = 1;
if(num == 5)
{
    printf("hehe\n");
}

规范代码:

if(condition)
{
    return x;
}
else
{
	return y;
}

//
int num = 1;
if(5 == num)
{
    printf("hehe\n");
}

练习:

//判断一个数是否是奇数

int main()
{
	int n = 0;
	scanf("%d",&n);
	if(n%2==1)
	{
		printf("奇数\n");
	}
	else
	{
	printf("偶数\n");
	}
}
//输出1-100之间的奇数
int main()
{
	int i = 0;
	for(i = 1;i<=100;i++)
	{
		if(i%2 != 0)
		{
			printf("%d ",i);
		}
	}
}

switch语句

适合多分支的情况

switch(**整型**表达式)
{
	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;
		default://所有的case都不匹配
				printf("输入错误\n");
				break;
	}
		return 0;
}

switch 、case决定入口,break决定出口

先处理正常的,再处理异常的

做题小心谨慎

循环语句

while

for

do while

while

while(表达式)
{
	//语句
}
//打印1-10的数字
int main()
{
	int i = 1;
	while(i<=10)
	{
		if(5==i)
			break;//提前跳出

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

在这里插入图片描述

要敢于调试

break是永久终止循环

continue是跳过本次循环continue后面的语句 直接进入下一次判断

#include <stdio.h>
int main()
{
 **int ch = 0;**
 while ((ch = getchar()) != EOF)
       putchar(ch);
    return 0;
}

//ctrl+z 会让getchar/scanf返回一个EOF

在这里插入图片描述

从键盘输入流读取一个字符

返回的是整型int

打印一个字符

在这里插入图片描述

#include <stdio.h>
int main()
{
    
    char password[20] = { 0 };
    printf("请输入密码:\n");
    scanf("%s", password);//123456

    printf("请确认密码(Y/N):");
    int ch = getchar();
    if ('Y' == ch)
    {
        printf("确认成功\n");
    }
    else
        printf("确认失败\n");
    return 0;
}

在这里插入图片描述

#include <stdio.h>
int main()
{
    
    char password[20] = { 0 };
    printf("请输入密码:\n");
    scanf("%s", password);//123456
		getchar();//处理\n的问题
    printf("请确认密码(Y/N):");
    int ch = getchar();
    if ('Y' == ch)
    {
        printf("确认成功\n");
    }
    else
        printf("确认失败\n");
    return 0;
}

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

//处理方法2
#include <stdio.h>
int main()
{
    
    char password[20] = { 0 };
    printf("请输入密码:\n");
    scanf("%s", password);//123456
		int tmp = 0;
//把\n放进tmp里,下面while条件为假,就结束了。
		**while((tmp=getchar()) !='\n')
		{
				;
		}

//就相当于要吸收\n 防止\n之前的数据进入下面**
    printf("请确认密码(Y/N):");
    int ch = getchar();
    if ('Y' == ch)
    {
        printf("确认成功\n");
    }
    else
        printf("确认失败\n");
    return 0;
}

理解缓冲区!!!

//代码2
#include <stdio.h>
int main()
{
    char ch = '\0';
 while ((ch = getchar()) != EOF)
 {
     if (ch <0|| ch >9)
        continue;
     putchar(ch);
 }
 return 0;
}
//跳过其他字符,只打印数字字符

for循环

在这里插入图片描述

//打印1-10
int main()
{
	int i = 0;
	for(i = 1;i<=10;i++)
	{
		printf("%d ",i);
	}
	return 0;
}

在这里插入图片描述

for循环对循环变量的控制

  1. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制。
  2. 建议for语句的循环控制变量的取值采用**“前闭后开区间”**写法。
//前闭后开的写法
for(i=0; i<10; i++)
{}

[0,10)

可读性更高,右边可以展示循环次数

在for循环看情况告知循环次数

for循环变种

#include <stdio.h>
int main()
{
 //代码1
 for(;;)
 {//判断省略 判断就恒为真
 printf("hehe\n");
 }
    //for循环中的**初始化部分,判断部分,调整部分**是可以省略的,但是不建议初学时省略,容易导致问
题。
    
    //代码2
    int i = 0;
    int j = 0;
    //这里打印多少个hehe?
    for(i=0; i<10; i++)
   {
        for(j=0; j<10; j++)
       {
				 printf("hehe\n");
       }
   }
    
    //代码3
    int i = 0;
    int j = 0;
    //如果省略掉初始化部分,这里打印多少个hehe?
//只打印10个
    for(; i<10; i++)
   {
        for(; j<10; j++)//j不受控了
       {
 printf("hehe\n");
       }
   }
    
 //代码4-使用**多余一个变量**控制循环
		int x, y;
    for (x = 0, y = 0; x<2 && y<5; ++x, y++)
   {
        printf("hehe\n");
   }
 return 0;
}
//请问循环要循环多少次?
#include <stdio.h>
int main()
{
 int i = 0;
 int k = 0;
 for(i =0,k=0; ***k=0***; i++,k++)//循环压根就不进去
        k++;
 return 0;
}

do… while()循环

do
	循环语句;
while(表达式);
int main()
{
	int i = 1;
	do 
	{
		printf("%d ",i);
		i++;
	}while(i<=10);

}
//break 后面不管有多少循环 都终止
int main()
{
	int i = 1;
	do 
	{
		if(i==5)
		break;

		printf("%d ",i);
		i++;
	}while(i<=10);

}//1234
int main()
{
	int i = 1;
	do 
	{
		if(i==5)
			continue;
		printf("%d ",i);
		i++;
	}while(i<=10);

}//1234死循环

搞清楚到底跳哪,下一句要干什么。

练习:

  1. 计算 n的阶乘。
  2. 计算 1!+2!+3!+……+10!
  3. 在一个有序数组中查找具体的某个数字n。
  4. 编写代码,演示多个字符从两端移动,向中间汇聚。
  5. 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。
//计算n的阶乘
int main()
{
	int n = 0;
	scanf("%d", &n);
	int sum = 1;
	for (int i = 1; i <= n; i++)
	{
		sum *= i;
	}
	printf("%d", sum);
	return 0;
}
**//计算阶乘和
int main()
{
	int n = 0;
	int i = 1;
	int sum = 1;
	int k = 0;
	for (n = 1; n <= 3; n++)
	{
		for (i = 1; i <= n; i++)
		{
			sum *= i;
			
		}
			k += sum;
	}
	printf("%d", k);
}**

错误代码!

//计算阶乘和
int main()
{
	int n = 0;
	int i = 1;
	int sum = 1;
	int k = 0;
	for (n = 1; n <= 3; n++)
	{
		**sum = 1;**
		for (i = 1; i <= n; i++)
		{
			sum *= i;	
		}
		k += sum;
	}
	printf("%d", k);
}

没有sum归一,造成累计

优化

int main()
{
	int n = 0;
	int i = 1;
	int sum = 1;
	int k = 0;
	for (n = 1; n <= 3; n++)
	{
		sum *= n;//1!*2 == 2!
		k += sum;
	}
	printf("%d", k);
}

二分查找:

前提条件:数组有序

val == 7

查找7

在这里插入图片描述

//二分查找
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int val = 0;

	int left = 0;//整个数组的大小    一个元素大小
	int right = (sizeof(arr) / sizeof(arr[0]))-1;
	while (left<=right)
	{
		int mid = (left + right) >> 1;

		if (arr[mid] < val)
		{
			left = mid + 1;
		}
		else if (arr[mid] > val)
		{
			right = mid - 1;
		}

		else
		{
			printf("找到了\n");
			break;
		}
	}
	printf("没找到\n");
	return 0;
}

mid这个求法有一定的问题,如果太大了 就不行了。

int mid = left+(right-left) / 2;

在这里插入图片描述

此思想很重要

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

##############
w############h
js##########Js
最后完整显示

用到strlen,引头文件string.h
在这里插入图片描述
在这里插入图片描述

头文件:windows.h

两个字符串的比较是不能用==

用strcmp

int main()
{
	int i = 0;
	char password[20] = { 0 };
	for (i = 0; i < 3; i++)
	{
		printf("输入密码\n");
		scanf("%s", password);
		if (strcpy(password, "hehe") == 0)
			break;
	}
	if (i == 3)
	{
		printf("exit\n");
	}
	else {
		printf("log in\n");
	}

}

猜数字:

在这里插入图片描述

rand函数调用前,要调srand

在这里插入图片描述

时间戳:

C语言提供了一个函数time 可以返回一个时间戳

在这里插入图片描述

不需要存起来就直接传NULL

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void menu()
{
	printf("#############\n");
	printf("###1.play####\n");
	printf("###0.exit####\n");
	printf("#############\n");
	printf("#############\n");
	printf("#############\n");
}

void game()
{
	//1.生成一个随机数
	int val = rand()%100+1;//控制在100之内
	//2.猜数字
	int k = 0;
	
	while (1)
	{
		printf("请输入数字\n");
		scanf("%d", &k);
		//输入数也要放进循环!
		if (k > val)
		{
			printf("猜大了\n");
		}
		else if (k < val)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("猜对了\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//时间在变化
	do
	{
		menu();
		printf("请选择\n");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				game();
				printf("猜数字\n");
				break;
			case 0:
				printf("退出\n");
				break;
			default:
				printf("选择错误,请重新选择\n");
				break;
		}
	} while(input);
	return 0;
}

int val = rand()%100+1;//控制在100之内

**//输入数也要放进循环!**

srand放在主函数,程序进入调一次就行了。

goto语句

int main()
{
	again:
	printf("haha\n");
	goto again;
	~~~~~~~~~~~~~~~~~~~~return 0;~~~~~~~~~~~~~~~~~~~~
}

一般不用 很乱

goto语言真正适合的场景如下:

for(...)
    for(...)
   {
        for(...)
       {
            if(disaster)
                goto error;
       }
   }
    …
error:
 if(disaster)
         // 处理错误情况

关机程序

int main()
{
    char input[10] = {0};
    system("shutdown -s -t 60");
    while(1)
   {

        printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
        scanf("%s", input);
        if(0 == strcmp(input, "我是猪"))
       {
            system("shutdown -a");
            break;
       }
				
   }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值