《上帝掷骰子吗——量子物理史话》读书笔记

举一个简单的例子,星光可以穿过几乎虚无一物的太空来到地球,这对波动说显然是非常不利的。但是波动说巧妙地摆脱了这个难题:它假设了一种看不见摸不着的介质来实现光的传播,这种介质有一个十分响亮而让人印象深刻的名字,叫做“以太”(Ether)。

以太在历史上的地位可以说是相当微妙的,一方面,它曾经扮演过如此重要的角色,以致成为整个物理学的基础;另一方面,当它荣耀不再时,也曾受尽嘲笑。虽然它不甘心地再三挣扎,改换头面,赋予自己新的意义,却仍然逃不了最终被抛弃的命运,甚至有段时间几乎成了伪科学的专用词。

胡克和波义耳正是当时评议会的成员,他们对此观点进行了激烈的抨击。胡克声称,牛顿论文中正确的部分(也就是色彩的复合)是窃取了他1665年的思想,而牛顿“原创”的微粒说则不值一提。牛顿大怒,马上撤回了论文,并赌气般地宣称不再发表任何研究成果。

不过牛顿的性格是以小气和斤斤计较而闻名的,这从以后他和莱布尼兹关于微积分发明的争论中也可见一斑。

艾萨克·牛顿先生(而且马上就要成为爵士)。这位科学巨人——不管他是出于什么理由——已经决定要给予波动说的军队以毫不留情的致命打击。为了避免再次引起和胡克之间的争执,导致不必要的误解,牛顿在战术上也进行了精心的安排。直到胡克去世后的第二年,也就是1704年,牛顿才出版了他的煌煌巨著《光学》

在牛顿的《原理》出版之后,胡克要求承认他对这个定律的优先发现,但牛顿最后的回答却是把所有涉及胡克的引用都从《原理》里面给删掉了。

菲涅尔理论的这个胜利成了第二次微波战争的决定性事件。他获得了那一届的科学奖(Grand Prix),同时一跃成为了可以和牛顿、惠更斯比肩的光学界的传奇人物。圆盘阴影正中的亮点(后来被相当有误导性地称作“泊松亮斑”)

在两人完成了《关于偏振光线的相互作用》这篇论文后,菲涅耳指出只有假设光是一种横波,才能完满地解释这些现象,并给出了推导。然而阿拉果对此抱有怀疑态度,认为菲涅耳走得太远了。他坦率地向菲涅耳表示,自己没有勇气发表这个观点,并拒绝在这部分论文后面署上自己的名字。于是最终菲涅耳以自己一个人的名义提交了这部分内容,引起了科学院的震动,而最终的实验却表明他是对的。

人们开始倾向于认为:物理学已经终结,所有的问题都可以用这个集大成的体系来解决,而不会再有任何真正激动人心的发现了。一位著名的科学家(据说就是伟大的开尔文勋爵)说:“物理学的未来,将只有在小数点第六位后面去寻找”。普朗克的导师甚至劝他不要再浪费时间去研究这个已经高度成熟的体系。

他想尽了办法,几乎检查了他所有的仪器,重复了几十次实验,但是这个千分之二的差别就是顽固地存在在那里,随着每一次测量反而更加精确起来。这个障碍使得瑞利几乎要发疯,在百般无奈下他写信给另一位化学家拉姆塞(William Ramsay)求救。后者敏锐地指出,这个重量差可能是由于空气里混有了一种不易察觉的重气体而造成的。在两者的共同努力下,氩气(Ar)终于被发现了,并最终导致了整个惰性气体族的发现,成为了元素周期表存在的一个主要证据。

也就是说,物体的热辐射和温度有着一定的函数关系(在天文学里,有“红巨星”和“蓝巨星”,前者呈暗红色,温度较低,通常属于老年恒星;而后者的温度极高,是年轻恒星的典范)。

普朗克在大学里的导师祖利(Philipp von Jolly)劝他说,物理的体系已经建立得非常成熟和完整了,没有什么大的发现可以做出了,不必再花时间浪费在这个没有多大意义的工作上面。普朗克委婉地表示,他研究物理是出于对自然和理性的兴趣,只是想把现有的东西搞搞清楚罢了,并不奢望能够做出什么巨大的成就。讽刺地是,由今天看来,这个“很没出息”的表示却成就了物理界最大的突破之一,成就了普朗克一生的名望。我们实在应该为这一决定感到幸运。

1019,普朗克在柏林德国物理学会(Deutschen Physikalischen Gesellschaft)的会议上,把这个新鲜出炉的公式公之于众。当天晚上,鲁本斯就仔细比较了这个公式与实验的结果。结果,让他又惊又喜的是,普朗克的公式大获全胜,在每一个波段里,这个公式给出的数据都十分精确地与实验值相符合。第二天,鲁本斯便把这个结果通知了普朗克本人,在这个彻底的成功面前,普朗克自己都不由得一愣。他没有想到,这个完全是侥幸拼凑出来的经验公式居然有着这样强大的威力。

请记住19001214日这个日子,这一天就是量子力学的诞辰。量子的幽灵从普朗克的方程中脱胎出来,开始在欧洲上空游荡。几年以后,它将爆发出令人咋舌的力量,把一切旧的体系彻底打破,并与联合起来的保守派们进行一场惊天动地的决斗。

