好心情说说吧,你身边的情绪管理专家!

好心情说说专题汇总 心情不好怎么办

励志的句子

程序员年度工作总结 篇1

通过今年的实践和学习,明年是一个新的开始,立足当前的优缺,肩负起一个软件工程师应有的工作和性质。希望为公司明年的发展尽最大的努力,也希望自己明年有更大的收获。明年计划在以下几方面有所突破,有所建树:

一、在编程语言掌握方面,达到本公司的编程思想—不被语言所束缚。在这方面伍经理是我的榜样,积极努力的提高自身的技术水平,真正做到不被语言所束缚。

二、数据库方面,在当前已有的基础上提升自己,明年自己给自己定的目标是,能非常合理的去使用数据库各类技术,掌握更多的数据库优化思想和技术点。有时间多向许总交流。

三、加强软件开发的辅助性知识使用和积累。针对当前软件开发中的一些情况,明年更加积极的学习Javascrip、Aja和Fle等技术。能辅助性的把软件做的更好。

四、工作质量上,现在编程我是属于会写会编和局部效率,并不是全局的效率,明年一定要做到,编一个高效率的代码。这就要综合上面的三点,才能使其达到全局的高效。

程序员年度工作总结 篇2

黑马程序员:IOS面试宝典之c语言

C语言语法

1.局部变量能否和全局变量重名?

答:能,局部会屏蔽全局。要用全局变量,需要使用"::";局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同 名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

2.如何引用一个已经定义过的全局变量?

答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期 间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

3.全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

答:可以,在不同的C文件中以static形式来声明同名全局变量。

可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错.4.关键字volatile有什么含意?并举出三个不同的例子?

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1)并行设备的硬件寄存器(如:状态寄存器)

2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)3)多线程应用中被几个任务共享的变量

关键字的作用是什么?

