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,'.')>0then
        
    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;
    /
  • 相关阅读:
    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
Copyright © 2011-2022 走看看