当前位置:文档之家› 逻辑型程序设计语言PROLOG详细教程

逻辑型程序设计语言PROLOG详细教程

逻辑型程序设计语言PROLOG详细教程
逻辑型程序设计语言PROLOG详细教程

逻辑型程序设计语言PROLOG教程

2.3. 1逻辑型程序设计语言PROLOG

PROLOG的语句

PROLOG语言只有三种语句,分别称为事实、规则和问题。

1.事实(fact)

格式: <谓词名>(<项表>).

功能一般表示对象的性质或关系。

其中谓词名是以小写英文字母打头的字母、数字、下划线等组成的字符串,项表是以逗号隔开的项序列。

例如:

student(john).

like( mary ,music).

表示“约翰是学生”和“玛丽喜欢音乐”。

2. 规则(rule)

格式:<谓词名>(<项表>):-<谓词名>(<项表>){,<谓词名>(<项表>)}.

功能: 一般表示对象间的因果关系、蕴含关系或对应关系。

其中“:-”号表示“if”(也可以直接写为if),其左部的谓词是规则的结论(亦称为头),右部的谓词是规则的前提(亦称为体),{}表示零次或多次重复,逗号表示and(逻辑与),即规则的形式是一个逻辑蕴含式。

例如:

bird(X):-animal(X),has(X,feather).

grandfather(X,Y):-father(X,Z),father(Z,Y).

第一条规则表示“如果X是动物,并且X有羽毛,则X是鸟”;第二条规则就表示“X 是Y的祖父,如果存在Z,X是Z的父亲并且Z又是Y的父亲”。

3.问题(question)

格式: ?-<谓词名>(<项表>){,<谓词名>(<项表>)}.

功能表示用户的询问,它就是程序运行的目标。

例如:

?-student(john).

?-like(mary,X).

2.3. 2 PROLOG程序

PROLOG程序一般由一组事实、规则和问题组成。问题是程序执行的起点,称为程序的目标。

例如下面就是一个PROLOG程序。

likes(bell,sports).

likes(mary,music).

likes(mary,sports).

likes(jane ,smith).

friend(john,X):-likes(X,reading),likes(X,music).

friend(john,X):-likes(X,sports),likes(X,music).

?-friend(john,Y).

可以看出,这个程序中有四条事实、两条规则和一个问题。其中事实、规则和问题都分

行书写。规则和事实可连续排列在一起,其顺序可随意安排,但同一谓词名的事实或规则必须集中排列在一起。问题不能与规则及事实排在一起,它作为程序的目标要么单独列出,要么在程序运行时临时给出。

这个程序的事实描述了一些对象(包括人和事物)间的关系;而规则则描述了john交朋友的条件,即如果一个人喜欢读书并且喜欢音乐(或者喜欢运动和喜欢音乐),则这个人就是john的朋友(当然,这个规则也可看作是john朋友的定义);程序中的问题是“约翰的朋友是谁?”

当然,PROLOG程序中的目标可以变化,也可以含有多个语句(上例中只有一个)。如果有多个语句,则这些语句称为子目标。例如对上面的程序,其问题也可以是

?-likes(mary,X).

?-likes(mary,music).

?-friend(X,Y).

?-likes(bell,sports), likes(mary,music), friend(john,X).

等等。当然,对于不同的问题,程序运行的结果一般是不一样的。

2.3.3 PROLOG程序的运行机理

PROLOG程序的运行是从目标出发,并不断进行匹配、合一、归结,有时还要回溯,直到目标被完全满足或不能满足时为止。

1. 自由变量与约束变量

PROLOG中称无值的变量为自由变量,有值的变量为约束变量。一个变量取了某值就说该变量约束于某值,或者说该变量被某值所约束,或者说该变量被某值实例化了。

2. 匹配合一

两个谓词可匹配合一,是指两个谓词的名相同,参量项的个数相同,参量类型对应相同,并且对应参量项还满足下列条件之一:

(1)如果两个都是常量,则必须完全相同。

(2)如果两个都是约束变量,则两个约束值必须相同。

(3)如果其中一个是常量,一个是约束变量,则约束值与常量必须相同。

(4)至少有一个是自由变量。

例如:下面的两个谓词

pre1("ob1","ob2",Z)

pre1("ob1",X,Y)

只有当变量X被约束为"ob2",且Y、Z的约束值相同或者至少有一个是自由变量时,它们才是匹配合一的。

3. 回溯

所谓回溯,就是在程序运行期间,当某一个子目标不能满足(即谓词匹配失败)时,控制就返回到前一个已经满足的子目标(如果存在的话),并撤消其有关变量的约束值,然后再使其重新满足。成功后,再继续满足原子目标。如果失败的子目标前再无子目标,则控制就返回到该子目标的上一级目标(即该子目标谓词所在规则的头部)使它重新匹配。回溯也是PROLOG的一个重要机制。

下面,我们介绍PROLOG程序的运行过程。我们仍以上面的程序为例。设所给的询问是?-friend(john,Y).(john和谁是朋友?)

则求解目标为

friend(john,Y).

这时,系统对程序进行扫描,寻找能与目标谓词匹配合一的事实或规则头部。显然,程序中前面的四条事实均不能与目标匹配,而第五个语句的左端即规则

friend(john,X):-likes(X,reading),likes(X,music).

的头部可与目标谓词匹配合一。但由于这个语句又是一个规则,所以其结论要成立则必须其前提全部成立。于是,对原目标的求解就转化为对新目标

likes(X,reading),likes(X,music).

的求解。这实际是经归结,规则头部被消去,而目标子句变为

?-likes(X,reading),likes(X,music).

现在依次对子目标

likes(X,reading)和likes(X,music)

求解。

子目标的求解过程与主目标完全一样,也是从头对程序进行扫描,不断进行测试和匹配合一等,直到匹配成功或扫描完整个程序为止。可以看出,对第一个子目标like(X,reading)的求解因无可匹配的事实和规则而立即失败,进而导致规则

friend(john,X):-likes(X,reading),likes(X,music).

的整体失败。于是,刚才的子目标

likes(X,reading)和likes(X,music)

被撤消,系统又回溯到原目标friend(john,X)。这时,系统从该目标刚才的匹配语句处(即第五句)向下继续扫描程序中的子句,试图重新使原目标匹配,结果发现第六条语句的左部,即规则

friend(john,X):-likes(X,sports),likes(X,music).

的头部可与目标为谓词匹配。但由于这个语句又是一个规则,于是,这时对原目标的求解,就又转化为依次对子目标

likes(X,sports)和likes(X,music)

的求解。这次子目标likes(X,sports)与程序中的事实立即匹配成功,且变量X被约束为bell。于是,系统便接着求解第二个子目标。由于变量X已被约束,所以这时第二个子目标实际上已变成了

likes(bell,music).

由于程序中不存在事实likes(bell,music),所以该目标的求解失败。于是,系统就放弃这个子目标,并使变量X恢复为自由变量,然后回溯到第一个子目标,重新对它进行求解。由于系统已经记住了刚才已同第一子目标谓词匹配过的事实的位置,所以重新求解时,便从下一个事实开始测试。

易见,当测试到程序中第三个事实时,第一个子目标便求解成功,且变量X被约束为mary。这样,第二个子目标也就变成了

likes(mary,music).

再对它进行求解。这次很快成功。

由于两个子目标都求解成功,所以,原目标friend(john,Y)也成功,且变量Y被约束为mary(由Y与X的合一关系)。于是,系统回答:Y=mary

程序运行结束。

上面只给出了问题的一个解。如果需要和可能的话,系统还可把john的所有朋友都找出来。我们把上述程序的运行过程再用示意图(图2─1)描述如下:

图2─1 PROLOG程序运行机理示例

上述程序的运行是一个通过推理实现的求值过程。我们也可以使它变为证明过程。

例如,把上述程序中的询问改为

friend(john,mary)

则系统会回答:yes

若将询问改为:

riend(john,smith)

则系统会回答:no

从上述程序的运行过程可以看出,PROLOG程序的执行过程是一个(归结)演绎推理过程。其特点是:推理方式为反向推理,控制策略是深度优先,且有回溯机制。其具体实现方法是:匹配子句的顺序是自上而下;子目标选择顺序是从左向右;(归结后)产生的新子目标总是插入被消去的目标处(即目标队列的左部)。PROLOG的这种归结演绎方法被称为SLD(LinearresolutionwithSelectionfunctionforDefiniteclause)归结,或SLD反驳-消解法。SLD 归结就是PROLOG程序的运行机理,它也就是所谓的PROLOG语言的过程性语义。

2.4 Turbo PROLOG程序设计

2.4.1 Turbo PROLOG的程序结构

一个完整的Turbo PROLOG(2.0版)程序一般包括常量段、领域段、数据库段、谓词段、目标段和子句段等六个部分。各段以其相应的关键字constants、domains、database、predicates、goal和clauses开头加以标识。:

另外,在程序的首部还可以设置指示编译程序执行特定任务的编译指令;在程序的任何位置都可设置注解。总之,一个完整的TurboPROLOG(2.0版)程序的结构如下

/*<注释>*/

<编译指令>

constants

<常量说明>

domains

<域说明>

database

<数据库说明>

predicates

<谓词说明>

goal

<目标语句>

clauses

<子句集>

当然,一个程序不一定要包括上述所有段,但一个程序至少要有一个predicates段、clauses段和goal段。在大多数情形中,还需要一个domains段,以说明表、复合结构及用户自定义的域名。如若省略goal段,则可在程序运行时临时给出,但这仅当在开发环境中运行程序时方可给出。若要生成一个独立的可执行文件,则在程序中必须包含goal段。另一方面,一个程序也只能有一个goal段。

例2.3 如果把上节中的程序要作为TurboPROLOG程序,则应改写为:

/*例子程序-1*/

DOMAINS

name=symbol

PREDICATES

likes(name,name).

friend(name,name)

GOAL

friend(john,Y),write(″Y=″,Y).

CLAUSES

likes(bell,sports).

likes(mary,music).

likes(mary,sports).

likes(jane,smith).

friend(john,X):-likes(X,sports),likes(X,music).

friend(john,X):-likes(X,reading),likes(X,music).

