欢迎来到一句话经典语录网
我要投稿 投诉建议
当前位置:一句话经典语录 > 心得体会 > c语言实战心得体会

c语言实战心得体会

时间:2017-11-28 08:26

c语言课程的总结

C语言课程设计总结报告课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。

因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。

回顾起此次课程设计,至今我们仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整半个学期的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针……通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。

在设计中我们遇到了很多编程问题,最后在谢老师的辛勤指导下,我们慢慢的进入状态,我们做的是一个俄罗斯方块的设计,内容包括很多。

运用的函数也是非常的复杂,我们一组有八个人,我们分工合作,首先我们一起完成了结构题,然后我们一人各负责一个函数程序的设计,经过几星期的努力,我们完成了大半个程序,但是总是有很多错误出现,有好多是些小问题,这都是我们粗心大意造成的,所以设计程序一定要仔细,不容一点的马虎。

当然也有大问题,关于文件的操作,是我们最大的问题,不过,我们做好后,经过老师的讲解和改错,我们也懂得设计和运用了。

同时,也让我知道了,合作的力量,如果是孤军奋战的话,我们也不能在规定时间内完成,最终达到游纫而解。

同时在这次课程设计中让我们认识到做程序设计这项工作中我门要具备以下素质:很强的团队精神和协作能力和文档习惯。

  良好的文档是正规研发流程中非常重要的环节,缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。

  此外编程是一项高精度的工作所以我们要有规范化,标准化的代码编写习惯通过这次编程我们深深的感受到对代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同人员之间的协作。

我们还要有模块化思维能力  模块化思维就是编程任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作, 学习和总结  善于总结,也是学习能力的一种体现,每次完成一个编程任务,完成一段代码,都应当有目的的跟踪该程序的应用状况,随时总结,找到自己的不足,这样所编写的程序才能逐步提高,生活就是这样,汗水预示着结果也见证着收获。

劳动是人类生存生活永恒不变的话题。

通过实际动手做,我们才真正领略到“艰苦奋斗”这一词的真正含义,我们想说,编程确实有些辛苦,但苦中也有乐,在这个团队的任务中,一起的工作可以让我们有说有笑,相互帮助,配合默契。

对我们而言,知识上的收获重要,精神上的丰收是可喜的。

挫折是一份财富,经历是一份拥有。

这次实际操作必将成为我们人生旅途上一个非常美好的回忆

同时,在谢老师的身上我们学得到很多实用的知识,在次我们表示感谢

同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢

如何更好学习C语言

1.先学习C语言的基础知识。

现在正在学C语言的在校学生可以直接进入第2步学习。

2.按照《C语言程序设计入门学习六步曲》进行上机练习。

3.在上机练习时要养成良好的编程风格。

点击查看C语言的编程风格4.积极参加C、C++兴趣小组,养成和老师与同学交流习惯,从而相互收益。

有时别人不经意的一句话可能使你茅塞顿开--“一句话点醒梦中人”。

5.及时总结自己的学习经验,养成写C语言日记的习惯。

软件有编程日记功能。

6.从网上或教材上找一个自己感兴趣的题目(选题时根据自己的能力,可先易后难,培养自己的成就感,如果有了成就感,即使再苦再累还是感觉C语言学习是一件快乐的事,同学们喜欢打游戏,经常通宵达旦地玩游戏也乐而不疲就是这个道理)进行实战训练,提高自己的C语言综合应用能力。

7. 由于C语言灵活、强大,初学者要全面地掌握它是不可能的,因此在学习C语言的过程中,不要在细枝末节上浪费精力(比如++、--用于表达式的计算,实际上是没有意义的),但一定要熟练掌握C语言的流程控制语句、数组、函数、指针等基础知识的应用,为学习面向对象程序设计打下坚实的基础。

如果这些知识你学不好,要后续学习好C++、可视化的程序设计Visual C++或C++Builder就像空中楼阁,是不现实的。

C语言程序设计入门学习六步曲笔者在从事教学的过程中,听到同学抱怨最多的一句话是:老师,上课我也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手。

发生这种现象的原因有三个: 一、所谓的看懂听明白,只是很肤浅的语法知识,而我们编写的程序或软件是要根据要解决问题的实际需要控制程序的流程,如果你没有深刻地理解C语言的语句的执行过程(或流程),你怎么会编写程序解决这些实际问题呢

二、用C语言编程解决实际问题,所需要的不仅仅是C语言的编程知识,还需要相关的专业知识。

例如,如果你不知道长方形的面积公式,即使C语言学得再好你也编不出求长方形的面积的程序来。

三、C语言程序设计是一门实践性很强的课程,“纸上谈兵”式的光学不练是学不好C语言的。

例如,大家都看过精彩自行车杂技表演,假如,你从来没有骑过自行车,光听教练讲解相关的知识、规则、技巧,不要说上台表演、就是上路你恐怕都不行。

出现问题原因清楚了,那么如何学习呢?请你看【C语言学习六步曲】 在程序开发的过程中,上机调试程序是一个不可缺少的重要环节。

“三分编程七分调试”,说明程序调试的工作量要比编程大得多。

这里以如何上机调试C程序来说明C语言的学习方法。

第一步、验证性练习 在这一步要求按照教材上的程序实例进行原样输入,运行一下程序是否正确。

在这一步基本掌握C语言编程软件的使用方法(包括新建、打开、保存、关闭C程序,熟练地输入、编辑C程序;初步记忆新学章节的知识点、养成良好的C语言编程风格)。

初学者最容易犯的错误是: 1、没有区分开教材上的数字1和字母l,字母o和数字0的区别,造成变量未定义的错误。

另一个易错点是将英文状态下的逗号,分号;括号()双引号输入出入成中文状态下的逗号,分号;括号(),双引号“”造成非法字符错误。

2、C语言初学者易犯语法错误:使用未定义的变量、标示符(变量、常量、数组、函数等)不区分大小写、漏掉“;”、“{”与“}”、“(”与“)”不匹、控制语句(选择、分支、循环)的格式不正确、调用库函数却没有包含相应的头文件、调用未C声明的自定义函数、调用函数时实参与形参不匹配、数组的边界超界等。

