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