结合上例,我们再对上述程序结构中的几个主要段的内容和作用加以说明(其余段在后面用到时再作说明):

领域段该段说明程序谓词中所有参量项所属的领域。领域的说明可能会出现多层说明,直到最终说明到Turbo PROLOG的标准领域为止(如上例所示)。Turbo PROLOG的标准领域即标准数据类型,包括整数、实数、符号、串和符号等,其具体说明如表2.1所示。

表2.1 Turbo PROLOG的标准领域

谓词段:该段说明程序中用到的谓词的名和参量项的名(但Turbo PROLOG的内部谓词无须说明)。

子句段:该段是Turbo PROLOG程序的核心,程序中的所有事实和规则就放在这里,系统在试图满足程序的目标时就对它们进行操作。

目标段:该段是放置程序目标的地方。目标段可以只有一个目标谓词,例如上面的例子中就只有一个目标谓词;也可以含有多个目标谓词,如:

goal

readint(X),Y=X+3,write("Y=",Y).

就有三个目标谓词。这种目标称为复合目标。

另外,一般称程序目标段中的目标为内部目标,而称在程序运行时临时给出的目标为外部目标。

2.4.2 Turbo PROLOG的数据与表达式

1.领域

1)标准领域

Turbo PROLOG中不定义变量的类型,只说明谓词中各个项的取值域。

2)结构

结构也称复合对象,它是TurboPROLOG谓词中的一种特殊的参量项(类似于谓词逻辑中的函数)。

结构的一般形式为

<函子>(<参量表>)

其中函子及参量的标识符与谓词相同。注意,这意味着结构中还可包含结构。所以,复合对象可表达树形数据结构。例如下面的谓词

likes(Tom,sports(football,basketball,table-tennis)).

中的

sports(football,basketball,table-tennis)

就是一个结构,即复合对象。

又如:

person("张华",student("西安石油学院"),address("中国","陕西","西安")).

reading("王宏",book("人工智能技术基础教程","西安电子科技大学出版社")).

friend(father("Li"),father("Zhao")).

这几个谓词中都有复合对象。

复合对象在程序中的说明,需分层进行。例如,对于上面的谓词

likes(Tom,sports(football,basketball,table-tennis)).

在程序中可说明如下:

domains

name=symbol

sy=symbol

sp=sports(sy,sy,sy)

predicates

likes(name,sp)

3) 表

表的一般形式是

[x1,x2,…,xn]

其中xi(i=1,2,…,n)为PROLOG的项,一般要求同一个表的元素必须属于同一领域。

不含任何元素的表称为空表,记为[]。例如下面就是一些合法的表。

[1,2,3]

[apple,orange,banana,grape,cane]

["PROLOG","MAENS","PROGRAMMING","in logic"]

[[a,b],[c,d],[e]]

[]

表的最大特点是其元素个数可在程序运行期间动态变化。表的元素也可以是结构或表,且这时其元素可以属于不同领域。

例如:

name("Li Ming"),age(20),sex(male),address(xi an)]

[[1,2],[3,4,5],[6,7]]

都是合法的表。后一个例子说明,表也可以嵌套。

实际上,表是一种特殊的结构。它是递归结构的另一种表达形式。这个结构的函数名取决于具体的PROLOG版本。这里我们就用一个圆点来表示。

下面就是一些这样的结构及它们的表表示形式:

结构形式表形式

·(a,[]) [a]

·(a,·(b,[])) [a,b]

·(a,·(b,·(c,[]))) [a,b,c]

表的说明方法是在其组成元素的说明符后加一个星号*。如:

domains

lists=string*

predicates

pl(lists)

就说明谓词pl中的项lists是一个由串string组成的表。

对于由结构组成的表,至少得分三步说明。例如对于下面谓词p中的表

p([name("Liming"),age(20)])

则需这样说明:

domains

rec=seg*

seg=name(string);age(integer)

predicates

p(rec)

2. 常量与变量

由上面的领域可知,Turbo PROLOG的常量有整数、实数、字符、串、符号、结构、表和文件这八种数据类型。同理,Turbo PROLOG的变量也就有这八种取值。另外,变量名要求必须是以大写字母或下划线开头的字母、数字和下划线序列,或者只有一个下划线。这后一种变量称为无名变量。

3. 算术表达式

Turbo PROLOG提供了五种最基本的算术运算:加、减、乘、除和取模,相应运算符号为+、-、*、/、mod。这五种运算的顺序为:*、/、mod优先于+、-。同级从左到右按顺序运算,括号优先。算术表达式的形式与数学中的形式基本一样。例如:

数学中的算术表达式PROLOG中的算术表达式

x+yz X+Y*Z

ab-c/d A*B-C/D

u mod v U mod V(表示求U除以V所得的余数) 即是说,Turbo PROLOG中算术表达式采用通常数学中使用的中缀形式。这种算术表达式为PROLOG的一种异体结构,若以PROLOG的结构形式来表示,则它们应为+(X,*(Y,Z))

-(*(A,B),/(C,D))

mod(U,V)

所以,运算符+、-、*、/和mod实际也就是PROLOG内部定义好了的函数符。

在Turbo PROLOG程序中,如果一个算术表达式中的变元全部被实例化(即被约束)的话,则这个算术表达式的值就会被求出。求出的值可用来实例化某变量,也可用来同其他数量进行比较,用一个算术表达式的值实例化一个变量的方法是用谓词“is”或“=”来实现。例如:

Y is X+5 或Y=X+5 (*)

就使变量Y实例化为X+5的值(当然X也必须经已被某值实例化),可以看出,这里对变量Y的实例化方法类似于其他高级程序语言中的“赋值”,但又不同于赋值。例如,在PROLOG中下面的式子是错误的:

X=X+1

4. 关系表达式

Turbo PROLOG提供了六种常用的关系运算,即小于、小于或等于、等于、大于、大于或等于和不等于,其运算符依次为

<,<=,=,>,>=,<>

Turbo PROLOG的关系表达式的形式和数学中的也基本一样,例如:

数学中的关系式Turbo PROLOG中的关系式

X+1≥Y X+1>=Y

X≠Y X<>Y

即是说,Turbo PROLOG中的关系式也用中缀形式。当然,这种关系式为Turbo PROLOG 中的异体原子。若按Turbo PROLOG中的原子形式来表示,则上面的两个例子为>=(X+1,Y)和<>(X,Y)

所以上述六种关系运算符,实际上也就是Turbo PROLOG内部定义好了的六个谓词。这六个关系运算符可用来比较两个算术表达式的大小。

例如:

brother(Name1,Name2):-person(Name1,man,Age1),

person(Name2,man,Age2),

mother(Z,Name1),mother(Z,Name2),

Age1>Age2.

需要说明的是,“=”的用法比较特殊,它既可以表示比较,也可以表示约束值,即使在同一个规则中的同一个“=”也是如此。

例如:

(例一)

p(X,Y,Z):-Z=X+Y.

当变量X、Y、Z全部被实例化时,“=”就是比较符。如:对于问题

Goal:p(3,5,8).

机器回答:yes。而对于

Goal:p(3,5,7).

机器回答:no。

即这时机器把X+Y的值,与Z的值进行比较。

(例二)

但当X,Y被实例化,为Z未被实例化时,“=”号就是约束符。如:

Goal:p(3,5,Z).

机器回答:Z=8

这时,机器使Z实例化为X+Y的结果。

2.4.3 输入与输出

虽然PROLOG能自动输出目标子句中的变量的值,但这种输出功能必定有限,往往不能满足实际需要;另一方面,对通常大多数的程序来说,运行时从键盘上输入有关数据或信息也是必不可少的。为此每种具体PROLOG一般都提供专门的输入和输出谓词,供用户直接调用。例如,下面就是TorboPROLOG的几种输入输出谓词:

(1) readln (X)。

这个谓词的功能是从键盘上读取一个字符串,然后约束给变量X。

(2) readint (X)。

这个谓词的功能是从键盘上读取一个整数,然后约束给变量X,如果键盘上打入的不是整数则该谓词失败。

(3) readreal (X)。

这个谓词的功能是从键盘上读取一个实数,然后约束给变量X,如果键盘上打入的不是实数则该谓词失败。

(4) readchar(X)。

这个谓词的功能是从键盘上读取一个字符,然后约束给变量X,如果键盘上打入的不是单个字符,则该谓词失败。

(5) write(X1,X2,…Xn)。

这个谓词的功能是把项Xi(i=1,2,…n)的值显示在屏幕上或者打印在纸上,当有某个Xi 未实例化时,该谓词失败,其中的Xi可以是变量,也可以是字符串或数字。

(6) nl换行谓词。它使后面的输出(如果有的话)另起一行。另外,利用write的输出项"\n"也同样可起换行作用。例如:

write("name"), n l ,write("age")

与write("name","\n","age") 的效果完全一样。

例2.4用上面的输入输出谓词编写一个简单的学生成绩数据库查询程序。

PREDICATES

student(integer,string,real)

grade

GOAL

grade.

CLAUSES

student(1,"张三",90.2).

student(2,"李四",95.5).

student(3,"王五",96.4).

grade:-write("请输入姓名:"),readln(Name),

student(-,Name,Score),

nl,write(Name,"的成绩是",Score).

grade:-write(“对不起,找不到这个学生!”).

grade:-write("对不起,找不到这个学生!").

下面是程序运行时的屏幕显示:

请输入姓名:王五

王五的成绩是96.4。

2.4.4 分支与循环

PROLOG中并无专门的分支和循环语句,但PROLOG也可实现分支和循环程序结构。

1.分支

对于通常的IF-THEN-ELSE分支结构,PROLOG可用两条同头的并列规则实现。例如,将

IF x>0THENx:=1

ELSE x:=0

用PROLOG实现则是

Br :-x>0,x=1.

Br :-x=0.

类似地,对于多分支,可以用多条规则实现。例如:

Br :-x>0,x=1.

Br :-x=0,x=0.

Br :-x<0,x=-1.

2.循环

PROLOG可以实现计循环次数的FOR循环,也可以实现不计循环次数的DO循环。

例如下面的程序段就实现了循环,它使得write语句重复执行了三次,而打印输出了三个学生的记录。

student(1,"张三",90.2).