3、修改C语言语法错误时要注意以下两点:(1)、由于C语言语法比较自由、灵活,因此错误信息定位不是特别精确。

例如,当提示第10行发生错误时,如果在第10行没有发现错误,从第10行开始往前查找错误并修改之。

(2)、一条语句错误可能会产生若干条错误信息只要修改了这条错误,其他错误会随之消失。

特别提示:一般情况下,第一条错误信息最能反映错误的位置和类型,所以调试程序时务必根据第一条错误信息进行修改,修改后,立即运行程序,如果还有很多错误,要一个一个地修改,即,每修改一处错误要运行一次程序。

第二步、照葫芦画瓢 在第一步输入的C程序的基础上进行试验性的修改,运行一下程序看一看程序结果发生了什么变化,分析结果变化的原因,加深新学知识点的理解。

事实上这和第一步时同步进行的,实现“输入”加深知识的记忆,“修改”加深对知识的理解。

记忆和理解是相辅相成的,相互促进。

例如:将最简单的Hello World!程序#include stdio.hint main(){ printf(Hello World!\\\ ); return 0;}中的printf(Hello World!\\\ );中的Hello World!改成你的姓名,运行一下程序,看有什么变化

再如求1+2+3...+100的和的程序#include main(){ int i,sum=0; for(i=1;i<=100;i++) { sum=sum+i; } printf(sum=%d\\\ ,sum); }第1次将for(i=1;i<=100;i++)中的100改成50,运行一下程序,看有什么变化

第2次将for(i=1;i<=100;i++)中的i++改成i=i+2,运行一下程序,看有什么变化

找出程序结果变化的原因,就加深了对C语句的理解。

第三步、不看教材看是否能将前两步的程序进行正确地输入并运行。

在这一步要求不看教材,即使程序不能运行,看能否将其改正,使其能正确运行。

目的是对前两步的记忆、理解进一步强化。

第四步、增强程序的调试能力在教材中每章都有C语言初学者易犯的错误,按照易出错的类型,将教材中的正确的程序改成错误的程序,运行一下程序,看出现的错误信息提示,并记下错误信息,再将程序改成正确的,运行一下程序。

这样反复修改,就能够学习C语言程序发生错误的原因和修改错误的能力。

注意:每次只改错一个地方,目的是显示发生该错误的真正原因,避免一次改动多个地方,搞清发生错误的真正原因,切记注意:上机调试程序时要带一个记录本,记下英文错误提示信息和解决该错误问题的方法,积累程序调试经验,避免在编程犯同样的错误,切记。

例如,将Hello World程序中语句printf(Hello World!\\\ );中的;改成中文的分号;运行一下程序,看有什么结果

调试程序是一种实践性很强的事,光纸上谈兵是是没用的,就像游泳运动员只听教练讲解示范,而不亲自下水练习,是永远学不会游泳的。

即使在优秀的程序员编写程序也会犯错误的,可能事最低级的语法错误,但他能快速发现错误并改正错误,而我们C语言初学者面对错误提示,不知道发生了什么错误,如何改正,这就事差别。

第五步、研究典型的C语言程序,提高程序设计能力C语言初学者遇到最多的困惑是:上课也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手。

发生这种现象的原因是:所谓的看懂听明白,只是很肤浅的语法知识,而没有深刻地理解C语言的语句的执行过程(或流程)。

计算机是按照人的指令(编写的程序)去执行的,如果不知道这些C语句在计算机中是如何执行的,你怎么回灵活运用这些知识去解决实际问题呢

解决问题的方法是要先理解C语言各种语句的流程(即计算机是如何执行这些语句的过程),然后研读现成C语言经典程序,看懂别人事如何解决问题的,以提高自己的程序设计能力。

第六步、研究课程设计源成序,提高C语言的综合应用能力.C语言好学吗

C语言好学吗

初学者常常问这个问题。

答案很简单,对C语言感兴趣,有强烈的学习欲望,就容易学。

如果不感兴趣,再简单的知识也学不会。

试想一下,现在有几个学校教学生打游戏呢

答案是否定的,可是很多学生都会打游戏,有时达到废寝忘食的地步,打游戏来乐而不疲,而且还经常交流打游戏的心得体会,这就是兴趣的魅力所在。

如果你对C语言感兴趣,为什么不把学习打游戏的经验用到学习C语言呢

如果这样的话,C语言还难学吗

最后送C语言初学者一句话来共勉:首先要相信自己是有能力学好C语言的,然后不惜一切代价把这种能力表现出来,你就成功了。

做任何事,何尝不是这样呢

如何学好c语言

必学。

因为未来就算你不做软件开发。

只管服务器的时候,有的时候你也需要自己看源代码进行修补或者别的什么。

当然可能不光是 C\\\/C++ 的,也可能识别的,但有 C 编程的基础,看别的语言开发内容是很容易的。

具体需要多深,就看你的目标了。

考级其实没意义。

2 级对于未来的程序开发只能说是完全没关系的小儿科。

如果未来不做 Linux 程序开发,那么 2 级也根本没意义。

linux 有自己的认证。

不过我确实没见过程序开发的相关认证,这东西纯看你真的能不能程序开发。

学历要比等级有用处。

尤其是这完全和市场脱节的计算机等级证书。

我九月份要考计算机二级C,想在暑假学习,可我的C语言又不好,我应该从哪几方面去学呢

一下内容是引用的,不过好适合给你看C语言是目前最常用的软件开发语言之一,其功能强大,具有悠久的历史,从C、C++发展到现在的C#,不断地得以更新繁衍。

在全国计算机等级考试中有,五个类别使用C语言作为上机考试内容,为各编程语言中应用最多的。

理论先行 虽是上机考试,仍需以理论知识为基础,所以必须将C语言教材从头到尾学习一遍(应选择权威教材),如谭浩强的C程序设计(没有的可以到下载),对C语言的基本概况做到心中有数。

学完教材后,选取一些有代表性的编程范例,如经典百例或南开百题(),将其语句逐条理解透彻。

同时还须注意一点,看的懂未必等于自己就会编写,应当自己尝试默写,从而找出知识薄弱点、思维盲点。

