IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 分支和循环 -> 正文阅读

[C++知识库]分支和循环

什么叫语句?

一个分号隔开的就是一条语句

printf("这是一条语句");

分支语句(选择语句)

  • if语句
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int age = 10;
	if (age < 18)
	{
		printf("未成年\n");
		printf("不能谈恋爱");
	}
	else
	{
		if (age >= 18 && age < 28)
			printf("青年\n");
		else if (age >= 28 && age < 58)
			printf("壮年\n");
		else if (age >= 58 && age < 90)
			printf("老年\n");
		else
			printf("高寿\n");
	}
}
  • 悬空else

    #include<stdio.h>
    int main()
    {
    	int a = 0;
    	int b = 2;
    	if (a == 1)
    	  if (b == 2)
    		printf("hehe\n");
    	  else
    		printf("haha");
    		return 0;
    }
    

    结论:else 和最近的未匹配的 if 进行匹配。

  • if 书写形式的对比

//代码1
if (conditifion){
return x;
}
return y;

//表示的含义是 如果条件成立返回x,否则返回y
//代码2
if (conditifion)
{
  return x;
}
else 
{
  return y;
}
//很清晰很直观的可以看出整个代码的结构
//代码3
#include<stdio.h>
int main()
{
	int num = 4;
	if (num = 5)  //=是赋值,而==是判断相等    这里语法没有错误,容易产生bug
		printf("hehhehe\n");
	return 0;
}
//代码4
#include<stdio.h>
int main()
{
	int num = 4;
	if (5==num) //将常量放在前面,就能很好的规避代码3的问题
		printf("hehhehe\n");
	return 0;
}
//这是一个很好的编程习惯
  • 练习

输出100以内的奇数

//代码1
#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 100)
	{
		if (1 == i % 2)
			printf(" %d", i);
		i++;
	}
	return 0;
}

//代码2
#include<stdio.h>
int main()
{
	int i= 1;
	while (i <= 100)
	{
		printf("%d ", i);
		i += 2;
	}
	return 0;
}
  • switch语句
#include<stdio.h>
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;
	}
	return 0;
	}

不是case 后面必须跟break

#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
    default:   //1~7以外的情况
		printf("输入错误\n");
	}
	return 0;
	}
  • 练习
#include<stdio.h>
int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1:
		m++;
	case 2:
		n++;
	case 3:
		switch (n)
		{
		case 1:
			n++;
		case 2:
			m++;
			n++;
			break;
		}
	case 4:
		m++;
		break;
	default:
		break;
	}
	printf("m= %d    n= %d\n", m, n);
	return 0;
}

上面的输出结果是什么?

答案: m=5 n=3

要点注意:没有遇到break , case是接着往下走的

###循环语句

####while循环

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

while循环中break的作用:

在循环中,只要遇到break,就停止后期的所有的循环,直接终止循环,所以:while中的break是永久终止循环的。

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

while循环中continue的作用:

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。

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

while循环的应用举例:

#include<stdio.h>
int main()
{
	int ret = 0;
	int ch = 0;
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	printf("请确认(Y/N):>");
	
	while ((ch = getchar()) != '\n')   //此处需要循环来将输入缓冲区的字符拿完(getchar()只能拿走单个字符)
	{
		;                       //空语句,不需要执行内容
	}
    
	ret = getchar();
	if (ret == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}
	return 0;
}
#include<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		if (ch<'0' || ch>'9')
			continue;
		putchar(ch);
	}
	return 0;
}
//ctrl + Z 退出程序

for循环

  • 基本格式:
  for(初始化赋值如i=1;判断条件如i<=10;调整如i++)

{

    执行语句如 printf("%d ",i);

}


  • 练习:输出1~10的数字
#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}
  • for循环中break的用法
#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			break;
		printf("%d ", i);
	}
	return 0;
}
//输出1 2 3 4后,当i=5,break跳出循环
  • for循环中continue的用法
#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	return 0;
}
//输出1 2 3 4后,当i=5,执行continue,continue以下的语句不再执行,跳到i++
  • continue在for循环和while循环的区别
//while循环
#include<stdio.h>
int main()
{
	int i = 0;
	while (i <= 10)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i++;
	}
	return 0;
}
//while循环中执行到i=5,执行continue,continue以下不执行,跳到循环条件,判断后再次进入循环体,反复如此,成为死循环

区别就在于while循环中对i的调整是在循环体中靠后的位置,continue会将i的调整给跳过,而for循环不会这样。

  • for循环的变种1
