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

本文涵盖C++编程中的多项挑战,包括变量与函数的跨文件访问、条件语句解析、循环控制、素数判断、闰年计算、结构体操作、冒泡排序、回文数判断、内存端序检测、字符串逆序、字符类别统计、归并排序变体、用户交互计算、数组比较、链表操作、虚函数与多态应用、数组元素插入、STM32时钟配置、ADC精度计算与数据采集等,旨在提升读者的C++编程技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


初试试题(复试从里边抽查现场做)
 
姓    名:                                   应聘职位:                              
学    校:                                   专    业:                              
电    话:                                   邮    箱:                             
 
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 <iostream>
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<iostream>
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<iostream>
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"<< p ->subjectOne <<endl;
    // cout<< "the value of p"<< (p + 3)->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 " << p->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<iostream>
using namespace std;
 
void bubble_sort(int * arr, int arr_length){
    for(int i=0;i<arr_length;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,3,45,6,9,200,80,1009,65,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<<arr1[i]<<", ";
    }
 
    cout<<endl;
 
    return 0;
}
 
 
 
知识点: 判断回文,大中公司可能考
9、输入任意正整数,编程判断该数是否为回文数(回文数是指从左到右读与从右到左读一样,如12321)。
 
#include<iostream>
//#include<cstdio>
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 <iostream>
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()   <cstring>
#include<iostream>
#include<cstring>
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 <iostream>
#include <string>
#include <ctype.h>
using namespace std;
 
void statistic(char * str){
    int numbers = 0, letters = 0, others = 0;
    while(*str!= '\0'){
        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<iostream>
using namespace std;
 
void merge(int a[],int b[],int temp[],int len_a,int len_b);
 
void merge(int a[],int b[],int temp[],int len_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] = '\0';
}
 
int main(){
    
    int a[] = { 9, 4, 2};
    int b[] = {-100, -8, 11, 99 ,100, 300};
    int temp[20]; // '\0'
    
    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 != '\0'){
        cout<<*p<<" ,";
        p ++;
    }
 
    cout<<endl;
    return 0;
}
 
知识点: 你猜    
13、在VC++ 6.0中设计一段程序,实现以下功能:(1)要求用户输入一个整数;(2)要求用户输入一个运算符(+  -  *  / );(3)要求用户输入一个整数;(4)输出步骤1输入的整数与步骤3输入的整数,根据步骤2进行运算的结果。
 
#include<iostream>
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,45,2,5,78,9,36,40,43], Array_B [ 13,45,2,6,8,9,37,40,43],设计程序对两个数组进行比较,显示出数组中哪些数不同,分别在什么位置。
#include<iostream>
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,45,2,5,78,9,36,40,43};
    int Array_B[] = {13,45,2,6,8,9,37,40,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 <iostream>
#include <string>
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 ,string , int, int);
private:
    int salary_added;
};
 
void Graduate::setAttributes(long int s, string n, 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,8,14,19,21,45,52,56,64,77}中,且插入后该数组仍是升序数组,具体步骤(1)显示已是升序的数组;(2)显示“输入一个数:”,并从键盘获取一个数;(3)将插入数之后的数组显示出来。
// 数组
// vector
 
 
// 方法1, 使用数组来存储数据
#include <iostream>
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 ++];
        }
    }
 
    //!    '\0'
    arr_new[index_new] = '\0';
}
 
int main(){
    int arr[] = {2,8,14,19,21,45,52,56,64,77};
 
    int length = sizeof(arr)/sizeof(arr[0]);
    
    // (1)显示已是升序的数组
    cout<<"本来的数组: ";
    for(int index = 0; index < length; index++){
        cout<<arr[index]<<", ";
    }
    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<<arr_new[i]<<", ";
        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多。转正未知
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值