要养成一些良好习惯,比如,代码书写格式使用规范的锯齿形,尽量使用完整表达。

如果采用简化方式,虽然不一定影响运算结果,但有的考试评分标准是按答题要点给分,所以还是不省为妙。

以下是学习C语言过程中容易出现的问题: 1.函数、变量使用前未定义。

2.混淆“=”和“= =”。

3.语句后或预定义的函数名后漏掉分号。

4.将else拼写成esle、continue拼写成contiune。

5.括号搭配错误。

6.首地址理解为1。

7. p++与++p区别不清。

8. break、continue运用不当。

9.误将单引号用于字符串常量,将双引号用于字符常量。

10. else分句中嵌套条件语句时,漏掉了“if”。

上机实践 虽然考点、培训点一般都提供模拟上机,但毕竟时间、地点受到限制,不能保证充分的练习时间,因此很多考生都希望能在自家电脑上进行操作实践,下面具体谈谈如何实现在个人电脑上进行练习的方法。

一、简易环境练习 系统要求:Windows系统 需用软件:Turbo C 2.0 () TC软件虽然不是标准的Windows程序,但在Windows环境下依然可以使用。

为使软件处于理想运行状态,运行tc.exe后需要做一些设置: 1.按“汉”按钮,否则会出现部分乱码。

2.点击属性按钮,在程序选项卡的“工作目录”栏中根据上一命令行填入程序所在目录,“运行”栏选择最大化,选择“退出时关闭”。

设置好后即可依照练习册输入习题,进行编译调试。

编程中用到的处理数据一般需自建。

为了提高效率,可从网上下载习题。

这里应留意一些下载习题中的问题,比如遗漏字符、录入错误等,还有一些不易发现的情况,像双引号的字体不标准、文件扩展名前的句号成了逗号、甚至一些看似无内容的空行中包含着某些ASCII码,都会影响编程结果。

二、全真环境练习 系统要求:DOS系统 需用软件:Turbo C 2.0、UCDOS、上机模拟软件() 经过基础阶段学习后,再来进行针对等级考试的练习,这就需要用到模拟软件了。

市面上模拟软件很容易买到,其操作界面与正式考试完全一样,还往往汇集了丰富的题库和答案、源程序、输入数据,并可进行自我评分。

有的还提供笔试题知识点查询,介绍考试技巧等。

使用模拟软件前,应先安装UCDOS(这与真实考试要求一样,须选5.0以上版本,而且最好采用正式版,否则可能影响软件使用)。

通常情况下在Windows环境下是无法使用模拟软件的,经过一些专业设置后虽可实现,但仅限于Windows 9X操作系统,而且设置不当易使系统崩溃,所以笔者建议还是在纯DOS环境下使用为妥。

实战心得 笔者参加的今年上半年考试题目大意如下:要求将一篇英文文章中每个字符的ASCII值按公式f(p)=p 17%256计算,如f(p)的ASCII值小于32或为奇数,则原字符不变,否则予以替代。

这道题目需要编写的程序代码没几行,我写好后调试运行,一切正常,复查几遍也看不出有哪儿不妥。

正打算离开考场时,忽然觉得运算结果值得怀疑,根据题意,经过ASCII值计算后的结果不大可能仍都是常规字符,因此回过头来再逐字审查题目,反复对照编好的程序,焦点集中在了存放f(p)值的变量定义上,难道应将“char”改为“unsigned char”

一试,结果果然不同。

事后查知,char变量值的范围为-128至+127,unsigned char变量值的范围为0至255。

比如字符“x”的ASCII值为120,按上述公式运算后值为248,字符应予以替代;如果存放f(p)值的变量定义为char型,值则转换为-8,字符因而不被替代,难怪刚才运算结果显出全篇常规字符了。

所以说,仔细严谨的应考作风能弥补一些技术上的不足,有助于临场发挥。

友情提示 1.由于使用UCDOS,当屏幕下方显示其状态条时,Turbo C中的快捷键Alt+F9(调试编译)、Alt+F5(查看运行结果)等提示会被屏蔽掉,解决的办法为按一下右Shift键,隐藏UCDOS状态条后即可正常使用。

值得一提的是,Alt+F9虽然是Turbo C菜单中的Run\\\/Run命令的快捷键,但两者不完全相同:菜单命令包括自动编译、连接和运行程序;而快捷键方式却不包括运行程序,自然也就无运算结果,所以即使程序代码编写正确,考试成绩仍有可能为零分。

2.虽然一些模拟软件的习题也是从国家考试中心发行的《全国计算机等级考试上机考试习题集》中选取,但正式考试时如遇到练习过的题目,仍应看仔细,其中可能会有“小于”与“大于”之类的一字之别。

C语言 C++到底怎么学????????

当然可以,这个不分年龄的给你个C语言学习的网站吧百度百科,了解C语言(这个要注册)*(这个是学习教程)(视频网站)(C语言学习心得)一些C语言的教材1、《计算机组成原理》(熟悉)2、《数据结构》(掌握)3、《操作系统》(了解->熟悉)4、《The C language》(掌握)5、《编译原理》(了解原理)6、《汇编语言》(了解)7、《计算机网络》(了解)8、《软件工程》(了解)9、《关系数据库》(熟悉)10、《The C++Languege 》(掌握)11、《面向对象设计》(掌握;结合C++学习)C Primer Plus(第五版)中文版《程序员》推荐C++ 图书三人谈 主持人:熊节(透明),《程序员》杂志编辑,C-View成员 嘉 宾:孟岩(梦魇),联想公司掌上设备事业部应用开发处任职,C-View成员。

与侯捷先生合译《C++ Standard Library》一书 金尹(恶魔),上海天宇公司CTO,在《程序员》连载有“自由与繁荣的国度”系列文章 透明:“学C++用哪本书入门”,这是被问得最多的一个问题。

但是哪一本书是最好的入门书

似乎很难找到答案。

《C++ Primer》太厚,《Effective C++》对读者要求比较高,《Essential C++》又常常被批评为“太浅”。

其实说穿了:no silver bullet。

想从一本书学会C++,那是不可能的。

有朋友问我如何学C++,我会建议他先去找本数据结构书,把里面的习题全部用C++做一遍,然后再去看《Effective C++》。

