文档视界 最新最全的文档下载
当前位置:文档视界 › oracle-database-11g-plsql-编程实战笔记

oracle-database-11g-plsql-编程实战笔记

oracle-database-11g-plsql-编程实战笔记
oracle-database-11g-plsql-编程实战笔记

Chap1

DML语句是select 、insert、update、delete和merge

DDL语句是create、alter、drop、rename、truncate、comment

DCL语句是grant、revoke

TCL语句是commit、rollback和savepoint

sql16个基本命令——参考书《OCA认证考试指南(IZ0-051)》清华大学出版社

《oracle database sql language reference 11g》有非遵循格式字符串依赖于格式掩码

chap2

2.1.3 关于语句中有多个单引号时处理:

1、

select'It''s a bird,no plan can''t be 'as pharse

from dual; 此处两个单引号即为一个单引号

2、只能用q 再加’(语句)’

select q'(It's a bird,no plan can't be)'as pharse

from dual;

均输出

PHARSE

----------------------------

It's a bird,no plan can't be

2.1.4

定义变量与申明变量的区别:

定义变量即为变量分配名称并指定数据类型;申明变量首先需要定义变量,然后为其赋值。(赋值也称为初始化)

替代变量前面要加&前缀且若替代变量为字符型时要加两个单引号如’&a’

declare

lv_whom varchar2(20);/*lv-whom为申明变量,a为替代变量,a没有变量类型*/

begin

lv_whom := '&a';

end;

或者

declare

lv_whom varchar2(20);

begin

lv_whom := &a;

end;但是要在输入框中字符加两个单引号

替代变量用define申明,且定义时不可以指定类型,默认为char型

①Define x=emp;

Select * from &x; /*调用要用&,此处不加单引号,解析后即为emp表*/

② define x=adasd;

select'&x' z from dual;/*此处解析后变为select' adasd ' z from dual ,此处必须要有单引号,使adasd作为直接变量,否则出错*/

所以替代变量是否加单引号要根据解析的值来确定

注意:避免在声明块中将任何实参赋给局部变量(constant变量除外),且替代变量与绑定变量都不应该在声明块中赋值

定义为constant的变量,必须在申明块中申明,这意味着常量必须先定义,再给他赋一个不变的值

绑定变量(bind)用var或variable申明

使用冒号(:)作为前缀

var a number

begin

:a := 22;

end;

上面也可以输出结果,下面也可以输出结果,但二者不能同时放一块

print a; /*此处a前面不能加冒号,print可用来输出所有类型的变量*/

另外也可通过exec直接给绑定变量赋值:

SQL> var x number /*必须要先定义再赋值,而替代变量定义时不需指定类型,直接赋值即可*/

SQL> var y number

SQL> exec :x :=1;:y :=2;/*exec 等价于begin … end*/

PL/SQL procedure successfully completed

x

---------

1

y

---------

2

也可以先定义好绑定变量,再将其赋给其他变量:

var a number

begin

:a := 22;

end;

现将其运行再

declare

lv_a number;

begin

lv_a:= :a;

dbms_output.put_line('hello,'||lv_a||'.');

end;

结果:hello,22.

将上面的代码放入到d:\q.sql中用@d:\q.sql;调用即可,但是里面的代码要正确

2.1.5命名块

1、过程块

create or replace procedure abc (aa varchar2) is

begin

dbms_output.put_line('sdhl'||aa);

end;

exec abc('dkjdhhdj');

可能出现

错误一:【ORA-00955: 名称已由现有对象使用】

这个错误说的不仅仅是有可能你有存储过程使用了【abc】,还有可能是你有表名叫【abc】或者其他oracle对象叫【abc】。

说明:其实由于你已经使用了【create or repalace procedure】即使有存储过程叫【abc】也会被覆盖掉,你用下面的命令查询一下,有什么对象叫【abc】,删掉它或者换一个存储过程名字。

【SELECT OBJECT_NAME,OBJECT_TYPE FROM USER_OBJECTS WHERE OBJECT_NAME='STUDENT2';】

错误二:过程中的参数不能指定具体长度

2、函数块

错误一:函数里面要有return,不是dbms_output.put_line(但实验之后二者均可以成功创建函数,但是调用时只有return的能没有错误的执行)

create or replace function abc (aa varchar2)

return varchar2is

begin

dbms_output.put_line('sdhl'||aa);

end;

改为

create or replace function abc(aa varchar2) return varchar2is

begin

return'sdhl' || aa;

end;

但函数不能像过程一样来执行,因为execute命令不允许管理函数返回值。必须要用call或begin dbms... end命令将返回值放入一个绑定变量(要先定义)中,在输出。(必须要先执行函数,在执行下面

语句,不能一起运行)

variable result varchar2(20);

call abc('akdhak') into :result; --call后面只能用绑定变量?

或者:

SQL> begin

2 dbms_output.put_line(abc('du'));

3 end;

4 /

sdhldu

此处若用print则绑定变量不能加冒号

只能为print result;

但可以查询select :result from dual;

(exec是sqlplus的命令,只能在sqlplus中使用。

call是sql命令,任何工具都可以使用)

2.1.6嵌套块

命名块还可以嵌套在其他命名块或匿名块中,但嵌套命名块并不是已经发布的,这意味着在调用一个命名块时,被调用的命名块可能还没有定义

declare

procedure a is

begin

dbms_output.put_line(b||'hello!'); /*此处b为被调用函数,但之前没有被解析,所以运行会出错*/

end a;

function b return varchar2is

begin

return'hello!';

end b;

begin

a;

end;

注:所有匿名块都会在程序都会在实际执行前进行分析,分析是一个编译过程。分析过程将会识别标识符(保留字)、预定义标识符、引用标识符、用户定义变量、子例程或UDT。命名块也是标识符,PL/SQL按照自顶向下的次序,将标识符读取到内存中。上例中函数b因为在过程a 的下面还没被解析,所以会出错。

使用“前向引用”可以修正这个问题,函数或过程的前向引用只需要函数或过程的署名,不需要同时包括署名和实现,这些署名在PL/SQL中叫做“占位程序(stub)”。占位程序允许编译过程在实现命名块之前接受其标识符名称。

更正:

declare

procedure a;

function b return varchar2;

procedure a is

begin

dbms_output.put_line(b||'hello!');

end a;

function b return varchar2is

begin

return'hello!';

end b;

begin

a;

end;

2.2 变量:类型、赋值和运算符

2.2.1文本数据类型

用伪列来隐式地定义数据类型。伪列如%type

Char(20)为一个定长的类型,不管其中变量的长度有没有达到20,最后显示长度均为20字符Varchar2(20)则要根据实际情况来确定其长度

Clob(character large object 字符大对象)同varchar2

2.2.2日期和时间戳类型

1、日期

有两种字符串字面值赋值支持到date类型的隐式转换

Lv_date date := ’22-mon-75’;

或者Lv_date date := ’22-mon-1975’;

除了上面两种,任何其他字符串字面值都要求使用to_date内置SQL函数来覆盖格式掩码

如lv_date_1 date := to_date(‘19750430’,’YYYYMMDD’);

2、间隔

间隔子类型允许将天的间隔表示秒,将年的间隔表示月份数

Interval day to second 数据类型的默认值在两个date相减时能起作用,只要在执行减法之前将其转化为timestamp,因为to_timestamp函数保留了date的精度,而该精度低于timestamp

将天的间隔转换为秒的数据类型为interval day/day(4或其他数) to second

declare

lv_interval interval day to second;

lv_end_day date :=sysdate; ---sysdate与date对应

lv_start_day date := '18-4月-2012';

begin

lv_interval := to_timestamp(lv_end_day)-to_timestamp(lv_start_day); dbms_output.put_line(lv_interval);

end;

结果

-20 14:56:54.000000

PL/SQL procedure successfully completed

Date数据类型默认支持2位数字表示的天,timestamp的精度要求使用9位数字表示的天

或者

declare

lv_interval interval day(9) to second;

lv_end_day timestamp := systimestamp; ---systimestamp与timestamp对应

