精华内容
下载资源
问答
  • R语言心得说:R语言之xlsx包读写Excel数据

    万次阅读 多人点赞 2019-06-14 17:24:31
    R语言心得说:R语言之xlsx包读写Excel数据 【基础】简单读取excel文件数据read.xlsx 【基础】简单写入数据到excel文件write.xlsx 【进阶】随心所欲读取excel中的各种信息createWorkbook、getSheet 【进阶】...

    感谢Adrian A. Drǎgulescu发布的xlsx包

    xlsx包提供了必要的工具来与Excel 2007进行交互。用户可以阅读和编写xlsx,并可以通过设置数据格式、字体、颜色和边框来控制电子表格的外观。设置打印区域,缩放控制,创建分割和冻结面板,添加页眉和页脚。包使用Apache POI项目中的java库。本篇主要分享利用xlsx工具包在读写xlsx过程中所碰到的问题及解决办法。

    工具准备

    强烈建议大家使用RStudio这个IDE,它是以今为止对R语言最友好的一个IDE之一,而且使用很方便。特别是在新包下载安装的时候,只需请求要安装的包名,RStudio会自动将关联的其他包也一并下载并安装。

    1. 安装R、安装RStudio;
    2. 一个简单的示例数据(本次以iris鸢尾花数据为例);
    3. 下载安装xlsx(Rstudio会同步下载并安装rJava, xlsxjars两个包);
    > # 下载并安装xlsx包
    > install.packages("xlsx")
    > library(xlsx)
    

    【基础】简单读取excel文件数据

    假如是csv或txt等文本类的数据文件,利用R内置函数read.csv()与read.table()就可读取(注意编码格式的参数设置)。Excel由于使用范围最广,很多问题不可避免,因此,xlsx包提供了专门读取xlsx的函数read.xlsx和read.xlsx2,为什么有两个呢?请看以下区别:

    函数 参数
    xlsx::read.xlsx() file, sheetIndex, sheetName=NULL, rowIndex=NULL,startRow=NULL,endRow=NULL, colIndex=NULL,as.data.frame=TRUE, header=TRUE, colClasses=NA,keepFormulas=FALSE, encoding=“unknown”, password=NULL, …
    xlsx::read.xlsx2() file, sheetIndex, sheetName=NULL, startRow=1,colIndex=NULL, endRow=NULL, as.data.frame=TRUE, header=TRUE,colClasses=“character”, password=NULL, …

    其实只是细微的差别,大家自己体会即可。下面给个参考案例:

    > # 指定file和sheetIndex(或sheetName),即可定位到相应的工作表
    > data1 <- read.xlsx("iris.xlsx",sheetIndex = 1)
    > head(data1)
    
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    5.1 3.5 1.4 0.2 setosa
    4.9 3.0 1.4 0.2 setosa
    4.7 3.2 1.3 0.2 setosa
    4.6 3.1 1.5 0.2 setosa
    5.0 3.6 1.4 0.2 setosa
    5.4 3.9 1.7 0.4 setosa

    【基础】简单写入数据到excel文件

    切莫用R内置函数read.csv()与read.table()去生成xlsx文件,会有你意想不到的麻烦,还是采用专业的包来解决问题吧。
    xlsx包同样提供了两个写入数据的函数write.xlsx()和write.xlsx2(),其中细微区别自行参透(注意参数 ...)。

    函数 参数
    xlsx::write.xlsx() x, file, sheetName=“Sheet1”, col.names=TRUE, row.names=TRUE, append=FALSE, showNA=TRUE, password=NULL
    xlsx::write.xlsx2() x, file, sheetName=“Sheet1”,col.names=TRUE, row.names=TRUE, append=FALSE, password=NULL, ...

    下面是参考案例:

    ># 指定x待写入数据,file生成的文件名,row.names为false则不生成行名,指定sheet工作表名为Sheet1
    >write.xlsx(iris, file = "iris.xlsx", row.names = FALSE, sheetName = "Sheet1")
    

    想必会有人在这里踩坑,大家应该注意到有一个append的参数,是否认为将其值设置为TRUE的话,就可以多次向表中写入数据?那就真踩坑了。查看xlsx包中的注释也很模糊:

    > # a logical value indicating if x should be appended to an existing file. 
    > # 翻译:一个逻辑值,指示是否应该将x附加到现有文件中。
    

    附加到现有文件中,实际上是增加新的sheet,而非在原有sheet工作表中继续增加数据。如需在同一个sheet工作表中多次增加数据,请继续往下看。

    【进阶】随心所欲读取excel中的各种信息

    随心所欲 一点不夸张,不仅可以取出excel中的数据,还能识别excel单元格的样式(包括颜色、字体、大小、标注、数据类型等等)。其原理与数据库有点相似,先是定义一个工作簿的对象,再基于工作簿定义里面的工作表,进而逐级查询。下面进行详细介绍:
    【样例数据】文件名:iris10.xlsx。
    样例数据

    • 声明一个工作簿对象
    > # loadWorkbook(file, password=NULL)    #用于声明一个工作簿对象
    > # 提醒:如果excel文件不在工作空间内,file最好指定为绝对路径
    > wb <- createWorkbook("iris10.xlsx")
    
    • 检索工作簿中的sheet
    > # sheets <- getSheets(wb)    #用于生成一个list对象,其中包含所有工作表的信息,数据类型为rJava::jobjRef,在此不深入讲解
    > sheets <- getSheets(wb)
    
    • 定位目标sheet
    > # 本例只有一个sheet,名称为“Sheet1”
    > sheet <- sheets[["Sheet1"]]    # sheet的数据类型为rJava::jobjRef
    
    • 读取数据【方法一】
      上面read.xlsx()方法能够将整个sheet工作表的数据读取出来,在这里提供另一种方法,不过相对麻烦一点,使用的是xlsx::readColumns()函数
    函数 参数
    xlsx::readColumns() sheet,startColumn,endColumn,startRow,endRow=NULL,as.data.frame=TRUE,header=TRUE, colClasses=NA, …
    xlsx::readRows() sheet, startRow, endRow, startColumn, endColumn=NULL

    xlsx::readRows()使用起来比较麻烦,不如xlsx::readColumns()好用,有兴趣的可自行研究一下。
    另外还有两个函数,用于定位表内数据第一行和最后一行的索引(这里与Java的性质一致,从0开始算起)

    函数 参数
    getFirstRowNum() 无参。该函数必须基于sheet对象
    getLastRowNum() 无参。该函数必须基于sheet对象

    下面以xlsx::readColumns()为例获取数据:

    > # 该函数必须提供数据的起始列索引值、终止列索引值、起始行索引值、终止行索引值;
    > dataTmp <- readColumns(sheet, startColumn = 1, endColumn = 10,
                           startRow = sheet$getFirstRowNum()+1, endRow = sheet$getLastRowNum()+1,
                           header = T, as.data.frame=TRUE)
    

    as.data.frame=TRUE决定了输出结果为一个数据框。
    缺点:在不清楚数据结构的情况下,首行和末行索引值可以求得,但列数一般难以确定,可能导致列缺失或生成多余的列

    • 读取数据【方法二】
      另一种方法相对【方法一】要好一点,先是将所有单元格的值获取出来,再生成数据框。(稍微复杂一点)
    函数 参数 注释
    xlsx::getRows() sheet, rowIndex=NULL 用于获取sheet的每一行数据,返回值list,数据类型为rJava::jobjRef
    xlsx::getCells() row, colIndex=NULL, simplify=TRUE 用于获取行内每个单元格的数据,返回值list,数据类型为rJava::jobjRef
    xlsx::getCellValue() cell, keepFormulas=FALSE, encoding=“unknown” 用于获取所有单元格的值,返回值list,数据类型为character,长度为数据表m*n

    注意:这里连同标题行也作为单元格数据一并获取,并且如果有null值的单元格,会跳过该单元格

    > # 获取cells进而获取values
    > cells <- sheet %>% getRows() %>% getCells()
    > values <- lapply(cells,getCellValue)
    

    values获取出来就如下面这个样子,你会发现value的名称向量,每个值都包含了所在单元格的x、y坐标值。
    values返回的所有值形成的列表

    > names(values)    #查看values的名称向量
     [1] "1.1"  "1.2"  "1.3"  "1.4"  "1.5"  "2.1"  "2.2"  "2.3"  "2.4"  "2.5"  "3.1"  "3.2"  "3.3"  "3.4"  "3.5"  "4.1" 
    [17] "4.2"  "4.3"  "4.4"  "4.5"  "5.1"  "5.2"  "5.3"  "5.4"  "5.5"  "6.1"  "6.2"  "6.3"  "6.4"  "6.5"  "7.1"  "7.2" 
    [33] "7.3"  "7.4"  "7.5"  "8.1"  "8.2"  "8.3"  "8.4"  "8.5"  "9.1"  "9.2"  "9.3"  "9.4"  "9.5"  "10.1" "10.2" "10.3"
    [49] "10.4" "10.5" "11.1" "11.2" "11.3" "11.4" "11.5"
    

    将这些坐标值拆分出来,作为等会重排数据的索引

    > addresses <- sapply(names(values),FUN = function(x) str_split(string = x,pattern = "[.]"))
    

    接下来就只需要将其进行重排,形成数据框即可。

    > datas.name <- vector(mode = "character")    #声明一个空的向量,用来存放标题
    > datas <- data.frame()    # 声明一个空的数据框,用来存放目标数据
    > # 用sapply代替for做循环,避免占用大量内存。同时注意sapply使用时的环境问题,用.GlobalEnv指向最外层环境的变量。
    > # 这里只对数据进行重排,无需进行计算,所以invisible不显示计算结果
    > invisible(sapply(addresses,FUN = function(x) {
    +   if (x[1] == "1") {
    +     .GlobalEnv$datas.name = c(.GlobalEnv$datas.name,.GlobalEnv$values[[1]])
    +     .GlobalEnv$values[[1]] <- NULL
    +   } else {
    +     .GlobalEnv$datas[x[1],x[2]] <- .GlobalEnv$values[[1]]
    +     .GlobalEnv$values[[1]] <- NULL
    +   }
    + }))
    > names(datas) <- datas.name    #最后在添加标题
    > View(datas)
    

    得到结果与原excel数据一致
    生成数据框
    获取单元格样式与获取数据的方式一致,这里不再增加过多篇幅讲解,只做简单介绍。以下函数按函数名字面理解。

    函数 参数
    xlsx::CellStyle() wb, dataFormat=NULL, alignment=NULL,border=NULL, fill=NULL, font=NULL, cellProtection=NULL
    xlsx::setCellStyle() cell, cellStyle
    xlsx::getCellStyle() cell
    xlsx::createCellComment() cell, string="", author=NULL, visible=TRUE
    getCellComment() cell
    removeCellComment() cell

    其他函数后续如有机会,再做详细介绍吧。

    【进阶】随心所欲将数据写入excel文件

    我想大家更想看到的就是这部分内容了。确实在日常处理数据时,将数据存储到excel中进行传递是常有的事,谁叫excel是微软亲生的呢。闲话少说,直入正题。
    前面基础篇通过write.xlsx()函数将数据写入excel文件中,同时指定sheet名称。但这种写入是一次性的,即一次写入多少就多少。在工作簿里面新增sheet工作表用append控制,但在同个sheet上继续写入数据,会报错:

    > write.xlsx(datas,file = "iris10.xlsx",sheetName = "Sheet1",row.names = F,append = T)
    Error in .jcall(wb, "Lorg/apache/poi/ss/usermodel/Sheet;", "createSheet",  : 
      java.lang.IllegalArgumentException: The workbook already contains a sheet of this name
    

    说是这个名称的sheet已经存在同名的了!

    这次我们采用高级一点的方法,跟前面进阶读取数据一样,先是定义一个工作簿的对象,再创建或加载sheet工作表。

    函数 参数 注释
    xlsx::createWorkbook() type=“xlsx” 用于生成一个新的excel工作簿
    xlsx::loadWorkbook() file, password=NULL 用于加载当前已存在的excel工作簿
    xlsx::saveWorkbook() wb, file, password=NULL 使用完必须保存工作簿
    xlsx::createSheet() wb, sheetName=“Sheet1” 用于生成一个新的sheet工作表
    xlsx::removeSheet() wb, sheetName=“Sheet1” 用于删除工作表
    xlsx::getSheets() wb 用于获取当前工作簿里的工作表清单,返回值是list
    xlsx::addDataFrame() x, sheet, col.names=TRUE, row.names=TRUE,startRow=1, 用于获取当前工作簿里的工作表清单,返回值是list
    (续上) startColumn=1,colStyle=NULL, colnamesStyle=NULL,rownamesStyle=NULL, showNA=FALSE, characterNA="", byrow=FALSE

    前面讲过如何加载已有工作簿,这里以生成新excel工作簿为例,将数据写入文件中

    > wb <- xlsx::createWorkbook()
    > sheets <- getSheet()
    # 新生成的工作簿没有sheet,系统提示:Workbook has no sheets!
    > sheet <- createSheet(wb,sheetName = "newSheet1")
    

    此时R内存中已经生成了一个工作簿,包含一个空的sheet工作表,通过addDataFrame()函数将数据写入sheet中.

    > # 用上面生成的datas数据框对象,取前4行数据写入当前sheet对象中
    > addDataFrame(data[1:4,],sheet,row.names = F)
    > saveWorkbook(wb,file = "iris_new.xlsx")
    
                                   ==记得保存工作簿、记得保存工作簿、记得保存工作簿==
    

    如果是在已有excel工作簿上操作,这里最好做一个判断,避免覆盖现有数据,造成不必要的麻烦。如果当前sheet的最后一行索引不等于零(说明有数据),则将新数据写到最后一行数据的下一行,同时不加入列名行(col.names = FALSE);如果为零则将数据直接添加到sheet中。

    > # 用上面生成的datas数据框对象,取前4行数据写入当前sheet对象中
    > if (sheet$getLastRowNum() != 0) {
    +          addDataFrame(data[1:4,],sheet,row.names = F,col.names = F,startRow = sheet$getLastRowNum() + 2)
    +        } else {
    +          addDataFrame(data[1:4,],sheet,row.names = F)
    +        }
    + }
    > saveWorkbook(wb,file = "iris_new.xlsx")
    

    至此,你应该知道如何在原有工作表基础上新增数据行了吧?多么方便!!
    如果要增加新的sheet工作表,只需将sheet重新定义一个新的sheetName即可。

    好了,在大家面前献丑了,感谢阅读!有疑问或想与我交流,可留言。

    附上一条小资料,纯当友情推广,共同进步:Read Excel files from R

    展开全文
  • 汇编语言实验+题目

    千次阅读 2019-05-27 16:41:52
    本学期汇编课程已经结束,整理一下曾经做过的题目过的汇编代码。 使用dosbox环境masm5.0编译器,debug方式可以看我这篇文章https://blog.csdn.net/qq_41420747/article/details/89419241 实验题 循环...

    汇编语言实验

    本学期汇编课程已经结束,整理一下曾经做过的题目和写过的汇编代码。

    使用dosbox环境masm5.0编译器,debug方式可以看我这篇文章https://blog.csdn.net/qq_41420747/article/details/89419241

     

    • 实验题

    循环程序设计

    1. 有一个首地址为Arr的N字数组,编程求数组中的最大值和最小值,并存入MAX和MIN地址单元中。

    Data segment
    	Arr dw 1H,3H,2H
    	N EQU 3 ; 这里可以 $-Arr / 2 因为dw 是双字节
    	Max dw ?
    	Min dw ?
    Data ends
    
    Code segment
    	Assume cs:Code, ds:Data
    
    Start:
    	mov ax,Data
    	mov ds,ax
    	
    	mov dx,Arr
    	mov ax,Arr
    
    	mov si,00H
    	mov cx,N-1
    NEXT:
    	add si,2
    	
    	cmp dx,Arr[si]
    	jle jmp1
    	mov dx,Arr[si]
    jmp1:	; do nothing 
    	
    	cmp ax,Arr[si]
    	jge jmp2
    	mov ax,Arr[si]
    jmp2:	; do nothing 
    LOOP NEXT
    
    	mov Max,dx
    	mov Min,ax
    	
    	MOV	AH,4CH    ;返回dos
        INT	21H
    
    Code ends
    	end Start
    

    调试结果:

    2. 显示一个十六进制数(XXXXH)

    思路:循环位移4位后,每次取出bx(存放16进制数)的低第四位,加上‘0’判断是否在0-9ascii码范围内在则直接打印不在则加7再打印,重复4次。最后打印一个’H’。测试数:1E2AH存入BX

    Code segment
    	assume cs:Code
    
    start:
    	mov ax,Code
    	mov ds,ax
    	
    	xor ax,ax; to 0
    	xor cx,cx; to 0
    	xor bx,bx; to 0
    	
    	mov bx,1E2AH
    	mov ch,4
    rotate:	
    	mov cl,4
    	rol bx,cl
    	mov al,bl
    	and al,0FH
    	add al,30H
    	cmp al,3aH
    	jl print
    	add al,7H
    	
    print:
    	mov dl,al
    	mov ah,2
    	int 21H
    	dec ch
    	jnz rotate
    
    	mov dl,'H'
    	mov ah,2
    	int 21H
    	
    	mov ah,4cH
    	int 21H
    Code ends
    	end start
    

    运行结果:

    3. 编制一个程序把BX寄存器内的二进制数用十进制的形式在屏幕上显示出来。

    思路: 将bx中的内容mov到ax,分别除10000,1000,100,10,将商放到data segment存起来,将余数放回ax继续除,直到余数为一位数,再将data segment的数顺序打印出来。

    Datas segment
    	decnum db 5 dup(?)
    Datas ends
    
    Code segment
    	assume cs:Code,ds:Datas
    
    start:
    	mov ax,Datas
    	mov ds,ax
    	
    	mov bx,0FFFFH ; 要转换的数
    	lea si,decnum
    	mov dx,0    ;dx一定要置零
    	mov ax,bx
    	
    	mov cx,10000
    	div cx
    	mov [si],al
    	inc si
    	mov ax,dx;把上一次运算的余数放入ax
    	
    	mov dx,0
    	mov cx,1000
    	div cx
    	mov [si],al
    	inc si
    	mov ax,dx
    	
    	mov dx,0
    	mov cx,100
    	div cx
    	mov [si],al
    	inc si
    	mov ax,dx
    	
    	mov dx,0
    	mov cx,10
    	div cx
    	mov [si],al
    	inc si
    	mov [si],dl
    	
    ;****循环打印data段数据 decnum****
    	lea si,decnum
    	mov cx,5
    next:
    	mov dx,[si]
    	add dx,'0'
    	mov ah,2
    	int 21H
    	inc si
    	loop next
    	
    	mov ah,4cH
    	int 21H
    
    Code ends
    	end start
    

    运行结果:

     

    调试

     

    分支程序设计

    1. 设有10个学生的成绩分别是76,69,84,90,73,88,99,63,100和80分。试编制一个程序统计60~69分,70~79分,80~89分,90~99分和100分的人数,分别存放到S6,S7,S8,S9和S10单元中。

    Datas segment
    	STU db 76,69,84,90,73,88,99,63,100,80
    	S6 db 0
    	S7 db 0
    	S8 db 0
    	S9 db 0
    	S10 db 0
    Datas ends 
     
    Code segment
    	assume ds:Datas,cs:Code
    start:
    	mov ax,Datas
    	mov ds,ax
    	
    	xor ax,ax
    	mov si,0
    	mov cx,10
    	
    next:
    	mov al,byte ptr [si]
    	
    	cmp ax,69
    	jg jmp1
    	add S6,1
    	jmp final
    jmp1:
    	cmp ax,79
    	jg jmp2
    	add S7,1
    	jmp final
    jmp2:
    	cmp ax,89
    	jg jmp3
    	add S8,1
    	jmp final
    jmp3:
    	cmp ax,99
    	jg jmp4
    	add S9,1
    	jmp final
    jmp4:
    	add S10,1
    	
    final:
    	inc si
    	loop next
    	
    	mov dl,S6
    	mov ah,2H
    	int 21H
    	mov dl,S7
    	mov ah,2H
    	int 21H
    	mov dl,S8
    	mov ah,2H
    	int 21H
    	mov dl,S9
    	mov ah,2H
    	int 21H
    	mov dl,S10
    	mov ah,2H
    	int 21H
    	
    	mov ah,4cH
    	int 21H
    	
    Code ends
    	end start
    

    运行结果:

     

    2. 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。

    Data segment
    	max_len db 100
    	real_len db ?
    	str1 db 100 dup('$')
    Data ends
    
    Code segment
    	assume cs:code,ds:data
    start:
    	mov ax,data
    	mov ds,ax
    
    	lea dx,max_len
    	mov ah,0AH
    	int 21H
    	
    	mov dl,0DH
    	mov ah,02H
    	int 21H
    	mov dl,0AH
    	mov ah,02H
    	int 21H
    	
    	; 字符大小写转换
    	xor cx,cx
    	
    	mov cl,real_len
    	mov si,0
    	
    lop:
    	mov bl,str1[si]
    	cmp bl,61H
    	jb ok
    	cmp bl,7AH
    	ja ok
    	sub bl,20H
    	mov str1[si],bl
    ok:
    	inc si
    	loop lop
    	
    	lea dx,str1
    	mov ah,09H
    	int 21H
    	
    	mov ah,4cH
    	int 21H
    
    Code ends
    end start

     运行结果:

     

    3. 以T为首地址定义10个带符号数(补码),将负数去掉,正数按原序排列,并显示正数。

    思路:如果一个长度为一个字节的十六进制数高位为大于9的数,那这个数就是负数,所以遍历整个数组,判断每个十六进制数的高位大小,跳过负数,输出正数。

    Data segment
    	num db 0AAH,01H,02H,0ABH,03H,04H,05H,06H,07H,0FFH
    	count db 10
    Data ends
    
    Code segment
    	assume cs:Code,ds:Data
    start:
    	mov ax,Data
    	mov ds,ax
    	
    	xor bl,bl
    	xor cx,cx	; to 0
    	mov cl,count
    	mov si,0
    	; 筛选正数并输出
    next:
    	mov bl,num[si]
    	rcl bl,1
    	jc lop
    	; output
    	; 十位
    	mov bl,num[si]
    	shr bl,1
    	shr bl,1
    	shr bl,1
    	shr bl,1
    	and bl,0FH
    	mov dl,bl
    	cmp dl,09H
    	ja big1
    	add dl,30H
    	jmp outt1
    big1:
    	add dl,36H
    outt1:
    	mov ah,02H
    	int 21H
    	; 个位
    	mov bl,num[si]
    	and bl,0FH
    	mov dl,bl
    	cmp dl,09H
    	ja big2
    	add dl,30H
    	jmp outt2
    big2:
    	add dl,36H
    outt2:
    	mov ah,02H
    	int 21H
    	; 输出H
    	mov dl,'H'
    	mov ah,02H
    	int 21H
    	
    lop:
    	inc si
    	loop next
    	
    	mov ah,4cH
    	int 21H
    
    Code ends 
    	end start
    

    运行结果:

     

    4. 试编写一个汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端显示与它等值的二进制数。

    code segment
       assume cs:code
    start:  
    mov bx,0
    mov ch,4
    mov cl,4
    s0:     
    mov ah,1          ;输入4个16进制数
    int 21h
    cmp al,39h        ;判断 0~9 or A~H
    jbe next
    sub al,07h
    next:    
    sub al,30h
    shl bx,cl
    add bl,al        
    dec ch
    jnz s0            
    mov cx,16	
    ;显示
    mov dl,0AH	;换行
    mov ah,02H
    int 21H
    s1:
    mov dl,0
    rol bx,1          ;最高位入CF
    adc dl,30h
    mov ah,02h
    int 21h
    loop s1
    mov ax,4c00h
    int 21h
    code ends
    	end start

    运行结果:

     

    5. 试编写一个程序,要求比较数组ARRAY中的三个16位补码数,并根据比较结果在终端上显示如下信息

    (1)如果三个数都不相等则显示0;

    (2)如果三个数有两个数相等则显示1;

    (3)如果三个数都相等,则显示2.

    Data segment
    
    ARRAY DW 1,2,3
    
    Data ends
    
    
    
    Code segment
    
        assume cs:Code,ds:Data
    
    
    
    Main PROC FAR
    
    start:
    
    MOV AX,DATA
    
    MOV DS,AX
    
    
    MOV AX,word ptr ARRAY
    
    MOV BX,word ptr ARRAY[2]
    
    
    CMP AX,word ptr ARRAY[2]; AB比较
    
    je AB_E
    
    CMP AX,word ptr ARRAY[4]; AC比较
    
    je AC_E
    
    CMP BX,word ptr ARRAY[4]; BC比较
    
    je BC_E
    
    MOV dl,30H
    
    JMP EXIT
    
    
    
    AB_E:
    
    CMP BX,word ptr ARRAY[4]; BC比较
    
    je BC_E2
    
    MOV dl,31H
    
    JMP EXIT
    
    
    
    AC_E:
    
    MOV dl,31H
    
    JMP EXIT
    
    
    BC_E:
    
    MOV dl,31H
    
    JMP EXIT
    
    
    
    BC_E2:
    
    MOV dl,32H
    
    JMP EXIT
    
    
    EXIT:
    
    MOV AH,2
    
    INT 21H
    
    MOV AH,4CH
    
        INT 21H
    
    
    
    Code ends 
    
    Main endp
    
        end start

     运行结果:

     

     

     

    子程序设计

    1. 求1+2+3+……n的和,并以十进制数形式显示此数。

    data segment
    	decnum db 5 dup(?)
    data ends
    
    code segment
    	assume cs:code,ds:data
    	
    main proc far
    
    start:
    	mov ax,data
    	mov ds,ax
    	
    	mov cx,20	;从1加到xxx 
    	
    	call sumfunc	;使用cx寄存器传参,bx存返回值
    	
    	call printfunc
    	
    	mov ah,4ch
    	int 21h
    	
    main endp
    
    sumfunc proc near
    	xor bx,bx
    	xor ax,ax
    lop:
    	add ax,1
    	add bx,ax
    	loop lop
    	ret
    sumfunc endp
    
    printfunc proc near
    	LEA  SI,DECNUM	;偏移地址传送
        MOV  DX,0  
        MOV  AX,BX
    	MOV  CX,10000
    	DIV  CX
    	MOV  [SI],AL	;求得万位的值,存入指定单元
        INC  SI
    	MOV  AX,DX 	;上次计算的余数存在DX中
    	MOV  DX,0
    	MOV  CX,1000				
    	DIV  CX
    	MOV  [SI],AL	;求得千位的值,存入指定单元
        INC  SI
    	MOV  AX,DX
    	MOV  DX,0
    	MOV  CX,100
    	DIV  CX
    	MOV  [SI],AL	;求得百位的值,存入指定单元
        INC  SI
    	MOV  AX,DX
    	MOV  CL,10
    	DIV  CL
    	MOV  [SI],AL	;求得十位的值,存入指定单元
        INC  SI
    	MOV  [SI],AH	;存个位的值
    	LEA  SI,DECNUM
       ;开始显示存储单元中的十进制数
    	MOV  CX,5
    DISP:	
    	MOV	DL,[SI]	;依次取出十进制数各位的值
    	OR  DL,30H	;将取出的值转换为ASCII值
    	MOV  AH,2
    	INT  21H		;利用DOS功能调用,显示
    	INC  SI
    	LOOP  DISP
        MOV  DL,'D'
    	MOV  AH,2
    	INT  21H
    	ret
    printfunc endp
    
    code ends
    	end start
    

    运行结果:

     

    2. 从键盘输入一个十进制数然后以十六进制输出

    DATA SEGMENT
    	NUM10 DB 5;定义缓冲区长度
    		  DB ?;实际输入字符个数的计数单元
    		  DB 5 DUP(0)
    		  
    	NUM16 DB 4 DUP(?)
    	ENDSING DB '$'
    DATA ENDS
    
    CODE SEGMENT
    	ASSUME DS:DATA,CS:CODE
    	
    MAIN PROC FAR
    	
    START:
    	MOV AX,DATA
    	MOV DS,AX
    	
    	CALL INPUT
    	CALL TURN
    	CALL PRINT16
    	
    	MOV AH,4CH	;返回dos
    	INT 21H
    	
    MAIN ENDP
    
    TURN PROC NEAR
    	XOR BX,BX
    	XOR AX,AX
    	XOR CX,CX
    	MOV CL,BYTE PTR [NUM10+1]
    	MOV SI,2
    	MOV DI,0AH
    LOP1:
    	MUL DI
    	MOV BL,BYTE PTR NUM10[SI]
    	SUB BL,30H
    	ADD AX,BX
    	INC SI
    	LOOP LOP1
    	;到这里ax存了输入的数
    	;接下来转换16进制存入num16地址单元
    	MOV CL,04H
    	MOV CH,04H
    	MOV SI,0
    LOP2:
    	XOR BX,BX	;清空bx
    	;位移ax
    	ROL AX,CL
    	MOV BL,AL
    	AND BL,0FH
    	CMP BL,09H
    	JA ZIMU
    
    CONTI:
    	ADD BL,30H
    	MOV NUM16[SI],BL	;储存
    	INC SI
    	DEC CH
    	JNZ LOP2
    	RET					;循环结束推出子程序
    
    ZIMU:				;转字母
    	ADD BL,07H
    	JMP CONTI
    	
    TURN ENDP
    
    INPUT PROC NEAR
    	LEA DX,NUM10
    	MOV AH,0AH
    	INT 21H
    	RET
    INPUT ENDP
    
    PRINT16 PROC NEAR
    	MOV AH,02H
    	MOV DL,0DH	;回车
    	INT 21H
    	MOV AH,02H
    	MOV DL,0AH	;换行
    	INT 21H
    	
    	LEA DX,NUM16
    	MOV AH,09H
    	INT 21H
    	MOV AH,02H
    	MOV DL,'H'	;'H'
    	INT 21H
    	RET
    PRINT16 ENDP
    
    CODE ENDS
    	END START
    

    运行结果:

     

    • 练习题目

    这里我就不分章节了,只记录一些比较难懂的题目。

    1. 在汇编语言程序中,对END语句的叙述正确的是(  C  )。

    A、END语句是一可执行语句
    B、END语句表示程序执行到此结束
    C、END语句表示源程序到此结束
    D、END语句在汇编后要产生机器码

    2. 假设OP1,OP2是已经用DB定义的变量,判断指令格式是否正确

    CMP 15, BX (x)

    CMP OP1, OP2(x)
    CMP AX, OP1(x)
    CMP OP1, 25(√)

    3. 假设VAR1和VAR2为字变量,LAB为标号

    JMP LAB [SI](x)

    JNZ VAR1(x)

     

    4. 语句LENGTH=SIZE*TYPE是合法的。(x)

     

    5. 指出下列指令的错误原因,假设下列指令中的所有标识符均为类型属性为字的变量

    (1) MOV AH, BX 

    数据类型不一致

    (2) MOV AX, [SI][DI]

    只有变址+基址寻址方式,没有变址+变址寻址方式

    (3) MOV BYTE PTR [BX], 1000 

    立即数和指定的操作数类型不一致,指定为字节操作,1000为字类型

    (4) MOV CS, AX 

    CS代码段寄存器,该寄存器只能由系统管理

    (5) MOV WORD_OP1, WORD_OP2

    不允许两个内存单元直接传递数据

    (6) MOV AX, WORD_OP1+WORD_OP2

    两个内存单元地址相加没有意义

    (7) SUB [BX],2

    未指定数据类型


    6. 8086/8088系统中,存储器是分段组织的,存储器物理地址计算式是( B  )

    A、段地址+偏移地址
    B、段地址*10H+偏移地址
    C、段地址*16H+偏移地址
    D、段地址+10H*偏移地址


    7. 溢出标志可以用来判断运算的结果是否产生溢出。(X)

    溢出标志指CF标志位,但是有些运算不是靠CF标志溢出

     

    8. 对于有符号的数来说,下列哪个值最大(D )

    A、0F8H
    B、11010011B
    C、82
    D、123Q

    AB是负数,对于A第一个0是因为汇编中的16进制不允许用字母开头,故A其实就是F8H。

     

     

    展开全文
  • 1、SQL语言是 的语言,易学习。  A.过程化 B.非过程化 C.格式化 D.导航式 【答案:】B 2、SQL语言是 语言。  A.层次数据库 B.网络数据库 C.关系数据库 D.非数据库 【答案:】C 3、SQL语言具有...

    一、选择题

    1、SQL语言是     的语言,易学习。

     A.过程化 B.非过程化 C.格式化 D.导航式

    【答案:】B

    2、SQL语言是     语言。

     A.层次数据库 B.网络数据库 C.关系数据库 D.非数据库

    【答案:】C

    3、SQL语言具有     的功能。

     A.关系规范化、数据操纵、数据控制 B.数据定义、数据操纵、数据控制

     C.数据定义、关系规范化、数据控制 D.数据定义、关系规范化、数据操纵

    【答案:】B

    4、SQL语言具有两种使用方式,分别称为交互式SQL和     

     A.提示式SQL B.多用户SQL C.嵌入式SQL D.解释式SQL

    【答案:】C

    5、假定学生关系是S(S#,SNAME,SEX,AGE),课程关系是C(C#,CNAME,TEACHER),学生选课关系是SC(S#,C#,GRADE)。 要查找选修“COMPUTER”课程的“女”学生姓名,将涉及到关系   

     A.S  B.SC,C  C.S,SC  D.S,C,SC

    【答案:】D

    6、如下面的数据库的表中,若职工表的主关键字是职工号,部门表的主关键字是部门号,SQL操作     不能执行

     A.从职工表中删除行(‘025’,‘王芳’,‘03’,720) B.将行(‘005,’,‘乔兴’,‘04’,750)插入到职工表中

     C.将职工号为,‘001’的工资改为700 D.将职工号为,’038’的部门号改为‘03’      

    【答案:】B

    7、若用如下的SQL语句创建一个student表:

     CREATE TABLE student(NO C(4) NOT NULL

     NAME C(8) NOT NULL

     SEX C(2),

     AGE N(2))

     可以插入到student表中的是     

    A.(‘1031’,‘曾华’,男,23)  B.(‘1031’,‘曾华’,NULL,NULL)

     C.(NULL,‘曾华’,‘男’,‘23’) D.(‘1031’,NULL,‘男’,23)           

    【答案:】B

    第8到第11题基于这样的三个表即学生表S、课程表C和学生选课表SC,它们的结构如下:

     S(S#,SN,SEX,AGE,DEPT)

     C(C#,CN)

     SC(S#,C#,GRADE)

    其中:S#为学号,SN为姓名,SEX为性别,AGE为年龄,DEPT为系别,C#为课程号,CN为课程名,GRADE为成绩。

    8、检索所有比“王华”年龄大的学生姓名、年龄和性别。正确的SELECT语句是     

     A.SELECT SN,AGE,SEX FROM S

      WHERE AGE>(SELECT AGE FROM S

         WHERE SN=“王华”)

     B.SELECT SN,AGE,SEX  FROM S

      WHERE SN=“王华”

     C.SELECT SN,AGE,SEX FROM S

    WHERE AGE>(SELECT AGE

       WHERE SN=“王华”)

     D.SELECT SN,AGE,SEX FROM S

       WHERE AGE>王华.AGE

     

    【答案:】A

    9、检索选修课程“C2”的学生中成绩最高的学生的学号,正确的SELECT语句是   

     

     A.SELECT S# FORM SC WHERE C#=“C2” AND GRAD>=

        (SELECT GRADE FORM SC

        WHERE C#=“C2”)

     B.SELECT S# FORM SC

       WHERE C#=“C2” AND GRADE IN

        (SELECT GRADE FORM SC

         WHERE C#=“C2”)

     C.SELECT S# FORM SC

       WHERE C#=“C2” AND GRADE NOT IN

        (SELECT GRADE FORM SC

         WHERE C#=“C2”)

     D.SELECT S# FORM SC

       WHERE C#=“C2” AND GRADE>=ALL

       (SELECT GRADE FORM SC

        WHERE C#=“C2”)

     

     

    【答案:】D

    10、检索学生姓名及其所选修课程的课程号和成绩。正确的SELECT语句是   

     

     

     A.SELECT S.SN,SC.C#,SC.GRADE

       FROM S

       WHERE S.S#=SC.S#

     B.SELECT S.SN,SC.C#,SC.GRADE

       FROM SC

       WHERE S.S#=SC.GRADE

     C.SELECT S.SN,SC.C#,SC.GRADE

       FROM S,SC

       WHERE S.S#=SC.S#

     D.SELECT S.SN,SC.C#,SC.GRADE

       FROM S.SC

     

     

    【答案:】C

    11、检索选修四门以上课程的学生总成绩(不统计不及格的课程),并要求按总成绩的降序排列出来

    正确的SELECT语句是   

     A.SELECT S#,SUM(GRADE)FROM SC

      WHERE GRADE>=60

      GROUP BY S#

      ORDER BY 2 DESC

      HAVING COUNT(*)>=4 WHERE C#=“C2” AND GRADE>=

        (SELECT GRADE FORM SC

        WHERE C#=“C2”)

     B.SELECT S# FORM SC

       WHERE C#=“C2” AND GRADE IN

       (SELECT GRADE FORM SC

       WHERE C#=“C2”)

    C.SELECT S# FORM SC

       WHERE C#=“C2” AND GRADE NOT IN

       (SELECT GRADE FORM SC

       WHERE C#=“C2”)

     D.SELECT S# FORM SC

       WHERE C#=“C2” AND GRADE>=ALL

       (SELECT GRADE FORM SC

       WHERE C#=“C2”)

     

     

    【答案:】D

    二、填空题

    1、SQL是 结构化查询语言     

    【答案:】结构化查询语言

    2、视图是一个虚表,它是从 ① 中导出的表。在数据库中,只存放视图的 ② ,不存放视图的 ③

    【答案:】①一个或几个基本表 ②定义 ③视图对应的数据

    3、设有如下关系表R:

     R(No,NAME,SEX,AGE,CLASS)

     主关键字是NO

    其中NO为学号,NAME为姓名,SEX为性别,AGE为年龄,CLASS为班号。

    写出实现下列功能的SQL语句。

     ①插入一个记录(25,“李明”,“男”,21,“95031”);    

     ②插入“95031”班学号为30、姓名为“郑和”的学生记录;    

     ③将学号为10的学生姓名改为“王华”;    

     ④将所有“95101”班号改为“95091”;    

     ⑤删除学号为20的学生记录;    

     ⑥删除姓“王”的学生记录;    

    【答案:】

    INSERT INTO R VALUES(25,“李明”,“男”,21,“95031”)

    INSERT INTO R(NO,NAME,CLASS) VALUES(30,“郑和”,“95031”)

    UPDATE R SET NAME=“王华”WHERE NO=10

    UPDATE R SET CLASS=“95091”WHERE CLASS=“95101”

    DELETE FROM R WHERE NO=20

    DELETE FROMR WHERE NAME LIKE“王%”

    展开全文
  • r语言以下题目如何用k-means算法实现,本人刚开始学,所以希望能说下具体怎么,各个参数代表什么意义,谢谢解答
  • C语言学完不出程序怎么办?

    千次阅读 多人点赞 2018-03-29 10:39:35
    相信很多学完以及正在学一门编程语言的同学,都可能会有这样的经历和问题,在学完一门课程比如C语言之后,当我们提起一个知识点(如三目运算符,指针、水仙花数、二维数组、位运算)的时候很熟悉又很陌生,熟悉的是...

    相信很多学完以及正在学一门编程语言的同学,都可能会有这样的经历和问题,在学完一门课程比如C语言之后,当我们提起一个知识点(如三目运算符,指针、水仙花数、二维数组、位运算)的时候很熟悉又很陌生,熟悉的是老师好像讲过,我也在书上看到过。陌生的是清楚自己并不会用,也写不出来。如果有这样的感觉,那么被提到的这个知识点,一定是没有亲自上机敲代码学习验证的,也就是典型的理论派、动手不足的表现。相对学完英语不会说的“哑巴英语”,大家可以理解为这种现象是“残疾程序员” 不知道这个比喻大家能否意会。

    这里写图片描述

    如果大家有这样的”症状”,那么无论是参加求职面试、考研、竞赛等有上机环节的部分,可能都会被严重打脸。

    那么今天,我们指出这种学习问题的存在,相应也给大家提出解决办法。就是做题,借助OJ实时评测

    这里写图片描述

    在线提交代码,OJ系统实时评测反馈

    比如我们在学完C语言基础语法之后,我们就可以找这类型基础的题

    这里写图片描述
    可以按照题目难度和分类选择题型

    每道题目点进去都可以在线提交代码,系统会实时评测,瞬间给你反馈告诉你对还是错,让你巩固上机能力,拒绝理论派!

    这里写图片描述
    每道题页面下方都有提交入口
    当然OJ系统很多,大多英文,题也很多。要选择适合自己的才行。

    这里推荐大家一个轻量级的中文OJC语言网www.dotcpp.com

    里面的题目中文为主,并且难度偏低,非常适合新手练习,以及蓝桥杯和ACM入门训练,C语言、C++、java都支持哦是学习编程绝佳的练习场。大家PC端进入后注册账号即可做题,不会的题还有题解解释,自己还可以分享自己的经验。对于正在学编程的同学提升会非常大!

    除此之外,网站每月还有有奖比赛和各种比赛活动!

    大家赶紧收藏这个网站吧www.dotcpp.com

    PS:有知道这个域名什么意思的吗,可以留言给小编哦!

    展开全文
  • 另:当该字母没有在字符串中没有出现时,输出0。符串初学汇编语言,求教
  • 关于Prolog编程语言

    千次阅读 2016-07-14 10:25:41
    在前面:  很久之前我曾经用java和c#实现逻辑语句的自动推理。当时,对整个计算机编程语言的发展历史并不清楚,也不知道曾经出现过哪些牛掰的语言以及对某些特定领域的影响。还曾经妄想,自己搞个编译器,发明...
  • 一个函数计算当参数n(n很大)时的值 1-2+3-4+5-6+7……+n。 long fn(long n) { if(n ) { exit(1); } return (n / 2) * (-1);
  • 魔王语言解释题目的解答

    千次阅读 2008-06-01 16:04:00
    魔王语言解释问题描述有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没有人能听懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的...试一个魔王语言的解释系统,把他的话解释成人能听得懂的话;基本
  • Java、Python、C++等各种语言写爬虫

    千次阅读 2018-05-03 19:54:36
    #之所以会想起这个问题,是和室友聊到了爬虫,他习惯Java,而我习惯...千万别以为只有Python/Java可以爬虫,或者一提到爬虫想到的只有Python,实际上现在可以爬虫的语言非常多,比如c++、python、erlang、scal...
  • 题目要求是:第一个字符串要求全部大写,第二个要求全部小写 我和书上的一样,前几天也对着,现在什么不对了呢? ``` assume cs:codesg,ds:datasg datasg segment db 'BaSic' db 'iNfOrMaTiOn' datasg ...
  • 关于R语言

    千次阅读 2014-01-12 21:19:42
    mgp:设置坐标轴的边界宽度,取值长度3的数值向量,分别表示坐标轴标题,坐标轴刻度线标签和坐标轴的边界宽度,默认c(3,1,0 )表示坐标轴标题、坐标轴刻度线标签和坐标轴线离作图区域的距离分别3、1、0;...
  • 什么我说Rust是靠谱的编程语言

    万次阅读 多人点赞 2015-05-16 02:59:21
    序言:本文试图帮您解答“我要不要(投入大量时间和...为写成本文,作者Liigo不惜“卧底”Rust“老巢”长达一年多,收集整理总结了大量信息。如果嫌长,可以只看小标题,粗略浏览一番。2016年2月22日修订和增补此文。
  • 【单片机】求用汇编语言写

    千次阅读 2016-01-25 12:11:40
    【单片机】求用汇编语言写题目链接:http://zhidao.baidu.com/question/1796366779473092307.html--------是思考题。这样的题目,要考虑一些技巧。动一动脑子,不能直来直去的编。特别是第三题,是已知...
  • R语言题目及答案(1)

    千次阅读 多人点赞 2020-12-18 15:19:10
    R语言基础例题和参考答案 1、 animation是由谢益辉建立的概率统计动态演示程序包, 请用命令或菜单的方法安装并加载animation, 并尝试下面的二个例子: (1) 蒲丰投针试验: buffon.needle(nmax = 500, interval = 0) ...
  • 汇编语言之大小转换

    千次阅读 2018-06-05 19:15:05
    欢迎关注博主的公众号:薛定谔的小鱼儿将datasg中的第一个字符转换大写,第二个字符转换小写assume cs:codesg,ds:datasgdatasg segment db 'BsSIc' db 'iNFOrMAtiOn'datasg endscodesg segment start: mov ax...
  • 用51单片机汇编语言一个60s倒计时的程序

    万次阅读 多人点赞 2016-01-25 11:49:00
    出一个60s倒计时的汇编语言,不要用C语言,用汇编语言。再设置一个按键,按一下,停止倒计时,再按一下,恢复倒计时。;---------------------------------------;假设系统晶振 12MHz;显示电路可见:...
  • 各位大神,求用TCL语言写个程序:计算两个字符串的最大公共字串的长度,字符不区分大小
  • 什么要学习Go语言

    千次阅读 2017-01-17 10:01:18
    因此,我开始学习了一段时间Golang,在这里我将告诉你什么你也应该学习这种新语言。 在本文里我不会告诉你怎么hello world。 我要分析计算机硬件软件的当前阶段,以解释什么我们需要像Go这样的新语言? 硬件...
  • 什么要用Go语言

    千次阅读 2020-04-07 12:49:07
    “我什么要用Go语言?” 为了回答这个问题,我翻阅了很多Go语言相关的文档、书籍和教程,**我发现我很难在它们之中找到非常明显直接的答案**,书上和教程只会说,“是的,Go语言好用”。 对于部分人来说,这个问题...
  • 《Python语言程序设计》测验题目

    万次阅读 2018-05-09 22:13:44
    Python语言程序设计测验题目 Python语言程序设计测验题目 测验1: Python快速入门 (第2周) 程序设计题(一) 祖国的问候 程序设计题(二) 热量转换 I* 测验1: Python快速入门 (第2周) 程序设计题...
  • R语言中画图时我们常常要设定标题。如果图片标题是固定则很容易操作,但是如果我们想引用其他值放到标题里,则需要运用bquote函数。 What we want: 在图片标题"This is figure i",这里 i 是我前面求出来的一个...
  • Go 语言实战

    千次阅读 2018-04-12 10:41:40
    内容介绍 Go 是一门开源的编程语言,目的在于降低构建简单、可靠、高效软件的门槛。尽管这门语言借鉴了很多其他语言的思想,但是凭借自身统一和自然的...使用 Go 语言,可以得更少,做得更多。 本书是给已经有...
  • 昨天也是刚刚完了关于Java中的各种基础语言要素的总结,总觉得少了点什么。 对基础语言要素的理解和使用,实际上是很重要的。 俗话说,一切伟大的行动和思想,都源于一个微不足道的开始。 而对于一门语言来...
  • 最近要毕业论文了 ,然而题目还没有,所以求各位大神帮帮忙 想个比较新颖、实现起来简单的基于java的毕业设计题目 由于c币很少 悬赏不了太多啊 大神们帮帮忙啊 谢谢了先
  • 刚学了html语言,学了一种能够使二级菜单栏隐藏,在鼠标滑到一级菜单栏时,又将二级菜单栏显示出来的方法,这种方法可以时网页生动灵活,非常简洁,所以想下来。 下面贴上代码: 菜单栏 .sub_menue { display:...
  • 今天一道题目,很简单,让我从8个数中找出最大值和最小值,并转化16进制进行输出。在转化16进制的时候,想着每4位二进制我就调用一次子程序进行转化,然后压栈保存起来,再继续调用子程序,直到转化完毕。但有一...
  • 题目要求 将datasg中的第一个字符串转化大写,第二个字符串转化小写 题目分析 注意:用al存放ascii即可 大写对应的ascii第五位是0,除了第五位以外不变 小写对应的ascii第五位是1,除了第五位以外不变 执行过程 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 256,740
精华内容 102,696
关键字:

关于语言为标题怎么写