• C语言基础练习——Day12


    目录

    选择题

    编程题

    数字颠倒

    单词倒排


    选择题

    1、请阅读以下程序,其运行结果是

    1. int main()
    2. {
    3. char c='A';
    4. if('0'<=c<='9') printf("YES");
    5. else printf("NO");
    6. return 0;
    7. }
    • A YES
    • B NO
    • C YESNO
    • D 语句错误
    答案:A
    💡

    解析:

    '0'<=c<='9'并非判断x大于等于字符0,小于等于字符9,而是先执行'0'<=c,使用这个表达式的结果再和'9'比较,'0'ASCII码值是48,'A'的ASCII码值是'65',故'0'是真值1,1无疑是小于字符'9'的,最终是真

    2、假设编译器规定intshort类型长度分别为32位和16位,若有下列C语言语句,则y的机器数为

    1. unsigned short x = 65530;
    2. unsigned int y = x;
    • A 0000 7FFA
    • B 0000 FFFA
    • C FFFF 7FFA
    • D FFFF FFFA
    答案:B
    💡

    解析:

    unsigned short类型的x变量2个字节保存了65530,十六进制形式为0xFFFAxy赋值时会整型提升,而无符号数在提升时高位补0,其实就相当于把x的值放在了y的低2个字节的空间中,故选B

    3、下列程序的输出结果是什么

    1. #include
    2. int main()
    3. {
    4. int n = 1001;
    5. int ans = 0;
    6. for(int i = 1; i <= n; ++i)
    7. {
    8. ans ^= i % 3;
    9. }
    10. printf("%d",ans);
    11. return 0;
    12. }
    • 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

    4、C 语言中,下列运算符优先级最高的是

    • A !
    • B %
    • C >>
    • D ==
    答案:A
    💡

    解析:

    单目运算符的优先级通常都比较高,具体情况可查阅运算符优先级表格

    5、要使a的低四位翻转,需要进行操作是

    • A a|0xF
    • B a&0xF
    • C a^0xF
    • D ~a
    答案:C
    💡

    解析:

    十六进制数0xF(十进制为15)是4位1即,参与运算时整型提升,高位都是0。低四位和1异或,0^1是1,1^1是0;高位和0异或,0^0是0,1^0是1。故而可以通过异或F使得a的低四位翻转,并保持高位不变

    编程题

    数字颠倒

    题目链接:数字颠倒_牛客题霸_牛客网 (nowcoder.com)

    描述
    输入一个整数,将这个整数以字符串的形式逆序输出
    程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001

    数据范围:0≤ n
    输入描述:
    输入一个int整数
    输出描述:
    将这个整数以字符串的形式逆序输出

    思路解析:

    本题可以考虑使用字符串逆序输出的思路对本题进行解决,需要注意的是strlen函数计算的是字符个数,此时遍历数组的最后一个元素的下标为长度减1

    参考代码:

    1. #include
    2. #include
    3. int main() {
    4. int num = 0;
    5. scanf("%d", &num);
    6. char str[100] = {0};
    7. sprintf(str, "%d", num);
    8. int len = strlen(str);
    9. for (int i = len - 1; i >= 0; i--) {
    10. printf("%c", str[i]);
    11. }
    12. return 0;
    13. }

    单词倒排

    题目链接:单词倒排_牛客题霸_牛客网 (nowcoder.com)

    描述
    对字符串中的所有单词进行倒排。
    说明:
    1、构成单词的字符只有26个大写或小写英文字母;
    2、非构成单词的字符均视为单词间隔符;
    3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
    4、每个单词最长20个字母;

    数据范围:字符串长度满足 1≤ n≤10000
    输入描述:
    输入一行,表示用来倒排的句子
    输出描述:
    输出句子的倒排结果

    思路解析:

    本题可以考虑使用二维数组进行求解,每一行用于存一个单词,每一列放一个字母

    首先是输入,可以考虑用死循环持续读取输入知道遇到'\n'为止,在C语言中,根据scanf的特点,在读取字符串时会跳过空白字符,而本题中题目说明了构成单词的字符只有大小写字母,所以在输入时需要限制输入的字符集合在a-z以及A-Z,即scanf("%[a-z|A-Z]", str[i]),而因为scanf的返回值是实际成功读取到的字符的个数,故当其返回值非0时,说明此时输入了单词,输入完一个单词后换到二维数组的下一行即可

    接着是输出,因为当前二维数组每一行存储的是一个单词,只要是有字母的位置就不会停止读取,那么对初始化全部为0的数组来说,只需要反向输出即可,但是输出时需要注意是使用%c还是%s,如果用%s就不需要考虑列,%s在输出一行单词时会一直读到遇到'\0'为止

    参考代码:

    1. #include
    2. int main() {
    3. char str[128][21] = {0};
    4. int i = 0;
    5. int ret = 0;
    6. while (1) {
    7. ret = scanf("%[a-z|A-Z]", str[i]);
    8. if(getchar() == '\n')
    9. {
    10. break;
    11. }
    12. if (ret) {
    13. i++;
    14. }
    15. }
    16. for (int j = i; j >= 0; j--) {
    17. printf("%s ", str[j]);
    18. }
    19. return 0;
    20. }
  • 相关阅读:
    (1)bark-ml
    G-Mixup: Graph Data Augmentation for Graph Classification
    云安全解决方案安全保障体系框架
    QtColorButton——Qt自带的颜色选择按钮
    ChatGPT-4 Alpha:OpenAI的革命性升级
    【2022 MS MARCO】【阿里】HLATR:基于混合列表感知Transformer重排的多阶段文本检索增强 ( .feat PRM:个性化的推荐重排)
    开源网安解决方案荣获四川数实融合创新实践优秀案例
    LQ0001 方程整数解【枚举】
    2.1 八大类50条小红书爆款标题文案【玩赚小红书】
    CTP行情推送规则是怎样执行文件的?
  • 原文地址:https://blog.csdn.net/m0_73281594/article/details/136843471