首页 > 代码库 > 笔试题集锦

笔试题集锦

1.C++有哪些数据类型?为什么long和int都是4字节?

C++的数据类型有字符型(char)、布尔型(bool)、短整型(short)、整型(int)、长整型(long)、浮点型(float)、双精度型(double)等类型

首先并不是所有的long和int都是4字节的,在C++中规定int的长度是大于等于short的长度,小于等于long的长度,并且要大于2字节,在16位CPU以及单片机中,int是2字节的,而在32位CPU及以上的CPU中int是4字节的;

在C++中long的长度应该是大于等于int的长度,且最小为4字节,在32位CPU中long为4字节,在64位机上long为8字节长度

2.JAVA和C++的区别是什么?分别用在什么情景比较好?

Java 和 C++ 都是面向对象的语言,但他们也存在着一些区别

1、Java 不支持多继承

2、Java 没有指针和引用

3、c++ 需要程序员手动管理堆内存,Java有自动垃圾回收机制

Java运行在java虚拟机上,速度相对较慢,在实时性要求高的场合应该用c++

java通常在手机上应用的比较多。

JAVA和C++的区别是:

1 JAVA对内存的分配是动态的,它采用面向对象的机制,使用new为每个对象分配内存,程序运行过程中JAVA系统自动对内存进行扫描,对长期不用的空间作为“垃圾”进行收集,使得系统资源得以充分利用。 而C++使用new和delete来分配内存,内存的处理需要程序员自己来释放,如果对已释放的内存再释放或者对未内分配的内存做释放,都会造成死机,如果对长期不用或不再使用的内存长期不释放,造成资源的浪费。

2 JAVA不 在所有类之外定义全局变量,而是在某个类中定义一种公共静态的变量来完成全局变量的功能;

 3 JAVA不支持头文件,而C++使用头文件来定义类的原型、全局变量、库函数等;

4 JAVA不支持宏定义,使用关键字final来定义常量,在C++中则采用宏定义来实现常量定义

 5 JAVA对每种数据类型都分配固定长度,而C++中对于不同平台,同一种类型分配不同的字节数 

6 类型转换不同,JAVA在运行时系统对对象的处理要进行类型相容性检查,以防止不安全类型的转换,而C++中可以通过指针进行任意类型转换,常常带来不安全性。

 7 结构和联合的处理不同,C++中结构和联合的所有成员均为公有,这就带来了安全性问题,而在JAVA中根本不存在结构和联合,所有的内容都封装在类里面。

 8 JAVA不再使用指针,而C++中指针使用最灵活,蛋液最容易产生错误的数据类型,由指针多进行的内存地址操作常会造成不可预知的错误,同事通过指针对某个内存地址进行显示类型转换后,可以访问一个C++中的私有成员,从而破坏安全性,而JAVA对指针进行完全控制,程序员不能进行任何指针操作。

3.编程题:给定一个文件每一行是字符串,找出所有的逆序对,比如abc和cba是逆序的对。

#include"iostream"
#include"string"
#define MAX 100
using namespace std;
bool check(string str1,string str2)
{
    bool flag = true;
    for(int i=0; i<str1.length(); i++)
    {
        if(str1[i]!=str2[str1.length()-1-i])
        {
            flag = false;
            return flag;
        }
    }
    return flag;
}
int main(int argc, char* argv[])
{
    string str[MAX];
    int n,a[MAX];
    bool flag[MAX];
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>str[i];
        a[i] = str[i].length();
        flag[i] = true;
    }
    int num = 0;
    for(int i=0; i<n; i++)
    {
        int len = a[i];
        if(flag[i]==true)
        {
            for(int j=0;j<n;j++)
            {
                if(flag[j]==true&&len==a[j])
                {
                    if(check(str[i],str[j]))
                    {
                        num++;
                        flag[i] = false;
                        flag[j] = false;
                        break;
                    }
                }
            }
        }
    }
    for(int i=0; i<n; i++)
        cout<<str[i]<<‘\t‘;
    cout<<endl;
    cout<<"The Number of Matched String Is: "<<num<<endl;
    return 0;
}

4.给定一个奇数n,比如n=3,生成1到n平方的数,如1到9,填入九宫格,使得横竖斜的和都相等。