student(2,"李四",95.5).

student(3,"王五",96.4).

print:-student(Number,Name,Score),

write(Number,Name,Score),n l ,

Number=3.

这个例子可以看作是计数循环。当然,也可以通过设置计数器而实现真正的计数循环。下面的程序段实现的则是不计数的DO循环。

student(1,"张三",90.2).

student(2,"李四",95.5).

student(3,"王五",96.4).

print:-student(Number,Name,Score),

write(Number,Name,Score),nl,

fail.

print:-.

这个程序段中的fail是一个内部谓词,它的语义是恒失败。这个程序段与上面的程序段的差别仅在于把原来用计数器(或标记数)循环控制语句变成了恒失败谓词fail,另外再增加了一个print语句。增加这个语句的目的是为程序设置一个出口。因为fail是恒失败,下面若无出口的话,将引起print本身的失败。进而又会导致程序中的连锁失败。

2.4.5 动态数据库

动态数据库就是在内存中实现的动态数据结构。它由事实组成,程序可以对它操作,所以在程序运行期间它可以动态变化。Turbo PROLOG提供了三个动态数据库操作谓词: asserta ().

assertz ().

retract ().

其中fact表示事实。这三个谓词的功能是:

asserta ().把fact插入当前动态数据库中的同名谓词的事实之前;

assertz ().把fact插入当前动态数据库中的同名谓词的事实之后;

retract().把fact从当前动态数据库中删除。

例如语句

asserta(student(20,"李明",90.5)).

将在内存的谓词名为student的事实前插入一个新事实:

student(20,"李明",90.5)

如果内存中还没有这样的事实,则它就是第一个。又如语句

retract(student(20,-,-)).

将从内存的动态数据库中的删除事实

student(20,-,-)

它可解释为学号为20的一个学生的记录。注意,这里用了无名变量-。

可以看出,PROLOG提供的动态数据库机制,可非常方便地实现堆栈、队列等动态数据结构,提供的数据库操作谓词大大简化了编程。

另外,PROLOG还提供了谓词

save().

consult().

前者可将当前的动态数据库存入磁盘文件,后者则可将磁盘上的一个事实数据文件调入内存。

2.4.6 表处理与递归

表是PROLOG中一种非常有用的数据结构。表的表述能力很强,数字中的序列、集合,通常语言中的数组、记录等均可用表来表示。表的最大特点是其长度不固定,在程序的运行过程中可动态地变化。具体来讲,就是在程序运行时,可对表施行一些操作,如给表中添加一个元素,或从中删除一个元素,或者将两个表合并为一个表等等。用表还可以方便地构造堆栈、队列、链表、树等动态数据结构。

表还有一个重要特点,就是它可分为头和尾两部分。表头是表中第一个元素,而表尾是表中除第一个元素外的其余元素按原来顺序组成的表。例如下面的例子:

表表头表尾

[1,2,3,4,5] 1 [2,3,4,5]

[apple,orange,banana]apple [orange,banana]

[[a,b],[c],[d,e]][a,b][[c],[d,e]]

["PROLOG"]"PROLOG“ []

[]无定义无定义在程序中是用竖线“|”来区分表头和表尾的,而且还可以使用变量。例如一般地用[H|T]来表示一个表,其中H、T都是变量,H为表头,T为表尾。注意,此处H是一个元素(表中第一个元素),而T则是一个表(除第一个元素外的表中其余元素按原来顺序组成的表)。表的这种表示法很有用,它为表的操作提供了极大的方便。下面我们就给出用这种表示法通过匹配合一提取表头和表尾的例子。

表1 表2 合一后的变量值

[X|Y][a,b,c]X=a,Y=[b,c]

[X|Y][a]X=a,Y=[]

[a|Y][X,b]X=a,Y=[b]

[X,Y,Z][a,b,c]X=a,Y=b,Z=c

[[a,Y]|Z][[X,b],[c]]X=a,Y=b,Z=[[c]]还需说明的是,表中的竖杠“|”后面只能有一个变量。例如写法[X|Y,Z]就是错误的。但竖杠的前面的变量可以多于一个。例如写法[X,Y|Z]是允许的。这样,这个表同[a,b,c]匹配合一后,有

X=a,Y=b,Z=[c]

另外,竖杠的前面和后面也可以是常量,例如[a|Y]和[X|b]都是允许的,但注意,后一个表称为无尾表,如果它同表[a|Y]匹配,则有

X=a,Y=b (而不是Y=[b])

如果无竖杠“|”,则不能分离出表尾。例如,表[X,Y,Z]与[a,b,c]合一后得X=a,Y=b,Z=c。其中变量Z并非等于[c]。

例2.5 设计一个能判断对象X是表L的成员的程序。

我们可以这样设想:

(1)如果X与表L中的第一个元素(即表头)是同一个对象,则X就是L的成员;

(2)如果X是L的尾部的成员,则X也就是L的成员。

根据这种逻辑关系,于是有下面的PROLOG程序:

member(X,[X|Tail]).

member(X,[Head|Tail]):-member(X,Tail).

其中第一个子句的语义就是上面的第一句话,第二个子句的语义就是上面的第二句话。可以看出,这个程序中使用了递归技术,因为谓词member的定义中又含有它自身。利用这个程序我们就可以判定任意给定的一个对象和一个表之间是否具有member(成员)关系。例如,我们取表L为[a,b,c,d],取X为a,对上面的程序提出如下询问:

Goal:member(a,[a,b,c,d]).

则有回答:yes

同样对于询问:

Goal:member(b,[a,b,c,d]).

Goal:member(c,[a,b,c,d]).

Goal:member(d,[a,b,c,d]).

都有回答:yes

但若询问

Goal:member(e,[a,b,c,d]).

则回答:no

如果我们这样询问

Goal:member(X,[a,b,c,d]).

意思是要证明存在这样的X,它是该表的成员,这时系统返回X的值,即X=a

如果需要的话,系统还会给出X的其他所有值。

例2.6 表的拼接程序,即把两个表连接成一个表。

append([],L,L).

append([H|T],L2,[H|Tn]):-append(T,L2,Tn).

程序中第一个子句的意思是空表同任一表L拼接的结果仍为表L;第二个子句的意思是说,一个非空的表L1与另一个表L2拼接的结果L3是这样一个表,它的头是L1的头,它的尾是由L1的尾T同L2拼接的结果Tn。这个程序刻划了两个表与它们的拼接表之间的逻辑关系。

可以看出,谓词append是递归定义的,子句append([],L,L).为终结条件,即递归出口。

对于这个程序,如果我们询问

Goal:append([1,2,3],[4,5],L).

则系统便三次递归调用程序中的第二个子句,最后从第一个子句终止,然后反向依次求出每次的拼接表,最后输出

L=[1,2,3,4,5]

当然,对于这个程序也可以给出其他各种询问,如:

Goal:append([1,2,3],[4,5],[1,2,3,4,5]).

系统回答:yes

Goal:append([1,2,3],[4,5],[1,2,3,4,5,6]).

系统回答:no

Goal:append([1,2,3],Y,[1,2,3,4,5]).

系统回答:Y=[4,5]

Goal:append(X,[4,5],[1,2,3,4,5]).

系统回答:X=[1,2,3]

Goal:append(X,Y,[1,2,3,4,5]).

系统回答:

X=[],Y=[1,2,3,4,5]

X=[1],Y=[2,3,4,5]

X=[1,2],Y=[3,4,5]

X=[1,2,3],Y=[4,5]

等等(如果需要所有解的话)。

例2.7 表的输出。

print([]).

print([H|T]):-write(H),print(T).

例2.8 表的倒置,即求一个表的逆序表。

reverse([],[]).

reverse([H|T],L):-reverse(T,L1),append(L1,[H],L).

这里,reverse的第一个项是输入,即原表,第二个项是输出,即原表的倒置。

2.4.7 回溯控制

PROLOG在搜索目标解的过程中,具有回溯机制,即当某一个子目标Gi不能满足时,就返回到该子目标的前一个子目标Gi-1,并放弃Gi-1的当前约束值,使它重新匹配合一。在实际问题中,有时却不需要回溯,为此PROLOG中就专门定义了一个阻止回溯的内部谓词——“!”,称为截断谓词。

截断谓词的语法格式很简单,就是一个感叹号“!”。!的语义是:

(1)若将“!”插在子句体内作为一个子目标,它总是立即成功;

(2)若“!”位于子句体的最后,则它就阻止对它所在子句的头谓词的所有子句的回溯访问,而让回溯跳过该头谓词(子目标),去访问前一个子目标(如果有的话);

(3)若“!”位于其他位置,则当其后发生回溯且回溯到“!”处时,就在此处失败,并且“!”还使它所在子句的头谓词(子目标)整个失败(即阻止再去访问头谓词的其余子句(如果有的话),即迫使系统直接回溯到该头谓词(子目标)的前一个子目标(如果有的话))。

例2.9考虑下面的程序:

p(a). (2─1)

p(b). (2─2)

q(b). (2─3)

r(X):-p(X),q(X). (2─4)

r(c).

对于目标:r(Y).

可有一个解

Y=b

但当我们把式(2─4)改为

r(X):-p(X),!,q(X). (2─4′)

时,却无解。

这是由于添加了截断谓词“!”。因为式(2─4′)中求解子目标p(X)时,X被约束到a,然后跳过“!”,但在求解子目标q(a)时遇到麻烦,于是又回溯到“!”,而“!”阻止了对p(X)的下一个子句p(b)和r的下一个定义子句r(c)的访问。从而,导致整个求解失败。

例2.10 设有程序:

g0:-g11,g12,g13. (2─5)

g0:-g14. (2─6)

g12:-g21,!,g23. (2─7)

g12:-g24,g25. (2─8)

.........

给出目标:g0.

假设运行到子目标g23时失败,这时如果子句(2─7)中无!的话,则会回溯到g21,并且,如果g21也失败的话,则会访问下面的子句(2─8)。但由于有!存在,所以不能回溯到g21,

而直接宣告g12失败。于是,由子句(2─5),这时则回溯到g11。如果我们把子句(2─7)改为g12: -g21, g23,!. (2─9)

