via威盛——笔试题3

 
我做的 杭州研发题CAHZ-01, CAHZ-02(软件工程师,测试工程师):
1、软件工程考了一个选择填空题目: 关于 UML 的用例之类的
2、考了很多的sizeof()值, 去年也考了很多,如:对指针(4字节),对函数中的传进来的形式参数--数组名(当作指针,也是4字节)-----题目说明了是32位系统
3、操作系统也考了很多,如:进程之间通信的三种方法(共享存储器,消息缓冲、共享文件--还好有准备,因为申请的职位要求里明确说要熟悉OS)并举例说明;
进程的实体(程序、数据集合以及进程数据结构)
4、编程题目主要是改错,强烈建议看看《C/C++高质量编程指南》,好多问题都在里面,如:(1)返回局部变量,
(2)在判断语句中char c =='/t',如何避免写成c='/t'(只要换个方向't'==c就OK了)
(3)对申请的内存指针有效性的判断
(4)char *str 1= "hello",char *atr2=" world !",char *str3=strcat(str1,str2)---会发生什么错误(注:内存不能写)并改错。

5、类函数的编写(2个)(关于operator ++),还有一个返回类型是const对象,问其原因?
Class A{
A & operator++();
Const A operator++(int)
}

6、库函数调用和系统调用的区别?// C 专家编程》 A.4

7、趣味题目:设有一个数ABC,且CBA,BAC,CAB,ACB,BCA之和为3406,问ABC为什么
(我推出的答案是368,根据题目先可以推出C为偶数,然后一个一个判断,考虑进位,以及最大进几。这是最后一题)
8、 写一个函数或宏定义,判断 a 是否是无符号数?// C 专家编程》 A.6
无法用函数定义,因为函数的参数的类型是指定的
#define ISUNSIGNED(a) ((a) >= 0 && (-a) >= 0)
如果宏的参数是一个类型则
#define ISUNSIGNED(type)  (( type 0 -1 > 0
9、数组指针/指针数组的使用
10、结构的内存对齐问题 (#pragma push)
__attribute__((packed));
11、 主程序与子程序间的参数传递三种方式:存储器传递、寄存器传递和 ______ (堆栈传递)————当时是蒙的呵呵
// 注: 4.2 主程序与子程序间的参数传递
4.2.1
利用寄存器传递参数
4.2.2
利用约定存储单元传递参数
4.2.3
利用堆栈传递参数
4.2.4
利用 CALL 后续区传递参数

注意 : 原来什么库函数与系统调用函数的区别、以及北京试题中的文件描述符与文件指针的区别, …… 都来自于《 C 专家编程》这本书。强烈建议看看!!!
后面的2套题目,是在最后的时候看了一遍,估计有遗漏:
///
硬件工程师:
1、设计一个8位的二进制计数器。---是数字逻辑中的内容(任何方法都可以)
2、一个布尔表达式的化简
3、第一道题目是电路题目(计算电流的)---不太懂
4、一道推理题目(与申请CAHZ04-08的一样,就是问魔术师如何放卡片)
5、与软件工程师的题目一样(关于ABC的数字推理)
6、还考了一个好象什么通信编码的原理?

///
申请CAHZ04-08的题目(感觉是三套题目里最难的)
1、TCP三次握手
2、 linux 内核中 buddy 的实现( C 语言或伪代码) ------ 这道题目好象在哪里见过?
3
、开机引导,访问内存地址为 0 ,如何实现
4、 数字签名算法有哪些?数字信封的原理?
5
、设计一个软件:通过一个热键,可以从一个 linux OS 切换到 windows 系统,反之,也可以。而且当从当前的 linux 系统切换到 window 系统,再次切换的时候,也回到原来的 linux 系统。反之也可以。
6、MPEG4、MPEG1/2、MP3
7、DSP 与通用处理器的区别
8、10棵树,要求种成5行,且每行4课,怎么做?
9、 魔术师放卡片:有一百张卡片(忘了是不是从0开始),每张上都写了数字(1-100),有三个箱子(红、绿、蓝(好象)),魔术师把100张卡片放到三个箱子中,每个箱子至少一个,然后一个观众从中选择两个箱子,再从两个箱子中各选出一个卡片,让观众告诉魔术师这两张卡片上数字之和的结果,然后魔术师就可以知道是哪两个数字。问:魔术师是怎么放卡片的?
10、一个总经理在一个郊外的一个公司上班,从公司回家,要先搭乘火车,然后坐自己的私人汽车回家(有私人司机,每天都准时在哪里等,总经理一下车就坐车回家)。
有一天,那个司机晚出发半小时,待总经理下车的时候,没有看到司机,为了不晚点回家怕被老婆骂,于是急忙走路往回走,在路上碰到司机,然后就司机掉头往回走。但是还是迟大家,而且比平时足足晚了22分钟。问总经理走了多长时间的路?
(注:对于题目中的 准时,应该还有什么含义,不知道怎么表述,没有认真看,不知道是怎么绘事了)
11、最后一题目是:代码优化
涉及两个vetor向量的乘积(好象)
12、关于运动员的题目(题目大概意思是这样的):就是有100个运动员,每个运动员都有一个号码(1-100),当比赛结束的时候,每个运动员都会有一个名次,运动员都把自己的号码与所得的名次相加?问是否存在相等的两个数。列出所有的可能?//好象有点不对
发信人: floral (知足常乐·大宝,沙包有喜), 信区: job
标 题: 威盛笔试题(Advance Software Development Engineering)
发信站: 兵马俑BBS (Sat Oct 29 11:34:20 2005), 转信(202.117.1.8)
 
 
Advanced Software Development Engineering
I.The following code may have some errors, if they have, please point out and
correct.
1.char foo(void)
{unsigned int a=6;
int b=-20;
char c;
(a+b>6)?(c=1):(c=0);
return c;
}
不管如何,这无符号整型问题的答案是输出是 ">6" 。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此 -20 变成了一个非常大的正整数,所以该表达式计算出的结果大于 6
不过 vc 中结果为 -14
2.    #define MAX 255
int main()
{unsigned char A[MAX],i;
for(i=0;i <=MAX; i++)
A[i]=i;}
3.Interrupts are an important part of embedded systems. Consequently, many
compile vendors offer an extension to standard C to support interrupts.
Typically, the keyword is _interrupt. The following routine(ISR). Point out the
errors in the code.
 
_interrupt double compute_area(double radius)
{
double area=PI*radius*radius;
 printf(“/nArea=%f”,area);
return area;
}
这个函数有太多的错误了,以至让人不知从何说起了:
 
   1)ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。
 
   2) ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。
 
   3) 在许多的处理器 / 编译器中,浮点一般都是不可重入的。有些处理器 / 编译器需要让额处的寄存器入栈,有些处理器 / 编译器就是不允许在 ISR 中做浮点运算。此外, ISR 应该是短而有效率的,在 ISR 中做浮点运算是不明智的。
 
   4) 与第三点一脉相承, printf() 经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了
