栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

种一棵树最好的时间是十年前,其次便是现在(C语言选择和循环训练题目)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

种一棵树最好的时间是十年前,其次便是现在(C语言选择和循环训练题目)

目录

1.关于while(条件表达式) 循环体,以下叙述正确的是( )? (假设循环体里面没有break,continue,return,goto等等语句)  

2.下面这段程序的输出结果是什么?

3.......做一个简单的猜数字游戏

4.写一个二分查找,并分析其时间复杂度


今天是恢复更新的第一天,话不多说,接下来直接上题目:

1.关于while(条件表达式) 循环体,以下叙述正确的是( )? (假设循环体里面没有break,continue,return,goto等等语句)  

A.循环体的执行次数总是比条件表达式的执行次数多一次

B.条件表达式的执行次数总是比循环体的执行次数多一次

C.条件表达式的执行次数与循环体的执行次数一样

D.条件表达式的执行次数与循环体的执行次数无关

这道题是非常经典的一道题目, 主要考察的是对while循环的理解。

举个栗子:

int main()
{
	int num = 1;
	while (num <= 100)
	{
		printf("%d ", num);
		num++;
	}
	return 0;
}

在这个while循环中先进行判断条件num <= 100之后,执行while循环的循环体,也就是说先执行条件表达式,再执行循环体;

执行条件表达式的次数比执行循环体的次数多一次,答案选择B项。

2.下面这段程序的输出结果是什么?
int main()
{
	int a = 0, b = 0;
	for (a = 1, b = 1; a <= 100; a++)
	{
		if (b >= 20) break;
		if (b % 3 == 1)
		{
			b = b + 3;
			continue;
		}
		b = b-5;
	}
	printf("%dn", a);
	return 0;
}

我对这道题的评价是:一道简单的程序分析题目,只要认真分析就能够得到正确答案。

 看到这道题的猿友们可以试着自己分析一下,实在分析不出来也没有关系,我会放一张图解来帮助你们的(图解就在下面,你们收到了吗?哈哈)

 最后结束时a的值为8,所以答案选择C项,实在不相信的话可以放在编译器上运行一下,编译器可是不会骗人的。

3.......做一个简单的猜数字游戏

 首先我们先分析一下游戏的逻辑,这个游戏的逻辑简单的让人怀疑自己是不是想错了;

生成一个随机数,然后进行猜数字环节,如果猜对了——提示回答正确,如果猜的数字比生成的随机数大——提示猜大了,最后一种情况就是——猜小了(猜的数字比生成的数字小)。

怎么生成一个随机数?

提到随机数,就不得不说一个概念——时间戳(相比于现在的时间和电脑产生时间的差值,单位是妙),为什么提到时间戳的概念,因为时间戳无时无刻不在变化着,可以保证生成的数字就是随机的。

接下来怎么利用时间戳?

使用time函数,time函数的在这个程序里是不需要传参数的,直接传NULL(因为不需要保存,只是调用)。

所以可以这么使用srand函数和time函数;

srand((unsigned int)time(NULL));

time函数是有参数和返回值的,这里给大家推荐一个查阅文档的网站:C library - C++ Reference

time函数的返回值是如何描述的: 

 大概解释一下:如果传递的参数不为NULL,time函数的返回值就是对应的内存空间的值。

这里就有很多人会说了,为什么是英文网站啊,有没有中文的网站——英文网站的解释还是比较官方的,有很多中文文档都是在英文文档中翻译过来的,翻译的过程中多多少少会有一些错误,所以英文文档还是比较好一点的;还有就是看不懂英文文档没有关系,可以试着查翻译,借助工具来看文档。

完整源码:

#include 
#include 
#include 
int main()
{
	srand((unsigned int)time(NULL));
	int num = rand() % 100 + 1;
	while (1)
	{
		int guess = 0;
		printf("请输入数字:");
		scanf("%d", &guess);
		if (guess == num)
		{
			printf("恭喜你,答对了n");
			break;
		}
		else if (guess > num)
			printf("猜大了,请再试一次n");
		else
			printf("猜小了,请再试一次n");
	}
	return 0;
}

4.写一个二分查找,并分析其时间复杂度

查找在我们日常生活中是非常常见的,像我们在图书馆的书架中查找一本书要查找层数、书架。二分查找则主要是查找数字的,而且有一个要求是非常苛刻的——这组数字必须是有序的 ,满足这个条件才能使用二分查找,否则都是不能使用的。

二分查找的思想(以升序为例):

找中间值,如果中间值大于要查找的数字,从中间值的左边去找;如果中间值小于要查找的数字,去中间值的右边去找;

重复上面的操作,结束的标志是找到要查找的数字或者是要查找的区间为1(最坏情况)。

int BinarySearch(int arr[], int size, int key)
{
	int left = 0, right = size - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] == key)
			return mid;
		else if (arr[mid] > key)
			right = mid - 1;
		else
			left = mid + 1;
	}
	return -1;//没找到
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int key = 5;//要查找的值
	int size = sizeof(arr) / sizeof(arr[0]);
	int ret = BinarySearch(arr, size, key);
	if (ret != -1)
		printf("找到了,下标是%dn", ret);
	else
		printf("没找到n");
	return 0;
}

时间复杂度:O(log(N))

把我们查找的数组想象成一张纸,一次找中间值就是把纸对折一次,直到还有一个数字;

N个数,对折了x次(最坏情况)。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/953907.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号