题型指引
- 一、选择题
- 二、编程题
★★写在前面★★
本题库源自互联网,仅作为个人学习使用,记录C语言题目练习的过程,如果对你也有帮助,那就点个赞吧。
一、选择题
1、请阅读以下程序,其运行结果是( )
int main()
{
char c='A';
if('0'<=c<='9') printf("YES");
else printf("NO");
return 0;
}
A: YES B: NO C: YESNO D: 语句错误
正确答案:A
答案解析:‘0’<=c<=‘9’并非判断x大于等于字符0,小于等于字符9,而是先执行’0’<=c,使用这个表达式的结果再和’9’比较,‘0’的ASCII码值是48,‘A’的ASCII码值是’65’,故’0’<c是真值1,结果为YES,选项A正确。
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
正确答案:B
答案解析: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
正确答案:B
答案解析:i % 3 的值按1、2、0循环,可推算出ans按1、3、3、2、0、0循环,循环进行1001次,而1001%6=5,也就是ans按规律得到的第5个数为最终结果,故ans=0,选项B正确。
程序运行截图:
4、C 语言中,下列运算符优先级最高的是 ( )
A: ! B: % C: >> D: ==
正确答案:A
答案解析:单目运算符的优先级通常都比较高,具体情况可查阅运算符优先级表格,选项A正确。
5、要使a 的低四位翻转,需要进行操作是( )
A: a|0xF B: a&0xF C: a^0xF D: ~a
正确答案:C
答案解析:十六进制数0xF是4位1,参与运算时整型提升,高位都是0。低四位和1异或,01是1,11是0;高位和0异或,00是0,10是1。故而可以通过异或F使得a的低四位翻转,并保持高位不变,选项C正确。
二、编程题
1、输入一个整数,将这个整数以字符串的形式逆序输出,程序不考虑负数的情况,若数字含有0,则逆序形式也含
有0,如输入为100,则输出为001。
数据范围: 1 <= n <= 2^30 - 1
输入描述:输入一个int整数。
输出描述:将这个整数以字符串的形式逆序输出。
牛客网【牛客网题号: HJ11 数字颠倒】
示例:
输入:1516000
输出:0006151
#include<stdio.h>
int main() {
int input = 0;
int r = 0;
char ch = 0;
scanf("%d", &input);
if (input == 0)
putchar('0');
while (input)
{
ch = input % 10 + '0';
putchar(ch);
input /= 10;
}
return 0;
}
代码思路:依次取模获取整数从低到高的每一位,加‘0’使其ASCII码值变为‘0’-‘9’之间,然后用putchar立马进行输出。
2、对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
牛客网【牛客网题号: HJ31 单词倒排】
示例:
输入:I am a student 输入:$bo*y gi!r#l
输出:student a am I 输出:l r gi y bo
//牛客网网友代码
#include <stdio.h>
#include <stdlib.h>
int main(){
char str[100][22];
int i=0;
int x;
while(1){
x=scanf("%[a-z|A-Z]",str[i]);
if(getchar()=='\n') break;
if(x) i++;
}
for(int j=i;j>=0;j--){
printf("%s ",str[j]);
}
return 0;
}
代码思路:二维数组对输入的每一串连续输入的字母进行保存,每一段连续输入的字母首元素地址即为二维数组每一行首元素的地址,scanf(“%[a-z|A-Z]”,str[i]),这个语句中使用了正则表达式%[a-z|A-Z],只会读取大小写字母,因为scanf()函数遇到输入空格字符会停止,所以这方法可以读取每次连续输入的字符中的字母字符,循环结束的标志是遇到回车符号,循环结束后再进行打印,从最后一行往前打印即可,空格用printf里面打印出来即可。