C# · 12月 20, 2021

某公司初中级C++笔试题目

初试试题(复试从里边抽查现场做)

姓    名:                                   应聘职位:                              

学    校:                                   专    业:                              

电    话:                                   邮    箱:                             

1、如何实现变量的跨文件访问?如何实现函数的跨文件访问?

访问文件外的变量时,使用关键字”extern”。

用于跨文件访问的函数在声明时,加关键字”extern”。

2、假定w、x、y、z、m均为int型变量,有如下程序段:

   w=1;x=2;y=3;z=4;

   m=(w<x)?w:x;  m=(m<y)?m:y;  m=(m<z)?m:z;

//  m=2;          m=3;          

则该程序段执行后,m的值是______A___.

A) 4         B) 3         C) 2         D) 1

3、以下程序段_______D___.

 x=-1;

  do

  {

    x=x*x; 

  }  while (!x);

A)是死循环         B)循环执行两次  

C)循环执行一次     D)有语法错误

知识点:素数

4、在VC++ 6.0中编程:输出100~300中素数及素数的个数。

#include

using namespace std;

bool isPrime(int num); 

bool isPrime(int num){

    for(int divisor = 2; divisor < num; divisor ++){

        if( num % divisor == 0 )

            return false;

    }

    return true;

}

int main(){

    int start = 100;

    int end =300;

    int count = 0;

    for(int index = start; index <= end; index ++){

        if(isPrime(index)){

            cout<<index<<" "; 

            count ++ ;

        }

    }

    

    cout << endl;

    cout<<"prime datas in total:"<< count<< endl;

    return 0;

}

知识点:闰年

5、在VC++ 6.0中编写代码,输出1000年(包括1000年)到1999年之间的所有闰年,要求每三个一行,分行输出。

#include

using namespace std;

int main(){

    int start = 1000;

    int end = 1999;

    int count = 0;

    for(int year = start ; year < end; year ++){

        if(year % 400 == 0 || ((year % 4 == 0) && (year % 100 !=0))){

            count ++ ;

            cout << year<< " ";

            if(count % 3 == 0)

                cout<<endl;

        }

    }

    return 0;

}    

知识点:结构体

6、使用VC++ 6.0编程:有4名学生,每个学生考4门课,要求:写2个函数:(1)返回值为总平均分的函数;(2)返回值为最低分的函数。在main()函数中输入每个学生4门课的成绩,调用以上2个函数,输出总平均分和最低分。

#include

using namespace std;

struct Student{

    float subjectOne;

    float subjectTwo;

    float subjectThree;

    float subjectFour;

    };

//(1)返回值为总平均分的函数;

float average_total(struct Student *p){

    float result = 0.0;

    int numOfSubjects = 0;

    // cout<< "the value of p"<subjectOne <<endl;

    // cout<< "the value of p"<subjectOne <<endl;

    for(struct Student * i = p; i < p + 4; i ++){

        result = result + i->subjectOne + i->subjectTwo + i->subjectThree + i->subjectFour;

        numOfSubjects += 4;

    }

    

    result /= numOfSubjects;

    //也可以写死固定只有一个小数

    return result;

}

//(2)返回值为最低分的函数。

float lowerest(struct Student *p){

    float result = p->subjectOne;

    for(struct Student * i = p; i < p + 4; i ++){

        if( result > i->subjectOne)

            result = i->subjectOne;

        if( result > i ->subjectTwo)

            result = i ->subjectTwo;

        if(result > i->subjectThree)

            result = i->subjectThree;

        if(result > i->subjectFour)

            result = i->subjectFour;

    }

    return result;

}

int main(){

    struct Student stu[4] = {{100,90.5,88.5,93},

                            {70,70.5,78.5,73}, 

                             {60.9,40,66.5,67}, 

                            {50.5,55,68.9,44}};

   

    cout<<"the average :"<< average_total(stu)<<endl;

    // cout << "the address of subjectOne " <subjectOne <<endl;

    cout<<" the lowest subject is: "<< lowerest(stu)<<endl;

    // cout<<stu[1].subjectOne;

    

    cout<<endl;

    return 0;

}

知识点: 冒泡算法,小公司可能考

