lisp几种数组定义较全

合集下载

数组的三种定义方式

数组的三种定义方式

数组的三种定义方式数组是一种常见的数据结构,它可以将多个相同类型的数据元素组合在一起,方便对它们进行操作。

在C++语言中,数组有三种定义方式:静态定义、动态定义和初始化定义。

1. 静态定义静态定义是最基本的数组定义方式,它需要在程序中明确指定数组的大小和类型。

静态定义的数组在编译时就会分配好内存,因此其大小是固定不变的。

例如:int arr[10]; // 定义一个包含10个int类型元素的数组这里我们定义了一个包含10个int类型元素的数组arr。

由于没有对其进行初始化,因此所有元素都会被默认初始化为0。

2. 动态定义动态定义是在程序运行时根据需要动态地分配内存空间来创建数组。

与静态定义不同,动态定义可以根据实际情况调整数组大小,因此更加灵活。

例如:int n;cin >> n;int *arr = new int[n]; // 动态分配n个int类型元素的空间这里我们先从用户输入中获取了一个整数n,然后使用new运算符动态地分配了n个int类型元素的空间,并将其赋值给指针变量arr。

注意,在使用完该数组后需要使用delete[]运算符释放该空间。

3. 初始化定义初始化定义是在创建数组时同时对其进行初始化的方式。

这种定义方式可以方便地对数组进行赋值,避免了在使用前需要手动初始化的问题。

例如:int arr[] = {1, 2, 3, 4}; // 定义一个包含4个元素的int类型数组,并初始化为{1, 2, 3, 4}这里我们定义了一个包含4个元素的int类型数组arr,并将其初始化为{1, 2, 3, 4}。

注意,在使用该方式定义数组时,可以省略数组大小,编译器会自动根据初始值推导出数组大小。

总结以上就是C++中定义数组的三种方式:静态定义、动态定义和初始化定义。

不同的定义方式适用于不同的场景,我们需要根据具体情况选择合适的方式来创建数组。

同时,在使用完动态分配的数组后需要及时释放空间,以避免内存泄漏问题。

c语言字符串数组定义的几种方式

c语言字符串数组定义的几种方式

C语言中,字符串数组是一个很常见的数据类型。

在定义字符串数组的过程中,有几种方式可以使用,每种方式都有其特点和适用场景。

接下来,我将从浅入深地介绍这几种方式,并对其进行全面评估。

1. 使用字符数组来定义字符串数组在C语言中,可以使用字符数组来定义字符串数组。

例如:```char strArray[3][20] = {"hello", "world", "c语言"};```这种方式是最基础的定义字符串数组的方法。

它的优点是简单直接,容易理解和使用,适用于简单的场景。

但缺点是不够灵活,每个字符串的长度都是固定的,不能动态调整。

2. 使用指针数组来定义字符串数组除了使用字符数组,还可以使用指针数组来定义字符串数组。

例如:```char *strArray[3] = {"hello", "world", "c语言"};```这种方式相比于字符数组更加灵活,每个字符串的长度可以动态调整。

但要注意的是,需要手动管理每个字符串的内存空间,避免出现内存泄漏等问题。

3. 动态分配内存来定义字符串数组另一种方式是动态分配内存来定义字符串数组。

这种方式可以在运行时动态申请和释放内存,非常灵活。

例如:```char **strArray;strArray = (char **)malloc(3 * sizeof(char *));for (int i = 0; i < 3; i++) {strArray[i] = (char *)malloc(20 * sizeof(char));}strcpy(strArray[0], "hello");strcpy(strArray[1], "world");strcpy(strArray[2], "c语言");```这种方式虽然灵活,但需要手动管理内存,容易出现内存泄漏和指针错误等问题,需要谨慎使用。

LISP基础

LISP基础

Lisp基础这是一个原子,最简单的Lisp形式:11这是另一个原子,一个字符串:1"a"这是一个空列表:()这是一个包含了一个原子的列表:1(1)这是一个包含了两个原子的列表:1(12)这是一个包含了一个原子和另一个列表的列表:1(1(2))这是一个函数调用。