(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

(2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;

(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明

它的模块内;

(4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

(5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。

6.堆和栈的区别是什么?

管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。

申请大小:栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统 预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示 overflow。因此,能从栈获得的空间较小。堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地 址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个 问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出 分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由 alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的 效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

答: 1)全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

2)从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

3)static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

综上所述: static全局变量与普通的全局变量有什么区别:

Static全局变量只初使化一次,防止在其他文件单元中被引用;

Static局部变量和普通局部变量有什么区别:

Static局部变量只被初始化一次,下一次依据上一次结果值;

Static函数与普通函数有什么区别:

Static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

8.关键字const的作用分别是什么?

Const int a;int const a;const int *a;int const *a;int * const a;int const * const a;1> 前两个的作用是一样:a 是一个常整型数

2> 第三、四个意味着 a 是一个指向常整型数的指针(整型数是不可修改的,但指针可以)3> 第五个的意思:a 是一个指向整型数的常指针(指针指向的整型数是可以修改的,但指针是不可修改的)4> 最后一个意味着:a 是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的)与union的区别是什么?

设有以下说明和定义:

typedef union

{ long i;int k[5];char c;} DATE;

Struct data { int cat;DATE cow;double dog;} too;

DATE max;

则语句 printf("%d",sizeof(struct data)+sizeof(max));的执行结果是:___52____ 考点:区别struct与union.(一般假定在32位机器上)

答:DATE是一个union, 变量公用空间.里面最大的变量类型是int[5], 占用20个字节.所以它的大小是是一个struct, 每个变量分开占用空间.依次为int4 + DATE20 + double8 = 32.所以结果是 20 + 32 = 52.当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20 10.关于指针的理解

1.请写出下题输出结果:

(){ a[5] = {1,2,3,4,5};

*ptr =(int *)(&a+1);(“%d,%d”,*(a+1),*(ptr – 1));5.} 答:2,5

*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是,&a+1不是首地址+1,系统会认为加一个a数组的偏 移,是偏移了一个数组的大小(本例是5个int,int *ptr=(int *)(&a+1);则ptr实际 是&(a[5]),也就是a+5原因如下:

&a是数组指针,其类型为 int(*)[5];而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。a是长度为5的int数组指针,所以要加 5*sizeof(int)所以ptr实际是a[5],但是prt与(&a+1)类型是不一样的(这点很重要),所以prt-1只会减去sizeof(int*),a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].2.写出下列代码的输出内容

#include

int inc(int a)

{ return(++a);}

int multi(int*a,int*b,int*c)

{

return(*c=*a**b);}

typedef int(FUNC1)(int in);

typedef int(FUNC2)(int*,int*,int*);

void show(FUNC2 fun,int arg1, int*arg2)

{

FUNC1 p=&inc;

int temp =p(arg1);

Fun(&temp,&arg1, arg2);

printf("%dn",*arg2);

}

main()

{

int a;

//局部变量a为0;

Show(multi,10,&a);

return 0;

}

答:110

3.以下为Windows NT下的32位C++程序,请计算sizeof的值void Func(char str[100]){

Sizeof(str)= ? } void *p = malloc(100);sizeof(p)= ? 答案:这题 很常见了,Func(char str[100])函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等 操作,可以被修改。Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof(str)、sizeof(p)都为4。

程序员年度工作总结 篇3

来到云润大数据的这十个多月的日子里,是我在视野和觉悟提高最多的一段日子:

1、linux在很多方面比Windows要可爱的多。

从之前完全地依赖和喜欢windows,觉得这是一个最完美的系统,然而在工作中,却一次又一次见识到了windows的短板,原来在服务器领域活跃的linux是如此地强大和让人踏实。当然,这个过程是痛苦的,刚进入公司的时候,工作的系统几乎全是针对linux,而之前对于这个黑头冷面的家伙,仅仅停留在几个命令行上,那段时间,几乎都是靠白天谷歌,晚上看书来恶补度过,很短的时间内,就被这个强劲的系统征服了。

2、百度跟谷歌之间隔了好几个bing

在之前的工作和生活中,百度几乎占据了我网络信息检索的全部份额,感觉它几乎能满足我所有的需求,然后在新的工作中,很多时候,我都不能通过它解决问题,最后通过谷歌完美解决,抛出民族观念,确实,谷歌更能理解程序员。

3、除了java之外,代码的世界里,百花齐放。

不得不承认,我有着很强的先入为主的思想,总是习惯性地拥护最先接触到的东西,后来在工作中,组长要求我们用Python语言来做爬虫,对于这个决定“我一开始是拒绝的”,为什么一定要用python呢,后来,在组长举出了很多特性和python的强大以及用想不到的极尽简介的代码完成了一个爬虫后,也就在心里狠狠打了自己一巴掌,不能用同一种思维来看待整个世界,代码的世界,如此缤纷多彩,相信少了一些执拗的偏见后,我能更好地享受代码的乐趣。

4、兵马未动,粮草先行。夯实基础和规范才是真理。

如今的项目开发中,不乏有很多能力很强大的人,他们能很好将自己的想法变成现实,但是写出出耦合更低、健壮性更好,可读性更强的代码是程序员们永恒的追求。所以我们有必要,打好基础,写代码时多一点的思考,更要符合业界统一遵循的规范,才是长远的发展之道。(在此,感谢一下,组长对这方面的重视,让我们养成好的代码习惯和良好的代码思维),这些思想和行为习惯对于我来说,意义重大,也将对我以后的职业生涯,产生深远影响。

5、接触了一大批优秀的框架

Hadoop系列、ambari、scrapy、等等,接触到了很多很优秀的框架,这些框架的思想都重新刷新了我对软件的认识,强大的计算能力,优秀的设计思想,从单点到分布式,尤其是RM,它的分布式计算思想,很多启发。很多时候我们并不能一味纵向扩展,总会有瓶颈,横向扩展才是王道,正如《hadoop权威指南》第一章说“古时候人们种田遇到很重的活,没有想去培养更大的牛,而是用两头牛”,更加符合自然规律。20xx的遗憾就是,对于这些优秀的框架,我始终停留在搭建的基础上,没能有机会在工作中用到,但愿20xx年,我能有更多机会去体验和学习它们吧。

6、开始拥抱开源

至此之前,我曾一度忽视了java中重要的东西,那就是开源,丰富的开源资源,是java最宝贵的特性之一,然而之前总感觉这些东西太遥远,或许也觉得自己能力不够,还不足以去挑战源代码。在开源方面,我要万分感谢现在的同事强哥和老大,他们跟我频繁地渲染着看源代码,从源代码中发现一切,使我也开始去尝试,现在也养成了一个很多好的习惯,遇到问题不再是一味去网上查,如果是开源的项目,多看日志,然后追踪源代码,事实证明,很多时候,这种方式最直接有效,而且还可以学习作者们优秀的代码架构和风格。我相信,拥抱开源,能让我学到更多,成长更快。

程序员年度工作总结 篇4

尊敬的领导、同事们:

时间转瞬即逝,眨眼间又要到年底总结的时候了。在这一年里,我承担了公司一定的技术工作,经历了成长和磨练,在此向大家作一份简单的年终工作总结。

一、技术能力提升

在这一年中,我不断努力地学习新技术、新知识,取得了不小的成绩。我主动学习了Java、Python、JavaScript等多种编程语言,并应用到自己的工作中去。通过学习和实践,我提升了自己的编程能力,让自己更加熟练地应对各种工作需求。

二、团队协作能力提升

在公司开展项目的过程中,多次参与到团队协作的工作中。我积极参与讨论和交流,认真处理各种问题。在工作的过程中,我尝试着帮助其他人解决问题,不断提高自己的团队协作和领导能力。在团队中,我参与了部分重要的项目,获得了丰富的项目经验。从多次的团队协作中,我认识到了团队合作的好处和重要性,进一步提高了自己的团队协作能力。

三、工作成果

在这一年中,我承担了许多公司项目的开发、升级和维护工作。我认真对待每一个任务,兢兢业业,积极解决问题,并且始终保持着良好的沟通和反馈,使公司开发计划得以顺利推进。在项目工作中,我主要负责了云计算、大数据等领域的开发工作,并在其中完成了一些挑战性的任务。在处理问题时,我总是能够独立思考、快速解决,取得了公司领导的认可和好评。在我所承担的项目中,我坚持积极主动的思路,不断充实自己,实现自己的价值。

四、个人反思

在工作的过程中,我也遇到了一些困难和挑战。有时候,需要处理的问题多、难度大,甚至会遇到烦躁和低谷的情绪。但是,我始终保持一份坚定的信念——对技术和工作的热爱,对自己的进步和成长的坚持。在这份信念下,我总是能够克服困难,继续朝着目标前进。

五、展望未来

回顾过去,我感到骄傲和自豪;展望未来,我充满憧憬和期待。在新的一年里,我将继续努力提升自己的技术能力,扩充知识面,不断探索和创新,为公司带来更大的贡献。同时,我也会积极学习和发掘工作中的技巧和窍门,提高自己的效率和工作质量,为良好的团队协作和公司发展做出更大的贡献。

最后,我要感谢公司领导的信任和支持,也要感谢同事们的帮助和合作。我相信,有你们的支持和帮助,我一定能够更加成功地完成自己的工作。

谢谢大家!

程序员年度工作总结 篇5

我于20__年x月x日成为本公司技术部的一名程序员,一年转眼就过去了。这段我人生中弥足珍贵的经历,给我留下了精彩而美好的回忆。在这段时间里您们给予了我足够的关怀、支持和帮助,让我充分感受到了领导们“海纳百川”的胸襟,在对您们肃然起敬的同时,也为我有机会成为影响力在线的一员而惊喜万分。这段时间,在领导和同事们的关怀和指导下,我通过不懈努力,各方面均取得一定的进步,现将我的工作情况做如下汇报:

1、学无止镜,时代的发展瞬息万变,各种学科知识日新月异。我将坚持不懈地努力学习各种技术知识,并用于指导实践。

2、“业精于勤而荒于嬉”,在以后的工作中不断学习知识,通过多看、多学、多练来不断的提高自己的各项技能。

3、不断锻炼自己的胆识和毅力,提高自己解决实际问题的能力,并在工作过程中慢慢克服急躁情绪,积极、热情、细致地的对待每一项工作。

4、努力提高自己的日常交际能力。

时光流转间,我已到公司工作一年。非常感谢公司领导对我的信任,给予我体现自我、提高自我的机会。这一年的工作经历,使我的工作能力得到了由校园步入社会后幅度的提高。

在此,在对一年的工作情况及心得体会做一汇报后,今后我会以炙热的工作热情继续投入到今后的工作当中,以自己踏实努力的工作,报公司知遇之恩!

程序员年度工作总结 篇6

六、还参加了网站新版的第二轮测试工作,主要以后台管理系统为主做测试,还参与了前台个人管理与企业管理的流程测试,测出了不少关键性的bug。

七、入职以来,还担任了网站部群发邮件的工作。三个月内完成了好几批邮件群发的工作,每天定时定量地给在无忧无虑网站上注册的企业或会员群发几十万封邮件。还配合客服部群发了两批特殊活动的邮件,配合网站营销活动群发了两批群件,每天坚持固定给注册会员群发。在网站技术部工作的三个月里,自己感受非常多。首先,作为刚从学校出来的毕业生,在实际开发中的经验尚不够成熟,还需要在工作中不断的提升自己。其次,要进一步提高自己的开发技能,使自己的技能满足今后的需求,主动获取并学习当今最新技术信息,平衡自己的知识结构,在不断的学习中提高自己。然后,要加强与同事们的沟通,融入团队,互相学习、相互提高,在团队中不断完善自己。我相信,通过我的努力,一定能成为智通的优秀员工,一定会在优秀成绩之上提升自己。同时我希望公司能根据情况给我培训深造的机会,也希望部门内能有经常性的专业技术学习。

在此,我要感谢我的师傅吴长锦对我的指导,感谢李经理、范主管以及网站部的同事们对我的关心与帮助,感谢公司提供我发挥自己才能的机会。

大家好,我是XXX项目组的XXX,我于20XX年7月进入公司做JAVA程序开发,至今已近快一年时间了。初来公司,曾经很担心不知该怎么与人共处,该如何做好工作;但是公司融洽的工作氛围、团结向上的企业文化让我较快适应了公司的工作环境。在本部的工作中,我一直严格要求自己,认真及时做好领导布置的每一项任务。不懂的问题虚心向同事请教,不断提高充实自己,希望可以为公司做出更大的贡献。当然,刚做这个项目的时候,难免出现一些小差小错需领导指正;但前事之鉴,后事之师,这些经历也让我不断成熟,在处理各种问题时考虑得更全面,杜绝类似失误的发生。在此,我要特地感谢部门的领导和同事对我的指引和帮助,感谢他们对我工作中出现的失误的提醒和指正。总结经验是一个人迅速成长的有利催化剂,为了更快地成为一名优秀的员工,现将我20XX年上半年的学习、工作情况总结如下:

20XX年初时,我们进销存项目通过了一期客户验收。但是,随着客户业务的变化,项目需要做很大的改动和调整。现进销存系统进入了二期的设计开发阶段。初入公司的时候,我只负责财务模块的存货核算开发工作。随着公司人员的变动,现在我负责财务管理整个模块的开发工作。很明显的能感觉的身上的压力越来越大,也许是因为我的个性使然吧,越挫越勇,迎难而上。不断的学习财务业务知识和本系统框架,现基本了解掌握了财务的整个业务逻辑及业务流程。因为没有参与一期的原型、需求、设计、数据库等文档的设计。在开发过程中发现,有好多原型、需求文档、设计文档,只知其然,不知其所以然。总结一期经验,避免二期开发中遇到同样的问题和困难。从原型设计、谈二期需求、整理需求文档、数据库设计、开发,一条龙负责到底。这样对业务逻辑及业务流程有了更深的理解。从“我问”,到“我讲”,有了很大的个人提高。提高软件知识和技术只是问题的表面,本质是要提高自己认识问题、分析问题、解决问题的思想高度。在能胜任工作的基础上,立即去涉猎其它领域的专业知识,丰富自己的知识体系、提高自己的综合素质。我相信付出肯定会有收获,在我们的努力下,进销存系统一定会给客户及公司一个满意的答案。

在这一年里,我看到公司的迅速发展,各项制度的不断完善,我很庆幸我是公司的一员,我会用谦虚的态度和饱满的热情做好我的本职工作,为公司创造价值,同公司一起创造美好的未来。

程序员年度工作总结 篇7

20xx年发生的第一件大事就是,在一个月紧张准备论文和几天喝得“醉生梦死”的毕业宴之后,终究为自己十余载的学生生涯画上了一个圆满的句号。从学生到上班族,从校园到职场,无论是社会角色的转变还是生存环境的转变,对我来说,都是一道坎,所幸的是,大学的时候,选择了一个自己喜欢的专业,出了校门,能将自己喜欢的东西变成自己的职业,则更为欣喜。校园和职场,是两个绝缘不同世界,大学里的我们,眼界狭窄,见识浅短,在一个小小的世界自娱自乐着,好在始终没有放下自己热爱的东西。大学阶段找了两份开发的工作,也正是这曾经的两段经历,让我意识到自己的不足,和专业职位需求之间的差距。开始有意识的去补充一些东西。

20xx年,我正式成为一名程序员,来到了“社会”这个更为广阔的天地,在这个纷繁复杂的社会上,有着很多资历深厚的前辈,有着无穷无尽的资源,当然也充斥着机会和误区,不过,不管怎样,对于全新的生活,我已做好了准备,希望自己能踏踏实实,走出属于自己的路。

程序员年度工作总结 篇8

输入和输出

iO分类

1 输入 和 输出 流

2 节点流 和 处理流

3 字节流(byte)和 字符流(char)

输入流

字节流

抽象基类 InputStream

读取文件的 FileInputStream

缓冲流 BufferedInputStream

读取各种java基本数据类型的 DataInputStream

读取对象 ObjectInputStream

字符流

抽象基类 Reader

读取文本文件的 FileReader

实现缓冲的 BufferedRead 读取一个行 readLine();newline()输出流

字节流

抽象基类 OutputStream

写文件的 FileOutputStream

缓冲输出流 BufferedOutputStream

写各种java基本数据类型的 DataOutputStream

写对象的 ObjectOutputStreamwriteObject(Object obj);字符流

对象的序列化

一个对象所属的类如果实现

则这个类是序列化类,此类创建的对象就是序列化对象 序列化对象可以通过文件流在文件中进行读和写。

程序员年度工作总结 篇9

数据存储(★★)

1、IOS中常用的数据存储方式有哪些?

答:1.数据存储有四种方案,NSUserDefault,KeyChain,File,其中File有三种方式:plist,Archiver,Stream 包括core Data和FMDB

2、说一说你对sqlite的认识

SQLite是目前主流的嵌入式关系型数据库,其最主要的特点就是轻量级、跨平台,当前很多嵌入式操作系统都将其作为数据库首选。虽然SQLite是一款轻型数据库,但是其功能也绝不亚于很多大型关系数据库。学习数据库就要学习其相关的定义、操作、查询语言,也就是大家日常说得SQL语句。和其他数据库相比,SQLite中的SQL语法并没有太大的差别,因此这里对于SQL语句的内容不会过多赘述,大家可以参考SQLite中其他SQL相关的内容,这里还是重点讲解iOS中如何使用SQLite构建应用程序。先看一下SQLite数据库的几个特点:

1.基于C语言开发的轻型数据库

2.在iOS中需要使用C语言语法进行数据库操作、访问(无法使用ObjC直接访问,因为libqlite3框架基于C语言编写)

中采用的是动态数据类型,即使创建时定义了一种类型,在实际操作时也可以存储其他类型,但是推荐建库时使用合适的类型(特别是应用需要考虑跨平台的情况时)

4.建立连接后通常不需要关闭连接(尽管可以手动关闭)

在iOS中操作SQLite数据库可以分为以下几步(注意先在项目中导入libsqlite3框架):

1.打开数据库,利用sqlite3_open()打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。打开数据库会得到一个sqlite3类型的对象,后面需要借助这个对象进行其他操作。

2.执行SQL语句,执行SQL语句又包括有返回值的语句和无返回值语句。 3.对于无返回值的语句(如增加、删除、修改等)直接通过sqlite3_exec()函数执行;

4.对于有返回值的语句则首先通过sqlite3_prepare_v2()进行sql语句评估(语法检测),然后通过sqlite3_step()依次取出查询结果的每一行数据,对于每行数据都可以通过对应的sqlite3_column_类型()方法获得对应列的数据,如此反复循环直到遍历完成。当然,最后需要释放句柄。

3、说一说你对FMDB的认识

FMDB是一个处理数据存储的第三方框架,框架是对sqlite的封装,整个框架非常轻量级但又不失灵活性,而且更加面向对象。FMDB有如下几个特性:

既然是对于libsqlite3框架的封装,自然使用起来也是类似的,使用前也要打开一个数据库,这个数据库文件存在则直接打开否则会创建并打开。这里FMDB引入了一个MFDatabase对象来表示数据库,打开数据库和后面的数据库操作全部依

赖此对象。

2.对于数据库的操作跟前面KCDbManager的封装是类似的,在FMDB中FMDatabase类提供了两个方法executeUpdate:和executeQuery:分别用于执行无返回结果的查询和有返回结果的查询。当然这两个方法有很多的重载这里就不详细解释了。唯一需要指出的是,如果调用有格式化参数的sql语句时,格式化符号使用“?”而不是“%@”、等。

3.我们知道直接使用libsqlite3进行数据库操作其实是线程不安全的,如果遇到多个线程同时操作一个表的时候可能会发生意想不到的结果。为了解决这个问题建议在多线程中使用FMDatabaseQueue对象,相比FMDatabase而言,它是线程安全的。

4.将事务放到FMDB中去说并不是因为只有FMDB才支持事务,而是因为FMDB将其封装成了几个方法来调用,不用自己写对应的sql而已。其实在在使用libsqlite3操作数据库时也是原生支持事务的(因为这里的事务是基于数据库的,FMDB还是使用的SQLite数据库),只要在执行sql语句前加上“begin transaction;”执行完之后执行“commit transaction;”或者“rollback transaction;”进行提交或回滚即可。另外在Core Data中大家也可以发现,所有的增、删、改操作之后必须调用上下文的保存方法,其实本身就提供了事务的支持,只要不调用保存方法,之前所有的操作是不会提交的。在FMDB中FMDatabase有beginTransaction、commit、rollback三个方法进行开启事务、提交事务和回滚事务。

4、说一说你对Core Data的认识

Core Data使用起来相对直接使用SQLite3的API而言更加的面向对象,操作过

程通常分为以下几个步骤:

1.创建管理上下文

创建管理上下可以细分为:加载模型文件->指定数据存储路径->创建对应数据类型的存储->创建管理对象上下方并指定存储。

经过这几个步骤之后可以得到管理对象上下文NSManagedObjectContext,以后所有的数据操作都由此对象负责。同时如果是第一次创建上下文,Core Data会自动创建存储文件(例如这里使用SQLite3存储),并且根据模型对象创建对应的表结构。

2.查询数据

对于有条件的查询,在Core Data中是通过谓词来实现的。首先创建一个请求,然后设置请求条件,最后调用上下文执行请求的方法。

3.插入数据

插入数据需要调用实体描述对象NSEntityDescription返回一个实体对象,然后设置对象属性,最后保存当前上下文即可。这里需要注意,增、删、改操作完最后必须调用管理对象上下文的保存方法,否则操作不会执行。

4.删除数据

删除数据可以直接调用管理对象上下文的deleteObject方法,删除完保存上下文即可。注意,删除数据前必须先查询到对应对象。

5.修改数据

修改数据首先也是取出对应的实体对象,然后通过修改对象的属性,最后保存上下文。

5、OC中有哪些数据存储方式,各有什么区别? OC中有四种数据存储方式: 1).NSUserDefaults,用于存储配置信息 2).SQLite,用于存储查询需求较多的数据 3).CoreData,用于规划应用中的对象