7、有如下数组 Array_A[ 203,3,45,6,9,200,80,1009,65,49 ] 使用冒泡算法,将数组从小到大进行排序。

#include

using namespace std;

void bubble_sort(int * arr,int arr_length){

    for(int i=0;i

        for(int j = 0; j< arr_length – i; j++)

        {

            if(arr[j] > arr[j+1]){

                int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1]=temp;

            }

        }

}

int main(){

    //Array_A

    int arr1[] = {203,49};

    int arr_length = sizeof(arr1)/sizeof(arr1[0]);

    // cout<< arr_length <<"yes"<<endl;

    bubble_sort(arr1,arr_length);

    cout<<endl;

    

    cout<<"the array after bubble sort:"<<endl;

    for(int i = 0 ; i < arr_length; i++){

        cout<

    }

    cout<<endl;

    return 0;

}

知识点: 判断回文,大中公司可能考

9、输入任意正整数,编程判断该数是否为回文数(回文数是指从左到右读与从右到左读一样,如12321)。

#include

//#include

using namespace std;

//求出整数的长度

int myStrlen(int num){

    int result = 0;

    while(num){

        result += 1;

        num /= 10;

    }

    return result;

}

int main(){

    int num;

    cout<<"input a positive number"<<endl;

    cin>>num;

    bool ispalindrome = true;

    

    //没有检测num是负数,零和小数,大整数等情况了;

    char stringOfNum[10];

    //将整数转换为字符串的形式,便于检测是否是回文形式

    itoa(num,stringOfNum,10);

    

    int lenOfString = myStrlen(num);

    //cout<< "lenOfString "<<lenOfString;

    int end = (lenOfString + 1) / 2;

    for(int i = 0; i < end; i ++){

        if(stringOfNum[i] != stringOfNum[lenOfString – i – 1]){

            ispalindrome = false;

            break;

        }

    }

    

    if(ispalindrome)

        cout<<"是回文"<<endl;

    else

        cout<<"不是回文"<<ispalindrome<<endl;

    //cout<<"the length is: "<<len<<endl;

    //cout<<"the num"<<num;

    return 0;

}

!这一题哪里去了,汗

8. 

9、写一段C语言代码,来验证处理器的存储方式是大端存储还是小端存储。

#include

using namespace std;

int checkcpu();

int main(){

    bool small = true;

    small = checkcpu();

    if(small)

        cout<<"小端存储"<<endl;

    else

        cout<<"大端存储"<<endl;

    //cout<<j<<endl;

    return 0;

}

int checkcpu(){

    union w{

        int a;

        char b;

    } c;

    c.a = 1;

    return(c.b == 1);

}

知识点: 字符串的逆序,大公司试题,比如baidu校招

10、编程:完成字符串’ILOVEMATLAB’的逆序操作。

// strle()  

#include

#include

using namespace std;

void reverseString(char * str){

    int    lenOfString = strlen(str);

    char * p1;

    char * p2;

    p1 = str;

    p2 = str + lenOfString – 1;

    char temp;

    while(p1 < p2){

        temp = *p1;

        *p1 = *p2;

        *p2 = temp;

        p1 ++;

        p2 –;

    }

}

int main(){

    char str[] = “ILOVEMATLAB”;

    reverseString(str);

    cout<<"after the reverse function: "<<str<<endl;

    return 0;

}

知识点:字符类别的判断

11、在VC++ 6.0中编程:输入一行字符,分别统计其中包含的数字、字母和其他字符的个数,并将统计结果显示出来。

#include

#include

#include

using namespace std;

void statistic(char * str){

    int numbers = 0,letters = 0,others = 0;

    while(*str!= ”){

        if(isdigit(*str))

            numbers ++;

        else if(isalpha(*str))

            letters ++;

        else

            others ++;

        str++;

    }

    cout<<"数字有: "<<numbers<<" 个"<<endl;

    cout<<"字母有: "<<letters<<" 个"<<endl;

    cout<<"其他的字符(包括空格)有: "<< others <<" 个"<<endl;

}

int main(){

    char str[100]; //

    gets(str);

    statistic(str);

    cout<<endl;

    return 0;

}