lv_start_day timestamp := '18-4月-2012';

begin

lv_interval := lv_end_day-lv_start_day;

dbms_output.put_line(lv_interval);

end;

结果

-000002943 02:52:41.860000

PL/SQL procedure successfully completed

将年的间隔转化为月份数的数据类型为interval year to month

从一个日期中提取年

用 to_char(extract(year from lv_end_day))

完整代码:

declare

lv_a date := '20-4月-2009';

a varchar2(12);

begin

a := to_char(extract(year from lv_a));

dbms_output.put_line(a);

end;

结果为:

2009

3、时间戳(timestamp)

Timestamp数据类型精度要比date数据类型精度高

2.2.3 数值类型

可以将number数据类型隐性转化为intger类型,可能会丢失一些小数点

Binary_float 32位浮点数

Binary_double 是一个64位浮点数

2.2.4复合变量类型

SQL UDT用于保存一个数据结构

2.3控制结构

1、If语句,if elsif else

2、case语句分为简单的case语句case … when … then …else … end case (break 隐式存在)与搜索型的case语句case when … then … else … end case

简单case语句可使用char、nchar、varchar2数据类型,而搜索case语句可以使用任意布尔表达式,搜索case语句不局限于等值匹配

2.3.3、循环结构

Loop循环

退出要借助exit或exit when语句

For loop循环:分为范围循环和游标循环

插入:关于游标(见E:\sas\sql\各类知识要点\游标)

A、范围循环即for i in 1..4 loop

B、游标循环 1、隐式 for i in (select 语句)loop

2、显式 for i in cur_v(游标)loop

其中第2种要比第一种要有更好的可读性(以后用这种)

C、where current of 字句

while循环

while (...)loop

内可含continue/goto语句

Simple 循环语句

即利用隐式游标属性来进行循环判断如if SQL%FOUND then ...else ...end if ;

2.4批量操作(见E:\sas\sql\各类知识要点\游标)

批量处理是进行成批处理和大批量处理的默认选择

本章小结:

1、始终在执行块中进行赋值或初始化。除非局部变量被视为常量

2、在实现任何局部块命名之前,始终未其定义前向引用规范,从而确保这些局部命名块能够互相调用

3、应尽可能使用表集合。避免用varray,因为前者不受固定大小的限制。Varray通常需要更改大小限制,这将花费时间和金钱

4、显式游标应尽可能使用形参

5、应尽可能使用SQL数据类型作为函数的返回值。SQL数据类型不需要编写管道化表函数对其

进行封装就可以在SQL中使用,并且数据类型总是可检测的,因为它是目录中的一个命名集合或结构

本章的问题

1、在程序块中至少包括一个null语句,否则会编译错误

2、PL/SQL中必须定义一个record结构,因为该结构是仅适用于PL/SQL环境的变量

3、for循环必须知道其范围ide上界,而游标集返回的行数设置了游标for循环的上边界

4、可以使用bulk collect into 语句讲一个完整游标或游标的某些行选择到一个记录结构集合中。可以使用limit关键字来限制行集

5、在循环内部可以使用forall语句,但该语句没有结束块语句,所以需要end forall或end loop或end forall loop语句来结束forall语句。

Chap3事物作用域

3.1数据库ACID测试

Atomicity 原子性、consistency一致性、isolation隔离性、durability持久性

3.2多版本并发控制

MVCC(multiversioned concurrency control)使用数据库快照为用户提供数据库的永久内存副本

3.3

3.3.1保存点、提交和事务回滚

若有2个保存点,且回滚到了第一个保存点,则第二个保存点就不存在了

3.3.2提交

注意:

A、数据字典作强制隐式的提交

B、Commit命令中的注释将写入到dba_pc2_pending字典视图中

C、必须具有force transaction 或 force any transaction 系统权限才能强制提交

D、Nowait选项不会验证对重做和归档日志文件的写入

E、Work选项将会在所有commit语句中有效

例1、标准commit

UPDATE hr.employees

SET salary = salary * 1.03

WHERE department_id in ( 20, 30, 40 );

Commit

或将commit改为 COMMIT WORK WRITE IMMEDIATE WAIT;

例2、含有nowait和batch选项的commit

使用nowait选项将不会验证对重做和归档日志的写入

避免重写oracle的提交等待过程。这样做可能会使自己的事物陷入危险

例3、强制commit语句并写入注释

INSERT

INTO hr.job_history

VALUES ( 100, '01-Jan-2000', trunc( sysdate ), 'AD_PRES', 90 ); COMMIT

COMMENT 'In-doubt transaction forced by process xyz on date 123';

Commit force ‘2.33.192’;

发出commit force需要一个具有dba权限的账户。单引号(’)内的信息代表可疑的事物id。

3.4DML锁定和隔离控制

为了防止不可重复读取或影子读取

a、设置事物级别为读取一致(在跟踪分布式事物时,设置事物语

句命名将会非常有益)

set transaction name 可更好地监控长时间的事务。

SET TRANSACTION READ ONLY NAME 'Distributed to NYC';

--添加到该设置事物语句的’distributed to NYC’注释将会保存在dba_pc2_pending字

典视图中

(https://www.docsj.com/doc/363696433.html,/dept/itss/docs/oracle/10g/server.101/b10759

/statements_10005.htm)

SELECT product_id

, warehouse_id

, quantity_on_hand

FROM oe.inventories@nyc_001

WHERE product_id = 3246;

COMMIT;

b、锁定

用户具有锁定自己所拥有的全部表的权限,如果想要锁定另一个模式中的表,则必须具有lock any table系统权限

B.1在游标内使用for update

DECLARE

CURSOR c_employees IS

SELECT *

FROM hr.employees

FOR UPDATE WAIT 10;--该行锁定c_employees游标中所引用的行。其中wait 10表示,若游标所引用的行已经存在锁定,则等待10秒,若前一次锁定持续时间大于10秒,则此次更新将会被取消,也可以用nowait关键字,表示存在锁定的情况下立即返回事物

BEGIN

FOR r_employees IN c_employees LOOP

UPDATE hr.employees

SET salary = salary * 1.025

WHERE CURRENT OF C_employees;--该语句引用游标中的最新行,最后锁定会一直持续,直至发出commit或rollback命令

END LOOP;

END;

B.2发起lock table语句

LOCK TABLE hr.employees IN EXCLUSIVE MODE NOWAIT;

UPDATE hr.employees

SET salary = salary * 1.025

WHERE department_id = 10;

COMMIT;

与for update语句不同,lock table命令将会锁定表中的每一行。此外,短语in exclusive mode 将会锁定除select语句之外的全部操作

有效的锁定模式有:①row exclusive模式,限制最少的锁定级别,允许行共享,并防止用户锁定整个表或锁定到row share模式

②row share模式,除了没有独占共享的限制之外,该模式等同于row exclusive

③share模式,允许select但是不允许其他更新

④share row exclusive 模式,等同于share模式,但是同时禁止用户锁定到share模式

⑤exclusive模式限制最多的级别,阻止除select之外的所有DML操作

C、改善事物性能

利用批量DML操作的功能

3.5调用者和定义者权限

以程序所有者的身份来保留程序执行的全部权限:在命名程序头使用authid definer 关键字

例1发出定义者权限

CREATE OR REPLACE FUNCTION hr.quarterly_sales

( pi_employee_id in number

, pi_quarter in date

)

AUTHID DEFINER

AS

... declarative code goes here ...

BEGIN

... do something here and return ...

EXCEPTION

... handle the exception here and return ...

END;

例2.发出调用者权限

以程序调用者的身份来调用程序,用关键字authid current_user

CREATE OR REPLACE FUNCTION hr.give_raise

( pi_employee_id in number )

AUTHID CURRENT_USER

AS

... declarative code goes here ...

BEGIN

... do something here and return ...

EXCEPTION

... handle the exception here and return ...

END;

本章小结

1、确保自己有一个良好的备份。仅仅激活像rman这样的备份程序是不够的

2、使用简洁而有意义的名称来命名保存点

