分支语句和循环语句

分支语句和循环语句

  • C语言是一门结构化程序设计语言,C语言中有三种结构,分别为顺序结构,选择结构,循环结构
分支语句
  • if
  • switch
循环语句
  • while
  • for
  • do…while
语句
  • C语言中用一个分号隔开的,就是语句

  • 分支语句是一种选择结构

#include<stdio.h>
int main()
{
	int age = 0;
	(void)scanf("%d", &age);
	if (age < 18)
		printf("未成年\n");
	return 0;
}
#include<stdio.h>
int main()
{
	int age = 0;
	(void)scanf("%d", &age);
	if (age < 18)
		printf("未成年\n");
	else
		printf("成年\n");
	return 0;
}
  • C语言中规定0为假,非0为真
  • 悬挂else,指的是else总是和离其最近的未配对的if来进行一个配对的操作
#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靠近
//所以代码什么都不会打印,没有符合的条件。
//赋值&判断是否相等的运算符
#include<stdio.h>
int main()
{
	int age = 10;
	if (age == 5)
		printf("age==5\n");
	return 0;
}
//屏幕上什么都不会打印,因为age!=5;
#include<stdio.h>
int main()
{
	int age = 10;
	if (age = 5)
		printf("age==5\n");
	return 0;
}
//频幕上会打印age==5,因为把5赋值给了age,所以if后面的括号里面的值是真的,所以会打印相应的内容
  • 为了避免上面第一个代码中的错误情况,写代码的时候可以把常量放在左边,这样就比较容易看的出来错误,也是一种比较好的代码风格,常量放在左边的时候,如果代码里面有错误,就会比较明显的显示出来
判断一个数是奇数还是偶数
#include<stdio.h>
int main()
{
	int i = 0;
	(void)scanf("%d", &i);
	if (i % 2 == 0)
		printf("i为偶数\n");
	if (i % 2 == 1)
		printf("i为奇数\n");
	return 0;
}
输出1-100之间的奇数
#include<stdio.h>
int main()
{
	int i = 0;
	int count = 0;
	for (i = 1; i <= 100; i++)
	{
		if (i % 2 == 1)
		{
			printf("%d ", i);
			count++;
		}
	}
	printf("\n");
	printf("%d", count);
	return 0;
}
switch语句
  • switch适用于多分支语句
#include<stdio.h>
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("weekend\n");
		break;
	default:
		printf("选择错误\n");
		break;
	}
}
  • 需要强调的是,switch后面的必须是整形表达式,浮点型就会出错;case后面只能放常量表达式,必须是整形,也必须是常量。
#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);
	system("pause");
	return 0;
}
//结果是m=5,n=3;
循环语句
break和continue
#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d ",i);
		i++;
	}
	return 0;
}
#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i++;
	}
	return 0;
}
//打印结果为1,2,3,4
//break永久的跳出循环,停止后期的所有循环
#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i++;
	}
	return 0;
}
//打印结果是1,2,3,4,4,4,4,4...死循环,continue只是跳过当前这层循环,后续
//会继续判断循环条件是否满足,如果满足的话,就会继续进行循环
#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		i++;
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	return 0;
}
//打印结果为2 3 4 6 7 8 9 10 11;
//continue作用:continue用来终止本次的循环,当次continue之后的语句不再执行
getchar()
  • getchar(),这里注意这个函数的返回值是int类型
  • getchar输入字符,在输入缓冲区检查有无字符,没有字符,在键盘上输入字符,getchar从缓冲区中取一个字符A,while循环判断,不等于EOF输出;此时缓冲区中还有 \n ,getchar取出,判断,换行,等待输入
  • putchar输出字符,读取成功返回字符的ASCII码值;读取失败返回EOF
#include<stdio.h>
int main()
{
	int ch = getchar();
	putchar(ch);
	return 0;
}
//输入什么字符就会输出相应的字符
int main()
{
	char ch = 0;
	/*scanf("%c", &ch);
	printf("%c", ch);*/
	//scanf和printf用于各种类型,如:整型、字符、浮点型……
	//getchar putchar只用于字符
 
	ch = getchar();
	putchar(ch);
 
	return 0;
}
//EOF为end of file
#include<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
		putchar(ch);
	return 0;
}
//用ctrl+z来停下来。
  • 这里为什么错误呢?scanf遇到 \n 甚至是空格 就不拿走了,剩下的\n只能到下面的getchar中,而\ n 不是 Y 就进入else,确认失败。既然这样的话,我加入一个 getchar 拿走 \n 是不是就可以了?但是只输入一个\n也有弊端,所以最好的修改方法就是直接变成循环的方式会更好一些
    在这里插入图片描述
