Perl语言入门(第四版)习题标准答案
- 格式:docx
- 大小:100.15 KB
- 文档页数:25
汇编语言程序设计第四版【课后习题答案】第1章汇编语言基础知识〔习题1.1〕简述计算机系统的硬件组成及各部分作用。
〔解答〕CPU:包括运算器、控制器和寄存器组。
运算器执行所有的算术和逻辑运算;控制器负责把指指令逐条从存储器中取出,经译码分析后向机器发出各种控制命令,并正确完成程序所要求的功能;寄存器组为处理单元提供所需要的数据。
存储器:是计算机的记忆部件,它用来存放程序以及程序中所涉及的数据。
外部设备:实现人机交换和机间的通信。
〔习题1.2〕明确下列概念或符号:主存和辅存,RAM和ROM,存储器地址和I/O端口,KB、MB、GB和TB。
〔解答〕主存又称内存是主存储器的简称,主存储器存放当前正在执行的程序和使用的数据,CPU可以直接存取,它由半导体存储器芯片构成其成本高、容量小、但速度快。
辅存是辅助存储器的简称,辅存可用来长期保存大量程序和数据,CPU需要通过I/O接口访问,它由磁盘或光盘构成,其成本低、容量大,但速度慢。
RAM是随机存取存储器的英语简写,由于CPU可以从RAM读信息,也可以向RAM写入信息,所以RAM也被称为读写存储器,RAM型半导体存储器可以按地址随机读写,但这类存储器在断电后不能保存信息;而ROM中的信息只能被读出,不能被修改,ROM型半导体通常只能被读出,但这类存储器断电后能保存信息。
存储器由大量存储单元组成。
为了区别每个单元,我们将它们编号,于是,每个存储单元就有了一个存储地址,I/O接口是由一组寄存器组成,为了区别它们,各个寄存器进行了编号,形成I/O地址,通常称做I/O端口。
KB是千字节、MB是兆字节、GB是吉字节和TB是太字节,它们都是表示存储器存储单元的单位。
〔习题1.3〕什么是汇编语言源程序、汇编程序、目标程序?〔解答〕用汇编语言书写的程序就称为汇编语言源程序;完成汇编工作的程序就是汇编程序;由汇编程序编译通过的程序就是目标程序。
〔习题1.4〕汇编语言与高级语言相比有什么优缺点?〔解答〕汇编语言与高级语言相比的优点:由于汇编语言本质就是机器语言,它可以直接地、有效地控制计算机硬件,因而容易产生运行速度快,指令序列短小的高效目标程序,可以直接控制计算机硬件部件,可以编写在“时间”和“空间”两方面最有效的程序。
2.12 练习写一个程序,计算半径为12.5的圆的周长。
圆周长等于2π(π约为3.1415926)乘以半径。
答案为78.5。
#!/usr/bin/perl$r=12.5;$pai=3.1415926 ;$C=2*$pai*$r;Print “$C\n”;修改上述程序,用户可以在程序运行时输入半径。
如果,用户输入12.5,则应得到和上题一样的结果。
#!/usr/bin/perl$r=<STDIN>;$pai=3.1415926 ;$C=2*$pai*$r;Print “$C\n”;修改上述程序,当用户输入小于0 的数字时,程序输出的周长为0,而非负数。
#!/usr/bin/perl$r=<STDIN>;$pai=3.1415926 ;if($r>=0){$C=2*$pai*$r;}If($r<0){$C=0;}Print “$C\n”;写一个程序,用户能输入2 个数字(不在同一行)。
输出为这两个数的积。
#!/usr/bim/perl$a=<STDIN>;$b=<STDIN>;$c=$a*$b;Print”$c”;写一个程序,用户能输入1 个字符串和一个数字(n)(不在同一行)。
输出为,n 行这个字符串,1 次1 行(提示,使用“x”操作符)。
例如,如果用户输入的是“fred”和“3”,则输出为:3 行,每一行均为fred。
如果输入为“fred”和“299792”,则输出为299792 行,每一行均为fred。
#!/usr.bin/perl$string=<STDIN>;$int=<STDIN>;$output=$string x $intprint $output;3.9练习写一个程序,将一些字符串(不同的行)读入一个列表中,逆向输出它。
如果是从键盘输入的,那在Unix 系统中应当使用CTRL+D 表明end-of-file,在Windows 系统中使用CTRL+Z.写一个程序,读入一串数字(一个数字一行),将和这些数字对应的人名(下面列出的)输出来。
【Lua程序设计第四版练习题答案】ch01Lua语⾔⼊门
联系1.1: 运⾏阶乘的⽰例并观察,如果输⼊负数,程序会出现什么问题?试着修改代码来解决问题。
-- 定义⼀个计算阶乘的函数
function fact (n)
if n == 0 then
return 1
else
return n * fact(n-1)
end
end
print("enter a number:")
a = io.read("*n") -- 读取⼀个数字
print(fact(a))
这是本章最开始提到的阶乘⽰例程序,通过实际的运⾏,我们了解到由于程序没有对负数形式进⾏校验的逻辑,因此程序会⼀直迭代递归下去,没有终⽌条件lua编译器报出堆栈溢出的错误才结束。
在进⾏修改之后的代码如下:
opefunction fact(n)
n = n or 0
if n < 0 then
error("Cannot calculate the factorial of a negative number")
elseif n == 0 then
return 1
else
return n * fact(n-1)
end
end
print("Enter a number: ")
a = io.read("*n")
print("Answer is: ", fact(a))
这⾥加⼊对输⼊负数的终⽌条件的判断,因此不会再出现堆栈溢出的错误。
汇编语言程序设计 第四版【课后习题答案】--囮裑為檤第4章 基本汇编语言程序设计〔习题4.1〕例题4.2如果要求算术右移8位,如何修改程序。
〔解答〕思路: 首先由最高位字节向次低位字节传送……次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送00h 到最高位字节;如为1,送ffh 到最高位字节。
传送可参考例题4.2,不过应从第一号字节送第零号字节,……最高位字节向次低位字节传送;也可以用循环来完成: .model small .stack 256 .dataqvar dq 1234567887654321h .code .startup mov cx,7 mov si,1again: mov al, byte ptr qvar[si] mov byte ptr qvar[si-1],al inc siloop again test al,80h jz ezzmov bl,0ffh jmp done ezz: mov bl,0done: mov byte ptr qvar[7],bl .exit 0 end〔习题4.2〕例题4.2如果要求算术左移7位,如何用移位指令实现。
〔解答〕思路:可设计外循环体为8个字节左移一次,方法是:最低位字节算术左移一次, 次低位字节至最高位字节依次带 CF 位循环左移一次(内循环共8次),外循环体控制执行7次即可。
.model small .stack 256 .dataqvar dq 1234567887654321h4 11 201628.code.startupmov dx, 7 ;外循环次数mov ax, byte ptr qvar[0] ;最低位字节送axlpp: shl ax, 1 ;最低位字节左移一次,其d7移入CF 位 mov si, 1mov cx, 7 ;内循环次数again: rcl byte ptr qvar[si], 1 ;高位字节依次左移 P50 inc siloop again dec dx jnz lpp .exit 0 .end〔习题4.3〕将AX 寄存器中的16位数连续4位分成一组,共4组,然后把这4组数分别放在AL 、BL 、CL 和DL 寄存器中。
#题2:#使用for循环打印出如下的字符。
# 1# 12# 123# 12345#*******************#Fw_Print_Step ($step++,"使用for循环打印出如下的字符。
11212312345");my $str= "";for (1..4) {$str= $str.$_;if ($_==4) {$str= $str.$_+1;}print " $str\n";}#*******************##题3:my $str1 = "abc";my $str2 = "efg";#将上述2个字符串连接起来,并输出合并后的字符串长度#*******************#Fw_Print_Step ($step++,"将上述2个字符串\"$str1\"和\"$str2\"连接起来,并输出合并后的字符串长度");my $str =$str1.$str2;my $str_length=length($str);print "新字串$str的长度为:$str_length";#*******************##题4:#以逆序方式打印出字符串包含的各个字符,如变量为"123456789"则输出为"9","8",..."2","1". my $str1="abc123def456";#*******************#Fw_Print_Step ($step++,"以逆序方式打印出字符串包含的各个字符,如变量为\"123456789\"则输出为\"9\",\"8\",...\"2\",\"1\".");my $str=$str1;print "以逆序方式打印出字符串\"$str1\"包含的各个字符:\n";for($length=length($str1); $length>0; $length--) {$sub_str=chop($str);if ($length>1) {print "\"$sub_str\",";} else {print "\"$sub_str\".";}}#*******************##题5:#分别使用for与while循环来计算1+2+3+...+100的值#*******************#Fw_Print_Step ($step++,"分别使用for与while循环来计算1+2+3+...+100的值"); print "用for循环计算1+2+3+...+100的值:\n ";my $result=0;for (1..100) {$result=$result+$_;}print "1+2+3+...+100=$result";print "\n用while循环计算1+2+3+...+100的值:\n ";my $result=0;my $num=1;while ($num<=100) {$result=$result+$num;$num++;}print "1+2+3+...+100=$result";#*******************##题6:#以逆序的方式打印出端口列表包含的成员口my @cmdArray = ("config", "int fa 0/1", "no shutdonw", "end");#*******************#Fw_Print_Step ($step++,"以逆序的方式打印出端口列表包含的成员口");for (my $start=$#cmdArray; $start>=0; $start--) {my $array=$cmdArray[$start];print "$array\n";}#*******************##题7:#使用foreach打印出Hash表的所有下标与值my %map = ('red', 0xff0000,'green', 0x00ff00,'blue',0x0000ff);#*******************#Fw_Print_Step ($step++,"使用foreach打印出Hash表的所有下标与值");foreach $capword (sort keys(%map)) {print ("$capword: $map{$capword}\n");}#while( ($key, $value) = Each (%Map)) {# Print "\N$key=$value;"}#*******************##题8:#使用正则匹配判断字符串是否包含error,若是打印提示信息。
Perl语言面试题1.问题:什么是Perl?答案:Perl是一种解释型、功能丰富的编程语言,它具有动态的特性,能够处理文本和数据,非常适合用于文本处理、系统管理、网络编程、数据库操作等任务。
2.问题:Perl的基本语法是什么?答案:Perl的基本语法包括变量声明、控制结构(如if、while等)、循环结构(如for、foreach等)、函数定义和调用等。
3.问题:在Perl中如何声明变量?答案:在Perl中,可以使用$符号来声明变量,例如$var = 10;。
4.问题:在Perl中如何进行字符串操作?答案:Perl提供了丰富的字符串操作函数,如substr、index、length、tr 等,可以进行字符串的切割、查找、替换等操作。
5.问题:在Perl中如何进行数组操作?答案:Perl支持数组操作,可以使用@符号来声明数组,并使用push、pop、shift、unshift等函数进行数组的添加、删除、移除等操作。
6.问题:在Perl中如何进行文件操作?答案:Perl提供了丰富的文件操作函数,如open、readline、readlines 等,可以进行文件的打开、读取、写入等操作。
7.问题:在Perl中如何进行正则表达式匹配?答案:Perl支持正则表达式匹配,可以使用正则表达式函数如qr()和m()来进行模式匹配和替换操作。
8.问题:在Perl中如何使用循环结构?答案:Perl支持多种循环结构,如for、foreach、while等,可以根据需要选择合适的循环结构进行迭代操作。
9.问题:在Perl中如何定义和使用函数?答案:在Perl中,可以使用sub关键字定义函数,并使用&符号调用函数。
函数可以接受参数并返回值。
10.问题:请举一个使用Perl进行文本处理的例子?答案:例如,使用Perl提取一个文本文件中的特定行,可以根据行号或关键字进行提取。
具体实现可以使用open函数打开文件,并使用readline或readlines函数逐行读取文件内容,根据条件筛选出需要的行。
汇编语言程序设计第四版【课后习题答案】--囮裑為檤第五章高级汇编语言程序设计5.1 条件表达式中逻辑与“&&”表示两者都为真,整个条件才为真,对于程序段:.if (X==5) && (ax!=bx)inc ax.endif请用转移指令实现上述分支结构,并比较汇编程序生成的代码序列。
解:cmp X, 5je abcjmp doneabc: cmp ax, bxjne cdejmp donecde: inc axdone:....5.2条件表达式中逻辑与“||”表示两者之一为真,整个条件就为真,对于程序段:.if (X==5) || (ax!=bx)inc ax.endif请用转移指令实现上述分支结构,并比较汇编程序生成的代码序列。
解:cmp X, 5je abcjmp donecmp ax, bxjne abcjmp doneabc: inc axdone: ....5.3、对于程序段:.while ax!=10mov [bx],axinc bxinc bxinc ax请用处理器指令实现上述循环结构,并比较汇编程序生成的代码序列。
5.4、对于程序段:.repeatmov [bx],axinc bxinc bxinc ax请用处理器指令实现上述循环结构,并比较汇编程序生成的代码序列。
5.5、宏是如何定义、调用和展开的?解:宏定义采用一对伪指令实现,格式如下(其中方括号表示可选):宏名macro [形参表]宏定义体endm宏调用时,利用宏名带上实参即可,格式如下:宏名[实参表]5.6、宏定义中的形式参数有什么特点,它是如何进行形参和实参结合的?解:宏的参数功能非常强大,即可以没有参数,也可以带有一个或多个参数;而且参数的形式非常灵活,可以是常量、变量、存储单元、指令或它们的一部分,还可以是表达式等。
宏展开时的形参与实参结合是用位置匹配的实参对形参进行取代。
实参个数与形参个数不同时,多余的实参没有作用,缺少的实参则用空格代替。
Perl语言入门(第四版)习题答案————————————————————————————————作者:————————————————————————————————日期:《Perl语言入门习题答案》2.12 练习1、写一个程序,计算半径为12.5的圆的周长。
圆周长等于2π(π约为3.1415926)乘以半径。
答案为78.5。
-----------------------/home/confish/perl/girth#!/usr/bin/perl -w#this program calculate a circle's girth#confish@ubuntu7.10$r=12.5;$g=12.5*2*3.1415;print "the girth of the circle is $g\n";-----------------------/home/confish/perl/girth2、修改上述程序,用户可以在程序运行时输入半径。
如果,用户输入12.5,则应得到和上题一样的结果。
-----------------------/home/confish/perl/girthpro#!/usr/bin/perl -w#a better one to calculate girth#confish@ubuntu7.10print"enter the radius of the circle\n";chomp($r=<STDIN>);if($r>0){print"the girth of the circle is ".$r*2*3.1415."\n";}else{print"nonavailable!\n";}-----------------------/home/confish/perl/girthpro3、修改上述程序,当用户输入小于0 的数字时,程序输出的周长为0,而非负数。
-----------------------/home/confish/perl/girthzero#!/usr/bin/perl -w#calculate the girth and print 0 when the radius is lower than 0#confish@ubuntu7.10print"enter the radius of the line\n";chomp($r=<STDIN>);if($r>0){print"the girth of the circle is $r*2*3.1415\n";}else{print"the girth of the circle is 0\n";}-----------------------/home/confish/perl/girthzero1、2、3:(一起实现的)#!/usr/bin/perl -w$pai=3.141592654;print "Please Input Radius:";$r=<STDIN>;if ( $r lt 0 ){print "The circumference is 0\n";}else{$l=$r*2*$pai;printf "The circumference is %.1f\n",$l;}4、写一个程序,用户能输入2 个数字(不在同一行)。
输出为这两个数的积。
-----------------------/home/confish/perl/product#!/usr/bin/perl -w#print the two number's product#confish@ubuntu7.10print"enter the two numbers:\n";chomp($m=<STDIN>);chomp($n=<STDIN>);print"the product of the two numbers are ".$m*$n."\n";-----------------------/home/confish/perl/product5、写一个程序,用户能输入1 个字符串和一个数字(n)(不在同一行)。
输出为,n 行这个字符串,1 次1 行(提示,使用“x”操作符)。
例如,如果用户输入的是“fred”和“3”,则输出为:3 行,每一行均为fred。
如果输入为“fred”和“299792”,则输出为299792 行,每一行均为fred-----------------------/home/confish/perl/printer#!/usr/bin/perl -w#print a string certain times depend on the usr's input#confish@ubuntu7.10print"enter a string and a number:\n";$str=<STDIN>;chomp($num=<STDIN>);print ${str}x$num;-----------------------/home/confish/perl/printer3.9 练习1、写一个程序,将一些字符串(不同的行)读入一个列表中,逆向输出它。
如果是从键盘输入的,那在Unix 系统中应当使用CTRL+D 表明end-of-file,在Windows 系统中使用CTRL+Z.------------------------------------/home/confish/reprint#!/usr/bin/perl -w#read some input and print them in reverse sequence#confish@ubuntu7.10print "enter the string please:\n";@str=reverse <STDIN>;print "\nthe reverse strings are:\n@str";------------------------------------/home/confish/reprint2、写一个程序,读入一串数字(一个数字一行),将和这些数字对应的人名(下面列出的)输出来。
(将下面的人名列表写入代码中)。
fred betty barney dino Wilma pebbles bamm-bamm 例如,当输入为1,2,4 和2,则输出的为fred, betty, dino, 和betty------------------------------------/home/confish/num_to_name#!/usr/bin/perl -w#read some numbers and output the match name#confish@ubuntu7.10$i=0;@names=qw /fred betty barney dino Wilma pebbles bamm-bamm/;print"enter the numbers please:\n";chomp(@nums=<STDIN>);foreach(@nums){@re=@names;while($i ne $_){$n=shift( @re);$i++;}$i=0;print $n,"\n";}------------------------------------/home/confish/num_to_name3、写一个程序,将一些字符串(在不同的行中)读入一个列表中。
然后按ASCII 顺序将它们输出来。
也就是说,当输入的字符串为fred, barney, wilma, betty,则输出为barney betty fred wilma。
分别在一行或不同的行将之输出。
------------------------------------/home/confish/sort_str#!/usr/bin/perl -w#read some strings and sort them in ASCII#confish@ubuntu7.10chomp(@str=sort<STDIN>);#@str=sort<STDIN>; will print them in diffrent linesprint @str,"\n";------------------------------------/home/confish/sort_str4.11练习1、写一个名为&total 的子程序,返回一列数字的和。
提示:子程序不应当有任何的I/O 操作;它处理调用的参数,返回处理后的值给调用者。
结合下面的程序来练习,它检测此子程序是否正常工作。
第一组数组之和25。
my @fred = qw{ 1 3 5 7 9 };my $fred_total = &total(@fred);print "The total of \@fred is $fred_total.\n";print "Enter some numbers on separate lines: ";my $user_total = &total(<STDIN>);print "The total of those numbers is $user_total.\n";--------------------------------/home/confish/perl/subr#!/usr/bin/perl -w#a subroutine named total returns sum of numbers#confish@ubuntu7.10sub total{foreach $n(0..$#_){$sum+=$_[$n];}$sum;}my@fred=qw{1 3 5 7 9};my $fred_total=&total(@fred);print"The total of \@fred is $fred_total.\n";print"Enter some numbers on separate lines:\n";my $user_total=&total(<STDIN>);print"The total of those numbers is $user_total.\n";--------------------------------/home/confish/perl/subr2、利用上题的子程序,写一个程序计算从1 到1000 的数字的和。