3、强制可疑事务要求深入了解oracle系统更改号(system change number,SCN)和数据字典。只有当事务无法再次尝试时才使用commit force 命令

4、使用set transaction name 参数对分布式事务命名

测验小结

1、原子性意味着一个事务全部写入到永久存储中或任何部分都没有写入到永久存储中

2、一致性意味着一个并发多用户系统中为所有事务分配相同的服务cpu时间量和内存

3、隔离性意味着一个事务的任何部分在事务完成并提交之前都不可见

4、持久性意味着事务在完成之后写入到冗余磁盘阵列

5、Undo_retention 参数(还不是很熟悉),设置语句在内存中运行的时间长度

Chap4 错误管理

数据库强化的两种方法是使用DBMS_ASSERT包和绑定变量。DBMS_ASSERT包

用于验证输入参数的形式是否正确,以及模式和对象名称是否实际存在。绑定变

量防止匿名PL/SQL块的嵌套

4.1错误类型

4.1.1编译时错误(即语法上有错误)

很多程序员基于编写较大的代码块,而不愿意停下来执行临时编译。

一次性调试很多错误可能会花费大量时间查看不重要的信息,尤其当错误栈中打印出许多不必要的信息时。一种更高效的编程方法是按逻辑分组来编写每个程序块,在函数单元完成后执行编译。例:循环式编码方法可以避免不必要的调试

4.1.2语义错误

语义错误只在程序内部发生的逻辑错误。如加减乘除的错误

1、Oracle提供的错误条件

Oracle提供了超过2300页的预定义错误条件,程序员可以参考他们来编写或直接调用

2、Oracle sqlcode和sqlerrm

SQLERRM是系统内置变量保存了当前错误的详细信息。Oracle databases error messages 11g guide中

的每个错误都有唯一的代号和消息。与错误条件相关联的数字值称为

sqlcode。可以使用pragma exception_init关键字将变量与sqlcode代号关联。当希望在发生oracle错误的情况下执行特定任务时,该功能特别有

用。

例:用pragma exception_init捕获系统错误

CREATE TABLE hr.emergency_contact

( employee_id NUMBER

, full_name VARCHAR2(50)

, phone_home VARCHAR2(15)

, phone_cell VARCHAR2(15)

, phone_pager VARCHAR2(15)

);

ALTER TABLE emergency_contact

ADD ( CONSTRAINT ec_employee_id_unk

UNIQUE ( employee_id, full_name ));

BEGIN

FOR i IN1 .. 2LOOP --此处因为循环两次,导致插入的数据一样,所以会导致违反unique约束--

INSERT

INTO emergency_contact

VALUES ( 1

, 'Jane Doe'

, '+1.123.456.7890'

, NULL

, '+1.123.567.8901'

);

END LOOP;

END;

输出

ORA-00001: 违反唯一约束条件 (SCOTT.EC_EMPLOYEE_ID_UNK) ORA-06512: 在 line 4

用pragma exception_init来捕获

(为什么要捕获错误,因为发现错误时oracle则不执行其他代码了,为了对其执行额外的任务,则就需要进行捕获错误,此处当程序

遇到ORA-00001错误时,运行执行dbms,而不会立即中断程序)

declare

unique_constraint exception;

pragma exception_init (unique_constraint,-00001);

BEGIN

FOR i IN1 .. 2LOOP

INSERT

INTO emergency_contact

VALUES ( 1

, 'Jane Doe'

, '+1.123.456.7890'

, NULL

, '+1.123.567.8901'

);

END LOOP;

exception

when unique_constraint then

dbms_output.put_line('o,you throw the unique_constraint error'); END;

输出

o,you throw the unique_constraint error

PL/SQL procedure successfully completed

3、异常作用域

Pl/sql块的连续性通过在匿名子块中封装可能的错误代码来维护。

封装技术有:标准子块封装、循环子块封装、保存点重定向、goto 跳转

例1、封装子块

DECLARE

ln_parent NUMBER;

ln_child_level1 NUMBER;

ln_child_level2 NUMBER;

ln_random_0_1 NUMBER;

BEGIN

BEGIN

DBMS_OUTPUT.PUT_LINE ( 'Made it past Parent.' );

ln_random_0_1 := ROUND ( DBMS_RANDOM.VALUE ( 0, 1 ));

ln_parent := 1 / ln_random_0_1;

BEGIN

DBMS_OUTPUT.PUT_LINE ( 'Made it past Child Level 1.' );

ln_random_0_1 := ROUND ( DBMS_RANDOM.VALUE ( 0, 1 ));

ln_child_level1 := 1 / ln_random_0_1;

BEGIN

DBMS_OUTPUT.PUT_LINE ( 'Made it past Child Level 2.' ); ln_random_0_1 := ROUND ( DBMS_RANDOM.VALUE ( 0, 1 ));

ln_child_level2 := 1 / ln_random_0_1;

END;

END;

END;

EXCEPTION

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE ( SQLERRM );

END;

例2、在循环内封装

DECLARE

ln_employee_id NUMBER;

ln_order_total NUMBER;

CURSOR c_employee IS

SELECT *

FROM hr.employees;

BEGIN

FOR r_employee IN c_employee LOOP

ln_employee_id := r_employee.employee_id;

DECLARE

no_salesman_found exception;

BEGIN

SELECT SUM ( order_total )

INTO ln_order_total

FROM oe.orders

WHERE sales_rep_id = ln_employee_id;

IF ln_order_total IS NOT NULL THEN

DBMS_OUTPUT.PUT_LINE ( ln_order_total );

ELSE

RAISE no_salesman_found;

END IF;

EXCEPTION

WHEN no_salesman_found THEN

DBMS_OUTPUT.PUT_LINE ( 'Caught NO_SALESMAN_FOUND' );

END;

END LOOP;

EXCEPTION

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE ( SQLERRM );

END;

例3、保存点异常重试

4、定义自定义错误条件

为了定义自己的错误条件,首先必须创建一个异常变量。最后在代码的异常块内必须说明这个错误的处理方法

例:

DECLARE

ln_order_total number;

ln_promotion_id number := 1;

ln_order_count number;

no_promo_found exception;

BEGIN

SELECT COUNT(*)

INTO ln_order_count

FROM oe.orders

WHERE promotion_id = ln_promotion_id;

IF ln_order_count > 0THEN

SELECT SUM ( order_total )

INTO ln_order_total

FROM oe.orders

WHERE promotion_id = ln_promotion_id;

ELSE

raise no_promo_found;

END IF;

EXCEPTION

WHEN no_promo_found THEN

