初试试题(复试从里边抽查现场做)
姓 名: 应聘职位:
学 校: 专 业:
电 话: 邮 箱:
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多。转正未知
这是苏州一家公司招C++工程师的题目,上边是我写的答案,各位读者请多多指教。
对苏州IT公司的感想:苏州的IT公司非常看重学校,学历,而大上海更看重能力.
总之该公司的题目出得很好,特意贴出来提供给大家分享。