函数调用由一个列表组成,列表的第一个元素是要调用的函数,其余的元素是函数的参数。

函数first接受一个参数(12),返回1。

1 2 3(first(12)) =>1这是一个lambda表达式,即一个函数定义。

这个函数接受一个参数x,然后原样返回它。

1 2(lambda(x) x)这是一个lambda调用。

lambda调用由一个列表组成,列表的第一个元素是一个lambda表达式,其余的元素是由lambda表达式所定义的函数的参数。

这个lambda表达式接受一个参数"lisp"并返回它。

1 2 3 4 5((lambda(x)x) "Lisp")=>"Lisp"Little Lisp是如何运行的写一个Lisp 解释器真的很容易。

Little Lisp 的代码包括两部分:分析器和解释器分析器分析分两个阶段:分词(tokenizing)和加括号(parenthesizing)。

tokenize()接受一个Lisp 字符串,在每个括号周围加上空格,然后用空格作为分隔符拆分整个字符串。

举个例子,它接受((lambda (x)x)"Lisp"),将它变换为((lambda (x )x )"Lisp"),然后进一步变换为['(','(','lambda','(','x',')','x',')','"Lisp"',')']。

c语言字符串数组定义的几种方式

c语言字符串数组定义的几种方式

C语言是一种被广泛应用于系统编程和嵌入式开发的编程语言,而字符串则是C语言中非常常见的数据类型。

在C语言中,字符串可以用字符数组来表示,而定义字符串数组的方式也有几种不同的方法。

1. 直接定义字符串数组直接定义字符串数组是最简单直接的方式,可以像定义其他数组一样来定义字符串数组。

例如:```Cchar strArray1[3][10] = {"Hello", "World", "C"};```在这个例子中,我们定义了一个包含3个字符串的数组,每个字符串的最大长度为10个字符。

通过直接赋值的方式,我们可以初始化这个字符串数组。

2. 逐个赋值如果不想在定义字符串数组的同时进行初始化,也可以通过逐个赋值的方式来初始化字符串数组。

例如:```Cchar strArray2[3][10];strcpy(strArray2[0], "Hello");strcpy(strArray2[1], "World");strcpy(strArray2[2], "C");```通过逐个赋值的方式,我们可以在定义之后再对字符串数组进行赋值操作。

3. 使用指针数组除了以上两种方式之外,还可以使用指针数组来表示字符串数组。

例如:```Cchar *strArray3[3] = {"Hello", "World", "C"};```在这个例子中,我们定义了一个包含3个指针的数组,每个指针指向一个字符串常量。

通过使用指针数组的方式,我们可以更加灵活地管理字符串数组。

总结回顾:通过以上几种方式的讨论,我们可以看到在C语言中定义字符串数组有多种灵活的方式。

无论是直接定义、逐个赋值还是使用指针数组,都可以让我们在不同场景下更好地处理字符串数组。

在实际的编程过程中,我们可以根据具体情况来选择合适的方式来定义字符串数组。

perl数组定义

perl数组定义

perl数组定义
在Perl中,你可以使用数组来存储一系列的值。

下面是一些定义和使用
Perl数组的示例:
1. 定义数组:
```perl
my array = (1, 2, 3, 4, 5);
```
在这个例子中,我们使用`my`关键字来声明一个名为`array`的数组,并使用括号`()`来初始化它。

你可以将任何值放在括号内,每个值之间用逗号分隔。

2. 访问数组元素:
要访问数组中的特定元素,你可以使用索引。

索引从0开始计数。

例如,要访问第一个元素,可以使用以下语法:
```perl
my $first_element = $array[0];
```
这将把第一个元素的值赋给变量`$first_element`。

3. 修改数组元素:
你也可以修改数组中的元素。

例如,要将第一个元素修改为10,可以使用以下语法:
```perl
$array[0] = 10;
```
这将把第一个元素的值更改为10。

4. 添加和删除数组元素:
要在数组末尾添加一个新元素,可以使用`push`函数:
```perl
push array, 6; 在数组末尾添加6
```
要从数组中删除最后一个元素,可以使用`pop`函数:
```perl
pop array; 删除数组末尾的元素
```
这只是Perl数组的一些基本用法示例。

