1.分支

1.1 if语句

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
	{
		printf("%老年\n");
	}

	return 0;
}

1.1.1 悬空else

1.2 switch

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)//switch 只能接整型
	{
	//case 只能整型常量表达式
	case 1:
		printf("星期1\n");
		break;
	case 2:
		printf("星期2\n");
		break;
	case 3:
		printf("星期3\n");
		break;
	case 4:
		printf("星期4\n");
		break;
	case 5:
		printf("星期5\n");
		break;
	case 6:
		printf("星期6\n");
		break;
	case 7:
		printf("星期7\n");
		break;

/*当 switch 表达式的值并不匹配所有 case 标签的值时,
这个 default 子句后面的语句就会执行。*/
	default://default 也可以放在case判断前
		printf("%输入错误\n");
		break;
	}

	return 0;
}
int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1:m++;
	case 2:n++;//n为2
	case 3:
		switch (n)//switch允许嵌套使用
		{
		case 1://这里n为2,所以判断不成立
			n++;
		case 2:
			m++;
			n++;//n为3
			break;
		}
	case 4:
		m++;
		break;
	default:
		break;
	}
	printf("m = %d, n=%d\n", m, n);
	return 0;
}

2.循环

2.1 while

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;//满足条件时,本次循环中continue后面的代码不再执行,,然后回到while重新开始
		printf("%d ", i);
		i++;
	}
	return 0;
}
//1 2 3 4

i++;放到continue前,结果如下:

int main()
{
	int i = 1;
	while (i <= 10)
	{
		i++;//放到continue前
		if (i == 5)
			continue;//满足条件时,本次循环中continue后面的代码不再执行,,然后回到while重新开始
		printf("%d ", i);
	}
	return 0;
}
//2 3 4 6 7 8 9 10 11

2.1.1 getchar机制

int main()
{
	int ret = 0;//定义变量ret,接收getchar的返回值
	int ch = 0;
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);//定义变量ret,接收getchar的返回值
	//scanf读取完还剩下一个“\n”
	while ((ch = getchar()) != '\n')//如果输入123456 ABCD,则一个getchar不行,加一个循环,让getchar一直读取,直到读取为'\n'结束。
	{
		;//空语句,不需要做什么,只需要不断的判断。
	}
	printf("请确认(Y/N):>");//请确认,输入Y确认成功,N放弃确认。
	ret = getchar();//读取上输入的确认字符,并由ret接收。
	if (ret == 'Y')//判断输入的是Y还是N,Y输出确认成功,N输出放弃确认。
	{
		printf("确认成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}
	
	return 0;
}

2.2for循环

int main()
{
	int i = 0;
	//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
	for (i = 1;i <= 10;i++)
	{
		printf("%d\n", i);
	}

	return 0;
}

注:for(::) 判断部分如果被省略,判断条件就是恒为真;

int main()
{
	int i = 0;
	int j = 0;
	for (i=0;i<10;i++)
	{
		for (j=0;j<10;j++)
		{
			printf("he\n");//结果打印100次
		}
	}

	return 0;
}

而下面

int main()
{
	int i = 0;
	int j = 0;
	for (;i<10;i++)
	{
		for (;j<10;j++)
		{
			printf("he\n");//只打印10次,当j循环了10次后,i循环重新开始后j还是10,没有重新变为0
		}
	}
	return 0;
}

for循环变种

int main()
{
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x,y++)
  //第一次x,y=0满足,直接打印,打印后x,y都加1,第二次x,y=1,再打印,然后退出循环
	{
		printf("he\n");
	}
	return 0;
}

2.3do...while()循环

int main()
{
	int i = 1;
	do
	{
		if (5 == i)
			continue;
		printf("%d\n", i);
		i++;
	} while (i < 10);
	return 0;
}

2.4练习

2.4.1计算n的阶乘

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

2.4.2计算1!+2!+3!+......+10!

int main()
{
	int i = 0;
	int n = 0;
	int ret = 1;
	int sum = 0;
	
	for (n=1; n<=3; n++)
	{
		/*ret = 1;*/ //这里声明ret=1,就不重新计算1*1*2
		for (i = 1; i <= n; i++)
		{
			ret = ret * i;
		}
		sum = sum + ret;
	}
	printf("sum = %d\n", sum);
	return 0;
}
//n=1 i=1 ret=1*1 sum=0+1
//n=2 i=2 ret=1*1*2 sum=(0+1)+(1*2)
//n=3 i=2 ret=1*1*2*1*2*3 sum=(0+1)+(1*2)+(2*1*2*3)

2.4.3在一个有序数组中查找具体的某个数字n。(讲解二分查找)

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0;i < sz;i++)
	{
		if (k == arr[i])
		{
			printf("找到了,下标是:%d\n", i);
			break;
		}
	}
	if (i == sz)
		printf("找不到\n");
	return 0;
}
#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 = 7;
	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;
}

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

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

int main()
{
	//123456 to 654321 达成这个效果
	
	//################
	//1##############1
	//12############21
	//123##########321
	//......
	//123456 to 654321

	char arr1[] = "123456 to 654321";
	char arr2[] = "################";
	int left = 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");//执行系统命令的函数 cls-清空屏幕
		left++;
		right--;
	}
	
	printf("%s\n", arr2);
	return 0;
}

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

int main()
{
	int i = 0;
	char password[20] = { 0 };
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:>");
		scanf("%s", password);
		if (strcmp(password , "123456") == 0)
		{
			printf("登录成功\n");
			break;
		}
		else
		{
			printf("密码错误\n");
		}
	}
	if (i == 3)
		printf("三次密码均错误,退出程序\n");
	return 0;
}

2.5goto

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

int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");
agai:
	printf("请注意,你的电脑即将关机,如果输入:12,就取消\n请输入:>");
	scanf("%s", input);
	if (strcmp(input, "12") == 0)
	{
		system("shutdown -a");
	}
	else
	{
		goto agai;
	}
	return 0;
}

也可以用while循环

int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");
	while (1)
	{
		printf("请注意,你的电脑即将关机,如果输入:12,就取消\n请输入:>");
		scanf("%s", input);
		if (strcmp(input, "12") == 0)
		{
			system("shutdown -a");
			break;
		}
	}
	
	return 0;
}