c语言经典测试题4

1.题1

cpp 复制代码
#include <stdio.h>//没有break的话,输入什么都会往下一直执行下去,而且default在最后就会全都执行
int main()
{
	char c;
	int v0 = 0, v1 = 0, v2 = 0;
		do
		{
			switch (c = getchar())// 输入ADescriptor
			{
			case'a':case'A':
			case'e':case'E':
			case'i':case'I':
			case'o':case'O':
			case'u':case'U':v1 += 1;
			default:v0 += 1; v2 += 1;
			}
		} while (c != '\n');
		printf("v0=%d,v1=%d,v2=%d\n", v0, v1, v2);
		return 0;
}

我们从键盘输入 ADescriptor <回车>,则下面程序的运行结果是啥呢?

我们来分析一下:switch语句不会判断真假都会进入,我们在之前写switch语句时,每个case后面都会加上break,这是为了完成这个选择的代码之后就直接跳出switch语句。但是当我们不写break的时候,就会出现完成该选择的代码后,继续一直往下执行,我们一般将default写到最后这样的话,没有break的限制,我们输入什么都会执行一遍default的。大家可能会疑惑为啥这里的回车会强调一下,难道有啥特殊意义,而且回车不是每次输入都要按地吗?其实我们每次按回车就是输入了一个'\n',所以此处的whlie循环才不会陷入死循环。这样推理的话,我们就会有4个字符是case选择的,所以我们的v1会变为4,而default会执行12次,所以v0,v2变为12.

我们来运行看看:

有人就会疑惑了,我们不是输入的字符串吗?应该有\0吧,所以应该为13,不是12,其实getchar是输入单个字符,我们输入的一串字符其实时输入的一排单字符放在缓存区,一个一个的被getchar使用。所以没有\0.

2.题2

cpp 复制代码
int gcd(char x,char y)
{
int min = x < y ? x : y;
for (min = 0; min > 0; min--)
if (x % min = 0 && y % min = 0)
return min;
}

如果用上述代码去计算两个整数的最大公约数的话,这个代码有什么错误呢?

A: 参数类型不对 B: 循环变量min初值不对 C: 判断等于的符号不对 D: 返回类型不对

我们来分析一下:1.函数实参是int,形参用char不对,会发生截断丢失数据;2.min在for循环开始时更新为0,不再是两个形参中的较小值;3.判断是否整除的时候误将==写成=赋值运算符;4.函数最终要返回一个int值,返回值类型没问题,但是这里要强调一个选项中没写出的问题,如果是牛客网上的题,会报编译错误,说该函数不是在所有情况下都有返回值,只有在if条件成立的情况下有返回值,一般在vs上这种情况能通过,编译器会给一个默认的返回值。

3.题3

cpp 复制代码
for(i = 0; i <= n-1; i++) // (1)
for(j = n; j > i; j--) // (2)
state; // (3)

如果执行上述语句,那么(3)会被执行多少次呢?

我们来分析一下:第一个for循环会执行nci,但是我们会发现,第二个for循环的循环次数会随着第一个for循环的变化而变化,那么我们只能试着找其中的规律,当我们的i=0;第二个for循环就会执行n次,当我们的i=1,第二个for循环就会执行n-1次,以此类推i=3;循环n-2次,i=n-1;循环1次,所以这个执行次数为n+(n-1)+(n-2)+.....+2+1是一个等差数列,所以总执行次数为n(n+1)/2

4.题4

cpp 复制代码
#include <stdio.h>
int main()
{
char ch[80] = "123abcdEFG*&";
int j;
puts(ch);
for(j = 0; ch[j] != '\0'; j++)
if(ch[j] >= 'A' && ch[j] <= 'Z')
ch[j] = ch[j] + 'e' - 'E';
puts(ch);
return 0;
}

上述代码可以完成那些任务?

A: 测字符数组ch的长度 B: 将数字字符串ch转换成十进制数

C: 将字符数组ch中的小写字母转换成大写D: 将字符数组ch中的大写字母转换成小写

我们来分析一下:这串代码创建了两个变量,又将字符数组传给puts,for循环的条件为字符数组中字符为\0,那这样的话是否可以计算字符串的长度呢?其实是可以的,但是上述代码没有去具体完成这一功能,我们foe循环结束后,j其实就是字符串的长度,但是代码没有将其打印出来。if中我们发现只要是大写就会进入if语句,ASCLL码值中小写字母比其对应的大写字母大32,所以我们这个if语句可以将其对应的大写字母,改写为小写字母。所以选D.

5.题5

有一个长度为 n 的非降序数组,比如 [1,2,3,4,5] ,将它进行旋转,即把一个数组最开始的若干个元素搬到数组 的末尾,变成一个旋转数组,比如变成了 [3,4,5,1,2] ,或者 [4,5,1,2,3] 这样的。请问,给定这样一个旋转数组,求数 组中的最小值。 数据范围: 1≤n≤10000 ,数组中任意元素的值: 0≤val≤10000

这个方法是暴力求解,直接遍历数组找到最小的,我们也可以采用二分查找,提高寻找效率。这里的数组较小所以遍历数组计算量较小。和二分查找的效率没有多大区别。大家也可以尝试一下。
谢谢

相关推荐
繁依Fanyi18 分钟前
使用 Spring Boot + Redis + Vue 实现动态路由加载页面
开发语言·vue.js·pytorch·spring boot·redis·python·算法
星尘安全25 分钟前
一种新的电子邮件攻击方式:AiTM
开发语言·网络安全·php·网络钓鱼·aitm
尘浮生33 分钟前
Java项目实战II基于Java+Spring Boot+MySQL的洗衣店订单管理系统(开发文档+源码+数据库)
java·开发语言·数据库·spring boot·mysql·maven·intellij-idea
鸽芷咕34 分钟前
【Python报错已解决】xlrd.biffh.XLRDError: Excel xlsx file; not supported
开发语言·python·机器学习·bug·excel
铁匠匠匠1 小时前
【C总集篇】第八章 数组和指针
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
编程小白煎堆1 小时前
C语言:枚举类型
java·开发语言
秋邱1 小时前
C++: 类和对象(上)
开发语言·c++
王哈哈嘻嘻噜噜1 小时前
c语言中“函数指针”
java·c语言·数据结构
好多吃的啊1 小时前
背景图鼠标放上去切换图片过渡效果
开发语言·javascript·ecmascript
神奇夜光杯1 小时前
Python酷库之旅-第三方库Pandas(123)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长