myan经常说“要在学习初期养成好习惯”,我对此颇不以为然。

个人认为,《Essential C++》适合作教材,《C++ Primer》适合作参考书,《Effective C++》适合作课外读物。

恶魔:很后悔当初买了《C++ Primer》。

因为从我个人角度来看,它的功能效用基本是和《The C++ Programming Language》重合。

当然对于入门来说,它还是很不错的。

但是《C++ Primer》太厚,一来导致看书极其不方便,二来系统学习需要花比较长的时间。

对于目前这个越来越快餐化的时代来说,的确有很多不适合的地方,不过可以作为初学者的参考书。

现在我以一块K3 CPU的代价把它借给了别人,希望我那位同事能够从中得到一些益处。

如果已经具备了C基础,我建议看国内的书,例如钱能的《 C++大学教程(第二版) 》。

(如果没有C的基础还是看谭浩强的C语言)。

这本书对C讲得还算比较清晰,有很多习题值得一做,特别是最后的struct和union两个部分。

其中的一些算法比较拖沓和繁琐(比如树和链表的遍历算法),读者可以尝试修改这些例子,作为最后对C语言的一些总结测试。

梦魇:这个问题让我想起四五年前的情形。

今天对于C++有一点认识的人,多半是从那几年就开始学C++了。

那时根本没有品牌观念。

从书店里找一本C++书,如果看着还算明白,就买下来。

我记得那时候宛延闿、张国锋、麦中凡教授的书都受到很高的赞誉。

我个人最早的一本C++书是Greg Perry的一本书,今天想起来,其实是一本打着C++旗号的C语言教程。

对我作用最大的一本书是国防科技出版社出版的一本书,书名记不得了,作者叫斯蒂芬·布莱哈。

透明:还记得以前曾批评过一本C++书,是北航出的,整本书就没有出现过class关键字。

那本书,说穿了其实只是介绍了C语言和iostream库的用法,根本不能算C++。

而当时我常常推荐的一本书是电子科技大学张松梅老师的C++教程。

那本书,直到今天来看也没有太大的问题,唯一的缺憾就是由于年代久远,许多东西已经过时了。

而对于一本技术书籍来说,“过时”是最不可接受的。

总体来说,那时使用C++的人真是在“盲人摸象”。

不过这也有好处,就是对C++的很多细节能搞清楚,以后看到经典好书时比较容易理解;当然坏处就是概念不清,甚至都不知道C++和Visual C++、Borland C++到底有什么不一样。

梦魇:整个90年代,其实大部分人对于C++的认识都似是而非。

一开始是等同于Borland C++,后来是等同于Visual C++和MFC。

所以一般来说,打着BC和VC旗号的书卖得很好,人们觉得这就是C++。

而我比较幸运,布莱哈的那本书虽然从现在的眼光来看谈不上高超,但基本路子是对的。

可能是因为原书是给UNIX程序员的培训教材,所以没有让我一开始就形成“C++ == VC++”的认识。

其实一直到1996年,我们那里搞计算机的都是唯Borland C++马首是瞻的,到了VC 4.0出来,一下子格局全变了。

1997年VC5推出之后,书店里MFC书铺天盖地,学MFC的人,头抬得都比别人高一些。

不过现在看来,那时候大部分的MFC书都是三流货色。

我曾经有一段时间认为,那一批程序员中间有不少被误导了。

根本原因就是相对的封闭。

透明:我觉得一本书的价值有两方面:第一,教给你实用的技术;第二,促使你去思考。

对于一本介绍VC(或者说MFC)使用方法的书,我根本不希望它能促使我有什么思考,所以我就一定要求它在技术上精益求精完美无瑕。

我刚开始用VC的时候,买的第一本书就是潘爱民老师翻译的《VC技术内幕》(第四版),没有受到那些“三流货色”的误导,应该说是很幸运的。

梦魇:1999年机械工业出版社开始出版“计算机科学丛书”,其中的《Thinking in C++》第一版受到了广泛的欢迎。

其实我一直不认为这本书很出色,虽然拿过一次大奖。

然而我们都得承认,这本书在C++书籍领域里第一次建立了品牌观念,很多初学者开始知道,不是随便买哪一本都一样的。

再往后就是2000年的《 深入浅出MFC(第二版) 》第二版,以及侯先生在《程序员》上发表的那一篇《C++\\\/OOP大系》,加上整个大环境的变化,品牌观念深入人心,C++书籍市场终于开始逐渐与世界同步。

回想往事,我的感觉是,那个需要战战兢兢选择入门书的时代已经过去,今天的C++初学者,大可以放心地买口碑好、自己读起来思路顺畅的书,入门不再是太大的问题。

还有一些程序员已经学了几年C++,但看到今天出版的一些新书,感觉比较陌生,这也不是什么问题。

侯先生经常说“凡走过必留下足迹”,所谓“走弯路”,未必不是一件好事。

至于具体的推荐表,就不好一概而论了。

总之在我的印象里,《Essential C++》、《C++ Primer》、钱能教授的C++教程,都不错。

甚至有人一上来就看Bjarne Stroustrup的《The C++ Programming Language》,只要他喜欢,也没什么不可以。

透明:我同意你的观点。

不管怎么说,编程是门实践性非常强的学问。

要想对C++对象模型有深入的了解,最好的办法就是写一串程序去看结果;要想学会OOP,也只能从项目中学。

对于初学者,最好的学习方法就是不停地写程序,写真正有用的程序,写到有问题的时候就去查书,于是自然就会知道哪本书好哪本书不好。

不过我们的教育制度能不能让大学里的学生们有这样的学习机会,我表示怀疑。

以我的经验,学C++有两个门槛:入门和使用。

完全看不懂C++,这是一个门槛,但是只要有一本合适的入门书,很快就能跨过。

要想真正用上C++,却不是件很容易的事情。

尤其对于学生来说,接触到的东西多是“玩具”,很难有实战的机会。

所以经常看见有人问“C++到底能做什么”,这是C++学习中一个比较麻烦的问题。