4).使用基本对象类型定制的个性化缓存方案.NSUserDefaults:对象中储存了系统中用户的配置信息,开发者可以通过这个实例对象对这些已有的信息进行修改,也可以按照自己的需求创建新的配置项。SQLite擅长处理的数据类型其实与NSUserDefaults差不多,也是基础类型的小数据,只是从组织形式上不同。开发者可以以关系型数据库的方式组织数据,使用SQL DML来管理数据。一般来说应用中的格式化的文本类数据可以存放在数据库中,尤其是类似聊天记录、Timeline等这些具有条件查询和排序需求的数据。CoreData是一个管理方案,它的持久化可以通过SQLite、XML或二进制文件储存。它可以把整个应用中的对象建模并进行自动化的管理。从归档文件还原模型时CoreData并不是一次性把整个模型中的所有数据都载入内存,而是根据运行时状态,把被调用到的对象实例载入内存。框架会自动控制这个过程,从而达到控制内存消耗,避免浪费。无论从设计原理还是使用方法上看,CoreData都比较复杂。因此,如果仅仅是考虑缓存数据这个需求,CoreData绝对不是一个优选方案。CoreData的使用场景在于:整个应用使用CoreData规划,把应用内的数据通过CoreData建模,完全基于CoreData架构应用。使用基本对象类型定制的个性化缓存方案:从需求出发分析缓存数据有哪些要求:按Key查找,快速读取,写入不影响正常操作,不浪费内存,支持归档。这些都是基本需求,那么再进一步或许还需要固定缓存项数量,支持队列缓存,缓存过期等。