总而言之,对于特定的金属,能不能打出电子,由光的频率说了算。而打出多少电子,则由光的强度说了算。

这里面关键的假设就是:光以量子的形式吸收能量,没有连续性,不能累积。一个量子激发出一个对应的电子。于是实验揭示出来的效应的瞬时性难题也迎刃而解:量子作用本来就是瞬时作用,没有积累的说法。

1666年,23岁的牛顿为了躲避瘟疫,回到乡下的老家度假。在那段日子里,他一个人独立完成了几项开天辟地的工作,包括发明了微积分(流数),完成了光分解的实验分析,以及万有引力的开创性工作。在那一年,他为数学、力学和光学三大学科分别打下了基础,而其中的任何一项工作,都足以让他名列有史以来最伟大的科学家之列。很难想象,一个人的思维何以能够在如此短的时间内涌动出如此多的灵感,人们只能用一个拉丁文annus mirabilis来表示这一年,也就是“奇迹年”(当然,有人会争论说1667年其实也是奇迹年)。

1905年的爱因斯坦也是这样。在专利局里蜗居的他在这一年发表了6篇论文,318,是我们上面提到过的关于光电效应的文章,这成为了量子论的奠基石之一。430,发表了关于测量分子大小的论文,这为他赢得了博士学位。511和后来的1219日,两篇关于布朗运动的论文,成了分子论的里程碑。630,发表题为《论运动物体的电动力学》的论文,这个不起眼的题目后来被加上了一个如雷贯耳的名称,叫做“狭义相对论”,它的意义就不用我多说了。927,关于物体惯性和能量的关系的论文,这是狭义相对论的进一步说明,并且在其中提出了著名的质能方程E=mc2

上帝造了光,爱因斯坦指出了什么是光,而康普顿,则第一个在真正意义上“看到”了这光。

“第三次微波战争”全面爆发了。卷土重来的微粒军团装备了最先进的武器:光电效应和康普顿效应。

除去一些稍微疏远一点的case,卢瑟福一生至少培养了10位诺贝尔奖得主(还不算他自己本人)。

瑞利爵士(我们前面提到过的瑞利金斯公式的发现者之一)对此表现得完全不感兴趣,J. J.汤姆逊,玻尔在剑桥的导师,拒绝对此发表评论。另一些不那么德高望重的人就直白多了,比如一位物理学家在课堂上宣布:“如果这些要用量子力学才能解释的话,那么我情愿不予解释。”另一些人则声称,要是量子模型居然是真实的话,他们从此退出物理学界。即使是思想开放的人,比如爱因斯坦和波恩,最初也觉得完全接受这一理论太勉强了一些。

每一天,新的报告和实验证据都如同雪花一样飞到玻尔的办公桌上。而几乎每一份报告,都在进一步地证实玻尔那量子模型的正确性。当然,伴随着这些报告,铺天盖地而来的还有来自社会各界的祝贺,社交邀请以及各种大学的聘书。玻尔俨然已经成为原子物理方面的带头人。

电子也是一样。电子是粒子还是波?那要看你怎么观察它。如果采用光电效应的观察方式,那么它无疑是个粒子;要是用双缝来观察,那么它无疑是个波

波和粒子在同一时刻是互斥的,但它们却在一个更高的层次上统一在一起,作为电子的两面被纳入一个整体概念中。这就是玻尔的“互补原理”(Complementary Principle),它连同波恩的概率解释,海森堡的不确定性,三者共同构成了量子论“哥本哈根解释”的核心,至今仍然深刻地影响我们对于整个宇宙的终极认识。

“第三次波粒战争”便以这样一种戏剧化的方式收场。而量子世界的这种奇妙结合,就是大名鼎鼎的“波粒二象性”。

就像漫画中教皇善与恶的两面,虽然在每个确定的时刻,只有一面能够体现出来,但它们确实集中在一个人的身上。波和粒子是一对孪生兄弟,它们如此苦苦争斗,却原来是演出了一场物理学中的绝代双骄故事,这教人拍案惊奇,唏嘘不已。

一个原子就像一幢宿舍,每间房间都有一个四位数的门牌号码。底楼只有两间房间,分别是10011002。而二楼则有8间房间,门牌分别是20012002210121022111211221212122。越是高层的楼,它的房间数量就越多。脾气暴躁的管理员泡利在大门口张贴了一张布告,宣布没有两个电子房客可以入住同一间房屋。于是电子们争先恐后地涌入这幢大厦,先到的两位占据了底楼那两个价廉物美的房间,后来者因为底楼已经住满,便不得不退而求其次,开始填充二楼的房间。二楼住满后,又轮到三楼、四楼……一直到租金离谱的六楼、七楼、八楼。不幸住在高处的电子虽然入不敷出,却没有办法,因为楼下都住满了人,没法搬走。叫苦不迭的他们把泡利那蛮横的规定称作“不相容原理”。