II.1.what will be the output of the following C code?
#define product(x) (x*x)
main()
{
 int i=3,j,k;
 j=product(i++);
k=product(++i);
printf(“j=%d,k=%d”,j,k);
}
Vc j=9,k=49
Answer: j=? k=?
 
2. in a 32-bit computer system, what will be the output of the following code?
Char str[]=”hello”;
Char *p=str;
Int n=10;
Answer: sizeof(str)=? Sizeof(p)=? Sizeof(n)=?
6,4,4
sizeof(*p) 1
III.     Answer the following questions(30mark)
1.       what results after run the following code?
int *ptr;
ptr=(int *)0x8000;
*ptr=0xaabb;
设置一绝对地址为 0x8000 的整型变量的值为 0xaa66
2.what does the keyword “const” mean in C program? Please at least make two examples about the usage to const.
1) 关键字 const 的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用 const 的程序员很少会留下的垃圾让别人来清理的。)
 
   2) 通过给优化器一些附加的信息,使用关键字 const 也许能产生更紧凑的代码。
 
   3) 合理地使用关键字 const 可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少 bug 的出现。
3.In embedded system, we usually use the keyword “volatile”, what does it mean?
一个定义为 volatile 的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是 volatile 变量的几个例子:
 
   1) 并行设备的硬件寄存器(如:状态寄存器)
 
   2) 一个中断服务子程序中会访问到的非自动变量 (Non-automatic variables)
 
   3) 多线程应用中被几个任务共享的变量
4.what’s big endiam and little endiam? Please write a program to judge if a computer is big endiam or little endiam.
 
5.when we write some large-scale project, we usually write some makefile. What’s the action of makefile?
只编译和生成修改的
6.what’s the difference between linux and uclinux?
 
IV.      Program
1.       write a function about string copy(10mark)
strcpy prototype: char *strcpy( char *strDest, const char *strSrc);
Here strDest is destination string, strSrc is source string.
(1)      write the function strcpy. Don’t call c/c++ string library.
(2)      Here strcpy can copy strSrc to strDest, but why we use char* as the
return value of strcpy?
char *strcpy( char *strDest, const char *strSrc)
主要是为了使得 strcpy 能作为右值
2.       class string’s protatype(25mark)
calss String {
 Public: string (const char *str=NULL);//default constuctor
        String (const string &other);//copy constructor
        ~string (void);//destructor
        string &operate=(const string &other);//operator overloading
Private char *m_data;//
}
          please write the class string’s four member function
 
