Bootstrap

【C语言基础学习笔记】二、分支与循环语句(3)

个人介绍:初学C语言的小白,热爱编程的菜鸟。
人生,就要活得漂亮,走得铿锵。自己不奋斗,终归是摆设。无论你是谁,宁可做拼搏的失败者,也不要做安于现状的平凡人。造船的目的不是停在港湾,而是冲击风浪;做人的目的不是窝在家里,而是打造梦想。



编程实战练习

1.计算n的阶乘 (阶乘计算)

#include<stdio.h>
int main()
{
	int i = 0;
	int n = 0;
	int ret = 0;
	scanf("%d", &n);

	//i = 1;//方法一:while语句结构
	//ret = 1;
	//while (i <= n)
	//{
	//	ret *= i;
	//	i++;
	//}

	//方法二:for语句结构
	//for (i = 1, ret = 1; i <= n; i++)
	//{
	//	ret *= i;
	//}

	//方法三:do while语句结构
	i = 1;
	ret = 1;
	do
	{
		ret *= i;
		i++;
	} while (i <= n);

	printf("%d\n", ret);
	return 0;
}

在这里插入图片描述


2.计算1!+ 2!+ 3!+ …. + 10!(阶乘计算求和)

普通的方式:

int main()
{
	int i = 0;
	int n = 0;
	int sum = 0;
	//printf("请输入一个数来计算其阶乘:>>\n");
	//scanf("%d", &n);
	for (n = 1; n <= 3; n++)
	{
		int s = 1;
		for (i = 1; i <= n; i++)
		{
			s = s * i;
		}
		sum = sum + s;
	}
	printf("前n项阶乘之和为:%d\n", sum);
	return 0;
}

在这里插入图片描述

这种方式虽然实现了阶乘求和,但是效率并不高,每次求阶乘都需要从1开始乘。
实际上n! = (n - 1!) * n; 例如3! = 2! * 3,按照这种思想我们优化以下原来的代码,变成:

int main()
{
	int i = 0;
	int n = 0;
	int s = 1;
	int sum = 0;
	//printf("请输入一个数来计算其阶乘:>>\n");
	//scanf("%d", &n);
	for (i = 1; i <= 3; i++)
	{
		s = s * i;
		sum = sum + s;
	}
	printf("sum = %d\n", sum);
	return 0;
}

在这里插入图片描述


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 (arr[i] == k)
		{
			printf("找到了,下标为%d\n", i);
			break;
		}
	}
	if (i == sz)
		printf("找不到\n");
	return 0;
}

在这里插入图片描述

上面这种方式虽然可以查找某个数字,但是效率很低(效率为n)。
实际上我们已经知道这是一个有序的数组,那么我们就可以根据数组的排序关系去做查找。
下面是利用二分查找法\折半查找法来查找,效率为log2n

#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)//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)//需要进行判断,因为来到这一步的也有可能是通过break来的,不一定是执行完循环才到这里的
		printf("找不到了\n");
	return 0;
}

在这里插入图片描述


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

首先我们要明白题目的含义,知道是什么意思。
比如说:类似于这种效果
在这里插入图片描述

这里有两串字符,所以我们可以定义两个字符数组去存储他们
我们可以将 上方这个数组的元素移动到下面数组中,然后打印下方数组
在这里插入图片描述
在这里插入图片描述
代码展示:

#include<stdio.h>
#include<string.h>
//welcome to c_code!!!!!!
//#######################
//w#####################!
//we###################!!
//wel#################!!!
//.......
//welcome to c_code!!!!!!
int main()
{
	char arr1[] = "welcome to c_code!!!!!!";
	char arr2[] = "#######################";
	int left = 0;
	/*int right = sizeof(arr1) / sizeof(arr1[0]) - 1;*///这种是错误的,arr1最后一个字符是字符串结束标志\0
	/*int right = sizeof(arr1) / sizeof(arr1[0]) - 2;*///-2是正确的,但是我们不推荐这种方式,容易出错
	int right = strlen(arr1) - 1;//strlen计算字符串长度是不会将\0计算进去
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		left++;
		right--;
	}
	return 0;
}

结果展示:
在这里插入图片描述


我们发现这个结果以下就打印出来了,感受不到其中的变化,所以希望每打印一次,就能停顿一小段时间
利用Sleep()函数 头文件Windows.h
Sleep(1000) 休息 1000ms = 1s
在这里插入图片描述
在这里插入图片描述
运行程序,就能查看其中的变化
除了让程序每次打印停顿一定的时间外,我们还能对齐进行另一步改造,比如清空屏幕
system()函数 头文件为 stdlib.h
system(“cls”) 执行系统命令的一个函数 cls-- - 清空屏幕