当然这时若g23失败时,便可回溯到g21,而当g21也失败时,便回溯到g12,即子句(2─8)被“激活”。但对于修改后的程序,如果g13失败,则虽然可回溯到g12,但对g12不做任何事情,便立即跳过它,而回溯到g11,如果子句(2─9)中无!,则当g13失败时,回溯到g12便去考虑子句(2─8),只有当子句(2─8)再失败时才回溯到g11。

2.4.8 程序举例

下面我们给出几个简单而又典型的例子程序。通过这些程序,读者可以进一步体会和理解PROLOG程序的风格和能力,也可以掌握一些基本的编程技巧。

例2.11 下面是一个简单的路径查询程序。程序中的事实描述了如图2─2所示的有向图,规则是图中两节点间有通路的定义。

图2─2 有向图

predicates

road(symbol,symbol)

path(symbol,symbol)

clauses

road(a,b).

road(a,c).

road(b,d).

road(c,d).

road(d,e).

road(b,e).

path(X,Y):-road(X,Y).

path(X,Y):-road(X,Z),path(Z,Y).

程序中未含目标,所以运行时需给出外部目标。例如当给目标:

path(a,e).

系统将回答:yes

但当给目标:

path(e,a).

时,系统则回答:no

如果给出目标:

run.

且在程序中增加子句

run:-path(a,X),write("X=",X),nl,fail.

run.

屏幕上将会输出:

X=b

X=c

X=d

X=e

X=d

X=e

X=e

即从a出发到其他节点的全部路径。

例2.12 下面是一个求阶乘程序,程序中使用了递归。

/*aFactorialProgram*/

domains

n,f=integer

predicates

factorial(n,f)

goal

readint (I),

factorial(I,F),

write(I,"!=",F).

clauses

factorial(1,1).

factorial(N,Res):-

N>0,

N1=N-1,

factorial(N1,FacN1),

Res=N*FacN1.

程序运行时,从键盘输入一个整数,屏幕上将显示其阶乘数。

例2.13 下面是一个表的排序程序,采用插入排序法。

/*insertsort*/

domains

listi=integer*

predicates

insert-sort(listi , listi)

insert(integer,listi,listi)

asc-order(integer,integer)

clauses

insert-sort([],[]).

insert-sort([H|Tail],Sorted-list):- insert-sort(Tail,Sorted-Tail),

insert(H,Sorted-Tail,Sorted-list).

insert(X,[Y|Sorted-list],[Y|Sorted-list1]):- asc-order(X,Y),!,

insert(X,Sorted-list,Sorted-list1).

insert(X,Sorted-list,[X|Sorted-list]).

asc-order(X,Y):-X>Y.

程序中对表处理使用了递归。程序中也未给出目标,需要在运行时临时给出。例如当给目标:

insert-sort([5,3,4,2,6,1,7,8,9,0],L).

系统将输出:

L=[0,1,2,3,4,5,6,7,8,9]

例2.14下面是一个简单的通信录管理程序,其中用到输入输出、动态数据库等。通过阅读这个程序,我们还可以掌握循环结构和简单的菜单程序编写方法。

/*通信录*/

database

person(string,integer)

predicates

address-book

chose(integer)

input

query

repeat

goal

address-book.

clauses

address-book:- repeat,

clearwindow,

write("=============="),nl,

write("1--录入"),nl,

write("2--查询"),nl,

write("3--退出"),nl,

write("=============="),nl,

write("请选择:-"),

readint(N),

chose(N).

chose(1):-input,fail.

chose(2):-query,fail.

chose(3):-clearwindow,!.

input:-clearwindow,

write("姓名:"),readln(Name),

write("电话:"),readint(Tel),

assertz(person(Name,Tel)),!.

query:-clearwindow,

write("姓名:"),readln(Name),

person(Name,Tel),

write("电话:",Tel),

readchar(-),!.

repeat.

repeat:-repeat.

程序中的repeat恒成功。它与内部谓词fail配合实现了循环。

需说明的是,这仅是一个演示性程序,还不能实用。因为这里的通信录并未存入磁盘文件。用谓词save就可方便地把通信录存入磁盘文件。例如用语句

save("addrbook.dat")

就可把已插入内存的person事实存入文件addrbook.dat中。而语句

consult("addrbook.dat")

则可又将该文件中的事实装入内存。

2.4 函数型程序设计语言LISP

LISP语言的主要特点是:

(1) LISP程序由一组函数组成,程序的执行过程是函数的调用过程。

(2) 程序和数据在形式上是相同的,即都是符号表达式,简称为S─表达式。

(3) 递归是LISP语言的主要控制结构。

(4) 程序以交互方式运行。

2.2.1 LISP的程序结构与运行机制

LISP的程序一般由函数的定义和函数的调用两部分组成。其一般格式为:

(DEFUN(<函数名>(<形参表>)<函数体>)

(<函数名>(〖WB〗<形参表>)<函数体>)

(<函数名>(<形参表>)<函数体>))

(<函数名><实参表>)

(<函数名><实参表>)

(<函数名><实参表>)

其中的“DEFUN”是定义函数的关键字,“函数名”可以是系统的内部函数(名),也可以是用户用DEFUN定义的函数(名)。例如下面就是一个LISP程序。

(DEFUNHANOI(a b c n)

(COND((=n1)(MOVE-DISK a c))

(T(HANOI a c b(-n1))

(MOVE-DISK a c)

(HANOI b a c(-n1))))

(DEFUNMOVE-DISK(from to)

(TERPRI)

(PRINC″Move Disk From″)

(PRINC from)

(PRINC"To")

(PRINC to))

(HANOI′a′b′c3)

2.2.2 S─表达式

从语法上看,LISP程序的基本单位是S─表达式。S─表达式又可分为原子和表两大类。

原子(atom)是由字母和数字组成的字符串,是S─表达式的最简单情况。原子又可分为文字原子、串原子和数字原子三种。

文字原子又称符号(symbol),是以字母开头的字母数字串,用来表示常量、变量和函数的名字等。例如:ABC、X1等。

串原子是由双引号括起来的一串字符。如"LISP Program"。

数字原子由数字串组成。在其前面可以有符号“-”或“+”,中间可出现“.”,用来表示整数和实数。例如:256、-66、3.14159等。

S─表达式可以递归定义如下:

(1) 原子是S─表达式。

(2) 若S1和S2是S─表达式,则(S1·S2)也是S─表达式。由定义,下面的式子都是S─表达式:

X2

123

(A·B)

(A·(B·C))

表(list)是LISP语言中最常用的数据类型,也是主要的处理对象。表是由圆括号括起来的由空格分开的若干个元素的集合。

表的一般形式为:

()

例如:

(X Y Z),(+12),(A (B C))

左括号后面的第一个元素称为表头,其余的元素组成的表称为表尾。例如,对于表(+12)的头为+,尾为(12)。

特别地,元素个数为零的表为空表,记为()或NIL。

表是一种特殊的S─表达式,每一个表都对应着一个S─表达式。二者的关系由下面的例子说明。

表←——————————————→S -表达式

(A) (A·NIL)

(AB) (A·(B·NIL))

(ABC) (A·(B·(C·NIL)))

((AB)CD) ((A·(B·NIL))·(C·(D·NIL)))

可以看出,表的S─表达式的结构实际是一棵二叉树。

2.2.3 基本函数

LISP的函数都以表的形式出现,并一律使用前缀表示方式,即表头为函数名,并且每个函数都有一个返回值。LISP的函数可分为语言自身提供的内部函数(称为基本函数或系统函数)和用户自定义函数两类。基本函数的种类有十多个,下面仅给出其中主要的几类。1. 表处理函数

表处理是LISP的主要特色,表处理的函数也很多,下面仅给出最常用的几个。

1) CAR函数

格式(CAR<表>)

其中CAR为函数名,它是一个保留字(下同)。

功能取出表中的表头。

例如:(CAR′(LISP Language Program))

返回值为:LISP

格式(CDR<表>)

功能取出表中的表尾。

例如:(CDR′(LISP Language Program))

返回值为:(Language Program)

3) CONS函数

格式(CONS<表>)

功能将S─表达式作为一个元素加到表中去,并作为所构成新表中的第一个元素。

例如:(CONS′My′(LISP Language Program))

返回值为:(My LISP Language Program)

4) APPEND函数

格式(APPEND<表1><表2>…<表n>)

功能将n个表中的元素合并成一个新表。

例如:(APPEND′(TIGER LION)′(DOG CA T))

返回值为:(TIGER LION DOG CAT)

5) LIST函数

格式(LIST)

功能把n个S─表达式作为元素括在一起构成一张新表。

例如:(LIST′YELLOW′RED′BLUE)

返回值为:(YELLOW RED BLUE)

2.算术函数

LISP的算术表达式也是用函数表示的,称为算术函数。下面我们仅举例说明。

(+25)

表示2+5,返回值为7。

(-(*48)(/105))表示4×8-10/5,返回值为30。

3. 求值与赋值函数

在上面的函数中多次出现撇号′,它的意思是禁止求值。为什么要禁止求值呢?原来,LISP总是试图对一切S─表达式求值。表的值是通过函数运算而得到的,原子的值则是通过赋值函数实现的。撇号′也是一个函数,它实际是禁止求值函数QUOTE的简写形式。

赋值函数有多个,其中SET函数是一个最基本的赋值函数。

格式(SET<变量>)

功能把S─表达式赋给变量。

例如:

(SET′X′8); X 得到值8

(SET′Y′(a b c)); Y 得到值(a b c)