数据存储这一块,面试常问, 你常用哪一种数据存储?什么是序列化?sqlite是直接用它还是用封装了它的第三方库?尤其是会问sqlite和core data的区别?

5、IOS平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?

iOS中可以有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data coredata可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。coredata提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。在使用coredata的时候,你不用安装额外的数据库系统,因为coredata使用内置的sqlite数据库。coredata将你app的模型层放入到一组定义在内存中的数据对象。coredata会追踪这些对象的改变,同时可以根据需要做相应的改变,例如用户执行撤销命令。当coredata在对你app数据的改变进行保存的时候,core data会把这些数据归档,并永久性保存。mac os x中sqlite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。与coredata框架不同的是,sqlite是使用程序式的,sql的主要的API来直接操作数据表。Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS)。虽然Core Dta支持SQLite作为一种存储类型, 但它不能使用任意的SQLite数据库。Core Data在使用的过程种自己创建这个数据库。Core Data支持对

一、对多的关系。

6、如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢?

编写SQL语句来操作原来表中的字段 增加表字段

ALTER TABLE 表名 ADD COLUMN 字段名字段类型;? 删除表字段

ALTER TABLE 表名 DROP COLUMN 字段名;

.修改表字段

ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名;

7、SQLite数据存储是怎么用?

添加SQLite动态库:

