伪数组(以行主序存储)下标访问

《C和指针》第8章编程练习第6题:

 1 /*
 2 ** 2014/12/09, by ZHM
 3 */
 4 #include <stdio.h>
 5 #include <stdarg.h>
 6
 7 /*
 8 ** 函数功能:
 9 **     允许用户访问“伪数组”,它的下标可以任意指定,并有完整的错误检查
10 ** 函数参数:
11 **     arrayinfo:一个可变长度整型数组,包含一些关于伪数组维数的信息,
12 **                arrayinfo[0] 指定伪数组的维数,1<=arrayinfo[0]<=10
13 **                arrayinfo[1]和arrayinfo[2]给出第1维的上限和下限,以此类推
14 **     ... : 可变参数列表,包含与伪数组维数相等个数的参数。
15 **           用于标识伪数组中某个特定位置的下标值
16 ** 函数返回:
17 **     返回伪数组的offset量,用于表示一个向量(一位数组)的下标
18 **     如出现以下错误情况,则返回-1
19 **         1. 维数不处于1和10之间;2. 下标小于下限值;
20 **         3. 下标大于上限值;4. 上限值小于对应的下限值。
21 */
22 int
23 array_offset( int arrayinfo[], ... )
24 {
25     /*
26     ** 检查伪数组的维数是否在1-10之间
27     */
28     int N = arrayinfo[0]; // N表示伪数组的维数
29     if( N < 1 || N > 10 )
30         return -1;
31
32     va_list var_arg;
33     int s;     // s表示下标参数
34     int lo, hi;  // lo表示下限,hi表示上限
35     int lo_index, hi_index; // 在arrayinfo数组中lo和hi对应的索引值
36     int loc = 0;  // 表示伪数组的目标位置
37     int j;
38
39     /*
40     ** 伪数组的目标位置用一个距离伪数组起始位置的整型偏移量表示
41     ** 以下部分通过公式计算伪数组的目标位置
42     */
43     va_start( var_arg, arrayinfo[0] );
44     for( j = 0, lo_index = 1, hi_index = 2; j < N; ++ j, lo_index += 2, hi_index += 2 )
45     {
46         s = va_arg( var_arg, int );  // 用va_参数宏访问列表
47         lo = arrayinfo[lo_index];
48         hi = arrayinfo[hi_index];
49         if( hi < lo || s < lo || s > hi )  // 判断是否存在错误情况
50             return -1;
51
52         // 计算目标位置
53         loc = loc * ( hi - lo + 1 ) + s - lo;
54     }
55     va_end( var_arg );
56
57     return loc;
58 }
59
60 int
61 main()
62 {
63     int arrayinfo[] = { 3, 4, 6, 1, 5, -3, 3 };
64     int a, b, c;
65     scanf( "%d%d%d", &a, &b, &c );
66     int offset = array_offset( arrayinfo, a, b, c );
67     printf( "%d", offset );
68     return 0;
69 }
时间: 2024-08-03 20:45:20

伪数组(以行主序存储)下标访问的相关文章

伪数组(以列主序存储)下标访问

<C和指针>第8章编程练习第7题: 1 /* 2 ** 2014/12/09, by ZHM 3 */ 4 #include <stdio.h> 5 #include <stdarg.h> 6 7 /* 8 ** 函数功能: 9 ** 允许用户访问“伪数组”,它的下标可以任意指定,并有完整的错误检查 10 ** 该伪数组以列主序存储,最左边的下标先变化. 11 ** 函数参数: 12 ** arrayinfo:一个可变长度整型数组,包含一些关于伪数组维数的信息, 13

伪数组与可迭代对象

这两者都可以通过Array.from(arrayLike[,mapFn[,thisArg]])来返回一个数组. 伪数组 首先先得清楚对象和数组的差别: 对象的原型链上只有Object.prototype,而数组的原型链上有Array.prototype和Object.prototype 对象没有length属性,数组有,且自动更新 对象根据键值对取值,而数组根据序号取值 ok,接下来就可以引出伪数组了. 定义: 拥有length属性,其他属性为非负整数字符串(因为对象使用[]来取值,会将数值隐式

伪数组和真数组

/* * 什么是伪数组: * 1.伪数组是一个对象 * 2.这个对象必须要有length属性 * 3.如果这个对象的length不为0,那么必须要有按照下标存储的数据 * */ // 不是伪数组 var obj = {}; var obj2 = { length: 3 }; // 是伪数组 var obj3 = { length: 0 }; var obj4 = { 0: '888', length: 1 }; var obj5 = { 99: 'abc', length: 100 } /* *

Swift Tips - 在 Swift 中自定义下标访问

Untitled Document.md input[type="date"].form-control,.input-group-sm>input[type="date"].input-group-addon,.input-group-sm>.input-group-btn>input[type="date"].btn,input[type="time"].input-sm,.form-horizontal

JavaScript中的伪数组理解

看过jQuery源码的人都知道类数组对象,与我们熟知的arguments对象很像 构造一个类数组必须有两个条件 第一个条件:你必须给对象定义个splice方法,只要他是一个function就可以 第二个条件:就是赋值一个length属性,或者增加push,unshift,shift,pop其中任何一个方法,并且调用了一次. 当这两个条件同时满足那么当前的对象在控制台输出后跟数组的格式一模一样. 一般而言大部分都是这样构造一个类数组对象(jQuery就是这么干的).因为相比而言,这样更简洁,并且更

Android 测试、数据存储与访问、XML解析与生成

1.android测试 1.黑盒测试: 是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的. 2. 白盒测试: 又称结构测试.透明盒测试.逻辑驱动测试或基于代码的测试. 3.单元测试: 又称模块测试,是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确. 4.功能测试: 根据产品特性.操作描述和用户方案,测试一个产品的特性和可操作行为以确定它们满足设计需求. 5.压力测试: 主体向被观察者布置一定量任务和作业,借以观察个体完成任务的行为. 6.集成测试: 是单元

JavaScript中的数组与伪数组的区别

在JavaScript中,除了5种原始数据类型之外,其他所有的都是对象,包括函数(Function). 5种原始数据类型: number boolean string null undefined 在这个前提下,咱们再来讨论JavaScript的对象. 1.创建对象 var obj = {}; //种方式创建对象,被称之为对象直接量(Object Literal) var obj = new Object(); // 创建一个空对象,和{}一样 更多创建对象的知识,参见<JavaScript权威

关于js中伪数组

伪数组: 具有length属性: 按索引方式存储数据: 不具有数组的push().pop()等方法: 伪数组无法直接调用数组方法或期望length属性有什么特殊的行为,不具有数组的push().pop()等方法,但仍可以对真正数组遍历方法来遍历它们.这种对象有很多,比较特别的是function内的arguments对象,还有像调用getElementsByTagName, document.childNodes之类的,它们都返回的NodeList对象都属于伪数组,也称为类数组,还有自定义的对象,

探究InnoDB数据页内部行的存储方式

*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !important; } .markdown-body .anchor { position: absolute; top: 0; bottom: 0; left: 0; display: block; padding-right: 6px; padding-left: 30px; margin-left: -30