Perl提供了许多其他功能和操作来处理和操作数组,你可以查阅Perl文档以获取更多详细信息。

(完整word版)LISP函数(分类)大全

(完整word版)LISP函数(分类)大全

AutoLisp函数一、数学运算功能函数1.l(十数值数值…)返回:累计实数或整数数值1.2(一数值数值…)返回:差值1.3(*数值数值…)返回:所有数值乘积1.4(/ 数值数值…)返回:第一个数值除以第二个以后数值的商 1.5(l十数值)返回:数值十ll. 6(1—数值)返回:数值一ll.7(abs 数值)返回:数值的绝对值1.8(atan 数值)返回:反正切值1.9(cos 角度)返回:角度的余弦值,角度值为弧度1.10(exp 数值)返回:数值的指数1.11(expt 底数指数)返回:底数的指数值1.12(fix 数值)返回:将数值转换为整数值1.14(gcd 数值1 数值2)返回:两数值的最大公因数1.15(log 数值)返回:数值的自然对数值1.16(max 数值数值…)返回:数值中的最大值1.17(min 数值数值…)返回:数值中的最小值1.18 pi 常数∏,其值约为3.14159261.19(rem 数值 1数值 2)返回:M数值的相除的余数l.20(sin 角度)返回:角度的正旋值,角度值为弧度1.21(sqrt 数值)返回:数值的平方根二、检验与逻辑运算功能函数2.l(= 表达式1 表达式2)比较表达式1是否等于式2,适用数值及字符串2.2 (/= 表达式1 表达式2)比较表达式1是否大于等于表达式22.3(<表达式1 表达式2) 比较表达式1是否<小于表达式22.4(<= 表达式1 表达式2)比较表达式1是否<一小于等于表达式22.5(>表达式1 表达式2)比较表达式1是否>大于表达式22.6(>= 表达式1 表达式2)比较表达式1是否大于等于表达式22.7 (~数值)返回:数值的位 not值,(1的补码)2.8 (and 表达式1 表达式2…)返回:逻辑and的结果2.9(boole 函数整数整数…)返回:位式布尔运算AutoLisp函数2/82.10(eq 表达式1 表达式2)比较表达式1与表达式2是否相同,适用列表比较(实际相同)2.11(equal 表达式 1表达式 2[差量])比较表达式 1与表达式 2是否相同,差量可省略(内容相同)三、转换运算功能函数3.l(angtof 字符串[模式])返回:角度值的字符串转成实数3.2(angtos 角度[模式[精度]])返回:角度转成的字符串值3.3(atof 字符串)返回:字符串转成实数值3.4 (atoi 字符串)返回:字符串转成整数值3.5 (cvunit 数值原始单位转换单位)返回:数值转换单位后的值转换根据acad.nut 文件3.6(distof 字符串[模式])返回:根据模式将字符串转成实数值3.7(itoa 整数)返回:整数转成字符串3.8(rtos 数值模式[精度])返回:实数转成字符串3.9 (trans 点原位置新位置[位移]) 返回:转换坐标系统值四、列表处理功能函数4.1 (append 列表列表……)结合所有列表成一个列表4.2(assoc 关键元素联合列表)根据关键元素找寻联合列表中关系信息4.3 (car 列表)返回列表中的第一个元素,通常用来求X坐标4.4(cadr 列表)返回列表中的第二个元素,通常用来求y坐标4.5(caddr 列表)返回列表中的第三个元素,通常用来求Z坐标4.6(cdr 列表)返回:除去第一个元素后的列表4.7(cons 新元素列表)返回:将新元素添加到列表4.8(foreach 名称列表表达式)返回:将列表的每一元素对应至名称再根据表达式执行响应4.9(length 列表)返回:列表内的元素数量4.10(list 元素元素…)返回:将所有元素合并为一列表4.11(listp 元素)返回:判断元素是否为一串4.12(mapcar函数列表1列表2…)返回:将列表1、列表2列表的元素配合函数,求得新列表4.13(member 关键元素列表)返回:根据关键元素(含似后的列表4.14(nth n 列表)返回:列表的第n个元素AutoLisp函数3/84.15(reverse 列表)返回:将列表元素根据顺序颠倒过来的列表4.16(subst 新项旧项列表)返回:替换新旧列表后的列表五、字符串、字符、文件处理函数5.l(ascii 字符串)返回:字符串第一个字符的“ASCII”码5.2 (chr 整数)返回:整数所对应的ASCII单一字符串5.3(close 文件名称)关闭文件5.4(open 文件名模式)返回:打开文件代码,准备读取或写入信息5.5(read 字符串)返回:列表中的字符串的第一组元素5.6(read-char[文件代码])返回:通过键盘或文件中读取单一字符5.7(read-line [文件代码])返回:经由键盘或文件中读取一行字符串5.8(strcase 字符串[字样])返回:转换字符串大小写5.9(strcat 字符串1字符串2…)返回:将各字符串合并为一个字符串5.10(strlen 字符串)返回:字符串构成的字符数(即字符串长度)5.11(substr 字符串起始长度)返回:取出于字符串‘5.12(wcmatch 字符串格式)返回:T或 nil,将字符串与通用字符进行比较5.13(write-char数值[文件代码])返回:将一ASCII字符写到文件或屏幕 15.14(write-line字符串[文件代码])返回:将字符串写到文件或屏幕上六、等待输入功能函数6.l (getangle [基点] [提示])请求输入十进制角度数值,响应一个弧度值提示及参考点可有可无6.2(getcorner 基点[提示])请求输入另一矩形框对角点坐标 6.3(getdist [基点][提示])请求输入一段距离6.4(getint [提示])请求输入一个整数值6.5(getkword [提示]请求输入“关键词”6.6(getorient [基点][提示])请求输入十进制角度,响应一弧度值不受angbase、angdir 影响6.7(getPoint [基点][提示])请求输入一个点的坐标6.8(getreal [提示]请求输入一个实数6.9(getstring [提示])请求输入一个字符串6.10(initget [位]字符串)设定下次getxxx函数的有效输入七、几何运算功能函数7.l(angle 点1 点2)取得两点的角度弧度值7.2(distance 点1 点2)取得两点的距离7.3(inters 点1 点2 点3 点 4[模式])取得两条线的交点7.4(osnap 点模式字符串)按照捕捉模式取得另一坐标点7.5(polar 基点弧度距离)按照极坐标法取得另一坐标点7.6(textbox 对象列表)取得文字字符串的两个对角点坐标八、对象处理功能函数8.l(entdel 对象名称)删除或取消删除对象8.2(entget 对象名称[应用程序列表])取出对象名称的信息列表8.3 (entlast)取出图形信息中的最后一个对象8.4(entmake 对象列表)建立一个新的对象列表8.5(entmod 对象列表)根据更新的信息列表更新屏幕上元体8.6(entnext [对象名称])找寻图面中的下一个对象8.7(entsel [提示])请求选取一个对象,响应包含对象名称及选点坐标的列表;8.8(entupd 对象名称)更新屏幕上复元体图形8.9(handent 图码)返回:图码的元体名称8.10(nentsel[提示])返回:BLOCK所含副元体对象信息列表8.11(nentselp [提示][点])返回:BLOCK所含副元体对象信息似4*4矩形表示)九、选择集、符号表处理函数9.l(ssadd [对象名称][选择集])将对象加入选择集或建立一新选择集9.2(ssdel 对象名称选择集)将对象自选择集中移出9.3(ssget [模式][点 1][点 2]取得一个选择集9.4(ssget ”X”[过滤列表])取得根据过滤列表所指定范围的选择集9.5(sslenth 选择集)计算选择集的对象个数9.6(ssmemb 对象名称选择集)响应对象名称是否包含于选择集内9.7(ssname 选择集索引值)根据索引值取出选择集中的对象名称9.8(tblnext 符号表名称[T])检视符号表,有效的符号表:”LAYER”、”LTYPE"、”VIEW”、”STYLE"、”BLOCK”9.9(tblsearch 符号表名称符号)在符号表中搜寻符号十、AutoCAD相关查询、控制功能函数10.l(command ”AutoCAD命令”…)超重量级函数,调用执行 AutoCAD命令AutoLisp 函数5/810.2(findfile 文件名)返回:该文件名的路径及文件名10.3(getfiled 标题内定档名扩展名旗号)通过标准 AutoCAD文件对话 DCL对话框获得文件10.4(getenv ”环境变量”)取得该环境变量的设定值,以字符串表示10.5(getvar ”系统变量”)取得该系统变量的设定值,以字符串表示10.6(setvar ”系统变量”值)设定该系统变量的值10.7(regapp 应用类项)将目前的AutoCAD图形登记为一个应用程序名称十一、判断式、循环相关功能函数11.1(If <比较式><表达式1> [表达式2]检算比较式结果,如果为真,执行<表达式1>,否则执行<表达式2>11.2( repeat 次数 [〈表达式><表达式>…])重复执行 N次表达式11.3(While <比较式><表达式>…)当条件成立则执行表达式内容11.4(cond <比较式 1><表达式 1>多条件式的 if整合功能<比较式2><表达式2><比较式3><表达式3>)11.5 ( prong 表达式1 表达式2…)连接其中的表达式为一组,常用于配合if、cond 等函数十二、函数处理、定义、追踪与错误处理功能函数12.l(*error* 字符串)程序错误时的警示信息12.2(alert 字符串)以对话框式显示出警告字符串12.3(apply 功能函数列表)将功能函数与列表结合后执行12.4(defun 名称自变量列表表达式_.)自定函数或子程序12.5(eval 表达式)返回:表达式的执行结果12.6(exit)强制退出目前的应用程序12.7(lambda 自变量表达式)定义未命名的函数12.8(progn 表达式1 表达式2…)连接其内的表达式为一组,常用于配合if、cond等函数12.9(quit)强制退出目前的应用程序12.10(tablet 代码 [列1列2列3方向])取用或建立对数字板的校调12.11(trace 函数…)对函数设定追踪标记,辅助检错12.12(untrace 函数…)对函数设定解除追踪标记AutoLisp函数6/8十三、显示、打印控制功能函数13.l(gfaphscr)作图环境切换到图形画面13.2(grclear)暂时清除模前的屏幕画面13.3(grdraw起点终点颜色[亮显])暂时性的画出一条线13.4(grread[追踪])由输入设备读取追踪值13.5(grtext位置字符串[亮显])将字符串显示在状态列或屏幕菜单上13.6(grvecs向量列表[转置矩阵])暂时性的画出多条线13.7(menucmd字符串);提供在 AlltOLISP中调用各菜单13.8(Prinl[表达式[文件代码]]将表达式打印于命令区或已打开的文件句柄字符则以“\”为前缀展开13.9(pinc[表达式[文件代码]]除句柄字符则不以”\”为前缀展外开其余同Prinl 13.10(print[表达式[文件代码]]除表达式会往下一新行列出,及空一格外其余同prinl13.11(prompt信息)将信息显示于屏幕的命令区,并随后响应一个nil信息13.12(redraw[对象名称[模式]])重绘整张图或根据对象名称重绘该图形13.13(terpri)在屏幕上显示新列13.14(textscr) 作图环境切换到文字画面13.15(textpage)清除文字画面文字类似 DOS的cls命令13.16(vports)返回:窗口组态列表十四、符号、元素、表达式处理功能函数14.l(atom元素)如果元素不是列表,响应T,否则为nil14.2(atoms-family格式闲号列表])返回:一组己定义函数的符号列表14.3(boundp表达式)返回:T或 nil,响应表达式是否有值存在14.4(minusp元素)返回:T或n儿元素是否为负值14.5(not元素)返回:T或n儿判定元素是否为ni114.6(null元素)返回:T或nil判定元素是否被赋予nil值14.7(numberp元素)返回:T或nil,元素是否为整数或实数14.8(quote表达式)响应表达式未检算前状态,同“‘”功能14.9(set符号表达式)将表达式结果设定给带单引号’符号14.10(setq符号1 表达式1[符号2表达式2]…)设定表达式结果给各符号14.11(type元素)返回:元素的信息型态14.12(zerop元素)返回:T或nil,元素是否为0值十五、ADS、ARX、AutoLISP加载与卸载函数AutoLisp函数7/815.l(ads)返回:目前加载ADS程序列表15.2(arx)返回:目前加载 ARX程序列表15.3(arxload应用程序[出错处理]))返回:加载 ARX程序15.4(arxunload应用程序[出错处理]))返回:卸载 ARX程序15.5(ver)返回:目前 AutoLISP版本字符串15.6(load LSP文件名[加载失败])加载 AutoLISP文件(*.lsp)15.7 (xload应用程序[错处理])加载ADS应用程序15.8 (xunloa应用程序[出错处理])卸载 ADS应用程序十六、内存空间管理函数16.l(alloc数值)以节点数值设定区段大小16.2(expand数值)以区段数值配置节点空间16.3(gc)强制收回废内存16.4(mem)显示目前的内存使用状态16.5(xdroom对象名称)返回对象扩展信息允许使用的内存空间16.6(xdsize列表)返回对象扩展信息所占用的内存空间十七、其它重要的功能函数17.l(acad_colordlg 颜色码旗号)显示出标准 AutoCAD颜色选择对话框17.2(acad_helpdlg 求助文件名主题)显示出标准 AutoCAD求助对话框17.3(acad_strlsort字符串列表)作字符串列表排序17.4(bherrs)取得 bhatch与 bpcly失败所产生的错误信息17.5(bhatch点[选择集[向量]])根据 Pick point选点方式调用 bhatch命令,绘制选集区域的剖面线17.6(bpoly点[选择集[向量]])根据Pick point选点方式调用bpoly命令并产生一定域Polyline17.7(cal计算式字符串)执行如 CAL计算功能十八、ADS、ARX外部定义的3D函数18。

python数组定义方法

python数组定义方法

python数组定义方法
在Python中,数组是一个用于存储数据的容器。

数组可以存储不同类型的数据,例如整数、浮点数、字符串等等。

Python中有多种方法来定义数组,以下是其中的几种方法:
1. 使用列表 (List)
列表是Python中最常用的数据类型之一,它可以用来定义数组。

列表使用方括号 [] 定义,其中的每个元素用逗号分隔。

示例:定义一个包含整数和字符串的列表
my_list = [1, 2, 3, 'hello', 'world']
2. 使用元组 (Tuple)
元组是Python中另一种常用的数据类型,它和列表类似,但是元组一旦创建就不能修改。

元组使用圆括号 () 定义,其中的每个元素用逗号分隔。

示例:定义一个包含整数和字符串的元组
my_tuple = (1, 2, 3, 'hello', 'world')
3. 使用NumPy数组
NumPy是Python中科学计算库的一个扩展,它提供了一个强大的数组对象。

NumPy数组可以包含相同类型的数据,例如整数、浮点数等等。

NumPy数组使用numpy.array()函数定义。

示例:定义一个包含整数的NumPy数组
import numpy as np
my_array = np.array([1, 2, 3, 4, 5])
总结
以上是Python中定义数组的几种方法,其中列表和元组是最基本的数据类型,而NumPy数组提供了更多的功能和更高的性能。

根据需要选择不同的定义方法,以实现最佳的效果。

Visual_LISP指南

Visual_LISP指南

5.4.8
确定下一步的动作..............................................40
5.4.9
代码集成......................................................41
5.4.10
更新简单空函数...............................................41
3.1
局部变量和全局变量的区别.............................................7
3.1.1
在程序中使用局部变量...........................................7
3.1.2
检查gp:getPointInput 函数.....................................8
3.3
检查程序变量........................................................11
3.4
修改程序代码........................................................12
3.5
4.3.9
程序集成......................................................28
4.4
第三课回顾..........................................................30 第五章创建工程和添加界面..................................................32
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

lisp几种数组定义较全1.首先,定义如下简单的子例程:atob (DEFUN ATOB(A NO / L);** e.g. A="A" NO=1 THEN B=A1 ** (SETQ L (ITOA NO))(SETQ B (STRCAT A L)) (READ B) );END ATOB-DEFUN 有了这个小东西,接下来的就好办了。

举个例子,有个表list_a ,里面有N个数据,而且随每次程序执行的不同,N的值不同。

要建立一个数组A (n),n=1~N,每个 A(n)等于对应的表中的数据,可以这样实现:(setq list_no (length list_a)) (setq cur_no 0) (while (< cur_no list_no)(setq n (+ 1 cur_no)) (set (atob "A" n) (nth cur_no list_a))(setq cur_no (+ 1 cur_no)) );; end while需要使用A(n)的时候这样用:(setq the_val (eval(atob "A" n)))这个时候得到的the_val就是所需要的A(n)值。

2.设一个表为连续的数组存储地址我设计了如下取二维数组的程序请大家指正!(a b c d e g g g g g g g g g g g g g g g g);;;二维数组的取操作;;;如有数组m(5,6) 取m(1,4) 输入(drr 5 6 1 4 dl) dl为数组表(defun drr (b c e f dl / n)(setq b (* b c))(setq n (length dl))(cond ((> n b) (setq e (+ (* (- e 1) c) e))(nth e dl))((= n b) (setq e (+ (* (- e 1) c) (- f 1)))(nth e dl)));;;cond);;;defun注意:表中数据可以大于数组确定的数据数量,这样我可以假设任何表为一数组!5.6 在 AutoLISP 中定义和使用多维数组“表”是 AutoLISP 中最常用的数据库纪录类型,也是它最善于操作的、特有的数据类型。

利用“表的生成和处理”有关函数,可以定义通常概念中的多维数组,可利用“表的查询和检索”的有关函数,可对这个表进行方便快速的数据提取。

以下的模拟程序参见T ools.LSP:(Defun C:DataIO ()(PrinC "\n三维数组建立...")(SetQ l nilx0 (GetInt "\nX 维数: ")y0 (GetInt "\nY 维数: ")z0 (GetInt "\nZ 维数: ")x 1 y 1 z 1 vlx '() vly '() vlz '())(Repeat z0(Repeat y0(Repeat x0(PrinC "\n(") (PrinC z)(PrinC y)(PrinC x)(PrinC ")")(SetQ vlx (Cons (GetReal " 元素数据: ") vlx)x (1+ x)))(SetQ vly (Cons (Reverse vlx) vly)y (1+ y)vlx '() x 1))(SetQ vlz (Cons (Reverse vly) vlz)z (1+ z)vly '() y 1))(SetQ l (Reverse vlz))(While (Progn (InitGet 7 "Exit Find ")(SetQ k (GetKWord "\nExit(结束)/: "))(/= k "Exit"))(SetQ x (1- (GetInt (StrCat "\nX维序号(" (IToA x0) "): ")))y (1- (GetInt (StrCat "\nY维序号(" (IToA y0) "): ")))z (1- (GetInt (StrCat "\nZ维序号(" (IToA z0) "): "))))(PrinC (Nth x (Nth y (Nth z l)))))(PrinC))C:DataIO用于建立一个三维数组,之后提取和显示该数组中指定的数据。

数组保存在变量L之中。

值得注意的是,这样的数组要占用堆区空间,不可以过于巨大,但是 AutoLISP 数组处理功能是相当强的,笔者用一台128M内存的PII 333主机,制作了生成一百万个元素的数组(每个元素是三个实数和一个索引组成):'(1259 123.456 17.377 98706.964)定义数组,解释运行耗时约20.7秒,编译运行耗时15.9秒。

而引用任一元素仅是瞬间的事。

这种数组创建和引用的能力,将能顺利解决解析程序中大规模矩阵运算的基础设施问题,也是AutoLISP具有特色的功能:简单、快速、容易控制、数据量大。

t 点评用表类型数据结构组建数组,是一种典型的用法。

“表”是AutoLISP 中一种万能的数据结构容器,发挥你的想象力,利用表构建专业程序中的各种应用数据结构,就会体验到 AutoLISP 程序设计独特的优点,甚至在外挂工程数据文件中,也应当使用表结构。

3.类似数组定义(setq i 3 j 1) ;;这里的i值就相当于VB中数组的下标(repeat i)(eval (read (strcat "(setq s" (itoa j) " j)")))(setq j (+1 j)))AutoLISP没有VB中类似数组的定义,这就造成有时在程序中需要对一系列关联数据进行储存处理时比较麻烦,因为这些关联数据是程序运行的过程中产生的,个数往往是不确定的,可能是三个数据,也可能是五个数在VB中,你可以通过定义一个数组来解决这个问题,不必考虑数据的个数,只要保证程序运行中产生的数据数不超过所定义数组的下标就可以了。

但在AutoLISP中因为不能定义数组,就比较麻烦。

一个可行的解决办法是将所有数据保存在一个表中,如(A B C ……),然后就可以用nth函数访问表中的某个元素。

但这种方法有个缺点:对表中某个数据的修改比较麻烦。

所以更好的办法是把数据以点对的形式保存在一个表中,例如((1.A) (2.B) (3.C) ……),通过assoc函数就可以对各个数据进行访问,通过subst函数即可实现对表中某个数据的修改。

第二种方法是把所有数据保存在一个文本文件中,可以每个数据一行,通过对文本文件的读取和写入操作也可以实现类似数组的功但最简单的方法是下面这种:用eval函数和read函数来实现!一个代码片断例子:……(setq i 3 j 1) ;;这里的i值就相当于VB中数组的下标(repeat i)(eval (read (strcat "(setq s" (itoa j) " j)")))(setq j (+1 j)))……执行上面的代码后,会产生3个新的变量:s1=1、s2=2、s3=3,在接下来的程序中,就可以对这三个变量直接调用了。

;; 用 a 置換表 l 中第 n 个元素(可以是子表);;|用法:(EA:SUBST-N '(0 2) '(99 22) '((1 2 3) 2 55 99 66)) 替换第一个子表第三项((1 2 (99 22)) 2 55 99 66)(EA:SUBST-N '(2 1) '(99) '(1 2 (55) 99 66)) 替换第二个子表第二项(1 2 (55 ((99))) 99 66)(EA:SUBST-N 2.0 '(99) '(1 2 55 99 66)) 替换第二个原子(1 2 (99) 99 66)|;(defun subst-n (n a l)(cond((numberp n)(if (zerop n)(append (list a) (cdr l))(cons (car l) (subst-n (1- n) a (cdr l)))))((listp n)(cond((equal (length n) 1)(if (zerop (car n))(append (list a) (cdr l))(cons (car l) (subst-n (1- (car n)) a (cdr l)))))((> (length n) 1)(if (zerop (car n))(cons (subst-n (cdr n) a (car l)) (cdr l))(cons (car l)(subst-n (append (list (1- (car n))) (cdr n)) a (cdr l)) )))))))4.一种数组定义:(progn(setq i 0) ;数组下标初始化(while(< i 10)(set (read(strcat "NUM[" (rtos i) "]")) (* i i i i))(princ (strcat "\nNUM[" (rtos i) "]=" (rtos (eval(read(strcat "NUM[" (rtos i) "]"))))))(setq i (+ 1 i)))(princ))(1)数组元素赋值函数seta(alist)返回赋值后的数组表alist。

(defun seta(alist)(setq alist ′())(setq a t) ;a为输入控制变量(while a(initget ″number angle point″)(setq str1(getkword ″\nnumber/angle/point/″)) ;选择元素类型(if(null str1)(setq a nul)) ;结束输入(if(equal str1) ″number″) ;输入数(progn(setq va(getreal ″\ninput a number:″))(setq alist(cons va alist))))(if (equal str1 ″angle″) ;输入角(progn(setq va(getangle ″\ninput a angle:″))(setq alist(cons va alist))))(if(equal strl ″point″) ;输入点(progn(setq va(getpoint ″\ninput a point:″))(setq alist(cons va alist))))(if(equal str1 ″point″) ;输入点(progn(setq va(getpoint ″\ninput a point:″))(setq alist(cons va alist)))))(reverse alist))(2)数组元素输出函数geta(alist i)返回数组alist的第i个元素。

相关文档
最新文档