#include<stdio.h>
int main()
{
	int i = 0;
	for (;;)    // 初始化,判断,调整 都可以省略,但是当条件省略后,判断值恒为真,会一直执行循环
	{
		printf("hehhe\n");
	}
	return 0;
}

不建议初学就进行省略

//未省略
#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
			printf("%d \n",j);
	}
	return 0; 
}
//这里将输出100个数
//省略后
#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (; i < 10; i++)
	{
		for (; j < 10; j++)
			printf("%d \n",j);
	}
	return 0; 
}
//这里只输出10个数,因为当i=0,执行外层循环体,进入内层循环,j=0,内层循环,j++,一直加到j=10,不满足内层循环条件,跳出内循环,
进入外循环,i=1,进入内循环,此时j=10,不满足,再跳到外循环。。。
  • 一道笔试题
#include<stdio.h>
int main()
{
	int i = 0;
	int k = 0;
	for (i = 0, k = 0; k = 0; i++, k++)
		k++;
	return 0;
}
//请问这里循环几次

答案:0次

解:i,k都赋值为0for循环,初始化赋值i=0,k=0;判断(赋值k=00为假))为假,不进入循环

do while循环

#include<stdio.h>
int main()
{
	int i = 1;
	do
	{
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
}
  • do while中break的使用
#include<stdio.h>
int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
}
//终止循环
  • do while中continue的使用
#include<stdio.h>
int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
}
// 打印1 2 3 4,+死循环


练习

1.计算n的阶乘

#include<stdio.h>
int main()
{
	int i = 0;
	int n = 0;
	int ret = 1;
	scanf("%d", &n);
	for (i = 1; i<=n; i++)
	{
		ret = ret*i;
	}
	printf("ret= %d\n", ret);
	return 0;
}
  1. 1!+2!+3!+…+10!
#include<stdio.h>
int main()
{
	int i = 0;
	int ret = 1;
	int n = 0;
	int sum = 0;
	for (n=1;n<=10;n++)
	{
		ret = 1;
		for (i=1;i<=n;i++)
		{
			ret = ret*i;
		}
		sum = ret + sum;
	}
	printf("%d\n", sum);
	return 0;
}
//思路:将单个的阶乘值相加得出最终结果
//注意:ret在内层循环出来的时候并没有初始化,如果不初始化,结果将是这样:在算5的阶乘的时候,
//      ret存储的额值是  4的阶乘值*5阶乘值,这样有一部分是算重叠的,结果当然是错误的。

上面的代码很明显是效率不高的,可以优化的(比如说算4的阶乘,是1* 2 * 3 * 4,算5的阶乘,也是1* 2 *3 * 4 *5,这样每次都需要从一开始成,显然,有冗余的部分)

//优化后
#include<stdio.h>
int main()
{
	int i = 0;
	int sum = 0;
	int ret = 1;
	for (i=1;i<=10;i++)
	{
		ret = ret*i;
		sum = sum + ret;
	}
	printf("sum= %d", sum);
	return 0;
}

3.顺序数组中查找指定值(二分查找/折半查找)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6,7,8,9,10};
	int k = 17;

	
	int sz = sizeof(arr) / sizeof(arr[0]);  //计算元素个数
	int left = 0;   //左下标
	int right = sz - 1;   //右下标

	while (left<=right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下标是:%d\n", mid);
			break;
		}

	}
	if (left > right)
	{
		printf("找不到\n");
	}
	return 0;
}

4.多个字符从两端移动,向中间汇聚。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>

int main()
{
	char arr1[] = "welcome to bit!!!!!!";
	char arr2[] = "####################";
	int left = 0;
	//int right = sizeof(arr1) / sizeof(arri[0])-2   //char型的数组默认有一个字符\0,所以需要多减一个
	int right = strlen(arr1) - 1;

	while (left<=right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		//休息一秒
		Sleep(1000);
		system("cls");   //执行系统命令的一个函数(清空屏幕)
		left++;
		right--;
	}
	printf("welcome to bit!!!!!!\n");

	return 0;
}

5.模拟用户登录,三次登录机会

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

int main()
{
	char password[20] = { 0 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("清输入密码:>");
		scanf("%s", password);
		if (strcmp(password,"123456")==0)  //字符串的比较需要使用库函数strcmp,而不能使用==
		{
			printf("登录成功\n");
			break;
		}
		else
		{
			printf("密码错误\n");
		}
	}
	if (3 == i)
	{
		printf("三次密码均错误,退出程序\n");
	}
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-05 21:32:58  更:2022-02-05 21:33:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:46:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码