导入主头文件:#import 利用C语言函数创建打开数据库,编写SQL语句

8、简单描述下客户端的缓存机制?

1>缓存可以分为:内存数据缓存、数据库缓存、文件缓存 2>每次想获取数据的时候 3>先检测内存中有无缓存

4>再检测本地有无缓存(数据库文件)5>最终发送网络请求

6>将服务器返回的网络数据进行缓存(内存、数据库、文件),以便下次读取

9、你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?

1>CoreData是对SQLite数据库的封装

2>CoreData中的NSManagedObjectContext在多线程中不安全

3>如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext 4>每个NSManagedObjectContext对象实例都可以使用同一个NSPersistentStoreCoordinator实例,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁

10、core data数据迁移

博客地址: : 320x480、iPhone 4 640x960、iPad 768x1024。以前程序的启动画面(图片)只要准备一个 就可以了,但是现在变得复杂多了。下面就是 CocoaChina 会员做得总结

如果一个程序,既支持iPhone又支持iPad,那么它需要包含下面几个图片: iPad专用竖向启动画面 768x1024或者768x1004 iPad专用横向启动画面 1024x768或者1024x748 iPad专用竖向启动画面(Home按钮在屏幕上面),可省略 768x1024或者768x1004 iPad专用横向启动画面,可省略 1024x768或者1024x748 iPad专用横向启动画面,可省略 1024x768或者1024x748 iPhone默认启动图片,如果没有提供上面几个iPad专用启动图片,则在iPad上运行时也使用(不推荐)320x480或者320x460 Default@ iPhone4启动图片640x960或者640x920 为了在iPad上使用上述的启动画面,你还需要在中加入key: UISupportedInterfaceOrientations。同时,加入值UIInterfaceOrientationPortrait, UIInterfacOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight

