C++面试题(七)

1、不使用printf,将十进制数以二进制和十六进制的形式输出
解析:用字符串表示十进制数。如果不适用printf系列函数,我们可以通过位运算得到十进制数的二进制和和十六进制形式的字符串,再将字符串打印。
 
        
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//得到二进制字符串
char *get2String(long num)
{
    int i=0;
    char* buffer;
    char* temp;
   
    buffer = (char*)malloc(33);
    temp = buffer;
    for(i=0; i < 32; i++)
    {
        temp[i] = num & (1 << (31 - i));
        temp[i] = temp[i] >> (31 - i);
        temp[i] = (temp[i] == 0) ? '0': '1';
    }
    buffer[32] = '\0';
    return buffer;
}

//得到十六进制字符串
char *get16String(long num)
{
    int i=0;
    char* buffer = (char*)malloc(11);
    char* temp;
    
    buffer[0] = '0';  //以0x为开头
    buffer[1] = 'x';
    buffer[10] = '\0';
    temp = buffer + 2;
  
    for(i=0; i < 8; i++)
    {
        temp[i] = (char)(num<<4 * i>>28);
        temp[i] = temp[i] >= 0 ? temp[i] : temp[i] + 15;
        temp[i] = temp[i] < 10 ? temp[i] + 48 :temp[i] + 56;
       
    }
    return buffer;
}
void main()
{
    char *p = NULL;
    char *q = NULL;
    int num = 0;
    
    printf("input num: ");
    scanf("%d", &num);
    
    p = get16String(num);
    q = get2String(num);
    
    printf("%s\n", p);
    printf("%s\n", q);
    
    return 0;
  
}

2、编程实现转换字符串、插入字符的个数
解析:需要统计字符串插入字符的个数,我的想法通过长度来判断插入字符的个数。
#include <iostream>
#include <string>

using namespace std;

void main()
{
    char str = "aaa";
 
        
}

 
        
三 、泛型编程
函数模板代表同构造函数,重点在函数,类型不需要特别指定,实现复用。类模板是一种更高层次的抽象结构的类定义。函数模板的实例化是在处理函数调用时自动完成,而类模板的实例化必须由程序员中显示指定。
模板的缺点: 不当地使用模板导致膨胀,即二进制码臃肿而松散,会严重影响程序运行效率。
解决方法: 把C++模板中参数无关的代码分离出来。
例子:
template <class T, int num>
class A
{
public:
       void work()
       {
           cout << "work()" << endl;
           cout << num << endl;
       }
};
int main()
{
    A<int, 1>v1;
    A<int, 2>v2;
    A<int, 3>v3;
    A<int, 4>v4;
    v1.work();
    v2.work();
    v3.work();
    v4.work();
    return 0;
    
}

改进:

template <class T>
class base
{
public:
       void work(int num)
       {
           cout << " work ";
           cout << num << endl;
       }
};
template<class T,int num>
class Derived : public base<T>  
{
public:
       void work()
       {
           base <T>::work(num);
       }
};
int main()
{
    Derived<int, 1>d1;
    Derived<int, 2>d2;
    Derived<int, 3>d3;
  
    d1.work();
    d2.work();
    d3.work();
    return 0; 
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值