我们都是做了相当长时间的C++程序之后才看到一些真正经典的书,也正是因为走了相当长的弯路之后才知道这些书的经典之所在。

所谓弯路,我想也是一种必须的积累。

就算一开始就看《Essential C++》和《C++ Primer》,没有两三年的时间恐怕还是难有所得。

恶魔:有两句十分有道理的话,一是我大学的C语言老师说的“写程序不如说是抄程序”,另一句是一网友说的“好的设计来自借鉴,天才的设计来自剽窃”。

对于我这个理性批判主义者来说,这两句话的确不太适合。

但是无论从哪个角度来讲,对于初学者来说,剽窃大师的作品是通向成功的最快捷径。

我个人认为,对于C++的初学者来说,首先要确定自己专业领域内主要使用的特性的方向。

因为C++的特性如此众多,初学者想贪多基本是不可能成功的。

C++的编程范式基本可以分为ADT+PP、GP和OO三个方向。

对于ADT+PP范式来说,初学者的主要问题不是学习C++,而是学习C的使用。

对于这样的初学者,国内的几本书还是写得比较清楚,符合中国人的习惯,比如谭浩强的《C语言教程》、钱能的《C++语言大学教程》。

这两本书我首推第一本,因为这一本我潜心研究了一年,这本书当中很多程序是可以剽窃的,而且可以对这些程序进行加工和提升。

比如结构这一章中,它所给出的用struct来实现链表、二叉树的算法是相当蹩脚的。

学习ADT+PP的初学者将这本书揣摩透以后可以尝试修改这两个程序。

另外这本书的第二版稍微涉及了一些关于“类”的内容。

学习ADT+PP的初学者,可以不被OO中的一些专有特性扰乱自己的思路,对于类层次扁平、无继承、无多态的程序编写是有很大好处的。

透明:你好象比较推崇国内教授写的书。

现在社会上有种不好的风气:一捧就捧上天,一贬就贬下地。

就好象对待谭教授的书,前几年是奉为经典,这几年又有很多人使劲批评。

学C++更是有点“崇洋媚外”,总是觉得初学就应该看《Essential C++》。

我看这种观点也是片面的。

恶魔:当然《Essential C++》也值得看看。

但是我个人觉得这本书没有谭浩强的《C语言教程》来得好。

主要原因是:第一,C++的所有特性都点到了,但是不深,看了以后会三心二意没有方向;第二,可以抄袭借鉴的例子太少。

《C语言教程》中有很多有趣的问题,比如猴子吃桃、汉诺塔等等,这些例子对于刚刚涉及C\\\/C++语言编程的人来说是学习编程很好的例子。

《Essential C++》只能是前两本书看透以后,作为学习C++特性的一个过渡性的书籍。

让读者真正领略到什么是C++的编程、和C编程的不同点在哪里。

透明:我发现一个很有趣的现象:初学者往往喜欢问“哪本书比较好”,这让我很是不解。

这有点像一个刚学打篮球的人问“王治郅和科比谁比较厉害”。

当然科比更厉害一些。

但如果你是想学打篮球,这两个人都非常非常有资格教你,你跟谁学都能学得很强——关键不是在于你选哪个老师,而是在于你自己用多少功夫去学。

透明:回到原来话题。

学会了C++的语法,能看懂C++代码之后,必须有些书来指导进阶(或者叫指点迷津)。

我觉得《设计模式》很好,能够让读者看到一些精妙的用法。

不过正如我经常说的,模式带来的麻烦和好处一样多,甚至麻烦还要更多。

而且,C++本身的问题使得在C++中使用GoF模式愈加麻烦。

梦魇:《Design Patterns》这本书绝对是不可以没有的,而且中英文版都不可少。

最初我看中文版,说实话看不懂,但是也不觉得人家翻译得不好,所以就想,大概是原文就很难懂,加上自己水平有限。

于是总是想着再找几本patterns的书来看。

后来找到几本书,口碑还不错,不过水平高下,一比就出来了,还是那本《Design Patterns》最经典,最耐看。

英文版出来之后,两个版本对照看,明白多了。

现在觉得,其实就设计模式来讲,把这本看明白了就很不错了,不用再花费很多心思找其他的书。

我现在的包里始终夹着这本书,随身携带,有备无患。

至于说设计模式的副作用,和可能带来的弊端,我的体会也挺多。

不过是这样,我们想一想,究竟什么情况下设计模式可以用得很好呢

一种是有经验丰富的人引导,比如要是Robert Martin带队,你在某个地方用错了设计模式,他就会指出来,说这里不对,将来会产生什么样的弊端。

对于他来说,丰富的实践经验足以支持他进行“预测型”设计。

但是大部分人没这个能力,因此我们只好走第二条路和第三条路,就是“试探型”设计和“重构型”设计。

遇到一个问题,你觉得用某种模式挺合适的,就大胆地用了,成功是积累经验,发现不好,出了问题了,只好改回来,那也是积累教训。

这叫做“试探型”。

至于重构,应该算是最有组织、成功率最高的工程化方法。

先把问题“quick and dirty”地解决了,所有的暗礁都暴露出来,然后再根据实际情况采用合适的模式优化设计。

现在XP和UP都高度重视refactory,UP在Elaboration和Construction阶段都鼓励抽出专门的iterations进行重构。

所以说如果组织快速的软件开发,当然比较倾向于这条路——打成功率嘛。

透明:讲到重构,我顺便说说《Refactoring》这本书的影响。

从工程本身的角度来说,你所谓的“重构型设计”是没有什么问题的。

但中国的开发者(也包括我在内)往往比较冲动,比较容易相信银弹的存在。

曾经有那么一段时间,我在Java中尝试过了重构的方法之后,又拿到C++中去尝试。

结果发现,在Java中速度非常快的重构过程,到C++中就被减慢了。

究其原因,就是因为C++和Java的约束条件不同。

拿着Java中成功的案例直接套C++,不失败才怪。

所以,我必须说:《Refactoring》这本书很有价值。

但对于C++程序员来说,它的价值是让你思考,思考这种方法的可行性。

如果一个C++程序员没有打算迁移到Java,那么我必须告诉他:《Refactoring》这本书不是让你照着它用的,甚至不是让你去相信它的。