int main()
{
	char password[20] = { 0 };
	int ch = 0;
 
	printf("请输入密码:_");
	scanf("%s", password);
	//这里的password是数组,数组名本来就是地址,因此不需要使用取地址符
 
	while(getchar()!='\n')
	{
		;
	}
	//清除缓冲区
 
	printf("请确认密码(Y/N)");
	ch = getchar();
	if (ch == 'Y')
		printf("确认成功\n");
	else
		printf("确认失败\n");
		
	return 0;
}
输出100-200之间的素数
#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		for (j = 2; j <= i - 1; j++)
		{
			if (i % j == 0)
				break;
		}
		if (j == i)
		{
			printf("%d ", i);
			count++;
		}
	}
	printf("\n");
	printf("%d", count);
	return 0;
}
#include<stdio.h>
#include<math.h>
int main()
{
	int i = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		int j = 2;
		while(j<=sqrt(i))
		{
			if (i % j == 0)
				break;
			j++;
		}
		if (j >sqrt(i))
		{
			printf("%d ", i);
			count++;
		}
	}
	printf("\n");
	printf("%d", count);
	return 0;
}
输出乘法口诀表
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	for (a = 1; a <= 9; a++)
	{
		for (b = 1; b <= a; b++)
		{
			printf("%d*%d=%2d ", a, b, a * b);
		}
		printf("\n");
	}
	return 0;
}
计算闰年
#include<stdio.h>
int main()
{
	int i = 0;
	int count = 0;
	for (i = 1000; i <= 2000; i++)
	{
		if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
		{
			printf("%d ", i);
			count++;
		}
	}
	printf("\n");
	printf("%d", count);
	return 0;
}
交换两个变量的值
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int temp = 0;
	(void)scanf("%d %d", &a, &b);
	temp = a;
	a = b;
	b = temp;
	printf("%d %d", a, b);
	return 0;
}
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	(void)scanf("%d %d", &a, &b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("%d %d", a, b);
	return 0;
}
//按二进制位,异或:相同为0,相异为1;
//异或不能解决除了整形以外类型的运算
//但是这种算法不存在有溢出的问题
//这段代码的可读性也比较差,一开始是看不懂的
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	(void)scanf("%d %d", &a, &b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("%d %d", a, b);
	return 0;
}
//但是这种方法存在有溢出的问题,如果a和b特别大的话,把a+b的值放在a里面就会溢出了
//这样就得不到想要的结果了
求10个数中的最大值
//求十个整数中的最大值
#include<stdio.h>
int main()
{
	int arr[10] = { 12,34,675,32,75,24,86,23,88,16 };
	int max = arr[0];
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 1; i < sz; i++)
	{
		if (arr[i] >max)
		{
			max = arr[i];
		}
	}
	printf("%d", max);
	return 0;
}
将三个数从大到小输出
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	(void)scanf("%d %d %d", &a, &b, &c);
	if (a > b && b > c)
		printf("%d %d %d", a, b, c);
	if (a > c && c > b)
		printf("%d %d %d", a, c, b);
	if (b > a && a > c)
		printf("%d %d %d", b, a, c);
	if (b > c && c > a)
		printf("%d %d %d", b, c, a);
	if (c > b && b > a)
		printf("%d %d %d", c, b, a);
	if (c > a && a > b)
		printf("%d %d %d", c, a, b);
	return 0;
}
求两个数的最大公约数
  • 辗转相除法
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	(void)scanf("%d %d", &a, &b);
	while (c = a % b)
	{
		a = b;
		b = c;
	}
	printf("%d", b);
	return 0;
}
//两个数的乘积除以最大公约数的值就是最小公倍数
最小公倍数
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int m = 0;
	int n = 0;
	int c = 0;
	int z ;
	(void)scanf("%d %d", &a, &b);
	m = a;
	n = b;
	while (c = a % b)
	{
		a = b;
		b = c;
	}
	z = (m * n) / b;
	printf("%d\n", b);
	printf("%d\n", z);
	return 0;
}
while循环语句
#include<stdio.h>
int main()
{
	int i = 1;         //初始化
	while (i <= 10)    //判断
	{
		printf("%d ", i);
		i++;           //调整
	}
	return 0;
}
//while循环从形式上说是不够好的,因为3个部分是分开的,就可能会导致死循环
//如果希望三个部分在一起的话,可以考虑使用for循环
for循环
  • 初始化,条件判断,调整
#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}
#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
#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,6,7,8,9,10
for语句的循环控制变量
  • 一些建议:

1.不可在for循环内修改循环变量,防止for循环失去控制

2.建议for语句的控制变量的值采用前闭后开区间的写法(也只是建议)

#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", i);
		i = 5;
	}
	return 0;
}
//第一个打印的数字为0,之后为6的死循环
#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", i);
		i += 5;
	}
	return 0;
}
//循环两次就结束了,打印的结果为0,6
循环体内部改变循环变量

#include<stdio.h>
int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++)
	{
		printf("hehe\n");
		arr[i] = 0;
	}
	return 0;
}
//代码的打印结果是hehe的死循环
区间的问题
#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int i = 0;
	for (i = 0; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}
