请乘理想之马
挥鞭从此起程
路上春色正好
天上太阳正晴
——希望疫情早日结束,所有美好如约而至!
Day12
一、选择题
1、请阅读以下程序,其运行结果是( )A: YESB: NOC: YESNOD: 语句错误2、假设编译器规定 int 和 short 类型长度分别为32位和16位,若有下列C语言语句,则 y 的机器数为( )A: 0000 7FFAB: 0000 FFFAC: FFFF 7FFAD: FFFF FFFA3、下列程序的输出结果是什么( )
A: - 2B: 0C: 1D: 24、C 语言中,下列运算符优先级最高的是 ( )A: !B: %C: >>D: ==5、要使 a 的低四位翻转,需要进行操作是( )A: a|0xFB: a&0xFC: a^0xFD: ~a二、编程题
T1:HJ11 数字颠倒 :
描述
输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
数据范围: 0 \le n \le 2^{30}-1 \0≤n≤230−1
输入描述:
输入一个int整数
输出描述:
将这个整数以字符串的形式逆序输出
示例1
输入:1516000
输出:0006151
示例2
输入:0
输出:0
T2:HJ31 单词倒排
描述
对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
数据范围:字符串长度满足 1 \le n \le 10000 \1≤n≤10000
输入描述:
输入一行以空格来分隔的句子
输出描述:
输出句子的逆序
示例1
输入:I am a student
复制输出:student a am I
示例2
输入:$bo*y gi!r#l
输出:l r gi y bo
题解:
一、选择题
1 、答案解析:正确答案: A'0'<=c<='9' 并非判断 x 大于等于字符 0, 小于等于字符 9 ,而是先执行 '0'<=c ,使用这个表达式的结果再和 '9' 比较, '0' 的ASCII码值是 48 , 'A' 的 ASCII 码值是 '65' ,故 '0'<c 是真值 1 , 1 无疑是小于字符 '9' 的,最终是真2 、答案解析:正确答案: Bunsigned short 类型的 x 变量 2 个字节保存了 65530 ,十六进制形式为 0xFFFA , x 给 y 赋值时会整型提升,而无符号数在提升时高位补0 ,其实就相当于把 x 的值放在了 y 的低 2 个字节的空间中,故选 B
3 、答案解析:正确答案: Bi % 3 的值按 1 、 2 、 0 循环,可推算出 ans 按 1 、 3 、 3 、 2 、 0 、 0 循环,循环进行 1001 次,而 1001%6=5 ,也就是 ans 按规律得到的第5个数为最终结果,故 ans=04 、答案解析:正确答案: A单目运算符的优先级通常都比较高,具体情况可查阅运算符优先级表格5 、答案解析:正确答案: C十六进制数 0xF 是 4 位 1 ,参与运算时整型提升,高位都是 0 。低四位和 1 异或, 0^1 是 1 , 1^1 是 0 ;高位和 0 异或, 0^0 是 0 , 1^0是1 。故而可以通过异或 F 使得 a 的低四位翻转,并保持高位不变二、编程题
1 、【答案解析】:这道题只需要循环取出一个数字的每一位进行单独打印,打印完毕后换行即可。而获取数据的每一位,可以通过取每次对数字模和除以 10 来完成示例: 129 , 129%10 得到 9 , 129/10 得到 12 ,循环进行操作直到数字除以 10 得到 0 为止#include <stdio.h> int main() { int num; while(~scanf("%d", &num)) { if (num == 0) {//0的情况特殊处理,因为0不会进入while循环计算余数,因此不会被打印 printf("%d", num % 10); continue; } while(num > 0) { printf("%d", num % 10);//打印一个数字的个位数 129 % 10 得到9 num /= 10;//通过除以10的方式去掉个位数 例如:129/10 得到12 } printf("\n"); } return 0; }
2 、【答案解析】:这道题的解题思路不难,定义一个字符指针数组,用于保存每个单词的起始字符地址,接下来将非字母字符全部替换成为字符串结尾标志,则单词字符字母遇到结尾就结束了,相当于把一个字符串以非字母字符进行切割成为了多个 符串,最终对字符指针数组进行逆序打印每个单词即可。#include <stdio.h> #include <string.h> int main() { char str[10001] = {0};//字符串最长10000 int row = 0; while(gets(str) > 0) { char *ptr = str; char *word[10000] = {NULL}; while(*ptr != '\0') { //如果是个字母字符,则是单词的起始字符 if (('z' >= *ptr && *ptr >= 'a') || ('Z' >= *ptr && *ptr >= 'A')) { word[row++] = ptr;//保存每个单词的起始地址 //把本次的单词字母字符走完,直到遇到非字母字符 while(*ptr != '\0' && (('z' >= *ptr && *ptr >= 'a') ||('Z' >= *ptr && *ptr >= 'A'))) { ptr++; } continue;//不能继续向下,因为下边的ptr++会跳过当前的非字母字符 } *ptr = '\0';//把非字母的数据全部替换为结尾标志 ptr++; } for (int i = row - 1; i >= 0; i--) { printf("%s ", word[i]);//针对所有单词的起始地址逆序开始打印即可 }printf("\n"); } }
后记:
●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!
——By 作者:新晓·故知
《C语言假期作业学习笔记》之内容采用动态管理即若学习到多解、优解等将会进行更新,敬请读者斧正!