初始C语言02-分支与循环(中)

举报
芒果_Mango 发表于 2022/01/29 21:46:13 2022/01/29
【摘要】 5.for循环for( 初始化;判断 ;调整 ){}初始化,判断,调整三个部分:1.可以省略2.判断部分只要省略了,就意味着判断恒为“真”3.尽量不要省略int i = 0;int j = 0;for(;i < 10; i++){ for(; j < 10; j++) { printf("hehe\n"); }}//只打印10个hehe //原因:第一次进...

5.for循环

for( 初始化;判断 ;调整 )
{}

初始化,判断,调整三个部分:

1.可以省略

2.判断部分只要省略了,就意味着判断恒为“真”

3.尽量不要省略


int i = 0;
int j = 0;
for(;i < 10; i++)
{
    for(; j < 10; j++)
    {
        printf("hehe\n");
    }
}
//只打印10个hehe  
//原因:第一次进入循环,j初始化为0   第二次进入循环之后,j没有重置,,j已经是10了,不满足J < 10了,不打印了。

练习题1:计算n的阶乘

//  n! = 1*2*3*...*n
//写法1
int main()
{
    int n = 0;
    scanf("%d",&n);
    int i = 0;
    int sum = 1;	//注意sum和i不能初始化为0,因为0乘任何数为0
    for(i = 1; i <= n; i++)
    {
        sum*=i;
    }
    printf("%d\n",sum);
    return 0;
}

//写法2--    n! = 1*2*3*...*n
int Fic(int n )
{
    return n <=1 ? 1 : Fic(n-1)*n;	
}
int main()
{
    int n = 0;
    scanf("%d",&n);
    int ret = Fic(n);
    printf("%d\n",ret);
    return 0;
}

练习题2:计算1!+2!+3!+…+10!

int main()
{
    int n = 0;
    scanf("%d",&n);
    int i = 0;
    int sum = 1;	//注意sum和i不能初始化为0,因为0乘任何数为0
    for(i = 1; i <= n; i++)
    {
        sum*=i;	//计算每一个阶乘
        ret += sum;	//阶乘相加
    }
    printf("%d\n",sum);
    return 0;
}

练习题3:在一个有序数组中查找具体的某个数字 - 二分查找

//二分法
int BinarySearch(int* arr, int sz,int k)
{
	int right = sz - 1;	//右下标
	int left = 0;	//左下标
	while (left <= right)
	{
		int mid = (right + left) >> 1;	//中间值 
		//mid = (right + left)/2
        //左移 == 除2 右移 == 乘2
		if (arr[mid] > k)
		{
			right = mid - 1;	//右下标 变成中间值-1位置
		}
		else if (arr[mid] < k)
		{
			left = mid + 1;		//左下标 变成中间值+1位置
		}
		else
			return mid;
	}
	return -1;	//找不到
}
int main()
{
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int k = 7;	//要找的数字
	int ret = BinarySearch(arr, sz,k);
	if (ret != -1)
	{
		printf("找到了,下标为:%d\n", ret);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}

练习题4:演示多个字符从两端移动,向中间汇聚

int main()
{
	char arr1[] = "hello world";
	char arr2[] = "***********";
	int len = strlen(arr1);
	int left = 0;
	int right = len - 1;
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf(arr2);
		printf("\n");
		right--;
		left++;
		Sleep(1000);//Sleep-休眠函数,C语言中,单位为毫秒 1000毫秒 = 1秒
		system("cls");	//清屏函数-用来执行系统命名 引用windows.h头文件
	}
	printf(arr2);
	return 0;
}

练习题5:模拟用户登陆场景,并且只能登陆三次(只允许输入三次密码。如果密码正确则提升登录成功,三次均输入错误,则退出程序)

//字符串比较使用strcmp 函数,若字符串相同,返回0
int main()
{
	int count = 0;//统计输入密码次数
	char arr[20] = { 0 };
	//输入密码
	printf("请输入密码:->\n");
	while (count < 3)
	{
		gets(arr);
		if (strcmp(arr, "Mango") == 0)
		{
			count++;
			printf("登陆成功,你共输入了%d次密码\n", count );	
			break;
		}
		else
		{
			count++;
			printf("密码错误,重新输入,剩余机会%d\n",3-count);
		}
	}	
	return 0;
}

6.goto语句

//情形1
int main()
{
again:
	printf("hehe\n");
	goto again;
	return 0;
}
//死循环打印hehe
//情形2		--err
//原因:goto不可以跨函数跳转
int test()
{
again:
	printf("hehe\n");
}
int main()
{
	printf("hehe\n");
	goto again;
	return 0;
}

关机程序

