分支和循环

分支和循环

分支语句

if语句

//如果if后面想跟多条语句,使用代码块
if (age > 18)
	{
		printf("可以");
		printf("不行");
	}

else和它最近的if匹配


int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe\n");
		else//else和if(b==2)匹配,而不是和if(a==1)匹配
			printf("haha\n");
	return 0;
}

所以什么都不打印
建议加{}

if (a == 1)
	{
		if (b == 2)
			printf("hehe\n");
		else
			printf("haha\n");
	}

switch语句

  switch(整型表达式)//整型表达式,float等类型不行
  {
      case 整形常量表达式:
      语句;
  }
int day;
	scanf("%d", &day);
	//switch (day)//根据day做选择
	//{
	case决定分支入口,break决定出口
	//case 1:
	//	printf("星期一\n");
	//	break;
	//case 2:
	//	printf("星期二\n");
	//	break;
	//case 3:
	//	printf("星期三\n");
	//	break;
	//case 4:
	//	printf("星期四\n");
	//	break;
	//}

	// 1-5工作日  67休息日
	switch (day)
	{
	//多种情况实现同一结果
	//不是说每个case后面都要跟break
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	default://不跟case匹配就default
		printf("输入有误,请输入1-7数字");
		break;
	}

while语句
break是永久中止循环

    int i = 1;
	while (i<=10)
	{
		if (i == 5)
			break;
		printf("%d", i);
		i++;
	}

打印1.2.3.4

continue的作用:跳过本次循环continue后面的代码,直接到while循环的判断部分

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

会陷入死循环

getchar和putchar的区别
getchar--从键盘获取字符 putchar-- 把字符打印到屏幕
    //EOF-end of file -文件结束标志
	//getchar读取失败会返回EOF
	//1.返回的字符,本质是字符也是ASCII码值,是整数
	//2.getchar函数不仅仅返回正常字符,还会返回EOF — -1,所以放在整形变量中
	while ((ch = getchar()) != EOF)//输入ctrl+z就停止
	{
		putchar(ch);
	}

思考:为什么下面代码输入密码后还没确认就直接打印失败?

int ch = 0;
	char PassWord[20];
	printf("请输入密码:");
	scanf("%s", PassWord);
	printf("请确认: ");
	ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}

分支和循环

scanf去调用输入缓冲区 在我们输入换行时,输入缓冲区里还有\n,getchar再调用输入缓冲区时,里面还有\n
我们想要代码正确可以清理 \n
scanf("%s", PassWord); //清理\n getchar();//拿走一个字符 printf("请确认: ");
但是输入空格的话还是会失败
因为scanf读到空格就不读了,输入缓冲区还有剩下的话getchar就会读到

分支和循环
最好的方法

    int ch = 0;
	char PassWord[20];
	printf("请输入密码:");
	scanf("%s", PassWord);
	while ((ch = getchar()) != '\n')//不等于\n就继续读取,
	{
		;
	}
	printf("请确认: ");
continue在for循环和while循环中的区别
for循环中的continue跳过continue后边的代码,去了调整部分, 调整循环变量,不容易造成死循环 while循环中,continue跳过continue后面的代码,直接去判断部分
	int i = 0;
	int j = 0;
	//初始化和调整部分可以省略
	//2.判断部分只要省略,就意味着判断恒为真
	//尽量不要省略
	for (; i < 10; i++)//省略的后果:只打印十个呵呵
	{
		for (; j < 10; j++)
		{
			printf("hehe\n");
		}
	}

do…while()循环

do
   循环语句
while();
int main()
{
	int i = 1;
	do//do - 执行{}里的语句
	{
		if (i == 5)
			continue;
		printf("%d ", i);//continue后面的语句不执行,但还得再判断
		i++;
	} while (i <= 10);//判断
}

练习

计算1-n的阶乘和:n!+(n-1)!+…+2!+1!
方法一:

int n;
	scanf("%d", &n);
	int count = 0;
	for (int i = 1; i <= n; i++)
	{
		int ret = 1;
		for (int j = 1; j <=i; j++)
		{
			ret = ret * j;
		}
		count += ret;
	}
	printf("%d",count);

方法二:

    int n;
	scanf("%d", &n);
	int i = 0, ret = 1, sum = 0;

	//4!=4*3!
	//3!=3*2!
	//2!=2*1!
	//1!=1
	for (i = 1; i <= n; i++)
	{
		ret = ret * i;
		sum = ret + sum;
	}
	printf("%d", sum);
二分查找
***给定一个数字,看这个数字是否在有序数组中***

简单的方法:遍历一边看数字是否在数组中

int arr[] = { 1,2,3,4,5,6,7 };
	int n = 0;
	int i = 0;
	scanf("%d", &n);
	int m = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < m; i++)
	{
		if (n == arr[i])
		{
			printf("找到了,下标为:%d\n", i);
			break;//找到就跳出循环
		}
	}
	//i<m:找到了的情况
	//i=m:找不到的情况
	//所以要判断,如果找到了就不打印找不到
	if (i == m)
	{
		printf("找不到");
	}

二分查找法:

	int arr[10] = {1,2,3,4,5,6,7,8,9,10 };
	int k =14;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0, right = sz-1;//下标
	
	while (left <= right)//left==right -- 指向同一个元素
	{
		int mid = (left + right) / 2;

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

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

int main()
{
	char arr1[] = "hello world!!!!";
	char arr2[] = "###############";
	int sz = strlen(arr1);
	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);
		left++;
		right--;
	}
	return 0;
}

比较两个字符串是否相等,不能用==

int main()
{
	int i = 0;
	char password[20] = { 0 };
	scanf("%s", password);
	//两个字符串比较不能用==
	if (strcmp(password,"abcdef")==0)//比较字符串是否相等用strcmp,返回值为0就说明两个字符串相等
	{
		printf("登录成功");
	}
	else
	{
		printf("登录失败");
	}
	return 0;
}

猜数字游戏

在简单的循环基础上,用到了时间戳和随机数函数rand

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


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

void game()
{
	int guess;
	int ret = rand()%100+1;//模100,范围0-99
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("猜对了\n");
			break;
		}
	}
}

int main()
{
	int input;
	//设置随机数的生成起点
	srand((unsigned int)time(NULL));//拿时间戳作参数(不需要多次调用)
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("输入错误,请重新输入");
			break;
		}
		
	} while (input);
	return 0;
}
上一篇:第四章 字符串和格式化输入/输出


下一篇:第一课 HTML的基本结构