知识点: 归并排序的变通

12、函数 merge(int a[],int b[],int temp[],int len_a,int len_b)的功能是:将降序的a和升序的b合并成一个新的升序序列temp。编写main函数,调用merge函数进行合并,输出合并后的结果。

#include

using namespace std;

void merge(int a[],int len_b);

void merge(int a[],int len_b){

    int * p_a = a + len_a – 1;

    int * p_a_begin = a;

    int * p_b = b;

    int * p_b_end = b + len_b – 1;

    int index = 0;

    

    //两个指针分别从a[]的尾部和b[]的头部开始

    while(p_a >= p_a_begin && p_b < p_b_end){

        if(*p_a > *p_b){

            temp[index++] = *p_b;

            p_b ++;

        }

        else{

            temp[index++] = *p_a;

            p_a –;

        }

    }

    

    while(p_a >=  p_a_begin){

        temp[index++] = *p_a;

        p_a — ;

    }

    while(p_b <= p_b_end){

        temp[index++] = *p_b;

        p_b ++ ;

    }

    

//    index++;

    temp[index] = ”;

}

int main(){

    

    int a[] = { 9,4,2};

    int b[] = {-100,-8,11,99,100,300};

    int temp[20]; // ”

    

    int len_a = sizeof(a)/sizeof(a[0]);

    int len_b = 6;

    merge(a,b,temp,len_a,len_b);

    cout<<"合并后的结果: ";

    

    int * p = temp;

    while(*p != ”){

        cout<<*p<<",";

        p ++;

    }

    cout<<endl;

    return 0;

}

知识点: 你猜    

13、在VC++ 6.0中设计一段程序,实现以下功能:(1)要求用户输入一个整数;(2)要求用户输入一个运算符(+  –  *  / );(3)要求用户输入一个整数;(4)输出步骤1输入的整数与步骤3输入的整数,根据步骤2进行运算的结果。

#include

using namespace std;

int main(){

    int integer1,integer2;

    char operator1;

    cout<<"请输入一个整数:";

    cin>>integer1;

    cout<<endl;

    cout<<"输入(+  –  *  / )中的一个运算符:";

    cin>>operator1;

    cout<<endl;

    cout<<"请再输入一个整数:";

    cin>>integer2;

    cout<<endl;

    

    cout<<"结果是:";

    switch(operator1){

        case ‘+’: 

            cout<< integer1 + integer2; break;

        case ‘-‘: 

            cout<< integer1 – integer2; break;

        case ‘*’:

            cout<< integer1 * integer2; break;

        case ‘/’:

            cout<<integer1 / integer2; break; //C++的整除问题

        default:

            cout<<" 输入有误!";

    }

    cout<<endl;

    return 0;

}    

知识点: 你猜

14、已知数组Array_A [ 13,2,5,78,36,43], Array_B [ 13,8,37,43],设计程序对两个数组进行比较,显示出数组中哪些数不同,分别在什么位置。

#include

using namespace std;

void compare(int * a,int * b,int length){

    for(int index = 0; index < length; index ++){

        if(a[index] != b[index]){

            cout<<"位置 "<<index<<" 的数字不同(索引从0开始)"<<endl;

        }

    }

}

int main(){

    int Array_A[] = {13,43};

    int Array_B[] = {13,43};

    int length = sizeof(Array_A)/sizeof(Array_A[0]);

    compare(Array_A,Array_B,length);

    return 0;

}

15、画出单向链表进行插入与删除的流程,并使用VC++6.0 将此过程在DOS窗口中进行演示。

表中:

表尾部:

删除:

//网友们,Word上作的图贴上来比较麻烦,我没贴上来了哦

知识点: 虚函数,多态,OO

16、在VC++ 6.0中定义一个学生类Student做基类,再派生一个Graduate类,学生类有学号、姓名、和分数,研究生增加工资,它们有同名的函数display(),利用虚函数,编程分别输出学生和研究生的数据,显示如下所示:

学生

学号 1

姓名 张三

分数 80

研究生

学号 2

姓名 李四

分数 85

工资 5000

///注意派生类的构造函数的基类参数表不用类型

#include

#include

using namespace std;