18岁那年(1910),他从大学毕业,然而却没有在历史学领域进行更多的研究,因为他的兴趣已经强烈地转向物理方面。他的哥哥,莫里斯·德布罗意(第六代德布罗意公爵)是一位著名的射线物理学家,路易斯跟随哥哥参加了1911年的布鲁塞尔物理会议,他对科学的热情被完全地激发出来,并立志把一生奉献给这一令人激动的事业。

假如说当时全世界只有一个人支持德布罗意的话,他就是爱因斯坦。德布罗意的导师朗之万对自己弟子的大胆见解无可奈何,出于挽救失足青年的良好愿望,他把论文交给爱因斯坦点评。谁料爱因斯坦马上予以了高度评价,称德布罗意“揭开了大幕的一角”。整个物理学界在听到爱因斯坦的评论后大吃一惊,这才开始全面关注德布罗意的工作。

不幸的是,发生了一件意外。这个真空容器因为某种原因发生了爆炸,空气一拥而入,迅速地氧化了镍的表面。戴维逊和革末非常懊丧,不过他们并不因此放弃实验,他们决定,重新净化金属表面,把实验从头来过。当时,去除氧化层的好办法就是对金属进行高热加温,这正是戴维逊所做的。

两人并不知道,正如雅典娜暗中助推着阿尔戈英雄们的船只,幸运女神正在这个时候站在他俩的身后。容器里的金属,在高温下发生了不知不觉的变化:原本它是由许许多多块小晶体组成的,而在加热之后,整块镍融合成了一块大晶体。虽然在表面看来,两者并没有太大的不同,但是内部的剧变已经足够改变物理学的历史。

有意思的是,G. P.汤姆逊的父亲,J. J.汤姆逊因为发现了电子这一粒子而获得诺贝尔奖,他却因为证明电子是波而获得同样的荣誉。

居里夫人和她的丈夫皮埃尔·居里于1903年分享诺贝尔奖(居里夫人在1911年又得了一个化学奖)。他们的女儿约里奥·居里(Irene Joliot-Curie)也在1935年和她丈夫一起分享了诺贝尔化学奖。居里夫人的另一个女婿,美国外交家Henry R. Labouisse,在1965年代表联合国儿童基金会(UNICEF)获得了诺贝尔和平奖。

不过,我们也不必过多地为一种悲观情绪所困扰。在大时代的黎明到来之前,总是要经历这样的深深的黑暗,那是一个伟大理论诞生前的阵痛。当大风扬起,吹散一切岚雾的时候,人们会惊喜地发现,原来他们已经站在高高的山峰之上,极目望去,满眼风光。

牛顿说这话是在1676年给胡克的一封信中。当时他已经和胡克在光的问题上吵得昏天黑地,争论已经持续多年(可以参见我们的史话)。在这封信里,牛顿认为胡克把他(牛顿自己)的能力看得太高了,然后就是这句著名的话:“如果我看得更远的话,那是因为我站在巨人的肩膀上”。

这里面的意思无非两种:牛顿说的巨人如果指胡克的话,那是一次很明显的妥协:我没有抄袭你的观念,我只不过在你工作的基础上继续发展——这才比你看得高那么一点点。牛顿想通过这种方式委婉地平息胡克的怒火,大家就此罢手。但如果要说大度或者谦逊,似乎很难谈得上。牛顿为此一生记恨胡克,哪怕几十年后,胡克早就墓木已拱,他还是不能平心静气地提到这个名字,这句话最多是试图息事宁人的外交词令而已。另一种可能,巨人不指胡克,那就更明显了:我的工作就算不完全是自己的,也是站在前辈巨人们的肩上——没你胡克的事。

更多的历史学家认为,这句话是一次恶意的揶揄和讽刺——胡克身材矮小,用“巨人”似乎暗含不怀好意。

哥本哈根的日子是紧张而又有意义的。海森堡无疑地感到了一种竞争的气氛,并以他那好胜的性格加倍努力着。当然,竞争是一回事,哥本哈根的自由精神和学术气氛在全欧洲都几乎无与伦比,而这一切又都和尼尔斯·玻尔这位量子论的“教父”密切相关。毫无疑问在哥本哈根的每一个人都是天才,但他们却都更好地衬托出玻尔本人的伟大来。这位和蔼的丹麦人对于每个人都报以善意的微笑,并引导人们畅所欲言,探讨一切类型的问题。人们像众星拱月一般围绕在他身边,个个都为他的学识和人格所折服,海森堡也不例外,而且他更将成为玻尔最亲密的学生和朋友之一。玻尔常常邀请海森堡到他家(就在研究所的二楼)去分享家藏的陈年好酒,或者到研究所后面的树林里去散步并讨论学术问题。玻尔是一个极富哲学气质的人,他对于许多物理问题的看法都带有深深的哲学色彩,这令海森堡相当震撼,并在很大程度上影响了他本人的思维方式。从某种角度说,在哥本哈根那“量子气氛”里的熏陶以及和玻尔的交流,可能会比海森堡在那段时间里所做的实际研究更有价值。

在经典力学中,一个周期性的振动可以用数学方法分解成为一系列简谐振动的叠加,这个方法叫做傅里叶展开。想象一下我们的耳朵,它可以灵敏地分辨出各种不同的声音,即使这些声音同时响起,混成一片嘈杂也无关紧要,一个发烧友甚至可以分辨出CD音乐中乐手翻动乐谱的细微沙沙声。人耳自然是很神奇的,但是从本质上说,数学家也可以做到这一切,方法就是通过傅立叶分析把一个混合的音波分解成一系列的简谐波。大家可能要感叹,人耳竟然能够在瞬间完成这样复杂的数学分析,不过这其实是自然的进化而已

