C++题目(五)

1.函数A将字符串str1转成小写,并打印出转化前后的字符串。另外,改错时不能改变函数的接口和主要思路。

#include <iostream>
using namespace std;

char *str = "ABDFLjlero我们都是saf"; //不能为常量字符串 char str[] = ...

char *ToLower(char s[])
{
        static size_t i=sizeof(s); //不能为size_t,size_t为无符号整型,0--后为无符号的最大值 int i = strlen(s) -1;
        for(i; i>=0; i--)
                if(s[i] >= "A" && s[i] <= "Z") //if(s[i] >= 'A' && s[i] <= 'Z')
                        s[i] += 26; //s[i] += 'a' - 'A'; 'A'为65, 'a'为97
        return s;
}

int main(int argc, char *argv[])
{
        printf("Old is %s\nafter Lower is %s\n", str, ToLower(str)); //这句话是有问题的,printf是先入栈,计算,在输出,入栈的为两个字符指针,但是计算完后str所指向的字符串变化了,所以输出的两个都为变化之后字符串。这里改动较大,应该分开写。
	printf("Old is %s\n",str);
	printf("after Lower is %s\n", ToLower(str));
        return 0;
}


 

2.size_t

size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。 在C++中,设计 size_t 就是为了适应多个平台的 。size_t的引入增强了程序在不同平台上的可移植性,在32位系统中size_t是4字节的,而在64位系统中,size_t是8字节的,这样利用该类型可以增强程序的可移植性。
腾讯:2011.10

4、随着IP网络的发展,为了节省可分配的注册IP地址,有一些地址被拿出来用于私有IP地址,以下不属于私有IP地址范围的是(C)
A、10.6.207.84                              B、172.23.30.28                     C、172.32.50.80               D、192.168.1.100

私有IP地址共有三个范围段:
A:     10.0.0.0~10.255.255.255 /8   B:      172.16.0.0~172.31.255.255 /12
C:   192.168.0.0~192.168.255.255 /16


7、表达式“X=A+B*(C--D)/E”的后缀表示形式可以为(C)
A、XAB+CDE/-*=                     B、XA+BC-DE/*=                      C、XABCD-*E/+=                         D、XABCDE+*/=

8、(B)设计模式将抽象部分与它的实现部分相分离。
A、Singleton(单例)        B、 Bridge(桥接)        C、 Composite(组合)        D、 Facade(外观)

11、下列哪一个不属于关系数据库的特点?D
A、数据冗余度小
B、数据独立性高
C、数据共享性好
D、多用户访问

12、一个类的成员函数可以成为另一个类的友元函数,这个时候,友元函数必须加上类域的限定。

网易:2011.10

13.如果X大于0并小于65536,用移位法计算X乘以255的值为:    (X<<8)-X

迅雷:2011
14、下面的程序可以从0....n-1中随机输出m个不重复的数。请填空
knuth(int n, int m)

{
         srand((unsigned int)time(0));
       for (int i=0; i<n; i++)

          {
                 if ( 1.           )
                  {
    2.
                                cout<<i<<endl;                                     ;
                   }
          }
}
分别为:rand()%(n-i)<m  和 m--;从r个数中选m个数,第一个数被选取的概率为rand()%r<m

15、以下prim函数的功能是分解质因数。请填空

void prim(int m, int n)

{
    if (m>n)

    {
        while ( 1.           ) n++;
 2.                              ;
        prim(m,n);
        cout<<n<<endl;
    }

}

分别为:m%n  和 m/=n

16、以下哪个协议通常用来收取邮件(A)
A、SMTP              B、MAIL           C、POP3             D、SNMP(简单网络管理协议 属于应用层)                 E、ICMP
SMTP(Simple Mail Transfer  Protocol)简单邮件发送协议
POP3(Post Office Protocol)邮局协议               
SMTP和POP3都属于应用层协议
一个电子邮件系统具有三个主要组成构件,就是用户代理、邮件服务器以及邮件发送协议(SMTP)和邮件读取协议(POP3)
不要把SMTP和POP3协议弄混。发件人的用户代理向发送方邮件服务器发送邮件,以及发送方邮件服务器向接收方邮件服务器发送邮件,都是使用SMTP协议。而POP3协议则是用户代理从接受方邮件服务器上读取邮件的时候所使用的协议。

17、求输出结果:

#include <stdio.h>

int main(int argc, char **argv)
{
 unsigned int a = 6;
 int b = -12;
 if(a+b > 0)
 { 
  printf("正数\n");
  printf("a+b=%d\n" , a+b);
  printf("a+b=%p\n" , (void *)(a+b));
 }
 else
 {
  printf("负数\n");
  printf("a+b=%d\n" , a+b);
  printf("a+b=%p\n" , (void *)(a+b));
 }
 return 0;
}


答案:
正数
a+b=-6
a+b=0xFFFFFFFA
原因:当无符号数与有符号数相加时,将相加后的结果转化为无符号数,为什么第一个结果是-6呢,因为%d输出的时候是按照有符号数输出的。第二个输出语句就是按照内存里的内容输出的。为什么是0xFFFFFFFA,-6的补码就是0xFFFFFFFA,计算机在内存中存储数据的格式是补码的格式,所以打印出来的结果就是一个大于0的数。这就充分说明了a+b>0了。

18、下面的函数有什么错误:
int square(volatile int *ptr)
{
 return *ptr * *ptr;
}
编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
 int a,b;
 a = *ptr;
 b = *ptr;
 return a * b;
}
答案:由于*ptr的值可能被意想不到的改变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
 int a;
 a =*ptr;
 return a * a;
}
volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值. 它是被设计用来修饰被不同线程访问和修改的变量。volatile 是给编译器的只是,指出对这样的对象不应该执行优化。

19、求取字符串长度,不使用while、for等循环语句和字符串处理函数。
这个题目和求树的高度差不多,都是递归。
int strlen(char *str)
{
 if(*str == '\0')
  return 0;
 return 1+strlen(str+1);
}

20、在if里面请写入语句,使得打印出  Hello  World。

int main(void)
{
 if()   
 {
  printf("Hello ");
 }
 else
 {
  printf("World");
 }
 return 0;
}

//应该填入!printf("Hello "),会先打印出Hello,然后进行if()判断,!printf()取反就是0,所以不成立只能运行else,接着打印出World。“Upon successful return, these functions return the number of characters printed (not including the trailing ’\0’)”这里有个顺序问题,例如语句:printf("%d", printf("44")); 结果为442,先是里面的,可以理解为输出的过程为printf执行的过程,先有输出44,再有的结果2

 

 

 

 

你可能感兴趣的:(C++题目(五))