void shudu()
{
    const int n=3;
    int a[n][n]={0};
    int i,j;
    i=0;
    j=n/2;
    a[i][j]=1;
    for(int c=2;c<=n*n;c++)
    {
        if (i-1>=0&&j+1<n)
        {
            if (a[i-1][j+1]==0)
            {
                i=i-1;
                j=j+1;
            }
            else
            {
                i=i+1;
            }
        }
        else
        {
            if (i-1<0&&j+1>=n)
            {
                i=i+1;
            }
            else
            {
                if (j+1>=n)
                {
                    i=i-1;
                    j=j+1-n;
                }
                else
                {
                    j=j+1;
                    i=i-1+n;
                }
            }
        }
        a[i][j]=c;
    }
 
    for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
        {
            std::cout<<a[i][j]<<" ";
        }
        std::cout<<std::endl;
    }
}


5.C和C++有什么区别,能用C实现C++所有功能吗?C能实现多态吗?

原本的作业是批处理,也就是过程编程。缺点是不利于代码修改和重用。为了解决这个问题,出现了C语言的函数,实现结构化编程。
随着项目愈发的庞大,函数与函数间的逻辑关系愈发复杂,不利修改。另外,算法中逻辑步骤是一样的,但针对不同的数据类型,需要重写一遍。为了解决这个问题,出现了C++语言的class,实现面向对象编程。以及C++语言的模板,实现范式编程。
所以C实现结构化编程,C++实现结构化编程、面向对象编程和范式编程。

C++实现面向对象编程和范式编程,背后需要编译器提供相应的机制支持。这个机制支持本质是逻辑的,理论上,C语言能够模拟这套机制,也就是说理论上用C实现C++所有功能。但工作量会特别大,即实用角度看,用C不能实现C++所有功能。

C能实现多态。C++实现多态,是建一个表格,存储多态相关的函数指针,运行时根据调用对象的类型选择相应的函数。C语言可以模拟这个原理实现多态。

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 

对语言本身而言,C是C++的子集, C实现了C++中过程化控制及其它相关功能,而在C++中的C,相对于原来的C还有所加强,引入了重载、内联函数、异常处理等等,C++更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和包容器类等等。 


要用C模拟C++的多态性,可定义同一种函数指针类型和函数指针,运行过程中根据需要给函数指针赋函数地址。可以使用void *实现。

6.请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能。

#include <iostream>
#include <cstring>
using namespace std;
 
class String{
public:
    // 默认构造函数
    String(const char* str = NULL);
    // 复制构造函数
    String(const String &str);
    // 析构函数
    ~String();
    // 字符串连接
    String operator+(const String & str);
    // 字符串赋值
    String & operator=(const String &str);
    // 字符串赋值
    String & operator=(const char* str);
    // 判断是否字符串相等
    bool operator==(const String &str);
    // 获取字符串长度
    int length();
    // 求子字符串[start,start+n-1]
    String substr(int start, int n);
    // 重载输出
    friend ostream & operator<<(ostream &o,const String &str);
private:
    char* data;
    int size;
};
// 构造函数
String::String(const char *str){
    if(str == NULL){
        data = new char[1];
        data[0] = ‘\0‘;
        size = 0;
    }//if
    else{
        size = strlen(str);
        data = new char[size+1];
        strcpy(data,str);
    }//else
}
// 复制构造函数
String::String(const String &str){
    size = str.size;
    data = new char[size+1];
    strcpy(data,str.data);
}
// 析构函数
String::~String(){
    delete[] data;
}
// 字符串连接
String String::operator+(const String &str){
    String newStr;
    //释放原有空间
    delete[] newStr.data;
    newStr.size = size + str.size;
    newStr.data = new char[newStr.size+1];
    strcpy(newStr.data,data);
    strcpy(newStr.data+size,str.data);
    return newStr;
}
// 字符串赋值
String & String::operator=(const String &str){
    if(data == str.data){
        return *this;
    }//if
    delete [] data;
    size = str.size;
    data = new char[size+1];
    strcpy(data,str.data);
    return *this;
}
// 字符串赋值
String& String::operator=(const char* str){
    if(data == str){
        return *this;
    }//if
    delete[] data;
    size = strlen(str);
    data = new char[size+1];
    strcpy(data,str);
    return *this;
}
// 判断是否字符串相等
bool String::operator==(const String &str){
    return strcmp(data,str.data) == 0;
}
// 获取字符串长度
int String::length(){
    return size;
}
// 求子字符串[start,start+n-1]
String String::substr(int start, int n){
    String newStr;
    // 释放原有内存
    delete [] newStr.data;
    // 重新申请内存
    newStr.data = new char[n+1];
    for(int i = 0;i < n;++i){
        newStr.data[i] = data[start+i];
    }//for
    newStr.data[n] = ‘\0‘;
    newStr.size = n;
    return newStr;
}
// 重载输出
ostream & operator<<(ostream &o, const String &str){
    o<<str.data;
    return o;
}

本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1847398

笔试题集锦