C语言练习题(12)请阅读以下程序,其运行结果是()(非常详细的讲解)

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

① 在C语言中,字符常量是以ASCII码的形式存储的。字符’A’的ASCII码是65,而字符’0’的ASCII码是48,字符’9’的ASCII码是57。

②在if语句中,表达式’0’ <= c <= ‘9’会被计算为两个逻辑表达式:‘0’ <= c和c <=‘9’。这两个表达式都使用ASCII码进行比较。由于c的ASCII码是65,所以’0’ <= c会被计算为true,即1。而1 <= '9’会被计算为true,即1,所以if语句的条件为真。

③ 因此,代码会执行printf(“YES”),输出"YES"。

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

65530的16位原码为 11111111 11111010
y是32位 int类型,对其进行整型提升,前面补0,y的原码为
00000000 00000000 11111111 11111010
其16进制表示为 0000 FFFA(H),H代表16进制

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

第一轮 …………第二轮
0^1=1 …………0^1=1
1^2=3 …………1^2=3
3^0=3 …………如此循环
3^1=2 …………
2^2=0 …………
0^0=0 …………
代码中的循环从1到n遍历每个数,并使用异或运算符^将每个数对3取余的结果与ans进行异或运算,并将结果保存在ans中。

对于i取值为1到1001之间的每个数,i对3取余的结果将分别为1、2、0、1、2、0…循环继续下去。因此,ans的值会在1、3、3、2、0、0…之间循环变化。

最后,使用printf函数打印出ans的值。由于循环中对ans进行了多次异或运算,最终输出的结果为0。

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

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

解析 A

优先级【高到低】:
第一级: 圆括号【()】、下标运算符【[]】、分量运算符的指向结构体成员运算符【->】、结构体成员运算符【.】
第二级:逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++
–】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【和&】、长度运算符【sizeof】
第三级:乘法运算符【
】、除法运算符【/】、取余运算符【%】
第四级:加法运算符【+】、减法运算符【-】
第五级:左移动运算符【<<】、右移动运算符【>>】
第六级:关系运算符【< > <= >= 】
第七级:等于运算符【==】、不等于运算符【!=】
第八级:按位与运算符【&】
第九级:按位异或运算符【^】
第十级:按位或运算符【|】
第十一级:逻辑与运算符【&&】
第十二级:逻辑或运算符【||】
第十三级:条件运算符【?:】
第十四级:赋值运算符【= += -= *= /= %= >>= <<.= &= |= ^=】
第十五级:逗号运算符【,】

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

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

解析 C
0xF(二进制表示为00001111)

A: a|0xF
A的作用是将a的低四位设置为1,保持其他位不变。这是通过将a与0xF进行按位或运算实现的。按位或运算会将两个操作数的对应位进行逻辑或运算,只要其中一个位为1,结果对应位就为1。

B: a&0xF
B的作用是将a的低四位保留,将其他位设置为0。这是通过将a与0xF进行按位与运算实现的。按位与运算会将两个操作数的对应位进行逻辑与运算,只有两个位都为1,结果对应位才为1。

C: a^0xF
C的作用是将a的低四位进行翻转,保持其他位不变。这是通过将a与0xF进行异或运算实现的。异或运算会将两个操作数的对应位进行逻辑异或运算,如果两个位相同则结果对应位为0,不同则为1。

D: ~a
D的作用是将a的每一位取反。这是通过对a进行按位取反运算实现的。按位取反运算会将操作数的每一位进行逻辑非运算,即1变为0,0变为1。

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

数据范围: 0≤n≤2 ^30−1
输入描述:输入一个int整数
输出描述:将这个整数以字符串的形式逆序输出
示例1
输入:1516000
输出:0006151

示例2
输入:0
输出:0

#include <stdio.h>

int main()
 {
   int number=0;
   scanf("%d",&number);
   int b=0;
   if (number==0)
   printf("0");
   while (number)
   {
    b=number%10;
    printf("%d",b);
    number=number/10;
   }
    return 0;
}

解析

代码最核心的部分在于while循环。

在循环中,通过number%10取出number的个位数,并将其存储在变量b中。然后,使用printf函数将b输出到终端。接着,通过number/10将number除以10,相当于将number的个位数去掉。循环继续,直到number变为0为止。相当于从后向前打印number的每一位。
在while循环之前有一个if语句,因为当数字为0时无法进入while循环,所以我们用一个if语句将这个特殊情况涵盖掉。

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