int main()
{
	int count = 0;	//次数确认
	char arr[20] = { 0 };
	printf("请输入:我是猪 否则将在1min内关机,你只有3次机会\n");
	system("shutdown -s -t 60");
again:
	gets(arr);
	if (strcmp(arr, "我是猪") == 0)
	{
		printf("取消关机\n");
		system("shutdown -a");
	}
	else
	{
		count++;
		if (count == 3)
		{
			printf("你没有机会啦,拜拜\n");
			return 0;
		}
		printf("仅剩机会%d次\n", 3 - count);
		goto again;
	}
	return 0;
}
//使用循环的写法
int main()
{
    int count = 0;	//次数确认
	char arr[20] = { 0 };
	printf("请输入:我是猪 否则将在1min内关机,你只有3次机会\n");
	system("shutdown -s -t 60");
	while (1)
	{
		gets(arr);
		if (strcmp(arr, "我是猪") == 0)
		{
			printf("取消关机\n");
			system("shutdown -a");
			break;
		}
		else
		{
			count++;
			if (count == 3)
			{
				printf("你没有机会啦,拜拜\n");
				break;
			}
			printf("仅剩机会%d次\n", 3 - count);
		}
	}
	return 0;
}
//简易写法
printf("1min内关机,输入我是猪取消关机\n");
system("shutdown -s -t 60");
while(1)
{
    gets(arr);
    if (strcmp(arr, "我是猪") == 0)
		{
			printf("取消关机\n");
			system("shutdown -a");
			break;
		}
}

7.猜数字游戏

规则:
    1.生成一个随机数
    2.猜数字(大,小,正确)
    3.可以反复玩

rand()函数:

如何产生随机数:

生成随机数-- 引用stdllib.h头文件

image.png
rand()生成的随机数:0-32767

想要产生范围为0-99的数字:rand() %100

想要产生范围为1-100的数字: rand()%100 +1

想要产生范围为0-3的数字: rand() % 3

//产生随机数,但这样的话产生的值是固定的
int main()
{
	printf("%d\n", rand());
	return 0;
}

srand()函数

为了防止每次产生的随机数都是一样的:

在使用rand()函数前,引用srand()函数初始化随机数生成器

srand(): --引用stdlib.h ,注意函数参数为size_t -unsigned int

image.png

当srand()函数的参数发生变化时,产生的随机数也发生变化,否则还是产生一样的数

int main()
{
	srand(0);
	printf("%d\n", rand());
    srand(1);
    printf("%d\n", rand());
	return 0;
}
//两次产生的随机值都不一样

时间戳

时间戳:当前时间与计算机起始时间(1970年1月1日0时0分0秒)的差值


C语言中如何使用时间戳:

time()函数

time()函数 -引用头文件 time.h

image.png

参数返回类型:time_t

返回类型为:time_t

本质上是长整形

函数参数类型为:长整形指针


设置随机数生成起点
srand(unsigned int)time(NULL)	//拿时间戳作为参数
 //只需设置一次即可

代码

注意:

1.生成的随机数要放在while外面 不然每次循环都又生成一个新的随机数 2.每次游戏都产生一个新的随机数

3.因为至少要进入循环一次进行选择->使用do-while循环

void menu()
{
	printf("***********************\n");
	printf("***** 1.猜数字游戏*****\n");
	printf("***** 0.退出游戏  *****\n");
	printf("***********************\n");
}
void game()
{
	//生成随机数范围:1-100
	// rand() % 100 -> 0 - 99
	int ret = rand() % 100 + 1;
	int  guess = 0;
	int count = 0;
	//猜数字
	while (1)
	{
		printf("请输入你猜的数字,范围为:1-100\n");
		scanf("%d", &guess);
		if (guess > ret)
		{
			count++;
			printf("猜大了\n");
		}
		else if (guess < ret)
		{
			count++;
			printf("猜小了\n");
		}
		else
		{
			count++;
			if (count < 5)
			{
				printf("你真牛,共猜了%d次,才猜对\n", count);
			}
			else
			{
				printf("你运气真差,猜了%d次才猜对\n", count);
			}
			break;
		}
	}

}
int main()
{
	srand((size_t)time(NULL));	//设置随机数生成起点,以时间戳为参数
	int input = 0;
	do
	{
	menu();
	printf("请选择->\n");
	scanf("%d", &input);
	switch(input)
	{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("请重新选择\n");
			break;
	}

	} while (input);
    //0表示假,非0表示真
	return 0;
}
今天就先到这吧~感谢你能看到这里!希望对你有所帮助!欢迎老铁们点个关注订阅这个专题! 同时欢迎大佬们批评指正!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。