嵌入式c编程面试题(共9篇)
篇1:嵌入式c编程面试题
一个C/C++编程面试题
编写一个程序完成以下功能:
- 从磁盘上读入一个文件,这个文件可能是一个HTML格式的文件或者其他格式的
- parse此文件中可能包含的RSS链接 (可能0或多个),
- 列出找到的RSS链接
注意:请不要使用任何Parse HTML, XML, RSS相关的`库,直接写C/C++代码来处理读入的内容,
请注意代码的风格,文件的分布安排、文件名、变量、样式等的命名、页面的美观等,这些都将影响您的得分。
提示:
1、注意各种异常情况的处理。
2、注意代码的简洁和效率。
篇2:嵌入式c编程面试题
#include
#include
typedef struct array1{
int ID;
struct array1* next;
}A;
typedef struct array2{
int ID;
int a;
int b;
int c;
}* B;
int main
{
A s1[15];
A* s2;
B s3;
for(int i=0;i<10;i++)
{
s1[i].ID=i+64;
}
s2=s1+3;
s3=(B)s2;
printf(”%d/n“,s3->b);
return 0;
篇3:探讨ARM嵌入式系统C语言编程
关键词:ARM,嵌入式系统,C语言
随着现代科学技术和计算机技术的发展,嵌入式系统广泛地应用在各类电子产品中,比如视频电子产品、汽车电子产品以及智能家电等,目前正朝向工业自动化控制、网络、航天产品等高端领域迈进。ARM是高端嵌入式处理器的代表,但其不具备自我开发能力,必需借助程序环境或开发工具来实现自我开发能力,而C语言正是实现ARM嵌入式系统强大动力的基础。本文简要概述ARM及嵌入式概念,探讨基于ARM嵌入式系统上C语言编程的一些方法。
1 ARM和嵌入式系统概述
嵌入式系统也成嵌入式计算机系统,其主要用于控制、监控机器装置或大型厂房,和普通的PC机相比,有以下差别:(1)普通PC机系统面向大众行业大众群体,嵌入式系统针对特定的应用范围;(2)普通PC机的软件储存在硬盘或者磁盘当中,嵌入式系统软件固化在单片机或存储器芯片上;(3)普通PC机具备自身开发能力,而嵌入式系统要基于一个编程环境或一套开发工具实现自身开发。和普通PC机相同的是,嵌入式系统由操作软件、应用软件两部分组成。嵌入式系统包括嵌入式处理器、外围设备、操作系统和应用软件,其中嵌入式处理器和普通PC机的CPU类似,其是嵌入式系统核心部件。
ARM嵌入式处理器是各种各样嵌入式处理器中性能较好的一款处理器,其具有功耗低、处理速度快、价格低廉等优点,因此,有极为广泛的应用前景。
2 基于ARM嵌入式系统的C语言编程
嵌入式系统中的系统引导、存储管理、外围驱动及其它一些应用程序多数都需要C语言来编程,因此,下面分析ARM嵌入式系统和C语言编程两者技术融合,并详细地从存储管理、外围驱动程序以及程序引导等技术融合方面进行研究。
2.1 存储管理
存储管理较为复杂,广泛意义上讲,片内高速Cache、磁盘文件系统以及内存等都属于存储管理范畴,而ARM嵌入式系统下存储管理指动态内存管理。ARM嵌入式平台C语言编程通过malloc和free两个标准库函数实现内存动态分配和释放,其中,malloc主要完成从ARM嵌入式系统空闲的内存中分配合适内存块,而free则主要负责内存块回收。malloc和free均需要操作系统内棱支持,一般在ARM裸平台上不可直接调用。基于此,编写m_alloc和m_free函数实现动态存储管理功能。
2.2 外围驱动程序
ARM嵌入式系统中驱动程序主要指最底层中断处理程序以及在其基础上建立的驱动程序两部分,一般情况下,驱动程序和外围设备关系密切,因此,驱动程序较为复杂。外围设备通过中断和嵌入式系统通信,在处理中断的相关变量时要谨慎小心。一般情况下,编译器优化选项打开之后,有关变量的操作要放置在寄存器中,中断服务往往会通过改变某些全局变量通知应用程序外部事件发生,但被改变的全局变量通常情况下是不能被优化的。为解决这个问题,在声明变量的时候要加上volatile修饰符,用这个修饰符通知编译器某个变量有可能被异步事件改变。另外,在C语言编写过程中要考虑C语言编写形式,比如,Array[idx/4]=&~1实现对数组元素的操作,这里不能写为Array[idx>>4]=&~1,“>>”是一种移位运算符,有其对应的机器指令,“/”是一种除法运算符,运算方法很复杂。
2.3 系统引导
C语言从main函数开始,main函数指令原型为:int main(int argc,char**argv),其中,argc代表参数个数,argv代表指向参数的指针数组。Main函数运行原理如下:操作系统内核启动main函数,在操纵系统内核指导下函数完成变量初始化,调用结束之后,检查main函数返回值,如果返回值是0,说明运行正常,如果返回值是1,说明程序运行错误。ARM嵌入式系统中,没有操作系统内核,所以,对main函数初始化由系统引导模块完成。
嵌入式系统缺乏操作系统的内核,系统对main函数初始化需要借助系统引导模块完成,而汇编语言可以完成系统引导的工作。一般而言,系统引导模块完成初始化任务后,在一条跳转指令的引导下进入主入口main,最终可实现应用程序控制权转移。从这个意义上来说,ARM嵌入式系统和C语言的技术融合点在嵌入式系统引导可通过控制权转移至C语言的main函数。
3 结语
随着嵌入式应用的普及,嵌入式软件受到了大众的关注,本文简要介绍了ARM嵌入式系统和C语言的结合,通过ARM嵌入式系统和C语言的结合,有效解决了ARM嵌入式系统自身存在的一些问题,比如内存资源有限而栈容量不能自动扩展,或标准库函数不能直接借用等等,基于ARM嵌入式平台上的C语言很大程度上促进了ARM系统的完善,提升了嵌入式的技术水平。随着嵌入式软件、系统的不断成熟和C语言编程的运用,相信ARM嵌入式系统会越来越广泛地应用在生活中的各个领域。
参考文献
[1]过怡.基于ARM的高效C语言编程[J].单片机与嵌入式系统应用,2010.
[2]孙婧.ARM嵌入式系统C语言编程分析[J].计算机光盘软件与应用,2012.
篇4:嵌入式c编程面试题
【摘要】本系统主要研究C语言编程题目中“编译运行结果对比”、“编译错误原因恢复与评阅”、“得分点分割正则动态测试”三种手段,将研究内容运用到自动阅卷系统中,实现对编程题目的自动评分,并实现基于J2EE技术的具有在线考试、自动评分等功能的C语言编程题目自动阅卷考试系统,提高阅卷的准确度的同时能够节省大量的人力物力财力。
【关键词】C语言;编程题;自动评分
随着计算机技术的发展以及互联网的普及,办公自动化已无处不在。作为一门基础课程,C语言考试应用系统也给批阅试卷的工作人员带来了很大的工作量,自上世纪六十年代起,国内外就陆续出现了许多关于语言类课程考试的软件系统,虽然很多已具有基本的随机答卷、上机考试及自动评阅等功能,但只针对客观题,因自然语言的刻画、人工智能、模式识别等核心技术发展缓慢,制约了编程题目阅卷系统研究发展。所以,本系统针对C语言编程题目进行整体规划,致力于做出更精确的C语言编程题自动阅卷的方法,填补自动阅卷软件开发空白,减少人工操作的资源浪费。
1.系统运行环境
智能C语言考试系统、自动评分系统的运行环境是根据我校现有的教学机房的硬件环境(每个机房有70台学生机和一台教师机)规划的,教师端和学生端都采用window 7操作系统,每个机房都采用校园公共网络提供的局域网,运用Myeclipse开发环境、MySQL数据库建立一套具有在线考试、自动评分等功能的C语言编程题目自动阅卷系统,并辅以AJAX技术,确定了用FreeMarker表现层技术增强用户与系统间的交互,加快系统运行效率,同时,尽可能细化评分点,增加准确性。
2.系统运行模式的选择
系统采用B/S三层架构模式,系统的用户可通过Internet网络,客户端不需要手动安装软件,只要有浏览器就可以对系统进行访问和一般操作,本次对阅卷系统主要分析了的C语言编程题目评分功能,充分考虑到系统对灵活性和准确性的要求,并保证安全性的前提下,本系统采用B/S结构以达到轻客户端需求。
3.系统研究内容
通过研究C语言程序结构,从编译原理角度设计评价模型,通过内部运行编译器对比动态运行结果,并且本课题创造性提出利用关键字对比、控制结构判断和正则表达式匹配三种静态测试技术作为结果比对方案的补充,既保证了程序判断的正确性,又确保了相对公正性。
编译结果对比要实现程序内部对C语言编译器的动态调用技术,通过比对测试结果和标准答案进行评分,对于不能编译部分,研究关键字库建立、控制结构规范化和正则表达式建立的具体方案。
其中重点研究C语言编程题目评分标准的两个方面:一是如何检验运行结果的正确性,二是如何评价程序代码包含的分点。
为突出本系统对主观题的评分机制,在试题主观题程序可运行以及不可运行的情况下分别给出了相应的评分策略,以此来一步步细化评分机制。
4.评分核心模块设计
详细设计自动阅卷系统中的关键技术——程序题评分。系统首先采用动态测试技术,编译运行待评价程序,和标准答案进行对比给出分数;需要数值型输入参数的程序,通过均匀分布随机数给出随机输入;需要字符型输入参数的程序,首先在数据库中保存预选文字段,然后随机选取其中的一部分给出随机输入。对于编译运行报错的程序代码,课题会采取错误恢复技术,通过编译信息给出的错误位置尝试以标准答案修复代码,从而给出扣分点。最后对于不能编译运行的代码片段,系统提出关键字对比、控制结构标准化和提取、正则表达式规则匹配相结合的静态测试方法,加入权重处理,分析得分点给出更全面客观的评分结果。
通过对软件模式的对比和分层架构模型的研究,系统拟采用B/S结构,方便用户在线答题和管理操作;在具体实现技术方面,拟采用J2EE技术和SSH开源框架——利用Java语言提供的公开接口开发调用C语言编译器模块和正则表达式匹配模块,利用MySQL数据库完成题库和答案库的建立和开发工作,利用Ajax技术提高系统的整体响应速率,利用FreeMarker表现层技术增强用户与系统之间的交互。
建立计算机矫正机制和完善的评价方案,并对试题多次进行人工阅卷与机器阅卷的对比测试。
5.数据库设计
因需要评测本系统自动阅卷功能和人工阅卷的准确度,给出测评结果,并对仍存在的问题和不足提出进一步改进方案;特别是对系统不能正常评分的特殊题目,建立特例题库,以便在今后的工作进行研究并从中提出新的解决方案。
考生提交试卷首先由c语言编译器自动编译后生成可执行文件并运行输出结果,进行评阅步骤校验结果时,通过试题编号(id)调用试题表数据,对比答案进行准确性校对,调用纠错参考库数据,比对出错原因并根据错因扣除相应分数,通过模糊匹配替代出错关键字,迭代匹配错因至无错,若迭代五次还未改正视为崩溃性错误,不可弥补,判定本段分数为零崩溃性错误,不可弥补,判定本段分数为零,通过题目编号获取相应评分关键点库,通过正则表达式匹配得分点,通过得分点数量给出相应分数,完成试卷评阅。
当程序不能正常编译运行时,系统判定进入系统纠错,系统自动运行修复性算法,代码中个别关键字错误,为此我们把c语言中所有的关键字整理出来,建立关键字库,对错误的关键字进行模糊匹配,通过字符的顺序、相同字符的数量、键盘键位的keycode尽可能的匹配出相似度最高的的关键字替换错误的关键字。
纠错主要是语句拼写错误,我们分了下面三种情况:
1)测试用例由测试输入数据和与之对应的预期输出结果组成,人们常用白盒法和黑盒法设计测试用例,其中白盒法主要是为了检查是否有数据结构或外部数据库访问错误等,对比通过单元测试的模块或组件、编程规范、集成测试来检查测试的准确性。
通过正误判断匹配正误判断表进行结果判定,判定结果是否符合题目,若是则给分,否则进行结果范围判断及结果属性判断,比对结果是否适用本题范围,并进行分数评估。
2)本表主要有三个主要信息id、name、keyword。分别用来存储错误的id、错误的名称、题目中的关键字。Id的数据类型为int(整型),name的数据类型为varchar(字符型),keyword的数据类型为varchar(字符型),id需要主键非空自增,name与keyword非空。通过建立本数据库表可以实现对错误信息的收集归类,同时可以实现判断系统中出现的错误的功能。
定位捕捉错误点,抛出错误原因并与数据库进行比对,并根据错因给予相应分数,运用模糊匹配寻找替代关键词,进行替代继续检查错误,若连续替代五次后仍然不能进行下一步骤视为程序崩溃行错误,不可弥补,判定本段分数为零。
3)正则表达式,又称正规表示法、常规表示法(英语:RegularExpression,在代码中常简写为regex、regexp或RE),正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,在本字段里,正则表达式通常被用来检索、替换那些符合模式的程序段,进行分步得分。
本数据库包含关键字类库,通过正则表达式匹配关键词多寡,大概率的确定了答题者的思路范围及答题思路的正确与否,给以步骤分,极大的提高了批卷的人性化,拉近了机器阅卷与人工阅卷的阅卷水平,更有说明行的体现了机器阅卷更好的使用性。
C语言考试系统已普遍在各高校使用,对于客观题方面,有了相对完善公平的系统,但是在自动评分方面,还有很多不足之处,有待改善,本系统就是针对这一空白区域,设计公平而相对更准确的算法,主要对C语言考试系统中的编程题部分进行得分点分割,对考生的程序一步步细致分析,做到该得分的地方给考生相应的分数,这样避免了某一点小错误导致的大幅度扣分的不公平性,同时,将系统应用到学生的日常学习中后,能够更好地检验教师的教学成果,查找教学过程中需要注意的地方,对于学生,也能够更好地发现自己的错误,及时改正,这样,在学习的过程中,在保证公平的前提下,培养学生注意细节的习惯,最重要的是,应用到高校的二级C语言考试后,能够更好的给考生更公平更合理的考试成绩,同时也使得阅卷更加节约、方便、快捷,这也顺应了如今社会计算机行业的飞速发展,提高办公自动化的程度及效率。
参考文献
[1]K.A.Redish,W.F.Smyth.Pragram style analysis:a natural by-product of prograrn compilation[J].Cornnnunications of the ACM,1986.(3):126-133.
[2]Yasuhiro Ajiro,KazunoriUeda.Kima:An Automated Error Correction System for Concurrent Logic Progrrams.Automated Software Engineering 2002.9(2):67-94.
[3]王甜甜,基于语义相似度的编程题自动评分方法的研究,哈尔滨工业大学硕士论文,2001;1-52.
[4]李永浩,居于程序理解的编程题自动评分系统愤愤研究与应用,哈尔滨工业大学硕士论文,2001:1-60
[5]王华东.刘国柱.基于局域网下C语言考试系统的设计与实现[J].计算机与信息技术,2006.
篇5:嵌入式c编程面试题
func(char *str)
{
printf(“%d”,sizeof(str));
printf(“%d”,strlen(str));
}
main()
{
char a[]=“123456789”;
printf(“%d”,sizeof(a));
func(a);
}
答: 1049
网络/网络编程部份:
1、connect方法会阻塞,请问有什么方法可以避免其长时间阻塞?
答:最通 常的方法最有效的是加定时器;也可以采用非阻塞模式。
2、网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻 知道?
答:若客户端掉线或者重新启动,服务器端会收到复位信号,每一种tcp/ip得实现不一样,控制机制也不一样。
3.在子网210.27.48.21/30种有多少个可用地址?分别是什么?
答:
简:
30表示的是网络号(network number)是30位,剩下2位中11是广播(broadcast)地址,00是multicast地址,只有01和10可以作为host address。
详:
210.27.48.21/30 代表的子网的网络号是30位,即网络号是210.27.48.21 & 255.255.255.251=210.27.48.20,此子网的地址空间是2位,即可以有4个地址:210.27.48.20, 210.27.48.21, 210.27.48.22, 210.27.48.23。第一个地址的主机号(host number/id)是0,而主机号0代表的是multicast地址。最后一个地址的最后两位是11,主机号每一位都为1代表的是广播(broadcast)地址。所以只有中间两个地址可以给host使用。其实那个问题本身不准确,广播或multicast地止也是可以使用的地址,所以 回答4也应该正确,当然问的人也可能是想要你回答
2。我个人觉得最好的回答是一个广播地址,一个multicast地址,2个unicast地址。
4.TTL 是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
答:
简:TTL 是Time To Live,一般是hup count,每经过一个路由就会被减去一,如果它变成0,包会被丢掉。它的主要目的是防止包在有回路的网络上死转,浪费网络资源。ping和 traceroute用到它。
详: TTL是Time To Live,目前是hup count,当包每经过一个路由器它就会被减去一,如果它变成0,路由器就会把包丢掉。IP网络往往带有环(loop),比如子网A和子网B有两个路由器 相连,它就是一个loop。TTL的主要目的是防止包在有回路的网络上死转,因为包的TTL最终后变成0而使得此包从网上消失(此时往往路由器会送一个 ICMP包回来,traceroute就是根据这个做的)。ping会送包出去,所以里面有它,但是ping不一定非要不可它。traceroute则是 完全因为有它才能成的。ifconfig是用来配置网卡的,netstat-rn 是用来列路由表的,所以都用不着它
5.路由表示做什么用的?在linux环境中怎么来配置一条默认路由?
答:
简:路由表是用来决定如何将包从一个子网传送到 另一个子网的,换局话说就是用来决定从一个网卡接收到的包应该送的哪一张网卡上的。在Linux上可以用“route add default gw <默认路由器IP>”来配置一条默认路由。
详: 路由表是用来决定如何将包从一个子网传送到另一个子网的,换局话说就是用来决定从一个网卡接收到的包应该送的哪一张网卡上的。路由表的每一行至少有目标网 络号、netmask、到这个子网应该使用的网卡。当路由器从一个网卡接收到一个包时,它扫描路由表的每一行,用里面的netmask和包里的目标IP地 址做并逻辑运算(&)找出目标网络号,如果此网络号和这一行里的网络号相同就将这条路由保留下来做为备用路由,如果已经有备用路由了就在这两条路 由里将网络号最长的留下来,另一条丢掉,如此接着扫描下一行直到结束。如果扫描结束任没有找到任何路由,就用默认路由。确定路由后,直接将包送到对应的网 卡上去。在具体的实现中,路由表可能包含更多的信息为选路由算法的细节所用。题外话:路由算法其实效率很差,而且不scalable,解决办法是使用IP 交换机,比如MPLS。
在Linux上可以用“route add default gw <默认路由器IP>”来配置一条默认路由。
6.在网络中有两台主机A和B,并通过路由器和其他交换设备连接 起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排除故障? 答:测试这两台 机器是否连通:从一台机器ping另一台机器
如果ping不通,用traceroute可以确定是哪个路由器不能连通,然后再找问题是在交换设备/hup/cable等。
7.网络编程中设计并发服务器,使用多进程 与 多线程,请问有什么区别?
答案一:
1,进程:子进程是父进程的复制 品。子进程获得父进程数据空间、堆和栈的复制品。
2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数 据,但拥有自己的栈空间,拥有独立的执行序列。
两者都可以提高程序的并发度,提高程序运行效率和响应时间。
线程和进程在使用上各有优缺 点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
答案二:
根 本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:
1。速度: 线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。
2。资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空 间内。
篇6:嵌入式系统c语言编程该怎么学?
嵌入式系统c语言编程该怎么学?
C语言博大精深,玩了很长时间了,一直徘徊在入门处。看了很多别人的编程经验,加上项目程序越做越大,直到这半年来突然有很多体会,明天就要回家了,下午闲来无事也试着总结一些心得体会,喜欢对师弟妹们的学习有所帮助。
首先要说说编程的几个重要原则,看了很多别人的编程经验,更多的是说技巧。技巧能显著提高程序的效率,固然重要但是技巧的掌握靠了还是大量的工程实践,只有在有一定功底后才可以去追求这些编程技巧。但是编程的原则却是要在学习一开始就要认真贯彻,才能养成良好的编程习惯,苦练内功后练上层功夫才不会走火入魔。
言归正传,嵌入式系统C语言编程需要遵守什么样的原则呢?随着时代和技术的不断发展,这个问题也许仁者见仁智者见智了,但是总结起来大家还是有很多共识。根据目前提倡的软件工程的做法,和我们教研室的做法,列举最重要原则:
一、模块划分.C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能:
(1)一个功能模块即是一个.c文件和一个.h文件的结合,.h文件中是对于该模块功能函数和使变 量的声明
(2)该模块提供给其它模块调用的外部函数及数据都需要在.h中文件中以extern关键字声明
(3)模块内的函数和全局变量只能在.c文件定义
(4)不允许在.h文件中定义变量(定义变量和声明变量的区别在于定义会产生内存分配的操作,而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量)。
二、一个嵌入式系统程序包括两类模块分三层编写:
(1)硬件驱动模块,一种特定硬件对应一个模块,包括了片内集成的硬件模块和外部扩展的(2)软件功能模块,软件功能模块是建立在硬件驱动模块上的与硬件无关的逻辑功能。
(3)三层编写即HAL(硬件应用层),API(应用函数包),APP(逻辑应用层)注:名称是借用的,表大个意思而已。HAL就是硬件驱动模块和系统硬件密切相关,API可以是建立在HAL上的硬件应用服务程序也可以是通用的函数模块,APP则是最终构成嵌入式系统应用的功能逻辑关系。HAL和API是为了方便技术积累和提高开发效率而分开了,APP则是针对特殊应用而定制的。
三、中断服务程序的要求:
(1)不能返回值
(2)不能向ISR传递参数
(3)ISR应该尽可能的短小精悍,不允许有等待信号的操作
四、编程风格问题
五、需要学会熟练应用的C语言的基本手法
(1)数据指针,不能仅仅只会使用数组
(2)宏定义,定义寄存器地址,定义宏函数等
(3)函数指针的应用
(4)条件编译,在带操作系统的应用时经常要用
六、不要偷懒,写好必要的注释
七、做到以上几点时就可以吸收高超的编程技巧了。转载请保留连接
篇7:C语言期末考试编程题范文
int a,b,c,s,i=0;
for(s=100;s<1000;s++)
{
c=s%10;
b=s/10%10;
a=s/100;
if(s==a*a*a+b*b*b+c*c*c)
{
printf(“%dt”,s);
++i;
if(i%5==0)
printf(“n”);
}
} } 2.求1+2!+3!+...+20!的和 #include
is is printf(“nNo,the %ld is not palindrome!n”,num);} 4.求出1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数并并按照一行5个的格式输出。
#include
if(((num%7||num%11)==1)&&((num%7&&num%11)==0)){ printf(“%dt”,num);++i;if(i%5==0)printf(“n”);} } 5.编程列出200以内所有的素数,按照一行10个的格式输出,并求出所有素数的平均值,#include
average
6、编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1+1/3+1/5...+1/n #include
7、已知abc+cba=1333,其中a,b,c均为一位数,编程求出满足条件的a,b,c所有 组合。
#include
if((100*a+10*b+c+100*c+10*b+a)==1333)
printf(“a=%d,b=%d,c=%dn”,a,b,c);}
8、用户输入12个0-100之间的整数,统计出小于60,60到79,80到100三个范围的整数各有多少个? #include
are
%d numbers less than 60,%d numbers between 60 and 79,%d numbers between 80 and 100.n”,i,j,k);}
9、求这样一个三位数并输出该数字,该三位数等于其每位数字的阶乘之和。
即: abc = a!+ b!+ c!#include
number return sum;}
10、猜数游戏:由用户随机输入一个1位正整数数让人来猜,只能猜5次,如果人猜对了,则在屏幕上显示“You are so clever”,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止或者5次都猜不对给出提示“Game Over”。#include have %d times left!n”,5-i);continue;} else { printf(“nThe number you input is large,go on please!You have %d times left!n”,5-i);continue;} } if(i>5)Over!n“);} 11、设N是一个四位数,它的9倍恰好是其反序数(例如:123的反序数是321),求N的值。#include printf(”Game b=n/100%10;c=n/10%10;d=n%10;k=1000*d+100*c+10*b+a;if(k==9*n)printf(“N=%dn”,n);} } 12、100匹马驮100担货,大马一匹驮3担,中马一匹驮2担,小马两匹驮1担。试编写程序计算大、中、小马的数目。#include if(h1+h2+h3==100&&3*h1+2*h2+1/2*h3==100)printf(“The horse has has %d,middle old horse horse %d,young has %dn”,h1,h2,h3);} } 13、一位司机酒驾撞人逃跑。现场三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。(车号为4位数)#include 15、编程求出所有1000到3000之间能被7、11、17同时整除的整数,并求其平均值,并输出结果(结果保留两位小数)。#include printf(“n%d”,sum/k);} 16、编程找出满足下列条件的所有四位数的和并输出:该数第一、三位数字之和为10,第二、四位数字之积为12。 #include 17、求并输出所有满足如下条件的三位正整数:它是某整数的平方,它的三位数码有两位是相同的。(如100是10的平方,它有两个0,225是15的平方,它有两个2)。#include if((a==b||a==c||b==c)&&n==i*i)printf(“%dt”,n);} } 18、输出所有大于1010的4位偶数,且该类偶数的各位数字两两不相同。#include for(num=1012;num<=9999;num+=2){ a=num/1000;b=num/100%10;c=num/10%10;d=num%10;if(a!=b&&b!=c&&c!=d)printf(“%dt”,num);} } 19、编制程序要求输入整数a和b,若a+b大于100,则输出a+b百位以上的数字,否则输出两数字之和。#include 222void main(){ int a,b,s;printf(“Please input a and b:”);scanf(“%d%d”,&a,&b);s=a*a+b*b;if(s>100)printf(“n%dn”,s/100);else printf(“n%dn”,a+b);} 20、编写一个程序实现如下功能:计算1~100之间所有包含4或者包含5的数字,并显示其累加之和 #include 在20世纪70年代,单板计算机使人们不必从选择芯片开始来设计一台专用的嵌入式计算机,只要根据自己的需要选择各种不同的功能模块,比如适合自己应用的CPU板、存储器板和各式输入输出插件板构成专用的嵌入式系统,并嵌入到自己的系统设备中就可以组建成专用的计算机系统。嵌入式软件大多数使用汇编语言或宏语言来编写。 在20世纪80年代,在Intel公司的8051和8096单片机上,应用嵌入式Linux,μC/OS,Nucleux,以及国内的Hopen、DeltaOS等嵌入式操作系统。 20世纪90年代以来,在分布控制、柔性制造、数字通信和数字家电等商业需求推动下,嵌入式系统应用得到进一步发展。一是硬件芯片方面。向实时信号处理算法(DSP)高速高精度、低功耗发展。二是软件方面。嵌入式操作系统进一步分化,诞生了嵌入式操作系统家族。跨平台的软件开发技术从通用计算机上延伸到嵌入式设备上。 1 嵌入式系统概述 嵌入式系统的组成包括硬件和软件两部分[1](见图1)。 硬件包括处理器/微处理器、存储器及外设器件和I/O端口、图形控制器等。 软件部分包括板级支持包(BSP)、嵌入式操作系统软件(要求实时和多任务操作)、数据库支撑软件和应用程序编程。应用程序控制着系统的运作和行为;而操作系统控制着应用程序编程与硬件的交互作用。嵌入式系统的核心是嵌入式微处理器。 嵌入式系统可以称为后PC时代和后网络时代的新秀。与传统的通用计算机数字产品相比,利用嵌入式技术的产品有其自己的特点:一是采用微处理器,功能单一,独立的操作系统,不需大量的外围器件,嵌入式技术的产品体积小,功耗低。二是硬件和软件都必须高效率地设计,实现更高的性能。三是嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。嵌入式系统的软件执行速度快,系统可靠性高。四是新一代嵌入式设备还需具备IEEE1394,USB,CAN,BLUETOOTH等通信接口,同时也需要提供相应的通信组网协议软件和物理层驱动软件[2]。五是嵌入式技术的产品有较长的生命周期。 1.1 系统结构 微处理器的选择:考虑硬件平台的选择主要是嵌入式处理器的选择,选择处理器内核主要取决于用户需求、应用领域、成本和开发的难易程度等因素。ARM处理器价格低,性能高功耗小,适用于个人便携式设备。 操作系统的选择:不同应用对嵌入式软件系统有不同的要求。一是需要操作系统来支持。简单嵌入式系统没有操作系统,但是当系统变复杂的时候,就必须要一个操作系统来支持。使应用软件的安全和可靠得到保证,开发难度小。二是实时多任务。嵌入式系统软件的实时多任务调度能力必不可少。三是网络功能和窗口交互功能的支持。现代网络给嵌入式操作系统提出了新的要求。比如支持TCP/IP协议、安全认证以及访问控制等网络功能。可视化图形界面的窗口交互系统。μC/OS-II(Micro Control Operate System)是实时操作系统。该系统内核小、任务多、系统服务丰富、容易使用。μC/OS适合于小的、控制器的操作系统[3]。 μC/OS-Ⅱ初始化:μC/OS-Ⅱ要求用户首先调用系统初始化函数OSInit()。OSInit()初始化μC/OS-Ⅱ所有的变量和数据结构。 调用OSInit()后,μC/OS-Ⅱ变量和数据结构之间的关系。基于:在文件OS_CFG.H中,OS_TASK_STAT_EN是设为1的;在文件OS_CFG.H中,OS_LOWEST_PRIO是设为63的;在文件OS_CFG.H中,最多任务数OS_MAX_TASKS是设成大于2的。 μC/OS-Ⅱ还初始化了4个空数据结构缓冲区,每个缓冲区都是单向链表,允许μC/OS-Ⅱ从缓冲区中迅速得到或释放一个缓冲区中的元素。需要注意,空任务控制块在空缓冲区中的数目取决于最多任务数OS_MAX_TASKS,这个最多任务数是在OS_CFG.H文件中定义的。μC/OS-Ⅱ自动安排总的系统任务数OS_N_SYS_TASKS。控制块OS_TCB的数目也就自动确定了。包括足够的任务控制块分配给统计任务和空闲任务。 μC/OS-II的移植[4]:μC/OS-II的移植工作包括以下几个内容:一是用#define设置一个常量的值(OS_CPU.H);二是声明10个数据类型(OS_CPU.H);三是用#define声明3个宏(OS_CPU.H);四是用C语言编写6个简单函数(OS_CPU_C.C);五是编写4个汇编语言函数(OS_CPU_A.ASM)。根据处理器的不同,一个移植实例可能需要编写或改写50至300行的代码,需要的时间从几个小时到一星期不等。 μC/OS-II在ARM7TDMI上的移植:在ARM7TDMI工程开发中,采用高性能的实时嵌入式操作系统μC/OS-II作为软件设计平台,难度非常高而且是必要的工作,不仅要求开发人员掌握嵌入式系统的开发模式和方法,而且还要对操作系统、处理器和硬件系统的特性有深入的认识和研究。μC/OS-II的软硬件体系结构见图2[5]。 应用程序处于整个系统的顶层。每个任务都可以认为自己独占了CPU,因而可以设计成为一个无限循环。μC/OS-II处理器无关的代码提供了μC/OS-II的系统服务。应用程序可以使用这些API函数进行内存管理、任务间通信以及创建、删除任务等。μC/OS-II的大部分源代码是用C语言写成的,但是,仍需要用C语言和汇编语言完成一些与处理器相关的代码。 要使μC/OS-II正常工作,处理器必须满足如下要求:一是处理器的C编译器能产生可重入型代码;二是可重入型的代码指的是一段代码(如一个函数)可以被多个任务同时调用,而不必担心会破坏数据;三是在程序中可以打开或者关闭中断;四是处理器支持中断,并且能产生定时中断(通常在10 Hz~1 000 Hz之间);五是处理器支持能够容纳一定量的数据存储硬件堆栈;六是处理器有将堆栈指针和其他CPU寄存器的内容存储并读出到堆栈(或者内存)的指令。 1.2 嵌入式系统实现 μC/OS-Ⅱ用户应用编程接口(API)提供的一个任务调度的内核,要想实现一个相对完整、适用的实时多任务操作系统,必须对μC/OS-Ⅱ实时操作系统进行更多的扩充。主要包括建立文件系统、外部设备驱动程序规范API接口函数、创建图形用户接口函数和建立其他实用的应用程序API接口函数(见图3)。 基于μC/OS-Ⅱ内核扩展的实时操作系统软件整体必须完成以下几个模块。一是系统外设。包括液晶显示屏LCD、USB通信模块、Flash存储器、系统日历和系统时钟等[6]。二是驱动程序。驱动程序是连接底层硬件和应用程序API的。有了驱动模块可以把操作系统的API函数和底层硬件分离开来,独立完成需要的任务。三是API函数。操作系统提供标准的应用程序接口,加速用户应用程序的开发,统一应用程序的标准。API中提供了大量的模块来简化应用程序的编写。四是多任务管理。μC/OS-Ⅱ作为内核,主要完成多任务之间的调度和同步。五是系统消息通信。实时操作系统任务之间、用户应用程序之间及系统任务和用户任务之间的消息通信。 2 结束语 用户应用程序建立在main_task基础之上,用户通过API函数和系统交互。函数是应用程序访问系统提供服务的接口与纽带。通过这些函数,使得应用程序更加方便和容易。 参考文献 [1]佟国香,李琦,李广军μ.C/OS-II嵌入式操作系统的多任务应用程序开发[J].光电工程,2008,31(12):141-143. [2]冯森林.ARM S3C44BOX在电力系统保护设备上的应用研究[J].山东煤炭科技,2005(6):127-129. [3]院泽嘉.FAT16文件系统在嵌入式操作系统μC-OS中实现[J].电子测量技术,2005,(6):44-45. [4]Jean J.Labrosse.嵌入式实时操作系μC统/OS-II[M].2版.北京:北京航空航天大学出版社,2006. [5]宁杰城.ARM7内核上的μC/OS-II嵌入式系系统统移植[J].中国测试技术,2005,31(2):54-55. 第2章梳理应聘者接受技术面试时需要用到的基础知识。本章从编程语言、数据结构及算法三方面总结了程序员面试的知识点。 第3章讨论应聘者在面试时写出高质量代码的3个要点。通常面试官除了期待应聘者写出的代码能够完成基本的功能之外,还能应对特殊情况并对非法输入进行合理的处理。读完这一章,读者将学会如何从规范性、完整性和鲁棒性3个方面提高代码的质量。 第4章总结在编程面试中解决难题的常用思路。如果在面试过程中遇到复杂的难题,应聘者最好在写代码之前形成清晰的思路。读者在读完这一章之后将学会如何用画图、举例和分解复杂问题3种思路来解决问题。 第5章介绍如何优化代码的时间效率和空间效率。如果一个问题有多种解法,面试官总是期待应聘者能找到最优的解法。读完这一章,读者将学会优化时间效率及空间换时间的常用算法。 第6章总结面试中的各项能力。面试官在面试过程中会一直关注应聘者的学习能力和沟通能力。除此之外,有些面试官还喜欢考查应聘者的知识迁移能力、抽象建模能力和发散思维能力。读完这一章,读者将学会如何培养和运用这些能力。 第7章是两个面试的案例。在这两个案例中,我们将看到应聘者在面试过程中的哪些举动是不好的行为,而哪些表现又是面试官所期待的行为。衷心地希望应聘者能在面试时少犯甚至不犯错误,完美地表现出自己的综合素质,最终拿到心仪的Offer。 本书特色 正如前面提到的那样,本书的原型是我过去4年多陆陆续续发表的几十篇博客,但这本书也不仅仅是这些博客的总和,它在博客的基础上添加了如下内容。 本书试图以面试官的视角来剖析面试题。本书前6章的第一节都是“面试官谈面试”,收录了分布在不同IT企业(或者IT部门)的面试官们对代码质量、应聘者如何形成及表达解题思路等方面的理解。在本书中穿插着几十条“面试小提示”,是我作为面试官给应聘者在面试方法、技巧方面的建议。在第7章的案例中,“面试官心理”揭示了面试官在听到应聘者不同回答时的心理活动。应聘者如果能了解面试官的心理活动,无疑能在面试时更好地表现自己。 本书总结了解决面试难题的常用方法,而不仅仅只是解决一道道零散的题目。在仔细分析、解决了几十道典型的面试题之后,我发现其实是有一些通用的方法可以在面试的时候帮助我们解题的。举个例子,如果面试的时候遇到的题目很难,我们可以试图把一个大的复杂的问题分解成若干个小的简单的子问题,然后递归地去解决这些子问题。再比如,我们可以用数组实现一个简单的哈希表解决一系列与字符串相关的面试题。在详细分析了一道面试题之后,很多章节都会在“相关题目”中列举出同类型的面试题,并在“举一反三”中总结解决这一类型题目的方法和要点。 本书收集的面试题是都是各大公司的编程面试题,极具实战意义。包括谷歌、微软在内的知名IT企业在招聘的时候,都非常重视应聘者的编程能力,编程技术面试也是整个面试流程中最为重要的一个环节。本书选取的题目都是被各大公司面试官反复采用的编程题。如果读者一开始觉得书中的有些题目比较难,那也正常,没有必要感到气馁,因为像谷歌、微软这样的大企业的面试本身就不简单。读者逐步掌握了书中总结的解题方法之后,编程能力和分析复杂问题的能力将会得到很大的提升,再去大公司面试将会轻松很多。 本书附带提供了50道编程题的完整的源代码,其中包含了每道题的测试用例。很多面试官在应聘者写完程序之后,都会要求应聘者自己想一些测试用例来测试自己的代码,一些没有实际项目开发经验的应聘者不知道如何做单元测试。相信读者朋友在读完这本书之后就会知道如何从基本功能测试、边界值测试、性能测试等方面去设计测试用例,从而提高编写高质量代码的能力。 第1章面试的流程1 1.1面试官谈面试1 1.2面试的三种形式2 1.2.1电话面试2 1.2.2共享桌面远程面试3 1.2.3现场面试4 1.3面试的三个环节5 1.3.1行为面试环节5 应聘者的项目经验6 应聘者掌握的技能7 回答“为什么跳槽”8 1.3.2技术面试环节10 扎实的基础知识10 高质量的代码11 清晰的思路14 优化效率的能力15 优秀的综合能力16 1.3.3应聘者提问环节17 1.4本章小结18 第2章面试需要的基础知识20 2.1面试官谈基础知识20 2.2编程语言22 2.2.1 C++ 22 面试题1:赋值运算符函数24 经典的解法,适用于初级程序员25 考虑异常安全性的解法,高级程序员必备26 2.2.2 C# 27 面试题2:实现Singleton模式31 不好的解法一:只适用于单线程31 不好的解法二:可用于多线程但效率不高32 可行的解法:同步锁前后两次判断33 推荐的解法一:利用静态构造函数34 推荐的解法二:按需创建实例34 解法比较35 2.3数据结构36 2.3.1数组36 面试题3:二维数组中的查找38 2.3.2字符串42 面试题4:替换空格44 O(n2)的解法,不足以拿到Offer 45 O(n)的解法,搞定Offer就靠它46 2.3.3链表49 面试题5:从尾到头打印链表51 2.3.4树53 面试题6:重建二叉树55 2.3.5栈和队列58 面试题7:用两个栈实现队列59 2.4算法和数据操作62 2.4.1查找和排序63 面试题8:旋转数组的最小数字66 2.4.2递归和循环71 面试题9:斐波那契数列73 效率很低的解法,面试官不会喜欢73 面试官期待的实用解法74 O(logn)但不够实用的解法74 解法比较75 2.4.3位运算77 面试题10:二进制中1的个数78 可能引起死循环的解法79 常规解法79 能给面试官带来惊喜的解法80 2.5本章小结82 第3章高质量的代码84 3.1面试官谈代码质量84 3.2代码的规范性86 3.3代码的完整性87 从3方面确保代码的完整性87 3种错误处理的方法88 面试题11:数值的整数次方90 自以为题目简单的解法90 全面但不够高效的解法,离Offer已经很近了90 全面又高效的解法,确保能拿到Offer 92 面试题12:打印1到最大的n位数94 跳进面试官陷阱94 在字符串上模拟数字加法94 把问题转换成数字排列97 面试题13:在O(1)时间删除链表结点99 面试题14:调整数组顺序使奇数位于偶数前面102 只完成基本功能的解法,仅适用于初级程序员102 考虑可扩展性的解法,能秒杀Offer 104 3.4代码的鲁棒性106 面试题15:链表中倒数第k个结点107 面试题16:反转链表112 面试题17:合并两个排序的链表114 面试题18:树的子结构117 3.5本章小结121 第4章解决面试题的思路123 4.1面试官谈面试思路123 面试题19:二叉树的镜像125 4.2画图让抽象问题形象化125 面试题20:顺时针打印矩阵127 4.3举例让抽象问题具体化131 面试题21:包含min函数的栈132 面试题22:栈的压入、弹出序列134 面试题23:从上往下打印二叉树137 面试题24:二叉搜索树的后序遍历序列140 面试题25:二叉树中和为某一值的路径143 4.4分解让复杂问题简单化146 面试题26:复杂链表的复制147 面试题27:二叉搜索树与双向链表151 面试题28:字符串的排列154 4.5本章小结158 第5章优化时间和空间效率160 5.1面试官谈效率160 5.2时间效率162 面试题29:数组中出现次数超过一半的数字163 基于Partition函数的O(n)算法163 利用数组特点的O(n)算法165 解法比较166 面试题30:最小的k个数167 O(n)的算法,只当可以修改输入数组时可用167 O(nlogk)的算法,适合处理海量数据168 解法比较169 面试题31:连续子数组的最大和171 举例分析数组的规律171 应用动态规划法173 面试题32:从1到n整数中1出现的次数174 不考虑效率的解法,想拿Offer有点难174 明显提高效率的解法,让面试官耳目一新175 面试题33:把数组排成最小的数177 5.3时间效率与空间效率的平衡181 面试题34:丑数182 逐个判断整数是不是丑数的解法182 创建数组保存已经找到的丑数的解法183 面试题35:第一个只出现一次的字符186 面试题36:数组中的逆序对189 面试题37:两个链表的第一个公共结点193 5.4本章小结196 第6章面试中的各项能力198 6.1面试官谈能力198 6.2沟通能力和学习能力200 沟通能力200 学习能力200 善于学习、沟通的人也善于提问201 6.3知识迁移能力203 面试题38:数字在排序数组中出现的次数204 面试题39:二叉树的深度207 重复遍历结点的解法,不足以打动面试官209 只遍历结点一次的解法,正是面试官喜欢的209 面试题40:数组中只出现一次的数字211 面试题41:和为s的两个数字VS和为s的连续正数序列214 面试题42:翻转单词顺序VS左旋转字符串218 6.4抽象建模能力222 面试题43:n个骰子的点数223 基于递归求骰子点数,时间效率不够高223 基于循环求骰子点数,时间性 相关文章:
最精彩最煽情的班主任发言稿(优质16篇)01-23
海外网络嵌入01-23
嵌入理论01-23
老师傅的简单幸福01-23
信息嵌入01-23
嵌入研究01-23
开学典礼精彩发言稿(优质14篇)01-23
AFD信息嵌入01-23
家长会家长代表发言稿 家长发言稿01-23
篇8:嵌入式c编程面试题
篇9:名企面试官精讲典型编程题