【暑期每日一练】 day12

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 【暑期每日一练】 day12

选择题

(1)

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,1无疑是小于字符'9'的,最终是真

(2)

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)

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

 

(4)

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

A: ! B: % C: >> D: ==

答案:A

解析:

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

(5)

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

A: a|0xF B: a&0xF C: a^0xF D: ~a

答案:C

解析:

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

 

编程题

题一

描述

输入一个整数,将这个整数以字符串的形式逆序输出

程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001

数据范围: 0≤n≤230−1

输入描述:

输入一个int整数

输出描述:

将这个整数以字符串的形式逆序输出

示例

解析:

这道题只需要循环取出一个数字的每一位进行单独打印,打印完毕后换行即可。而获取数据的每一位,可以通过取每次对数字模和除以 10 来完成

代码实现

#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;
}

题二

描述

对字符串中的所有单词进行倒排。

说明:

1、构成单词的字符只有26个大写或小写英文字母;

2、非构成单词的字符均视为单词间隔符;

3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;

4、每个单词最长20个字母;

数据范围:字符串长度满足 1≤n≤10000

输入描述:

输入一行,表示用来倒排的句子

输出描述:

输出句子的倒排结果

示例

解析:

这道题的解题思路不难,定义一个字符指针数组,用于保存每个单词的起始字符地址,接下来将非字母字符全部替换成为字符串结尾标志,则单词字符字母遇到结尾就结束了,相当于把一个字符串以非字母字符进行切割成为了多个字符串,最终对字符指针数组进行逆序打印每个单词即可

代码实现

选择题
(1)
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,1无疑是小于字符'9'的,最终是真
(2)
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)
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
(4)
4、C 语言中,下列运算符优先级最高的是 ( )
A: ! B: % C: >> D: ==
答案:A
 解析:
单目运算符的优先级通常都比较高,具体情况可查阅运算符优先级表格
【C语言初阶】 操作符详解(1)_遇事问春风乄的博客-CSDN博客
icon-default.png?t=N6B9https://blog.csdn.net/m0_71731682/article/details/130630210?spm=1001.2014.3001.5502
(5)
5、要使 a 的低四位翻转,需要进行操作是( )
A: a|0xF B: a&0xF C: a^0xF D: ~a
答案:C
解析:
十六进制数0xF是4位1,参与运算时整型提升,高位都是0。低四位和1异或,0^1是1,1^1是0;高位和0异或,0^0是0,1^0是1。故而可以通过异或F使得a的低四位翻转,并保持高位不变
编程题
题一
描述
输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
数据范围: 0≤n≤230−1 
输入描述:
输入一个int整数
输出描述:
将这个整数以字符串的形式逆序输出
示例
解析: 
这道题只需要循环取出一个数字的每一位进行单独打印,打印完毕后换行即可。而获取数据的每一位,可以通过取每次对数字模和除以 10 来完成
代码实现
#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;
}
题二
描述
对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
数据范围:字符串长度满足 1≤n≤10000 
输入描述:
输入一行,表示用来倒排的句子
输出描述:
输出句子的倒排结果
示例
解析: 
这道题的解题思路不难,定义一个字符指针数组,用于保存每个单词的起始字符地址,接下来将非字母字符全部替换成为字符串结尾标志,则单词字符字母遇到结尾就结束了,相当于把一个字符串以非字母字符进行切割成为了多个字符串,最终对字符指针数组进行逆序打印每个单词即可
代码实现
#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");
总结
关于今日练习讲解到这儿,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。

总结

关于今日练习讲解到这儿,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。

相关文章
|
存储 人工智能 C语言
【暑期每日一练】 day9
【暑期每日一练】 day9
|
C语言
【暑期每日一练】 day11
【暑期每日一练】 day11
|
存储 测试技术 C语言
【暑期每日一练】 Epilogue
【暑期每日一练】 Epilogue
|
存储 人工智能 安全
【暑期每日一练】 day15
【暑期每日一练】 day15
|
Serverless C语言
【暑期每日一练】 day8
【暑期每日一练】 day8
|
C语言
【暑期每日一练】 day6
【暑期每日一练】 day6
|
存储 大数据 Serverless
【暑期每日一练】 day7
【暑期每日一练】 day7
|
7月前
|
机器学习/深度学习
2021牛客暑期多校训练营1(补题)
2021牛客暑期多校训练营1(补题)
42 0