1925年,当海森堡做出他那突破性的贡献的时候,他刚刚24岁。尽管在物理上有着极为惊人的天才,但海森堡在别的方面无疑还只是一个稚气未脱的大孩子。他兴致勃勃地跟着青年团去各地旅行,在哥本哈根逗留期间,他抽空去巴伐利亚滑雪,结果摔伤了膝盖,躺了好几个礼拜。在山谷田野间畅游的时候,他高兴得不能自已,甚至说“我连一秒钟的物理都不愿想了”。

有一个流传很广的关于狄拉克的笑话是这样说的:有一次狄拉克在某大学演讲,讲完后一个观众起来说:“狄拉克教授,我不明白你那个公式是如何推导出来的。”狄拉克看着他久久地不说话,主持人不得不提醒他,他还没有回答问题。

“回答什么问题?”狄拉克奇怪地说,“他刚刚说的是一个陈述句,不是一个疑问句。”

狄拉克把论文寄给海森堡,海森堡热情地赞扬了他的成就,不过带给狄拉克一个糟糕的消息:他的结果已经在德国由波恩和约尔当作出了,是通过矩阵的方式得到的。想来狄拉克一定为此感到很郁闷,因为显然他的法子更简洁明晰。随后狄拉克又出色地证明了新力学和氢分子实验数据的吻合,他又一次郁闷了——泡利比他快了一点点,五天而已。哥廷根的这帮家伙,海森堡,波恩,约尔当,泡利,他们是大军团联合作战,而狄拉克在剑桥则是孤军奋斗,因为在英国懂得量子力学的人简直屈指可数。但是,虽然狄拉克慢了那么一点,但每一次他的理论都显得更为简洁、优美、深刻。而且,上天很快会给他新的机会,让他的名字在历史上取得不逊于海森堡、波恩等人的地位。

这位神秘女郎的身份始终是个谜题,二战后无论是科学史专家还是八卦新闻记者,都曾经竭尽所能地去求证她的真面目,却都没有成功。薛定谔当时的日记已经遗失了,而从留下的蛛丝马迹来看,她又不像任何一位已知的薛定谔的情人。但有一件事是肯定的:这位神秘女郎极大地激发了薛定谔的灵感,使得他在接下来的12个月里令人惊异地始终维持着一种极富创造力和洞察力的状态,并接连不断地发表了六篇关于量子力学的主要论文。薛定谔的同事在回忆的时候总是说,薛定谔的伟大工作是在他生命中一段情欲旺盛的时期做出的。从某种程度上来说,科学还要小小地感谢一下这位不知名的女郎。

薛定谔和这两个女子公开同居,事实上过着一种一妻一妾的生活(这个妾还是别人的合法妻子),这过于惊世骇俗,结果在牛津和普林斯顿都站不住脚,只好走人。他的风流史还可以开出一长串,其中有女学生、演员、OLoffice ladies-校者注),留下了若干私生子。

可以想象,当波恩于19267月将骰子带进物理学后,是引起了何等的轩然大波。围绕着这个核心解释所展开的争论激烈而尖锐,把物理学加热到了沸点。这个话题是如此具有争议性,很快就要引发20世纪物理史上最有名的一场大论战,而可怜的波恩一直要到整整28年后,才因为这一杰出的发现而获得诺贝尔奖金——比他的学生们晚上许多。

不过,我们经过大量的观察,却可以发现,这个电子不是完全没有规律的:它在某些地方出现的可能性要大一些,在另一些地方则小一些。它出现频率高的地方,恰恰是波动所预言的干涉条纹的亮处,它出现频率低的地方则对应于暗处。现在我们可以理解为什么大量电子能组成干涉条纹了,因为虽然每一个电子的行为都是随机的,但这个随机分布的总的模式却是确定的,它就是一个干涉条纹的图案。这就像我们掷骰子,虽然每一个骰子掷下去,它的结果都是完全随机的,从16都有可能,但如果你投掷大量的骰子到地下,然后数一数每个点的数量,你会发现16的结果差不多是平均的。

宇宙从它出生的那一刹那开始,就坠入了一个预定的轨道,它严格地按照物理定律发展,没有任何岔路可以走,一直到遇见它那注定的命运为止。就像你出手投篮,那么,这究竟是一个三分球,还是打中篮筐弹出,或者是一个air ball,这都在你出手的一刹那决定了,之后我们所能做的,就是看着它按照写好的剧本发展而已。

然而波恩的解释不是这样,波恩的意思是,就算我们把电子的初始状态测量得精确无比,就算我们拥有最强大的计算机可以计算一切环境对电子的影响,即便如此,我们也不能预言电子最后的准确位置。这种不确定不是因为我们的计算能力不足而引起的,它是深藏在物理定律本身内部的一种属性。即使从理论上来说,我们也不能准确地预测大自然。这已经不是推翻某个理论的问题,这是对整个决定论系统的挑战,而决定论是那时整个科学的基础。量子论挑战整个科学。