DBMS_OUTPUT.PUT_LINE ( 'No Sales found for Promotion:

'||ln_promotion_id);

END;

开发人员总是使用这个逻辑,问题在于oracle已经使用

no_data_found条件处理这种情况。下面对其精简:

DECLARE

ln_order_total number;

ln_promotion_id number := 1;

BEGIN

SELECT order_total

INTO ln_order_total

FROM oe.orders

WHERE promotion_id = ln_promotion_id;

IF ln_order_count > 0THEN

SELECT SUM ( order_total )

INTO ln_order_total

FROM oe.orders

WHERE promotion_id = ln_promotion_id;

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE ('No Sales found for Promotion:

'||ln_promotion_id);

END;

注:掌握并适当利用内置错误,以简化自己的代码

Raise_application_error 过程是DBMS_STANDARD内置包的组成成分,该过程允许生成ORA-相关信息,而不需要首先声明异常变量或使用exception_init指令(可以简化代码)

例使用Raise_application_error捕获错误条件

DECLARE

CURSOR c_rental IS

SELECT c.member_id

, c.first_name||' '||https://www.docsj.com/doc/363696433.html,st_name full_name

, t.transaction_amount

FROM video_store.transaction t

, video_store.rental r

, video_store.contact c

WHERE r.rental_id = t.rental_id

AND r.customer_id = c.contact_id;

BEGIN

FOR r_rental IN c_rental LOOP

IF r_rental.transaction_amount > 75 THEN

RAISE_APPLICATION_ERROR ( -20001, 'No transaction may be more than $75', TRUE );

END IF;

END LOOP;

END;

注:上述程序并未创建异常变量。此外,将用户定义20001 SQLCODE与错误消息关联。其中的true参数通知过程在错误栈中包含该错误。第三个参数的默认值是false,通知

RAISE_APPLICATION_ERROR过程清除错误栈,并只打印错误消息。

4.2 PL/SQL工具

用户编写的许多PL/SQL应用程序将需要花费一定的时间来执行,一种最常见但却存在问题的技术是在提交时使用时间戳。更新的时间戳列标记哪些行已经被程序修改。然而问题在于,提交本身基于需呀耗费不少时间,将其放在应用程序的中间会引发如下问题:

减慢应用程序

导致oracle服务器上的内存和cpu占用率突然增高

生成大量的重做日志信息

我们需要的是一种记录程序活动而不需要额外消耗太多系统资源的方法。这种输出也称为程序工具(利用内置程序结合实际需要写的代码)

本章小结:

1、如果PL/SQL程序在创建时没有进行适当的错误处理和工具化,则开发人员

需要花很多时间来维护并反复检查程序结果。通过工具化代码并提供适当的错误管理结果,将会节省大量的维护和排错时间。

2、运行错误消息回传到其主调用应用程序,而不要使用when others短语

3、使用保存点回滚部分完成的事务,可以编码产生孤立数据,从而维护数据完整性。

4、避免使用goto语句

5、掌握并适当采用内置错误,以简化自己的代码

6、尽可能工具化自己的pl/sql程序

测验小结:

1、DBMS_ASSET包允许验证输入参数来过滤传入的web参数

2、PLS-错误是PL-SQl错误

3、ORA-错误与常规数据库错误和SQL有关

4、RAISE_APPLICATION_ERROR允许引发一个自定义异常,但是不等价于RAISE

语句。RAISE语句允许调用申明块中预定义的EXCEPTION变量

5、pragma exception_init允许将一个默认错误号映射到用户定义

变量,然后可以使用RAISE语句引发该错误。

6、SQLCODE对于PL/SQL块中引入的错误返回错误代码号

7、使用在-20000和-20999范围之间的错误号才能引发

RAISE_APPLICATION_ERROR调用

Chap5 函数

5.1函数构架

5.1.1传值函数

传值函数在调用时接受值,在完成时返回单个值。形参只有in 模式

5.1.2传址函数

在调用传址函数时,至少发送一个或多个局部变量引用作为实参。形参有三种可能模式(in、in out、out)

传址函数并不像传值函数那样将形参全部消耗,虽然in模式参数被消耗,但in out模式变量通常会在更改状态后返回

5.1.3函数模型选择

当希望消耗输入并产生某种结果时,应该将函数实现为传值函数

当需要验证客户端或web交互程序的完成情况或返回结果时,应该使用传址模式。

5.1.5调用参数说明

create or replace function three(a number :=0,b number :=0,c number := 1) return number is

begin

return (a-b)/c;

end;

①位置参数说明

实际调用参数依次映射到形参,但是必须为列表中的每个形参

提供实参或调用值,当希望跳过某个形参时,可以赋值为null begin

dbms_output.put_line(three(3,4,5));

end;

结果为-.2

PL/SQL procedure successfully completed

②命名参数说明

实际调用参数不需要映射到形参序列

begin

dbms_output.put_line(three(c =>4,b =>3,a => 5));

end;

③混合参数说明

位置参数必须位于命名参数之前。且在第一个位置参数之后,

只能省略可选参数。

begin

dbms_output.put_line(three(8,c =>4));

end;

第一个参数是形参a,所以结果是8减去0并除以4

结果:2

PL/SQL procedure successfully completed

5.2函数开发

限制:PL/SQL函数不能包含“数据操作语言”(DML)语言,

程序设计报告模板

北京化工大学计算机科学与技术专业2014程序设计实训报告 题目:个人记账软件 专业:计算机科学与技术 班级:计科1305 指导教师:江志英

2014程序设计实训任务书

目录 2014程序设计实训任务书...................................... 错误!未定义书签。目录..................................................... 错误!未定义书签。第一章需求分析.............................................. 错误!未定义书签。 引言............................................... 错误!未定义书签。 任务概述........................................... 错误!未定义书签。 数据描述........................................... 错误!未定义书签。 功能需求........................................... 错误!未定义书签。 运行需求........................................... 错误!未定义书签。 任务计划........................................... 错误!未定义书签。第二章概要设计.............................................. 错误!未定义书签。 总体设计........................................... 错误!未定义书签。 面向对象设计....................................... 错误!未定义书签。 运行界面设计....................................... 错误!未定义书签。第三章详细设计.............................................. 错误!未定义书签。 ........................................................ 错误!未定义书签。第四章测试分析............................................. 错误!未定义书签。第五章用户手册(可选)..................................... 错误!未定义书签。第六章课程设计总结.......................................... 错误!未定义书签。附录:程序代码(仅电子版需要、纸质版不需要)................. 错误!未定义书签。

计算机程序设计实践

江苏科技大学 课程实践报告 设计题目: 计算机程序设计实践(VC++) 设计时间: 2015. 3.9 至2015. 3.16 学院: 数理学院 专业班级: 13级信息与计算科学1班 学生姓名: 陈明敏学号1340501101 指导老师: 华伟 2015年5月1日

一、 实践任务 任务一:试建立一个类SP ,求(,)123k k k k f n k n =++++ ,另有辅助函数power ()用 于求 n m 。具体要求如下。 (1)私有数据成员。 Int n ,k :存放公式中n 和k 的值。 (2)公有成员函数。 ①SP(int n1,int k1):构造函数,初始化成员数据n 和k 。 ②int power(int m,int n):求n m 。 ③int fun():求公式的累加和。 ④void show():输出求得的结果。 二、源程序清单 #include class SP{ private: int n,k; public: SP(int n1,int k1); int power(int m,int n); int fun(); void show (); }; SP::SP(int n1,int k1){ n=n1; k=k1; } int SP::power(int m,int n){ int a=m; for(int i=1;i

计算机程序设计(C)综合实践

计算机程序设计(C)综合 实践 设计报告 学院:电子通信与物理学院 设计名称:职工信息管理系统 专业班级:电子信息科学与技术14-2 学生:本良 学号: 201401100211 组号: 140203 指导教师:宋戈 完成时间: 2015年 7月23日

目录 第1部分实训题目与要求 (2) 1. 问题提出 (2) 2. 功能要求 (2) 3. 任务分工 (2) 第2部分设计实训题目功能......................................................................... . (3) 1. 总体设 计...................................................................... (3) 2. 数据结 构...................................................................... (4) 3. 程序设 计...................................................................... (5) 4. 测试与调 试......................................................................

(8) 第3部分实训总结......................................................................... . (12) 1. 个人总 结...................................................................... (12) 2. 结束 语...................................................................... (12) 第4部分参考文献......................................................................... . (13) 《C程序设计综合实践》评分表......................................................................... (14)

测绘程序设计实习报告

测量程序设计实习报告 姓名: XX 班级: XXXX 学号: XXXX 教师评语:

实验名称:使用C#开发环境建立测量程序框架 一、实验的目的与任务: (1)学会用C#窗体程序开发环境建立应用程序框架方法 (2)学会使用常见的Windows控件 (3)根据自身需要设计一个测量程序界面 二、实验的过程与步骤: 1、首先打开visual studio 2010,选择文件→新建→项目。在弹出的对话框中右栏一侧选择windows窗体应用。选择文件存放地址,输入项目名称,点击确定,完成。 2、拖动menuSctrip控件到主窗体,并且键入“文件”、“工具”两个选项,在“文件”下添加一个“打开”选项;在“工具”下添加“近似平差计算”、“高斯消元”两个选项。 3、选择项目→添加windows窗体,输入窗体名称“CLSJ”,点击确定。

4、在CLSJ窗体中拖入SplitContainer控件,将窗体分为左右两部分,调整大小。在拖入一个“TabControl”,新建选项卡。最后,加入“Button”、“TextBox”、“Label”控件。 5、用相同的方法,新建一个名为高斯消元的窗体,然后按照需要进行设计。 三、程序运行效果 四、本实验心得体会

这是第一次接触这种可视化开发编程,刚开始不是很熟悉,对于编程语言来说,在掌握一定语法之后,要多用,多结合实际进行一些简单编程,这样才能提高对一种编程语言的理解。 实验名称:导线计算程序设计及粗差探测 一、实验的目的与任务: (1) 掌握方位角计算的程序设计方法 (2) 掌握符合导线、闭合导线、支导线计算的程序设计方法 (3) 理解粗差探测的程序设计方法 二、实验的设计与开发步骤: 1、考虑到在测量时所用的角度均为度分秒,而在c#计算时只是别度分秒,因此先设计两个函数,可以将度分秒和弧度制进行转化。 2、其次先写一个point 类,包含x ,y 两个成员变量,然后在设计一个方位角函数,用两个point 类当作形参传递进去,根据方位角计算公式παk x y +??=arctan ,(根据象限角和方位角关系对k 进行调节)应该分为四种情况,但是考虑到分母不为0,因此应该在加一种情况,即导线与y 轴重合。 3、然后根据边长,根据方位角,公式 ααsin *cos *1212l y y l x x +=+=进行坐标推算。

Java程序设计-实验报告1-模板 (1)

实验报告 课程名称Java程序设计 实验项目实验一类和对象 系别_________计算机_________ 专业/班级_______计算机类/1402______ 姓名_____李馨雪________ 实验日期______2015.10.10______ 成绩_______________________ 指导教师

一、实验题目:实验一类和对象 二、实验内容: (1)用类描述计算机中CPU的速度和硬盘的容量。要求Java应用程序有4个类,名字分别是PC、CPU、HardDisk和Test,其中Test是主类。 1)PC类与CPU类和HardDisk类关联的UML图如图所示。 其中,CPU类要求getSpeed()返回speed的值,setSpeed(int m)方法 将参数m的值赋值给speed。 HardDisk类要求getAmount()返回amount的值,setAmount(int m)方 法将参数m的值赋值给amount。 PC类要求setCPU(CPU c)将参数c的值赋值给cpu,要求setHardDisk (HardDisk h)方法将参数h的值赋值给HD,要求show()方法能显示 cpu的速度和硬盘的容量。 2)主类Test的要求 main()方法中创建一个CPU对象cpu,其speed设置为2200; main()方法中创建一个HardDisk对象disk,其amount设置为200; main()方法中创建一个PC对象pc, pc调用setCPU方法,实参是cpu;调用setHardDisk方法,实参是 disk;调用show方法。 (2)设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声,要求如下: 1)编写接口Animal,有2个抽象方法cry()和getAnimaName(); 2)编写模拟器类Simulator,该类有一个playSound(Animal animal)方法,其形参是Animal类型,可以调用实现Animal接口的类所重写的cry()方法播放具体动物的声音,调用重写方法显示动物种类的名称; 3)编写实现Animal接口的Dog类和Cat类。具体的UML图如下所示:4)编写主类Application,其main方法中至少包含如下代码: Simulator si=new Simulator();

