程序=算法+数据结构
程序就是一系列有序执行的指令集合。
第一个答案对于大多数人其实等于没有回答,因为算法这个概念可能是一个比程序更为复杂的概念。
第二个答案算是有点容易明白,但还不能让人明白程序能做什么不能做什么。
一,菜谱
材料: 五花肉半斤,尖椒一个,青蒜4-5根,(其实正宗的回锅肉还要放豆干,再放根红椒点缀,咱家没有,省略了),白糖2茶勺,生抽1汤勺,盐2克,鸡精,料酒,姜片,葱段;蒜片,郫县豆瓣酱1汤勺
做法: 预先处理:将整块五花肉放入热水中煮熟(筷子扎下去可以扎透),期间点些料酒,放两片姜,两三段葱;然后放入冷水中冷却。其中,冷水中冷却的步骤可以使肉快速收缩,帮助成型,增加嚼劲儿,是普通厨子变大厨的关键步骤,不可省略哈。
青椒切菱形段,青蒜拍一下蒜头,切寸段。蒜头和蒜叶分开放。
预先处理过的五花肉切薄片,越薄越好。俺就这刀工了,算比较厚的啊。
蒜拍碎(没拍),郫县豆瓣剁成茸(碎点儿好看也好吃)。
处理好的肉片下油锅,旺火煸炒。直至肉片打卷,变得焦黄。
将超好的肉片拨至一边,下入蒜末和郫县豆瓣,用小火炒出红油。
倒入尖椒段和青蒜蒜头,烹入糖,生抽,盐。注意:郫县豆瓣酱和生抽均有咸度,盐一定要酌情放。
待尖椒和蒜头香味出来,放入青蒜叶及鸡精兜匀。青蒜叶熟的很快,这个步骤只需要30秒或者更短,只要看到青蒜叶被油裹住就可以了。
出锅
以上是网上找的一个回锅肉的菜谱(貌似这个下酒好)。从广义的角度来说这也是一个程序,怎么说呢?
这个程序与计算机程序略微不一样,这个程序的运行者是一个可以认识上面的文字,能正确理解每句话的意义,且有能力得到材料并按步骤执行的人。而计算机程序则是计算机可以理解和执行语句。
二,为什么要有编程语言
就像上面的菜谱一样,我们只要识得汉字基本都可以照着来执行。为什么要有让人看起怎么都不能一下就接受的编程语言呢?
自然语言有歧义
男老师发现一女生上课睡觉,气愤的说:我在上面累的要死,你在下面一动不动!不配合也就罢了,连点反应都没有,将来要是肚子里没东西,可别怪老师不行!
中国足球队谁也打不赢。中国乒乓球队谁也打不赢。
冬天太冷,出门时衣服能穿多少就穿多少。夏天太热,出门时衣服能穿多少就穿多少。
地铁里听到一个女孩大概是给男朋友打电话,“我已经到西直门了,你快出来往地铁站走。如果你到了,我还没到,你就等着吧。如果我到了,你还没到,你就等着吧。”
老婆给当程序员的老公打电话:下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。当晚,程序员老公手捧一个包子进了家门…老婆怒道:你怎么就买了一个包子?!老公答曰:因为看到了卖西瓜的。
这是几则最典型的汉语歧义,其它语种中一样有很多这样的歧义。看最后程序员这则,那么就是老婆下了一系列指令但是执行者按照另一种意义去执行了。当然这例子还有不恰当的地方,我们也可以将指令改为:“下班顺路买一斤包子带回来,另外如果看到卖西瓜的,买一个西瓜。”。但是麻烦就在汉语本身并未限制我们必须如此,另外其它例子中的用法那就更加不容易确定意义了,还牵扯到语境。所以到今天为止计算机在处理自然语言上都还很糟糕。
自然语言不稳定
666, 虾米, 酱紫, 沙发, 粉丝
以上这些词语在有了网络后就多了一层意思,不上网的人可能根本不知道这多出一层意思。当然不稳定本质上还是带来歧义。
因为这些原因才有数学语言(其实一样有歧义,不然就不会产生数理逻辑这个分支了)、编程语言来规避歧义。
三,程序是什么
这真是一个不好下定义的词,比较可靠的回答都要涉及数理逻辑。无论是递归函数论、图灵机模型、lambda演算都不是那么容易掌握的。这些远比学一门编程语言及掌握写程序更难。所以在这里我们先只给出一个形象的比喻,程序就是一段编译器或解释器(这东西可能比任何人都要听你的话,只要你能用它懂的语言来指挥)能听懂的指令。
打开微信我们可以指挥微信,我们可以给好友发信息,可以加好友,可以发朋友圈,我们下什么指令它就做什么,我们下指令是通过点击屏幕。而编译器与解释器也是类似的东西,不过这东西它只接受它认识的指令,它接受指令都是文字(主要是英文,数字,标点)。
四,计算、同构、模拟
对于同一件事比如我们要计算3+5,那么我们可以有:
扳着手指头左手3个,右手5个放在一起是8个手指头
先拿出3个小球,再拿出5个小球放在一起是8个小球
我们在计算器输入3+5得出8
这三个方法都可以计算出3+5的值,他们用了不同方法的形式但在对于计算3+5这个核心上是计算等价的。也就是同构的概念。
有了同构我们就可以模拟了,比如你有小球,拿它做了一次加法运算。但是我没有小球我可以用手指头或者石子来代替小球模拟你用小球做加法运算,并且得出和你一样的结果。
我们是怎么用程序来事的呢?主要就是用计算机中的数据来模拟现实中的东西。
比如摄像头中的你脑袋往左移了一下,那么本质上计算机中代表脑袋的那些数据的x坐标减去了一定的值,最终再输出到显示器上。
比如你在纸上解了一个方程,那么在计算机也有一个模拟你每一步的计算的过程来得出和你一样的值。只是你用纸和笔来进行,而计算机用它的方式来进行。
程序设计主要方法有面向结构的方法和面向对象的方法。
结构化程序设计
随着计算机的价格不断下降,硬件环境不断改善,运行速度不断提升。程序越写越大,功能越来越强,讲究技巧的程序设计方法已经不能适应需求了。记得是哪本书上讲过,一个软件的开发成本是由:程序设计 30% 和程序维护 70% 构成。这是书上给出的一个理论值,但实际上,从我十几年的工作经验中,我得到的体会是:程序设计占 10%,而维护要占 90%。也许我说的还是太保守了,维护的成本还应该再提高。下面这个程序,提供了两种设计方案,大家看看哪个更好一些那?
题目:对一个数组中的100个元素,从小到大排序并显示输出。(BASIC)
方法1:冒泡法排序,同时输出。
FOR I=1 TO 100
FOR J=I+1 TO 100
IF A[I] > A[J] THEN T=A[J]: A[J]=A[I]: A[I]=T
NEXT J
A[I]
NEXT I
方法2:冒泡法排序,然后再输出。
FOR I=1 TO 100
FOR J=I+1 TO 100
IF A[I] > A[J] THEN T=A[J]: A[J]=A[I]: A[I]=T
NEXT
NEXT
FOR I=1 TO 100
A[I]
NEXT
显然,“方法1”比“方法2”的效率要高,运行的更快。但是,从现在的程序设计角度来看,“方法2”更高级。原因很简单:(1)功能模块分割清晰——易读;(2)也是最重要的——易维护。程序在设计阶段的时候,就要考虑以后的维护问题。比如现在是实现了在屏幕上的输出,也许将来某一天,你要修改程序,输出到打印机上、输出到绘图仪上;也许将来某一天,你学习了一个新的高级的排序方法,由“冒泡法”改进为“快速排序”、“堆排序”。那么在“方法2”的基础上进行修改,是不是就更简单了,更容易了?!这种把功能模块分离的程序设计方法,就叫“结构化程序设计”。
面向对象的程序设计
随着程序的设计的复杂性增加,结构化程序设计方法又不够用了。不够用的根本原因是“代码重用”的时候不方便。面向对象的方法诞生了,它通过继承来实现比较完善的代码重用功能。很多学生在应聘工作,面试的时候,常被问及一个问题“你来谈谈什么是面向对象的程序设计”,学生无言,回来问我,这个问题应该怎么回答。我告诉他,你只要说一句话就够了“面向对象程序设计是对数据的封装;范式(模板)的程序设计是对算法的封装。”后来再有学生遇到了这个问题,只简单的一句对答,对方就对这个学生就刮目相看了(学生后来自豪地告诉我的)。为什么那?因为只有经过彻底的体会和实践才能提炼出这个精华。
面向对象的设计方法和思想,其实早在70年代初就已经被提出来了。其目的就是:强制程序必须通过函数的方式来 *** 纵数据。这样实现了数据的封装,就避免了以前设计方法中的,任何代码都可以随便 *** 作数据而因起的BUG,而查找修改这个BUG是非常困难的。那么你可以说,即使我不使用面向对象,当我想访问某个数据的时候,我就通过调用函数访问不就可以了吗?是的,的确可以,但并不是强制的。人都有惰性,当我想对 i 加1的时候,干吗非要调用函数呀?算了,直接i++多省事呀。呵呵,正式由于这个懒惰,当程序出BUG的时候,可就不好捉啦。而面向对象是强制性的,从编译阶段就解决了你懒惰的问题。
巧合的是,面向对象的思想,其实和我们的日常生活中处理问题是吻合的。举例来说,我打算丢掉一个茶杯,怎么扔那?太简单了,拿起茶杯,走到垃圾桶,扔!注意分析这个过程,我们是先选一个“对象”------茶杯,然后向这个对象施加一个动作——扔。每个对象所能施加在它上面的动作是有一定限制的:茶杯,可以被扔,可以被砸,可以用来喝水,可以敲它发出声音;一张纸,可以被写字,可以撕,可以烧。也就是说,一旦确定了一个对象,则方法也就跟着确定了。我们的日常生活就是如此。但是,大家回想一下我们程序设计和对计算机的 *** 作,却不是这样的。拿DOS的 *** 作来说,我要删除一个文件,方法是在DOS提示符下:c:> del 文件名<回车>。注意看这个过程,动作在前(del),对象在后(文件名),和面向对象的方法正好顺序相反。那么只是一个顺序的问题,会带来什么影响那?呵呵,大家一定看到过这个现象:File not found “啊~~~,我错了,我错了,文件名敲错了一个字母”,于是重新输入:c:> del 文件名2<回车>。不幸又发生了,计算机报告:File read only 哈哈,痛苦吧:)。所以DOS的 *** 作其实是违反我们日常生活中的习惯的(当然,以前谁也没有提出过异议),而现在由于使用了面向对象的设计,那么这些问题,就在编译的时候解决了,而不是在运行的时候。objfun(),对于这条语句,无论是对象,还是函数,如果你输入有问题,那么都会在编译的时候报告出来,方便你修改,而不是在执行的时候出错,害的你到处去捉虫子。
同时,面向对象又能解决代码重用的问题——继承。我以前写了一个“狗”的类,属性有(变量):有毛、4条腿、有翘着的尾巴(耷拉着尾巴的那是狼)、鼻子很灵敏、喜欢吃肉骨头方法有(函数):能跑、能闻、汪汪叫如果它去抓耗子,人家叫它“多管闲事”。好了,狗这个类写好了。但在我实际的生活中,我家养的这条狗和我以前写的这个“狗类”非常相似,只有一点点的不同,就是我的这条狗,它是:卷毛而且长长的,鼻子小,嘴小。于是,我派生一个新的类型,叫“哈巴狗类”在“狗类”的基础上,加上新的特性。好了,程序写完了,并且是重用了以前的正确的代码——这就是面向对象程序设计的好处。我的成功只是站在了巨人的肩膀上。当然,如果你使用VC的话,重用最多的代码就是MFC的类库。
本题的一个完整的c程序如下,程序在win-tc和Dev-c++下都调试通过。
#include<stdioh>
int main()
{
char str[200];
int i=0,n=0;
printf("Please input a line:");
gets(str);
while(str[i]!='\0')
{
if ((str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z')&&(str[i+1]==' '||str[i+1]=='\0'||str[i+1]==','||str[i+1]==''||str[i+1]==''||str[i+1]=='!'))
n++;
i++;
}
printf("There are :%d words\n",n);
system("pause");
return 0;
}
这个是硬件驱动的啊,你给的代码也不全,也不可能跟你一句一句讲解,大概说一下。有错漏之处还请指正。
类似
P0SEL &= ~0X10; //设置P04为普通IO口
这样的语句,是更改硬件的控制端口的信号,控制硬件的动作。
类似
while(!KEY1); //松手检测
这样的语句,是读取硬件控制端口(响应端口)的信号,判断硬件的状态。
excel vba 加一句话表示程序运行进度(cnGzbCursorLocation = adUseClient)
大多数人可能认为软件升级是不会有问题的,事实上,在升级过程中都会对其中共享的一些组件也进行升级,但是其它程序可能不支持升级后的组件从而导致各种问题。
Excel执行VBA时显示进度条。
i为代码的for循环,或者计步器
Applicationstatusbar=”完成 “&format(i/10000100,”000”)
突然想起以看过一遍关于优化SQL查询的文章,里面对SQL查询优化有一个比较详细的说明,特别比较了在已建立索引的字段上进行查询与未建立索引字段上查询速度的差别,想起一句话,“所有快速查找都是基于排序的”,于是马上修改代码,添加对rsGzb中的工号字段进行排序代码(rsGzbSort = "gh ASC"),运行,出错(运行时错误3251:当前提供程序不支持排序或过滤所必须的界面),查看sort属性的帮助,发现里面有一条说明“此属性要求将 CursorLocation 属性设置为 adUseClient。”,于是添加代码(cnGzbCursorLocation = adUseClient),再运行。1秒内就完成了 *** 作
下面就是程序中的那几句关键代码(第1名和第3句在这儿的作用相同,可以只写一句)
cnGzbCursorLocation adUseClient
Set rsGzb = New ADODBRecordset
rsGzbCursorLocation = adUseClient 'CursorLocation对于关闭的recordset对象可读可写,对于打开的recordset对象只读
rsGzbOpen sSqlCommand, cnGzb, adOpenKeyset, adLockBatchOptimistic
1、结构化程序设计
在结构化程序设计中,任何程序段的编写都基于3种结构:分支结构、循环结构和顺序结构。程序具有明显的模块化特征,每个程序模块具有惟一的出口和入口语句。结构化程序的结构简单清晰,模块化强,描述方式贴近人们习惯的推理式思维方式,因此可读性强。
2、面向对象程序设计
面向对象程序设计方法是尽可能模拟人类的思维方式,使得软件的开发方法与过程尽可能接近人类认识世界、解决现实问题的方法和过程,也即使得描述问题的问题空间与问题的解决方案空间在结构上尽可能一致,把客观世界中的实体抽象为问题域中的对象。
程序设计的分类
1、按照结构性质,有结构化程序设计与非结构化程序设计之分。前者是指具有结构性的程序设计方法与过程。它具有由基本结构构成复杂结构的层次性,后者反之。
2、按照用户的要求,有过程式程序设计与非过程式程序设计之分。前者是指使用过程式程序设计语言的程序设计,后者指非过程式程序设计语言的程序设计。
3、按照程序设计的成分性质,有顺序程序设计、并发程序设计、并行程序设计、分布式程序设计之分。按照程序设计风格,有逻辑式程序设计、函数式程序设计、对象式程序设计之分。
以上就是关于程序啥意思全部的内容,包括:程序啥意思、什么是程序设计有哪两种主要方法、一个简单的统计一句话里有多少个单词的小程序,请教等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)