17、ASIHTTPRequest实现断点下载

-(IBAction)URLFetchWithProgre:(id)sender { [startButton setTitle:@"Stop" forState:UIControlStateNormal];[startButton addTarget:self action:@selector(stopURLFetchWithProgre:)forControlEvents:UIControlEventTouchUpInside];NSString*tempFile = [[[[NSBundle mainBundle] bundlePath]stringByDeletingLastPathComponent]stringByAppendingPathComponent:@"MemexTrails_"];if([[NSFileManager defaultManager] fileExistsAtPath:tempFile]){ [[NSFileManager defaultManager] removeItemAtPath:tempFile error:nil];} [self resumeURLFetchWithProgre:self];}(IBAction)resumeURLFetchWithProgre:(id)sender { [resumeButton setEnabled:NO];[startButton setTitle:@"Start" forState:UIControlStateNormal];[startButton addTarget:self action:@selector(stopURLFetchWithProgre:)forControlEvents:UIControlEventTouchUpInside];[networkQueue cancelAllOperations];[networkQueue setShowAccurateProgre:YES];[networkQueue setDownloadProgreDelegate:progreIndicator];[networkQueue setDelegate:self];[networkQueue setRequestDidFinishSelector:@selector(URLFetchWithProgreComplete:)];ASIHTTPRequest*request=[[[ASIHTTPRequest alloc] initWithURL:[NSURLURLWithString:@" autorelease];[request setDownloadDestinationPath:[[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"MemexTrails_"]];[request setTemporaryFileDownloadPath:[[[[NSBundle mainBundle] bundlePath]stringByDeletingLastPathComponent]stringByAppendingPathComponent:@"MemexTrails_"]];[request setAllowResumeForFileDownloads:YES];[networkQueue addOperation:request];

}(IBAction)throttleBandwidth:(id)sender { if([(UIButton *)sender state] ==YES){ [ASIHTTPRequest setMaxBandwidthPerSecond:ASIWWANBandwidthThrottleAmount];} else { [ASIHTTPRequest setMaxBandwidthPerSecond:];} }

18、Safari 启动本地app

在plist文件中加入URL types 结构如下图,在Safari中地址栏输入 设置的字符串,比如设置的是

QQ,地址栏输入 就可以起点本地应用。

19、拖到视频进度与滑动手势冲突解决办法

#pragma system */ } else if(floor(NSAppKitVersionNumber)

? ? } else { /* or later system */ } 跟以上一样在 中用定义了NSFoundationVersionNumber全局常量 小结:详解IOS SDK兼容性引导的内容介绍玩玩了,希望通过本文的学习能对你有所帮助!原文地址: 与 NSString 转换

1、将字符串 “Fri Nov 11 09:06:27 +0800 2011” 转换成Date: NSDateFormatter *format = [[NSDateFormatter alloc] init];NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en-US"];[format setLocale:enLocale];[enLocale release];[format setDateFormat:@"EEE MMM dd HH:mm: ZZZ yyyy"];NSDate *dateTime = [format dateFromString:meage];

将Date转换成字符串: NSDate *date = [NSDate date];NSString * dateString = [format stringFromDate:date];//字符串转换成NSDate 需要设置NSLocale 否则真机上会失败。

2、获取当前时间,转化成字符串

NSDateFormatter * formatter = [[NSDateFormatteralloc]init]; = NSDateFormatterMediumStyle; = NSDateFormatterMediumStyle; = [NSLocalecurrentLocale]; = [formatterstringFromDate:[NSDatedate]];

3、获取月、日、年、时、分、秒

NSDateFormatter *formatter =[[[NSDateFormatteralloc] init] autorelease]; = NSDateFormatterMediumStyle; = NSDateFormatterMediumStyle; = [NSLocalecurrentLocale];

NSDate *date = [NSDatedate];

[formatter setTimeStyle:NSDateFormatterMediumStyle];NSCalendar *calendar = [[[NSCalendaralloc] initWithCalendarIdentifier:NSGregorianCalendar]autorelease];NSDateComponents *comps = [[[NSDateComponentsalloc] init] autorelease];NSInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;//int week=0;comps = [calendar components:unitFlags fromDate:date];int week = [comps weekday];int year=[comps year];int month = [comps month];int day = [comps day];[formatter setDateStyle:NSDateFormatterMediumStyle];// //This sets the label with the updated hour = [comps hour];int min = [comps minute];int sec = [comps second];

NSLog(@"day%d",day);NSLog(@"hour%d",hour);NSLog(@"min%d",min);NSLog(@"sec%d",sec);

27、数组中存储数据查询

NSMutableDictionary *userDic1 = [NSMutableDictionary dictionaryWithCapacity:10];NSMutableDictionary *userDic2 = [NSMutableDictionary dictionaryWithCapacity:10];[userDic1 setValue:@"Li" forKey:@"name"];

NSArray *userArray = [NSArray arrayWithObjects:userDic1,userDic2,nil];NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@" contains[cd] %@ ",@"L"];

NSMutableArray *searchArray = [NSMutableArray arrayWithArray:[userArray filteredArrayUsingPredicate:namePredicate]];

NSLog(@"searchArray == %@",searchArray);

28、CoreText 总结

(1)NSAttributedString NSAttributedString 可以将一段文字中的部分文字设置单独的字体和颜色。与UITouch结合可以实现点击不同文字触发不同事件的交互功能。主要方法:

-(void)addAttribute:(NSString *)name value:(id)value range:(NSRange)range;可以设置某段文字的字体名称,颜色,下滑线等信息。

-(void)removeAttribute:(NSString *)name range:(NSRange)range;移除之前设置的字体属性值。

-(void)addAttributes:(NSDictionary *)attrs range:(NSRange)range;存储某段文字包含的信息(包括字体属性或其它,也可以存储一些自定义的信息)-(NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range;通过location来获取某段文字中之前存储的信息NSDictionary

//设置字体

CTFontRef aFont = CTFontCreateWithName((CFStringRef), , NULL);if(!aFont)return;CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(aFont, , NULL, kCTFontItalicTrait, kCTFontBoldTrait);//将默认黑体字设置为其它字体 [self removeAttribute:(NSString*)kCTFontAttributeName range:textRange];[self addAttribute:(NSString*)kCTFontAttributeName value:(id)newFont range:textRange];CFRelease(aFont);CFRelease(newFont);

//设置字体颜色

[self removeAttribute:(NSString*)kCTForegroundColorAttributeName range:textRange];[self addAttribute:(NSString*)kCTForegroundColorAttributeName value:(id) range:textRange];

//设置对齐 换行

CTTextAlignment coreTextAlign = kCTLeftTextAlignment;CTLineBreakMode coreTextLBMode = kCTLineBreakByCharWrapping;CTParagraphStyleSetting paraStyles[2] = { {.spec = kCTParagraphStyleSpecifierAlignment,.valueSize = sizeof(CTTextAlignment),.value =(const void*)&coreTextAlign}, {.spec = kCTParagraphStyleSpecifierLineBreakMode,.valueSize = sizeof(CTLineBreakMode),.value =(const void*)&coreTextLBMode}, };CTParagraphStyleRef aStyle = CTParagraphStyleCreate(paraStyles, 2);[self removeAttribute:(NSString*)kCTParagraphStyleAttributeName range:textRange];[self addAttribute:(NSString*)kCTParagraphStyleAttributeName value:(id)aStyle range:textRange];CFRelease(aStyle);

(2)Draw NSAttributedString

CGContextRef cgc = UIGraphicsGetCurrentContext();CGContextSaveGState(cgc);

//图像方向转换

CGContextConcatCTM(cgc, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, ), ,-));

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)weiBoText);

