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)
如对本文有什么疑问,请在下面写下留言,谢谢!
查看全文
相关阅读:
169. Majority Element求众数
567. Permutation in String字符串的排列(效率待提高)
51. N-Queens N皇后
52. N-Queens II N皇后II
layui的form.val无法动态渲染赋值表单问题解决方法
layui 父页面获取弹窗传递的值 和 父页面传值给子弹窗的方法
layui搜索框,监听为空,表格重新加载
layui form表单 input输入框获取焦点后 阻止Enter回车自动提交
5月17日 日期格式遇到一些问题
Layui关闭弹出层并刷新父窗口
原文地址:https://www.cnblogs.com/zxsoft/p/1176875.html
最新文章
汇编语言:实验五 编写、调试具有多个段的程序
汇编语言:第六章 编写多个段的程序
汇编语言:实验四 [bx]和loop的使用
汇编语言:第五章 [BX]和loop指令
flink jdbc方式下沉到hive
flink Sink file
flinkSinkES
flink自定义Map方法
flink 自定义filter
flink分流合流
热门文章
flnk算子reduce的简单使用和自定义reduce
flink分组取最小值
flink批处理第一个代码WordCount
FlinkStream第一个代码WordCount
198. House Robber 强盗抢劫 Java
94. Binary Tree Inorder Traversal二叉树的中序遍历
654. Maximum Binary Tree最大二叉树
102. Binary Tree Level Order Traversal二叉树层序遍历
983. Minimum Cost For Tickets
229. Majority Element II求众数II
Copyright © 2011-2022 走看看