(SET′Z(CDRY); Z 得到值(b c)

另外,赋值函数还有SETQ、SETF(COMMON LISP),其功能是类似的。

4. 谓词函数

返回值为逻辑值真或假的函数称为谓词函数,简称谓词。LISP中真和假分别用T和NIL 表示,当函数的返回值为非NIL时,也表示为真。另外,NIL也表示空表。谓词函数也有多个,下面我们仅给出常用的几个。

(1) 原子谓词ATOM

格式(ATOM<参数>)

功能检测其参数是否为原子,是则返回T,否则返回NIL。

VB程序设计语言 微课

《VB程序设计语言》 一、前言 (一) 课程的性质 VB程序设计是江苏省五年制高职计算机网络技术专业的一门专业平台课程。其任务是:使学生掌握VB基本控件的属性设置、事件编码、菜单、工具栏、状态栏及MDI多窗体技术,能熟练进行程序界面设计;知道Visual Basic语言的数据类型、表达式、程序结构与流程控制语句、数组、函数、过程的概念与使用方法,了解可视化计算机程序设计方法以及面向对象的编程思想,具备高级语言程序设计及可视化编程能力,知道数据库基本知识,数据表与数据记录的概念,掌握用可视化数据管理器建立数据库、数据表以及编辑数据表的方法,初步掌握结构化查询语言(SQL)的语法与使用方法,能使用程序设计语句以ADO控件、ADO 对象为数据源设计数据库应用程序,使学生掌握可视化应用程序开发工具的基本使用方法,进一步掌握程序设计的基本方法及获得相应的训练,为以后有关课程的学习和一些实践环节做好必要准备,并为将来在本专业领域进行数据处理与软件设计打下基础。 (二) 设计思路 该课程是依据企业中对软件研发的行业标准、工作任务设置。其总体设计思路是,打破以知识传授为主要特征的传统学科课程模式,转变为以工作任务为中心组织课程内容,并让学生在完成具体项目的过程中学会完成相应工作任务,构建相关理论知识,发展职业能力。课程设计以就业为向导,以能力为本位,以职业实践为主线,以项目课程为主体,以务实基础、适应岗位为目标,尽可能形成模块化的专业课程体系。本课程在目标设定、教学过程、课程评价和教学资源的开发等方面都突出以学生为主体的思想。课程实施应成为学生在教师指导下构建知识、提高技能、磨砺意志、活跃思维、展现个性、发展心智和拓展视野的过程。本课程倡导目标驱动型的教学模式,强调问题解决和创新实践。结合学生的专业实际,引导学生自主选择、自我设计,提供拓展内容,调动学生的主观能动性,挖掘学生潜力,在教师的指导下,通过实践、参与和合作等方式,实现任务目标,感受成功。在学习过程中进行情感和策略调整,发挥学生的想象力和创造力,以形成积极的学习态度,促进计算机综合应用能力的提高。教学过程中,要通过校企合作,校内实训基地建设等多种途径,采取工学结合等形式,充分开发学习资源,给学生提供丰富的实践机会。建立能激励学生学习兴趣和自主学习能力发展的评价体系,教学效果评价采取过程评价与结果评价相结合的方式,通过理论与实践相结合,重点评价学生的职业能力。注重培养和激发学生学习的积极性和自信心。评价要有利于促进学生计算机综合应用能力和健康人格的发展;促进教师不断提高教育教学水平;促进VB课程的不断发展与完善。 在项目的具体设计过程中,根据软件专业的典型产品为载体,使工作任务具体化,产生了具体的学习项目,其编排依据是该职业特有的工作任务逻辑关系、而不是知识关系。依据工作任务完成的需要、职业学校学生的学习特点和职业能力形成的规律来确定课程的知识、技能等内容。 二、课程目标 (一) 总体目标 通过本课程的学习,使学生了解程序设计在本专业的应用、发展及其趋势,培养学生的专业技能和综合素质。主要培养学生理解程序设计的基本概念,建立起程序设计的基本思路,提高学生的理论知识水平和专业技能。其中包括算法的概念、程序设计中的基本技巧和一些常用算法;能够阅读、理解源程序和设计解题流程的能力;了解结构化程序设计和面向对象程序设计的思想,能编制出风格良好的程序;最后达到使用VB建 立一个中、小型的应用系统的目的。 (二) 具体目标

汇编语言程序设计实验教程

汇编语言程序设计实验教程

目录 第一章上机过程 (4) 1.1编辑源程序 (4) 1.2 汇编源程序 (5) 1.3连接目标程序 (6) 1.4运行程序 (7) 第二章DEBUG命令祥解 (8) 2.1 DEBUG程序使用 (8) 2.2 DEBUG的常用命令 (8) 第三章汇编语言程序设计实验 (13) 3.1实验一顺序与分支程序设计 (13) 3.2 实验二循环与子程序程序设计 (15) 3.3 实验三算术运算与代码转换程序设计 (16) 3.4 实验四字符串的匹配与替换程序设计 (18) 3.5 实验五输入输出程序设计 (19) 第四章部分实验参考答案 (21)

第一章上机过程 1.1编辑源程序 汇编语言源程序:用汇编语句编写的解决应用问题的程序。 汇编程序:将汇编语言源程序翻译成机器语言程序的系统。 汇编:将汇编语言程序翻译成机器语言程序的过程。 在编辑汇编语言源程序时,对计算机硬件工作环境无特殊要求,对软件工作环境要求也很简单,只需用建立ASCII码文本文件的软件即可。 (1)编辑软件 编辑软件:EDIT、QE、WORD、NOTEPAD等。 当输入、建立和修改源程序时,可任选一种编辑软件,不要用格式控制符,要求编辑完成的文件扩展名一定是.ASM。 (2)汇编程序 有汇编ASM.EXE、宏汇编MASM.EXE及TASM等,一般使用宏汇编MASM.EXE,因它比ASM.EXE功能强。TASM适用于8086/8088~Pentium系列指令系统所编写的汇编语言程序,是比较先进的汇编工具。 (3)连接程序 用连接程序LINK.EXE或TLINK.EXE,将MASM.EXE产生的目标代码程序(.OBJ)文件连接成可执行程序.EXE,TLINK比LINK更先进。 (4)辅助工具程序(.EXE) 进行汇编语言程序调试和文件格式转换的程序有: https://www.doczj.com/doc/b418682911.html, 动态调试程序 EXE2BIN.EXE文件格式转换程序

《程序设计语言》教学大纲

课程名称:程序设计语言 适用专业:计算机网络应用 适用层次:高技 总 学 时:320学时 一、说明 1、课程的性质与任务 《程序设计语言》课程是高技计算机网络应用专业必修的课程,本课程采用的语言是Javascript,简单、实用,能使互联网前端和后端有机的结合;利用第三方库、模块,学生可以高效、快速地开发出互联网产品,同时为专业知识奠定了扎实的基础;课程与互联网密不可分,通过掌握互联网的专业知识,培养学生的职业素养、学习能力和团队合作精神能力。 2、教学基本任务和要求 熟练使用Javascript编写程序;掌握HTML、CSS和Javascript制作前端网页,熟悉jQuery、Bootstrap等框架的使用;掌握利用Node.js和Express.js构建服务器后台程序,并与前端进行数据交互;了解产品的用户体验,识得UI制作;掌握利用UML建模工具绘制用例图、功能图、流程图等;知道WebSocket原理,并学会使用WebSocket构建实时通讯系统;通过Node.js第三方模块,学会动态地构建应用程序的多样主题;了解Ghost开源系统,识得利用Ghost构建多样主题的博客网站;

掌握国外搜索引擎的搜索技巧,能看懂、理解搜索结果的英文内容。 3、教学方法与重点、难点 《程序设计语言》是一门理论性和实践性都很强的专业课程,理论性要求学生具备一定的逻辑思维能力,实践性要求学生多动手。因此课程的重点放在项目实践上,培养学生较强的动手能力、解决问题能力、独立思考能力和项目协作能力。理论知识以精讲为主,讲清基本原理、基本方法与基本技巧,为学生提高动手技能打好基础;多利用国外搜索引擎,能让学生掌握专业知识的同时,也能培养学生的英文阅读、交流能力。 二、内容及学时分配 序 号章节内容总学 时 讲授 学时 训练 学时备注 1第一章 课程介绍22 2第二章 基本语法1266§2.1 变量与数据类型 §2.2 程序结构控制 §2.3 自定义函数 §2.4 字符串函数 §2.5 Math函数 2 1 1 1 1 2 1 1 1 1 3第三章 闭包与回调函数1266§3.1 剖析函数定义 §3.2 闭包 §3.3 回调函数 2 2 2 2 2 2 4第四章 对象1266§4.1 对象的使用 §4.2 this、apply、call §4.3 原型继承 2 2 2 2 2 2期中考试

《C语言程序设计》课程设计报告

《C语言程序设计》课程设计报告 (2013— 2014学年第 3 学期) 题目:C语言课程设计 专业:软件工程 班级:软件工程技术2班 姓名学号: 1 林燕萍 指导教师:吴芸 成绩: 计算机科学与技术系 2014 年6月23日

目录 一、课程设计的目的与要求 (1) 二、方案实现与调试 (3) 2.1 掷骰子游戏 (5) 2.2 射击游戏 (7) 2.3 计算存款本息之和 (8) 2.4肇事逃逸 (10) 2.5 礼炮 (12) 2.6 汽车加油 (14) 2.7 大优惠 (16) 2.8 金币 (19) 三、课程设计分析与总结 (23) 附录程序清单 (25) 一、课程设计的目的与要求(含设计指标) C语言是一种编程灵活,特色鲜明的程序设计语言。C语言除了基知识,如概念,方法和语法规则之外更重要的是进行实训,以提高学习者的动手和编程能力,从应试课程转变为实践工具。 这是学习语言的最终目的。结合多年来的教学经验,根据学生的学习情况,为配合教学过程,使“项目教学法”能在本质上促使学生有更大进步,特编写了该《C语言程序设计任务书》,以在实训过程中给学生提供帮助。达到如下目的: 1.在课程结束之前,让学生进一步了解C程序设计语言的编程功能; 2.让学生扎实掌握C程序设计语言的相关知识; 3.通过一些有实际意义的程序设计,使学生体会到学以致用,并能将程序设计的知识与专业知识有效地结合,更全面系统地了解行业知识。 编写程序要求遵循如下基本要求: ①模块化程序设计 ②锯齿型书写格式

③必须上机调试通过 二、方案实现与调试 2.1掷骰子游戏 2.1.1 题目内容的描述 1) 两人轮流掷骰子,每次掷两个,每人最多掷10次。 2) 将每人每次的分值累加计分 3) 当两个骰子点数都为6时,计8分;当两个点数相等且不为两个6时,计7分;当两个点数不一样时,计其中点数较小的骰子的点数。 4) 结束条件:当双方都掷10次或经过5次后一方累计分数多出另一方的30%及以上。最后显示双方分数并判定优胜者。 2.1.2输入数据类型、格式和内容限制和输出数据的说明 数据类型:整型;内容限制:随机数的产生;输入数据结果:胜利的一方 2.1.3主要模块的算法描述 本算法的思路过程:首先要随机产生随机数,然后进行算法输出数值,执行条件判断输入结果,最后比较结果,判断胜利的一方。 程序流程图 图1 掷骰子游戏 2.1.4调试过程及实验结果