对于C++程序员,《Refactoring》全书可以放心相信的只有第13章,其他的部分,都必须非常谨慎地对待。

梦魇:我还要就“试探型”的方法多说两句,我觉得对于个人发展来讲,“试探”也是必不可少的,撞墙不可怕,高水平的人不都是撞出来的吗

你失败了一次,就知道这个模式有什么潜在的问题,下次再用,就会多看几步,像下棋似的。

撞的多了,路数就出来了。

我不知道你们是否有这个感觉:用错了模式,吃了亏,再回过头去翻翻《Design Patterns》,看到人家早就指出来这个问题,不过就是那么几句话,原来看上去干巴巴的,现在觉得句句都讲到心坎上,GoF的形象马上就高大起来,还带着光环,感觉是既兴奋又懊悔。

透明:现在回头来看,我更欣赏myan推荐给我的《Designing Object-Oriented C++ Applications Using Booch Method》。

这本书能够帮助C++程序员理清思路培养习惯,可惜国内没有引进。

相比后来商业味浓厚的UML系列书籍,我觉得这本书对于面向对象的阐释精辟独到,至今未有能出其右者。

梦魇:刚才我们两人都说到Robert Martin,他可是我的榜样。

那本1995年的《Designing Object Oriented C++ Application》,我觉得是每一个C++软件工程师都应该反复研读的书。

可惜不仅国内没有引进,在国外的名气也不大。

如果你觉得面向对象的那些道理你好像都明白,可就是一遇到实际问题就使不上劲,那这本书就是你的最佳导师。

提到理清思路,还有一本书不得不提,就是Andrew Koenig的《Ruminations On C++》。

每个人都应该问自己,我学了这么多年的C++,究竟什么是C++最基本的设计理念

遇到问题我第一个直觉是什么

第一个试探型的解决方案应该具有那些特点

如果你不能给出明确的答案,就应该认真地去读这本书,读完了你就有了“主心骨”。

透明:插一句话,谈谈“推荐书”的问题。

入门书基本上是放之四海而皆准的,所以推荐的意义也不大。

而入门后的发展方向,每个人不同,这个时候就需要“高人”的指点。

举个例子:我学C++的时候,myan还不认识我,所以也没有给我推荐书,我还是学过来了,所以即使你当时向我推荐了《Essential C++》或者《C++ Primer》,我也不会太感谢你;但在我认真研究OO的时候,你推荐Robert Martin那本书给我,对我帮助就特别大,而且我从别的地方也很难找到类似的推荐,所以我就很感谢你。

一个程序员,必须有framework的意识,要学会用framework,还要主动去分析framework(在这方面,《Design Patterns》能有一定的帮助)。

但是,真正高质量、成气候的framework的书恐怕也就只有针对MFC的。

从这个角度来说,MFC纵有千般不是,C++程序员都非常有必要先去用它、熟悉它、研究它,甚至借助《深入浅出MFC》这样的书来剖析它。

不然,很难有framework的意识和感觉。

当然,另一个framework也很好,那就是STL。

不管用不用MFC、STL,对这两个东西的掌握和理解都是极有帮助的。

最近我又在看《深入浅出MFC》,虽然已经不用MFC编程了,但帮助是一定有的。

梦魇:MFC和STL方面,我还是比较推崇侯先生的两本书《深入浅出MFC》和《STL源码解析》。

《深入浅出MFC》这本书,名气自然是大得不得了,不过也有不少人批评。

其实书也没有十全十美的,批评当然是少不了的,不过有的时候我看到有人评论这本书,把它跟Inside VC相比,真的是牛头不对马嘴。

你刚才其实说得很对,程序员应该有一点framework意识。

而这本《深入浅出MFC》与其说是在讲MFC编程,不如说通篇是在拿MFC为例分析Application Framework的架构和脉络。

所以无论你对于MFC本身是什么态度,这本书对每一个C++程序员都有很大的益处。

透明:是的。

《VC技术内幕》会告诉你“DYNAMIC_CREATE这个宏怎么用”,《深入浅出MFC》则告诉你“DYNAMIC_CREATE这个宏是怎么实现的”。

所以,如果你只需要在VC下写一些小应用程序,《深入浅出MFC》的价值并不太大;但是,如果你需要设计一个稍微大一点的东西(不一定是framework),MFC的设计思想就会有所帮助。

梦魇:另外,我觉得对于MFC也应该有一个公允的评价。

过去是吹捧得天上有地下无,书店里铺天盖地都是MFC的书,搞得大家只知有MFC,不知有C++,甚至直到现在还有人问:“我是学MFC呢,还是学C++

VC++是不是比C++更高级的语言

”MFC成了一尊神像,阻碍了人们的视线。

所以得把它从神坛上拉下来。

这就是过去一两年有很多人,包括我在内批评MFC的一个目的。

可是现在大家视野开阔了,.NET也出来了,MFC不再是神像了,少数人就开始以贬损MFC为乐了。

我觉得这种态度是不对的。

什么叫好的框架

我觉得在十几年的时间能够象MFC这样保持稳定并且不断进步的框架就是好的框架。

可能我们在一些具体的设计问题上有不同看法,觉得“这个地方这么设计不是更漂亮吗

”很多时候是的,但是这不重要,重要的是MFC成熟稳定、有十几年的成功经验,这是最了不起的东西。

另外一点,MFC中间包括着学习Win32 API编程的最佳资料。

这是除了其framework方面之外的另一个亮点。

我现在使用Win32 API开发,但是经常参考MFC的源代码,收获很大。

透明:STL方面,我对于剖析它的源代码兴趣并不大,毕竟里面源代码多是算法问题。

所以,《STL源码剖析》我也只是随便翻翻就束之高阁了。

我觉得这本书用来做计算机系的数据结构和算法教材不错,不知道有没有老师乐意这样做。

对于STL,我的态度一向都是“应用至上”。

不过,我一直认为SGI STL本身就是一本精彩的书,一本数据结构和算法的经典参考书,同时也是泛型技术的参考书。

想知道一个算法是如何实现的,看看STL源代码就行;想知道如何使用type traits,STL源代码里面也有例子。