D2_《C/C 语言程序设计》计算机实践_题目列表

要求:所有程序至少由二个函数完成 A类-简单题 A1:设计一个菜单程序,选择数字键1~3分别在屏幕中间输出正三角形、菱形和空心的平行四边形,选择数字4结束操作并回到操作系统状态。 A3:从键盘上输入三个矩阵,输出三个矩阵主对角线的和及乘积。 A4:字符左右排序 要求编制函数jsSort(),以行为单位对字符串按给定的条件进行排序,排序后的结果仍按行重新存入字符串数组中。 排序条件:将字符串从中间一分为二,左边部分按字符的ASCII码升序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参与处理,仍放在原位置上。 例如,原字符串: dcbahgfe 432198765 则处理后字符串: hgfe abcd 876591234 A5:简单的文件操作 编程完成读出文件 sfile.txt 中的内容,反序写入另一个文件 dfile.txt 中去。 A6:有一个一维数组,内放10个学生成绩,输出各分数段人数、平均分、最高分和最低分,保留小数点后一位。 A7:编写程序求出555555的约数中最大的三位数是多少。 A8:编写程序,实现比较两个分数的大小。 比较方法是:先比较两个数的分母,分母相同比较分子;否则通分后比较。 A9:求这样一个三位数,该三位数等于其每位数字的阶乘之和。 A10:求兔子问题。第1年有1对兔子,每对兔子从出生后第3个年起,就可每年生1对兔子,兔子的寿命是6年,问第n年有多少对兔子? A11:用C实现时钟程序。 A12:有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3个人大2岁。问第3个人多少岁,他说比第2个人大2岁。问第2个人多少岁,他说比第1个人大2岁。问第1个人多少岁,他说是10岁。请问第5个人多大? A13.用指针编写字符串函数strcpy,strcmp,strcat,strlen。并编写程序加以验证。 A14:给定某个年、月、日,计算出这一天为该年的第几天。要求写出计算闰年的函数和计算日期的函数。

C程序设计实践报告

C程序设计实践报告文件编码(008-TTIG-UTITD-GKBTT-PUUTI-WYTUI-8256)

课程实践报告 设计题目: 程序设计(VC++)实践 设计时间2013-1- 至2013-1- 学院(系): 计算机科学与工程学院 2013年1月 一.实践任务 选择题目,创新性题目可只选择1 题,仅选提高题应不少于3 题,仅选基础题应不少于6 题,也可组合选题,还可自行选择感兴趣的题目(须经指导老师审定)。对于提高题、创新题及游戏题可组成团队开发,但应制定详细的项目分工说明。二.实验步骤及记录(题目,源程序代码及运行结果) 1.与学号对应的题(必做题):基础题 12 题目: 建立一个STRING,将一个字符串交叉插入到另一个字符串中(假定两字符串不 等长)。例如将字符串“abcde”交叉插入字符串“ABCDEFG”的结果为“aAbBcCdDeEFG”或“AaBbCcDdEeFG”。 具体要求如下: (1)私有数据成员 char str1[60] :存放被插入的字符串。 char str2[40] :存放待插入的字符串。 char str3[100] :存放插入后的字符串。 (2)公有成员函数 STRING (char *s1, char *s2 ):构造函数,用s1 和s2 初始化str1 和str2。

void process():将str2 中的字符串插入到str1 中,存放到str3 中。void print():输出插入后的字符串。 (3)在主程序中定义STRING 类的对象test 对该类进行测试。 源程序代码: #include<> #include<> class STRING{ char str1[60]; char str2[40]; char str3[100]; public: STRING(char *s1,char *s2){ strcpy(str1,s1); strcpy(str2,s2); } void process(){ char *p1=str1,*p2=str2; for(int i=0;*p2;i=i+2){ for(int k=strlen(str1);k>=i;k--){ str1[k+1]=str1[k]; } *p1=*p2; p1=p1+2;

程序设计实践报告模板

面向对象程序设计实践(Project 2) 报告 题目: 专业软件工程(NIIT) 学生姓名 班级学号 指导教师杨健 指导单位计算机学院/软件学院 日期

评分细则 评分项优秀良好中等差遵守机房规章制度 上机时的表现 学习态度 程序准备情况 程序设计能力 团队合作精神 课题功能实现情况 算法设计合理性 用户界面设计 报告书写认真程度 内容详实程度 文字表达熟练程度 回答问题准确度 简短 评语教师签名: 年月日 评 分 等 级 备 注 评分等级有五种:优秀、良好、中等、及格、不及格