class Student{

public:

    Student(){}

    ~Student(){}

    virtual void display();

    void setAttributes(long int,string,int );

//private:

protected:

    long int studentID;

    string name;

    int score;

};

void Student::setAttributes(long int s,string n,int sr){

    studentID = s;

    name = n;

    score = sr;

}

void Student::display(){

    cout<<"学号: "<< studentID <<endl;

    cout<<"姓名: "<< name <<endl;

    cout<<"分数: "<< score << endl;

}    

class Graduate: public Student{

public:

    Graduate(): Student() {}

    ~Graduate(){}

    void display();

    void setAttributes(long int,int,int);

private:

    int salary_added;

};

void Graduate::setAttributes(long int s,int sr,int sa){

    studentID = s;

    name = n;

    score = sr;

    salary_added = sa;

}

void Graduate::display(){

    cout<<"学号: "<< studentID <<endl;

    cout<<"姓名: "<< name <<endl;

    cout<<"分数: "<< score << endl;

    cout<<"工资: "<< salary_added << endl;

}

int main(){

    //Student s;

    Student * s;

    s = new Student();

    s->setAttributes(1,”张三”,80);

    cout<<"学生"<<endl;

    s->display();

    delete s;

    cout<<endl<<endl;

    

    Graduate * g;

    g = new Graduate();

    g -> setAttributes(2,”李四”,85,5000);

    cout<<"研究生"<<endl;

    g ->display();

    delete g;

    return 0;

}

知识点:数组中元素的插入,数组越界问题,可变数组vector(我没写这个解法)

17、在VC++ 6.0中编写一个函数,将一个数插入到已是升序的数组{2,14,19,21,52,56,64,77}中,且插入后该数组仍是升序数组,具体步骤(1)显示已是升序的数组;(2)显示“输入一个数:”,并从键盘获取一个数;(3)将插入数之后的数组显示出来。

// 数组

// vector

// 方法1, 使用数组来存储数据

#include

using namespace std;

int arr_new[100];

void ascend_insert(int * arr,int length,int value){

    

    int index = 0;

    int index_new = 0;

    bool first = true;

    while(index < length){

        // 小于所插入值的部分

        if(arr[index] < value){

            arr_new[index_new ++ ] = arr[index ++];

        }

        else if(arr[index] > value && first){

            arr_new[index_new ++] = value;

            first = false;

        }

        else{

            arr_new[index_new ++ ] = arr[index ++];

        }

    }

    //!    ”

    arr_new[index_new] = ”;

}

int main(){

    int arr[] = {2,77};

    int length = sizeof(arr)/sizeof(arr[0]);

    

    // (1)显示已是升序的数组

    cout<<"本来的数组: ";

    for(int index = 0; index < length; index++){

        cout<

    }

    cout<<endl;

    // (2)显示“输入一个数:”,

    int value;

    cout<<"输入一个数:";

    cin>>value;

    cout<<endl;

    

    int length_new = length + 1;    

    

    ascend_insert(arr,length,value);

    //(3)将插入数之后的数组显示出来。

    int i = 0;

    while(i < length_new){

        cout<

        i ++;

    }

    cout<<endl;

    

    return 0;

}

后面三道题目,没有学过,我不会,就先没动

18、在IAR中写一段代码完成处理器STM32F103ZET6的时钟初始化,处理器使用内部8M时钟晶振,将处理器的主频设置为48M。

19、已知AD采集的精度为12位,AD的基准电压为3V,如果输入的电压为1.67V,那么AD采集到的数值是多少?写出计算过程,此AD可达到的最小分辨率是多少?

20、在IAR中写一段程序实现以下功能: 在STM32F103ZET6的处理器上,设置AD的采样频率为1KHz,采样精度为12位,对电压进行数据采集。

说明:

1、本试卷不限定试题完成的时间;

2、本公司可接受暂未结业或未拿到毕业证的实习生。有意向者,只需将完成的初试题连同

个人简历一起反馈给我们,各部门负责人会进行专业地评估;

3、若面试者首次面试成绩不理想,自我学习后可再次参加面试。

工资:实习 第一个月4200多,二个月5200多,第三个月6200多。转正未知