看别人写的书,总觉得隔着一层纱,有点挠不到痒处的感觉。

SGI STL的代码写得非常漂亮,一个C++程序员如果不看看这本书,实在是可惜。

梦魇:至于STL,除了《STL源码解析》之外,我举贤不避亲,强烈推荐侯先生与我合译的那本《The C++ Standard Library》。

这本书质量之高是无需怀疑的。

我现在手边常备此书,随时查阅,对我帮助很大。

透明:C++和Java相比,最大的优势就是它没有一个专门的公司来管它,最大的弱点也是它没有一个专门的公司来管它。

Java程序员在学会简单的语法之后,立刻进入SUN提供的framework,一边用这个现成的framework做实际开发,一边在开发过程中继续学习Java一些幽深的特性。

而这个时候,C++程序员恐怕还在问“VC和BCB哪个好”呢。

这无疑是浪费时间。

梦魇:刚才你说Java和C++的优劣,这个话题已经成了我们这个年代永不消失的声波了。

我也不想再谈这个。

不过有一点我得说清楚:现在我们很多用C++的人吃了不少苦头,探过脖子去看看Java,觉得它真是太可爱了,这种印象是不准确的。

另外,Java也不简单,而且会越来越庞大复杂。

在很多场合,Java还不具有竞争力。

至于将来如何,我看有些Java爱好者也过分乐观了,似乎计算机科学界几十年解决不了的问题都可以借着Java的东风解决掉,恐怕没那么容易。

透明:那当然。

我再次强调:No Silver Bullet。

读书很重要,但古人说“行万里路,读万卷书”,还是把“行路”放在“读书”前面。

尤其对于技术书籍,如果它不能帮我解决问题、不能给我带来非常实际的利益,那么我是不会去读它的。

恶魔说得对,我们这个社会很快餐,我们这个行业尤其很快餐,我们也只能努力适应它。

求c\\\/c++编程心得,就是自己感觉比较好的地方和技巧

编程,就是把复杂的问题简单化,简化到每个动作都是1+1=2那么简单,然后计算机照做就好了。

这就是我理解编程的真谛。

我师姐听到了,也若有所悟,这个话题就没有再说了。

我们来分析一下计算机的特点,准确的讲,目前我们这个社会的计算技术,还很原始,说它是计算机,正确,它确实只能计算,说它是电脑,太抬举它了,它不可能有思考能力。

在冯诺依曼体系架构中,计算设备就是具有一定计算能力,有能力和外界做出IO互动,并且能高速重复动作的这么一种设备,这可能和大家在教科书里面学到的不太一样啊,不过,我是这么理解的。

因此,我从一开始,就没有把计算机作为一个伙伴,一个可以帮助我出主意,或者代替我思考的伙伴,仅仅是看做一种工具,这种工具有什么用呢

我认为它最重要的,有两个作用:1、无限可重复性,一个动作序列,一旦编订程序,计算机就可以无数次重复这个序列,不会感到累。

这特别适合于那些乏味的,不断重复的劳动,比如,我们一个学校每天要敲钟,打上课铃,如果让人来做,这个人会很乏味,做久了,就可能出错,但是让计算机来做,它可没有什么思想,不会觉得累,而且做的很好。

计算机特别适合做重复性工作。

2、服务品质的稳定性。

计算机适合做重复工作,还有个有点,就是每次执行结果都是一样的。

这体现了工业化时代最重要的一个思想:量产思维,大家可以看到,现在的社会,不可重复的艺术固然很好,但公众需要的是量产的产品,因为质量稳定,产量稳定,能满足大众需求。

劳斯莱斯虽然很美,但绝大多数人在开大众、丰田等低端车。

就是这个道理。

还是打铃那个例子,如果是人,可能会生病,可能会请假,或者干脆搞忘了,但计算机不会,只要有电在正确工作,打铃就不会出错。

这样,我就慢慢理解到了,计算机其实就是能以恒定品质不断重复输出服务的机器而已。

ok了,这我们是不是可以理解到,计算机编程,其实首先是人的工作,当我们遇到一个服务需求,我们人来做一次,嗯,获得一个比较满意的结果,然后我们觉得这个动作可以重复,下次遇到类似的问题,照做就好了。

于是,我们就安排计算机来做这件事了。

是不是这样

这是不是说明,程序,其实是在讲一件事应该怎么做,这个做的过程,以及这个过程的含义,其实是人定义出来的,然后通过编程,教给计算机来做而已。

我以前经常有种感觉,计算机编程,是两层意思,一层,是程序本身的含义,就是怎么做事,另一层,是隐含在程序下面的逻辑含义,就是做事的意义,程序只是字面上的意思,而逻辑,是程序段落组合起来,共同表述的一层意思。

现在想想,其实就是这个道理。

嗯,既然我们知道,编程,就是把做一件事情的步骤,分拆开来,教计算机去做,但,分拆到什么粒度呢

这个很重要。

如果分拆的粒度太细,白白浪费程序员的时间和精力,这些都是成本。

而分拆得太粗,计算机还是弄不明白,做事不对,就是bug了。

这说明,编程有个很重要的概念,就是粒度,也就是我们对问题描述的精细程度。

最开始的计算机是最笨的,学过计算机组成原理的同学大概知道,只要有个累加器,其实已经可以算一台计算机了,只会做加法计算。

因为从数学上,我们可以知道,任何计算,最终都可以演化成加法计算,事实上,现在的CPU,在最底层核心的部分,也还是这个加法逻辑。

这样做当然没什么不好,不过,有个小小的问题,就是粒度太细了。

如果每件事情,都要程序员去拆解成很细的加法计算,这个工作就几乎不是人干的事情了。

难道就无解了吗

呵呵,前面我们说过,计算机的特点是什么

无限重复,大家就发现,一个事情,比如7*24,这是乘法计算,但是,我们最终要拆解为加法计算去实现,但是,不是说我们每次都要这么拆解,乘法计算也是一个工作,有规律的,因此,当我们拆解一次之后,我们当然可以把这次拆解过程本身,编订为程序,下次遇到类似问题,让计算机把这个程序再跑一遍就ok了。

呵呵,大家以为Intel的CPU里面的乘法计算指令是怎么实现的

