练习题

来源:互联网 发布:手机qq透明皮肤软件 编辑:程序博客网 时间:2024/04/28 17:38
1. 在一个64位的操作系统中定义如下结构体:
1
2
3
4
5
6
structst_task
{
    uint16_t id;
    uint32_t value;
    uint64_t timestamp;
};
同时定义fool函数如下:
1
2
3
4
5
6
7
voidfool()
{
    st_task task = {};
    uint64_t a = 0x00010001;
    memcpy(&task, &a, sizeof(uint64_t));
    printf("%11u,%11u,%11u", task.id, task.value, task.timestamp);
}
上述fool()程序的执行结果为()
1,0,0

2,C++中32位单精度浮点数能表示的十进制有效数字是多少位?()
  • 9
  • 6
  • 7
  • 8
单精度浮点数的有效位数是7位。
双精度浮点数的有效位数是16位。
1,一个浮点数由三部分组成:符号位S、指数部分E(阶码)以及尾数部分M。
2,单精度浮点数(float)总共用32位来表示浮点数,其中尾数用23位存储,加上小数点前有一位隐藏的1(IEEE754规约数表示法),2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位。考虑到第7位可能的四舍五入问题,所以单精度最少有6位有效数字(最小尺寸)。 
3,同样地:双精度浮点数(double)总共用64位来表示浮点数,其中尾数用52位存储,     2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以双精度的有效位数是16位。同样四舍五入,最少15位。

3,下面程序的输出结果是
1
2
3
char*p1= “123”, *p2 = “ABC”, str[50]= "xyz";
strcpy(str+2,strcat(p1,p2));
cout << str;
char* strcat(char *,const char*)//第一个参数所指向的内容必须可以修改,可以赋值为在栈上分配的数组
strcat(p1,p2)试图修改p1的内容,p1指向文字常量区,其指向的内容无法修改
分析:p1和p2指向的是常量存储区的字符串常量,没法连接,会有问题
strcat(p1,p2)出错,因为p1只被分配了4个字节的地址空间,将p2拼接在p1后面会引起内存溢出。

4,下列给定程序中,函数fun的功能是:有N×N矩阵,将矩阵的外围元素做顺时针旋转。操作顺序是:首先将第一行元素的值存入临时数组二,然后是第一列成为第一行,最后一行成为第一列,最后一列成为最后一行,再使临时数组中的元素成为最后一列。 
例如:若N=3,有下列矩阵: 

1 2 3

4 5 6

7 8 9

操作后应为: 

7 4 1

8 5 2

9 6 3

请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。 
试题程序。

#include <stdio.h>
#define  N 4
void fun(int (*t)[N])

    int j ,r[N];
    for(j=0; j<N; j++)
        r[j]=t[0][j];
    for(j=0; j<N; j++)
        t[0][N-j-1]=t[j][ 1 ];
    for(j=0; j<N; j++)
        t[j][0]=t[N-1][j];
    /**********found**********/
    for(j=N-1; j>=0; 2 )
        t[N-1][N-1-j]=t[j][N-1];
    for(j=N-1; j>=0; j--)
    /**********found**********/
        t[j][N-1]=r[ 3 ];
}
main( )

    int t[ ][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10}, i, j;
    printf("\nThe original array:\n");
    for(i=0; i<N; i++)
    { 
        for(j=0; j<N; j++)
        printf("%2d ",t[i][j]);
        printf("\n");
    }
    fun(t);
    printf("\nThe result is:\n");
    for(i=0; i<N; i++)
    { 
        for(j=0; j<N; j++)
            printf("%2d ",t[i][j]);
        printf("\n");
    }
}
请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。

 答案:0  j--  j
1,for(j=0; j<N; j++) t[0][N-j-1]=t[j][ 0 ];
作用是将第一列的元素放在第一行,由于是第一列,所以第二个下标为0
2, for(j=N-1; j>=0; j-- ) t[N-1][N-1-j]=t[j][N-1];
作用是将最后一列的元素放在最后一行,循环变量是j,从N开始,每次减一,所以是j--
3, for(j=N-1; j>=0; j--) t[j][N-1]=r[ j ];
作用是将原来第一行保存在临时数组中的元素放在最后一列,最后一个元素放在最下面,所以是t[j][N-1]=r[j]; 

ref牛客
0 0
原创粉丝点击