80x86汇编语言程序设计教程》(清华大学出版社,黑色封面,杨季文著)

80x86汇编语言程序设计教程》(清华大学出版社,黑色封面,杨季文著) 《计算机操作系统原理》 《Inside Windows 2000》(微软出版社,我看的是E文版的,中文的书名想必是Windows 2000 技术内幕之类吧)。 《数据结构和算法》——这门课程能够决定一个人程序设计水平的高低,是一门核心课程。我首选的是清华版的(朱战立,刘天时) 《软件工程》——这门课程是越到后来就越发现它的重要,虽然刚开始看时就象看马哲一样不知所云。我的建议是看《实用软件工程》(黄色,清华) 《Windows 程序设计》——《北京大学出版社,Petzold著》我建议任何企图设计Windows 程序的人在学习VC以前仔细的学完它。而且前面的那本 建议:你还可以在CSDN上阅读到许多书评。这些书评能够帮助你决定读什么样的书 关于编程的网站 计算机编程 郭新明-FTP服务器体验式学习课程(张孝祥监制) https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=3997 https://www.doczj.com/doc/b418682911.html,快速开发新闻系统在线播放 https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=4708 数字电路基础[宁波电大] https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=774 计算机组成与汇编语言程序设计(赵丽梅)宁波电大 https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=1242 操作系统(陈访荣)宁波电大(在线播放) https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=4708 计算机网络(马敏飞)宁波电大 https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=1243 https://www.doczj.com/doc/b418682911.html, 2.0快速入门(12)-https://www.doczj.com/doc/b418682911.html, 2.0网站快速导航 https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=2501 Internet和Intranet应用(薛昭旺)宁波电大 https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=1245 2004年电脑硬件安装调试维修视频教学讲授 https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=4825 https://www.doczj.com/doc/b418682911.html, 高级排错技巧 https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=768 SQL Server 2000管理专家系列课程 https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=4832 开心三人行系列(2):使用Atlas 构建AJAX应用 https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=2564 Visual Basic 2005开发技巧系列课程(4): 在Visual Basic 2005中使用.NET Framework 2.0新增功能 https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=2526 SQL Server 2005 系列课程-使用ADO https://www.doczj.com/doc/b418682911.html,开发SQL Server 2005 OLAP应用 https://www.doczj.com/doc/b418682911.html,/so/so138.aspx?id=2535

2012届程序设计语言强化课程设计综合任务

程序设计语言强化课程设计综合任务: (一)学生成绩排名 先采用选择法,将学生成绩从高到低进行排序,再输入一个学生的成绩,将此成绩按照排序规律插入已排好序的学生成绩数组,最后将排好序的成绩单进行反序存放。 步骤、方法与要求 1.定义一个数组a[11],用以存放学生的成绩。 2.从键盘输入10个学生成绩。 3.采用选择法,将学生成绩按照从高到低进行排序。 4.再输入一个学生的成绩,将此成绩按照排序规律插入原学生成绩数组。 5.将排好序的成绩单进行反序存放,即原来是从高到低,现在改为从低到高排列。 6.将以上每一步骤的结果均打印输出,验证程序是否正确实现题目要求。 (二)根据条件进行学生成绩排名 在函数中进行10个学生成绩从高到低排名,再改进函数,进行n个学生成绩从高到低排名, 排名方式根据函数的style参数进行,如style为‘a'按升序排,style为' d ' 按降序排。(a:ascending 升,d:descending 降) 编写多个不同函数,使之能实现不同的排序算法(3种以上),再编写一个通用输出函数,(要求用函数指针做参数)能分别打印不同排序算法的结果。 步骤、方法与要求 1.在函数中进行10个学生成绩从高到低排名 sort(int a[10]) 2.改进第一步的函数为sort(int a[],int n),进行n个学生成绩从高到低排名, 3.改进第二步的函数为sort(int a[],int n, char style), 将n个学生成绩从 高到低排名,排名方式根据sort()函数的style参数进行,如style为‘a’按 升序排,style为’d’按降序排。 (a:ascending 升,d:descending 降) 4.编写4个排序函数,实现4种不同的排序算法(用冒泡法进行升序排序,用 冒泡法进行降序排序,选择法进行升序排序,选择法进行降序排序等),函数 返回指向排好序的数组的指针。 5.编写通用输出函数 show(int *(* fun)(a[ ], int n )),其中a[]为成绩 数组,n为数组元素个数。 6.编写主函数调用以上函数。

2位数计算器程序-汇编语言课程设计

信息学院课程设计题目:2位数计算器程序设计 __ 姓名: __ _____ 学号: ____ ___ 班级: 课程:汇编语言 ________ 任课教师:侯艳艳 ____ 2011年12月

课程设计任务书及成绩评定

目录 摘要 (2) 1.设计目的………………………………………………………………………………………………?2 2.概要设计………………………………………………………………………………………………?3 2.1系统总体分析…………………………………………………………………………?3 2.2程序流程图 (3) 3.详细设计......................................................................................................? (4) 3.1主程序及子程序说明 (4) 3.2程序代码编写 (4) 4.程序调试 (6) 4.1运行界面分析 (6) 4.2算法的分析 (6) 4.3调试过程及分析 (6) 5.心得体会 (7) 5.1设计体会...................................................................................................? (7) 5.2系统改进...................................................................................................? (7) 参考文献 (8)

程序设计语言 习题与答案

第六章习题 P159-161 一、复习题 1、简述自然语言与形式语言的概念以及区别、汇编语言与机器语言的概念及区别。 自然语言是某一社会发展中形成的一种民族语言,而形式语言是进行形式化工作的元语言,它是以数学和数理逻辑为基础的科学语言。用机器指令形式编写的程序称为机器语言,用带符号或助记符的指令和地址代替二进制代码成为语言进化的目标。这些使用助记符语言的语言后来就被称之为汇编语言。(P144- P146) 2、试述计算机语言的类型,它们各有什么特点? 1.机器语言,是最低级的语言,由二进制码组成,最早期的程序员通过在纸带上打点来写程序 2.汇编语言,用助记符和地址符代替了二进制码,更易于编写。 3.高级语言,相对于汇编语言又上升了一步,更接近于自然语言,如C语言、Pascal、Java、C#等都是高级语言。(P145-147) 3、列举程序设计语言的几种范型。 程序语言大致分为命令式程序设计语言、面向对象的程序设计语言、函数式程序设计语言和逻辑型程序设计语言等范型。(P147-149) 4、简述语言虚拟机。 提示:语言虚拟机是某种语言的解释器。语言虚拟机是建立在硬件和操作系统之上,针对不同的硬件和操作系统有不同的虚拟机,通过语言虚拟机屏蔽掉硬件的差异。这样使得硬件系统能够支持这种语言编写的程序的有效执行。目前最流行的语言虚拟机是Java虚拟机。(P156) 5、计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么? 提示:主要有编译、解释等方式,也有两种方式的混合使用的形式。 编译是使用编译器将高级语言编写的源程序转换成计算机可以执行的机器语言可执行程序,也可以理解为用编译器产生可执行程序的动作。编译方式是一次编译,然后执行程序可以反复多次执行。 解释是另一种将高级语言转换为可执行程序的方式。与编译不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。 近来随着网络的发展,为了实现跨平台但同时又保证一定的效率,出现了编译、解释混合的方式,先用伪编译形成效率较高中间代码,再用语言虚拟机进行解释执行,以屏蔽掉硬件的差异。 (P154-157) 6、请画出编译程序的总框图。如果你是一个编译程序的总设计师,设计编译程序时应当考虑哪些问题? 作为一个编译程序的总设计师,首先要深刻理解被编译的源语言其语法及语义;其次,

最新高级语言程序设计课程设计方案汇总

2011高级语言程序设计课程设计方案

《高级语言程序设计》课程设计方案 一、设计的目的 《高级语言序设计》课程设计是计算机科学与技术专业和网络工程专业集中实践性环节之一,是学习完《高级语言程序设计》课程后进行的一次全面的综合练习。本课程设计主要目的在于加深学生对高级语言程序设计的基本理论和基本语法知识的理解,全面掌握高级语言程序设计的基本方法和技术,熟悉相关编程环境和工具,能够熟练地运用C/C++编写较为简单的应用程序,并对之进行调试分析。按照专业人才培养方案规定,本课程设计合格学生记学分2分。 二、参与人员与组织方式 按照专业人才培养方案,本课程设计要求2010级计算科学与技术专业和网络工程专业的所有学生必须按时完成。为了保证设计的质量,本课程设计以组为单位,3人一组进行组织,配备一位指导老师进行指导。课程设计时间共两周,从2011年12月1日开始到2011年12月23日结束。 三、设计内容 以Windows xp或Windows 7等为开发平台,以Visual C++或GCC/G++(IDE推荐MinGW Developer Studio)作为开发工具和开发环境,用纯C或C++编码,完成一个小型实用程序的设计、算法分析和编码、调试,程序采用控制台字符界面,数据采用文本文件存储,要求程序功能清晰、完善,能正常运行,有明确的输入输出,结果正确,用户界面友好;代码要求符合标准,排版清晰,风格良好。设计过程应该提供完善的设计文档,代码说明文档。根据学生的具体情况,每位学生从以下题目中任选一个,独立完成分析、设计和程序实现。 参考设计题目: 一、编写一个公司财务管理程序 1、内容 编写一个程序,对某个公司的财务进行管理,包含简单的财务数据录入,查询,输出等功能。 2、设计要求 1) 程序采用字符界面 2) 显示功能菜单,用户指定键即可进入相应功能 3) 财务记录保存于文本文件 4) 支持手动查询和报表输出,数据输出格式美观

计算机程序设计(C语言)课程设计报告