大家又以为AMD的CPU内部的微代码体系是怎么实现的

就是这么一个思维,解决了所有的问题,遇到需求,首先拆分,然后不断检索我们以前是不是以前拆分过了,遇到能套用的程序段落,就直接用,不用每次都拆分那么细,减少工作量,当然,遇到新问题,还是需要自己拆解的,不过,拆解后,最好把拆解本身,也写成程序,下次重用。

大家玩各种语言,一般都提供基本库,这个基本库,其实就是前人已经拆解过的结果,软件公司觉得有代表性,可以满足大多数应用场合,就编订到基本库里面,以后程序员直接用,不用自己重复了,大家说是不是这样

现在,大家知道怎么看待C的stdio.h,stdlib.h这些基本库了吧

C++的iostream是什么含义,知道了不

MFC知道了不

Java的运行时库是什么意思,也知道了吧

不过呢,这个世界的需求总是很多的,并且,计算机的能力也是不断在进步,以前不适合计算机做的事情,现在也慢慢变得适合了。

因此,大家总能遇到一些新问题,需要自己重新拆解,基本库中没有提供,这就是程序员这个职业存在的真实含义。

帮助用户不断拆解新需求,解决新问题。

当然,库本身也在进步,不断把已经被证明拆解成功的问题,修补到库中,避免以后的程序员做重复工作。

就这么简单。

呵呵,啰嗦了这么多,可能很多同学看的一头雾水,肖舸老师你到底想说啥

我想说的,其实很简单,编程序,就是拆解问题,但讲究个拆解的技巧和方法,以前人做过的,别做,尽量用,没有的,做过一次,尽量保留下来,供下次使用,就这么简单。

那,这和本文的题目“修炼编程的内功”有啥关系呢

当然有关系了,什么叫编程的内功

我的理解,就是对这个世界的抽象化理解能力以及描述能力。

一个工作,能迅速从中提炼出下次可以重复的套路,并且能以一定的规则,就是计算机语言规范,描述出来,拥有这两个能力,就能保证遇到任何问题,都有办法写出程序来。

所以,大家学校中学了很多数学,语言,算法,数据结构,甚至编译原理,操作系统,其实这些统统是工具,不是写程序的目的。

写程序,就是遇到需求,能迅速抽象,理解其共性,并能以清晰的语言描述出来。

上述学科,不是帮助提升你的抽象能力,就是帮助提升你的描述能力,大家看是不是这个道理

所以,我在带徒弟的时候,有时候喜欢说一句话,其实作为程序员,学习一点语文有好处,因为最能培养描述能力的,其实还是语文。

英语不算啊,英语虽然也是一门语言,但中国的教育,一般是能看懂,很少从一个英文文学家的角度培养学生用英文的描述能力。

只有我们的语文课,这不但是教语言,而且通过无数次造句和作文,在教大家描述问题的组织能力,这个能力在写程序的时候,很有用。

这个时候,话题就出来了。

中国的语文,先是甲骨文,然后古文,然后白话文,大家发现没有,总体是越来越简单,这是发展的趋势。

为什么呢

因为大家觉得,语文就是让人懂的,太深奥的东东,不太适合普及,就没有生命力,反而越简单的东东,普及越快。

因此,请大家注意,写程序时拆解,是把问题简单化,不是说把一个问题描述得晦涩难懂,才叫本事。

真正的程序高手,都是简化问题的大师。

当然,从这个话题,我们是不是可以得出一个结论,其实写程序的方法本身,编程的内功本身,其实是没有什么语言特性的,C、C++、Java、PHP、Python。

是不是都用的同一种方法在做事情

因此,我这里提出,修炼编程的内功,是学习抽象能力和描述能力,与语言无关,换而言之,从任何一门语言入门,都可以修炼到内功的极致,关键看你用不用心。

因此,学习期间,我的建议,不要好高骛远,不要去评价语言的好坏,平台的好坏,没有多大意义的,你并不能确定这辈子最终能在哪个平台下用哪种语言开发。

捡着手边有的书,老师教的课程,埋进去学扎实,出来后,换语言比吃盘菜也难不倒哪去,呵呵。

这算是正式回答杰杰同学的问题。

再说一下郭晓同学的问题。

他列了一个很偏的题目,就是有两个变量a和b,不用if、?:、switch或其他判断语句,找出两个数中比较大的那个。

这个问题,我不认为是个好问题,因此提出异议。

主要的原因就是基于上述的讨论,我认为评价一个程序员好坏的标准,应该是考察其简化描述问题的能力,而不是把问题复杂化的本事。

这在学院派里面很多,这里大家可不要生气啊,我知道大家现在基本上都是大学学计算机专业的,算是学院派,但肖老师我的实战出来的,看法很多都和大家不一样。

学校里面,老师的任务是把尽可能多的东东教给大家,因为他不知道以后你做什么工作,哪些知识没用,因此,学校老师会尽量培养大家描述复杂问题的能力,这就造成了,学校里面的考试,是尽量把问题复杂化,多考察大家几个项目。

学校里面的风气,也认为能解决复杂问题算高手,甚至问题本身不复杂,大家把它造复杂,来考核自己的能力。

但实际工作中不是这样的,实际工作中,大家最看重的是能用最简单的办法解决问题的能力,因为这样成本最低,无形中,大家赚钱最多。

所以,对问题的抽象拆解和清晰描述非常看重。

很多同学刚刚上班,会很不适应,其实就是这个思路的转换。

学院里,以复杂为美,而商业公司中,以简单为美。

这应该是一个很大的思想转变,甚至是世界观的改变,很难的。

一般转的比较快的同学,在公司里面进步就比较快,但我也见过工作几十年了,还是没有转过来的程序员,一般在公司里面活的就比较累一点。

建议大家好好思考一下我今天的提法,看问题抓本质,只要能及时理解商业公司的开发思路,理解简单这个要素,我不敢说大家一定能找到工作,但只要找到了,在公司里面,基本都能快速融入公司。

声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。联系xxxxxxxx.com

Copyright©2020 一句话经典语录 www.yiyyy.com 版权所有

友情链接

心理测试 图片大全 壁纸图片