软件工程师c语言笔试(推荐7篇)
char 一个字节 1 byte int 两个字节 2 byte(16位系统, 认为整型是2个字节)long int 四个字节 4 byte float 四个字节4 byet double 八个字节 8 byte long double 十个字节 10 byte pointer 两个字节 2 byte(注意, 16位系统, 地址总线只有16位)第1题: 考查对volatile关键字的认识 #include static jmp_buf buf;main(){ volatile int b;b =3;if(setjmp(buf)!=0){ printf(“%d “, b);exit(0);} b=5;longjmp(buf , 1);} 请问, 这段程序的输出是(a)3(b)5(c)0(d)以上均不是 第2题:考查类型转换 main(){ struct node { int a;int b;int c;};struct node s= { 3, 5,6 };struct node *pt = &s;printf(“%d” , *(int*)pt);} 这段程序的输出是:(a)3(b)5(c)6(d)7 第3题:考查递归调用 int foo(int x , int n){ int val;val =1;if(n>0){ if(n%2 == 1)val = val *x;val = val * foo(x*x , n/2);} return val;} 这段代码对x和n完成什么样的功能(操作)?(a)x^n(x的n次幂)(b)x*n(x与n的乘积)(c)n^x(n的x次幂)(d)以上均不是
第4题:考查指针,这道题只适合于那些特别细心且对指针和数组有深入理解的人 main(){ int a[5] = {1,2,3,4,5};int *ptr =(int*)(&a+1);printf(“%d %d” , *(a+1), *(ptr-1));} 这段程序的输出是:(a)2 2(b)2 1(c)2 5(d)以上均不是
第5题:考查多维数组与指针 void foo(int [][3]);main(){ int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}};foo(a);printf(“%d” , a[2][1]);} void foo(int b[][3]){ ++ b;b[1][1] =9;} 这段程序的输出是:(a)8(b)9(c)7(d)以上均不对 第6题:考查逗号表达式 main(){ int a, b,c, d;a=3;b=5;c=a,b;d=(a,b);printf(“c=%d” ,c);printf(“d=%d” ,d);} 这段程序的输出是:(a)c=3 d=3(b)c=5 d=3(c)c=3 d=5(d)c=5 d=5 第7题:考查指针数组 main(){ int a[][3] = { 1,2,3 ,4,5,6};int(*ptr)[3] = a;printf(“%d %d “,(*ptr)[1],(*ptr)[2]);++ptr;printf(“%d %d” ,(*ptr)[1],(*ptr)[2]);} 这段程序的输出是:(a)2 3 5 6(b)2 3 4 5(c)4 5 0 0(d)以上均不对 第8题:考查函数指针 int *f1(void){ int x =10;return(&x);} int *f2(void){ int*ptr;*ptr =10;return ptr;} int *f3(void){ int *ptr;ptr=(int*)malloc(sizeof(int));return ptr;} 上面这3个函数哪一个最可能引起指针方面的问题(a)只有 f3(b)只有f1 and f3(c)只有f1 and f2(d)f1 , f2 ,f3 第9题:考查自加操作(++)main(){ int i=3;int j;j = sizeof(++i+ ++i);printf(“i=%d j=%d”, i ,j);} 这段程序的输出是:(a)i=4 j=2(b)i=3 j=2(c)i=3 j=4(d)i=3 j=6 第10题:考查形式参数, 实际参数, 指针和数组 void f1(int *, int);void f2(int *, int);void(*p[2])(int *, int);main(){ int a;int b;p[0] = f1;p[1] = f2;a=3;b=5;p[0](&a, b);printf(“%dt %dt”, a, b);p[1](&a, b);printf(“%dt %dt”, a, b);} void f1(int* p , int q){ int tmp;tmp =*p;*p = q;q= tmp;} void f2(int* p , int q){ int tmp;tmp =*p;*p = q;q= tmp;} 这段程序的输出是:(a)5 5 5 5(b)3 5 3 5(c)5 3 5 3(d)3 3 3 3 第11题:考查自减操作(–)void e(int);main(){ int a;a=3;e(a);} void e(int n){ if(n>0){ e(–n);printf(“%d”, n);e(–n);} } 这段程序的输出是:(a)0 1 2 0(b)0 1 2 1(c)1 2 0 1(d)0 2 1 1 第12题:考查typedef类型定义,函数指针 typedef int(*test)(float * , float*)test tmp;tmp 的类型是
(a)函数的指针, 该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments)Pointer to function of having two arguments that is pointer to float(b)整型(c)函数的指针, 该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments),并且函数的返回值类型是整型 Pointer to function having two argument that is pointer to float and return int(d)以上都不是
第13题:数组与指针的区别与联系 main(){ char p;char buf[10] ={ 1,2,3,4,5,6,9,8};p =(buf+1)[5];printf(“%d” , p);} 这段程序的输出是:(a)5(b)6(c)9(d)以上都不对
第14题: 考查指针数组的指针 void f(char**);main(){ char * argv[] = { “ab” ,”cd” , “ef” ,”gh”, “ij” ,”kl” };f(argv);} void f(char **p){ char* t;t=(p+= sizeof(int))[-1];printf(“%s” , t);} 这段程序的输出是:(a)ab(b)cd(c)ef(d)gh 第15题:此题考查的是C的变长参数,就像标准函数库里printf()那样,这个话题一般国内大学课堂是不会讲到的,不会情有可原 #include int ripple(int ,);main(){ int num;num = ripple(3, 5,7);printf(” %d” , num);} int ripple(int n,){ int i , j;int k;va_list p;k= 0;j = 1;va_start(p, n);for(;j{ i = va_arg(p , int);for(;i;i &=i-1)++k;} return k;} 这段程序的输出是:(a)7(b)6(c)5(d)3 第16题:考查静态变量的知识 int counter(int i){ static int count =0;count = count +i;return(count);} main(){ int i , j;for(i=0;i <=5;i++)j = counter(i);} 本程序执行到最后,j的值是:(a)10(b)15(c)6(d)7 详细参考答案 第1题:(b)volatile字面意思是易于挥发的。这个关键字来描述一个变量时, 意味着 给该变量赋值(写入)之后, 马上再读取, 写入的值与读取的值可能不一样,所以说它“容易挥发”的。
这是因为这个变量可能一个寄存器, 直接与外部设备相连, 你写入之后, 该寄存器也有可能被外部设备的写操作所改变;或者, 该变量被一个中断程序, 或另一个进程 改变了.volatile 不会被编译器优化影响, 在longjump 后,它的值 是后面假定的变量值,b最后的值是5,所以5被打印出来.setjmp : 设置非局部跳转 /* setjmp.h*/ Stores context information such as register values so that the lomgjmp function can return control to the statement following the one calling setjmp.Returns 0 when it is initially called.Lonjjmp: 执行一个非局部跳转 /* setjmp.h*/ Transfers control to the statement where the call to setjmp(which initialized buf)was made.Execution continues at this point as if longjmp cannot return the value 0.A nonvolatile automatic variable might be changed by a call to longjmp.When you use setjmp and longjmp, the only automatic variables guaranteed to remain valid are those declared volatile.Note: Test program without volatile qualifier(result may very)更详细介绍, 请参阅 C语言的setjmp和longjmp 第2题:(a)结构题的成员在内存中的地址是按照他们定义的位置顺序依次增长的。如果一个结构体的指针被看成 它的第一个成员的指针,那么该指针的确指向第一个成员 第3题:(a)此题目较难.这个程序的非递归版本 int what(int x , int n){ int val;int product;product =1;val =x;while(n>0){ if(n%2 == 1)product = product*val;/*如果是奇数次幂, x(val)要先乘上一次,;偶数次幂, 最后返回时才会到这里乘以1*/ val = val* val;n = n/2;} return product;} /* 用二元复乘策略 */ 算法描述(while n>0){ if next most significant binary digit of n(power)is one then multiply accumulated product by current val, reduce n(power)sequence by a factor of two using integer division.get next val by multiply current value of itself } 第4题:(c)a的类型是一个整型数组,它有5个成员。&a的类型是一个整型数组的指针, 所以&a + 1指向的地方等同于a[6], 所以*(a+1)等同于a[1] ptr等同a[6], ptr-1就等同与a[5] 第5题:(b)题目自身就给了足够的提示 b[0][0] = 4 b[1][0] = 7 第6题:(c)考查逗号表达式,逗号表达式的优先级是很低的, 比 赋值(=)的优先级 低.逗号表达式的值就是最后一个元素的值
逗号表达式的还有一个作用就是分割函数的参数列表..E1, E2, …, En 上面这个表示式的左右是,E1, E2,… En的值被分别计算出来, En计算出来的结构赋给整个逗号表达式
c=a,b;/ *yields c=a* / d=(a,b);/* d =b */ 第7题:(a)ptr是一个数组的指针, 该数组有3个int成员 第8题:(c)f1显然有问题, 它返回一个局部变量的指针, 局部变量是保存在stack中的,退出函数后, 局部变量就销毁了, 保留其指针没有意义, 因为其指向的stack空间可能被其他变量覆盖了
f2也有问题, ptr是局部变量, 未初始化, 它的值是未知的, *ptr不知道指向哪里了, 直接给*ptr赋值可能会覆盖重要的系统变量, 这就是通常说的野指针的一种 第9题:(b)sizeof 操作符给出其操作数需要占用的空间大小, 它是在编译时就可确定的, 所以其操作数即使是一个表达式, 也不需要在运行时进行计算.(++i + ++ i)是不会执行的, 所以i的值还是3 第10题:(a)很显然选a.f1交换*p 和 q的值, f1执行完后, *p 和 q的值的确交换了, 但q的改变不会影响到b的改变, *p 实际上就是a 所以执行f1后, a=b=5 这道题考查的知识范围很广,包括typedef自定义类型,函数指针,指针数组void(*p[ 2 ])(int *, int);定义了一个函数指针的数组p,p有两个指针元素.元素是函数的指针, 函数指针指向的函数是一个带2个参数,返回void的函数, 所带的两个参数是指向整型的指针, 和整型
p[ 0 ] = f1;p[ 1 ] = f2 contain address of function.function name without parenthesis represent address of function Value and address of variable is passed to function only argument that is effected is a(address is passed).Because of call by value f1, f2 can not effect b 第11题:(a)考查–操作和递归调用,仔细分析一下就可以了 第12题:(c)建议不会的看看C专家编程
从左往有, 遇到括号停下来, 将第一个括号里的东西看成一个整体 第13题:(c)考查什么时候数组就是指针.对某些类型T而言, 如果一个表达式是 T[](T的数组), 这个表达式的值实际上就是指向该数组的第一个元素的指针.所以(buf+1)[5]实际上就是*(buf +6)或者buf[6] 第14题:(b)sizeof(int)的值是2,所以p+=sizeof(int)指向 argv[2],这点估计大家都没有什么疑问(p+=sizeof(int))[-1] 指向 argv[1],能理解吗, 因为(p+=sizeof(int))[-1] 就相当于(p+=2)[-1] ,也就是(p+2-1)第15题:(c)在C编译器通常提供了一系列处理可变参数的宏, 以屏蔽不同的硬件平台造成的差异, 增加程序的可移植性。这些宏包括va_start、va_arg和va_end等。
采用ANSI标准形式时, 参数个数可变的函数的原型声明是:type funcname(type para1, type para2, …)这种形式至少需要一个普通的形式参数, 后面的省略号不表示省略, 而是函数原型的一部分。type是函数返回值和形式参数的类型。
不同的编译器, 对这个可变长参数的实现不一样 , gcc4.x中是内置函数.关于可变长参数,可参阅
关键词:汇编语言,C语言,软件工程,应用
前言:软件工程作为一门工程化方法, 是构建及维护有效的、高质量软件学科, 广泛应用于工业、银行及航空等多个领域发展中, 并发挥着积极的促进作用, 而汇编语言与C语言是低级与高级语言, 各自存在一定优势及缺陷, 如何更好的使用两种语言受到越来越多的关注。至此, 加强对汇编语言及C语言在软件工程应用的研究具有现实意义。
一、汇编语言与C语言概念
汇编语言主要是指汇编指令集、伪指令集及使用规则的总称, 通过具有特点的符号作为助忆符号, 用符号地址等组合成为汇编格式指令[1]。C语言主要是指一种编程语言, 实现简便、效率高且要求低的运行的编程目标, 两种语言都是软件工程编写的基础。
二、汇编语言在软件工程中的应用
汇编语言是建立在传统机器语言基础之上的, 保留了传统语言的优势的同时, 突破了传统语言的弊端, 能够对关键程序代码进行准确控制, 且能够直接访问并控制相应的硬件系统, 促使硬件发挥积极作用, 从而确保系统稳定运行, 不仅如此, 汇编语言程序编译后的目标代码空间需求较小, 执行效率较高, 在系统软件程序和过程控制程序中的应用比较广泛、且普遍, 其具有独特的优势, 是其他语言难以取代的。但是, 事物具有两面性, 汇编语言也存在一定不足, 由于其基础是机器语言, 使得其对象没有发生变化, 没有改变其是一种低级语言的地位, 且理解难度也较高。在软件开发中应用此语言, 效率并不明显, 且针对硬件系统而言, 且精确度并不高, 兼容性较差, 即便是类似硬件也不能够通用。在软件工程中, 汇编语言凭借自身与硬件系统联系密切, 且能够实现直接访问, 很多系统软件都采用汇编语言进行编程, 还包括一些对处理速度要求较高的程度也是通过汇编语言编写的[2]。不仅如此, 在系统核心部分、软件加密、解密及计算机病毒分析等方面也都具有广泛的应用。在一些行业中, 汇编语言是不可缺少的, 只能够选择它, 在熟悉的程序员手中, 使用汇编语言能够显著提升效率及性能, 但是, 其弊端是需要利用更长的时间进行调整和优化。汇编语言在一些工业企业中, 制作4位单片机等, 以此来实现对工业生产过程的控制和管理, 另外, 针对需要快速及实时响应的场合, 也需要选择汇编语言, 例如:仪器仪表及工业控制设备等, 一般情况下, 汇编语言应用于最底层, 驱动程序及嵌入式操作程度等, 随着现代软件系统不断发展, 汇编语言逐渐成为计算机专业学生必须了解和掌握的一门课程, 能够帮助学生认识计算机运行原理, 夯实计算机相关知识基础。
三、C语言在软件工程中的应用
C语言自上个世纪90年代出现在计算机领域中, C语言作为一种高级语言, 不仅具有人性化特点, 还包括汇编语言的特性, 受到软件工程开发广泛关注, 其本质是高级与低级语言有机结合的编程工作单元, 通过函数、循环等应用, 能够形成结构化设计方法, 提高系统层次性、清晰度等方面具有积极作用, 且方便用户调试和维护。C语言自身优势很多, 运算符丰富, 实现多样化表达, 满足多元化需求, 且数据类型较多, 例如:指针型、实型等类型, 能够实现相对复杂的数据运算任务, 相比较而言, C语言更具有灵活性, 兼顾人性化及实用性两方面, 能够直接对对位地址和字节地址进行操作, 另外, 运用C语言编写源程序, 不仅系统质量高, 而且执行效率也很高为更好地移植和修改奠定了坚实的基础, 诚然, C语言也存在一定缺陷, 灵活度高, 使得其对语法规则要求并不严格, 使得变量类型规范也受到一定影响, 存在一定安全隐患, 初学者刚接触C语言时, 难以更好地接受和理解, 增加了学习难度。指针作为C语言在软件工程中应用的关注点, 针对与硬件联系较多的程序, C语言编写程序更为高效, 且多种机型及操作系统也可以选择C语言, 帮助人们直接访问地址, 及时检查语法错误, 纠正错误, 既能够提高系统质量, 也能够有效提高系统运行效率。未来, C语言将会广泛应用于系统程序编写中。综上所述, 汇编语言与C语言自身都存在优势及缺陷, 单纯的使用一种语言, 难以发挥有效作用, 且不利于软件工程开发, 至此, 可以将二者有机结合, 实现优势互补, 在程序编写过程中, 发挥各自优势, 更好地满足用户对系统的需求[3]。
结论:根据上文所述, 软件工程作为一项综合性工程, 在促进社会发展等方面占据不可替代的位置, 而汇编语言与C语言作为实现软件工程开发的核心, 二者均具有自身独特的优势及不足, 为了更好地实现程序编写, 应将二者结合在一起, 取二者之长, 提高系统软件可读性、灵活性, 进而为用户提供更加优质的服务。
参考文献
[1]王晓燕, 秦海鹏, 丁启胜.传感信号检测与智能仪表一体化实验装置研制[J].实验技术与管理, 2010, 18 (03) :259-261.
[2]严世胜.一种基于单片机的汽车超速报警系统[J].电气应用, 2012, 20 (05) :12-14.
【关键词】软件设计大赛 C语言教学 兴趣小组
【中图分类号】TP32【文献标识码】A 【文章编号】2095-3089(2014)02-0153-02
一、概述
C语言程序设计课程是计算机专业的重要基础课程,在本课程中系统而又详细的向学生阐述了程序设计的思想和程序设计的基本技能,如变量存储数据的思想,程序流程的控制方法、模块化程序设计方的方法等。在计算机后续课程的教学中,都以假设学生基本掌握了程序设计基本技能为基础进行教学的,因此关于本科C语言课程教学方法的研究一直都计算机专业教师非常关心的课题之一。本文介绍了笔者在进行C语言程序设计课程教学改革中将全国软件设计大赛引入课堂教学,提高课堂教学效果的方法。
二、C语言课程的教学现状
在C语言教学过程中,学生普遍反映课程教学的知识点概念性强、理论性强、内容丰富又抽象,具有严密的逻辑性,学习难度比较大。在课堂上教师仍以教授为主,“满堂灌”的形式。虽然不少教师在课堂教学中具有很丰富的授课经验和授课技巧,讲课也非常精彩,学生在课堂上也似乎都听懂了,但是一到下课又全都忘了。教师也普遍放映,现在的学生怎么了!学习积极性都这么差:上课不听讲,作业不交,实验不做,程序写不出来。
事实上真实像我们所想象的这样吗?在笔者的教学过程中发现我们的学生大部分其实并不象我们想象的这样。在教学过程中,我们发现课程刚开始时,学生积极性很高,上课很认真,作业、实验都能准时完成,但是随着课程的深入,学生的积极性就慢慢的下降了,以致很多同学采取了一种“放弃”的态度来学习本课程。
学生为什么会出现这样的情况呢?关键是学生在学习的过程中他对本课程的内容越来越不会。教师虽然滔滔不绝的在讲台上讲的很精彩,但是学生由于前面的知识没有掌握,自然就不了解更新的、概念性更强的知识了。学生由于知识没有掌握,碰到程序写不出来,也就更谈不上交作业和做实验了。例如,在笔者讲授循环中给学生讲授下面的程序:
while(i<=n){
scanf(“%d”,&x);
s+=x;
i++;
}
在授课中认为s+=x和i++表达式学生都已经掌握了,因此一笔带过,但是后来发现学生整堂课下来,都在迷糊s+=x;这句话是什么意思,scanf是干什么的?学生的思维都停顿在这样的一些“低级”的问题上,更加不用说去掌握循环的思想了。很显然循环程序设计的知识同学就都没掌握了,到后来上课效果也就越来越差,碰到后面关于数组、指针就更加是“一抹黑”。因此很多学生的学习积极性也就没有了。
由此可见,学生在学习本课程时,主要还是基础知识掌握不够。因此如何稳打稳扎的使学生掌握本课程的基础知识,是提高教学效果的关键问题。
三、软件设计大赛的开展
在2010年3月,在工信部的组织下,开展了第一届“全国软件专业人才设计与开发大赛”,大赛本着“立足行业、突出实践、广泛参与、促进就业”的宗旨,以向行业提供公正、科学的全国性人才选拔和培养平台,促进学校软件课程的教学改革,培养和提升当代大学生的创新和实践能力为目的,吸引了众多院校的参与。
我校以“以赛促学”为目的,也积极参与大赛,在全校范围内动员学生参赛,经过广泛宣传,吸引了全校300多名同学报名。经过严格选拔最后组织了15名学生参加了第一届的大赛。在大赛的准备中,也积极发动专业教师参与到学生的辅导中,通过集中授课、分散辅导、团队合作的方式,使学生在参与竞赛的过程中提高程序设计的能力。
四、基于软件设计大赛的改革
软件设计大赛广大师生提供了一个良好的平台。一方面通过组织学生参加软件设计大赛,使学生在准备竞赛的过程中开拓了视野,夯实了基本功;另一方面使学生在与其它同学的竞技中得到了锻炼。但是这部分同学毕竟是少数。我们期待的是广大同学的基本功得到夯实,程序设计能力得到提高。
因此在比赛过程中,课程组积极以软件设计大赛作为契机,组织教师对以软件设计大赛作为纽带,对教学模式进行了研讨。总结C语言课程教学中的问题,进行了一系列的教学改革,有机的将软件设计大赛与C语言课程教学结合起来。
1.在课程教学中积极宣传软件设计大赛。通过宣传使广大同学更加了解C语言程序设计的重要性,提高了学生学习的兴趣。
2.建立以点带面的帮扶体系,使参赛学生带动其他同学学习。我校C语言一般开设在大一的第二学期,很多同学在大一第一学期时就想学习C语言。因此我们以参赛学生为核心,在学校内成立了C语言兴趣小组,吸引对C语言感兴趣的同学参加。小组同学通过在一起听讲座,编写程序,讨论等形式,共同学习。通过这样的耳濡目染,使学生在不知不觉中掌握C语言程序的知识,让学生更早的接触到C语言。
3.建立了学生“导师”制度,通过引进优秀学生参与教师的辅导教学,提高教学效果。在授课过程中一个教学班一般都有100人左右。一个教师面对这么多学生也没有精力和时间去管理好每一个学生,我们在教学中吸引参赛同学作为教师的“助教”,辅助教师答疑、批改作业等等。很多同学在学习中都是由于死扣一个小问题,导致了学习的停滞不前。如果让他们感觉到身边都是“老师”,由于学生和学生之间的天然的共同语言,交流起来也非常方便,效果也会比较好,也保障了学生学习的师资。
4.建立了实验室开放制度。通过定期开放计算机专业实验室,一方面为参赛同学提供了良好的训练平台,在开放过程中由学生管理为主,教师辅导为辅的方式,通过在实验室进行交流学习,锻炼了同学的编程水平。另一方面也吸引了许多其他同学的参与,通过与参赛学生的相互学习,使广大同学的编程能力得到了锻炼。
5.将软件设计大赛的赛题引入课堂教学。大赛的赛题来源于实际,可以作为案例教学,提高学生的学习效果。例如在第一届比赛中,组委会提供了显示汉字的比赛样题。在我们的教学中选择其作为典型案例,将其贯穿于整个课程教学,由浅入深,层层讲解,使学生掌握本课程的知识。在讲授循环时以汉字显示的菜单作为入门,引导学生了解循环的特点。在讲授位运算时,通过对字模的运算,显示汉字,使学生对位运算的应用场合有了更深的认识。
6.软件大赛采用上机考试的形式,锻炼了学生实际动手能力,真实的考查了学生的编程水平,非常符合软件开发的思想。因此我们也借鉴软件大赛的方法,取消卷面考试的方法,全部采用上机考试的形式。一方面通过上机考试的形式向学生申明本课程的学习目的是要提高动手编程的能力;另一方面通过实际的上机编程,可以有效的检查学生的学习效果。
7.在全校范围内组织类似软件设计大赛的C语言程序设计大赛,通过借鉴软件设计大赛的经验,将比赛题目的类型、难度向软件设计大赛靠拢,提高竞赛水平,同时也扩大了参赛学生的受益面。
五、总结
通过组织我校学生参加全国软件设计大赛,使我校学生在大赛中得到了锻炼,最重要的是课程组借助大赛的平台,积极探索教学改革的新模式,课程教学的新方法,提高了教学效果,真正达到了“以赛促学”的目的。
参考文献:
[1]边海容.项目驱动教学法在《C语言程序设计》课程教学中的应用[J].科教文汇.2007
[2]周启生. 建构主义理论在C 语言程序设计教学中的应用研究[J].科技信息.2009
作者简介:
预处理器(Preprocessor).用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR(60 * 60 * 24 * 365)UL
我在这想看到几件事情:
1)#define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3)意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4)如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B)((A)<=(B)?(A):(B))
这个测试是为下面的目的而设的:
1)标识#define在宏中应用的基本知识。这是很重要的。因为在 嵌入(inline)操作符 变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
2)三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
3)懂得在宏中小心地把参数用括号括起来
4)我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?
least = MIN(*p++, b);
3.预处理器标识#error的目的是什么?
Error directives produce compiler-time error messages.死循环(Infinite loops)
4.嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
这个问题用几个解决方案。我首选的方案是:
while(1){ }
一些程序员更喜欢如下方案:
for(;;){ }
这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:“我被教着这样做,但从没有想到过为什么。”这会给我留下一个坏印象。
第三个方案是用 goto Loop:...goto Loop;
应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。
数据声明(Data declarations)
5.用变量a给出下面的定义
a)一个整型数(An integer)
b)一个指向整型数的指针(A pointer to an integer)c)一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an intege)r
d)一个有10个整型数的数组(An array of 10 integers)e)一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)
f)一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer argument and return an integer)
答案是:
a)int a;// An integer
b)int *a;// A pointer to an integer
c)int **a;// A pointer to a pointer to an integer
d)int a[10];// An array of 10 integers
e)int *a[10];// An array of 10 pointers to integers
f)int(*a)[10];// A pointer to an array of 10 integers
g)int(*a)(int);// A pointer to a function a that takes an integer argument and returns an integer
h)int(*a[10])(int);// An array of 10 pointers to functions that take an integer argument and return an integer
人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢? Static
6.关键字static的作用是什么?
这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
Const
7.关键字const有什么含意?
我只要一听到被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着“只读”就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)
如果应试者能正确回答这个问题,我将问他一个附加的问题:
下面的声明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * const a=new int(1);
/******/
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意识a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:
2、模块、组件级测试。3、系统测试,请说出这些测试最好有那些人员完成,测试的是什么?
14.设计厕所用例时考虑哪些方面,既不同的测试用例针对哪些方面进行测试?
15.如何测试程序向打印机输送打印内容,应该选用哪些破坏性的.测试用例?
16.在window下保存一个文本文件时会弹出一个对话框,如何为文件名简历测试用例,等价类应该怎么划分?
17.假设有一个文本框要求输入10个支付的邮政编码,对以该文本框应该怎么划分等价类?
18.有一个软件产品,功能是输入3个边代表三角形的三个边,看是否判断出是什么三角形,请设计测试用例标识处该用例的测试目的?
19.在sqlserver查询分析器中选择想要使用过的数据库,有哪两种方法?
20.请指出下列句子在select语句中所起的作用,select into from where group by having order by。
其他的笔试题目推荐:
1、系统测试使用( C )技术, 主要测试被测应用的高级互操作性需求, 而无需考虑被测试应用的内部结构。
A、单元测试 B、集成测试 C、黑盒测试 D、白盒测试
2、单元测试主要的测试技术不包括(B )。
A、白盒测试 B、功能测试
C、静态测试 D、以上都不是
3、(A )的目的是对最终软件系统进行全面的测试,确保最终软件系统满足产品需求并且遵循系统设计。
A、系统测试 B、集成测试
C、单元测试 D、功能测试
4、如果一个产品中次严重的缺陷基本完成修正并通过复测,这个阶段的成品是( A )。
A、Alpha版 B、Beta版
C、正版 D、以上都不是
5、自底向上法需要写(A )。
A、驱动程序 B、桩程序 C、驱动程序和桩程序 D、.以上都不是
6、测试ATM取款功能,已知取款数只能输入正整数,每次取款数要求是100的倍数且不能大于500,下面哪个是正确的无效等价类(C)
A、(0,100)、(100,200)、(200,300)、(300,400)、(400,500)、(500,+∞);
B、(500,+∞)
C、(500,+∞)、任意大于0小于500的非100倍数的整数;
D、(-∞,100)、(100,200)、(200,300)、(300,400)、(400,500)、(500,+∞);
7、因果图/判定表工程方法在以下那种情况下不适用(C)
A、输入输出明确,或输入输出因果关系明确的情况下
B、被分析的特性或功能点复杂,输入项目很多的情况下
C、系统输入之间相互约束多,需要做大范围的组合测试情况下
D、系统输入之间基本没有相互联系
8、以下说法不正确的是(D)
A、测试原始需要明确了产品将要实现了什么
B、产品测试规格明确了测试设计内容
C、测试用例明确了测试实现内容
D、以上说法均不正确
9、可测试性中,有关系统可观察性的理解,下面说法那个是错误的( B)
A、系统所有的输出结果可观察,错误输出易于识别;
B、系统运行状态和内部处理的过程信息可观察;
C、系统内部变量名及其取值可观察;
D、系统内部重要对象的状态和属性可观察;
E、系统内部重要的操作的处理时间可观察;
F、系统内部重要的资源的占用情况及单个资源的创建、保持、释放过程可观察
10、测试脚本的编写规范强调:(ABCD )
A、可读行 B、可重用性 C、可维护性 D、可移植性
11、当继承某个特性是,通常会从哪些角度对该特性进行测试分析?(AC )
A、失效影响度 B、成熟度 C、继承方式 D、用户原始需求
12、从下列关于软件测试的叙述中,选出正确的叙述(CD)
A、用黑盒法测试时,测试用例是根据程序内部逻辑设计的
B、测试的目的是验证该软件已正确的实现了用户的要求
C、发现错误多的程序块,残留在模块中的错误也多
D、测试设计时,应充分考虑异常的输入情况
13、软件验收测试的合格通过准则是:(ABCD)
A. 软件需求分析说明书中定义的所有功能已全部实现,性能指标全部达到要求。
B. 所有测试项没有残余一级、二级和三级错误。
C. 立项审批表、需求分析文档、设计文档和编码实现一致。
D. 验收测试工件齐全。
13、软件测试计划评审会需要哪些人员参加?(ABCD)
A.项目经理
B.SQA 负责人
C.配置负责人
D.测试组
14.测试设计员的职责有:(BC )
A.制定测试计划
B.设计测试用例
C.设计测试过程、脚本
D.评估测试活动
15.软件实施活动的进入准则是:(ABC)
A.需求工件已经被基线化
B.详细设计工件已经被基线化
C.构架工件已经被基线化
D.项目阶段成果已经被基线化
二、判断题(正确的√,错误的w)共10分,每小题1分
1. 软件测试的目的是尽可能多的找出软件的缺陷。( Y)
2. 负载测试是验证要检验的系统的能力最高能达到什么程度。(N )
3. 测试人员要坚持原则,缺陷未修复完坚决不予通过。(N)
4. 自动化测试能比手工测试发现更多的缺陷(N)
5. 错误猜测法基于这样一种假设,以前犯过的错误,以后同样会犯,我犯过的错误别人同样会犯,前人犯过的错误,后人同样会犯(N)
6. 软件测试中的二八原则暗示着测试发现的错误中的80%很可能起源于程序模块的20%(Y)
7. 某WEB系统设计中,用户点击“退出”按钮从系统中退出,界面回到初始登陆界面。此时不关闭窗口,使用浏览器的回退功能,可以回到之前的用户界面,继续进行用户操作。这种合适的人性化设计,恩那个避免用户误点击退出按钮后重新登录的繁琐操作;这种说法是否正确(N)
8. 在确定性能测试指标值时,参考的国际标准、国标、运营商规范中对此要求并不一样,可以视情况选择有利于我们的指标值,但必须要比竞争对手高,这样才有利于市场竞争力(N)
9. 测试执行时,应该对每一个测试结果做全面的检查,包括日志,这种说法是否正确( N)
10. 在测试执行时,我们主要是基于用户的使用场景来考虑功能实现的正确性,关键机要数据在数据库内是否加密存储或日志输出中是否采用加密、掩码处理不是我们测试关注的范围,毕竟那产品的内部实现,用户看不到的,自然也是不关心的。这种说法是否正确。( )
三、数据库部分:(共15分)
某班学生和考试成绩信息分别如下表Student和表Achievement所示:
ID Name
1 Jack
2 Marry
3 Rose
4 Bob
5 John
6 Betty
7 Robert
ID Mark
1 90
2 96
3 88
4 86
5 83
6 85
表Student , 表Achievement
其中ID为学生的编号,Name为姓名,Mark为成绩,请针对以下问题,写出相应的SQL语句:
1、请查询成绩>85分的学生的姓名;
Select Name from Student where id in(select id from achievement where mark>85);
Select * from student where id in (select id from achievement where mark>85);
2、请查询成绩>=90分的人数;
Select count(*) from ac where mark》=90;
Slect count(*) from achievement where mark>=90
3、Robert此次考试考了80分,但是成绩没能录入表中,请将其成绩添加进去;
Insert into ac(id,mark)values (‘7’,‘80’);
Insert into achievement(id,name) values (‘1’,’80’);
4、请将Rose的成绩修改为87;
Update ac set mart=‘87’where id=4;
Update achievement set mark=87 where id=3;
5、请删除Betty的记录;
Delete * from student where id=6;
在1967年BCPL语言被英国Martin Richards推出,到1970年B语言以BCPL语言为基础被美国Ken Thompson推出[1]。但是B语言过于简单,而且功能有限,经过研究者的多次试验研究,在1972—1973年,C语言在B语言的基础上经过完善,被美国贝尔实验室D.M推出[2]。在各种计算机编程语言中,C语言属于一门高级语言,它是一切计算机语言的基础,拥有高级语言和低级语言的特点,灵活方便,简洁紧凑;而且它的语法限制不严格,程序员在设计时程序书写自由。不仅能够编写系统软件,同时还可以编写应用软件,能够适应于多种操作系统,应用广泛,可移植性强。总之,C语言对于信息技术的发展具有十分重要的作用和价值。
二、基于C语言的计算机软件编程实验研究
(一)C语言的编程技巧
1. 灵活运用指针
在C语言编程的时候,指针是一种特殊类型的变量,它能够帮助程序员有效的表达和解决程序设计过程中遇到的复杂问题,熟练掌握指针是必要的。指针具有三要素:指针名以及指针类型和值[3]。在编程时,指针和一般变量名相同,但是在类型以及值上具有区别,另外,指针不仅能够被用于表示数组,还可以被作为函数的参数返回值。
2. C语言的特有函数
在C语言编程的时候,有时需要用到一些特有函数。函数都具有一定的功能,同时函数名也反映了该函数的功能。在进行函数定义时,程序员需要把函数的名字、返回值类型以及参数名等各项都进行定义。另外,因为库函数是由C编译系统提供的,这些函数均是系统首先定义好的,在程序调用的时候,程序员只需利用“#include指令”把与之相关的头文件包含到所用文件中即可[4]。例如,在程序运行的过程中,如果用到了sqrt函数,则为了保证程序运行下去,头文件必须含有#include“string.h”。
3. 算法技巧
在程序设计的过程中,算法是程序的灵魂,因此,掌握一定的算法技巧是必不可少的。通常情况下,算法不仅可以用自然语言表示,有的时候也利用流程图表示。需要注意的是,利用流程图表示算法时,程序设计员必须熟练掌握常用的流程图符号[5]。且“数学乃是计算机之母”,牢固的数学知识同样能够提升编程效率。
4. 位运算以及文件知识
相比其他计算机高级语言的运算方法,位运算作为C语言的重要特色,具有独特性和唯一性。位运算是以二进制位为对象,然后结合相关程序要求进行各种运算。文件包含有数据文件以及程序文件,是计算机不可缺少的,程序设计员在进行编程时,需要把所写的程序存储的文件之中,这样可以便于程序员查找数据,提升查找效率。
(二)C语言和汇编语言混合的程序设计案例分析
1. 混合的软件编程方法
随着信息技术的不断发展和应用,在软件开发过程中,大多时候需要使用两种语言混合编程,有效地提高了程序的开发效率。通常情况下,混合的软件编程方法有两种,具体如下:
(1)把汇编语句嵌入C语言程序中。
例如,把asm汇编语句嵌入到C语言源程序中:
当把一组汇编语句嵌入到C语言源程序中,则需要利用大括号把嵌入程序给括起来:
在本次的实验之中,在进行程序嵌入时,有其固定的格式,需要在嵌入的各行代码之前加“asm”关键字,也可以直接在asm代码块中放入汇编语句。但是程序设计者在进行嵌入时,一定要注意满足以下条件:汇编语言指令代码中关键字asm必不可少,且要放在指令代码之前;嵌入汇编语言指令代码能够和正常C语言程序混合,但是C语言的分隔符“;”必不可少;嵌入汇编语言时C语言的注释分界符必不可少,分别是“/*”和“*/”[6]。
(2)首先编写C语言程序以及汇编程序,然后独立编译目标代码模块,最终进行链接。
首先,在进行混合编程时,C语言程序能够调用汇编语言的各种子程序以及其定义的变量,同时,C语言编写的函数以及定义的变量等也可以被汇编语言调用。而且混合编程的过程中,一个任务往往是由若干个功能模块组成,且不同的功能模块均是利用合适的语言进行独立编程,且以函数的形式存在。因此,程序设计者要根据每一模块的特点选择相应的语言和语言编程系统进行独立编程,并形成目标文件,继而连接目标文件,形成完整的可执行文件。
在混合编程的过程中,设计者需要注意五个问题:参数传递问题;寄存器的使用问题;存储模式;变量以及函数的调用问题;子程序的返回值问题。
其中,关于参数传递问题,在进行C语言程序调用汇编程序时,必须遵从参数传递原则,利用堆栈把参数传递给汇编程序。例如,在C语言程序中含有函数:voidaa(char*p,int i),这个函数是利用汇编语言进行编写的,如果编译是在小内存模式下实施的,系统在进行调用时,则写成aa(&q,n);运行时程序首先把n压入堆栈,然后再把&q压入堆栈,当参数传递过来并被汇编语言的子程序取得时,BP寄存器便被用作基地址寄存器,实现对栈中所存数据进行存取操作。通常情况下,由于调用的子程序和C语言程序往往使用同一个堆栈,所以在程序执行时,汇编语言子程序需要执行两条指令:push bp pop bp、sp[7]。
2. 混合的软件编程实例分析
程序的主要功能是在5个数中寻找最小数,有主程序“min.c”以及汇编子程序“qiumin.asm”这两个部分组成。其中主程序是利用C语言编写,汇编子程序是利用汇编语言编写,被主程序调用,主要用于完成寻找最小数。
程序代码如下:
利用C语言和汇编语言混合的编程方法,能够实现应用程序局部满足高运行速度的要求,但是在具体的运用之中,程序设计者仍需要注意寄存器分配以及内存模式等因素对于程序的影响;且在运行时,因为程序设计语言之间存在相互调用的外部接口,故可以实现外部调用。
(三)C语言多项式除法的程序模拟设计案例分析
在计算机软件编程试验之中,利用C语言进行循环冗余校验码的实验程序设计流程如下:
程序的函数名称:polydiv;函数原型位置:CRC.H;数据库:CRC.LIB;然后程序员在利用C语言进行函数计算设计时,程序会自动产生一个余数,并把其存放在remainder文件之中。另外,程序的头文件为siodef.h
三、小结
综上所述,随着信息技术的不断发展,人们对于计算机软件编程的功能要求也将越来越高,而利用C语言能够实现计算机软件的多种功能,因此研究者应当强化对于C语言的计算机软件编程实验研究,开发功能更加强大的软件。
参考文献
[1]侯宏霞.提高“汇编语言”课程实验教学质量的几点思考[J].内蒙古农业大学学报(社会科学版),2011(01):25-26.
[2]刘海峰.以培养实践能力为导向的“C语言”教学方法探讨[J].科技经济市场,2008(12):33-34.
[3]阿娜古丽·阿布拉.C语言与汇编语言相互调用实现混合编程[J].电脑编程技巧与维护,2009(10):71-74.
[4]刘丹,刘德山.C语言程序设计课程综合性和设计性实验研究[J].计算机教育,2012(09):31-32.
[5]王应军,曲培新,赵晨萍.ARM汇编语言与C语言混合编程的实现方法[J].科技信息,2010(03):69-71.
[6]方艳红,赵海龙.计算机高级语言程序设计类课程实践教学改革研究[J].中国科技信息,2008(19):12-14.
【软件工程师c语言笔试】推荐阅读:
软件工程实验报告--初识软件工程11-10
软件测试工程师真题06-14
软件工程师试用期总结10-03
嵌入式软件工程师年薪10-16
软件工程教案06-03
软件工程简历10-30
如何成为一名优秀的软件工程师05-29
软件测试工程师岗位职责10-03