选择题:
题一:
1、请阅读以下程序,其运行结果是( )
int main()
{
char c='A';
if('0'<=c<='9')
printf("YES");
else
printf("NO");
return 0;
}
A: YES B: NO C: YESNO D: 语句错误
答案解析:
'0'<=c<='9'并非判断x大于等于字符0,小于等于字符9,而是先执行'0'<=c,使用这个表达式的结果再和'9'比较,'0'的ASCII码值是48,'A'的ASCII码值是'65',故'0'<c是真值1,1无疑是小于字符'9'的,最终是真。
题二:
2、假设编译器规定 int 和 short 类型长度分别为32位和16位,若有下列C语言语句,则 y 的机器数为( )
unsigned short x = 65530;
unsigned int y = x;
A: 0000 7FFA B: 0000 FFFA
C: FFFF 7FFA D: FFFF FFFA
答案解析:
unsigned short类型的x变量2个字节保存了65530,十六进制形式为0xFFFA,x给y赋值时会整型提升,而无符号数在提升时高位补0,其实就相当于把x的值放在了y的低2个字节的空间中,故选B。
题三:
3、下列程序的输出结果是什么( )
#include<stdio.h>
int main()
{
int n = 1001;
int ans = 0;
for(int i = 1; i <= n; ++i)
{
ans ^= i % 3;
}
printf("%d",ans);
return 0;
}
A: -2 B: 0 C: 1 D: 2
答案解析:
i % 3 的值按1、2、0循环,可推算出ans按1、3、3、2、0、0循环,循环进行1001次,而1001%6=5,也就是ans按规律得到的第5个数为最终结果,故ans=0 。
题四:
4、C 语言中,下列运算符优先级最高的是 ( )
A: ! B: % C: >> D: ==
答案解析:
单目运算符的优先级通常都比较高,具体情况可查阅运算符优先级表格。
题五:
5、要使 a 的低四位翻转,需要进行操作是( )
A: a|0xF B: a&0xF C: a^0xF D: ~a
答案解析:
十六进制数0xF是4位1,参与运算时整型提升,高位都是0。低四位和1异或,0^1是1,1^1是0;高位和0异或,0^0是0,1^0是1。故而可以通过异或F使得a的低四位翻转,并保持高位不变。
编程题:
题一:数组颠倒
示例1
输入:
1516000
输出:
0006151
思路一:
前后交换法:
第一步:定义一个数组接收元素,并计算数组长度,left指向第一个元素,right指向最后一个元素;
第二步:只要left < right,就交换两个元素;
第三步:打印字符串。
#include <stdio.h> #include <string.h> int main() { char arr[10] = {0}; scanf("%s",&arr); int sz = strlen(arr); int left = 0; int right = sz-1; //前后交换 while(left < right) { char num = arr[left]; arr[left] = arr[right]; arr[right] = num; left++; right--; } printf("%s",arr); return 0; }
题二:单词倒排
示例1
输入:
I am a student
输出:
student a am I
思路一:
逆置整个数组: I am a student——>tneduts a ma I
分别逆置各个单词:student a ma I
student a ma I
student a am I
第一步:由于正常情况下scanf的局限性,这里用gets来接收元素,并计算长度sz;
第二步:分别定义当前节点cur,开始节点start来定位一个单词的范围,以及记录数count;
第三步:首先数组整体倒置,然后从第一位开始,判断是字母就cur后移一位,不是字母就将start到cur-1区间的字母进行倒置,倒置完不是最后一个元素就添‘ ’(空格),再跳过所以非字母的元素;
第四步:循环判断直到全部遍历一遍,就是需要的结果。
#include <stdio.h> #include <string.h> #include <ctype.h> //倒置 void my_reverse(char* left, char* right) { while (left < right) { char* tmp = *left; *left = *right; *right = tmp; left++; right--; } } int main() { char arr[10000] = { 0 }; gets(arr); //数组长度 int sz = strlen(arr); //定位单词范围 char* cur = arr; char* start = arr; //记录单词有几个字母 int count = 0; //整体倒置 my_reverse(arr, arr + sz - 1); while (*cur != '\0') { //是字母就++ while (isalpha(*cur)) { cur++; } //一个单词倒置 my_reverse(start, cur - 1); //倒置后补空格 if(*cur != '\0') *cur = ' '; //跳过所有非字母 while (!isalpha(*cur) && *cur != '\0') { start = ++cur; } } //打印 printf("%s", arr); return 0; }
思路二:
scanf("%[a-z|A-Z]",arr[i]); %["a-z | A-Z"]意思是是只接收字母元素,与二维数组连用,就是将一串字符连成的单词放到一维数组中。
如:
I like bit
即:I
like
bit
第一步:定义一个足够接收字符串长度的二维数组arr,以及初始化为“0”的“ i ”“ x ”;
第二步:scanf返回值,正确输入n个变量返回n,不匹配返回0,输入结束EOF,接收字母字符到一维数组中,只要后面不是'\n'就i++,否则直接退出循环;
第三步:从后往前将打印单词打印。
#include <stdio.h> #include <stdlib.h> int main() { char arr[10000][21] = {0}; int i = 0; int x = 0; while(1) { //scanf返回值,正确输入n个变量返回n,不匹配返回0,输入结束EOF x = scanf("%[a-z|A-Z]",arr[i]); //如果输入结束,退出 if(getchar() == '\n') break; //记录单词个数 if(x) i++; } //从后往前打印单词 for(int j = i;j >= 0;j--) { if(j > 0) printf("%s ",arr[j]); else printf("%s",arr[j]); } return 0; }
本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!
感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!