计算机程序设计(C语言) 课程设计报告 题目:电子动画时钟 学院:机电工程学院 专业: 班级:090109班 学号: : 指导教师: 设计日期:

一、概述 选题背景:随着社会的进步和科技的发展,电子钟表逐渐成为了人们生活中不可缺少的一部分。设计思路:(一)功能模块设计,1.电子时钟执行主流程2.电子时钟界面显示3.电子时钟按键控制模块4.时钟动画处理模块(二)数据结构设计 1.time结构体 2.全局变量(三)函数功能描述1.keyhandle()2.timeupchange()3.timedownchange()4.digitclock()5.drawcursor()6. clearcursor()7.void clockhandle()8.main()(四)程序实现(五)运行结果。 二、概要设计 2.1、数据结构 此程序中,使用了C语言的time结构体和几个全局变量,1.time结构体struct time { unsigned char ti_min; /*分钟*/ unsigned char ti_hour; /*小时*/ unsigned char ti_hund; /*百分之一秒*/ unsigned char ti_sec; /*秒*/ }; time结构体定义在dos.h文件中,可用来保存系统的当前时间,其中各字段的值的含义如下。 1.unsigned char ti_min:保存分钟值。

2.unsigned char ti_hour:保存小时。 3.unsigned char ti_hund:保存百分之一秒,例如,ti_hund=500,表示1/500秒。 4.unsigned char ti_sec:保存秒数。 2.2、全局变量 下面对程序用到的全局变量及数组进行说明. 1. double h,m,s: 此3个全局变量分别用来保存小时,分钟,秒数。 2. double x,x1,x2,y,y1,y2:保存数字时钟中小时,分,秒在屏幕中显示的坐标值。 3.struct time t[1]:定义一个time结构类型的数组,此数组只有t[0]一个元素。 2.3 模块列表 1.时钟动画处理模块 时钟动画处理模块主要由clockhandle()函数来实现,程序中旧时钟指针的擦除是借助setwritemode(mode)函数设置画线的方式来实现。如果mode=1,则表示画线时用现在特性的线所画之处原有的线性异或(XOR)操作,实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变时,进行两次画线操作相当于没有画线,即在当前位置处清除了原来的画线。 2.时钟按键控制模块 在电子时钟中,按键控制模块最主要的工作就是必须能读取用户按键,对按键值进行判断,并调用相应函数来执行相关操作。 3.

汇编语言程序设计(钱晓捷)课后答案

汇编语言程序设计(第二版) 钱晓捷习题答案 第二章(01) 2.1 (1)AX=1200h (2)AX=0100h (3)AX=4C2Ah (4)AX=3412h (5)AX=4C2Ah (6)AX=7856h (7)AX=65B7h 2.2(1) 两操作数类型不匹配 (2) IP指令指针禁止用户访问 (3) 立即数不允许传给段寄存器 (4) 段寄存器之间不允许传送 (5) 两操作数类型不匹配 (6) 目的操作数应为[ BP ] (7) 源操作数应为[BX+DI] (8) 立即数不能作目的操作数 2.3 lea bx,table ;获取table的首地址,BX=200H mov al,8 ;传送欲转换的数字,AL=8 xlat ;转换为格雷码,AL=12H 2.4 堆栈是一种按“先进后出”原则存取数据的存储区域。 堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。 2.5 mov ax,8057h push ax mov ax,0f79h push ax pop bx ;bx=0f79h pop [bx] ;DS:[0f79h]=8057h 2.6 AL=89h CF ZF SF OF PF AL=12h 1 0 0 1 1 AL=0afh 0 0 1 0 1 AL=0afh 1 0 1 0 1 AL=00h 0 1 0 0 1 AL=0ffh 0 0 1 0 1 AL=00h 0 1 0 0 1 2.7 W=X+Y+24-Z

2.8 (1)ADD DX,BX (2)ADD AL,[BX+SI] (3)ADD [BX+0B2H],CX (4)ADD WORD PTR [0520H],3412H (5)ADD AL,0A0H 2.9;为了避免与操作数地址混淆,将题中X,Y,Z,V 字操作数改为A,B,C,D mov ax,X ;ax=A imul Y ;dx,ax = A*B (将操作数看作符号数,以下同) mov cx,ax mov bx,dx ;bx,ax <-- dx,ax =A*B mov ax,Z ;ax = C cwd ;dx,ax =C (扩展符号后为双字) add cx,ax adc bx,dx ;bx,cx <-- bx,cx+dx,ax=A*B+C sub cx,540 sbb bx,0 ;bx,cx<-- A*B+C-540 mov ax, V ;ax= D cwd ;dx,ax= D (扩展符号后为双字) sub ax, cx sbb dx, bx ;dx,ax = dx,ax - bx,cx = D-(A*B+C-540) idiv X ;运算结果:[D-(A*B+C-540h)]/A ;ax存商,dx存余数 2.10;(1)xchg的操作数不能是立即数 (2不能对CS直接赋值 (3)两个操作数不能都是存储单元 (4)堆栈的操作数不能是字节量 (5)adc的操作数不能是段寄存器 (6)没有确定是字节还是字操作 (7)in不支持超过FFH的直接寻址 (8)out只能以AL/AX为源操作数 第二章(02) 2.11; 指令AX的值CF OF SF ZF PF Mov ax,1407h1470h----- And ax,ax1470h00000 Or ax,ax1470h00000 Xor ax,ax000011 Not ax0ffffh----- Test ax,0f0f0h0ffffh00101 注意: 1. mov, not指令不影响标志位 2. 其他逻辑指令使CF=OF=0, 根据结果影响其他标志位。

VB程序设计课程设计报告完整版

V B程序设计课程设计 报告 HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】

《VB程序设计》 课程设计报告(2016 — 2017 学年第 1 学期) 题目:排序演示 学院:经济与管理学院 班级:物流管理1502 学号: 姓名: 指导教师:阮冰 时间:起 2017年1月3日止 1月6日

一、课程设计基本信息 课程代码:05190124 课程名称:计算机基础课程设计 课程英文名称: Computer-based Course Design 课程所属单位(院(系)、教研室):数学与计算机学院计算机基础课程群 课程面向专业:生物科学类、制药工程、制药工程(生物制药)、药物制 剂、物流管理 课程类型:必修课 先修课程:大学计算机基础通识选修课程、Visual Basic程序设计课程学分:1 总学时:16 二、课程设计目标 掌握所学语言程序设计的方法,熟悉所学语言的开发环境及调试过程,熟悉所学语言中的数据类型,数据结构、语句结构、运算方法,巩固和加深对理论课中知识的理解,提高学生对所学知识的综合运用能力。通过综合设计要求达到下列基本技能: 1.培养查阅参考资料、手册的自学能力,通过独立思考深入钻研问题,学会自己分析、解决问题。 2.通过对所选题目方案分析比较,确立方案,编制与调试程序,初步掌握程序设计的方法,能熟练调试程序。 3.系统设计编程简练,可用,功能全面,并有一定的容错能力。用户界面良好,有较好的输出功能。在完成课题基本要求后,具有创新型设计,具有一定的实用价值。 4.根据个人的设计调试过程,撰写设计报告。 三、课程设计内容 利用已掌握的VB程序设计语言基础,以及面向对象的程序设计方法、事件驱动的编程方式,进行应用程序和系统的开发设计。在强化巩固已有编程知识基础之上,训练新的设计与编程思路,通过综合应用所学知识设计、编制、调试实用的Visual Basic程序。 四、课程设计要求 1.要求每个同学都要认真对待,积极参与。 2.课程设计结束时,提交完成的所有源程序、相关文件和可执行文件。同 时填写并完成《课程设计报告册》。 3.不符合要求的程序、设计报告、抄袭的设计报告或源程序代码、在设计 中完全未参与的将作不及格处理。 五、考核方式

汇编语言程序设计教程(第3版 卜艳萍)参考答案

汇编语言程序设计教程(第3版) 习题参考答案 第1章汇编语言基础知识 思考与练习 1.计算机系统分哪几个层次?简述计算机系统的硬件结构。 1)数字逻辑层 2) 微体系结构层 3) 指令系统层 4) 操作系统层 5) 汇编语言层 6) 高级语言层 7) 应用层 硬件系统是指构成计算机系统的物理实体或物理装置。它由控制器、运算器、存储器、输入设备和输出设备等部件构成。 2.简述用汇编语言进行程序设计的必要性。 1)程序要具有较快的执行时间,或者只能占用较小的存储容量。例如,操作系统的核 心程序段,实时控制系统的软件,智能仪器仪表的控制程序等。 2)程序与计算机硬件密切相关,程序要直接、有效地控制硬件。例如,I/O接口电路 的初始化程序段,外部设备的低层驱动程序等。 3)大型软件需要提高性能、优化处理的部分。例如计算机系统频繁调用的子程序、动 态连接库等。 4)没有合适的高级语言或只能采用汇编语言的时候。例如,开发最新的处理器程序时, 暂时没有支持新指令的编译程序。 5)汇编语言还有许多实际应用,例如分析具体系统尤其是该系统的低层软件、加密解 密软件、分析和防治计算机病毒等。 3.汉字编码主要分哪几类?每类的功能如何? 汉字编码主要分为四类:汉字输入码、汉字交换码、汉字机内码和汉字字形码。 1)为了能直接使用西文标准键盘进行输入,就必须为汉字设计相应的编码方法,即用 西文标准键盘上的字母数字串表示汉字的编码。目前,汉字输入编码方法主要有三 种:数字编码、拼音编码和字形编码。 2)汉字交换码:在不同汉字信息处理系统间进行汉字交换时所使用的编码,就是国标 码。无论采用哪种方法输入汉字,一旦输入到计算机中,必须采用统一的国标码标 识每个汉字。 3)汉字机内码是汉字在设备或信息处理系统内部最基本的表达形式,是在设备和信息 处理系统内部存储、处理、传输汉字用的编码。 4)字形编码也称为字模码,是用点阵表示的汉字字形代码,它是汉字的输出形式。4.计算机的字长是怎么定义的,试举例说明。 计算机能同时处理二进制信息的位宽定义为计算机的字长。如8086能同时进行16位二进制数据的运算、存储和传输等操作,该机器的字长为16位。 5.在汇编语言中,如何表示二进制、八进制、十进制和十六进制的数值? 用相应进制的数值加上进制标记即可。