5.编写代码实现,模拟用户登录情景,并且只能登陆三次。

(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序)

易错点:使用 == 直接比较字符串是否相等
解决方式 :利用库函数strcmp比较字符串是否相等 如果两个字符串相等
strcmp(arr1,arr2) 返回值为0,只需要判断strcmp返回值是否为0就可以判断字符串是否相等

#include<stdio.h>
#include<string.h>
int main()
{
	char password[20];
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("Please input your password:>>\n");
		scanf("%s", password);
		/*if (password == "123456")*///不能直接用==来比较两个字符串是否相等
		if (strcmp(password, "123456") == 0)
		{
			printf("password is right,good luck to you!");
			break;
		}
	}
	if (i == 3)
		printf("you idiot,put the wrong password three times,don't have another chance!");
	return 0;
}

结果展示:
在这里插入图片描述
在这里插入图片描述


为了提升用户交互体验,我们可以在密码输入错误的时候给个提示:
在这里插入图片描述
在这里插入图片描述
strcmp字符串比较解析
char string1[] = “abcdef”;
char string2[] = “abccqqqqqq”
strcmp(string1, string2)
使用strcmp在比较string1和string2的时候,从左到右依次比较每个字符,string1与string2前三个字符"abc"相同,string1的第四个字符为d string2第四个字符为c,d的ASCII码大于c的ASCII码,所以strcmp会判断string1 > string2 返回一个大于0的值。


猜数字游戏

要求:
1)电脑会生成一个随机数
2)猜数字

猜数字游戏思路:
1、进入游戏后先打印菜单栏
提示是否进行猜数字游戏 (1为是,0为否)
2、首先要至少玩一次游戏,使用do while语句   只要不退出游戏就一直进行
3、使用switch语句对输入内容进行判断
1 玩游戏 调用game函数进行猜数字游戏
0 打印  退出游戏
其它  打印  选择错误

菜单栏实现 menu函数
猜数字实现  先要生成一个随机数 比如1 - 200
1.先生成一个随机数 rand()
2.rand()是伪随机,在使用之前要调用srand
3.为了让srand生成一个随机值,使用电脑时时刻刻都在变动的时间-- - 时间戳
srand((unsigned int)time(NULL))  //强制类型转换
4.为了产生1 - 200之间的随机数 我们让rand去模上200 + 1
5.猜数字具体操作
(1)先提示输入数字
(2)判断输入数字和随机数之间的大小关系并给予提示
(3)猜对了之后退出本回合猜数字游戏
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("***************************\n");
	printf("****  1.play   0.exit  ****\n");
	printf("***************************\n");
}
//RAND_MAX
void game()//猜数字函数
{
	int guess = 0;
	int ret = 0;
	//拿时间戳来设置随机数的起点   time_t time( time_t *timer ); time_t long类型
	//需要一个变化的数字,电脑上的时间是变化的
	//1.生成随机数
	ret = rand() % 100 + 1;//设置生成1-100之间的随机数
	//printf("%d\n",ret);
	//2.猜数字
	//printf("猜数字\n");
	while (1)
	{
		printf("请猜数字:>>\n");
		scanf("%d", &guess);
		if (guess > ret)
			printf("猜大了\n");
		else if (guess < ret)
			printf("猜小了\n");
		else
		{
			printf("你真棒!猜对了!\n");
			break;
		}
	}
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do//游戏至少进行一次,可以进行多次,选择do...while语句
	{
		menu();
		printf("请选择:>>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}

	} while (input);
	return 0;
}

结果展示:
在这里插入图片描述


goto语句

goto语句作用:跳转到特点语句位置

goto语句应用

自动关机小游戏

提示:
系统设置:shutdown - s - t 60 设置电脑在60s后自动关机
system(“shutdown -s -t 60”) //system( )函数头文件为 stdlib.h

#include<stdio.h>
//设置电脑2分钟后自动关机,如果输入“我是猪”就取消关机
int main()
{
	char input[20];
	//shutdown -s -t 120  设置在120s后关机
	system("shutdown -s -t 120");
again:
	printf("电脑将在两分钟后自动关机,如果输入“我是猪”将取消关机\n请输入:>>\n");
	scanf("%s", input);
	if (strcmp(input, "我是猪") == 0)
	{
		printf("成功取消关机\n");
		system("shutdown -a");
	}
	else
	{
		printf("输入错误,请重新输入\n");
		goto again;
	}
	return 0;
}


在这里插入图片描述

;