CGMutablePathRef path = CGPathCreateMutable();CGPathAddRect(path, NULL, drawingRect);textFrame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0,0), path, NULL);CGPathRelease(path);CFRelease(framesetter);

CTFrameDraw(textFrame, cgc);CGContextRestoreGState(cgc);(3)图文混排

CTFrameRef textFrame // coreText 的 frame CTLineRef line // coreText 的 line CTRunRef run // line 中的部分文字 相关方法:

CFArrayRef CTFrameGetLines(CTFrameRef frame)//获取包含CTLineRef的数组 void CTFrameGetLineOrigins(CTFrameRef frame, CFRange range, CGPoint origins[])//获取所有CTLineRef的原点

CFRange CTLineGetStringRange(CTLineRef line)//获取line中文字在整段文字中的Range CFArrayRef CTLineGetGlyphRuns(CTLineRef line)//获取line中包含所有run的数组 CFRange CTRunGetStringRange(CTRunRef run)//获取run在整段文字中的Range CFIndex CTLineGetStringIndexForPosition(CTLineRef line, CGPoint position)//获取点击处position文字在整段文字中的index CGFloat CTLineGetOffsetForStringIndex(CTLineRef line, CFIndex charIndex, CGFloat* secondaryOffset)//获取整段文字中charIndex位置的字符相对line的原点的x值 主要步骤:

1)计算并存储文字中保含的所有表情文字及其Range 2)替换表情文字为指定宽度的NSAttributedString