Java程序设计语言课程标准

J a v a程序设计语言课程 标准 The latest revision on November 22, 2020

《J a v a程序设计语言》课程标准 一、适用对象 本课程标准适用于五年制高职高专计算机应用专业、网络应用专业使用。 二、课程性质 《Java程序设计语言》是五年制高职高专计算机应用专业、网络应用专业的一门专业课。本课程的主要任务是讲授Java概念、Java基本语法、面向对象的程序设计、异常处理和常用系统类、图形用户界面及图形处理、Java中的事件处理、多线程的处理、Java的输入与输出等知识,同时,通过编写综合性的项目,来加强学生综合运用Java语言进行程序设计能力的培养。由于Java语言采用面向对象的程序设计方法进行程序设计,因此,学生学习这门课之前应该在程序设计方面有一定基础。 三、参考课时 约160课时。 四、总学分 约10个学分。 五、课程目标 通过本课程的学习使学生掌握面向对象的基本概念和使用面向对象技术进行程序设计的基本思想;掌握面向对象编程工具JAVA语言的基本知识;能熟练地用JAVA语言进行一般面向对象的程序设计.为学生以后从事更专业化的软件开发工作奠定基础。 通过学习该课程学生可以具有以下能力: 1、理解面向对象编程思想。 2、熟悉掌握运用Java进行面向对象的编程。 3、能够使用Java编程语言进行基于文本和图形界面的应用设计。 4、理解和掌握多线程设计、事件处理、异常处理。 5、掌握Java的I/O编程。 6、掌握Java的网络编程。 六、设计思路

本套项目课程主要以教材为参考,融入了网络上经典的项目案例,同时借鉴了一些企业级项目模块的雏形,有利于学生的理解与学习。不失传统性,任何一门语言课程都要了解该语言的书写风格与运行的平台特点,但是在学习过程中,又主要通过项目实例让学生进一步学习基础知识同时也见到了项目雏形。通过前期近一百课时的学习,总体上掌握该门课程的特点与学习思路,然后利用较综合性项目培养学生对软件组织结构、思想、过程的设计。新课程理念要求充分的调动学生思考和动手能力,先学后教,精讲多练,因此学生实验课时约占到了总课时的三分之二。 七、内容纲要 项目一Java概述:最简单的Java程序,输出“Hello World!” (一)课程内容 1、Java的发展、特点与应用。 2、Java程序的类型及特点。 3、Java程序的开发步骤,命令的使用。 (二)学习的目的和要求 了解Java的发展、特点与应用,知道Java程序的类型及特点,掌握Java程序的开发步骤。 (三)知识点和考核要求 1、Java程序的结构。 2、Java程序的开发步骤, javac、java、appletviewer的使用。。 3、Java程序的运行流程。 项目二Java基本语法:训练实例 (一)课程内容 1、Java语言的基本组成。 2、Java语言中的数据类型、变量、运算符及表达式。 3、Java语言的控制结构。 4、Java语言的数组。 (二)学习的目的和要求

程序设计语言 课程设计题目(补充)

课程设计题目 题目七:销售管理系统 问题描述:设计一个日用商品销售管理系统,以小型超市商品销售为管理对象来设计系统。实现功能:根据销售信息(包含如下内容:商品编号、销售数量、销售单价、销售日期、销售人员;保存为磁盘文件),实现对商品日常信息的管理。 1、日用商品销售信息输入 运用人机对话方式实现商品的商品编号、销售数量、销售单价、销售日期、销售人员的信息录入,以文件的形式保存其信息 2、商品销售信息查询: a) 根据商品编号查询所售商品明细(数量,单价,金额) b) 根据销售日期查询当天所售商品明细(数量,单价,金额) c) 根据销售人员查询某营业员所售商品明细(数量,单价,金额) 3、商品销售信息统计 a) 日销售额统计(按商品编号,销售人员,全部商品)及总销售额统计 b) 月销售额(按商品编号,销售人员,全部商品)及总销售额统计 c) 月度销售排名(按商品编号,销售人员) 知识点:结构体类型变量的应用,文件操作,数据的查询,函数的应用 说明:以十组商品三个营业员构成二十组商品数据 题目八:职工工作量统计系统 问题描述:设计一个以班组职工日常工作量统计为对象的管理系统。 实现功能:根据组内职工日常工作信息(包含如下内容:职工编号,职工姓名,工作内容,完成数量,完成质量,完成日期;保存为磁盘文件),实现对职工日常工作量信息的管理。 1、职工日常工作量信息输入 运用对话方式分别输入职工编号,职工姓名,完成数量,完成质量(优、良、中),完成日期,对就多个完成质量的信息录入,以文件的形式保存其信息 2、职工日常工作量信息统计与输出 a) 以完成工作数量及完成质量进行工作量当日统计排序。名次相同,以完成数量多者优先,再次相同,以职工编号小者优先。 b) 以一个星期为一时间段按上述规则进行排序。 知识点:结构体类型变量的应用,文件操作,数据的查询与排序。 说明:以十人构成一个班组,每天大家都做同一工作来构成数据 题目九:通讯录管理系统 建立一通讯录,输入姓名、电话号码、住址等信息,然后对通信簿进行显示、查找、添加、修改及删除。 功能要求 (1) 通讯录的每一条信息包括姓名、单位、固定电话、移动手机、分类(如同事、朋友、同学、家人等)、EMAIL、QQ等。 (2) 输入功能:可以一次完成若干条信息的输入。 (3) 显示功能:完成全部通讯录信息的显示(一屏最多显示10条,超过十条应能够自动分

Java程序设计语言课程标准

《J a v a程序设计语言》课程标准 一、适用对象 本课程标准适用于五年制高职高专计算机应用专业、网络应用专业使用。 二、课程性质 《Java程序设计语言》是五年制高职高专计算机应用专业、网络应用专业的一门专业课。本课程的主要任务是讲授Java概念、Java基本语法、面向对象的程序设计、异常处理和常用系统类、图形用户界面及图形处理、Java中的事件处理、多线程的处理、Java的输入与输出等知识,同时,通过编写综合性的项目,来加强学生综合运用Java语言进行程序设计能力的培养。由于Java语言采用面向对象的程序设计方法进行程序设计,因此,学生学习这门课之前应该在程序设计方面有一定基础。 三、参考课时 约160课时。 四、总学分 约10个学分。 五、课程目标 通过本课程的学习使学生掌握面向对象的基本概念和使用面向对象技术进行程序设计的基本思想;掌握面向对象编程工具JAVA语言的基本知识;能熟练地用JAVA 语言进行一般面向对象的程序设计.??为学生以后从事更专业化的软件开发工作奠定基础。 通过学习该课程学生可以具有以下能力: 1、理解面向对象编程思想。 2、熟悉掌握运用Java进行面向对象的编程。 3、能够使用Java编程语言进行基于文本和图形界面的应用设计。 4、理解和掌握多线程设计、事件处理、异常处理。 5、掌握Java的I/O编程。 6、掌握Java的网络编程。 六、设计思路

本套项目课程主要以教材为参考,融入了网络上经典的项目案例,同时借鉴了一些企业级项目模块的雏形,有利于学生的理解与学习。不失传统性,任何一门语言课程都要了解该语言的书写风格与运行的平台特点,但是在学习过程中,又主要通过项目实例让学生进一步学习基础知识同时也见到了项目雏形。通过前期近一百课时的学习,总体上掌握该门课程的特点与学习思路,然后利用较综合性项目培养学生对软件组织结构、思想、过程的设计。新课程理念要求充分的调动学生思考和动手能力,先学后教,精讲多练,因此学生实验课时约占到了总课时的三分之二。 七、内容纲要 项目一Java概述:最简单的Java程序,输出“Hello World!” (一)课程内容 1、Java的发展、特点与应用。 2、Java程序的类型及特点。 3、Java程序的开发步骤,命令的使用。 (二)学习的目的和要求 了解Java的发展、特点与应用,知道Java程序的类型及特点,掌握Java程序的开发步骤。 (三)知识点和考核要求 1、Java程序的结构。 2、Java程序的开发步骤, javac、java、appletviewer的使用。。 3、Java程序的运行流程。 项目二Java基本语法:训练实例 (一)课程内容 1、Java语言的基本组成。

程序设计语言(VC++)课程设计(学生成绩管理系统)

1. 2. 3. 4.题目:学生成绩管理系统 5.基本要求 (1)要求用Visual C++语言来实现一个简单的学生成绩管理系统,该系统完成之后,基本上要能够无错运行,能达到学生成绩管理系统的基本要求。 (2)各个功能分别使用函数来完成,主函数和各个函数分别存放在不同的.CPP文件中,要求使用头文件。 (3)准备系统模拟的数据,不得少于10条。 (4)成绩管理程序至少应具备以下功能: 1)输入:学生的基本信息,包括学号.姓名.性别.籍贯. Visual C++成绩.英语成绩. 物理成绩等; 2)计算:每个学生的总成绩.平均成绩.所有学生单科的平均成绩,找出总成绩和单科成绩最高的学生并输出; 3)查询:可以按学号.姓名. Visual C++成绩查询 4)4)排序:可以按学号.姓名. Visual C++成绩. 英语成绩.物理成绩.总成绩.平均成绩等进行排序并输出; 5)删除:删除某条记录; 6)帮助和关于; 7)退出:退出整个系统的运行。 8)可以增加更多的菜单项,比如设置颜色.字体风格等。 程序如下: #include #include struct node{ int num; char name[10]; char sex[10]; char jiguan[10]; float Cscore; float Escore; float Pscore;

float sum; float average; node *next; }; node *create(){ node *head; node *p,*pend; int a; char b[10]; char c[10]; char f[10]; float d1,d2,d3; cout<<"请输入学号,姓名,性别,籍贯,C++成绩,英语成绩,物理成绩:"; cin>>a>>b>>c>>f>>d1>>d2>>d3; head=0; int i=0; while(i<2){ p=new node; p->num=a; strcpy(p->name,b); strcpy(p->sex,c);

相关主题
文本预览
相关文档 最新文档