q>h/

p和△q分别是测量p和测量q的误差,h是普朗克常数。海森堡发现,测量p和测量q的误差,它们的乘积必定要大于某个常数。如果我们把p测量得非常精确,也就是说△p非常小,那么相应地,△q必定会变得非常大,也就是说我们关于q的知识就要变得非常模糊和不确定。反过来,假如我们把位置q测得非常精确,p就变得摇摆不定,误差急剧增大。

然而事情并没有想象的那么坏,虽然我们对单个电子的行为只能预测其概率,但我们都知道,当样本数量变得非常非常大时,概率论就很有用了。我们没法知道一个电子在屏幕上出现在什么位置,但我们很有把握,当数以万亿计的电子穿过双缝,它们会形成干涉图案。这就好比保险公司没法预测一个客户会在什么时候死去,但它对一个城市的总体死亡率是清楚的,所以保险公司一定是赚钱的!

至于令人迷惑的波粒二象性,那也只是量子微观世界的奇特性质罢了。我们已经谈到德布罗意方程λ=h/p,改写一下就是λp=h,波长和动量的乘积等于普朗克常数h。对于微观粒子来说,它的动量非常小,所以相应的波长便不能忽略。但对于日常事物来说,它们质量之大相比h简直是个天文数字,所以对于生活中的一个足球,它所伴随的德布罗意波微乎其微,根本感觉不到。

继续阅读《上帝掷骰子吗——量子物理史话》读书笔记

全国计算机二级C 错题/知识点整理

算法的有穷性是指:算法程序的运行时间是有限的