//这个代码没有达到实际的预期,这个代码循环了11次
//本身希望代码只循环10次。
//但是有些时候也可可以写成前闭后闭得形式,控制好条件就可以了
#include<stdio.h>
int main()
{
	int i = 0;
	for (; i < 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}
//打印结果为0-9
#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (; i < 10; i++)
	{
		for (; j < 10; j++)
		{
			printf("hehe\n");
		}
	}
	return 0;
}
//这段代码得打印结果只有10个hehe
//并且10个hehe是从i=0-- i=9一口气打印出来的
//当i=0时,j从一直到9,打印了10个hehe之后,j的条件就不再满足了
//所以一共只会打印10个hehe
#include<stdio.h>
int main()
{
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, ++y)
	{
		printf("hehe\n");
	}
	return 0;
}
//打印结果为2个hehe
//&&操作符只要一边为假,另一边就不用看了。
  • 逗号表达式
#include<stdio.h>
int main()
{
	int x = 0 ;
	int y = 0 ;
	for (x = 0, y = 0; x < 2 , y < 5; ++x, ++y)
	{
		printf("hehe\n");
	}
	return 0;
}
//打印结果为5个hehe,利用了逗号表达式,x=2的情况被忽略了,只看y<5,所以打印5个hehe
  • 一道笔试题,问这个代码循环了几次?
#include<stdio.h>
int main()
{
	int i = 0;
	int k = 0;
	for (i = 0, k = 0; k = 0; i++, k++)
		k++;
	return 0;
}
  • 这个循环一次都没有进行,条件判断为把0赋值给k,表达式恒为假,所以一次循环也不会进行,主要是要看清楚是循环还是赋值。
do…while循环
  • do…while循环体至少会执行一次
#include<stdio.h>
int main()
{
	int i = 1;
	do
	{
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
}
//打印结果为1-10
#include<stdio.h>
int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
}
//打印的结果只有1,2,3,4
#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 d的死循环

计算n的阶乘

#include<stdio.h>
int main()
{
	int n = 0;
	int i = 1;
	int sum = 1;
	(void)scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		sum = sum * i;
	}
	printf("%d", sum);
	return 0;
}

求1!+…+10!

#include<stdio.h>
int main()
{
	int n = 0;
	int i = 1;
	int ret = 1;
	int sum = 0;
	(void)scanf("%d", &n);
	for (n = 1; n <= 10; n++)
	{
		//ret = 1;
		//i = 1;
		while (i <= n)
		{
			ret = ret * i;
			i++;
		}
		sum = sum + ret;
	}
	printf("%d", sum);
	return 0;
}

二分查找

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int key = 7;
	int right = sz - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下标为:%d", mid);
			break;
		}
	}
	if (left > right)
		printf("找不到\n");
	return 0;
}
#include<stdio.h>
int BinarySearch(int arr[], int sz)
{
	int key = 7;
	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else
			return mid;
	}
	return -1;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = BinarySearch(arr, sz);
	if (ret == -1)
	{
		printf("找不到\n");
	}
	else
		printf("找到了,下标为:%d", ret);
	return 0;
}
#include<stdio.h>
#include<windows.h>
int main()
{
	char arr1[] = "###########";
	char arr2[] = "Hello World";
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	int left = 0;
	int right = sz - 2;
	while (left <= right)
	{
		arr1[left] = arr2[left];
		arr1[right] = arr2[right];
		printf("%s\n", arr1);
		Sleep(1000);
		left++;
		right--;
	}
	printf("%s", arr1);
	return 0;
}

模拟登录程序

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

猜数字游戏的实现

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("***** 欢迎来到猜数字游戏!*****\n");
	printf("*****        1. play      *****\n");
	printf("*****        0. exit      *****\n");
	printf("***** 欢迎来到猜数字游戏!*****\n");
}
void game()
{
	int ret = 0;
	int guess = 0;
	ret = rand() % 100 + 1;
	while (1)
	{
		printf("请输入数字:>");
		(void)scanf("%d", &guess);
		if (guess > ret)
			printf("猜大了\n");
		else if (guess < ret)
			printf("猜小了\n");
		else
		{
			printf("猜对了\n");
			break;
		}
	}
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>\n");
		(void)scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}
//时间戳是自1970年1月1日(08:00:00GMT)至
//当前时间的总秒数。
//它也被称为Unix时间戳(UnixTimestamp)。

//Unix时间戳(Unixtimestamp),或称Unix时间(Unixtime)、POSIX时间(POSIXtime),
//是一种时间表示方式,
//定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数。
//Unix时间戳不仅被使用在Unix系统、类Unix系统中(比如Linux系统),
//也在许多其他操作系统中被广泛采用。

goto语句

关机程序

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
 char input[] = { 0 };
 system("shutdown -s -t 60");
again:
 printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
 scanf("%s", input);
 if (0 == strcmp(input, "我是猪"))
 {
  system("shutdown -a");
 }
 else
 {
  printf("输入错误,请重新输入!\n");
  goto again;
 }
 return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	char input[] = { 0 };
	system("shutdown -s -t 60");
	//这是Windows系统下的一个关机命令
	while (1)
	{
		printf("你的电脑将在一分钟后关机,如果输入我是猪,就会取消关机!\n请输入:");
		scanf("%s", input);
		if (0 == strcmp(input, "我是猪"))
		{
			system("shutdown -a");//取消关机命令
			break;
		}
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值