Title(Here,please write the name of your Project) (题目格式:宋体,3号,加粗,居中对齐) 一、D escription and Requirement(格式:Times New Roman,4号,加粗, 两端对齐) (正文格式:宋体(中文) Times New Roman(英文),小4号,不加粗,两端对齐, 1.5倍行距) 二、Requirement Analysis(格式:Times New Roman,4号,加粗,两端对齐) 在该部分中叙述系统的功能,由此得到相应的模块,并分析需要什么的数据,由此可以指导数据库的设计。 (正文格式:宋体(中文)Times New Roman(英文),小4号,不加粗,两端对齐,1.5倍行距) 三、High level design(格式:Times New Roman,4号,加粗,两端对齐) 在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义,如果用面向对象的方法,应该给出类中成员变量和成员函数原型声明),数据库设计的说明(给出数据库的结构,包括有哪些表,每个表有什么字段,分别存储什么样的数据) (正文格式:宋体(中文)Times New Roman(英文),小4号,不加粗,两端对齐, 1.5倍行距) 四、Low level design格式:Times New Roman,4号,加粗,两端对齐) 各个算法实现的源程序(可以是一组源程序,每个功能模块采用不同的函数实现),源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。 注意:不要粘贴全部程序,只要把关键算法的程序粘贴过来就可以了。 (正文格式:宋体(中文)Times New Roman(英文),小4号,不加粗,两端对齐, 1.5倍行距) 五、Tested data and result analysis(格式:Times New Roman,4号,加粗,

可视化程序设计实践报告

%%%%大学 可视化程序设计实践 2013 年 7月 26日 目录

1 设计目的 (1) 2 需求分析 (1) 2.1 用户 (1) 2.2 主要功能 (1) 2.3 基本流程 (1) 首先建立一个首页,在首页上链接了4个主页,分别是旅游指南,畅游中国,欧洲之旅以及浪漫之旅。而在每个子页里面我又链接了一个或几个子页,分别详述了中国的几大特色景区以及欧洲的著名的美景,还有被称为浪漫圣地的几座“小岛”。 (1) 3 网站开发过程 (2) 3.1 主页面的设计 (2) 3.2 子页面设计 (3) 4 心得体会 (6) 5 参考文献 (6)

1 设计目的 本课程的设计目的是通过设计一个简单、美观、符合实际的网页页面,能够较全面地理解、掌握和综合运用所学的知识,理解并初步掌握运用Dreamweaver可视化开发工具进行网页开发的方法;了解网页设计制作过程。通过设计达到掌握网页设计、制作的技巧。了解和熟悉网页设计的基础知识和实现技巧。根据题目的要求,给出网页设计方案,利用合适图文素材设计制作符合要求的网页设计作品。熟练掌握Dreamweaver软件的的操作和应用。增强动手实践能力,进一步加强自身综合素质。我本次主要是设计的是一个“乐我旅途”为主题的旅游网页,对各大著名的旅游景点做了介绍。 2 需求分析 2.1 用户 网站的主要浏览者是主要准备旅游的观光者。 2.2 主要功能 建立乐我旅途网站可以用精美的画面向旅游者展示每个景点的大概信息。通过建设网站宣传,提高知名度,吸引更多的旅游观光者来。除此之外,也是希望通过本人建立的网站,可以让更多人了解各个旅游地点的风光以及特色,以此来促进旅游的更好更快发展。 2.3 基本流程 首先建立一个首页,在首页上链接了4个主页,分别是旅游指南,畅游中国,欧洲之旅以及浪漫之旅。而在每个子页里面我又链接了一个或几个子页,分别详述了中国的几大特色景区以及欧洲的著名的美景,还有被称为浪漫圣地的几座“小岛”。

实验报告模板-《C程序设计实践 》

大型程序设计实验报告 课程名称C程序设计实践实验日期2011年月日至2011年月日 学生姓名所在班级学号 实验名称 实验地点同组人员 1. 问题描述 实现图书管理系统 如何让实现如下功能: 1.新进图书及基本信息输入 2.图书基本信息查询 3. 对撤销图书信息的删除 4 办理借书手续 5 办理还书手续 2. 问题分析 根据题目要求,需要建立图书管理系统结构体,分别需要建立读者结构体,图书结构体。 该程序主要涉及到C语言中的文件和链表 图书信息应该存放在文件中,所以提供文件的输入输出等操作;并且程序需具有实现图书信息浏览,查找,修改等功能,并进行借入借出服务;另外还提供接盘是选择菜单来实现功能选择 3. 系统设计 系统应该包括以下模块:信息输入,图书查找,信息删除,图书借出,图书归还 3.1 总体设计 1系统功能的文字概述: 图书管理系统主要功能是用户的设定,读者管理,数据的录入与查询,数据的修改和删除等 2 系统的总体结构图

3主要模块的控制流程图 主函数 ( 1. 系统功能的文字概述;2.系统的总体结构图;3. 主要模块的控制流程图)3.2 界面设计 3.3 系统主要流程设计 (文字描述加流程图) 3.4 主要数据结构设计 /*--------- 数据结构的定义------------*/ struct reader {

/*姓名,学生学号/教师工号,性别,所在学院,角色*/ char name[9]; char num[11]; char sex[3]; char college[21]; char role[2]; struct reader *next; } *readersHead=NULL, *readersTail=NULL, *reader_p; struct book{ /*书名,作者,出版社,价格,ISBN号和类别*/ char book_name[41]; char author_name[21]; char publish[15]; float price; char ISBN[18]; char b_type[9]; struct book *next; } *booksHead=NULL, *booksTail=NULL, *book_p; struct borrow_info{ /*借者编号,借书日期,图书ISBN号*/ char borrower_num[11]; char borrow_date[15]; char ISBN[18]; struct borrow_info *next; } *biHead=NULL, *biTail=NULL, *bi_p; /*--------- 数据结构的定义完毕------------*/ 3.4.1 系统数据结构概述 主要有读者数据结构,用以读者信息的记录 图书数据结构用以图书信息的记录 还有已借图书数据结构用以对已借图书的统计和记录(主要用了哪些数据结构,各自的用途)

《面向过程程序设计实践》课题资料.doc

任务 18 课题名称 某航空公司飞机购票模拟系统(服务器端) 课题内容 文件信息: 航线信息:航线编码、起点、终点、公里数、飞行时间。 航班信息:航班编号、航线编码、起飞时间、可售机票总数、票价、当前状态(准备、已出票、售完、已结束)。 售票信息:航班编号、顾客ID、顾客姓名、购票时间(y-m-d-h-m-s 以顺序存储结构设计程序能实现以下航空公司服务器端功能: (1)航线的维护(创建、修改、删除(不能删除已出票、售完航班)(2)航班的维护(创建、修改、删除(不能删除已出票、售完航班))。 ))。 (3)显示航班列表。 (4)显示指定航班的售票情况(明细和统计值)。 (5)显示各航班的销售情况。 int hbId; int userId; char userName[NUMBER]; char buytime[NUMBER]; 任务 19 课题名称 某航空公司飞机购票模拟系统(客户端) 课题内容 航班文件信息: 航线信息:航线编码、起点、终点、公里数、飞行时间。 航班信息:航班编号、航线编码、起飞时间、可售机票总数、票价、当前状态(准备、已出票、售完、已结束)。 售票信息:航班编号、顾客ID、顾客姓名、购票时间(y-m-d-h-m-s )。 以链式存储结构设计程序能实现以下顾客端功能: (1)搜索指定航线、指定时间段的航班 (2)购票 (3)退票 (4)输入顾客 ID ,显示顾客的购票信息

主菜单 /****************************************/ /* 模块名称: Menu.c 功能描述:实现菜单功能*/ #include "stdio.h"/* 输入输出函数的头文件 */ #include "shoupiao.c" #include "hangban.c" #include "hangxian.c" void menu(); /* 菜单 */ // 航班 void init_hb(hbnum *hb);// 初始化列表 void create_hb(hbnum *hb);// 从文件中加载数据 void append_hb(hbnum *hb, hbinfo x);/* 添加数据 */ void display_hb(hbnum hb);/* 输出航班信息表 */ void display_xs(hbnum hb);/* 输出航班销售信息表 */ hbinfo search_hb(hbnum hb, int id);// 根据 id 查找航班的售票情况hbnum update_hb(hbnum hb,hbinfo x);// 根据 id 修改航班信息 void dele_hb(hbnum *hb, int id);// 删除航班信息 void InsertSort_hb(hbnum *r);// 排序 void save_hb(hbnum *hb);// 将数据保存到文件中 // 航线 void init_hx(hxnum *hx);// 初始化列表 void create_hx(hxnum *hx);// 从文件中加载数据 void append_hx(hxnum *hx, hxinfo x);/* 添加数据 */ void display_hx(hxnum hx);/* 输出航班信息表 */ hxinfo search_hx(hxnum hx, int id);// 根据 id 查找航班的售票情况hxnum update_hx(hxnum hb,hxinfo x);// 根据 id 修改航线信息 void dele_hx(hxnum *hx, int id);// 删除航班信息 void InsertSort_hx(hxnum *r);// 排序 void save_hx(hxnum *hx);// 将数据保存到文件中 // 售票 void init_sp(spnum *sp);// 初始化列表 void create_sp(spnum *sp);// 从文件中加载数据 void append_sp(spnum *sp, spinfo x);/* 添加数据 */ void display_sp(spnum sp);/* 输出航班信息表 */ spinfo search_sp(spnum sp, int id);// 根据 id 查找航班的售票情况void search_mx(spnum sp, int id); int search_tj(spnum sp, int id); void dele_sp(spnum *sp, int id);// 删除航班信息 void InsertSort_sp(spnum *r);// 排序 void save_sp(spnum *sp);// 将数据保存到文件中 /* 主函数 */ main(){ hbnum hb;

Windows程序设计实践报告

~ Windows程序设计 实践报告 ; BY:08级空间信息与数字技术 60020 马腾

目录 任务一:Windows消息循环机制及API程序设计实践 (3) 一、实践目的 (3) 二、任务概述 (3) 三、windows消息循环 (3) 四、学习收获 (3) 任务二:基于MFC的对话框程序设计 (4) 一、任务概述 (4) 二、MFC消息映射 (4) 三、计算器程序的设计思路 (4) 四、遇到困难及解决 (5) 五、关键代码 (5) 六、运行情况 (6) 七、收获 (6) 任务三:基于MFC的单文档绘图程序设计 (7) 一、任务概述 (7) 二、模块设计及封装 (7) 三、设计的优点 (8) 四、程序风格 (8) 五、运行情况 (8) 六、使用方式 (9) 七、困难及解决 (12)

任务一:Windows消息循环机制及API程序设计实践 一、实践目的 通过实践充分理解Windows的消息循环机制,了解Windows的API函数族的分类及大致功能,并在此基础上了解基本Windows API方式开发的窗口程序的基本过程。任何框架开发环境归根结底都是对Windows API函数的封装与调用。在利用一个框架环境开发Windows程序的过程中,应该明白所使用的框架模块调用了Windows API中的那些功能函数。 二、任务概述 用visual C++开发一个Win32窗口程序,并实现如下功能: 实现菜单功能; 点击某两个菜单可在主窗口中显示或清除文字(文字内容不做要求); 点击某个菜单可弹出一个自定义的对话框(对话框中的元素不做要求), 单击对话框中的“确定”或“取消”按钮,可结束对话框。 三、windows消息循环 Windows多进程的窗口图形操作系统与DOS操作系统最大的区别就是:DOS 采用顺序执行的过程,而Windows采用事件的消息驱动。 用户进行的鼠标操作,键盘输入等操作和各个应用程序之间,应用程序和系统之间的操作都作为一个事件,产生消息,进入到指定的消息队列中,等待取出进行处理。这打破了顺序执行,而采用事件驱动的形式。 四、学习收获 1.了解了Windows的消息循环机制 2.了解了一个窗口程序的生存的始末,从窗口类的定义,注册窗口类,创建窗口,到程序运行的消息循环的主函数。 3.了解了句柄的概念,每个菜单项,窗口都有一个句柄作为自己的标示,作为消息的一部分,告诉系统处理哪个窗口,菜单项的消息。 4.了解了一些简单的API:CheckMenuItem,DialogBox等。 5.了解了消息分类,处理消息的函数里,将消息分为了WM_COMMAND、WM_PAINT

C语言程序设计实验报告优秀范文

C语言程序设计实验报告优秀范文 实验名称计算出1000以内10个最大素数之和 实验目的 1、熟练掌握if、if…else、if…else if语句和witch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句和switch语句实现分支选择结构。 2、熟练掌握while语句、do…while语句和for语句格式及使用方法,掌握三种循环控制语句的循环过程以及循环结构的嵌套,利用循环语句实现循环结构。 3、掌握简单、常用的算法,并在编程过程中体验各种算法的编程技巧。进一步学习调试程序,掌握语法错误和逻辑错误的检查方法。 实验内容 计算并输出1000以内最大的10个素数以及它们的和。 要求: 在程序内部加必要的注释。 由于偶数不是素数,可以不考虑对偶数的处理。 虽然在1000以内的素数超过10个,但是要对1000以内不够10个素数的情况进行处理。 输出形式为:素数1+素数2+素数3+…+素数10=总和值。 算法描述流程图 main函数: 判断素数: 源程序 #include #include int sushu(int n)/* 判断素数的函数*/ { int t,i; t=sqrt(n); for(i=2;i if(n%i==0)/* 如果不是素数,返回0 */ return 0; return n;/* 如果是素数,返回该数*/ } void main { int i,j=0,n,m=0,a[1000],x; /*clrscr;*/ printf("please input a number form 1 to 1000:"); scanf("%d",&x); if(x==2)/* x=2时的处理*/ printf("%dn",x); else if(x printf("error!n");

程序设计实践

程序设计实践-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN

苏州科技学院 二○一四~二○一五学年第二学期电子与信息工程学院课程设计报告书 课程名称: 班级: 学号: 姓名: 指导教师: 二○一五年三月

1.题目 小型图书信息管理系统 2.功能 1、信息录入,包括记录的追加和插入; 2、信息删除; 3、信息修改; 4、信息排序和查询; 5、信息的保存和装载; 6、简单的帮助。 3.要求 (1)整个系统均用C语言实现; (2)利用指针、链表来实现图书馆的数据结构设计; (3)系统具有输入、显示、查询、删除、排序、插入,保存、读取基本功能; (4)系统的各个功能模块都用函数的形式来实现; (5)可以将图书信息保存在文件中。 (6)可以将图书信息从文件中读取出来。 4.设计内容 整个系统除了主函数外,另外还有6个函数,实现八大功能:输入功能,查找功能,插入功能,保存功能,删除功能,读取功能。各个函数的详细设计说明分别如下: 主函数 main() 利用无限次循环for(;;)实现各函数的调用,系统根据输入的数字选项来调用相应的函数。 初始化函数 book *create() 这是一个无参函数,它的作用是使链表初始化,使head的值为NULL。 输入函数 Insert(book *head) 这是一个无参函数,用来执行图书信息的输入。 算法:先声明一个首节点head,并将head->next设为NULL。每输入一个数据就声明一个新节点p,把p->next设为NULL,并且链接到之前列表的尾端。 N-S

修改函数 change(book *head) 用于修改图书信息。 算法:输入需修改图书的书名,判断是否有本书,若有,再进行修改。 N-S 显示记录函数 void Print(book *head) 这是一个不返回值的有参函数,将记录的输出。 算法:先将p结点的指针指向第一个结点,将p结点的数据输出,再将p结点的指针指向下一结点,将下一结点的数据输出。重复执行此步聚直到p指针指向NULL为止。 N-S 查找记录函数 void search(book *head) 这是一个不返回值的有参函数,形参为“链表头的指针”,实现按书名对某书进行查找,并显示所查找到的记录。 算法:采用线性查找法往下一个节点查找。输入所要查找的图书的名称,设一个指针变量p,先指向第一个结点,当strcmp(p->name,name1) && p != NULL 时,使p后移一个结点,如果p!=NULL,输出p所指的结点。 N-S

测量程序设计实习报告

测量程序设计实习报告 姓名: 班级: 学号: 教师评语: 日期:二零一四年十二月

实验名称:使用C#开发环境建立测量程序框架 一、实验的目的与任务: (1)学会用C#窗体程序开发环境建立应用程序框架方法 (2)学会使用常见的Windows控件 (3)根据自身需要设计一个测量程序界面 二、实验的过程与步骤: 1.创建窗体项目 打开“新建项目”对话框,选左边“已安装模板”栏的“其他语言\Visual C#”项,再选右边“模板”栏的“Windows应用程序”模板。选择磁盘卷和父目录位置后,输入项目名称“测量程序”按“确定”按钮关闭对话框。 2.修改窗体属性 窗体的属性有很多,其中常用的有: 布局:大小Size——缺省为300*300像素,可以通过修改此属性,或直接拖动窗体的边框来改变窗体的尺寸。运行时用户也可以自己改变窗体大小。 设计:是程序设计中窗口的引用名称,名称(Name)缺省为Form1,可以改成自己喜欢的名称,如CLCX,回车确认后,系统会自动修改所有相关内容中的该标识符。 外观:文本Text——对应于窗体的标题,缺省也为Form1,可以改为自己喜欢的标题,如“导线简易平差”。 单击窗口界面,再点击菜单工具栏中“属性”工具,调出属性窗口,此时属性窗口显示的内容便是窗口的属性,找到“Name”栏,将其值改为“CLCX”;再找到“Text”栏,将其值改为“导线简易平差”。 将鼠标箭头放置于窗口边缘,拖动窗口以调整窗口大小,将窗口大小调整为合适大小。 3.添加按钮和控件 可以在窗口中添加标准控件,以实现可视化的目的,C#中常用的标准控件有:(1)按钮(Button) 是用户以交互方式控制程序运行的控件之一。 主要属性: 1)Text属性 设置显示在按钮表面上的文字,用于说明该按钮的作用。 2)Enabled属性 设置按钮是否可用; (2)Label控件 Label控件主要用于通过其Text属性显示文本信息。 主要属性: 1)Text属性 标签中显示的文本内容 2)Font

c语言程序设计实践教程答案完整版

4.2练习题 一、选择题 1.D 2.B 3.A 4.B和D 5.C 6.A 7.B 二、填空题 1.//或/* */ 2.主或main 3.函数首部和函数体4.编译和连接 5.分号 5.2练习题 一、选择题 1.A 2.D 3.B 4.B 5.C 6.C 7.D 8.A 9.B 10.B 11.D 12.B 13.A或B 14.C 15.B

17.D 18.D 19.C 20.D 21.B 22.A 23.D 24.C 25.C 26.B 27.C 28.D 29.A 30.B 二、填空题 1.102,10 2.#define 宏名字符串 3.1 4.n=1 5.-4 6.a=1,b= ,c=2 7.c=A 8.n1=%d\nn2=%d 9.a+b>c&&a+c>b&&b+c>a 10.ch>=’a’&&ch<=’z’|| ch>=’A’&&ch<=’Z’11.7 12.0 13.8,4 6.2练习题 一、选择题 1.A 2.C 3.D 4.C 5.A 6.B

8.D 9.B 10.C 11.A 12.A 13.C 14.B 15.正确答案为: 二、填空题 1.10 2.y=1 x%i==0 3.屏幕中间输出一个由星号组成的菱形4.1 5.13 6.(cx=getchar())!=-1 front=cx; 7.m%n 8.4 9.*p px=&x py=&y 三、读程序,写结果 1.-1 2.3,1,-1, 3.a=16,y=60 4.x=12,y=4 5.59 7.2练习题 一、选择题 1.B 2.C 3.C 4.A 5.D 6.C 7.D

程序设计实践的题目和样例

1.Alice喜欢n位数,Bob喜欢能被m整除的数,请问被Alice和Bob都喜欢的数有多少个? 输入:第一行是一个整数K(K<= 10000),表示样例的个数 每一个样例是一行,两个整数n(1<=n<=18),m(2<=m<=1000000) 输出:每行输出一个样例的结果。 样例输入:4 样例输出 5 1 2 450 3 2 300 3 3 0 3 10000 2.给一个字符串,请判断字符串是否出现了所有的英文字母(不分大小写)。 输入:每行一个只含英文字母的字符串,长度不超过1000. 输出:每行输出一个样例的结果,如果出现了所有的字符串,输出“Yes”,否则输出“No”(不要引号)。 样例输入: ProgrammingPratice TheQuickBrownFoxJumpsOverLazyDog 输出:No Yes 提示:巨大输入量,请使用C风格的输入。 3.给你n个数,祛除其中的重复的数,并保持第一次出现的数原有的相对顺序。 比如{3, 2, 2, 3, 1},那么祛除重复元素以后为{3,2,1}。 输入:每一行是一个整数K, K表示样例的个数,不超过100; 每个样例的第一行是一个整数n(1<=n<=10000)表示数的个数;第二行是n个正整数,其值不超过10^9. 输出:每行输出一个样例的结果,每个整数之间用一个空格隔开; 样例输入:输出: 2 3 2 1 5 1 2 3 3 2 2 3 1 3 1 2 3 提示:巨大的输入输出,请使用C风格,避免超时 4、小明很喜欢钓鱼,现在有n个池塘可以钓鱼,第i个池塘首次内能钓到ai条鱼,第i个池塘如果被钓过k次,那么每次下一次能钓到的鱼的数目为max{0,ai - k * bi},现在小明能钓m次鱼,请问他最多能钓到多少条鱼? 输入:第一行是一个整数T(1<=T<=100),表示样例个数,每个样例第一行是n(1<=n<=1000), m(1<=m<=100000); 以后的n行,每行是ai(1<=ai<=10000),bi(0<=bi<=100) 输出:每行输出一个样例结果

c语言程序设计实践报告

中南大学 C语言程序设计实践报告 题目通讯录程序设计 学生姓名 指导教师 学院 专业班级 完成时间

一、任务描述 通讯录程序设计 设计一个实用的小型通讯录程序,具有添加,查询和删除功能。由姓名,籍贯,电话号码1,电话号码2,电子邮箱组成,姓名可以由字符和数字混合编码。电话号码可由字符和数字组成。 实现功能:(1)系统以菜单方式工作 (2)信息录入功能 (3)信息浏览功能 (4)信息查询功能 (5)信息修改功能 (6)系统退出功能 二、算法描述 设计一个实用的的小型通讯录程序必须具备系统以菜单方式工作、信息录入、信息浏览、信息查询、信息修改、系统退出功能,那么就需要这样的函数来实现。因此,我需要自定义这样的函数来解决问题,当然还会调用库函数。在定义函数的过程中会用到选择结构、循环结构等基本语句,以及对结构体数组的定义等。 三、程序设计 /******头文件(.h)***********/ #include "stdio.h" /*I/O函数*/ #include "stdlib.h" /*标准库函数*/ #include "string.h"/*字符串函数*/ #include "ctype.h" /*字符操作函数*/ #define M 50 /*定义常数表示记录数*/ typedef struct /*定义数据结构*/ { char NAME[20]; /*姓名*/ char EMAIL[30]; /*邮箱*/

char TELE1[10]; /*电话*/ char TELE2[10]; /*电话*/ char HOMETOWN[30]; /*籍贯*/ }DATA; /******以下是函数原型*******/ int enter(DATA t[]); /*输入记录*/ int add(DATA t[],int n); /*添加记录*/ int change(DATA t[],int n); /*修改记录*/ int deleter(DATA t[],int n); /*删除记录*/ void list(DATA t[],int n); /*显示记录*/ void search(DATA t[],int n); /*按姓名查找显示记录*/ void qseek(DATA t[],int n); /*快速查找记录*/ void print(DATA temp); /*显示单条记录*/ int find(DATA t[],int n,char *s) ; /*查找函数*/ int menu_select(); /*主菜单函数*/ /******主函数开始*******/ main() { int i; DATA d[M]; /*定义结构体数组*/ int length; /*保存记录长度*/ system("cls"); for(;;)/*无限循环*/ { switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/ { case 1:length=enter(d);break;/*输入记录*/ case 2:length=add(d,length); break; /*添加记录*/ case 3:length=deleter(d,length);break; /*删除记录*/ case 4:list(d,length);break; /*显示全部记录*/

相关文档