3.       you must have participated in the R&D for some projects before. Please
select the most valuable case and briefly introduce the relevant development
process, you role in the project. The most difficult problem you met in your
project, and how did you solve it.
简要介绍最有价值的事情,相关过程,你的角色,项目中最大的困难你如何解决它的?
发信人: funbull (奋牛), 信区: job
标 题: VIA笔试回忆录
发信站: 兵马俑BBS (Sat Oct 29 14:27:28 2005), 转信(202.117.1.8)
 
1.编写一段实现十进制数转换为十六进制数的程序。
 
2.解释静态和非静态成员函数的区别。
静态成员函数静态成员函数没有this 指针,只能访问静态成员变量
而非静态成员函数均可访问
3.列出C++语言的3个主要特点。
(1) C++ 保持与 C 兼容。
    (2) C++ 编写的程序可读性更好 , 代码结构更为合理 , 可直接地在程序中映射问题空间的结构。
    (3)  生成代码的质量高 , 运行效率仅比汇编语言代码段慢 10% 20%
    (4) 从开发时间、费用到形成的软件的可重用性、可扩充性、可维护性和可靠性等方面有了很大的提高 , 使得大中型的程序开发项目变得容易的多。
(5)  支持面向对象的机制 , 可方便地构造出模拟现实问题的实体和操作
 
4.说出 TOP-DOWN BOTTOM-UP是什么?你通常怎样使用它。
 
5.什么是makefile文件。
makefile 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中, makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。
 
makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。
6.写出下面这段程序的结果。
class testa
{
public :
    static int a;
    int b;
    testa(int x)
    {
       a=x;
       b=a+x;
    }
};
int testa::a=0;
void main()
{
    using namespace std;
    testa b1(5), b2(12);
    cout << b1.a <<b1.b << b2.a << b2.b <<endl;
}
写出b1.a,b1.b,b2.a,b2.b的值。
B1.a = 12
B1.b = 10
B2.a = 12
B2.b = 24
还有些题目,记不太清楚了,希望知道的同学能够补充上。
 
发信人: San (哈达~孤独的杀手带着把生锈的剑), 信区: job
标 题: VIA笔试题目
发信站: 饮水思源 (2005 年10月29日17:31:28 星期六), 站内信件
 
自己考的是应用软件开发工程师的题目。
 
第一个考概念,写出指向函数的指针,指向一个数组的指针,或者一个数组,里面
的元素全是指针什么的,基本对指针概念清楚的都应该是送分的。
 
unsigned int i=9
 
char p[10];
 
while(i>=0)
 
{
 
p=(char)i;
 
i--;
 
}
 
问会出现什么问题?
I 是无符号整型,始终大于 0
int i,n=2005;
 
main()
 
{
 
for(i=0;i<n;i--)
 
printf("3S");
 
}
 
问怎么只改一个字母输出2005个3S
 
~3&(2&3^4)=?
4
运算符优先级的记忆
int fun(int *c){return 0;}
 
void main(){
 
int(*a)(int *b)=fun,*b(),w[10],c;
 
}
 
问下列那个对fun的调用是对的
 
c=a(w),(*a)(&c),b=*b(w),fun(b)
前两个对的
环形公路不均匀分布 n 个加油站,所有加油站的油加起来正好够一圈,油箱一开始为
空的,容量不限,且耗油均匀,问那个加油站出发可以跑完一圈
 
其他的记不清了
 
请进行优化:   
   
 long    multiple(int   vertical1[],   int   vertical2[],int   value)   
 {   
          int   i   =0;  
          int   sum=0;  
          for(i=0;i<value;i++){  
          if(i&0x01)  
                  sum   -=   (vertical1[i]*vertical2[i])>>16;  
          else  
                  sum   +=   (vertical1[i]*vertical2[i])>>16;  
          }  
          return   sum;  
 }   
long   multiple(int   *vertical1,   int   *vertical2,int   value)  
  {  
          int   i   =0;  
          int   sum=0;  
          WORD   dSum=0;  
          for(int   i=0;i<value;){     //
借用楼上对 if 的优化代码  
                dSum+=(*++vertical1   *   *++vertical2);  
                ++i;  
                dSum-=(*++vertical1   *   *++vertical2);    
                ++i;    
  }  
          }  
          sum=(int)(dSum>>16);     //
只做一次右移  
          return   sum;  
  }
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值