文章目录
3、以下程序运行时,若输入 1abcedf2df<回车> 输出结果是( )
5、我们知道C语言的 break 语句只能跳出离它最近的一层循环,可是有时候我们需要跳出多层循环,下列跳出多层循环的做法正确的是【多选】( )
大家好,我是纪宁。
今天是C语言笔试训练的第五天,加油!
1、如下程序的功能是( )
#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中的大写字母转换成小写
在C语言中,字符可以直接使用 ASCII 码值来与数字进行运算,if 里面的条件是判断字符是否在A~E之间,如果符合的话,就让这个字符加'e'-'E'的差值,而这个差值就是小写字母与大写字母的差值,因此这段代码的功能是将大写字母转化为小写字母。所以这道题选 D
2、对于代码段,下面描述正确的是( )
t=0;
while(printf("*"))
{
t++;
if (t<3)
break;
}
A: 其中循环控制表达式与0等价 B: 其中循环控制表达式与'0'等价
C: 其中循环控制表达式是不合法的 D: 以上说法都不对
这道题看似考察的是 while 的判断条件,实际上也考察了printf 函数的返回值(printf返回打印在屏幕上的字符的个数),因此这个printf函数返回1,1为真,进入循环。所以A B C说法都是不对的。这道题选 D
3、以下程序运行时,若输入 1abcedf2df<回车> 输出结果是( )
#include <stdio.h>
int main()
{
char ch;
while ((ch = getchar()) != '\n')
{
if (ch % 2 != 0 && (ch >= 'a' && ch <= 'z'))
ch = ch - 'a' + 'A';
putchar(ch);
}
printf("\n");
return 0;
}
A: 1abcedf2df B: 1ABCEDF2DF C: 1AbCEdf2df D: 1aBceDF2DF
这道题依然考察的是关于ASCII 码的知识,a的ASCII码是97,为奇数,不符合(-'a'+'A'变大写)的条件,一次类推,B符合,C不符合......所以这道题选 D
4、下列条件语句中,功能与其他语句不同的是( )
A: if(a) printf("%d\n",x); else printf("%d\n",y);
B: if(a==0) printf("%d\n",y); else printf("%d\n",x);
C: if (a!=0) printf("%d\n",x); else printf("%d\n",y);
D: if(a==0) printf("%d\n",x); else printf("%d\n",y);
在条件判断的时候A和C一样,B和D一样,其中A和C都是在a!=0的条件下输出 x ,B则是在a==0的条件下输出 y,在a!=0的时候输出x,与A、C相同,而D确是在a==0的条件下输出x,显然与A B C不同,所以这道题选 D
5、我们知道C语言的 break 语句只能跳出离它最近的一层循环,可是有时候我们需要跳出多层循环,下列跳出多层循环的做法正确的是【多选】( )
A: 将程序写成函数用return结束函数,便可跳出循环
B: 修改外层循环条件例如
for (int i = 0; i < MAX1; i++)
{
for (int j = 0; j < MAX2; j++)
{
if (condition)
{
i = MAX1;
break;
}
}
}
C: 在外层循环设置判断条件例如
for (; symbol != 1 && condition2; )
{
for (; symbol != 1 && condition3; )
{
if (condition1)
symbol = 1;
}
}
D: 在外层循环后面加入break例如
for (; condition2; )
{
for (; condition3; )
{
if (condition1)
symbol = 1;
}
if (symbol == 1)
break;
}
此题旨在整理跳出多层循环的方法,每个选项都是正确的,代码为伪代码,condition代表逻辑表达式,所以这道题选 A B C D
6、数字在升序数组中出现的次数
给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数。
要求:空间复杂度:O(1),时间复杂度:O(logn)
题目来自 牛客网
int Find_Edges(int*nums,int len,double k)
{
int left=0,right=len-1;
while(left<=right)
{
int mid=(left+right)/2;
if(nums[mid]<k)
left=mid+1;
else if(nums[mid]>k)
right=mid-1;
}
return left;
}
int GetNumberOfK(int* nums, int numsLen, int k ) {
return (Find_Edges(nums,numsLen,k+0.5)-Find_Edges(nums,numsLen,k-0.5));
}
因为data是一个非降序数组,它是有序的,并且要求的时间复杂度是log(N),这种时候我们可能会想到用二分查找。但是一个数组可能有多个k,而且我们要查找的并非常规二分法中k出现的位置,而是k出现的左界和k出现的右界。要是能刚好找到恰好小于k的数字位置和恰好大于k的数字的位置就好了。
再有因为数组中全是整数,因此我们可以考虑,用二分查找找到 k+0.5 应该出现的位置和k−0.5应该出现的位置的左边界,这两个的左边界相减就是 k 出现的范围。
这里视频太大貌似放不上来,后面单独发一下找左边界的视频。
7、整数转换
整数转换。编写一个函数,确定需要改变几个二进制位才能将整数A转成整数B
题目来自:leetcode
需要改变几个二进制位,即找出两个数的二进制位中有几个不同。
int convertInteger(int A, int B){
int count=0,bit=32;
while(bit--)
{
if((A&1)!=(B&1))//运算符优先级
count++;
A>>=1;
B>>=1;
}
return count;
}
这道题考察的是按位与操作符和位操作符。只需要得出两个数的二进制位的每一位再进行比较看是否相等即可。