某公司初中级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 <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公司非常看重学校,学历,而大上海更看重能力.
总之该公司的题目出得很好,特意贴出来提供给大家分享。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值