C语言:选择+编程(每日一练Day12)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: C语言:选择+编程(每日一练Day12)



选择题:

题一:

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的低四位翻转,并保持高位不变。

编程题:

题一:数组颠倒

数字颠倒_牛客题霸_牛客网 (nowcoder.com)

示例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;
}

题二:单词倒排

单词倒排_牛客题霸_牛客网 (nowcoder.com)

示例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;
}

本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!

感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!

                                             

目录
相关文章
|
1月前
|
NoSQL C语言 索引
十二个C语言新手编程时常犯的错误及解决方式
C语言初学者常遇错误包括语法错误、未初始化变量、数组越界、指针错误、函数声明与定义不匹配、忘记包含头文件、格式化字符串错误、忘记返回值、内存泄漏、逻辑错误、字符串未正确终止及递归无退出条件。解决方法涉及仔细检查代码、初始化变量、确保索引有效、正确使用指针与格式化字符串、包含必要头文件、使用调试工具跟踪逻辑、避免内存泄漏及确保递归有基准情况。利用调试器、编写注释及查阅资料也有助于提高编程效率。避免这些错误可使代码更稳定、高效。
221 12
|
2月前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
2月前
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
|
2月前
|
消息中间件 Unix Linux
C语言 多进程编程(五)消息队列
本文介绍了Linux系统中多进程通信之消息队列的使用方法。首先通过`ftok()`函数生成消息队列的唯一ID,然后使用`msgget()`创建消息队列,并通过`msgctl()`进行操作,如删除队列。接着,通过`msgsnd()`函数发送消息到消息队列,使用`msgrcv()`函数从队列中接收消息。文章提供了详细的函数原型、参数说明及示例代码,帮助读者理解和应用消息队列进行进程间通信。
|
2月前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
2月前
|
消息中间件 Unix Linux
C语言 多进程编程(二)管道
本文详细介绍了Linux下的进程间通信(IPC),重点讨论了管道通信机制。首先,文章概述了进程间通信的基本概念及重要性,并列举了几种常见的IPC方式。接着深入探讨了管道通信,包括无名管道(匿名管道)和有名管道(命名管道)。无名管道主要用于父子进程间的单向通信,有名管道则可用于任意进程间的通信。文中提供了丰富的示例代码,展示了如何使用`pipe()`和`mkfifo()`函数创建管道,并通过实例演示了如何利用管道进行进程间的消息传递。此外,还分析了管道的特点、优缺点以及如何通过`errno`判断管道是否存在,帮助读者更好地理解和应用管道通信技术。
|
2月前
|
Linux C语言
C语言 多进程编程(七)信号量
本文档详细介绍了进程间通信中的信号量机制。首先解释了资源竞争、临界资源和临界区的概念,并重点阐述了信号量如何解决这些问题。信号量作为一种协调共享资源访问的机制,包括互斥和同步两方面。文档还详细描述了无名信号量的初始化、等待、释放及销毁等操作,并提供了相应的 C 语言示例代码。此外,还介绍了如何创建信号量集合、初始化信号量以及信号量的操作方法。最后,通过实际示例展示了信号量在进程互斥和同步中的应用,包括如何使用信号量避免资源竞争,并实现了父子进程间的同步输出。附带的 `sem.h` 和 `sem.c` 文件提供了信号量操作的具体实现。
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
7天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
23 6
|
27天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
34 10