算法的空间复杂度是指:算法在执行过程中所需要的临时工作单元数
算法的时间复杂度是指:算法在执行过程中所需要的基本运算次数(计算工作量)
算法的时间复杂度和空间复杂度没有直接关系
数据的存储结构是指:数据的逻辑结构在计算机中的表示
有一个以上根结点的数据结构一定是非线性结构
只有一个根结点的数据结构不一定是线性结构,比如树只有一个根结点,但是树不是线性结构
循环链表和双向链表都是线性结构 线性结构的定义是,有且只有一个根结点,且中间每个结点有且仅有一个前驱和后继
线性表即顺序表,数据之间是一对一的关系,除首尾,其他所有的元素都首尾相接
栈 只能在栈顶插入数据
支持子程序调用的数据结构是 栈 因为递归调用子程序的时候就是先入后出的线性结构 符合栈
栈有记忆作用;栈既能顺序存储,又能链式存储
在循环队列中,队头指针可以大于队尾指针,也可以小于队尾指针
循环队列是队列的一种,而队列和栈是一种顺序存储结构。
线性表的链式存储结构所需要的存储空间一般要多于顺序存储结构
二叉树的性质:
在非空二叉树中,第i层结点总数不超过2^(i-1)
深度为h的二叉树最多有2^h-1个结点 最少有h个结点
对于任意一颗二叉树,其叶子结点数N0 = 度数为2的结点总数N2  + 1
具有n个结点的完全二叉树的深度为log2(n+1)
对于完全二叉树 度为1的结点数只有两种可能:0或1
二分查找的最坏情况为log2n次(这是查找这是查找这是查找!)
(以下是排序以下是排序以下是排序!)
冒泡排序、快速排序、直接插入排序在最坏情况下的比较次数是n(n-1)/2
堆排序在最坏情况下比较次数最少,为nlogn
程序既要注重效率又要注重清晰的可读性
结构化程序设计的基本原则(方法):自顶向下、逐步求精、模块化
继承是指类之间共享属性和操作的机制
对象的基本特点:分类性、多态性、标识唯一性
不是任何对象都必须有继承性,对象的多态性是指同一个操作可以是不同对象的行为
面向对象程序设计的特征有 继承性、多态性、封装性 不包括类比性
构成计算机软件的是 程序、数据以及相关文档
软件危机的表现:软件开发的生产率低、软件质量难以控制、软件成本不断提高
软件工程的主要思想是强调在软件开发过程中需要应用工程化原则
软件工程的3个要素:工具、过程、方法
软件工程过程的4个基本活动:软件规格说明、软件开发、软件确认、软件演进
软件生命周期的定义阶段:可行性研究、计划制定、需求分析
软件生命周期的开发阶段:测试、概要设计、详细设计、实现
软件设计的基本原则是 抽象、信息隐藏、模块化、局部化、确定
性、一致性、可验证性
需求分析阶段:需求分析、需求评审、需求获取
需求分析阶段可以使用的工具是:DFD、DD、判断树、判断表
在软件设计中不使用的工具是:程序流程图,使用的工具有:系统结构图、PAD图、数据流图(DFD图)
概要设计->系统结构图
详细设计->程序流程图、N-S、PAD等
数据字典(DD)所定义的对象都包含于数据流图(DFD图),数据字典在需求分析阶段建立。
软件设计中的模块划分应遵循 高内聚、低耦合。
数据流程图中没有控制流、程序流程图中没有数据流。
软件测试的目的是尽可能多的发现错误,而并非改正错误。
检查软件产品是否符合需求定义的过程称为确认测试
黑盒测试方法是边界值分析、白盒测试方法是逻辑覆盖
软件测试实施步骤有:集成测试、确认测试、单元测试
软件调试的任务是 诊断并改正程序中的错误
数据库管理系统是在操作系统支持下的系统软件
数据库应用系统的核心问题是数据库设计
数据库系统的核心是数据库管理系统
数据库管理系统DBMS包含数据库DB和数据库系统DBS
数据库管理系统中负责数据模式定义的语言是数据定义语言
数据库技术的根本目标是解决数据的共享问题
数据库设计是指在已有数据库管理系统的基础上建立数据库
E-R模型(实体-联系模型)
在E-R模型中,用来表示实体联系的图形是菱形,用来表示实体的图形是矩形,用来表现属性的是椭圆。
E-R图设计数据数据库设计的概念设计阶段
用树形结构表示实体之间联系的模型是层次模型
在关系模型中,每一个二维表称为一个关系
在满足实体完整性约束的条件下一个关系中应该有一个或多个候选关键字
在学生管理的关系数据库中,存取一个学生信息的数据单位是记录
负责数据库中查询操作的数据库语言是数据操纵语言(查询、添加、删除)
运算关系中不改变关系表的属性个数但能减少元组个数的是:交
投影:元组数量不变、属性减少
选择:元组数量减少、属性不变
自然连接:提取两个表中相同的内容然后连接起来
两个表之间的运算关系 只能是投影和选择
当对关系R和S进行自然连接时、要求R和S含有一个或多个共有的属性
在数据库设计中,将E-R图转换成关系数据模型的过程属于逻辑设计阶段
将E-R图转换为关系模式时、实体和联系都可以表示为关系
数据库设计的四个阶段是:需求分析、概念设计、逻辑设计和物理设计
一个C语言程序可以实现多种算法
C语言源程序可以放在不同的文件中,同一个源程序也可以放在不同的文件中
算法正确的程序可以有零个输入,但不能有零个输出
每一个C语言的文件或者函数都可以单独编译,但只有main函数才可以执行
sizeof(int) = 4 || sizeof(double) = 8
C语言函数可以嵌套调用,但是不是所有的函数之间都可以相互调用,比如说不可以调用main函数
规定 C程序中 不能在函数的内部定义函数
块状注释不能嵌套使用
C语句与机器指令不是一一对应关系
我们所写的每条C语句,经过编译最终都将转换成二进制的机器指令
115L可以用作数据常量,L表示长整型
在C语言中没有定义逻辑类型,而是用0表示假,非零表示真
case是系统关键字,不能用作用户自定义标识符
常量中 在前面加0表示八进制 不能出现8和以上的数字 在前面加0x表示十六进制 前面不会出现o这个字母的
在转义字符中,\后面只能0~127 表示ASCII码(即八进制中的0~177)
符号常量是指在程序中通过宏定义用一个符号名来代表一个常量
标识符的长度不能任意长,最多只能包含32个字符
E/e前后都必须要有数字,且后面必须为整数
整型数据10,000 这样的表示形式是错误的
单引号里面的字符串有ASCII码和转义字符两种,ASCII必须为八进制或者十六进制 即\ddd或者\xhh
x/y 若左右两边都为int型 那么运算结果也是int型
double类型不能进行取余操作
&&表示逻辑与
C语言本身没有提供输入输出语句,但是可以通过调用标准库函数中提供的输入和输出函数来实现输入和输出
C语言中的注释可以出现在程序中的任何位置,但是不能夹在变量或者关键字之间
C语言的变量在函数开始位置进行定义,也可以在变量使用前位置定义
一个浮点数可以和一个整数相加,运算符两侧的运算类型也可以不一致
数值常量中不允许夹带空格
sizeof为测试内存的运算符,()为算数运算符,&&为逻辑运算符,<>不是运算符
强制转换类型表达式格式为(类型名)(表达式),两个括号都不能省略
关系运算符两边的运算对象可以是C语言中任意合法的表达式
在C语言中,逻辑真值为任何非零数(!!),逻辑假值为0
赋值表达式左边必须为变量,不能是常量!!
逻辑表达式的运算比较复杂,有短路现象
“逻辑与”和“逻辑或”运算低于关系运算和算术运算,但是“逻辑非”却高于算术运算
采用printf输出数据,输出数据都默认为右对齐,若要左对齐,可以在格式控制的”%”和宽度之间加一个”-“来实现
printf的输出精度由变量的类型决定,与域宽无关
赋值语句是一种执行语句,必须放在函数的可执行部分
由printf输出的数据都隐含右对齐!!
%8.6f的意思是 一共连着小数点占8位,小数点后面留6位数字
在printf语句中用%%输出一个%符号
负数取余后结果为负数:先按照正数时候情况算,然后加上负号
scanf语句中中间无间隔符,可以空格或者tab或者回车隔开 不能用逗号隔开 中间有逗号那必须用逗号隔开输入
double型数据scanf中要%lf格式
当scanf从键盘输入数据时,按下回车键后,scanf即接受了这一行数据,不能修改
分支结构是根据表达式的结果来判断流程走向的,不一定是算数表达式
关系运算符的结果只有两种,0和1
在scanf函数中的格式控制字符串是为了输入数据用的,不会输出到屏幕上
复合语句也可以是空语句,并没有规定语句条数
在scanf函数的格式字符前可以加入一个正整数指定输入数据所占的宽度,但不可以用实数制定小数位的宽度
scanf(“格式字符串”,输入项首地址列表) 对于double型,输入时要输入l修饰,否则会产生错误的输入信息,同时输入项必须为地址,也可以是保存变量地址的指针变量。
if(表达式) 表达式可以是任意合法的数值
看清if语句里面为赋值还是为== 赋值语句 只要非零就为真 赋值为0就是假
case后面只能跟常量表达式,不能跟变量表达式
在switch语句中并不是必须有break和default语句,可以根据需要安排是否有这两个语句
default后面看有没有break;如果没有break;那么后面的case还是要执行的
if(表达式);傻逼空语句= =
switch后面如果是表达式,那么要加括号。case后面必须要有一个空格。case后面也可以是表达式 不一定非要数字
while语句 条件表达式的执行次数总是比循环体的执行次数多一次
do……while语句 条件表达式的执行次数和循环体的执行次数一样
while(y—);每次变量y的值减1,直到等于0退出循环
continue是终止本次循环(但还继续下一轮循环),break是跳出当前循环体,后面的不执行了,只执行到这一步
if(i == 3)
continue:0,1,2,4,5
break:0,1,2
!0 为 1 非任何非零数的结果为0  如!2 为 0
for(i = 0;i < 8;i++){ }  执行完for循环体后 最后一步i++还是要执行的
只要适当地修改代码,就可以将do-while和while相互转换
break语句!!只能用在循环体内和switch语句内
当break出现在循环体中的switch语句体内时,只是跳出switch,而不终止循环体执行
函数可以在主函数体内进行声明然后进行调用
若调用子函数的主函数在子函数之前,那么前面必须有子函数的定义,子函数必须先定义后使用
各函数间没有主从关系,不能嵌套定义函数
strlen(s)计算字符串长度不包括末尾的结束标志符’\0’
strcmp(str1,str2) 若str1 == str2 那么函数值为0 若str1 > str2函数值是一个正数 若str1 < str2 函数值是一个负数
\n \t \\这些都是转义字符,只要一个字节长度
函数名代表该函数的入口地址
一个自定义函数中可以根据不同情况设置多条return语句
int fun(int *p) {return *p;} fun函数返回值是一个整数,因为返回的是整型指针变量p所指向的数据
无论有多少个return语句,return只能执行一次,返回一个函数值
若函数有返回值,必须通过return语句返回
C程序必须由一个或一个以上的函数组成
( )的优先级高于*
static 在函数定义的静态变量,只需赋值1次,即可保存初始值,不需要每次调用时都赋初始值
函数的形参和实参分别占用不同的存储单元
函数的形式参数属于局部变量
子函数中可以给全局变量赋值,如在头文件下所有函数之外定义int a = 1;  然后 void fun(){a = 3;}这样a的值在调用fun()的时候变成了3
在一个C源程序文件中所定义的全局变量,其作用域由具体定义位置和extern说明来决定范围
子函数中的静态局部变量a和主函数中定义的一个a是没有任何关系的
C语言中形式参数组是指针变量,其数组中元素的个数由传递的实参数组决定,因此可以在定义的时候,不给出元素个数的具体说明
在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,也就是全局变量。全局变量可以为源文件中其他函数所公用,其作用域为从定义变量的位置开始到源文件结束。因此只要用户定义的标识符,全部都有作用域。局部变量可以说明为auto、register以及static。
动态变量auto存储在内存中的动态存储区,在程序运行中,只有当调用变量所在的函数时,系统才临时给变量分配存储单元,全局变量extern一经定义,系统为其分配固定的内存单元;静态变量static编译系统为其分配固定的存储空间;寄存器变量register不保存在内存上,而是直接存储在CPU的寄存器中。
所以说在C语言中,只有在使用时才占用内存单元的变量,其存储类型是auto和register。
在C语言中,有两种对文件的存储方式:顺序存取和直接存取。
如果以“a”的方式对一个已打开的文件进行写操作后,则原有文件中内容将保存,新的数据写在原有内容之后。
如果以“a+”的方式为读和写而打开一个文件,则既可以对文件进行读,也可以对文件进行写,而且在读和写操作之间不必关闭文件,可以从头开始读。
当对文件的读(写)操作完成之后,必须将它关闭。
文件指针实际上是指向一个结构体类型的指针,这个结构体中包含如缓冲区的地址、在缓冲区中当前存取的字符的位置、对文件是“读”或“写”、是否出错、是否已经遇到文件结束标志等信息。
一般称文件指针结构体类型名为FILE,可以用此类型名来定义文件指针。所以说 文件指针是程序中用FILE定义的指针变量
文件由数据序列构成,可以工程二进制文件或文本文件
调用函数rewind把文件内部的位置指针重新指向一个文件的开头
fread(buffer,size,count,fp);  buffer是数据块指针,对fread来说,它是内存块的首地址,输入的数据存入此内存块中
gets和getchar函数用于从标准输入设备终端读入字符串和字符,并非从磁盘文件读入,fputs用于把字符串输出到文件,fwrite用于以二进制形式输出数据到文件。
fp = (filename,”rb+”);
fwrite的调用形式为:int fwrite(char *pt,unsigned size,unsigned n,FILE *fp); 其功能是把pt所指向的n*size个字节输出到fp所指文件中。
ANSIC提供的feof函数的功能是判断fp所指的文件的位置是否已达到文件尾,如果达到文件尾,则feof函数的值为1,否则为0,表示文件尚未结束。
fputc()是以字符(字节)为单位的读写函数。每次可从文件读出或向文件写入一个字符。使用格式为fputc(ch,fp);
EOF是stdio.h库函数文件中定义的符号常量,其值等于-1.EOF用作文件结束标志(!!!)。在二进制或者文本文件内部有一个位置指针,用以指示文件内部的当前读写位置。使用fgetc函数,每读写一次,该指针均向后移动。
每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元
语句float a[10],x; a = &x;是非法的,a表示首地址,在程序中为常量不可更改
二维数组的初始化时,允许省略行下标,不允许省略列下标
在逻辑上,可以把二维数组看成是一个具有行和列的表格或矩阵
int x[2][3]; 数组x可以看作是由x[0]和x[1]两个元素组成的一维数组;元素x[0]可看作是由3个整型元素组成的一维数组;x[0]和x[1]是数组名,分别代表一个地址常量
在定义一维数组时,数组的下标应该是一个确定的整数值。要注意的是在定义二维数组时,其第一维下标可以省略,但第二维下标不能省略。
不可以int n = 5; a[n];在C语言中,定义以为数组中n不可以是变量,必须是整型常量表达式。
char ss[][20] = {“right?”} 这样的赋值是错误的,定义二维数组后,字符串的存储不能通过赋值,只能通过初始化或输入得到
不可以对字符串进行关系运算
两个连续的双引号(“”)是合法的字符串常量
char s[5] = {‘a’,’b’,’c’,’d’,’e’}; 是错误的 字符串结束标志无法存储
char *s;gets(s); 是错误的 要先对指针变量初始化
C语言中没有字符串数据存储类型
字符串数组,是指数组中的每个元素都是一个存放字符串的一维数组
C语言本身没有提供对字符串进行整体操作的运算符
sizeof是实际占用内存,strlen是实际字符个数
字符数组不能直接赋值
字符数组仅仅可以采用定义时初始化以及输入得到数据,在程序其他部分不允许对其进行赋值。字符串常量中除了实际字符之外还有结束标志,没有字符串结束标志的运行是不安全的
gets(s)函数的作用是将输入的字符读入字符串s,直到遇到回车。而scanf()函数接收字符串时的结束标志为回车或者空格。
char *s; s = “hello”;是正确的 而 char *s;s = {“hello”};是错误的 定义指针变量s,通过赋值语句保存字符串常量的地址是可以的,而字符数组决不能赋值,而只能初始化或者输入。
s[] = “abcde”; s += 2; 因为s表示的是一个地址常量,常量是不可以被赋值的,所以这句话是错的,程序会出错
预处理命令可以放在程序的任何位置,其有效范围是从定义开始到文件结束。预处理命令有宏定义、文件包含和条件编译三类。
预处理语句后面不能加分号!!
宏定义仅仅只是符号替换,不是赋值语句,因此不做语法检查;双引号中出现的宏名不替换;使用宏定义可以嵌套,即后定义的宏中可以使用先定义的宏。
预处理命令行是在系统对源程序进行编译之前处理的,不是在程序执行的过程中
在C语言中,凡是以“#”开头的行,都称为“编译预处理”。
包含头文件的#include 命令行是通常书写在所用源程序文件的开头,故有时也把包含文件称为头文件。头文件名可以由用户指定,其后缀不一定用“.h”
当包含文件修改后,对包含该文件的源程序必须重新进行编译连接
a = b = (int *)malloc(sizeof(int));含义为 申请了一个整型的存储空间,让指针a,b,c分别指向它,*a = 1; *b = 2; *c = 3;语句的含义为所申请的整型存储空间的内容,*c = 3; 最后执行导致存储空间的内容为3.
ANSIC标准规定calloc函数返回值的类型为void*。具体使用格式为:calloc(n,size)。该函数用来给n个同一类型的数据项分配连续的存储空间,每个数据项的长度为size个字节。若分配成功,函数返回存储空间的首地址;否则返回空。通过调用calloc函数所分配的存储单元,系统自动置初值0。
指针变量赋地址值的方式有3种方式:通过求地址运算符(&);通过指针变量获得地址值;通过标准函数获得地址值。
NULL是stdio.h头文件中定义的预定义符。NULL的代码值为0.可以给指针变量赋NULL值。例如p = NULL;赋值语句,称p为空指针。这条语句等价于p = ‘\0’;或者p = 0;这时,指针p并不是指向地址为0的存储单元,而是具有一个确定的值——“空”。
在C语言中,二维数组名也是一个存放地址常量的指针,其值为二维数组中第一行的地址。
int x = 0,*p; p = NULL;
float x; float *p = &x;
*(s + 3)表示的是引用数组a[3].