说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
数据范围:字符串长度满足 :1≤n≤10000
输入描述:输入一行,表示用来倒排的句子
输出描述:输出句子的倒排结果
示例1
输入:I am a student
输出:student a am I

示例2
输入:$bo*y gi!r#l
输出:l r gi y bo

#include <stdio.h>
#include <string.h>
int main()
{
    char arr[10001];
    int sz,i;
    scanf("%[^\n]s",arr);
    sz=strlen(arr);
    for(i=sz-1;i>=0;i--)
    {
        if(!(arr[i]>='A'&&arr[i]<='Z'||arr[i]>='a'&&arr[i]<='z'))
        {
            printf("%s ",&arr[i+1]);
            arr[i]='\0';
        }
    }
    printf("%s",&arr[0]);
    return 0;
}

解析

①首先,定义了一个长度为10001的字符数组arr用于存储输入的句子。sz和i为整型变量。

②接下来使用scanf函数读取输入的句子,并存储到arr中,使用%[^\n]s格式,表示读取除了换行符之外的所有字符,遇到换行符停止读取。

③然后使用strlen函数计算出句子的长度,并将结果赋值给变量sz。

④接下来进入一个循环,从句子的最后一个字符开始遍历,直到第一个字符。循环中判断当前字符是否是字母,即判断是否在字母的ASCII码范围内,如果是字母,则继续循环。如果不是字母,则表示找到了一个单词的结尾,此时使用printf函数输出这个单词,并在结尾加上空格。然后将这个单词的结尾字符设置为字符串的结束符\0,即将其变为一个空字符串。

&arr[i+1]表示字符串的起始地址,即从arr[i+1]位置开始的字符串。在这里,arr[i+1]是一个字符数组中的元素,表示一个单词的结尾字符的下一个位置,即单词的起始位置。

⑤循环结束后,使用printf函数输出整个句子。

还有一种传统,但是较为复杂的方法

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void reverse(char *left, char *right)
{
    while(left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main()
{
    char *p = (char*)malloc(10000);
    gets(p);
    int len = strlen(p);
    reverse(p, p+len-1);
    int j=0;
    for(int i=0; i<=len; i++)
    {
        if(!isalpha(p[i]))
        {
            p[i] = ' ';
            reverse(p+j, p+i-1);
            j = i+1;
        }
    }
    int cnt = 0;
    for(int i=0; i<len; i++)
    {
        if(p[i] == ' ' && p[i+1] == ' ')
        {
            int m = i+1;
            int n = i+2;
            p[m++] = p[n++];
            cnt++;
        }
    }
    for(int i=0; i<len-cnt;i++)
    {
        printf("%c", p[i]);
    }
    free(p);
    p = NULL;
}

解析
在C语言中,isalpha函数是一个字符处理函数,用于判断字符是否为字母字符。函数返回值为非零值(真)表示字符是字母,返回值为0(假)表示字符不是字母。

①首先,在主函数中,使用malloc函数为指针p动态分配了10000字节的内存空间,并使用gets函数获取用户输入的字符串存储到p中。然后,使用strlen函数获取字符串的长度len。

②接下来,调用reverse函数,对整个字符串进行反转。reverse函数使用两个指针left和right指向字符串的首尾字符,然后通过循环,将left指向的字符与right指向的字符进行交换,并分别向前和向后移动left和right指针,直到left>=right时结束。这样,字符串中的字符就完成了反转。

③然后,在for循环中,遍历字符串中的每个字符。如果遇到非字母字符(即不是字母的字符),将该字符设置为一个空格,并调用reverse函数将该非字母字符之前的单词进行反转。同时,更新j的值为i+1,以便下次反转单词时,从下一个单词的起始位置开始。

④接着,在第二个for循环中,检查字符串中是否有多余的连续空格。如果连续两个字符都是空格,就将后一个字符向前移动一位,并计数cnt加1。通过这个操作,可以将连续的多个空格变为一个空格。

⑤最后,使用for循环遍历去除多余空格后的字符串,并使用printf函数将字符打印出来。

⑥使用free函数释放动态分配的内存空间,并将指针p置为空。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chris·Bosh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值