zoukankan
html css js c++ java
用 Oracle 9i 的 PL/SQL 写的反转数字的小题目
题目要求:
编写一个程序,用以接受用户输入的数字。将该数左 --右反转,然后显示反转后的数。
--
***********************************************
--
编写一个程序,用以接受用户输入的数字。将该数左
--
右反转,然后显示反转后的数。
--
***********************************************
--
设置参数使dbms_output.put_line()的结果显示在屏幕上
set
serveroutput
on
;
--
-----------------------------------------------
--
注:
--
-----------------------------------------------
--
“用户的键盘输入”以下简称“输入”
--
题目中对数字转换的格式要求并不十分明确,所以
--
自己规定了一下转换要求
--
-----------------------------------------------
--
-----------------------------------------------
--
要求(A).规定反转时先转成简单格式再反转
--
-----------------------------------------------
--
预期测试用例:
--
1.输入0105.0000反转后为501
--
2.输入01050反转后为501
--
3.输入0.5反转后为5
--
-----------------------------------------------
--
-----------------------------------------------
--
要求(B).规定反转时先反转再转成简单格式
--
-----------------------------------------------
--
预期测试用例:
--
1.输入0105.0000反转后为0.501
--
2.输入01050反转后为5010
--
3.输入0.5反转后为5
--
-----------------------------------------------
--
-----------------------------------------------
--
对于 要求(A)
--
-----------------------------------------------
--
规则思考:
--
1.以小数点开头或以小数点结尾的输入不是数字
--
2.包含超过一个小数点的输入不是数字
--
3.包含既非数字又非小数点的字符的输入不是数字
--
实现步骤设计:
--
1.如果不满足以上规则,提示非数字
--
2.修剪数字两边的0
--
例:'0105.0000' 修剪成 '105.',
--
'01050' 修剪成 '105',
--
'0.5' 修剪成 '.5'
--
3.修剪数字两边的小数点
--
例:'105.' 修剪成 '105',
--
'105' 修剪成 '105',
--
'.5' 修剪成 '5'
--
4.将剩下的数字反转
--
例:'105' 反转成 '501',
--
'105' 反转成 '501',
--
'5' 反转成 '5'
--
-----------------------------------------------
--
要求(A)的具体实现
--
-----------------------------------------------
declare
v_i
int
;
v_c
char
(
1
);
v_userinput
varchar2
(
100
);
v_result v_userinput
%
type;
e_NumberFormatException EXCEPTION;
v_prompt constant
char
(
14
) :
=
'
反转后的数字:
'
;
begin
--
从键盘接收用户输入
v_userinput :
=
'
&需要反转的数字
'
;
--
判断输入是否以小数点开头,或以小数点结尾,如是,提示非数字
if
(substr(v_userinput,
1
,
1
)
=
'
.
'
or
substr(v_userinput,length(v_userinput),
1
)
=
'
.
'
)
then
raise e_NumberFormatException;
end
if
;
--
判断输入是否包含1个以上的小数点,如是,提示非数字
if
(length(v_userinput)
-
length(
replace
(v_userinput,
'
.
'
,
''
)))
>
1
then
raise e_NumberFormatException;
end
if
;
--
删除输入两侧的0
execute
immediate
'
select nvl(ltrim(rtrim(:ui,:c1),:c2),0) from dual
'
into
v_userinput using v_userinput,
'
0
'
,
'
0
'
;
--
删除输入两侧的小数点
execute
immediate
'
select nvl(ltrim(rtrim(:ui,:c1),:c2),0) from dual
'
into
v_userinput using v_userinput,
'
.
'
,
'
.
'
;
--
反向遍历输入中每一个字符,并把该字符附加到结果变量中
v_i :
=
0
;
for
v_i
in
reverse
1
..length(v_userinput)
loop
v_c :
=
substr(v_userinput,v_i,
1
);
--
如果输入中有字符非数字也非小数点,则提示非数字
if
v_c
<>
'
.
'
and
not
(v_c
>=
'
0
'
and
v_c
<=
'
9
'
)
then
raise e_NumberFormatException;
end
if
;
v_result :
=
v_result
||
v_c;
end
loop;
--
输入最后的结果
dbms_output.put_line(v_prompt
||
v_result);
exception
when
e_NumberFormatException
then
dbms_output.put_line(
'
您输入的不是数字
'
);
end
;
/
--
-----------------------------------------------
--
对于 要求(B)
--
-----------------------------------------------
--
规则思考:
--
1.以小数点开头或以小数点结尾的输入不是数字
--
2.包含超过一个小数点的输入不是数字
--
3.包含既非数字又非小数点的字符的输入不是数字
--
实现步骤设计:
--
1.如果不满足以上规则,提示非数字
--
2.将输入反转
--
例:'0105.0000' 反转成 '0000.5010',
--
'01050' 反转成 '05010',
--
'0.5' 反转成 '5.0'
--
3.如果输入中包含小数点,则修剪两侧的0,否则,只修剪左侧的0
--
例:'0000.5010' 修剪成 '.501'
--
'05010' 修剪成 '5010'
--
'5.0' 修剪成 '5.'
--
4.修剪右侧的小数点
--
例:'.501' 修剪成 '.501'
--
'5010' 修剪成 '5010'
--
'5.' 修剪成 '5'
--
5.如果结果以小数点开头,则在左侧补0
--
例:'.501' 转换成 '0.501'
--
'5010' 转换成 '5010'
--
'5' 转换成 '5'
--
-----------------------------------------------
--
要求(B)的具体实现
--
-----------------------------------------------
declare
v_i
int
;
v_c
char
(
1
);
v_userinput
varchar2
(
100
);
v_result v_userinput
%
type;
e_NumberFormatException EXCEPTION;
v_prompt constant
char
(
14
) :
=
'
反转后的数字:
'
;
begin
--
从键盘接收用户输入
v_userinput :
=
'
&需要反转的数字
'
;
--
判断输入是否以小数点开头,或以小数点结尾,如是,提示非数字
if
(substr(v_userinput,
1
,
1
)
=
'
.
'
or
substr(v_userinput,length(v_userinput),
1
)
=
'
.
'
)
then
raise e_NumberFormatException;
end
if
;
--
判断输入是否包含1个以上的小数点,如是,提示非数字
if
(length(v_userinput)
-
length(
replace
(v_userinput,
'
.
'
,
''
)))
>
1
then
raise e_NumberFormatException;
end
if
;
--
反向遍历输入中每一个字符,并把该字符附加到结果变量中
v_i :
=
0
;
for
v_i
in
reverse
1
..length(v_userinput)
loop
v_c :
=
substr(v_userinput,v_i,
1
);
--
如果输入中有字符非数字也非小数点,则提示非数字
if
v_c
<>
'
.
'
and
not
(v_c
>=
'
0
'
and
v_c
<=
'
9
'
)
then
raise e_NumberFormatException;
end
if
;
v_result :
=
v_result
||
v_c;
end
loop;
--
如果有小数点,刚删除输入两侧的0,如无小数点,则仅删除左侧的0
if
(instr(v_result,
'
.
'
)
>
0
)
then
execute
immediate
'
select nvl(ltrim(rtrim(:ui,:c1),:c2),0) from dual
'
into
v_result using v_result,
'
0
'
,
'
0
'
;
else
execute
immediate
'
select nvl(ltrim(:ui,:c1),0) from dual
'
into
v_result using v_result,
'
0
'
;
end
if
;
--
删除右侧的小数点
execute
immediate
'
select nvl(rtrim(:ui,:c1),0) from dual
'
into
v_result using v_result,
'
.
'
;
if
(substr(v_result,
1
,
1
)
=
'
.
'
)
then
v_result :
=
'
0
'
||
v_result ;
end
if
;
--
输出最后的结果
dbms_output.put_line(v_prompt
||
v_result);
exception
when
e_NumberFormatException
then
dbms_output.put_line(
'
您输入的不是数字
'
);
end
;
/
张旋(zxsoft)
如对本文有什么疑问,请在下面写下留言,谢谢!
查看全文
相关阅读:
linux下解压命令大全
关于伸展树的详细解析(E文)
数据结构与算法汇总
Linux下的压缩解压缩命令详解
Linux Netcat 命令——网络工具中的瑞士军刀
gethostbyname
Html 转化为 PDF
返回一个表
sqlserver创建函数
取不同类别的第一条数据
原文地址:https://www.cnblogs.com/zxsoft/p/1176875.html
最新文章
Oracle Block浅析2:ITL(Interested Transaction List)
RMAN 还原与恢复1(RMAN Complete Recovery)
Oracle Drop Table 释放空间测试
Oracle有效地使用块(2)
Oracle Block浅析1:Data block 的物理结构
Oracle 中定位重要(消耗资源多)的SQL
Table还是CSS,请您说说您的见解
实际操作最能学到东西
Table还是CSS,请您说说您的见解
CSS选择器
热门文章
Citrix在Windows server 2003的安装
学习的方法
Citrix在Windows server 2003的安装
实际操作最能学到东西
学习的方法
CSS选择器
伸展树 ( Splay tree )
wget 命令用法详解
Example: A simple blocking HTTP client
libevent介绍及示例
Copyright © 2011-2022 走看看