目录
实验七 PL/SQL语言
一、 实验目的
二、实验要求
三、 实验内容
(1)编写一个程序,输入玩具的价格,比较玩具的价格并显示折扣,如果价格高于或等于500元,则优惠150元;价格高于或等于400元,则优惠100元;如果价格高于或等于250元,优惠50元,价格低于250元,则不优惠。
(2)编写一个程序,求1~100的和;
(3)利用LOOP循环方式,键盘输入n,计算1到n之间的偶数项之和(运行结果:2550)。
(4)编写一个程序,用于接受用户输入的数字,将该数左右反转,然后显示反转后的数。
(5)编写程序,键盘输入n,计算1+2+3+...编辑前n项之和。
(6)要求编写程序,输入n个字符,统计其中英文字母、数字字符和其他字符的个数。输入:aZ&09Az 输出:letter = 4, digit = 2, other = 1
(7)要求编写程序,将字符串中的每一个字母都用英文字母表中排在其后面的一个字母来替换。例如,字母’A’被替换成字母’B’ ,字母’H’被替换成字母’I’,字母’L’被替换成字母’M’,因此字符串”HAL”被替换成”IBM”。如是字母’Z’被替换成字母’A’。
编辑
四、问题解答及实验结果
(1)完成相应代码编写,代码通过相应的测试案例;
set serveroutput on
DECLARE
v_price NUMBER;
v_discount NUMBER;
v_final_price NUMBER;
BEGIN
-- 输入玩具的价格
v_price := &enter_price; -- 这里&enter_price是一个替代变量,运行时会被实际的价格替换
-- 根据价格计算折扣
IF v_price >= 500 THEN
v_discount := 150;
ELSIF v_price >= 400 THEN
v_discount := 100;
ELSIF v_price >= 250 THEN
v_discount := 50;
ELSE
v_discount := 0;
END IF;
-- 计算最终价格
v_final_price := v_price - v_discount;
-- 输出结果
DBMS_OUTPUT.PUT_LINE('玩具原价: ' || v_price);
DBMS_OUTPUT.PUT_LINE('折扣: ' || v_discount);
DBMS_OUTPUT.PUT_LINE('玩具最终价格: ' || v_final_price);
END;
/
for循环
loop简单循环
set serveroutput on
declare
v_sum number:=0;
v_i number:=1;
begin
loop
v_sum:=v_sum+v_i;
v_i:=v_i+1;
exit when v_i>100;
end loop;
DBMS_OUTPUT.PUT_LINE('1到100的和为: ' || v_sum);
end;
/
while循环
set serveroutput on
declare
v_sum number:=0;
v_i number:=2;
v_n number;
begin
v_n:=&n;
loop
v_sum:=v_sum+v_i;
v_i:=v_i+2;
exit when v_i>v_n;
end loop;
dbms_output.put_line(v_sum);
end;
/
测试案例:
输入:1234567 输出:7654321
set serveroutput on
declare
v_number number:=&enter_number;
v_reversed number:=0;
v_digit number;
begin
for i in reverse 1..length(to_char(v_number)) loop
v_digit:=to_number(substr(to_char(v_number),i,1));
v_reversed:=v_reversed*10+v_digit;
end loop;
dbms_output.put_line('反转后的数字: ' ||v_reversed);
end;
/
测试案例:
输入:10 输出:22.47
set serveroutput on
declare
v_sum number:=0;
v_n number;
begin
v_n:=&n;
for i in 1..v_n loop
v_sum:=v_sum+sqrt(i);
end loop;
dbms_output.put_line('Sum is:'||round(v_sum,2));
end;
/
set serveroutput on
declare
str varchar2(100);
len number;
letter_cnt number:=0;
digit_cnt number:=0;
other_cnt number:=0;
begin
str:='&input_str';
len:=length(str);
for i in 1..len loop
if(ascii(substr(str,i,1))>=65 and ascii(substr(str,i,1))<=90) or (ascii(substr(str,i,1))>=97 and ascii(substr(str,i,1))<=122) then -- 判断是否为英文字母
letter_cnt:=letter_cnt+1;
elsif substr(str,i,1) in ('0','1','2','3','4','5','6','7','8','9') then -- 判断是否为数字字符
digit_cnt:=digit_cnt+1;
else -- 其他字符
other_cnt:=other_cnt+1;
end if;
end loop;
dbms_output.put_line('letter='||letter_cnt||',digit='||digit_cnt||',other='||other_cnt);
end;
/
注意:ascii()可以将字母转成相对应的ascii码,chr()可以逆转ascii函数。
set serveroutput on
declare
input_str varchar2(100);
output_str varchar2(100);
begin
input_str:='&input_str';
for i in 1..length(input_str) loop
if substr(input_str,i,1)='Z' then
output_str:=output_str||'A';
else
output_str:=output_str||chr(ascii(substr(input_str,i,1))+1);
end if;
end loop;
dbms_output.put_line('Original string:'||input_str);
dbms_output.put_line('New string:'||output_str);
end;
/
新建一个word,命名为“X班+学号+姓名+实验七”将相关代码及代码测试成功的截图放到相应题号下面。