= kCTRunDelegateVersion1; = ascentCallback; = descentCallback; = widthCallback; = deallocCallback;

CTRunDelegateRef runDelegate = CTRunDelegateCreate(&callbacks, NULL);NSDictionary *attrDictionaryDelegate = [NSDictionary dictionaryWithObjectsAndKeys:(id)runDelegate,(NSString*)kCTRunDelegateAttributeName, [UIColor clearColor].CGColor,(NSString*)kCTForegroundColorAttributeName, nil];

NSAttributedString *faceAttributedString = [[NSAttributedString alloc] initWithString:@"*" attributes:attrDictionaryDelegate];

[weiBoText replaceCharactersInRange:faceRange withAttributedString:faceAttributedString];[faceAttributedString release];3)根据保存的表情文字的Range计算表情图片的Frame textFrame 通过CTFrameGetLines 获取所有line的数组 lineArray 遍历lineArray中的line通过CTLineGetGlyphRuns获取line中包含run的数组 runArray 遍历runArray中的run 通过CTRunGetStringRange获取run的Range 判断表情文字的location是否在run的Range 如果在 通过CTLineGetOffsetForStringIndex获取x的值 y的值为line原点的值 4)Draw表情图片到计算获取到的Frame

(3)点击文字触发事件

主要步骤:

1)根据touch事件获取点point 2)textFrame 通过CTFrameGetLineOrigins获取所有line的原点 3)比较point和line原点的y值获取点击处于哪个line 4)line、point 通过CTLineGetStringIndexForPosition获取到点击字符在整段文字中的 index

5)NSAttributedString 通过index 用方法-(NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range 可以获取到点击到的NSAttributedString中存储的NSDictionary 6)通过NSDictionary中存储的信息判断点击的哪种文字类型分别处理

程序员年度工作总结 篇10

作为一位程序员,每年都需要撰写自己的年度个人工作总结,以总结过去的一年所取得的成就、收获和经验,同时也需要规划未来的工作计划和目标。下面,就让我们一起来看看如何撰写一份详细、具体且生动的程序员年度个人工作总结。

第一部分:简要评估

在开始撰写个人工作总结之前,首先需要对自己过去的工作进行一番评估。这包括自己的工作目标是否达成、工作成果是否符合预期、所面临的问题和挑战以及应对措施等。同时,还需要将自己过去一年所参与的所有项目整理出来,对其中每一个项目进行评估,包括项目的质量、进度、满意度等。

第二部分:工作亮点

接下来,需要详细地描述自己在过去一年中的工作亮点。这些亮点可以是自己在某个技术领域上的突破或是在项目开发中所发挥的重要作用。需要通过具体事例和数据来说明自己的所取得的成就和贡献。

第三部分:工作不足

在总结自己的工作亮点之余,也不能忽略自己的工作不足。这些不足可以是自己技术水平的短板、在工作中所犯的错误以及在项目开发中遇到的困难和挑战等。需要对这些不足进行深刻反思,制定相应的改进计划和措施。

第四部分:工作经验

作为一名程序员,经验是非常宝贵的财富。在年度个人工作总结中,需要详细记录自己在过去一年中所积累到的经验,这些经验既可以是技术方面的,也可以是项目管理和团队合作方面的。需要通过具体实例来证明自己的经验,并阐述这些经验对于自己未来工作的指导意义。

第五部分:未来规划

最后,需要对自己未来的工作计划和目标进行规划。这些目标可以是技术上的提升、职业发展方向的调整或是项目管理和团队合作等方面的提高。需要对这些目标制定具体的步骤和时间表,并注重实践和检验。

总结

个人工作总结不仅是一份记录工作成果的文档,更是自我反思和自我成长的过程。通过深入总结自己的工作,反思自己的不足和经验,规划自己的未来,每一位程序员都可以不断地提升自己,成为一名更加优秀的程序员。

程序员年度工作总结 篇11

还是10个小时就变成20——年了,回首这一年的工作,有硕果累累的喜悦,有工作当中的艰辛,也有遇到困难和挫折时的惆怅。在项目可开发的过程中,难题一个接一个的出现,自信心不止一次的受到过打击,虽然自己早就知道,要做到符合公司的要求,做一名合格的程序员,这些是远远不够的。每天我都会不断勉励自己,好好学,以后会好的。在此同时,公司也给了我很多学习的机会,这是我对以后的编程之路又有了信心。在担任公司程序员一职已经有一年多的时间,在这一年时间里,我学到了很多东西。每个人都是在不断的总结中成长,不断的是审视中完善自己。在这一年里自己也是在总结、审视中脚踏实地完成好自己的本职工作,现将这一年的工作总结如下:

思想方面

严格按照一个程序员应有的素养来约束自己,爱岗敬业,具有强烈的责任岗和事业心,积极主动认真的学习专业知识,工作态度端正,听从公司的安排,积极配合客户完善数字化校园系统。

工作方面

热爱自己的本职工作,能够正确认真的对待每一项工作,工作投入,热心为大家服务,认真遵守劳动纪律,按时上下班,有效利用工作时间,坚守岗位,需要加班完成工作的要按时加班加点,保证工作能够按时完成。在这一年多的时间里面,我本着把工作做的更好这样一个目标,主动了解公司的开发项目流程,请教他们开发技术上的问题。

转载请保留原文链接://www.j458.com/a/5941599.html,并在标注文章来源。
上一篇 : 人事主管年终工作总结(范本九篇)
下一篇 : 最新新店开业提前祝福语36句